我正在實現SSE類型之間的轉換,並且發現對於SSE4.1之前的目標實現int8-> int64擴展轉換非常麻煩。如何高效地使用SSE執行int8/int64轉換?
直截了當的實現將是:
inline __m128i convert_i8_i64(__m128i a)
{
#ifdef __SSE4_1__
return _mm_cvtepi8_epi64(a);
#else
a = _mm_unpacklo_epi8(a, a);
a = _mm_unpacklo_epi16(a, a);
a = _mm_unpacklo_epi32(a, a);
return _mm_srai_epi64(a, 56); // missing instrinsic!
#endif
}
但由於_mm_srai_epi64
不存在,直到AVX-512,也有在這一點上兩個選項:
- 實施
_mm_srai_epi64
,或 - 以不同的方式實施
convert_i8_i64
。
我不確定哪一個是最有效的解決方案。任何想法?