是否可以将 ymm16 - ymm31 用于 AVX2 vpcmpeq{size} 指令?
Is it possible to use ymm16 - ymm31 for AVX2 vpcmpeq{size} instructions?
我想知道是否可以按照以下方式做一些事情:
vpcmpeqb %ymm16, %ymm17, %ymm16
尝试使用 gcc 进行编译我得到:
Assembler messages: Error: unsupported instruction `vpcmpeqb'
AFAICT 这是不可能的 felixcloutier 说 cmpeq
的唯一 EVEX 前缀指令有一个掩码目标,但可能有一些我遗漏的东西或者一种直接用字节编码来做到这一点的方法.
谢谢!
X / YMM16..31 需要 EVEX 才能访问。
您不能将它们与 AVX1/AVX2 形式的指令一起使用。
所以不,要么只比较掩码规则,要么使用 ymm0..15.
VEX 前缀 + modrm 每条指令总共只有 4 位,因此 AVX1/2 编码无法使用需要 5 位的寄存器编号。
GAS 的错误消息没有帮助。也许它决定它是基于使用 AVX-512-only 寄存器的 EVEX 形式,然后注意到它是错误的操作数集。
NASM 说“操作码和操作数的无效组合”也不是很具体,但至少是正确的。
clang 的内置汇编器可能是最好的:
foo.s:1:26: error: invalid operand for instruction
vpcmpeqb %ymm16, %ymm17, %ymm16
^~~~~~
我想知道是否可以按照以下方式做一些事情:
vpcmpeqb %ymm16, %ymm17, %ymm16
尝试使用 gcc 进行编译我得到:
Assembler messages: Error: unsupported instruction `vpcmpeqb'
AFAICT 这是不可能的 felixcloutier 说 cmpeq
的唯一 EVEX 前缀指令有一个掩码目标,但可能有一些我遗漏的东西或者一种直接用字节编码来做到这一点的方法.
谢谢!
X / YMM16..31 需要 EVEX 才能访问。
您不能将它们与 AVX1/AVX2 形式的指令一起使用。
所以不,要么只比较掩码规则,要么使用 ymm0..15.
VEX 前缀 + modrm 每条指令总共只有 4 位,因此 AVX1/2 编码无法使用需要 5 位的寄存器编号。
GAS 的错误消息没有帮助。也许它决定它是基于使用 AVX-512-only 寄存器的 EVEX 形式,然后注意到它是错误的操作数集。
NASM 说“操作码和操作数的无效组合”也不是很具体,但至少是正确的。
clang 的内置汇编器可能是最好的:
foo.s:1:26: error: invalid operand for instruction
vpcmpeqb %ymm16, %ymm17, %ymm16
^~~~~~