@@ -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