@@ -3,6 +3,7 @@ use gccjit::Context;
33use rustc_codegen_ssa:: target_features;
44use rustc_data_structures:: smallvec:: { SmallVec , smallvec} ;
55use rustc_session:: Session ;
6+ use rustc_target:: spec:: Architecture ;
67
78fn gcc_features_by_flags ( sess : & Session , features : & mut Vec < String > ) {
89 target_features:: retpoline_features_by_flags ( sess, features) ;
@@ -65,44 +66,47 @@ pub(crate) fn global_gcc_features(sess: &Session, diagnostics: bool) -> Vec<Stri
6566
6667// To find a list of GCC's names, check https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
6768pub fn to_gcc_features < ' a > ( sess : & Session , s : & ' a str ) -> SmallVec < [ & ' a str ; 2 ] > {
68- let arch = if sess. target . arch == "x86_64" { "x86" } else { & * sess. target . arch } ;
6969 // cSpell:disable
70- match ( arch, s) {
70+ match ( sess . target . arch , s) {
7171 // FIXME: seems like x87 does not exist?
72- ( "x86" , "x87" ) => smallvec ! [ ] ,
73- ( "x86" , "sse4.2" ) => smallvec ! [ "sse4.2" , "crc32" ] ,
74- ( "x86" , "pclmulqdq" ) => smallvec ! [ "pclmul" ] ,
75- ( "x86" , "rdrand" ) => smallvec ! [ "rdrnd" ] ,
76- ( "x86" , "bmi1" ) => smallvec ! [ "bmi" ] ,
77- ( "x86" , "cmpxchg16b" ) => smallvec ! [ "cx16" ] ,
78- ( "x86" , "avx512vaes" ) => smallvec ! [ "vaes" ] ,
79- ( "x86" , "avx512gfni" ) => smallvec ! [ "gfni" ] ,
80- ( "x86" , "avx512vpclmulqdq" ) => smallvec ! [ "vpclmulqdq" ] ,
72+ ( Architecture :: X86 | Architecture :: X86_64 , "x87" ) => smallvec ! [ ] ,
73+ ( Architecture :: X86 | Architecture :: X86_64 , "sse4.2" ) => smallvec ! [ "sse4.2" , "crc32" ] ,
74+ ( Architecture :: X86 | Architecture :: X86_64 , "pclmulqdq" ) => smallvec ! [ "pclmul" ] ,
75+ ( Architecture :: X86 | Architecture :: X86_64 , "rdrand" ) => smallvec ! [ "rdrnd" ] ,
76+ ( Architecture :: X86 | Architecture :: X86_64 , "bmi1" ) => smallvec ! [ "bmi" ] ,
77+ ( Architecture :: X86 | Architecture :: X86_64 , "cmpxchg16b" ) => smallvec ! [ "cx16" ] ,
78+ ( Architecture :: X86 | Architecture :: X86_64 , "avx512vaes" ) => smallvec ! [ "vaes" ] ,
79+ ( Architecture :: X86 | Architecture :: X86_64 , "avx512gfni" ) => smallvec ! [ "gfni" ] ,
80+ ( Architecture :: X86 | Architecture :: X86_64 , "avx512vpclmulqdq" ) => smallvec ! [ "vpclmulqdq" ] ,
8181 // NOTE: seems like GCC requires 'avx512bw' for 'avx512vbmi2'.
82- ( "x86" , "avx512vbmi2" ) => smallvec ! [ "avx512vbmi2" , "avx512bw" ] ,
82+ ( Architecture :: X86 | Architecture :: X86_64 , "avx512vbmi2" ) => {
83+ smallvec ! [ "avx512vbmi2" , "avx512bw" ]
84+ }
8385 // NOTE: seems like GCC requires 'avx512bw' for 'avx512bitalg'.
84- ( "x86" , "avx512bitalg" ) => smallvec ! [ "avx512bitalg" , "avx512bw" ] ,
85- ( "aarch64" , "rcpc2" ) => smallvec ! [ "rcpc-immo" ] ,
86- ( "aarch64" , "dpb" ) => smallvec ! [ "ccpp" ] ,
87- ( "aarch64" , "dpb2" ) => smallvec ! [ "ccdp" ] ,
88- ( "aarch64" , "frintts" ) => smallvec ! [ "fptoint" ] ,
89- ( "aarch64" , "fcma" ) => smallvec ! [ "complxnum" ] ,
90- ( "aarch64" , "pmuv3" ) => smallvec ! [ "perfmon" ] ,
91- ( "aarch64" , "paca" ) => smallvec ! [ "pauth" ] ,
92- ( "aarch64" , "pacg" ) => smallvec ! [ "pauth" ] ,
86+ ( Architecture :: X86 | Architecture :: X86_64 , "avx512bitalg" ) => {
87+ smallvec ! [ "avx512bitalg" , "avx512bw" ]
88+ }
89+ ( Architecture :: AArch64 , "rcpc2" ) => smallvec ! [ "rcpc-immo" ] ,
90+ ( Architecture :: AArch64 , "dpb" ) => smallvec ! [ "ccpp" ] ,
91+ ( Architecture :: AArch64 , "dpb2" ) => smallvec ! [ "ccdp" ] ,
92+ ( Architecture :: AArch64 , "frintts" ) => smallvec ! [ "fptoint" ] ,
93+ ( Architecture :: AArch64 , "fcma" ) => smallvec ! [ "complxnum" ] ,
94+ ( Architecture :: AArch64 , "pmuv3" ) => smallvec ! [ "perfmon" ] ,
95+ ( Architecture :: AArch64 , "paca" ) => smallvec ! [ "pauth" ] ,
96+ ( Architecture :: AArch64 , "pacg" ) => smallvec ! [ "pauth" ] ,
9397 // Rust ties fp and neon together. In GCC neon implicitly enables fp,
9498 // but we manually enable neon when a feature only implicitly enables fp
95- ( "aarch64" , "f32mm" ) => smallvec ! [ "f32mm" , "neon" ] ,
96- ( "aarch64" , "f64mm" ) => smallvec ! [ "f64mm" , "neon" ] ,
97- ( "aarch64" , "fhm" ) => smallvec ! [ "fp16fml" , "neon" ] ,
98- ( "aarch64" , "fp16" ) => smallvec ! [ "fullfp16" , "neon" ] ,
99- ( "aarch64" , "jsconv" ) => smallvec ! [ "jsconv" , "neon" ] ,
100- ( "aarch64" , "sve" ) => smallvec ! [ "sve" , "neon" ] ,
101- ( "aarch64" , "sve2" ) => smallvec ! [ "sve2" , "neon" ] ,
102- ( "aarch64" , "sve2-aes" ) => smallvec ! [ "sve2-aes" , "neon" ] ,
103- ( "aarch64" , "sve2-sm4" ) => smallvec ! [ "sve2-sm4" , "neon" ] ,
104- ( "aarch64" , "sve2-sha3" ) => smallvec ! [ "sve2-sha3" , "neon" ] ,
105- ( "aarch64" , "sve2-bitperm" ) => smallvec ! [ "sve2-bitperm" , "neon" ] ,
99+ ( Architecture :: AArch64 , "f32mm" ) => smallvec ! [ "f32mm" , "neon" ] ,
100+ ( Architecture :: AArch64 , "f64mm" ) => smallvec ! [ "f64mm" , "neon" ] ,
101+ ( Architecture :: AArch64 , "fhm" ) => smallvec ! [ "fp16fml" , "neon" ] ,
102+ ( Architecture :: AArch64 , "fp16" ) => smallvec ! [ "fullfp16" , "neon" ] ,
103+ ( Architecture :: AArch64 , "jsconv" ) => smallvec ! [ "jsconv" , "neon" ] ,
104+ ( Architecture :: AArch64 , "sve" ) => smallvec ! [ "sve" , "neon" ] ,
105+ ( Architecture :: AArch64 , "sve2" ) => smallvec ! [ "sve2" , "neon" ] ,
106+ ( Architecture :: AArch64 , "sve2-aes" ) => smallvec ! [ "sve2-aes" , "neon" ] ,
107+ ( Architecture :: AArch64 , "sve2-sm4" ) => smallvec ! [ "sve2-sm4" , "neon" ] ,
108+ ( Architecture :: AArch64 , "sve2-sha3" ) => smallvec ! [ "sve2-sha3" , "neon" ] ,
109+ ( Architecture :: AArch64 , "sve2-bitperm" ) => smallvec ! [ "sve2-bitperm" , "neon" ] ,
106110 ( _, s) => smallvec ! [ s] ,
107111 }
108112 // cSpell:enable
0 commit comments