Skip to content

Commit 68e0c6e

Browse files
Implement constraits modifiers
1 parent 38ce31e commit 68e0c6e

File tree

1 file changed

+41
-21
lines changed

1 file changed

+41
-21
lines changed

src/asm.rs

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -768,34 +768,41 @@ impl<'gcc, 'tcx> AsmMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
768768
}
769769

770770
fn modifier_to_gcc(arch: InlineAsmArch, reg: InlineAsmRegClass, modifier: Option<char>) -> Option<char> {
771+
// The modifiers can be retrieved from
772+
// https://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers
771773
match reg {
772774
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg) => modifier,
773-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => modifier,
774775
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg)
775776
| InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => {
776-
unimplemented!()
777+
if modifier == Some('v') { None } else { modifier }
778+
}
779+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => {
780+
unreachable!("clobber-only")
777781
}
778-
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => unimplemented!(),
782+
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => None,
779783
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
780-
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => unimplemented!(),
784+
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => None,
781785
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)
782786
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low16)
783-
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low8) => unimplemented!(),
787+
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low8) => Some('P'),
784788
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg)
785789
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low8)
786790
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low4) => {
787-
unimplemented!()
791+
if modifier.is_none() {
792+
Some('q')
793+
} else {
794+
modifier
795+
}
788796
}
789-
InlineAsmRegClass::Avr(_) => unimplemented!(),
790-
InlineAsmRegClass::Bpf(_) => unimplemented!(),
791-
InlineAsmRegClass::Hexagon(_) => unimplemented!(),
792-
InlineAsmRegClass::Mips(_) => unimplemented!(),
793-
InlineAsmRegClass::Msp430(_) => unimplemented!(),
794-
InlineAsmRegClass::Nvptx(_) => unimplemented!(),
795-
InlineAsmRegClass::PowerPC(_) => unimplemented!(),
797+
InlineAsmRegClass::Hexagon(_) => None,
798+
InlineAsmRegClass::Mips(_) => None,
799+
InlineAsmRegClass::Nvptx(_) => None,
800+
InlineAsmRegClass::PowerPC(_) => None,
796801
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::reg)
797-
| InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::freg) => unimplemented!(),
798-
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::vreg) => unimplemented!(),
802+
| InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::freg) => None,
803+
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::vreg) => {
804+
unreachable!("clobber-only")
805+
}
799806
InlineAsmRegClass::X86(X86InlineAsmRegClass::reg)
800807
| InlineAsmRegClass::X86(X86InlineAsmRegClass::reg_abcd) => match modifier {
801808
None => if arch == InlineAsmArch::X86_64 { Some('q') } else { Some('k') },
@@ -819,16 +826,29 @@ fn modifier_to_gcc(arch: InlineAsmArch, reg: InlineAsmRegClass, modifier: Option
819826
_ => unreachable!(),
820827
},
821828
InlineAsmRegClass::X86(X86InlineAsmRegClass::kreg) => None,
822-
InlineAsmRegClass::X86(X86InlineAsmRegClass::kreg0) => None,
823-
InlineAsmRegClass::X86(X86InlineAsmRegClass::x87_reg | X86InlineAsmRegClass::mmx_reg | X86InlineAsmRegClass::tmm_reg) => {
829+
InlineAsmRegClass::X86(
830+
X86InlineAsmRegClass::x87_reg
831+
| X86InlineAsmRegClass::mmx_reg
832+
| X86InlineAsmRegClass::kreg0
833+
| X86InlineAsmRegClass::tmm_reg,
834+
) => {
824835
unreachable!("clobber-only")
825836
}
826-
InlineAsmRegClass::Wasm(WasmInlineAsmRegClass::local) => unimplemented!(),
837+
InlineAsmRegClass::Wasm(WasmInlineAsmRegClass::local) => None,
838+
InlineAsmRegClass::Bpf(_) => None,
839+
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_pair)
840+
| InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_iw)
841+
| InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_ptr) => match modifier {
842+
Some('h') => Some('B'),
843+
Some('l') => Some('A'),
844+
_ => None,
845+
},
846+
InlineAsmRegClass::Avr(_) => None,
847+
InlineAsmRegClass::S390x(_) => None,
848+
InlineAsmRegClass::Msp430(_) => None,
827849
InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => {
828850
bug!("LLVM backend does not support SPIR-V")
829-
},
830-
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg) => unimplemented!(),
831-
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::freg) => unimplemented!(),
851+
}
832852
InlineAsmRegClass::Err => unreachable!(),
833853
}
834854
}

0 commit comments

Comments
 (0)