Auto merge of #147645 - tamird:arch-enum, r= · rust-lang/rust@3a048fa (original) (raw)
`@@ -2,6 +2,7 @@
`
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) {
`
`@@ -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
`