Что делает эта 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 шт):

Автор решения: LShadow77

Ну допустим:

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.

→ Ссылка