Wdrażam konwersje między typami SSE i odkryłem, że implementacja konwersji int8-> int64 dla celów pre-SSE4.1 jest uciążliwa.Jak skutecznie wykonać konwersję int8/int64 z SSE?
Prosta implementacja będzie:
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
}
Ale ponieważ _mm_srai_epi64
nie istnieje aż AVX-512, istnieją dwie możliwości w tym momencie:
- wykonawcze
_mm_srai_epi64
lub - wdrażanie
convert_i8_i64
w inny sposób.
Nie jestem pewien, który z nich byłby najbardziej efektywnym rozwiązaniem. Dowolny pomysł?