Skip to content

Commit 0301d4a

Browse files
Add missing register class conversion for inline asm
1 parent e84f9a1 commit 0301d4a

File tree

1 file changed

+46
-30
lines changed

1 file changed

+46
-30
lines changed

src/asm.rs

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -564,56 +564,72 @@ fn reg_to_gcc(reg: InlineAsmRegOrRegClass) -> ConstraintOrRegister {
564564
_ => unimplemented!(),
565565
}
566566
},
567+
// They can be retrieved from https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html
567568
InlineAsmRegOrRegClass::RegClass(reg) => match reg {
568-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => unimplemented!(),
569-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg) => unimplemented!(),
570-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg) => unimplemented!(),
571-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => unimplemented!(),
572-
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => unimplemented!(),
569+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg) => "r",
570+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg) => "w",
571+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => "x",
572+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => {
573+
unreachable!("clobber-only")
574+
}
575+
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => "r",
573576
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
574577
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low16)
575-
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low8) => unimplemented!(),
576-
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16)
578+
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low8)
579+
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16)
577580
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low8)
578-
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low4) => unimplemented!(),
579-
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)
580-
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg) => unimplemented!(),
581-
InlineAsmRegClass::Avr(_) => unimplemented!(),
582-
InlineAsmRegClass::Bpf(_) => unimplemented!(),
583-
InlineAsmRegClass::Hexagon(HexagonInlineAsmRegClass::reg) => unimplemented!(),
584-
InlineAsmRegClass::Mips(MipsInlineAsmRegClass::reg) => unimplemented!(),
585-
InlineAsmRegClass::Mips(MipsInlineAsmRegClass::freg) => unimplemented!(),
586-
InlineAsmRegClass::Msp430(_) => unimplemented!(),
587-
InlineAsmRegClass::Nvptx(NvptxInlineAsmRegClass::reg16) => unimplemented!(),
588-
InlineAsmRegClass::Nvptx(NvptxInlineAsmRegClass::reg32) => unimplemented!(),
589-
InlineAsmRegClass::Nvptx(NvptxInlineAsmRegClass::reg64) => unimplemented!(),
590-
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::reg) => unimplemented!(),
591-
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::reg_nonzero) => unimplemented!(),
592-
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::freg) => unimplemented!(),
581+
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low4)
582+
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)
583+
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg) => "t",
584+
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg) => "r",
585+
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_upper) => "d",
586+
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_pair) => "r",
587+
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_iw) => "w",
588+
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_ptr) => "e",
589+
InlineAsmRegClass::Bpf(BpfInlineAsmRegClass::reg) => "r",
590+
InlineAsmRegClass::Bpf(BpfInlineAsmRegClass::wreg) => "w",
591+
InlineAsmRegClass::Hexagon(HexagonInlineAsmRegClass::reg) => "r",
592+
InlineAsmRegClass::Mips(MipsInlineAsmRegClass::reg) => "d", // more specific than "r"
593+
InlineAsmRegClass::Mips(MipsInlineAsmRegClass::freg) => "f",
594+
InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg) => "r",
595+
// For the NVPTX target, could only find the information from LLVM at
596+
// https://llvm.org/docs/LangRef.html#supported-constraint-code-list so they might be
597+
// incorrect.
598+
InlineAsmRegClass::Nvptx(NvptxInlineAsmRegClass::reg16) => "h",
599+
InlineAsmRegClass::Nvptx(NvptxInlineAsmRegClass::reg32) => "r",
600+
InlineAsmRegClass::Nvptx(NvptxInlineAsmRegClass::reg64) => "l",
601+
602+
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::reg) => "r",
603+
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::reg_nonzero) => "b",
604+
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::freg) => "f",
593605
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::cr)
594606
| InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::xer) => {
595607
unreachable!("clobber-only")
596608
},
597-
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::reg) => unimplemented!(),
598-
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::freg) => unimplemented!(),
599-
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::vreg) => unimplemented!(),
609+
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::reg) => "r",
610+
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::freg) => "f",
611+
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::vreg) => {
612+
unreachable!("clobber-only")
613+
}
600614
InlineAsmRegClass::X86(X86InlineAsmRegClass::reg) => "r",
601615
InlineAsmRegClass::X86(X86InlineAsmRegClass::reg_abcd) => "Q",
602616
InlineAsmRegClass::X86(X86InlineAsmRegClass::reg_byte) => "q",
603617
InlineAsmRegClass::X86(X86InlineAsmRegClass::xmm_reg)
604618
| InlineAsmRegClass::X86(X86InlineAsmRegClass::ymm_reg) => "x",
605619
InlineAsmRegClass::X86(X86InlineAsmRegClass::zmm_reg) => "v",
606620
InlineAsmRegClass::X86(X86InlineAsmRegClass::kreg) => "Yk",
607-
InlineAsmRegClass::X86(X86InlineAsmRegClass::kreg0) => unimplemented!(),
608-
InlineAsmRegClass::Wasm(WasmInlineAsmRegClass::local) => unimplemented!(),
609621
InlineAsmRegClass::X86(
610-
X86InlineAsmRegClass::x87_reg | X86InlineAsmRegClass::mmx_reg | X86InlineAsmRegClass::tmm_reg,
622+
X86InlineAsmRegClass::kreg0
623+
| X86InlineAsmRegClass::x87_reg
624+
| X86InlineAsmRegClass::mmx_reg
625+
| X86InlineAsmRegClass::tmm_reg,
611626
) => unreachable!("clobber-only"),
612627
InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => {
613628
bug!("GCC backend does not support SPIR-V")
614629
}
615-
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg) => unimplemented!(),
616-
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::freg) => unimplemented!(),
630+
InlineAsmRegClass::Wasm(WasmInlineAsmRegClass::local) => "r",
631+
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg) => "r",
632+
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::freg) => "f",
617633
InlineAsmRegClass::Err => unreachable!(),
618634
}
619635
};

0 commit comments

Comments
 (0)