我正在实现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
。
我不确定哪一个是最有效的解决方案。任何想法?