avx512F kmovw mov 一个字一个字

avx512F kmovw mov word by word

我对 AVX512F - kmovw 指令有疑问。 我在 K0 寄存器中有一个 8 字节掩码,可以使用 'kmovq' 并将其移动到 8 字节寄存器或保留内存(8 字节)。但 'kmovq' 仅适用于 AVX512BW,对于 AVX512F,我们需要使用 'kmovw'。但是这条指令只移动了 16 位,所以我们现在需要将掩码移动 4 次,哪一个是正确的?

sub     esp, 8
kmovw   ax, k0
... (do the job with AX)
kmovw   ax, k0 + 2
... (do the job with AX)
kmovw   ax, k0 + 4
... (do the job with AX)
kmovw   ax, k0 + 6
... (do the job with AX)
add     esp, 8

sub     esp, 8
kmovw   ax, [k0]
... (do the job with AX)
kmovw   ax, [k0 + 2]
... (do the job with AX)
kmovw   ax, [k0 + 4]
... (do the job with AX)
kmovw   ax, [k0 + 6]
... (do the job with AX)
add     esp, 8

事实上,我的问题是关于如何逐字使用 k0 ...使用 [] 或仅加上 N

例如,

此代码适用于 AVX512BW(因为 'kmovq')

vmovdqu64       zmm0, [rax]      ; rax = string
vpcmpeqb        k0, zmm0, zmm1   ; zmm1 = 0
kortestq        k0, k0
...
...
kmovq   rbx, k0
tzcnt   rbx, rbx
add     rax, rbx

但如果我只想使用 AVX512F,我应该用 'kmovq' 做什么?

None 你的代码很有意义。您不能在 vaddps zmm0{k1}{z}, zmm1, zmm2 等指令中将 ax 用作掩码寄存器。而且 kmov 不采用从中提取的偏移量,并且没有像 [k0 + 2] 这样的语法。如果有类似于pextrw的提取指令,它就不会使用方括号。


如果没有 AVX512BW,您首先无法将 64 位值放入掩码寄存器:AVX512F 中唯一的掩码设置指令使用双字或四字元素从而最多产生 16 个掩码位。并且 kmov / 其他 k 指令仅适用于最多 16 位操作数大小,例如 kunpcklbw.

带有 AVX512F 而不是 AVX512BW 的 CPU 可能只有 16 位宽 k 寄存器。

如果没有 AVX512BW,您将无法读取或写入 k 寄存器的高位。

除了 xsavexsaveopt 之类的可能;它不需要 AVX512BW,但它会将向量状态的全部内容转储到内存中,您可以在其中加载 64 位掩码寄存器值。这不太可能有用;我只提到它作为声明的例外,没有 AVX512BW 就无能为力。


不要在依赖 AVX512BW 的代码中避免使用 AVX512BW 将 64 位值放入掩码寄存器。