|
2 | 2 | use gccjit::Context; |
3 | 3 | use rustc_codegen_ssa::target_features; |
4 | 4 | use rustc_session::Session; |
| 5 | +use rustc_target::spec::Architecture; |
5 | 6 | use smallvec::{SmallVec, smallvec}; |
6 | 7 |
|
7 | 8 | fn gcc_features_by_flags(sess: &Session, features: &mut Vec<String>) { |
@@ -65,44 +66,47 @@ pub(crate) fn global_gcc_features(sess: &Session, diagnostics: bool) -> Vec<Stri |
65 | 66 |
|
66 | 67 | // To find a list of GCC's names, check https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html |
67 | 68 | pub 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 }; |
69 | 69 | // cSpell:disable |
70 | | - match (arch, s) { |
| 70 | + match (sess.target.arch, s) { |
71 | 71 | // 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"], |
81 | 81 | // 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 | + } |
83 | 85 | // 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"], |
93 | 97 | // Rust ties fp and neon together. In GCC neon implicitly enables fp, |
94 | 98 | // 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"], |
106 | 110 | (_, s) => smallvec![s], |
107 | 111 | } |
108 | 112 | // cSpell:enable |
|
0 commit comments