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,例如使用AVX2vpcmpeqb(%rdi)、%ymm0、%ymm1
/AVX-512vpsubb%ymm1、%ymm30、%ymm30
计算匹配项。所以如果总的寄存器压力是个问题,你仍然可以在总的YMM寄存器的一半上使用AVX2。不幸的是,这不是一个容易的选择<代码>vzeroupper中止处理事务。因此,如果您想在HLE中使用ymm0
…ymm15
,您需要显式地xor
将我使用的寄存器归零。@Noah:vpxor将您使用的寄存器归零并不等同于vzeropper以避免。我忘了是否有问答明确证实了这一点,但这是相关的。如果您在事务中调用手写asm函数作为事务的一部分,因此无法将其放在那里,那么您可以在事务结束后使用外部函数中的vzeroupper
!这也是令人难以置信的恼人的设计!