@@ -768,34 +768,41 @@ impl<'gcc, 'tcx> AsmMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
768768}
769769
770770fn 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