Assembly 是否可以将ymm16-ymm31用于AVX2 vpcmpeq{size}指令?

Assembly 是否可以将ymm16-ymm31用于AVX2 vpcmpeq{size}指令?,assembly,x86-64,avx,avx2,avx512,Assembly,X86 64,Avx,Avx2,Avx512,我想知道是否有可能采取以下措施: vpcmpeqb %ymm16, %ymm17, %ymm16 尝试使用gcc进行编译,我得到: Assembler messages: Error: unsupported instruction `vpcmpeqb' AFAICT这是不可能的,它说cmpeq的唯一EVEX前缀指令有一个掩码目的地,但可能有我遗漏的东西,或者直接用字节编码实现的方法 谢谢 X/YMM16..31需要EVEX才能访问。 不能将它们与AVX1/AVX2形式的指令一起使用。 所以

我想知道是否有可能采取以下措施:

vpcmpeqb %ymm16, %ymm17, %ymm16
尝试使用gcc进行编译,我得到:

Assembler messages: Error: unsupported instruction `vpcmpeqb'
AFAICT这是不可能的,它说
cmpeq
的唯一EVEX前缀指令有一个掩码目的地,但可能有我遗漏的东西,或者直接用字节编码实现的方法


谢谢

X/YMM16..31需要EVEX才能访问。

不能将它们与AVX1/AVX2形式的指令一起使用。
所以不,要么只比较掩码regs,要么使用ymm0..15

VEX前缀+modrm每条指令总共只有4位,因此AVX1/2编码无法使用需要5位的寄存器号


GAS的错误消息没有帮助。也许它决定它是基于AVX-512寄存器的EVEX形式,然后注意到它是错误的操作数集

NASM说“操作码和操作数的组合无效”,这也不是很具体,但至少是正确的

clang的内置汇编程序可能是最好的:

foo.s:1:26: error: invalid operand for instruction
vpcmpeqb %ymm16, %ymm17, %ymm16
                         ^~~~~~

糟糕透了,所以基本上,使用
ymm16
ymm31
时,cmp指令上的3c延迟p5瓶颈会被强制执行。烦人的设计。@Noah:Oh,yes:/如果这是个问题,请为这些指令将数据设置为YMM0..15,即使这意味着完成后需要VZEROUPPER。您可以自由混合AVX2和AVX-512,例如使用AVX2
vpcmpeqb(%rdi)、%ymm0、%ymm1
/AVX-512
vpsubb%ymm1、%ymm30、%ymm30
计算匹配项。所以如果总的寄存器压力是个问题,你仍然可以在总的YMM寄存器的一半上使用AVX2。不幸的是,这不是一个容易的选择<代码>vzeroupper中止处理事务。因此,如果您想在HLE中使用
ymm0
ymm15
,您需要显式地
xor
将我使用的寄存器归零。@Noah:vpxor将您使用的寄存器归零并不等同于vzeropper以避免。我忘了是否有问答明确证实了这一点,但这是相关的。如果您在事务中调用手写asm函数作为事务的一部分,因此无法将其放在那里,那么您可以在事务结束后使用外部函数中的
vzeroupper
!这也是令人难以置信的恼人的设计!