Что делает эта SIMD инструкция?
Извините, но я, что то не могу по описанию понять, что делает эта SIMD инструкция:https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#ig_expand=7350,4869,514,6791,5444,5393,5260,101,152,101,6929,7101,121,7350,7332,1941&text=_mm_cvtepu8_epi32
mm_cvtepu8_epi32:
__m128i _mm_cvtepu8_epi32 (__m128i a)
Zero extend packed unsigned 8-bit integers in a to packed 32-bit integers, and store the results in dst.
Zero расширяет упакованные 8-битные целые числа без знака в a до упакованных 32-битных целых чисел и сохраняет результаты в dst .
То есть на вход она принимает вектор __m128i и отдает тот же __m128i вектор. Это как ?
Что значит расширяет упакованные 8-битные целые чисел до упакованных 32-битных целых ? Никак не могу сообразить. __m128i 16 байт, как были - так на выходе и остались.
Ответы (1 шт):
Ну допустим:
a == 0x4D3C2B1A
Тогда, согласно псевдокоду из документации
FOR j := 0 to 3
i := 32*j
k := 8*j
dst[i+31:i] := ZeroExtend32(a[k+7:k])
ENDFOR
получим __m128i b = _mm_cvtepu8_epi32(a):
b == 0x0000004D0000003C0000002B0000001A
Другими словами, этот интрин берёт младшие 4 байта исходного операнда и и возвращает вектор из этих байт, бесзнаково расширенных до int.