@@ -768,34 +768,41 @@ impl<'gcc, 'tcx> AsmMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
768
768
}
769
769
770
770
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
771
773
match reg {
772
774
InlineAsmRegClass :: AArch64 ( AArch64InlineAsmRegClass :: reg) => modifier,
773
- InlineAsmRegClass :: AArch64 ( AArch64InlineAsmRegClass :: preg) => modifier,
774
775
InlineAsmRegClass :: AArch64 ( AArch64InlineAsmRegClass :: vreg)
775
776
| 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" )
777
781
}
778
- InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: reg) => unimplemented ! ( ) ,
782
+ InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: reg) => None ,
779
783
InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: sreg)
780
- | InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: sreg_low16) => unimplemented ! ( ) ,
784
+ | InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: sreg_low16) => None ,
781
785
InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: dreg)
782
786
| InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: dreg_low16)
783
- | InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: dreg_low8) => unimplemented ! ( ) ,
787
+ | InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: dreg_low8) => Some ( 'P' ) ,
784
788
InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: qreg)
785
789
| InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: qreg_low8)
786
790
| InlineAsmRegClass :: Arm ( ArmInlineAsmRegClass :: qreg_low4) => {
787
- unimplemented ! ( )
791
+ if modifier. is_none ( ) {
792
+ Some ( 'q' )
793
+ } else {
794
+ modifier
795
+ }
788
796
}
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 ,
796
801
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
+ }
799
806
InlineAsmRegClass :: X86 ( X86InlineAsmRegClass :: reg)
800
807
| InlineAsmRegClass :: X86 ( X86InlineAsmRegClass :: reg_abcd) => match modifier {
801
808
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
819
826
_ => unreachable ! ( ) ,
820
827
} ,
821
828
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
+ ) => {
824
835
unreachable ! ( "clobber-only" )
825
836
}
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 ,
827
849
InlineAsmRegClass :: SpirV ( SpirVInlineAsmRegClass :: reg) => {
828
850
bug ! ( "LLVM backend does not support SPIR-V" )
829
- } ,
830
- InlineAsmRegClass :: S390x ( S390xInlineAsmRegClass :: reg) => unimplemented ! ( ) ,
831
- InlineAsmRegClass :: S390x ( S390xInlineAsmRegClass :: freg) => unimplemented ! ( ) ,
851
+ }
832
852
InlineAsmRegClass :: Err => unreachable ! ( ) ,
833
853
}
834
854
}
0 commit comments