【发布时间】:2019-01-21 08:58:07
【问题描述】:
我正在学习 SSE 指令,并在尝试将单个字节从 xmm 寄存器复制到 al 时发现 GNU 的 as 汇编器出现一个奇怪的错误:
“错误:pextrb 的操作数类型不匹配”。
我认为我的语法是正确的,它与pextrd 完美搭配。
pextrd $3, %xmm0, %eax # Works perfectly fine
pextrb $3, %xmm0, %al # Error: operand type mismatch for 'pextrb'
【问题讨论】:
-
gcc 产生
%eax。可能是因为结果是 0 扩展的? -
另见pextrb:PEXTRB/PEXTRD 在 64 位模式下的默认操作数大小为 64 位,最低有效字节/双字数据上方的位用零填充我>
-
@MarcGlisse:是的,谢天谢地,英特尔避免引入需要额外工作的新指令以避免像
setcc r/m8那样的错误依赖关系,例如xor %eax,%eax/setl %al。如果将 PEXTRB/PEXTRW 合并到 RAX 的低字节而不是零扩展到完整的 RAX 中,而不依赖于旧值,那将是一个糟糕的设计决定。
标签: assembly x86-64 sse gnu-assembler