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
25namespace llvm {
26
27class Triple;
28
29namespace AArch64 {
30
31struct ArchInfo;
32struct 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.
37enum 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
103static_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
109enum 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};
188using 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.
195struct 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
213inline 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
316struct 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.
362struct 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.
370inline 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
417enum ArchProfile { AProfile = 'A', RProfile = 'R', InvalidProfile = '?' };
418
419// Information about a specific architecture, e.g. V8.1-A
420struct 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
474inline constexpr ArchInfo ARMV8A = { .Version: VersionTuple{8, 0}, .Profile: AProfile, .Name: "armv8-a", .ArchFeature: "+v8a", .DefaultExts: (
475 AArch64::ExtensionBitset({AArch64::AEK_FP, AArch64::AEK_SIMD})), };
476inline 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}))};
478inline 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}))};
480inline 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}))};
482inline 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}))};
484inline constexpr ArchInfo ARMV8_5A = { .Version: VersionTuple{8, 5}, .Profile: AProfile, .Name: "armv8.5-a", .ArchFeature: "+v8.5a", .DefaultExts: (ARMV8_4A.DefaultExts)};
485inline 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}))};
487inline constexpr ArchInfo ARMV8_7A = { .Version: VersionTuple{8, 7}, .Profile: AProfile, .Name: "armv8.7-a", .ArchFeature: "+v8.7a", .DefaultExts: (ARMV8_6A.DefaultExts)};
488inline 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}))};
490inline 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}))};
492inline 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}))};
494inline 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}))};
496inline constexpr ArchInfo ARMV9_2A = { .Version: VersionTuple{9, 2}, .Profile: AProfile, .Name: "armv9.2-a", .ArchFeature: "+v9.2a", .DefaultExts: (ARMV9_1A.DefaultExts)};
497inline 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}))};
499inline 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}))};
501inline 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.
504inline 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
510static 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.
517struct 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
532inline 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.
817struct CpuAlias {
818 StringRef Alias;
819 StringRef Name;
820};
821
822inline constexpr CpuAlias CpuAliases[] = {{.Alias: "cobalt-100", .Name: "neoverse-n2"},
823 {.Alias: "grace", .Name: "neoverse-v2"}};
824
825bool getExtensionFeatures(
826 const AArch64::ExtensionBitset &Extensions,
827 std::vector<StringRef> &Features);
828
829StringRef getArchExtFeature(StringRef ArchExt);
830StringRef resolveCPUAlias(StringRef CPU);
831
832// Information by Name
833const ArchInfo *getArchForCpu(StringRef CPU);
834
835// Parser
836const ArchInfo *parseArch(StringRef Arch);
837std::optional<ExtensionInfo> parseArchExtension(StringRef Extension);
838// Given the name of a CPU or alias, return the correponding CpuInfo.
839std::optional<CpuInfo> parseCpu(StringRef Name);
840// Used by target parser tests
841void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values);
842
843bool 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, ...).
848uint64_t getCpuSupportsMask(ArrayRef<StringRef> FeatureStrs);
849
850void PrintSupportedExtensions(StringMap<StringRef> DescMap);
851
852} // namespace AArch64
853} // namespace llvm
854
855#endif
856

source code of llvm/include/llvm/TargetParser/AArch64TargetParser.h