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
寄存器的高位。
除了 xsave
或 xsaveopt
之类的可能;它不需要 AVX512BW,但它会将向量状态的全部内容转储到内存中,您可以在其中加载 64 位掩码寄存器值。这不太可能有用;我只提到它作为声明的例外,没有 AVX512BW 就无能为力。
不要在依赖 AVX512BW 的代码中避免使用 AVX512BW 将 64 位值放入掩码寄存器。
我对 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
寄存器的高位。
除了 xsave
或 xsaveopt
之类的可能;它不需要 AVX512BW,但它会将向量状态的全部内容转储到内存中,您可以在其中加载 64 位掩码寄存器值。这不太可能有用;我只提到它作为声明的例外,没有 AVX512BW 就无能为力。
不要在依赖 AVX512BW 的代码中避免使用 AVX512BW 将 64 位值放入掩码寄存器。