1 | //===-- AArch64TargetParser - Parser for AArch64 features -------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file implements a target parser to recognise AArch64 hardware features |
10 | // such as FPU/CPU/ARCH and extension names. |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #ifndef LLVM_TARGETPARSER_AARCH64TARGETPARSER_H |
15 | #define LLVM_TARGETPARSER_AARCH64TARGETPARSER_H |
16 | |
17 | #include "llvm/ADT/ArrayRef.h" |
18 | #include "llvm/ADT/Bitset.h" |
19 | #include "llvm/ADT/StringMap.h" |
20 | #include "llvm/ADT/StringRef.h" |
21 | #include "llvm/Support/VersionTuple.h" |
22 | #include <array> |
23 | #include <vector> |
24 | |
25 | namespace llvm { |
26 | |
27 | class Triple; |
28 | |
29 | namespace AArch64 { |
30 | |
31 | struct ArchInfo; |
32 | struct CpuInfo; |
33 | |
34 | // Function Multi Versioning CPU features. They must be kept in sync with |
35 | // compiler-rt enum CPUFeatures in lib/builtins/cpu_model/aarch64.c with |
36 | // FEAT_MAX as sentinel. |
37 | enum CPUFeatures { |
38 | FEAT_RNG, |
39 | FEAT_FLAGM, |
40 | FEAT_FLAGM2, |
41 | FEAT_FP16FML, |
42 | FEAT_DOTPROD, |
43 | FEAT_SM4, |
44 | FEAT_RDM, |
45 | FEAT_LSE, |
46 | FEAT_FP, |
47 | FEAT_SIMD, |
48 | FEAT_CRC, |
49 | FEAT_SHA1, |
50 | FEAT_SHA2, |
51 | FEAT_SHA3, |
52 | FEAT_AES, |
53 | FEAT_PMULL, |
54 | FEAT_FP16, |
55 | FEAT_DIT, |
56 | FEAT_DPB, |
57 | FEAT_DPB2, |
58 | FEAT_JSCVT, |
59 | FEAT_FCMA, |
60 | FEAT_RCPC, |
61 | FEAT_RCPC2, |
62 | FEAT_FRINTTS, |
63 | FEAT_DGH, |
64 | FEAT_I8MM, |
65 | FEAT_BF16, |
66 | FEAT_EBF16, |
67 | FEAT_RPRES, |
68 | FEAT_SVE, |
69 | FEAT_SVE_BF16, |
70 | FEAT_SVE_EBF16, |
71 | FEAT_SVE_I8MM, |
72 | FEAT_SVE_F32MM, |
73 | FEAT_SVE_F64MM, |
74 | FEAT_SVE2, |
75 | FEAT_SVE_AES, |
76 | FEAT_SVE_PMULL128, |
77 | FEAT_SVE_BITPERM, |
78 | FEAT_SVE_SHA3, |
79 | FEAT_SVE_SM4, |
80 | FEAT_SME, |
81 | FEAT_MEMTAG, |
82 | FEAT_MEMTAG2, |
83 | FEAT_MEMTAG3, |
84 | FEAT_SB, |
85 | FEAT_PREDRES, |
86 | FEAT_SSBS, |
87 | FEAT_SSBS2, |
88 | FEAT_BTI, |
89 | FEAT_LS64, |
90 | FEAT_LS64_V, |
91 | FEAT_LS64_ACCDATA, |
92 | FEAT_WFXT, |
93 | FEAT_SME_F64, |
94 | FEAT_SME_I64, |
95 | FEAT_SME2, |
96 | FEAT_RCPC3, |
97 | FEAT_MOPS, |
98 | FEAT_MAX, |
99 | FEAT_EXT = 62, |
100 | FEAT_INIT |
101 | }; |
102 | |
103 | static_assert(FEAT_MAX < 62, |
104 | "Number of features in CPUFeatures are limited to 62 entries" ); |
105 | |
106 | // Arch extension modifiers for CPUs. These are labelled with their Arm ARM |
107 | // feature name (though the canonical reference for those is AArch64.td) |
108 | // clang-format off |
109 | enum ArchExtKind : unsigned { |
110 | AEK_NONE = 1, |
111 | AEK_CRC = 2, // FEAT_CRC32 |
112 | AEK_CRYPTO = 3, |
113 | AEK_FP = 4, // FEAT_FP |
114 | AEK_SIMD = 5, // FEAT_AdvSIMD |
115 | AEK_FP16 = 6, // FEAT_FP16 |
116 | AEK_PROFILE = 7, // FEAT_SPE |
117 | AEK_RAS = 8, // FEAT_RAS, FEAT_RASv1p1 |
118 | AEK_LSE = 9, // FEAT_LSE |
119 | AEK_SVE = 10, // FEAT_SVE |
120 | AEK_DOTPROD = 11, // FEAT_DotProd |
121 | AEK_RCPC = 12, // FEAT_LRCPC |
122 | AEK_RDM = 13, // FEAT_RDM |
123 | AEK_SM4 = 14, // FEAT_SM4, FEAT_SM3 |
124 | AEK_SHA3 = 15, // FEAT_SHA3, FEAT_SHA512 |
125 | AEK_SHA2 = 16, // FEAT_SHA1, FEAT_SHA256 |
126 | AEK_AES = 17, // FEAT_AES, FEAT_PMULL |
127 | AEK_FP16FML = 18, // FEAT_FHM |
128 | AEK_RAND = 19, // FEAT_RNG |
129 | AEK_MTE = 20, // FEAT_MTE, FEAT_MTE2 |
130 | AEK_SSBS = 21, // FEAT_SSBS, FEAT_SSBS2 |
131 | AEK_SB = 22, // FEAT_SB |
132 | AEK_PREDRES = 23, // FEAT_SPECRES |
133 | AEK_SVE2 = 24, // FEAT_SVE2 |
134 | AEK_SVE2AES = 25, // FEAT_SVE_AES, FEAT_SVE_PMULL128 |
135 | AEK_SVE2SM4 = 26, // FEAT_SVE_SM4 |
136 | AEK_SVE2SHA3 = 27, // FEAT_SVE_SHA3 |
137 | AEK_SVE2BITPERM = 28, // FEAT_SVE_BitPerm |
138 | AEK_TME = 29, // FEAT_TME |
139 | AEK_BF16 = 30, // FEAT_BF16 |
140 | AEK_I8MM = 31, // FEAT_I8MM |
141 | AEK_F32MM = 32, // FEAT_F32MM |
142 | AEK_F64MM = 33, // FEAT_F64MM |
143 | AEK_LS64 = 34, // FEAT_LS64, FEAT_LS64_V, FEAT_LS64_ACCDATA |
144 | AEK_BRBE = 35, // FEAT_BRBE |
145 | AEK_PAUTH = 36, // FEAT_PAuth |
146 | AEK_FLAGM = 37, // FEAT_FlagM |
147 | AEK_SME = 38, // FEAT_SME |
148 | AEK_SMEF64F64 = 39, // FEAT_SME_F64F64 |
149 | AEK_SMEI16I64 = 40, // FEAT_SME_I16I64 |
150 | AEK_HBC = 41, // FEAT_HBC |
151 | AEK_MOPS = 42, // FEAT_MOPS |
152 | AEK_PERFMON = 43, // FEAT_PMUv3 |
153 | AEK_SME2 = 44, // FEAT_SME2 |
154 | AEK_SVE2p1 = 45, // FEAT_SVE2p1 |
155 | AEK_SME2p1 = 46, // FEAT_SME2p1 |
156 | AEK_B16B16 = 47, // FEAT_B16B16 |
157 | AEK_SMEF16F16 = 48, // FEAT_SMEF16F16 |
158 | AEK_CSSC = 49, // FEAT_CSSC |
159 | AEK_RCPC3 = 50, // FEAT_LRCPC3 |
160 | AEK_THE = 51, // FEAT_THE |
161 | AEK_D128 = 52, // FEAT_D128 |
162 | AEK_LSE128 = 53, // FEAT_LSE128 |
163 | AEK_SPECRES2 = 54, // FEAT_SPECRES2 |
164 | AEK_RASv2 = 55, // FEAT_RASv2 |
165 | AEK_ITE = 56, // FEAT_ITE |
166 | AEK_GCS = 57, // FEAT_GCS |
167 | AEK_FPMR = 58, // FEAT_FPMR |
168 | AEK_FP8 = 59, // FEAT_FP8 |
169 | AEK_FAMINMAX = 60, // FEAT_FAMINMAX |
170 | AEK_FP8FMA = 61, // FEAT_FP8FMA |
171 | AEK_SSVE_FP8FMA = 62, // FEAT_SSVE_FP8FMA |
172 | AEK_FP8DOT2 = 63, // FEAT_FP8DOT2 |
173 | AEK_SSVE_FP8DOT2 = 64, // FEAT_SSVE_FP8DOT2 |
174 | AEK_FP8DOT4 = 65, // FEAT_FP8DOT4 |
175 | AEK_SSVE_FP8DOT4 = 66, // FEAT_SSVE_FP8DOT4 |
176 | AEK_LUT = 67, // FEAT_LUT |
177 | AEK_SME_LUTv2 = 68, // FEAT_SME_LUTv2 |
178 | AEK_SMEF8F16 = 69, // FEAT_SME_F8F16 |
179 | AEK_SMEF8F32 = 70, // FEAT_SME_F8F32 |
180 | AEK_SMEFA64 = 71, // FEAT_SME_FA64 |
181 | AEK_CPA = 72, // FEAT_CPA |
182 | AEK_PAUTHLR = 73, // FEAT_PAuth_LR |
183 | AEK_TLBIW = 74, // FEAT_TLBIW |
184 | AEK_JSCVT = 75, // FEAT_JSCVT |
185 | AEK_FCMA = 76, // FEAT_FCMA |
186 | AEK_NUM_EXTENSIONS |
187 | }; |
188 | using ExtensionBitset = Bitset<AEK_NUM_EXTENSIONS>; |
189 | // clang-format on |
190 | |
191 | // Represents an extension that can be enabled with -march=<arch>+<extension>. |
192 | // Typically these correspond to Arm Architecture extensions, unlike |
193 | // SubtargetFeature which may represent either an actual extension or some |
194 | // internal LLVM property. |
195 | struct ExtensionInfo { |
196 | StringRef Name; // Human readable name, e.g. "profile". |
197 | ArchExtKind ID; // Corresponding to the ArchExtKind, this |
198 | // extensions representation in the bitfield. |
199 | StringRef Feature; // -mattr enable string, e.g. "+spe" |
200 | StringRef NegFeature; // -mattr disable string, e.g. "-spe" |
201 | CPUFeatures CPUFeature; // Function Multi Versioning (FMV) bitfield value |
202 | // set in __aarch64_cpu_features |
203 | StringRef DependentFeatures; // FMV enabled features string, |
204 | // e.g. "+dotprod,+fp-armv8,+neon" |
205 | unsigned FmvPriority; // FMV feature priority |
206 | static constexpr unsigned MaxFMVPriority = |
207 | 1000; // Maximum priority for FMV feature |
208 | }; |
209 | |
210 | // NOTE: If adding a new extension here, consider adding it to ExtensionMap |
211 | // in AArch64AsmParser too, if supported as an extension name by binutils. |
212 | // clang-format off |
213 | inline constexpr ExtensionInfo Extensions[] = { |
214 | {.Name: "aes" , .ID: AArch64::AEK_AES, .Feature: "+aes" , .NegFeature: "-aes" , .CPUFeature: FEAT_AES, .DependentFeatures: "+fp-armv8,+neon" , .FmvPriority: 150}, |
215 | {.Name: "b16b16" , .ID: AArch64::AEK_B16B16, .Feature: "+b16b16" , .NegFeature: "-b16b16" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
216 | {.Name: "bf16" , .ID: AArch64::AEK_BF16, .Feature: "+bf16" , .NegFeature: "-bf16" , .CPUFeature: FEAT_BF16, .DependentFeatures: "+bf16" , .FmvPriority: 280}, |
217 | {.Name: "brbe" , .ID: AArch64::AEK_BRBE, .Feature: "+brbe" , .NegFeature: "-brbe" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
218 | {.Name: "bti" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_BTI, .DependentFeatures: "+bti" , .FmvPriority: 510}, |
219 | {.Name: "crc" , .ID: AArch64::AEK_CRC, .Feature: "+crc" , .NegFeature: "-crc" , .CPUFeature: FEAT_CRC, .DependentFeatures: "+crc" , .FmvPriority: 110}, |
220 | {.Name: "crypto" , .ID: AArch64::AEK_CRYPTO, .Feature: "+crypto" , .NegFeature: "-crypto" , .CPUFeature: FEAT_INIT, .DependentFeatures: "+aes,+sha2" , .FmvPriority: 0}, |
221 | {.Name: "cssc" , .ID: AArch64::AEK_CSSC, .Feature: "+cssc" , .NegFeature: "-cssc" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
222 | {.Name: "d128" , .ID: AArch64::AEK_D128, .Feature: "+d128" , .NegFeature: "-d128" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
223 | {.Name: "dgh" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_DGH, .DependentFeatures: "" , .FmvPriority: 260}, |
224 | {.Name: "dit" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_DIT, .DependentFeatures: "+dit" , .FmvPriority: 180}, |
225 | {.Name: "dotprod" , .ID: AArch64::AEK_DOTPROD, .Feature: "+dotprod" , .NegFeature: "-dotprod" , .CPUFeature: FEAT_DOTPROD, .DependentFeatures: "+dotprod,+fp-armv8,+neon" , .FmvPriority: 104}, |
226 | {.Name: "dpb" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_DPB, .DependentFeatures: "+ccpp" , .FmvPriority: 190}, |
227 | {.Name: "dpb2" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_DPB2, .DependentFeatures: "+ccpp,+ccdp" , .FmvPriority: 200}, |
228 | {.Name: "ebf16" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_EBF16, .DependentFeatures: "+bf16" , .FmvPriority: 290}, |
229 | {.Name: "f32mm" , .ID: AArch64::AEK_F32MM, .Feature: "+f32mm" , .NegFeature: "-f32mm" , .CPUFeature: FEAT_SVE_F32MM, .DependentFeatures: "+sve,+f32mm,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 350}, |
230 | {.Name: "f64mm" , .ID: AArch64::AEK_F64MM, .Feature: "+f64mm" , .NegFeature: "-f64mm" , .CPUFeature: FEAT_SVE_F64MM, .DependentFeatures: "+sve,+f64mm,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 360}, |
231 | {.Name: "fcma" , .ID: AArch64::AEK_FCMA, .Feature: "+complxnum" , .NegFeature: "-complxnum" , .CPUFeature: FEAT_FCMA, .DependentFeatures: "+fp-armv8,+neon,+complxnum" , .FmvPriority: 220}, |
232 | {.Name: "flagm" , .ID: AArch64::AEK_FLAGM, .Feature: "+flagm" , .NegFeature: "-flagm" , .CPUFeature: FEAT_FLAGM, .DependentFeatures: "+flagm" , .FmvPriority: 20}, |
233 | {.Name: "flagm2" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_FLAGM2, .DependentFeatures: "+flagm,+altnzcv" , .FmvPriority: 30}, |
234 | {.Name: "fp" , .ID: AArch64::AEK_FP, .Feature: "+fp-armv8" , .NegFeature: "-fp-armv8" , .CPUFeature: FEAT_FP, .DependentFeatures: "+fp-armv8,+neon" , .FmvPriority: 90}, |
235 | {.Name: "fp16" , .ID: AArch64::AEK_FP16, .Feature: "+fullfp16" , .NegFeature: "-fullfp16" , .CPUFeature: FEAT_FP16, .DependentFeatures: "+fullfp16,+fp-armv8,+neon" , .FmvPriority: 170}, |
236 | {.Name: "fp16fml" , .ID: AArch64::AEK_FP16FML, .Feature: "+fp16fml" , .NegFeature: "-fp16fml" , .CPUFeature: FEAT_FP16FML, .DependentFeatures: "+fp16fml,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 175}, |
237 | {.Name: "frintts" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_FRINTTS, .DependentFeatures: "+fptoint" , .FmvPriority: 250}, |
238 | {.Name: "hbc" , .ID: AArch64::AEK_HBC, .Feature: "+hbc" , .NegFeature: "-hbc" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
239 | {.Name: "i8mm" , .ID: AArch64::AEK_I8MM, .Feature: "+i8mm" , .NegFeature: "-i8mm" , .CPUFeature: FEAT_I8MM, .DependentFeatures: "+i8mm" , .FmvPriority: 270}, |
240 | {.Name: "ite" , .ID: AArch64::AEK_ITE, .Feature: "+ite" , .NegFeature: "-ite" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
241 | {.Name: "jscvt" , .ID: AArch64::AEK_JSCVT, .Feature: "+jsconv" , .NegFeature: "-jsconv" , .CPUFeature: FEAT_JSCVT, .DependentFeatures: "+fp-armv8,+neon,+jsconv" , .FmvPriority: 210}, |
242 | {.Name: "ls64_accdata" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_LS64_ACCDATA, .DependentFeatures: "+ls64" , .FmvPriority: 540}, |
243 | {.Name: "ls64_v" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_LS64_V, .DependentFeatures: "" , .FmvPriority: 530}, |
244 | {.Name: "ls64" , .ID: AArch64::AEK_LS64, .Feature: "+ls64" , .NegFeature: "-ls64" , .CPUFeature: FEAT_LS64, .DependentFeatures: "" , .FmvPriority: 520}, |
245 | {.Name: "lse" , .ID: AArch64::AEK_LSE, .Feature: "+lse" , .NegFeature: "-lse" , .CPUFeature: FEAT_LSE, .DependentFeatures: "+lse" , .FmvPriority: 80}, |
246 | {.Name: "lse128" , .ID: AArch64::AEK_LSE128, .Feature: "+lse128" , .NegFeature: "-lse128" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
247 | {.Name: "memtag" , .ID: AArch64::AEK_MTE, .Feature: "+mte" , .NegFeature: "-mte" , .CPUFeature: FEAT_MEMTAG, .DependentFeatures: "" , .FmvPriority: 440}, |
248 | {.Name: "memtag2" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_MEMTAG2, .DependentFeatures: "+mte" , .FmvPriority: 450}, |
249 | {.Name: "memtag3" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_MEMTAG3, .DependentFeatures: "+mte" , .FmvPriority: 460}, |
250 | {.Name: "mops" , .ID: AArch64::AEK_MOPS, .Feature: "+mops" , .NegFeature: "-mops" , .CPUFeature: FEAT_MOPS, .DependentFeatures: "+mops" , .FmvPriority: 650}, |
251 | {.Name: "pauth" , .ID: AArch64::AEK_PAUTH, .Feature: "+pauth" , .NegFeature: "-pauth" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
252 | {.Name: "pmull" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_PMULL, .DependentFeatures: "+aes,+fp-armv8,+neon" , .FmvPriority: 160}, |
253 | {.Name: "pmuv3" , .ID: AArch64::AEK_PERFMON, .Feature: "+perfmon" , .NegFeature: "-perfmon" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
254 | {.Name: "predres" , .ID: AArch64::AEK_PREDRES, .Feature: "+predres" , .NegFeature: "-predres" , .CPUFeature: FEAT_PREDRES, .DependentFeatures: "+predres" , .FmvPriority: 480}, |
255 | {.Name: "predres2" , .ID: AArch64::AEK_SPECRES2, .Feature: "+specres2" , .NegFeature: "-specres2" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
256 | {.Name: "profile" , .ID: AArch64::AEK_PROFILE, .Feature: "+spe" , .NegFeature: "-spe" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
257 | {.Name: "ras" , .ID: AArch64::AEK_RAS, .Feature: "+ras" , .NegFeature: "-ras" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
258 | {.Name: "rasv2" , .ID: AArch64::AEK_RASv2, .Feature: "+rasv2" , .NegFeature: "-rasv2" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
259 | {.Name: "rcpc" , .ID: AArch64::AEK_RCPC, .Feature: "+rcpc" , .NegFeature: "-rcpc" , .CPUFeature: FEAT_RCPC, .DependentFeatures: "+rcpc" , .FmvPriority: 230}, |
260 | {.Name: "rcpc2" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_RCPC2, .DependentFeatures: "+rcpc" , .FmvPriority: 240}, |
261 | {.Name: "rcpc3" , .ID: AArch64::AEK_RCPC3, .Feature: "+rcpc3" , .NegFeature: "-rcpc3" , .CPUFeature: FEAT_RCPC3, .DependentFeatures: "+rcpc,+rcpc3" , .FmvPriority: 241}, |
262 | {.Name: "rdm" , .ID: AArch64::AEK_RDM, .Feature: "+rdm" , .NegFeature: "-rdm" , .CPUFeature: FEAT_RDM, .DependentFeatures: "+rdm,+fp-armv8,+neon" , .FmvPriority: 108}, |
263 | {.Name: "rng" , .ID: AArch64::AEK_RAND, .Feature: "+rand" , .NegFeature: "-rand" , .CPUFeature: FEAT_RNG, .DependentFeatures: "+rand" , .FmvPriority: 10}, |
264 | {.Name: "rpres" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_RPRES, .DependentFeatures: "" , .FmvPriority: 300}, |
265 | {.Name: "sb" , .ID: AArch64::AEK_SB, .Feature: "+sb" , .NegFeature: "-sb" , .CPUFeature: FEAT_SB, .DependentFeatures: "+sb" , .FmvPriority: 470}, |
266 | {.Name: "sha1" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_SHA1, .DependentFeatures: "+fp-armv8,+neon" , .FmvPriority: 120}, |
267 | {.Name: "sha2" , .ID: AArch64::AEK_SHA2, .Feature: "+sha2" , .NegFeature: "-sha2" , .CPUFeature: FEAT_SHA2, .DependentFeatures: "+sha2,+fp-armv8,+neon" , .FmvPriority: 130}, |
268 | {.Name: "sha3" , .ID: AArch64::AEK_SHA3, .Feature: "+sha3" , .NegFeature: "-sha3" , .CPUFeature: FEAT_SHA3, .DependentFeatures: "+sha3,+sha2,+fp-armv8,+neon" , .FmvPriority: 140}, |
269 | {.Name: "simd" , .ID: AArch64::AEK_SIMD, .Feature: "+neon" , .NegFeature: "-neon" , .CPUFeature: FEAT_SIMD, .DependentFeatures: "+fp-armv8,+neon" , .FmvPriority: 100}, |
270 | {.Name: "sm4" , .ID: AArch64::AEK_SM4, .Feature: "+sm4" , .NegFeature: "-sm4" , .CPUFeature: FEAT_SM4, .DependentFeatures: "+sm4,+fp-armv8,+neon" , .FmvPriority: 106}, |
271 | {.Name: "sme-f16f16" , .ID: AArch64::AEK_SMEF16F16, .Feature: "+sme-f16f16" , .NegFeature: "-sme-f16f16" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
272 | {.Name: "sme-f64f64" , .ID: AArch64::AEK_SMEF64F64, .Feature: "+sme-f64f64" , .NegFeature: "-sme-f64f64" , .CPUFeature: FEAT_SME_F64, .DependentFeatures: "+sme,+sme-f64f64,+bf16" , .FmvPriority: 560}, |
273 | {.Name: "sme-i16i64" , .ID: AArch64::AEK_SMEI16I64, .Feature: "+sme-i16i64" , .NegFeature: "-sme-i16i64" , .CPUFeature: FEAT_SME_I64, .DependentFeatures: "+sme,+sme-i16i64,+bf16" , .FmvPriority: 570}, |
274 | {.Name: "sme" , .ID: AArch64::AEK_SME, .Feature: "+sme" , .NegFeature: "-sme" , .CPUFeature: FEAT_SME, .DependentFeatures: "+sme,+bf16" , .FmvPriority: 430}, |
275 | {.Name: "sme2" , .ID: AArch64::AEK_SME2, .Feature: "+sme2" , .NegFeature: "-sme2" , .CPUFeature: FEAT_SME2, .DependentFeatures: "+sme2,+sme,+bf16" , .FmvPriority: 580}, |
276 | {.Name: "sme2p1" , .ID: AArch64::AEK_SME2p1, .Feature: "+sme2p1" , .NegFeature: "-sme2p1" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
277 | {.Name: "ssbs" , .ID: AArch64::AEK_SSBS, .Feature: "+ssbs" , .NegFeature: "-ssbs" , .CPUFeature: FEAT_SSBS, .DependentFeatures: "" , .FmvPriority: 490}, |
278 | {.Name: "ssbs2" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_SSBS2, .DependentFeatures: "+ssbs" , .FmvPriority: 500}, |
279 | {.Name: "sve-bf16" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_SVE_BF16, .DependentFeatures: "+sve,+bf16,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 320}, |
280 | {.Name: "sve-ebf16" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_SVE_EBF16, .DependentFeatures: "+sve,+bf16,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 330}, |
281 | {.Name: "sve-i8mm" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_SVE_I8MM, .DependentFeatures: "+sve,+i8mm,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 340}, |
282 | {.Name: "sve" , .ID: AArch64::AEK_SVE, .Feature: "+sve" , .NegFeature: "-sve" , .CPUFeature: FEAT_SVE, .DependentFeatures: "+sve,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 310}, |
283 | {.Name: "sve2-aes" , .ID: AArch64::AEK_SVE2AES, .Feature: "+sve2-aes" , .NegFeature: "-sve2-aes" , .CPUFeature: FEAT_SVE_AES, .DependentFeatures: "+sve2,+sve,+sve2-aes,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 380}, |
284 | {.Name: "sve2-bitperm" , .ID: AArch64::AEK_SVE2BITPERM, .Feature: "+sve2-bitperm" , .NegFeature: "-sve2-bitperm" , .CPUFeature: FEAT_SVE_BITPERM, .DependentFeatures: "+sve2,+sve,+sve2-bitperm,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 400}, |
285 | {.Name: "sve2-pmull128" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_SVE_PMULL128, .DependentFeatures: "+sve2,+sve,+sve2-aes,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 390}, |
286 | {.Name: "sve2-sha3" , .ID: AArch64::AEK_SVE2SHA3, .Feature: "+sve2-sha3" , .NegFeature: "-sve2-sha3" , .CPUFeature: FEAT_SVE_SHA3, .DependentFeatures: "+sve2,+sve,+sve2-sha3,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 410}, |
287 | {.Name: "sve2-sm4" , .ID: AArch64::AEK_SVE2SM4, .Feature: "+sve2-sm4" , .NegFeature: "-sve2-sm4" , .CPUFeature: FEAT_SVE_SM4, .DependentFeatures: "+sve2,+sve,+sve2-sm4,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 420}, |
288 | {.Name: "sve2" , .ID: AArch64::AEK_SVE2, .Feature: "+sve2" , .NegFeature: "-sve2" , .CPUFeature: FEAT_SVE2, .DependentFeatures: "+sve2,+sve,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 370}, |
289 | {.Name: "sve2p1" , .ID: AArch64::AEK_SVE2p1, .Feature: "+sve2p1" , .NegFeature: "-sve2p1" , .CPUFeature: FEAT_INIT, .DependentFeatures: "+sve2p1,+sve2,+sve,+fullfp16,+fp-armv8,+neon" , .FmvPriority: 0}, |
290 | {.Name: "the" , .ID: AArch64::AEK_THE, .Feature: "+the" , .NegFeature: "-the" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
291 | {.Name: "tme" , .ID: AArch64::AEK_TME, .Feature: "+tme" , .NegFeature: "-tme" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
292 | {.Name: "wfxt" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_WFXT, .DependentFeatures: "+wfxt" , .FmvPriority: 550}, |
293 | {.Name: "gcs" , .ID: AArch64::AEK_GCS, .Feature: "+gcs" , .NegFeature: "-gcs" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
294 | {.Name: "fpmr" , .ID: AArch64::AEK_FPMR, .Feature: "+fpmr" , .NegFeature: "-fpmr" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
295 | {.Name: "fp8" , .ID: AArch64::AEK_FP8, .Feature: "+fp8" , .NegFeature: "-fp8" , .CPUFeature: FEAT_INIT, .DependentFeatures: "+fpmr" , .FmvPriority: 0}, |
296 | {.Name: "faminmax" , .ID: AArch64::AEK_FAMINMAX, .Feature: "+faminmax" , .NegFeature: "-faminmax" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
297 | {.Name: "fp8fma" , .ID: AArch64::AEK_FP8FMA, .Feature: "+fp8fma" , .NegFeature: "-fp8fma" , .CPUFeature: FEAT_INIT, .DependentFeatures: "+fpmr" , .FmvPriority: 0}, |
298 | {.Name: "ssve-fp8fma" , .ID: AArch64::AEK_SSVE_FP8FMA, .Feature: "+ssve-fp8fma" , .NegFeature: "-ssve-fp8fma" , .CPUFeature: FEAT_INIT, .DependentFeatures: "+sme2" , .FmvPriority: 0}, |
299 | {.Name: "fp8dot2" , .ID: AArch64::AEK_FP8DOT2, .Feature: "+fp8dot2" , .NegFeature: "-fp8dot2" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
300 | {.Name: "ssve-fp8dot2" , .ID: AArch64::AEK_SSVE_FP8DOT2, .Feature: "+ssve-fp8dot2" , .NegFeature: "-ssve-fp8dot2" , .CPUFeature: FEAT_INIT, .DependentFeatures: "+sme2" , .FmvPriority: 0}, |
301 | {.Name: "fp8dot4" , .ID: AArch64::AEK_FP8DOT4, .Feature: "+fp8dot4" , .NegFeature: "-fp8dot4" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
302 | {.Name: "ssve-fp8dot4" , .ID: AArch64::AEK_SSVE_FP8DOT4, .Feature: "+ssve-fp8dot4" , .NegFeature: "-ssve-fp8dot4" , .CPUFeature: FEAT_INIT, .DependentFeatures: "+sme2" , .FmvPriority: 0}, |
303 | {.Name: "lut" , .ID: AArch64::AEK_LUT, .Feature: "+lut" , .NegFeature: "-lut" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
304 | {.Name: "sme-lutv2" , .ID: AArch64::AEK_SME_LUTv2, .Feature: "+sme-lutv2" , .NegFeature: "-sme-lutv2" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
305 | {.Name: "sme-f8f16" , .ID: AArch64::AEK_SMEF8F16, .Feature: "+sme-f8f16" , .NegFeature: "-sme-f8f16" , .CPUFeature: FEAT_INIT, .DependentFeatures: "+sme2,+fp8" , .FmvPriority: 0}, |
306 | {.Name: "sme-f8f32" , .ID: AArch64::AEK_SMEF8F32, .Feature: "+sme-f8f32" , .NegFeature: "-sme-f8f32" , .CPUFeature: FEAT_INIT, .DependentFeatures: "+sme2,+fp8" , .FmvPriority: 0}, |
307 | {.Name: "sme-fa64" , .ID: AArch64::AEK_SMEFA64, .Feature: "+sme-fa64" , .NegFeature: "-sme-fa64" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
308 | {.Name: "cpa" , .ID: AArch64::AEK_CPA, .Feature: "+cpa" , .NegFeature: "-cpa" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
309 | {.Name: "pauth-lr" , .ID: AArch64::AEK_PAUTHLR, .Feature: "+pauth-lr" , .NegFeature: "-pauth-lr" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
310 | {.Name: "tlbiw" , .ID: AArch64::AEK_TLBIW, .Feature: "+tlbiw" , .NegFeature: "-tlbiw" , .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: 0}, |
311 | // Special cases |
312 | {.Name: "none" , .ID: AArch64::AEK_NONE, .Feature: {}, .NegFeature: {}, .CPUFeature: FEAT_INIT, .DependentFeatures: "" , .FmvPriority: ExtensionInfo::MaxFMVPriority}, |
313 | }; |
314 | // clang-format on |
315 | |
316 | struct ExtensionSet { |
317 | // Set of extensions which are currently enabled. |
318 | ExtensionBitset Enabled; |
319 | // Set of extensions which have been enabled or disabled at any point. Used |
320 | // to avoid cluttering the cc1 command-line with lots of unneeded features. |
321 | ExtensionBitset Touched; |
322 | // Base architecture version, which we need to know because some feature |
323 | // dependencies change depending on this. |
324 | const ArchInfo *BaseArch; |
325 | |
326 | ExtensionSet() : Enabled(), Touched(), BaseArch(nullptr) {} |
327 | |
328 | // Enable the given architecture extension, and any other extensions it |
329 | // depends on. Does not change the base architecture, or follow dependencies |
330 | // between features which are only related by required arcitecture versions. |
331 | void enable(ArchExtKind E); |
332 | |
333 | // Disable the given architecture extension, and any other extensions which |
334 | // depend on it. Does not change the base architecture, or follow |
335 | // dependencies between features which are only related by required |
336 | // arcitecture versions. |
337 | void disable(ArchExtKind E); |
338 | |
339 | // Add default extensions for the given CPU. Records the base architecture, |
340 | // to later resolve dependencies which depend on it. |
341 | void addCPUDefaults(const CpuInfo &CPU); |
342 | |
343 | // Add default extensions for the given architecture version. Records the |
344 | // base architecture, to later resolve dependencies which depend on it. |
345 | void addArchDefaults(const ArchInfo &Arch); |
346 | |
347 | // Add or remove a feature based on a modifier string. The string must be of |
348 | // the form "<name>" to enable a feature or "no<name>" to disable it. This |
349 | // will also enable or disable any features as required by the dependencies |
350 | // between them. |
351 | bool parseModifier(StringRef Modifier); |
352 | |
353 | // Convert the set of enabled extension to an LLVM feature list, appending |
354 | // them to Features. |
355 | void toLLVMFeatureList(std::vector<StringRef> &Features) const; |
356 | }; |
357 | |
358 | // Represents a dependency between two architecture extensions. Later is the |
359 | // feature which was added to the architecture after Earlier, and expands the |
360 | // functionality provided by it. If Later is enabled, then Earlier will also be |
361 | // enabled. If Earlier is disabled, then Later will also be disabled. |
362 | struct ExtensionDependency { |
363 | ArchExtKind Earlier; |
364 | ArchExtKind Later; |
365 | }; |
366 | |
367 | // clang-format off |
368 | // Each entry here is a link in the dependency chain starting from the |
369 | // extension that was added to the architecture first. |
370 | inline constexpr ExtensionDependency ExtensionDependencies[] = { |
371 | {.Earlier: AEK_FP, .Later: AEK_FP16}, |
372 | {.Earlier: AEK_FP, .Later: AEK_SIMD}, |
373 | {.Earlier: AEK_FP, .Later: AEK_JSCVT}, |
374 | {.Earlier: AEK_FP, .Later: AEK_FP8}, |
375 | {.Earlier: AEK_SIMD, .Later: AEK_CRYPTO}, |
376 | {.Earlier: AEK_SIMD, .Later: AEK_AES}, |
377 | {.Earlier: AEK_SIMD, .Later: AEK_SHA2}, |
378 | {.Earlier: AEK_SIMD, .Later: AEK_SHA3}, |
379 | {.Earlier: AEK_SIMD, .Later: AEK_SM4}, |
380 | {.Earlier: AEK_SIMD, .Later: AEK_RDM}, |
381 | {.Earlier: AEK_SIMD, .Later: AEK_DOTPROD}, |
382 | {.Earlier: AEK_SIMD, .Later: AEK_FCMA}, |
383 | {.Earlier: AEK_FP16, .Later: AEK_FP16FML}, |
384 | {.Earlier: AEK_FP16, .Later: AEK_SVE}, |
385 | {.Earlier: AEK_BF16, .Later: AEK_SME}, |
386 | {.Earlier: AEK_BF16, .Later: AEK_B16B16}, |
387 | {.Earlier: AEK_SVE, .Later: AEK_SVE2}, |
388 | {.Earlier: AEK_SVE, .Later: AEK_F32MM}, |
389 | {.Earlier: AEK_SVE, .Later: AEK_F64MM}, |
390 | {.Earlier: AEK_SVE2, .Later: AEK_SVE2p1}, |
391 | {.Earlier: AEK_SVE2, .Later: AEK_SVE2BITPERM}, |
392 | {.Earlier: AEK_SVE2, .Later: AEK_SVE2AES}, |
393 | {.Earlier: AEK_SVE2, .Later: AEK_SVE2SHA3}, |
394 | {.Earlier: AEK_SVE2, .Later: AEK_SVE2SM4}, |
395 | {.Earlier: AEK_SVE2, .Later: AEK_SMEFA64}, |
396 | {.Earlier: AEK_SVE2, .Later: AEK_SMEFA64}, |
397 | {.Earlier: AEK_SME, .Later: AEK_SME2}, |
398 | {.Earlier: AEK_SME, .Later: AEK_SMEF16F16}, |
399 | {.Earlier: AEK_SME, .Later: AEK_SMEF64F64}, |
400 | {.Earlier: AEK_SME, .Later: AEK_SMEI16I64}, |
401 | {.Earlier: AEK_SME, .Later: AEK_SMEFA64}, |
402 | {.Earlier: AEK_SME2, .Later: AEK_SME2p1}, |
403 | {.Earlier: AEK_SME2, .Later: AEK_SSVE_FP8FMA}, |
404 | {.Earlier: AEK_SME2, .Later: AEK_SSVE_FP8DOT2}, |
405 | {.Earlier: AEK_SME2, .Later: AEK_SSVE_FP8DOT4}, |
406 | {.Earlier: AEK_SME2, .Later: AEK_SMEF8F16}, |
407 | {.Earlier: AEK_SME2, .Later: AEK_SMEF8F32}, |
408 | {.Earlier: AEK_FP8, .Later: AEK_SMEF8F16}, |
409 | {.Earlier: AEK_FP8, .Later: AEK_SMEF8F32}, |
410 | {.Earlier: AEK_LSE, .Later: AEK_LSE128}, |
411 | {.Earlier: AEK_PREDRES, .Later: AEK_SPECRES2}, |
412 | {.Earlier: AEK_RAS, .Later: AEK_RASv2}, |
413 | {.Earlier: AEK_RCPC, .Later: AEK_RCPC3}, |
414 | }; |
415 | // clang-format on |
416 | |
417 | enum ArchProfile { AProfile = 'A', RProfile = 'R', InvalidProfile = '?' }; |
418 | |
419 | // Information about a specific architecture, e.g. V8.1-A |
420 | struct ArchInfo { |
421 | VersionTuple Version; // Architecture version, major + minor. |
422 | ArchProfile Profile; // Architecuture profile |
423 | StringRef Name; // Human readable name, e.g. "armv8.1-a" |
424 | StringRef ArchFeature; // Command line feature flag, e.g. +v8a |
425 | AArch64::ExtensionBitset |
426 | DefaultExts; // bitfield of default extensions ArchExtKind |
427 | |
428 | bool operator==(const ArchInfo &Other) const { |
429 | return this->Name == Other.Name; |
430 | } |
431 | bool operator!=(const ArchInfo &Other) const { |
432 | return this->Name != Other.Name; |
433 | } |
434 | |
435 | // Defines the following partial order, indicating when an architecture is |
436 | // a superset of another: |
437 | // |
438 | // v9.5a > v9.4a > v9.3a > v9.2a > v9.1a > v9a; |
439 | // v v v v v |
440 | // v8.9a > v8.8a > v8.7a > v8.6a > v8.5a > v8.4a > ... > v8a; |
441 | // |
442 | // v8r has no relation to anything. This is used to determine which |
443 | // features to enable for a given architecture. See |
444 | // AArch64TargetInfo::setFeatureEnabled. |
445 | bool implies(const ArchInfo &Other) const { |
446 | if (this->Profile != Other.Profile) |
447 | return false; // ARMV8R |
448 | if (this->Version.getMajor() == Other.Version.getMajor()) { |
449 | return this->Version > Other.Version; |
450 | } |
451 | if (this->Version.getMajor() == 9 && Other.Version.getMajor() == 8) { |
452 | assert(this->Version.getMinor() && Other.Version.getMinor() && |
453 | "AArch64::ArchInfo should have a minor version." ); |
454 | return this->Version.getMinor().value_or(u: 0) + 5 >= |
455 | Other.Version.getMinor().value_or(u: 0); |
456 | } |
457 | return false; |
458 | } |
459 | |
460 | // True if this architecture is a superset of Other (including being equal to |
461 | // it). |
462 | bool is_superset(const ArchInfo &Other) const { |
463 | return (*this == Other) || implies(Other); |
464 | } |
465 | |
466 | // Return ArchFeature without the leading "+". |
467 | StringRef getSubArch() const { return ArchFeature.substr(Start: 1); } |
468 | |
469 | // Search for ArchInfo by SubArch name |
470 | static std::optional<ArchInfo> findBySubArch(StringRef SubArch); |
471 | }; |
472 | |
473 | // clang-format off |
474 | inline constexpr ArchInfo ARMV8A = { .Version: VersionTuple{8, 0}, .Profile: AProfile, .Name: "armv8-a" , .ArchFeature: "+v8a" , .DefaultExts: ( |
475 | AArch64::ExtensionBitset({AArch64::AEK_FP, AArch64::AEK_SIMD})), }; |
476 | inline constexpr ArchInfo ARMV8_1A = { .Version: VersionTuple{8, 1}, .Profile: AProfile, .Name: "armv8.1-a" , .ArchFeature: "+v8.1a" , .DefaultExts: (ARMV8A.DefaultExts | |
477 | AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_LSE, AArch64::AEK_RDM}))}; |
478 | inline constexpr ArchInfo ARMV8_2A = { .Version: VersionTuple{8, 2}, .Profile: AProfile, .Name: "armv8.2-a" , .ArchFeature: "+v8.2a" , .DefaultExts: (ARMV8_1A.DefaultExts | |
479 | AArch64::ExtensionBitset({AArch64::AEK_RAS}))}; |
480 | inline constexpr ArchInfo ARMV8_3A = { .Version: VersionTuple{8, 3}, .Profile: AProfile, .Name: "armv8.3-a" , .ArchFeature: "+v8.3a" , .DefaultExts: (ARMV8_2A.DefaultExts | |
481 | AArch64::ExtensionBitset({AArch64::AEK_FCMA, AArch64::AEK_JSCVT, AArch64::AEK_PAUTH, AArch64::AEK_RCPC}))}; |
482 | inline constexpr ArchInfo ARMV8_4A = { .Version: VersionTuple{8, 4}, .Profile: AProfile, .Name: "armv8.4-a" , .ArchFeature: "+v8.4a" , .DefaultExts: (ARMV8_3A.DefaultExts | |
483 | AArch64::ExtensionBitset({AArch64::AEK_DOTPROD}))}; |
484 | inline constexpr ArchInfo ARMV8_5A = { .Version: VersionTuple{8, 5}, .Profile: AProfile, .Name: "armv8.5-a" , .ArchFeature: "+v8.5a" , .DefaultExts: (ARMV8_4A.DefaultExts)}; |
485 | inline constexpr ArchInfo ARMV8_6A = { .Version: VersionTuple{8, 6}, .Profile: AProfile, .Name: "armv8.6-a" , .ArchFeature: "+v8.6a" , .DefaultExts: (ARMV8_5A.DefaultExts | |
486 | AArch64::ExtensionBitset({AArch64::AEK_BF16, AArch64::AEK_I8MM}))}; |
487 | inline constexpr ArchInfo ARMV8_7A = { .Version: VersionTuple{8, 7}, .Profile: AProfile, .Name: "armv8.7-a" , .ArchFeature: "+v8.7a" , .DefaultExts: (ARMV8_6A.DefaultExts)}; |
488 | inline constexpr ArchInfo ARMV8_8A = { .Version: VersionTuple{8, 8}, .Profile: AProfile, .Name: "armv8.8-a" , .ArchFeature: "+v8.8a" , .DefaultExts: (ARMV8_7A.DefaultExts | |
489 | AArch64::ExtensionBitset({AArch64::AEK_MOPS, AArch64::AEK_HBC}))}; |
490 | inline constexpr ArchInfo ARMV8_9A = { .Version: VersionTuple{8, 9}, .Profile: AProfile, .Name: "armv8.9-a" , .ArchFeature: "+v8.9a" , .DefaultExts: (ARMV8_8A.DefaultExts | |
491 | AArch64::ExtensionBitset({AArch64::AEK_SPECRES2, AArch64::AEK_CSSC, AArch64::AEK_RASv2}))}; |
492 | inline constexpr ArchInfo ARMV9A = { .Version: VersionTuple{9, 0}, .Profile: AProfile, .Name: "armv9-a" , .ArchFeature: "+v9a" , .DefaultExts: (ARMV8_5A.DefaultExts | |
493 | AArch64::ExtensionBitset({AArch64::AEK_FP16, AArch64::AEK_SVE, AArch64::AEK_SVE2}))}; |
494 | inline constexpr ArchInfo ARMV9_1A = { .Version: VersionTuple{9, 1}, .Profile: AProfile, .Name: "armv9.1-a" , .ArchFeature: "+v9.1a" , .DefaultExts: (ARMV9A.DefaultExts | |
495 | AArch64::ExtensionBitset({AArch64::AEK_BF16, AArch64::AEK_I8MM}))}; |
496 | inline constexpr ArchInfo ARMV9_2A = { .Version: VersionTuple{9, 2}, .Profile: AProfile, .Name: "armv9.2-a" , .ArchFeature: "+v9.2a" , .DefaultExts: (ARMV9_1A.DefaultExts)}; |
497 | inline constexpr ArchInfo ARMV9_3A = { .Version: VersionTuple{9, 3}, .Profile: AProfile, .Name: "armv9.3-a" , .ArchFeature: "+v9.3a" , .DefaultExts: (ARMV9_2A.DefaultExts | |
498 | AArch64::ExtensionBitset({AArch64::AEK_MOPS, AArch64::AEK_HBC}))}; |
499 | inline constexpr ArchInfo ARMV9_4A = { .Version: VersionTuple{9, 4}, .Profile: AProfile, .Name: "armv9.4-a" , .ArchFeature: "+v9.4a" , .DefaultExts: (ARMV9_3A.DefaultExts | |
500 | AArch64::ExtensionBitset({AArch64::AEK_SPECRES2, AArch64::AEK_CSSC, AArch64::AEK_RASv2}))}; |
501 | inline constexpr ArchInfo ARMV9_5A = { .Version: VersionTuple{9, 5}, .Profile: AProfile, .Name: "armv9.5-a" , .ArchFeature: "+v9.5a" , .DefaultExts: (ARMV9_4A.DefaultExts | |
502 | AArch64::ExtensionBitset({AArch64::AEK_CPA}))}; |
503 | // For v8-R, we do not enable crypto and align with GCC that enables a more minimal set of optional architecture extensions. |
504 | inline constexpr ArchInfo ARMV8R = { .Version: VersionTuple{8, 0}, .Profile: RProfile, .Name: "armv8-r" , .ArchFeature: "+v8r" , .DefaultExts: (ARMV8_5A.DefaultExts | |
505 | AArch64::ExtensionBitset({AArch64::AEK_SSBS, |
506 | AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_SB}).flip(I: AArch64::AEK_LSE))}; |
507 | // clang-format on |
508 | |
509 | // The set of all architectures |
510 | static constexpr std::array<const ArchInfo *, 17> ArchInfos = { |
511 | &ARMV8A, &ARMV8_1A, &ARMV8_2A, &ARMV8_3A, &ARMV8_4A, &ARMV8_5A, |
512 | &ARMV8_6A, &ARMV8_7A, &ARMV8_8A, &ARMV8_9A, &ARMV9A, &ARMV9_1A, |
513 | &ARMV9_2A, &ARMV9_3A, &ARMV9_4A, &ARMV9_5A, &ARMV8R, |
514 | }; |
515 | |
516 | // Details of a specific CPU. |
517 | struct CpuInfo { |
518 | StringRef Name; // Name, as written for -mcpu. |
519 | const ArchInfo &Arch; |
520 | AArch64::ExtensionBitset |
521 | DefaultExtensions; // Default extensions for this CPU. These will be |
522 | // ORd with the architecture defaults. |
523 | |
524 | AArch64::ExtensionBitset getImpliedExtensions() const { |
525 | AArch64::ExtensionBitset ImpliedExts; |
526 | ImpliedExts |= DefaultExtensions; |
527 | ImpliedExts |= Arch.DefaultExts; |
528 | return ImpliedExts; |
529 | } |
530 | }; |
531 | |
532 | inline constexpr CpuInfo CpuInfos[] = { |
533 | {.Name: "cortex-a34" , .Arch: ARMV8A, |
534 | .DefaultExtensions: (AArch64::ExtensionBitset( |
535 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
536 | {.Name: "cortex-a35" , .Arch: ARMV8A, |
537 | .DefaultExtensions: (AArch64::ExtensionBitset( |
538 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
539 | {.Name: "cortex-a53" , .Arch: ARMV8A, |
540 | .DefaultExtensions: (AArch64::ExtensionBitset( |
541 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
542 | {.Name: "cortex-a55" , .Arch: ARMV8_2A, |
543 | .DefaultExtensions: (AArch64::ExtensionBitset( |
544 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16, |
545 | AArch64::AEK_DOTPROD, AArch64::AEK_RCPC}))}, |
546 | {.Name: "cortex-a510" , .Arch: ARMV9A, |
547 | .DefaultExtensions: (AArch64::ExtensionBitset( |
548 | {AArch64::AEK_BF16, AArch64::AEK_I8MM, AArch64::AEK_SB, |
549 | AArch64::AEK_PAUTH, AArch64::AEK_MTE, AArch64::AEK_SSBS, |
550 | AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM, |
551 | AArch64::AEK_FP16FML}))}, |
552 | {.Name: "cortex-a520" , .Arch: ARMV9_2A, |
553 | .DefaultExtensions: (AArch64::ExtensionBitset( |
554 | {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE, |
555 | AArch64::AEK_FP16FML, AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM, |
556 | AArch64::AEK_FLAGM, AArch64::AEK_PERFMON, AArch64::AEK_PREDRES}))}, |
557 | {.Name: "cortex-a57" , .Arch: ARMV8A, |
558 | .DefaultExtensions: (AArch64::ExtensionBitset( |
559 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
560 | {.Name: "cortex-a65" , .Arch: ARMV8_2A, |
561 | .DefaultExtensions: (AArch64::ExtensionBitset( |
562 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_DOTPROD, |
563 | AArch64::AEK_FP16, AArch64::AEK_RCPC, AArch64::AEK_SSBS}))}, |
564 | {.Name: "cortex-a65ae" , .Arch: ARMV8_2A, |
565 | .DefaultExtensions: (AArch64::ExtensionBitset( |
566 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_DOTPROD, |
567 | AArch64::AEK_FP16, AArch64::AEK_RCPC, AArch64::AEK_SSBS}))}, |
568 | {.Name: "cortex-a72" , .Arch: ARMV8A, |
569 | .DefaultExtensions: (AArch64::ExtensionBitset( |
570 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
571 | {.Name: "cortex-a73" , .Arch: ARMV8A, |
572 | .DefaultExtensions: (AArch64::ExtensionBitset( |
573 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
574 | {.Name: "cortex-a75" , .Arch: ARMV8_2A, |
575 | .DefaultExtensions: (AArch64::ExtensionBitset( |
576 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16, |
577 | AArch64::AEK_DOTPROD, AArch64::AEK_RCPC}))}, |
578 | {.Name: "cortex-a76" , .Arch: ARMV8_2A, |
579 | .DefaultExtensions: (AArch64::ExtensionBitset( |
580 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16, |
581 | AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS}))}, |
582 | {.Name: "cortex-a76ae" , .Arch: ARMV8_2A, |
583 | .DefaultExtensions: (AArch64::ExtensionBitset( |
584 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16, |
585 | AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS}))}, |
586 | {.Name: "cortex-a77" , .Arch: ARMV8_2A, |
587 | .DefaultExtensions: (AArch64::ExtensionBitset( |
588 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16, |
589 | AArch64::AEK_RCPC, AArch64::AEK_DOTPROD, AArch64::AEK_SSBS}))}, |
590 | {.Name: "cortex-a78" , .Arch: ARMV8_2A, |
591 | .DefaultExtensions: (AArch64::ExtensionBitset( |
592 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16, |
593 | AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS, |
594 | AArch64::AEK_PROFILE}))}, |
595 | {.Name: "cortex-a78c" , .Arch: ARMV8_2A, |
596 | .DefaultExtensions: (AArch64::ExtensionBitset( |
597 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16, |
598 | AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS, |
599 | AArch64::AEK_PROFILE, AArch64::AEK_FLAGM, AArch64::AEK_PAUTH}))}, |
600 | {.Name: "cortex-a710" , .Arch: ARMV9A, |
601 | .DefaultExtensions: (AArch64::ExtensionBitset( |
602 | {AArch64::AEK_MTE, AArch64::AEK_PAUTH, AArch64::AEK_FLAGM, |
603 | AArch64::AEK_SB, AArch64::AEK_I8MM, AArch64::AEK_FP16FML, |
604 | AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM, |
605 | AArch64::AEK_BF16}))}, |
606 | {.Name: "cortex-a715" , .Arch: ARMV9A, |
607 | .DefaultExtensions: (AArch64::ExtensionBitset( |
608 | {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE, |
609 | AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_PAUTH, |
610 | AArch64::AEK_I8MM, AArch64::AEK_PREDRES, AArch64::AEK_PERFMON, |
611 | AArch64::AEK_PROFILE, AArch64::AEK_SVE, AArch64::AEK_SVE2BITPERM, |
612 | AArch64::AEK_BF16, AArch64::AEK_FLAGM}))}, |
613 | {.Name: "cortex-a720" , .Arch: ARMV9_2A, |
614 | .DefaultExtensions: (AArch64::ExtensionBitset( |
615 | {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE, |
616 | AArch64::AEK_FP16FML, AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM, |
617 | AArch64::AEK_FLAGM, AArch64::AEK_PERFMON, AArch64::AEK_PREDRES, |
618 | AArch64::AEK_PROFILE}))}, |
619 | {.Name: "cortex-r82" , .Arch: ARMV8R, |
620 | .DefaultExtensions: (AArch64::ExtensionBitset({AArch64::AEK_LSE}))}, |
621 | {.Name: "cortex-x1" , .Arch: ARMV8_2A, |
622 | .DefaultExtensions: (AArch64::ExtensionBitset( |
623 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16, |
624 | AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS, |
625 | AArch64::AEK_PROFILE}))}, |
626 | {.Name: "cortex-x1c" , .Arch: ARMV8_2A, |
627 | .DefaultExtensions: (AArch64::ExtensionBitset( |
628 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16, |
629 | AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS, |
630 | AArch64::AEK_PAUTH, AArch64::AEK_PROFILE, AArch64::AEK_FLAGM}))}, |
631 | {.Name: "cortex-x2" , .Arch: ARMV9A, |
632 | .DefaultExtensions: (AArch64::ExtensionBitset( |
633 | {AArch64::AEK_MTE, AArch64::AEK_BF16, AArch64::AEK_I8MM, |
634 | AArch64::AEK_PAUTH, AArch64::AEK_SSBS, AArch64::AEK_SB, |
635 | AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM, |
636 | AArch64::AEK_FP16FML, AArch64::AEK_FLAGM}))}, |
637 | {.Name: "cortex-x3" , .Arch: ARMV9A, |
638 | .DefaultExtensions: (AArch64::ExtensionBitset( |
639 | {AArch64::AEK_SVE, AArch64::AEK_PERFMON, AArch64::AEK_PROFILE, |
640 | AArch64::AEK_BF16, AArch64::AEK_I8MM, AArch64::AEK_MTE, |
641 | AArch64::AEK_SVE2BITPERM, AArch64::AEK_SB, AArch64::AEK_PAUTH, |
642 | AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_PREDRES, |
643 | AArch64::AEK_FLAGM, AArch64::AEK_SSBS}))}, |
644 | {.Name: "cortex-x4" , .Arch: ARMV9_2A, |
645 | .DefaultExtensions: (AArch64::ExtensionBitset( |
646 | {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE, |
647 | AArch64::AEK_FP16FML, AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM, |
648 | AArch64::AEK_FLAGM, AArch64::AEK_PERFMON, AArch64::AEK_PREDRES, |
649 | AArch64::AEK_PROFILE}))}, |
650 | {.Name: "neoverse-e1" , .Arch: ARMV8_2A, |
651 | .DefaultExtensions: (AArch64::ExtensionBitset( |
652 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_DOTPROD, |
653 | AArch64::AEK_FP16, AArch64::AEK_RCPC, AArch64::AEK_SSBS}))}, |
654 | {.Name: "neoverse-n1" , .Arch: ARMV8_2A, |
655 | .DefaultExtensions: (AArch64::ExtensionBitset( |
656 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_DOTPROD, |
657 | AArch64::AEK_FP16, AArch64::AEK_PROFILE, AArch64::AEK_RCPC, |
658 | AArch64::AEK_SSBS}))}, |
659 | {.Name: "neoverse-n2" , .Arch: ARMV9A, |
660 | .DefaultExtensions: (AArch64::ExtensionBitset( |
661 | {AArch64::AEK_BF16, AArch64::AEK_DOTPROD, |
662 | AArch64::AEK_FP16, AArch64::AEK_I8MM, AArch64::AEK_MTE, |
663 | AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_SVE, |
664 | AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM}))}, |
665 | {.Name: "neoverse-512tvb" , .Arch: ARMV8_4A, |
666 | .DefaultExtensions: (AArch64::ExtensionBitset( |
667 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3, |
668 | AArch64::AEK_SM4, AArch64::AEK_SVE, AArch64::AEK_SSBS, |
669 | AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_DOTPROD, |
670 | AArch64::AEK_PROFILE, AArch64::AEK_RAND, AArch64::AEK_FP16FML, |
671 | AArch64::AEK_I8MM}))}, |
672 | {.Name: "neoverse-v1" , .Arch: ARMV8_4A, |
673 | .DefaultExtensions: (AArch64::ExtensionBitset( |
674 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3, |
675 | AArch64::AEK_SM4, AArch64::AEK_SVE, AArch64::AEK_SSBS, |
676 | AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_DOTPROD, |
677 | AArch64::AEK_PROFILE, AArch64::AEK_RAND, AArch64::AEK_FP16FML, |
678 | AArch64::AEK_I8MM}))}, |
679 | {.Name: "neoverse-v2" , .Arch: ARMV9A, |
680 | .DefaultExtensions: (AArch64::ExtensionBitset( |
681 | {AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SSBS, |
682 | AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_RAND, |
683 | AArch64::AEK_DOTPROD, AArch64::AEK_PROFILE, AArch64::AEK_SVE2BITPERM, |
684 | AArch64::AEK_FP16FML, AArch64::AEK_I8MM, AArch64::AEK_MTE}))}, |
685 | {.Name: "cyclone" , .Arch: ARMV8A, |
686 | .DefaultExtensions: (AArch64::ExtensionBitset( |
687 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE}))}, |
688 | {.Name: "apple-a7" , .Arch: ARMV8A, |
689 | .DefaultExtensions: (AArch64::ExtensionBitset( |
690 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE}))}, |
691 | {.Name: "apple-a8" , .Arch: ARMV8A, |
692 | .DefaultExtensions: (AArch64::ExtensionBitset( |
693 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE}))}, |
694 | {.Name: "apple-a9" , .Arch: ARMV8A, |
695 | .DefaultExtensions: (AArch64::ExtensionBitset( |
696 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE}))}, |
697 | {.Name: "apple-a10" , .Arch: ARMV8A, |
698 | .DefaultExtensions: (AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2, |
699 | AArch64::AEK_CRC, |
700 | AArch64::AEK_RDM}))}, |
701 | {.Name: "apple-a11" , .Arch: ARMV8_2A, |
702 | .DefaultExtensions: (AArch64::ExtensionBitset( |
703 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16}))}, |
704 | {.Name: "apple-a12" , .Arch: ARMV8_3A, |
705 | .DefaultExtensions: (AArch64::ExtensionBitset( |
706 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16}))}, |
707 | {.Name: "apple-a13" , .Arch: ARMV8_4A, |
708 | .DefaultExtensions: (AArch64::ExtensionBitset( |
709 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3, |
710 | AArch64::AEK_FP16, AArch64::AEK_FP16FML}))}, |
711 | {.Name: "apple-a14" , .Arch: ARMV8_5A, |
712 | .DefaultExtensions: (AArch64::ExtensionBitset( |
713 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3, |
714 | AArch64::AEK_FP16, AArch64::AEK_FP16FML}))}, |
715 | {.Name: "apple-a15" , .Arch: ARMV8_6A, |
716 | .DefaultExtensions: (AArch64::ExtensionBitset( |
717 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3, |
718 | AArch64::AEK_FP16, AArch64::AEK_FP16FML}))}, |
719 | {.Name: "apple-a16" , .Arch: ARMV8_6A, |
720 | .DefaultExtensions: (AArch64::ExtensionBitset( |
721 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3, |
722 | AArch64::AEK_FP16, AArch64::AEK_FP16FML}))}, |
723 | {.Name: "apple-a17" , .Arch: ARMV8_6A, |
724 | .DefaultExtensions: (AArch64::ExtensionBitset( |
725 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3, |
726 | AArch64::AEK_FP16, AArch64::AEK_FP16FML}))}, |
727 | |
728 | {.Name: "apple-m1" , .Arch: ARMV8_5A, |
729 | .DefaultExtensions: (AArch64::ExtensionBitset( |
730 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3, |
731 | AArch64::AEK_FP16, AArch64::AEK_FP16FML}))}, |
732 | {.Name: "apple-m2" , .Arch: ARMV8_6A, |
733 | .DefaultExtensions: (AArch64::ExtensionBitset( |
734 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3, |
735 | AArch64::AEK_FP16, AArch64::AEK_FP16FML}))}, |
736 | {.Name: "apple-m3" , .Arch: ARMV8_6A, |
737 | .DefaultExtensions: (AArch64::ExtensionBitset( |
738 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3, |
739 | AArch64::AEK_FP16, AArch64::AEK_FP16FML}))}, |
740 | |
741 | {.Name: "apple-s4" , .Arch: ARMV8_3A, |
742 | .DefaultExtensions: (AArch64::ExtensionBitset( |
743 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16}))}, |
744 | {.Name: "apple-s5" , .Arch: ARMV8_3A, |
745 | .DefaultExtensions: (AArch64::ExtensionBitset( |
746 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16}))}, |
747 | {.Name: "exynos-m3" , .Arch: ARMV8A, |
748 | .DefaultExtensions: (AArch64::ExtensionBitset( |
749 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
750 | {.Name: "exynos-m4" , .Arch: ARMV8_2A, |
751 | .DefaultExtensions: (AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2, |
752 | AArch64::AEK_DOTPROD, |
753 | AArch64::AEK_FP16}))}, |
754 | {.Name: "exynos-m5" , .Arch: ARMV8_2A, |
755 | .DefaultExtensions: (AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2, |
756 | AArch64::AEK_DOTPROD, |
757 | AArch64::AEK_FP16}))}, |
758 | {.Name: "falkor" , .Arch: ARMV8A, |
759 | .DefaultExtensions: (AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2, |
760 | AArch64::AEK_CRC, |
761 | AArch64::AEK_RDM}))}, |
762 | {.Name: "saphira" , .Arch: ARMV8_3A, |
763 | .DefaultExtensions: (AArch64::ExtensionBitset( |
764 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_PROFILE}))}, |
765 | {.Name: "kryo" , .Arch: ARMV8A, |
766 | .DefaultExtensions: (AArch64::ExtensionBitset( |
767 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
768 | {.Name: "thunderx2t99" , .Arch: ARMV8_1A, |
769 | .DefaultExtensions: (AArch64::ExtensionBitset( |
770 | {AArch64::AEK_AES, AArch64::AEK_SHA2}))}, |
771 | {.Name: "thunderx3t110" , .Arch: ARMV8_3A, |
772 | .DefaultExtensions: (AArch64::ExtensionBitset( |
773 | {AArch64::AEK_AES, AArch64::AEK_SHA2}))}, |
774 | {.Name: "thunderx" , .Arch: ARMV8A, |
775 | .DefaultExtensions: (AArch64::ExtensionBitset( |
776 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
777 | {.Name: "thunderxt88" , .Arch: ARMV8A, |
778 | .DefaultExtensions: (AArch64::ExtensionBitset( |
779 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
780 | {.Name: "thunderxt81" , .Arch: ARMV8A, |
781 | .DefaultExtensions: (AArch64::ExtensionBitset( |
782 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
783 | {.Name: "thunderxt83" , .Arch: ARMV8A, |
784 | .DefaultExtensions: (AArch64::ExtensionBitset( |
785 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC}))}, |
786 | {.Name: "tsv110" , .Arch: ARMV8_2A, |
787 | .DefaultExtensions: (AArch64::ExtensionBitset( |
788 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_DOTPROD, |
789 | AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_PROFILE, |
790 | AArch64::AEK_JSCVT, AArch64::AEK_FCMA}))}, |
791 | {.Name: "a64fx" , .Arch: ARMV8_2A, |
792 | .DefaultExtensions: (AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2, |
793 | AArch64::AEK_FP16, |
794 | AArch64::AEK_SVE}))}, |
795 | {.Name: "carmel" , .Arch: ARMV8_2A, |
796 | .DefaultExtensions: (AArch64::ExtensionBitset( |
797 | {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16}))}, |
798 | {.Name: "ampere1" , .Arch: ARMV8_6A, |
799 | .DefaultExtensions: (AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2, |
800 | AArch64::AEK_SHA3, AArch64::AEK_FP16, |
801 | AArch64::AEK_SB, AArch64::AEK_SSBS, |
802 | AArch64::AEK_RAND}))}, |
803 | {.Name: "ampere1a" , .Arch: ARMV8_6A, |
804 | .DefaultExtensions: (AArch64::ExtensionBitset( |
805 | {AArch64::AEK_FP16, AArch64::AEK_RAND, AArch64::AEK_SM4, |
806 | AArch64::AEK_SHA3, AArch64::AEK_SHA2, AArch64::AEK_AES, |
807 | AArch64::AEK_MTE, AArch64::AEK_SB, AArch64::AEK_SSBS}))}, |
808 | {.Name: "ampere1b" , .Arch: ARMV8_7A, |
809 | .DefaultExtensions: (AArch64::ExtensionBitset({AArch64::AEK_FP16, AArch64::AEK_RAND, |
810 | AArch64::AEK_SM4, AArch64::AEK_SHA3, |
811 | AArch64::AEK_SHA2, AArch64::AEK_AES, |
812 | AArch64::AEK_MTE, AArch64::AEK_SB, |
813 | AArch64::AEK_SSBS, AArch64::AEK_CSSC}))}, |
814 | }; |
815 | |
816 | // An alias for a CPU. |
817 | struct CpuAlias { |
818 | StringRef Alias; |
819 | StringRef Name; |
820 | }; |
821 | |
822 | inline constexpr CpuAlias CpuAliases[] = {{.Alias: "cobalt-100" , .Name: "neoverse-n2" }, |
823 | {.Alias: "grace" , .Name: "neoverse-v2" }}; |
824 | |
825 | bool getExtensionFeatures( |
826 | const AArch64::ExtensionBitset &Extensions, |
827 | std::vector<StringRef> &Features); |
828 | |
829 | StringRef getArchExtFeature(StringRef ArchExt); |
830 | StringRef resolveCPUAlias(StringRef CPU); |
831 | |
832 | // Information by Name |
833 | const ArchInfo *getArchForCpu(StringRef CPU); |
834 | |
835 | // Parser |
836 | const ArchInfo *parseArch(StringRef Arch); |
837 | std::optional<ExtensionInfo> parseArchExtension(StringRef Extension); |
838 | // Given the name of a CPU or alias, return the correponding CpuInfo. |
839 | std::optional<CpuInfo> parseCpu(StringRef Name); |
840 | // Used by target parser tests |
841 | void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values); |
842 | |
843 | bool isX18ReservedByDefault(const Triple &TT); |
844 | |
845 | // For given feature names, return a bitmask corresponding to the entries of |
846 | // AArch64::CPUFeatures. The values in CPUFeatures are not bitmasks |
847 | // themselves, they are sequential (0, 1, 2, 3, ...). |
848 | uint64_t getCpuSupportsMask(ArrayRef<StringRef> FeatureStrs); |
849 | |
850 | void PrintSupportedExtensions(StringMap<StringRef> DescMap); |
851 | |
852 | } // namespace AArch64 |
853 | } // namespace llvm |
854 | |
855 | #endif |
856 | |