Skip to content

Commit 92e5c1a

Browse files
authored
Merge pull request #1564 from rust-lang/fix_arm64_asm_vector_regs
Fix usage of vector registers in inline asm on arm64
2 parents eea0db2 + 5bb37b7 commit 92e5c1a

File tree

1 file changed

+28
-2
lines changed

1 file changed

+28
-2
lines changed

src/inline_asm.rs

+28-2
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,20 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
652652
.emit(&mut generated_asm, InlineAsmArch::X86_64, *modifier)
653653
.unwrap(),
654654
},
655+
InlineAsmArch::AArch64 => match reg {
656+
InlineAsmReg::AArch64(reg) if reg.vreg_index().is_some() => {
657+
// rustc emits v0 rather than q0
658+
reg.emit(
659+
&mut generated_asm,
660+
InlineAsmArch::AArch64,
661+
Some(modifier.unwrap_or('q')),
662+
)
663+
.unwrap()
664+
}
665+
_ => reg
666+
.emit(&mut generated_asm, InlineAsmArch::AArch64, *modifier)
667+
.unwrap(),
668+
},
655669
_ => reg.emit(&mut generated_asm, self.arch, *modifier).unwrap(),
656670
}
657671
}
@@ -809,7 +823,13 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
809823
}
810824
InlineAsmArch::AArch64 => {
811825
generated_asm.push_str(" str ");
812-
reg.emit(generated_asm, InlineAsmArch::AArch64, None).unwrap();
826+
match reg {
827+
InlineAsmReg::AArch64(reg) if reg.vreg_index().is_some() => {
828+
// rustc emits v0 rather than q0
829+
reg.emit(generated_asm, InlineAsmArch::AArch64, Some('q')).unwrap()
830+
}
831+
_ => reg.emit(generated_asm, InlineAsmArch::AArch64, None).unwrap(),
832+
}
813833
writeln!(generated_asm, ", [x19, 0x{:x}]", offset.bytes()).unwrap();
814834
}
815835
InlineAsmArch::RiscV64 => {
@@ -851,7 +871,13 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
851871
}
852872
InlineAsmArch::AArch64 => {
853873
generated_asm.push_str(" ldr ");
854-
reg.emit(generated_asm, InlineAsmArch::AArch64, None).unwrap();
874+
match reg {
875+
InlineAsmReg::AArch64(reg) if reg.vreg_index().is_some() => {
876+
// rustc emits v0 rather than q0
877+
reg.emit(generated_asm, InlineAsmArch::AArch64, Some('q')).unwrap()
878+
}
879+
_ => reg.emit(generated_asm, InlineAsmArch::AArch64, None).unwrap(),
880+
}
855881
writeln!(generated_asm, ", [x19, 0x{:x}]", offset.bytes()).unwrap();
856882
}
857883
InlineAsmArch::RiscV64 => {

0 commit comments

Comments
 (0)