Skip to content

Commit 4e0574a

Browse files
committed
fix(fp16): fix array overflow error for fp16 conversion
1 parent c8908a3 commit 4e0574a

1 file changed

Lines changed: 3 additions & 10 deletions

File tree

  • cpp/deglib/include/deglib/distance

cpp/deglib/include/deglib/distance/fp16.h

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,8 @@ namespace deglib::distances {
111111
for (; i + 4 <= count; i += 4) {
112112
__m128 va = _mm_loadu_ps(floats + i);
113113
__m128i vhp = _mm_cvtps_ph(va, 0);
114-
// Store 4 uint16_t values from the __m128i
115-
alignas(16) uint16_t temp[4];
116-
_mm_store_si128(reinterpret_cast<__m128i*>(temp), vhp);
117-
fp16_vals[i] = temp[0];
118-
fp16_vals[i + 1] = temp[1];
119-
fp16_vals[i + 2] = temp[2];
120-
fp16_vals[i + 3] = temp[3];
114+
// Store 4 uint16_t values (8 bytes) into destination directly
115+
_mm_storel_epi64(reinterpret_cast<__m128i*>(fp16_vals + i), vhp);
121116
}
122117
// Scalar fallback for remaining 0-3 elements
123118
for (; i < count; ++i) {
@@ -129,9 +124,7 @@ namespace deglib::distances {
129124
size_t i = 0;
130125
// Process 4 uint16_t per step with _mm_cvtph_ps
131126
for (; i + 4 <= count; i += 4) {
132-
// Load 4 uint16_t values into __m128i
133-
alignas(16) uint16_t temp[4] = {fp16_vals[i], fp16_vals[i + 1], fp16_vals[i + 2], fp16_vals[i + 3]};
134-
__m128i vhp = _mm_load_si128(reinterpret_cast<const __m128i*>(temp));
127+
__m128i vhp = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(fp16_vals + i));
135128
__m128 va = _mm_cvtph_ps(vhp);
136129
_mm_storeu_ps(floats + i, va);
137130
}

0 commit comments

Comments
 (0)