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

`