为什么_mm_insert_ps的伪代码会计算出%8?
Why does the pseudocode of _mm_insert_ps calculate %8?
intel intrinsics 指南中,_mm_insert_ps 操作的伪代码定义如下:
FOR j := 0 to 3
i := j*32
IF imm8[j%8]
dst[i+31:i] := 0
ELSE
dst[i+31:i] := tmp2[i+31:i]
FI
ENDFOR
。对 imm8
的访问让我感到困惑:IF imm8[j%8]
。由于 j
在 0..3
范围内,模 8 部分似乎没有做任何事情。这是否表示我不知道的转换?或者在这种情况下 %
不是“模数”?
似乎是一个毫无意义的模数。
Intel 的文档 for the corresponding asm instruction, insertps
,在伪代码中没有使用任何 %
模运算。它使用 ZMASK ←imm8[3:0]
然后基本上展开使用循环的伪代码部分,检查如
IF (ZMASK[2] = 1) THEN DEST[95:64]←00000000H
ELSE DEST[95:64]←TMP2[95:64]
这只是展示了在从另一个向量或内存中的标量插入元素后,立即数的低 4 位如何对最终结果的 4 个双字元素执行 zero-masking。
(没有直接从内存插入的内在函数;您需要 movss
的内在函数,然后希望编译器将其折叠到 insertps
的内存操作数中。使用内存源, imm8[7:6]
被忽略,只是将该标量双字作为要插入的元素(即 asm 伪代码中的 ELSE COUNT_S←0
),但其他一切都一样,包括 zero-masking 你'重新询问。)
intel intrinsics 指南中,_mm_insert_ps 操作的伪代码定义如下:
FOR j := 0 to 3
i := j*32
IF imm8[j%8]
dst[i+31:i] := 0
ELSE
dst[i+31:i] := tmp2[i+31:i]
FI
ENDFOR
。对 imm8
的访问让我感到困惑:IF imm8[j%8]
。由于 j
在 0..3
范围内,模 8 部分似乎没有做任何事情。这是否表示我不知道的转换?或者在这种情况下 %
不是“模数”?
似乎是一个毫无意义的模数。
Intel 的文档 for the corresponding asm instruction, insertps
,在伪代码中没有使用任何 %
模运算。它使用 ZMASK ←imm8[3:0]
然后基本上展开使用循环的伪代码部分,检查如
IF (ZMASK[2] = 1) THEN DEST[95:64]←00000000H
ELSE DEST[95:64]←TMP2[95:64]
这只是展示了在从另一个向量或内存中的标量插入元素后,立即数的低 4 位如何对最终结果的 4 个双字元素执行 zero-masking。
(没有直接从内存插入的内在函数;您需要 movss
的内在函数,然后希望编译器将其折叠到 insertps
的内存操作数中。使用内存源, imm8[7:6]
被忽略,只是将该标量双字作为要插入的元素(即 asm 伪代码中的 ELSE COUNT_S←0
),但其他一切都一样,包括 zero-masking 你'重新询问。)