Как читать псевдокод в описании к SIMD-инструкциям intel
Не смог полностью понять, как же читать псевдокод с описания SIMD-инструкций с сайта Intel. Ну для примера на функции _mm_cvtepu8_epi32: https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu8_epi32&ig_expand=1941,657,1826,6382,1826,6124,1941
__m128i _mm_cvtepu8_epi32 (__m128i a)
Description
Zero extend packed unsigned 8-bit integers in a to packed 32-bit integers, and store the results in dst.
Operation:
FOR j := 0 to 3
i := 32*j
k := 8*j
dst[i+31:i] := ZeroExtend32(a[k+7:k])
ENDFOR
Для начала я приведу результат работы этой "функции":
#include <iostream>
#include <emmintrin.h>
#include <nmmintrin.h>
#include <immintrin.h>
int main()
{
__m128i my_add_m128i_SET_value = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1);
__m128i my_temp_result = _mm_cvtepu8_epi32(my_add_m128i_SET_value );
}
Результат по байтово в битах будет такой:
Если я правильно понял, то вот такая запись [i+31:i] - означат, что к примеру при i=0, означает от (0+31) до 0. Если так, ну вот я сделал такую табличку c посчитанными значениями j,i,k:
То есть, как я понял запись dst[i+31:i] - означает, что для данного диапазона битов в результативном векторе __m128i - это диапазон будет равен ZeroExtend32[...] и вот тут все, тут я уже начинаю не понимать.
Из таблички видно, что для j=xxx:
dst[31:0] = ZeroExtend32[7:0] - то есть ZeroExtend32 берет биты с 0 по 7 Входного вектора копирует их в Выходной вектор, в диапазон 31:0 и все остальное в диапазоне [31:0] - заменяет нулями.
dst[63:32] = ZeroExtend32[263:256] - А вот тут что получается ?? Что это за значения такие 263:256 ??
dst[95:64] = ZeroExtend32[519:512]
dst[127:96] = ZeroExtend32[775:768]

