1

在 intel 内在函数指南中,_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]。在jrange 内0..3,模 8 部分似乎没有做任何事情。这是否可能表示我不知道的转换?或者%在这种情况下不是“模”?

4

1 回答 1

1

似乎是一个毫无意义的模数。

英特尔针对相应 asm 指令insertps的文档,没有%在伪代码中使用任何模运算。它使用ZMASK ←imm8[3:0]然后基本上展开使用循环的伪代码部分,检查如下

IF (ZMASK[2] = 1) THEN DEST[95:64]←00000000H
    ELSE DEST[95:64]←TMP2[95:64]

这只是显示在插入来自另一个向量的元素或内存中的标量之后,立即数的低 4 位如何对最终结果的 4 个 dword 元素执行零屏蔽。

(直接从内存中插入没有内在的;您需要一个内在的 formovss然后希望编译器将加载到内存操作数中折叠insertps。对于内存源,imm8[7:6]将被忽略,只需将该标量 dword 作为要插入的元素(那是ELSE COUNT_S←0asm 伪代码中的),但其他一切都一样,包括您要询问的零掩码。)

于 2022-01-29T01:41:12.507 回答