Skip to content

Commit 3b8794e

Browse files
committed
Fix xmm operands in inline assembly
1 parent 45d8c12 commit 3b8794e

File tree

1 file changed

+28
-4
lines changed

1 file changed

+28
-4
lines changed

src/inline_asm.rs

+28-4
Original file line numberDiff line numberDiff line change
@@ -506,10 +506,34 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
506506
if self.options.contains(InlineAsmOptions::ATT_SYNTAX) {
507507
generated_asm.push('%');
508508
}
509-
self.registers[*operand_idx]
510-
.unwrap()
511-
.emit(&mut generated_asm, self.arch, *modifier)
512-
.unwrap();
509+
510+
let reg = self.registers[*operand_idx].unwrap();
511+
match self.arch {
512+
InlineAsmArch::X86_64 => match reg {
513+
InlineAsmReg::X86(reg)
514+
if reg as u32 >= X86InlineAsmReg::xmm0 as u32
515+
&& reg as u32 <= X86InlineAsmReg::xmm15 as u32 =>
516+
{
517+
// rustc emits x0 rather than xmm0
518+
let class = match *modifier {
519+
None | Some('x') => "xmm",
520+
Some('y') => "ymm",
521+
Some('z') => "zmm",
522+
_ => unreachable!(),
523+
};
524+
write!(
525+
generated_asm,
526+
"{class}{}",
527+
reg as u32 - X86InlineAsmReg::xmm0 as u32
528+
)
529+
.unwrap();
530+
}
531+
_ => reg
532+
.emit(&mut generated_asm, InlineAsmArch::X86_64, *modifier)
533+
.unwrap(),
534+
},
535+
_ => reg.emit(&mut generated_asm, self.arch, *modifier).unwrap(),
536+
}
513537
}
514538
CInlineAsmOperand::Const { ref value } => {
515539
generated_asm.push_str(value);

0 commit comments

Comments
 (0)