|
17 | 17 | along with GCC; see the file COPYING3. If not see
|
18 | 18 | <http://www.gnu.org/licenses/>. */
|
19 | 19 |
|
20 |
| -/* This is a list of ISA extentsions in AArch64. |
| 20 | +/* This is a list of ISA extensions in AArch64. |
21 | 21 |
|
22 |
| - Before using #include to read this file, define a macro: |
| 22 | + Before using #include to read this file, define one of the following |
| 23 | + macros: |
23 | 24 |
|
24 | 25 | AARCH64_OPT_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON,
|
25 | 26 | EXPLICIT_OFF, FEATURE_STRING)
|
26 | 27 |
|
| 28 | + AARCH64_FMV_FEATURE(NAME, FEAT_NAME, IDENT) |
| 29 | + |
27 | 30 | - NAME is the name of the extension, represented as a string constant.
|
28 | 31 |
|
29 | 32 | - IDENT is the canonical internal name for this flag.
|
30 | 33 |
|
| 34 | + - FEAT_NAME is the unprefixed name used in the CPUFeatures enum. |
| 35 | + |
31 | 36 | - REQUIRES is a list of features that must be enabled whenever this
|
32 | 37 | feature is enabled. The relationship is implicitly transitive:
|
33 | 38 | if A appears in B's REQUIRES and B appears in C's REQUIRES then
|
|
58 | 63 | that are required. Their order is not important. An empty string means
|
59 | 64 | do not detect this feature during auto detection.
|
60 | 65 |
|
61 |
| - The list of features must follow topological order wrt REQUIRES |
62 |
| - and EXPLICIT_ON. For example, if A is in B's REQUIRES list, A must |
63 |
| - come before B. This is enforced by aarch64-feature-deps.h. |
| 66 | + - OPT_FLAGS is a list of feature IDENTS that should be enabled (along with |
| 67 | + their transitive dependencies) when the specified FMV feature is present. |
| 68 | + |
| 69 | + Where a feature is present as both an extension and a function |
| 70 | + multiversioning feature, and IDENT matches the FEAT_NAME suffix, then these |
| 71 | + can be listed here simultaneously using the macro: |
| 72 | + |
| 73 | + AARCH64_OPT_FMV_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON, |
| 74 | + EXPLICIT_OFF, FEATURE_STRING) |
| 75 | + |
| 76 | + The list of features extensions must follow topological order wrt REQUIRES |
| 77 | + and EXPLICIT_ON. For example, if A is in B's REQUIRES list, A must come |
| 78 | + before B. This is enforced by aarch64-feature-deps.h. |
| 79 | + |
| 80 | + The list of multiversioning features must be ordered by increasing priority, |
| 81 | + as defined in https://github.com/ARM-software/acle/blob/main/main/acle.md |
64 | 82 |
|
65 | 83 | NOTE: Any changes to the AARCH64_OPT_EXTENSION macro need to be mirrored in
|
66 | 84 | config.gcc. */
|
67 | 85 |
|
| 86 | +#ifndef AARCH64_OPT_EXTENSION |
| 87 | +#define AARCH64_OPT_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON, \ |
| 88 | + EXPLICIT_OFF, FEATURE_STRING) |
| 89 | +#endif |
| 90 | + |
| 91 | +#ifndef AARCH64_FMV_FEATURE |
| 92 | +#define AARCH64_FMV_FEATURE(NAME, FEAT_NAME, OPT_FLAGS) |
| 93 | +#endif |
| 94 | + |
| 95 | +#define AARCH64_OPT_FMV_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON, \ |
| 96 | + EXPLICIT_OFF, FEATURE_STRING) \ |
| 97 | +AARCH64_OPT_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON, EXPLICIT_OFF, \ |
| 98 | + FEATURE_STRING) \ |
| 99 | +AARCH64_FMV_FEATURE(NAME, IDENT, (IDENT)) |
| 100 | + |
| 101 | + |
68 | 102 | AARCH64_OPT_EXTENSION("fp", FP, (), (), (), "fp")
|
69 | 103 |
|
70 | 104 | AARCH64_OPT_EXTENSION("simd", SIMD, (FP), (), (), "asimd")
|
71 | 105 |
|
72 |
| -AARCH64_OPT_EXTENSION("crc", CRC, (), (), (), "crc32") |
| 106 | +AARCH64_OPT_FMV_EXTENSION("rng", RNG, (), (), (), "rng") |
73 | 107 |
|
74 |
| -AARCH64_OPT_EXTENSION("lse", LSE, (), (), (), "atomics") |
| 108 | +AARCH64_OPT_FMV_EXTENSION("flagm", FLAGM, (), (), (), "flagm") |
75 | 109 |
|
76 |
| -/* +nofp16 disables an implicit F16FML, even though an implicit F16FML |
77 |
| - does not imply F16. See F16FML for more details. */ |
78 |
| -AARCH64_OPT_EXTENSION("fp16", F16, (FP), (), (F16FML), "fphp asimdhp") |
| 110 | +AARCH64_FMV_FEATURE("flagm2", FLAGM2, (FLAGM)) |
| 111 | + |
| 112 | +AARCH64_FMV_FEATURE("fp16fml", FP16FML, (F16FML)) |
| 113 | + |
| 114 | +AARCH64_OPT_FMV_EXTENSION("dotprod", DOTPROD, (SIMD), (), (), "asimddp") |
79 | 115 |
|
80 |
| -AARCH64_OPT_EXTENSION("rcpc", RCPC, (), (), (), "lrcpc") |
| 116 | +AARCH64_OPT_FMV_EXTENSION("sm4", SM4, (SIMD), (), (), "sm3 sm4") |
81 | 117 |
|
82 | 118 | /* An explicit +rdma implies +simd, but +rdma+nosimd still enables scalar
|
83 | 119 | RDMA instructions. */
|
84 | 120 | AARCH64_OPT_EXTENSION("rdma", RDMA, (), (SIMD), (), "asimdrdm")
|
85 | 121 |
|
86 |
| -AARCH64_OPT_EXTENSION("dotprod", DOTPROD, (SIMD), (), (), "asimddp") |
| 122 | +AARCH64_FMV_FEATURE("rmd", RDM, (RDMA)) |
| 123 | + |
| 124 | +AARCH64_OPT_FMV_EXTENSION("lse", LSE, (), (), (), "atomics") |
| 125 | + |
| 126 | +AARCH64_FMV_FEATURE("fp", FP, (FP)) |
| 127 | + |
| 128 | +AARCH64_FMV_FEATURE("simd", SIMD, (SIMD)) |
| 129 | + |
| 130 | +AARCH64_OPT_FMV_EXTENSION("crc", CRC, (), (), (), "crc32") |
| 131 | + |
| 132 | +AARCH64_FMV_FEATURE("sha1", SHA1, ()) |
87 | 133 |
|
88 |
| -AARCH64_OPT_EXTENSION("aes", AES, (SIMD), (), (), "aes") |
| 134 | +AARCH64_OPT_FMV_EXTENSION("sha2", SHA2, (SIMD), (), (), "sha1 sha2") |
89 | 135 |
|
90 |
| -AARCH64_OPT_EXTENSION("sha2", SHA2, (SIMD), (), (), "sha1 sha2") |
| 136 | +AARCH64_FMV_FEATURE("sha3", SHA3, (SHA3)) |
| 137 | + |
| 138 | +AARCH64_OPT_FMV_EXTENSION("aes", AES, (SIMD), (), (), "aes") |
| 139 | + |
| 140 | +AARCH64_FMV_FEATURE("pmull", PMULL, ()) |
91 | 141 |
|
92 | 142 | /* +nocrypto disables AES, SHA2 and SM4, and anything that depends on them
|
93 | 143 | (such as SHA3 and the SVE2 crypto extensions). */
|
94 | 144 | AARCH64_OPT_EXTENSION("crypto", CRYPTO, (AES, SHA2), (), (AES, SHA2, SM4),
|
95 | 145 | "aes pmull sha1 sha2")
|
96 | 146 |
|
| 147 | +/* Listing sha3 after crypto means we pass "+aes+sha3" to the assembler |
| 148 | + instead of "+sha3+crypto". */ |
97 | 149 | AARCH64_OPT_EXTENSION("sha3", SHA3, (SHA2), (), (), "sha3 sha512")
|
98 | 150 |
|
99 |
| -AARCH64_OPT_EXTENSION("sm4", SM4, (SIMD), (), (), "sm3 sm4") |
| 151 | +/* +nofp16 disables an implicit F16FML, even though an implicit F16FML |
| 152 | + does not imply F16. See F16FML for more details. */ |
| 153 | +AARCH64_OPT_EXTENSION("fp16", F16, (FP), (), (F16FML), "fphp asimdhp") |
| 154 | + |
| 155 | +AARCH64_FMV_FEATURE("fp16", FP16, (F16)) |
100 | 156 |
|
101 | 157 | /* An explicit +fp16fml implies +fp16, but a dependence on it does not.
|
102 | 158 | Thus -march=armv8.4-a implies F16FML but not F16. -march=armv8.4-a+fp16
|
103 | 159 | and -march=armv8.4-a+fp16fml are equivalent and enable both F16FML and F16.
|
104 | 160 | -march=armv8.4-a+nofp16+fp16 enables F16 but not F16FML. */
|
105 | 161 | AARCH64_OPT_EXTENSION("fp16fml", F16FML, (), (F16), (), "asimdfhm")
|
106 | 162 |
|
107 |
| -AARCH64_OPT_EXTENSION("sve", SVE, (SIMD, F16), (), (), "sve") |
| 163 | +AARCH64_FMV_FEATURE("dit", DIT, ()) |
108 | 164 |
|
109 |
| -AARCH64_OPT_EXTENSION("profile", PROFILE, (), (), (), "") |
| 165 | +AARCH64_FMV_FEATURE("dpb", DPB, ()) |
110 | 166 |
|
111 |
| -AARCH64_OPT_EXTENSION("rng", RNG, (), (), (), "rng") |
| 167 | +AARCH64_FMV_FEATURE("dpb2", DPB2, ()) |
112 | 168 |
|
113 |
| -AARCH64_OPT_EXTENSION("memtag", MEMTAG, (), (), (), "") |
| 169 | +AARCH64_FMV_FEATURE("jscvt", JSCVT, ()) |
114 | 170 |
|
115 |
| -AARCH64_OPT_EXTENSION("sb", SB, (), (), (), "sb") |
| 171 | +AARCH64_FMV_FEATURE("fcma", FCMA, (SIMD)) |
116 | 172 |
|
117 |
| -AARCH64_OPT_EXTENSION("ssbs", SSBS, (), (), (), "ssbs") |
| 173 | +AARCH64_OPT_FMV_EXTENSION("rcpc", RCPC, (), (), (), "lrcpc") |
118 | 174 |
|
119 |
| -AARCH64_OPT_EXTENSION("predres", PREDRES, (), (), (), "") |
| 175 | +AARCH64_FMV_FEATURE("rcpc2", RCPC2, (RCPC)) |
120 | 176 |
|
121 |
| -AARCH64_OPT_EXTENSION("sve2", SVE2, (SVE), (), (), "sve2") |
| 177 | +AARCH64_OPT_FMV_EXTENSION("rcpc3", RCPC3, (), (), (), "rcpc3") |
122 | 178 |
|
123 |
| -AARCH64_OPT_EXTENSION("sve2-sm4", SVE2_SM4, (SVE2, SM4), (), (), "svesm4") |
| 179 | +AARCH64_FMV_FEATURE("frintts", FRINTTS, ()) |
| 180 | + |
| 181 | +AARCH64_FMV_FEATURE("dgh", DGH, ()) |
| 182 | + |
| 183 | +AARCH64_OPT_FMV_EXTENSION("i8mm", I8MM, (SIMD), (), (), "i8mm") |
| 184 | + |
| 185 | +/* An explicit +bf16 implies +simd, but +bf16+nosimd still enables scalar BF16 |
| 186 | + instructions. */ |
| 187 | +AARCH64_OPT_FMV_EXTENSION("bf16", BF16, (FP), (SIMD), (), "bf16") |
| 188 | + |
| 189 | +AARCH64_FMV_FEATURE("ebf16", EBF16, (BF16)) |
| 190 | + |
| 191 | +AARCH64_FMV_FEATURE("rpres", RPRES, ()) |
| 192 | + |
| 193 | +AARCH64_OPT_FMV_EXTENSION("sve", SVE, (SIMD, F16), (), (), "sve") |
| 194 | + |
| 195 | +AARCH64_FMV_FEATURE("sve-bf16", SVE_BF16, (SVE, BF16)) |
| 196 | + |
| 197 | +AARCH64_FMV_FEATURE("sve-ebf16", SVE_EBF16, (SVE, BF16)) |
| 198 | + |
| 199 | +AARCH64_FMV_FEATURE("sve-i8mm", SVE_I8MM, (SVE, I8MM)) |
| 200 | + |
| 201 | +AARCH64_OPT_EXTENSION("f32mm", F32MM, (SVE), (), (), "f32mm") |
| 202 | + |
| 203 | +AARCH64_FMV_FEATURE("f32mm", SVE_F32MM, (F32MM)) |
| 204 | + |
| 205 | +AARCH64_OPT_EXTENSION("f64mm", F64MM, (SVE), (), (), "f64mm") |
| 206 | + |
| 207 | +AARCH64_FMV_FEATURE("f64mm", SVE_F64MM, (F64MM)) |
| 208 | + |
| 209 | +AARCH64_OPT_FMV_EXTENSION("sve2", SVE2, (SVE), (), (), "sve2") |
124 | 210 |
|
125 | 211 | AARCH64_OPT_EXTENSION("sve2-aes", SVE2_AES, (SVE2, AES), (), (), "sveaes")
|
126 | 212 |
|
127 |
| -AARCH64_OPT_EXTENSION("sve2-sha3", SVE2_SHA3, (SVE2, SHA3), (), (), "svesha3") |
| 213 | +AARCH64_FMV_FEATURE("sve2-aes", SVE_AES, (SVE2_AES)) |
| 214 | + |
| 215 | +AARCH64_FMV_FEATURE("sve2-pmull128", SVE_PMULL128, (SVE2)) |
128 | 216 |
|
129 | 217 | AARCH64_OPT_EXTENSION("sve2-bitperm", SVE2_BITPERM, (SVE2), (), (),
|
130 | 218 | "svebitperm")
|
131 | 219 |
|
132 |
| -AARCH64_OPT_EXTENSION("tme", TME, (), (), (), "") |
| 220 | +AARCH64_FMV_FEATURE("sve2-bitperm", SVE_BITPERM, (SVE2_BITPERM)) |
133 | 221 |
|
134 |
| -AARCH64_OPT_EXTENSION("i8mm", I8MM, (SIMD), (), (), "i8mm") |
| 222 | +AARCH64_OPT_EXTENSION("sve2-sha3", SVE2_SHA3, (SVE2, SHA3), (), (), "svesha3") |
135 | 223 |
|
136 |
| -AARCH64_OPT_EXTENSION("f32mm", F32MM, (SVE), (), (), "f32mm") |
| 224 | +AARCH64_FMV_FEATURE("sve2-sha3", SVE_SHA3, (SVE2_SHA3)) |
137 | 225 |
|
138 |
| -AARCH64_OPT_EXTENSION("f64mm", F64MM, (SVE), (), (), "f64mm") |
| 226 | +AARCH64_OPT_EXTENSION("sve2-sm4", SVE2_SM4, (SVE2, SM4), (), (), "svesm4") |
139 | 227 |
|
140 |
| -/* An explicit +bf16 implies +simd, but +bf16+nosimd still enables scalar BF16 |
141 |
| - instructions. */ |
142 |
| -AARCH64_OPT_EXTENSION("bf16", BF16, (FP), (SIMD), (), "bf16") |
| 228 | +AARCH64_FMV_FEATURE("sve2-sm4", SVE_SM4, (SVE2_SM4)) |
| 229 | + |
| 230 | +AARCH64_OPT_FMV_EXTENSION("sme", SME, (BF16, SVE2), (), (), "sme") |
| 231 | + |
| 232 | +AARCH64_OPT_FMV_EXTENSION("memtag", MEMTAG, (), (), (), "") |
| 233 | + |
| 234 | +AARCH64_FMV_FEATURE("memtag2", MEMTAG2, (MEMTAG)) |
| 235 | + |
| 236 | +AARCH64_FMV_FEATURE("memtag3", MEMTAG3, (MEMTAG)) |
143 | 237 |
|
144 |
| -AARCH64_OPT_EXTENSION("flagm", FLAGM, (), (), (), "flagm") |
| 238 | +AARCH64_OPT_FMV_EXTENSION("sb", SB, (), (), (), "sb") |
| 239 | + |
| 240 | +AARCH64_OPT_FMV_EXTENSION("predres", PREDRES, (), (), (), "") |
| 241 | + |
| 242 | +AARCH64_OPT_FMV_EXTENSION("ssbs", SSBS, (), (), (), "ssbs") |
| 243 | + |
| 244 | +AARCH64_FMV_FEATURE("ssbs2", SSBS2, (SSBS)) |
| 245 | + |
| 246 | +AARCH64_FMV_FEATURE("bti", BTI, ()) |
| 247 | + |
| 248 | +AARCH64_OPT_EXTENSION("profile", PROFILE, (), (), (), "") |
| 249 | + |
| 250 | +AARCH64_OPT_EXTENSION("tme", TME, (), (), (), "") |
145 | 251 |
|
146 | 252 | AARCH64_OPT_EXTENSION("pauth", PAUTH, (), (), (), "paca pacg")
|
147 | 253 |
|
148 | 254 | AARCH64_OPT_EXTENSION("ls64", LS64, (), (), (), "")
|
149 | 255 |
|
150 |
| -AARCH64_OPT_EXTENSION("mops", MOPS, (), (), (), "") |
| 256 | +AARCH64_FMV_FEATURE("ls64", LS64, ()) |
151 | 257 |
|
152 |
| -AARCH64_OPT_EXTENSION("cssc", CSSC, (), (), (), "cssc") |
| 258 | +AARCH64_FMV_FEATURE("ls64_v", LS64_V, ()) |
153 | 259 |
|
154 |
| -AARCH64_OPT_EXTENSION("sme", SME, (BF16, SVE2), (), (), "sme") |
| 260 | +AARCH64_FMV_FEATURE("ls64_accdata", LS64_ACCDATA, (LS64)) |
155 | 261 |
|
156 |
| -AARCH64_OPT_EXTENSION("sme-i16i64", SME_I16I64, (SME), (), (), "") |
| 262 | +AARCH64_FMV_FEATURE("wfxt", WFXT, ()) |
157 | 263 |
|
158 | 264 | AARCH64_OPT_EXTENSION("sme-f64f64", SME_F64F64, (SME), (), (), "")
|
159 | 265 |
|
160 |
| -AARCH64_OPT_EXTENSION("sme2", SME2, (SME), (), (), "sme2") |
| 266 | +AARCH64_FMV_FEATURE("sme-f64f64", SME_F64, (SME_F64F64)) |
| 267 | + |
| 268 | +AARCH64_OPT_EXTENSION("sme-i16i64", SME_I16I64, (SME), (), (), "") |
| 269 | + |
| 270 | +AARCH64_FMV_FEATURE("sme-i16i64", SME_I64, (SME_I16I64)) |
| 271 | + |
| 272 | +AARCH64_OPT_FMV_EXTENSION("sme2", SME2, (SME), (), (), "sme2") |
| 273 | + |
| 274 | +AARCH64_OPT_EXTENSION("mops", MOPS, (), (), (), "") |
| 275 | + |
| 276 | +AARCH64_OPT_EXTENSION("cssc", CSSC, (), (), (), "cssc") |
161 | 277 |
|
162 | 278 | AARCH64_OPT_EXTENSION("d128", D128, (), (), (), "d128")
|
163 | 279 |
|
164 | 280 | AARCH64_OPT_EXTENSION("the", THE, (), (), (), "the")
|
165 | 281 |
|
166 | 282 | AARCH64_OPT_EXTENSION("gcs", GCS, (), (), (), "gcs")
|
167 | 283 |
|
168 |
| -AARCH64_OPT_EXTENSION("rcpc3", RCPC3, (), (), (), "rcpc3") |
| 284 | +#undef AARCH64_OPT_FMV_EXTENSION |
169 | 285 | #undef AARCH64_OPT_EXTENSION
|
| 286 | +#undef AARCH64_FMV_FEATURE |
0 commit comments