Skip to content

Commit b3198c7

Browse files
Add missing register class conversion for inline asm
1 parent 618553b commit b3198c7

File tree

1 file changed

+45
-30
lines changed

1 file changed

+45
-30
lines changed

src/asm.rs

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -564,56 +564,71 @@ 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+
// https://github.com/gcc-mirror/gcc/blob/master/gcc/config/nvptx/nvptx.md -> look for
596+
// "define_constraint".
597+
InlineAsmRegClass::Nvptx(NvptxInlineAsmRegClass::reg16) => "h",
598+
InlineAsmRegClass::Nvptx(NvptxInlineAsmRegClass::reg32) => "r",
599+
InlineAsmRegClass::Nvptx(NvptxInlineAsmRegClass::reg64) => "l",
600+
601+
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::reg) => "r",
602+
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::reg_nonzero) => "b",
603+
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::freg) => "f",
593604
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::cr)
594605
| InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::xer) => {
595606
unreachable!("clobber-only")
596607
},
597-
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::reg) => unimplemented!(),
598-
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::freg) => unimplemented!(),
599-
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::vreg) => unimplemented!(),
608+
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::reg) => "r",
609+
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::freg) => "f",
610+
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::vreg) => {
611+
unreachable!("clobber-only")
612+
}
600613
InlineAsmRegClass::X86(X86InlineAsmRegClass::reg) => "r",
601614
InlineAsmRegClass::X86(X86InlineAsmRegClass::reg_abcd) => "Q",
602615
InlineAsmRegClass::X86(X86InlineAsmRegClass::reg_byte) => "q",
603616
InlineAsmRegClass::X86(X86InlineAsmRegClass::xmm_reg)
604617
| InlineAsmRegClass::X86(X86InlineAsmRegClass::ymm_reg) => "x",
605618
InlineAsmRegClass::X86(X86InlineAsmRegClass::zmm_reg) => "v",
606619
InlineAsmRegClass::X86(X86InlineAsmRegClass::kreg) => "Yk",
607-
InlineAsmRegClass::X86(X86InlineAsmRegClass::kreg0) => unimplemented!(),
608-
InlineAsmRegClass::Wasm(WasmInlineAsmRegClass::local) => unimplemented!(),
609620
InlineAsmRegClass::X86(
610-
X86InlineAsmRegClass::x87_reg | X86InlineAsmRegClass::mmx_reg | X86InlineAsmRegClass::tmm_reg,
621+
X86InlineAsmRegClass::kreg0
622+
| X86InlineAsmRegClass::x87_reg
623+
| X86InlineAsmRegClass::mmx_reg
624+
| X86InlineAsmRegClass::tmm_reg,
611625
) => unreachable!("clobber-only"),
612626
InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => {
613627
bug!("GCC backend does not support SPIR-V")
614628
}
615-
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg) => unimplemented!(),
616-
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::freg) => unimplemented!(),
629+
InlineAsmRegClass::Wasm(WasmInlineAsmRegClass::local) => "r",
630+
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg) => "r",
631+
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::freg) => "f",
617632
InlineAsmRegClass::Err => unreachable!(),
618633
}
619634
};

0 commit comments

Comments
 (0)