为什么_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]。由于 j0..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 你'重新询问。)