LLVM 22.0.0git
AArch64BaseInfo.h
Go to the documentation of this file.
1//===-- AArch64BaseInfo.h - Top level definitions for AArch64 ---*- 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 contains small standalone helper functions and enum definitions for
10// the AArch64 target useful for the compiler back-end and the MC libraries.
11// As such, it deliberately does not include references to LLVM core
12// code gen types, passes, etc..
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_LIB_TARGET_AARCH64_UTILS_AARCH64BASEINFO_H
17#define LLVM_LIB_TARGET_AARCH64_UTILS_AARCH64BASEINFO_H
18
19// FIXME: Is it easiest to fix this layering violation by moving the .inc
20// #includes from AArch64MCTargetDesc.h to here?
21#include "MCTargetDesc/AArch64MCTargetDesc.h" // For AArch64::X0 and friends.
23#include "llvm/ADT/STLExtras.h"
27
28namespace llvm {
29
31 switch (Reg.id()) {
32 case AArch64::X0: return AArch64::W0;
33 case AArch64::X1: return AArch64::W1;
34 case AArch64::X2: return AArch64::W2;
35 case AArch64::X3: return AArch64::W3;
36 case AArch64::X4: return AArch64::W4;
37 case AArch64::X5: return AArch64::W5;
38 case AArch64::X6: return AArch64::W6;
39 case AArch64::X7: return AArch64::W7;
40 case AArch64::X8: return AArch64::W8;
41 case AArch64::X9: return AArch64::W9;
42 case AArch64::X10: return AArch64::W10;
43 case AArch64::X11: return AArch64::W11;
44 case AArch64::X12: return AArch64::W12;
45 case AArch64::X13: return AArch64::W13;
46 case AArch64::X14: return AArch64::W14;
47 case AArch64::X15: return AArch64::W15;
48 case AArch64::X16: return AArch64::W16;
49 case AArch64::X17: return AArch64::W17;
50 case AArch64::X18: return AArch64::W18;
51 case AArch64::X19: return AArch64::W19;
52 case AArch64::X20: return AArch64::W20;
53 case AArch64::X21: return AArch64::W21;
54 case AArch64::X22: return AArch64::W22;
55 case AArch64::X23: return AArch64::W23;
56 case AArch64::X24: return AArch64::W24;
57 case AArch64::X25: return AArch64::W25;
58 case AArch64::X26: return AArch64::W26;
59 case AArch64::X27: return AArch64::W27;
60 case AArch64::X28: return AArch64::W28;
61 case AArch64::FP: return AArch64::W29;
62 case AArch64::LR: return AArch64::W30;
63 case AArch64::SP: return AArch64::WSP;
64 case AArch64::XZR: return AArch64::WZR;
65 }
66 // For anything else, return it unchanged.
67 return Reg;
68}
69
71 switch (Reg.id()) {
72 case AArch64::W0: return AArch64::X0;
73 case AArch64::W1: return AArch64::X1;
74 case AArch64::W2: return AArch64::X2;
75 case AArch64::W3: return AArch64::X3;
76 case AArch64::W4: return AArch64::X4;
77 case AArch64::W5: return AArch64::X5;
78 case AArch64::W6: return AArch64::X6;
79 case AArch64::W7: return AArch64::X7;
80 case AArch64::W8: return AArch64::X8;
81 case AArch64::W9: return AArch64::X9;
82 case AArch64::W10: return AArch64::X10;
83 case AArch64::W11: return AArch64::X11;
84 case AArch64::W12: return AArch64::X12;
85 case AArch64::W13: return AArch64::X13;
86 case AArch64::W14: return AArch64::X14;
87 case AArch64::W15: return AArch64::X15;
88 case AArch64::W16: return AArch64::X16;
89 case AArch64::W17: return AArch64::X17;
90 case AArch64::W18: return AArch64::X18;
91 case AArch64::W19: return AArch64::X19;
92 case AArch64::W20: return AArch64::X20;
93 case AArch64::W21: return AArch64::X21;
94 case AArch64::W22: return AArch64::X22;
95 case AArch64::W23: return AArch64::X23;
96 case AArch64::W24: return AArch64::X24;
97 case AArch64::W25: return AArch64::X25;
98 case AArch64::W26: return AArch64::X26;
99 case AArch64::W27: return AArch64::X27;
100 case AArch64::W28: return AArch64::X28;
101 case AArch64::W29: return AArch64::FP;
102 case AArch64::W30: return AArch64::LR;
103 case AArch64::WSP: return AArch64::SP;
104 case AArch64::WZR: return AArch64::XZR;
105 }
106 // For anything else, return it unchanged.
107 return Reg;
108}
109
111 switch (RegTuple.id()) {
112 case AArch64::X0_X1_X2_X3_X4_X5_X6_X7: return AArch64::X0;
113 case AArch64::X2_X3_X4_X5_X6_X7_X8_X9: return AArch64::X2;
114 case AArch64::X4_X5_X6_X7_X8_X9_X10_X11: return AArch64::X4;
115 case AArch64::X6_X7_X8_X9_X10_X11_X12_X13: return AArch64::X6;
116 case AArch64::X8_X9_X10_X11_X12_X13_X14_X15: return AArch64::X8;
117 case AArch64::X10_X11_X12_X13_X14_X15_X16_X17: return AArch64::X10;
118 case AArch64::X12_X13_X14_X15_X16_X17_X18_X19: return AArch64::X12;
119 case AArch64::X14_X15_X16_X17_X18_X19_X20_X21: return AArch64::X14;
120 case AArch64::X16_X17_X18_X19_X20_X21_X22_X23: return AArch64::X16;
121 case AArch64::X18_X19_X20_X21_X22_X23_X24_X25: return AArch64::X18;
122 case AArch64::X20_X21_X22_X23_X24_X25_X26_X27: return AArch64::X20;
123 case AArch64::X22_X23_X24_X25_X26_X27_X28_FP: return AArch64::X22;
124 }
125 // For anything else, return it unchanged.
126 return RegTuple;
127}
128
130 switch (Reg.id()) {
131 case AArch64::D0: return AArch64::B0;
132 case AArch64::D1: return AArch64::B1;
133 case AArch64::D2: return AArch64::B2;
134 case AArch64::D3: return AArch64::B3;
135 case AArch64::D4: return AArch64::B4;
136 case AArch64::D5: return AArch64::B5;
137 case AArch64::D6: return AArch64::B6;
138 case AArch64::D7: return AArch64::B7;
139 case AArch64::D8: return AArch64::B8;
140 case AArch64::D9: return AArch64::B9;
141 case AArch64::D10: return AArch64::B10;
142 case AArch64::D11: return AArch64::B11;
143 case AArch64::D12: return AArch64::B12;
144 case AArch64::D13: return AArch64::B13;
145 case AArch64::D14: return AArch64::B14;
146 case AArch64::D15: return AArch64::B15;
147 case AArch64::D16: return AArch64::B16;
148 case AArch64::D17: return AArch64::B17;
149 case AArch64::D18: return AArch64::B18;
150 case AArch64::D19: return AArch64::B19;
151 case AArch64::D20: return AArch64::B20;
152 case AArch64::D21: return AArch64::B21;
153 case AArch64::D22: return AArch64::B22;
154 case AArch64::D23: return AArch64::B23;
155 case AArch64::D24: return AArch64::B24;
156 case AArch64::D25: return AArch64::B25;
157 case AArch64::D26: return AArch64::B26;
158 case AArch64::D27: return AArch64::B27;
159 case AArch64::D28: return AArch64::B28;
160 case AArch64::D29: return AArch64::B29;
161 case AArch64::D30: return AArch64::B30;
162 case AArch64::D31: return AArch64::B31;
163 }
164 // For anything else, return it unchanged.
165 return Reg;
166}
167
169 switch (Reg.id()) {
170 case AArch64::B0: return AArch64::D0;
171 case AArch64::B1: return AArch64::D1;
172 case AArch64::B2: return AArch64::D2;
173 case AArch64::B3: return AArch64::D3;
174 case AArch64::B4: return AArch64::D4;
175 case AArch64::B5: return AArch64::D5;
176 case AArch64::B6: return AArch64::D6;
177 case AArch64::B7: return AArch64::D7;
178 case AArch64::B8: return AArch64::D8;
179 case AArch64::B9: return AArch64::D9;
180 case AArch64::B10: return AArch64::D10;
181 case AArch64::B11: return AArch64::D11;
182 case AArch64::B12: return AArch64::D12;
183 case AArch64::B13: return AArch64::D13;
184 case AArch64::B14: return AArch64::D14;
185 case AArch64::B15: return AArch64::D15;
186 case AArch64::B16: return AArch64::D16;
187 case AArch64::B17: return AArch64::D17;
188 case AArch64::B18: return AArch64::D18;
189 case AArch64::B19: return AArch64::D19;
190 case AArch64::B20: return AArch64::D20;
191 case AArch64::B21: return AArch64::D21;
192 case AArch64::B22: return AArch64::D22;
193 case AArch64::B23: return AArch64::D23;
194 case AArch64::B24: return AArch64::D24;
195 case AArch64::B25: return AArch64::D25;
196 case AArch64::B26: return AArch64::D26;
197 case AArch64::B27: return AArch64::D27;
198 case AArch64::B28: return AArch64::D28;
199 case AArch64::B29: return AArch64::D29;
200 case AArch64::B30: return AArch64::D30;
201 case AArch64::B31: return AArch64::D31;
202 }
203 // For anything else, return it unchanged.
204 return Reg;
205}
206
207static inline bool atomicBarrierDroppedOnZero(unsigned Opcode) {
208 switch (Opcode) {
209 case AArch64::LDADDAB: case AArch64::LDADDAH:
210 case AArch64::LDADDAW: case AArch64::LDADDAX:
211 case AArch64::LDADDALB: case AArch64::LDADDALH:
212 case AArch64::LDADDALW: case AArch64::LDADDALX:
213 case AArch64::LDCLRAB: case AArch64::LDCLRAH:
214 case AArch64::LDCLRAW: case AArch64::LDCLRAX:
215 case AArch64::LDCLRALB: case AArch64::LDCLRALH:
216 case AArch64::LDCLRALW: case AArch64::LDCLRALX:
217 case AArch64::LDEORAB: case AArch64::LDEORAH:
218 case AArch64::LDEORAW: case AArch64::LDEORAX:
219 case AArch64::LDEORALB: case AArch64::LDEORALH:
220 case AArch64::LDEORALW: case AArch64::LDEORALX:
221 case AArch64::LDSETAB: case AArch64::LDSETAH:
222 case AArch64::LDSETAW: case AArch64::LDSETAX:
223 case AArch64::LDSETALB: case AArch64::LDSETALH:
224 case AArch64::LDSETALW: case AArch64::LDSETALX:
225 case AArch64::LDSMAXAB: case AArch64::LDSMAXAH:
226 case AArch64::LDSMAXAW: case AArch64::LDSMAXAX:
227 case AArch64::LDSMAXALB: case AArch64::LDSMAXALH:
228 case AArch64::LDSMAXALW: case AArch64::LDSMAXALX:
229 case AArch64::LDSMINAB: case AArch64::LDSMINAH:
230 case AArch64::LDSMINAW: case AArch64::LDSMINAX:
231 case AArch64::LDSMINALB: case AArch64::LDSMINALH:
232 case AArch64::LDSMINALW: case AArch64::LDSMINALX:
233 case AArch64::LDUMAXAB: case AArch64::LDUMAXAH:
234 case AArch64::LDUMAXAW: case AArch64::LDUMAXAX:
235 case AArch64::LDUMAXALB: case AArch64::LDUMAXALH:
236 case AArch64::LDUMAXALW: case AArch64::LDUMAXALX:
237 case AArch64::LDUMINAB: case AArch64::LDUMINAH:
238 case AArch64::LDUMINAW: case AArch64::LDUMINAX:
239 case AArch64::LDUMINALB: case AArch64::LDUMINALH:
240 case AArch64::LDUMINALW: case AArch64::LDUMINALX:
241 case AArch64::SWPAB: case AArch64::SWPAH:
242 case AArch64::SWPAW: case AArch64::SWPAX:
243 case AArch64::SWPALB: case AArch64::SWPALH:
244 case AArch64::SWPALW: case AArch64::SWPALX:
245 return true;
246 }
247 return false;
248}
249
250namespace AArch64CC {
251
252// The CondCodes constants map directly to the 4-bit encoding of the condition
253// field for predicated instructions.
254enum CondCode { // Meaning (integer) Meaning (floating-point)
255 EQ = 0x0, // Equal Equal
256 NE = 0x1, // Not equal Not equal, or unordered
257 HS = 0x2, // Unsigned higher or same >, ==, or unordered
258 LO = 0x3, // Unsigned lower Less than
259 MI = 0x4, // Minus, negative Less than
260 PL = 0x5, // Plus, positive or zero >, ==, or unordered
261 VS = 0x6, // Overflow Unordered
262 VC = 0x7, // No overflow Not unordered
263 HI = 0x8, // Unsigned higher Greater than, or unordered
264 LS = 0x9, // Unsigned lower or same Less than or equal
265 GE = 0xa, // Greater than or equal Greater than or equal
266 LT = 0xb, // Less than Less than, or unordered
267 GT = 0xc, // Greater than Greater than
268 LE = 0xd, // Less than or equal <, ==, or unordered
269 AL = 0xe, // Always (unconditional) Always (unconditional)
270 NV = 0xf, // Always (unconditional) Always (unconditional)
271 // Note the NV exists purely to disassemble 0b1111. Execution is "always".
273
274 // Common aliases used for SVE.
275 ANY_ACTIVE = NE, // (!Z)
276 FIRST_ACTIVE = MI, // ( N)
277 LAST_ACTIVE = LO, // (!C)
278 NONE_ACTIVE = EQ // ( Z)
279};
280
281inline static const char *getCondCodeName(CondCode Code) {
282 switch (Code) {
283 default: llvm_unreachable("Unknown condition code");
284 case EQ: return "eq";
285 case NE: return "ne";
286 case HS: return "hs";
287 case LO: return "lo";
288 case MI: return "mi";
289 case PL: return "pl";
290 case VS: return "vs";
291 case VC: return "vc";
292 case HI: return "hi";
293 case LS: return "ls";
294 case GE: return "ge";
295 case LT: return "lt";
296 case GT: return "gt";
297 case LE: return "le";
298 case AL: return "al";
299 case NV: return "nv";
300 }
301}
302
304 // To reverse a condition it's necessary to only invert the low bit:
305
306 return static_cast<CondCode>(static_cast<unsigned>(Code) ^ 0x1);
307}
308
309/// getSwappedCondition - assume the flags are set by MI(a,b), return
310/// the condition code if we modify the instructions such that flags are
311/// set by MI(b,a).
313 switch (CC) {
314 default:
315 return AL;
316 case EQ:
317 return EQ;
318 case NE:
319 return NE;
320 case HS:
321 return LS;
322 case LO:
323 return HI;
324 case HI:
325 return LO;
326 case LS:
327 return HS;
328 case GE:
329 return LE;
330 case LT:
331 return GT;
332 case GT:
333 return LT;
334 case LE:
335 return GE;
336 }
337}
338
339/// Given a condition code, return NZCV flags that would satisfy that condition.
340/// The flag bits are in the format expected by the ccmp instructions.
341/// Note that many different flag settings can satisfy a given condition code,
342/// this function just returns one of them.
343inline static unsigned getNZCVToSatisfyCondCode(CondCode Code) {
344 // NZCV flags encoded as expected by ccmp instructions, ARMv8 ISA 5.5.7.
345 enum { N = 8, Z = 4, C = 2, V = 1 };
346 switch (Code) {
347 default: llvm_unreachable("Unknown condition code");
348 case EQ: return Z; // Z == 1
349 case NE: return 0; // Z == 0
350 case HS: return C; // C == 1
351 case LO: return 0; // C == 0
352 case MI: return N; // N == 1
353 case PL: return 0; // N == 0
354 case VS: return V; // V == 1
355 case VC: return 0; // V == 0
356 case HI: return C; // C == 1 && Z == 0
357 case LS: return 0; // C == 0 || Z == 1
358 case GE: return 0; // N == V
359 case LT: return N; // N != V
360 case GT: return 0; // Z == 0 && N == V
361 case LE: return Z; // Z == 1 || N != V
362 }
363}
364
365/// True, if a given condition code can be used in a fused compare-and-branch
366/// instructions, false otherwise.
367inline static bool isValidCBCond(AArch64CC::CondCode Code) {
368 switch (Code) {
369 default:
370 return false;
371 case AArch64CC::EQ:
372 case AArch64CC::NE:
373 case AArch64CC::HS:
374 case AArch64CC::LO:
375 case AArch64CC::HI:
376 case AArch64CC::LS:
377 case AArch64CC::GE:
378 case AArch64CC::LT:
379 case AArch64CC::GT:
380 case AArch64CC::LE:
381 return true;
382 }
383}
384
385} // end namespace AArch64CC
386
387struct SysAlias {
388 const char *Name;
391
392 constexpr SysAlias(const char *N, uint16_t E) : Name(N), Encoding(E) {}
393 constexpr SysAlias(const char *N, uint16_t E, FeatureBitset F)
395
396 bool haveFeatures(FeatureBitset ActiveFeatures) const {
397 return ActiveFeatures[llvm::AArch64::FeatureAll] ||
398 (FeaturesRequired & ActiveFeatures) == FeaturesRequired;
399 }
400
402};
403
406 constexpr SysAliasReg(const char *N, uint16_t E, bool R)
407 : SysAlias(N, E), NeedsReg(R) {}
408 constexpr SysAliasReg(const char *N, uint16_t E, bool R, FeatureBitset F)
409 : SysAlias(N, E, F), NeedsReg(R) {}
410};
411
415 constexpr SysAliasOptionalReg(const char *N, uint16_t E, bool R, bool O)
416 : SysAlias(N, E), NeedsReg(R), OptionalReg(O) {}
417 constexpr SysAliasOptionalReg(const char *N, uint16_t E, bool R, bool O,
419 : SysAlias(N, E, F), NeedsReg(R), OptionalReg(O) {}
420};
421
424 constexpr SysAliasImm(const char *N, uint16_t E, uint16_t I)
425 : SysAlias(N, E), ImmValue(I) {}
426 constexpr SysAliasImm(const char *N, uint16_t E, uint16_t I, FeatureBitset F)
427 : SysAlias(N, E, F), ImmValue(I) {}
428};
429
430namespace AArch64SVCR {
431 struct SVCR : SysAlias{
432 using SysAlias::SysAlias;
433 };
434#define GET_SVCRValues_DECL
435#define GET_SVCRsList_DECL
436#include "AArch64GenSystemOperands.inc"
437}
438
439namespace AArch64AT{
440 struct AT : SysAlias {
441 using SysAlias::SysAlias;
442 };
443#define GET_ATValues_DECL
444#define GET_ATsList_DECL
445#include "AArch64GenSystemOperands.inc"
446}
447
448namespace AArch64DB {
449 struct DB : SysAlias {
450 using SysAlias::SysAlias;
451 };
452#define GET_DBValues_DECL
453#define GET_DBsList_DECL
454#include "AArch64GenSystemOperands.inc"
455}
456
457namespace AArch64DBnXS {
460 };
461#define GET_DBnXSValues_DECL
462#define GET_DBnXSsList_DECL
463#include "AArch64GenSystemOperands.inc"
464}
465
466namespace AArch64DC {
467 struct DC : SysAlias {
468 using SysAlias::SysAlias;
469 };
470#define GET_DCValues_DECL
471#define GET_DCsList_DECL
472#include "AArch64GenSystemOperands.inc"
473}
474
475namespace AArch64IC {
476 struct IC : SysAliasReg {
478 };
479#define GET_ICValues_DECL
480#define GET_ICsList_DECL
481#include "AArch64GenSystemOperands.inc"
482}
483
484namespace AArch64ISB {
485 struct ISB : SysAlias {
486 using SysAlias::SysAlias;
487 };
488#define GET_ISBValues_DECL
489#define GET_ISBsList_DECL
490#include "AArch64GenSystemOperands.inc"
491}
492
493namespace AArch64TSB {
494 struct TSB : SysAlias {
495 using SysAlias::SysAlias;
496 };
497#define GET_TSBValues_DECL
498#define GET_TSBsList_DECL
499#include "AArch64GenSystemOperands.inc"
500}
501
502namespace AArch64PRFM {
503 struct PRFM : SysAlias {
504 using SysAlias::SysAlias;
505 };
506#define GET_PRFMValues_DECL
507#define GET_PRFMsList_DECL
508#include "AArch64GenSystemOperands.inc"
509}
510
511namespace AArch64SVEPRFM {
512 struct SVEPRFM : SysAlias {
513 using SysAlias::SysAlias;
514 };
515#define GET_SVEPRFMValues_DECL
516#define GET_SVEPRFMsList_DECL
517#include "AArch64GenSystemOperands.inc"
518}
519
520namespace AArch64RPRFM {
521struct RPRFM : SysAlias {
522 using SysAlias::SysAlias;
523};
524#define GET_RPRFMValues_DECL
525#define GET_RPRFMsList_DECL
526#include "AArch64GenSystemOperands.inc"
527} // namespace AArch64RPRFM
528
529namespace AArch64SVEPredPattern {
530 struct SVEPREDPAT {
531 const char *Name;
533 };
534#define GET_SVEPREDPATValues_DECL
535#define GET_SVEPREDPATsList_DECL
536#include "AArch64GenSystemOperands.inc"
537}
538
541 const char *Name;
543 };
544#define GET_SVEVECLENSPECIFIERValues_DECL
545#define GET_SVEVECLENSPECIFIERsList_DECL
546#include "AArch64GenSystemOperands.inc"
547} // namespace AArch64SVEVecLenSpecifier
548
549/// Return the number of active elements for VL1 to VL256 predicate pattern,
550/// zero for all other patterns.
551inline unsigned getNumElementsFromSVEPredPattern(unsigned Pattern) {
552 switch (Pattern) {
553 default:
554 return 0;
555 case AArch64SVEPredPattern::vl1:
556 case AArch64SVEPredPattern::vl2:
557 case AArch64SVEPredPattern::vl3:
558 case AArch64SVEPredPattern::vl4:
559 case AArch64SVEPredPattern::vl5:
560 case AArch64SVEPredPattern::vl6:
561 case AArch64SVEPredPattern::vl7:
562 case AArch64SVEPredPattern::vl8:
563 return Pattern;
564 case AArch64SVEPredPattern::vl16:
565 return 16;
566 case AArch64SVEPredPattern::vl32:
567 return 32;
568 case AArch64SVEPredPattern::vl64:
569 return 64;
570 case AArch64SVEPredPattern::vl128:
571 return 128;
572 case AArch64SVEPredPattern::vl256:
573 return 256;
574 }
575}
576
577/// Return specific VL predicate pattern based on the number of elements.
578inline std::optional<unsigned>
580 switch (MinNumElts) {
581 default:
582 return std::nullopt;
583 case 1:
584 case 2:
585 case 3:
586 case 4:
587 case 5:
588 case 6:
589 case 7:
590 case 8:
591 return MinNumElts;
592 case 16:
593 return AArch64SVEPredPattern::vl16;
594 case 32:
595 return AArch64SVEPredPattern::vl32;
596 case 64:
597 return AArch64SVEPredPattern::vl64;
598 case 128:
599 return AArch64SVEPredPattern::vl128;
600 case 256:
601 return AArch64SVEPredPattern::vl256;
602 }
603}
604
605/// An enum to describe what types of loops we should attempt to tail-fold:
606/// Disabled: None
607/// Reductions: Loops containing reductions
608/// Recurrences: Loops with first-order recurrences, i.e. that would
609/// require a SVE splice instruction
610/// Reverse: Reverse loops
611/// Simple: Loops that are not reversed and don't contain reductions
612/// or first-order recurrences.
613/// All: All
622
624 /* LargestValue */ (long)TailFoldingOpts::Reverse);
625
626namespace AArch64ExactFPImm {
628 int Enum;
629 const char *Repr;
630};
631#define GET_ExactFPImmValues_DECL
632#define GET_ExactFPImmsList_DECL
633#include "AArch64GenSystemOperands.inc"
634}
635
636namespace AArch64PState {
638 using SysAlias::SysAlias;
639 };
640#define GET_PStateImm0_15Values_DECL
641#define GET_PStateImm0_15sList_DECL
642#include "AArch64GenSystemOperands.inc"
643
645 using SysAlias::SysAlias;
646 };
647#define GET_PStateImm0_1Values_DECL
648#define GET_PStateImm0_1sList_DECL
649#include "AArch64GenSystemOperands.inc"
650}
651
652namespace AArch64PSBHint {
653 struct PSB : SysAlias {
654 using SysAlias::SysAlias;
655 };
656#define GET_PSBValues_DECL
657#define GET_PSBsList_DECL
658#include "AArch64GenSystemOperands.inc"
659}
660
661namespace AArch64PHint {
662struct PHint {
663 const char *Name;
664 unsigned Encoding;
666
667 bool haveFeatures(FeatureBitset ActiveFeatures) const {
668 return ActiveFeatures[llvm::AArch64::FeatureAll] ||
669 (FeaturesRequired & ActiveFeatures) == FeaturesRequired;
670 }
671};
672
673#define GET_PHintValues_DECL
674#define GET_PHintsList_DECL
675#include "AArch64GenSystemOperands.inc"
676
679} // namespace AArch64PHint
680
681namespace AArch64BTIHint {
682 struct BTI : SysAlias {
683 using SysAlias::SysAlias;
684 };
685#define GET_BTIValues_DECL
686#define GET_BTIsList_DECL
687#include "AArch64GenSystemOperands.inc"
688}
689
690namespace AArch64CMHPriorityHint {
692 using SysAlias::SysAlias;
693};
694#define GET_CMHPRIORITYHINT_DECL
695#include "AArch64GenSystemOperands.inc"
696} // namespace AArch64CMHPriorityHint
697
705
726
727namespace AArch64Layout {
734
739
740 // Bare layout for the 128-bit vector
741 // (only show ".b", ".h", ".s", ".d" without vector number)
746 };
747}
748
749inline static const char *
751 switch (Layout) {
752 case AArch64Layout::VL_8B: return ".8b";
753 case AArch64Layout::VL_4H: return ".4h";
754 case AArch64Layout::VL_2S: return ".2s";
755 case AArch64Layout::VL_1D: return ".1d";
756 case AArch64Layout::VL_16B: return ".16b";
757 case AArch64Layout::VL_8H: return ".8h";
758 case AArch64Layout::VL_4S: return ".4s";
759 case AArch64Layout::VL_2D: return ".2d";
760 case AArch64Layout::VL_B: return ".b";
761 case AArch64Layout::VL_H: return ".h";
762 case AArch64Layout::VL_S: return ".s";
763 case AArch64Layout::VL_D: return ".d";
764 default: llvm_unreachable("Unknown Vector Layout");
765 }
766}
767
768inline static AArch64Layout::VectorLayout
785
786namespace AArch64SysReg {
787 struct SysReg {
788 const char Name[32];
789 unsigned Encoding;
793
794 bool haveFeatures(FeatureBitset ActiveFeatures) const {
795 return ActiveFeatures[llvm::AArch64::FeatureAll] ||
796 (FeaturesRequired & ActiveFeatures) == FeaturesRequired;
797 }
798 };
799
800#define GET_SysRegsList_DECL
801#define GET_SysRegValues_DECL
802#include "AArch64GenSystemOperands.inc"
803
804 uint32_t parseGenericRegister(StringRef Name);
805 std::string genericRegisterString(uint32_t Bits);
806}
807
808namespace AArch64TLBI {
812#define GET_TLBITable_DECL
813#include "AArch64GenSystemOperands.inc"
814}
815
816namespace AArch64TLBIP {
820#define GET_TLBIPTable_DECL
821#include "AArch64GenSystemOperands.inc"
822} // namespace AArch64TLBIP
823
824namespace AArch64MLBI {
827};
828#define GET_MLBITable_DECL
829#include "AArch64GenSystemOperands.inc"
830} // namespace AArch64MLBI
831
832namespace AArch64GIC {
833struct GIC : SysAliasReg {
835};
836#define GET_GICTable_DECL
837#include "AArch64GenSystemOperands.inc"
838} // namespace AArch64GIC
839
840namespace AArch64GICR {
843};
844#define GET_GICRTable_DECL
845#include "AArch64GenSystemOperands.inc"
846} // namespace AArch64GICR
847
848namespace AArch64GSB {
849struct GSB : SysAlias {
850 using SysAlias::SysAlias;
851};
852#define GET_GSBTable_DECL
853#include "AArch64GenSystemOperands.inc"
854} // namespace AArch64GSB
855
856namespace AArch64II {
857/// Target Operand Flag enum.
858enum TOF {
859 //===------------------------------------------------------------------===//
860 // AArch64 Specific MachineOperand flags.
861
863
865
866 /// MO_PAGE - A symbol operand with this flag represents the pc-relative
867 /// offset of the 4K page containing the symbol. This is used with the
868 /// ADRP instruction.
870
871 /// MO_PAGEOFF - A symbol operand with this flag represents the offset of
872 /// that symbol within a 4K page. This offset is added to the page address
873 /// to produce the complete address.
875
876 /// MO_G3 - A symbol operand with this flag (granule 3) represents the high
877 /// 16-bits of a 64-bit address, used in a MOVZ or MOVK instruction
878 MO_G3 = 3,
879
880 /// MO_G2 - A symbol operand with this flag (granule 2) represents the bits
881 /// 32-47 of a 64-bit address, used in a MOVZ or MOVK instruction
882 MO_G2 = 4,
883
884 /// MO_G1 - A symbol operand with this flag (granule 1) represents the bits
885 /// 16-31 of a 64-bit address, used in a MOVZ or MOVK instruction
886 MO_G1 = 5,
887
888 /// MO_G0 - A symbol operand with this flag (granule 0) represents the bits
889 /// 0-15 of a 64-bit address, used in a MOVZ or MOVK instruction
890 MO_G0 = 6,
891
892 /// MO_HI12 - This flag indicates that a symbol operand represents the bits
893 /// 13-24 of a 64-bit address, used in a arithmetic immediate-shifted-left-
894 /// by-12-bits instruction.
896
897 /// MO_COFFSTUB - On a symbol operand "FOO", this indicates that the
898 /// reference is actually to the ".refptr.FOO" symbol. This is used for
899 /// stub symbols on windows.
901
902 /// MO_GOT - This flag indicates that a symbol operand represents the
903 /// address of the GOT entry for the symbol, rather than the address of
904 /// the symbol itself.
905 MO_GOT = 0x10,
906
907 /// MO_NC - Indicates whether the linker is expected to check the symbol
908 /// reference for overflow. For example in an ADRP/ADD pair of relocations
909 /// the ADRP usually does check, but not the ADD.
910 MO_NC = 0x20,
911
912 /// MO_TLS - Indicates that the operand being accessed is some kind of
913 /// thread-local symbol. On Darwin, only one type of thread-local access
914 /// exists (pre linker-relaxation), but on ELF the TLSModel used for the
915 /// referee will affect interpretation.
916 MO_TLS = 0x40,
917
918 /// MO_DLLIMPORT - On a symbol operand, this represents that the reference
919 /// to the symbol is for an import stub. This is used for DLL import
920 /// storage class indication on Windows.
922
923 /// MO_S - Indicates that the bits of the symbol operand represented by
924 /// MO_G0 etc are signed.
925 MO_S = 0x100,
926
927 /// MO_PREL - Indicates that the bits of the symbol operand represented by
928 /// MO_G0 etc are PC relative.
929 MO_PREL = 0x200,
930
931 /// MO_TAGGED - With MO_PAGE, indicates that the page includes a memory tag
932 /// in bits 56-63.
933 /// On a FrameIndex operand, indicates that the underlying memory is tagged
934 /// with an unknown tag value (MTE); this needs to be lowered either to an
935 /// SP-relative load or store instruction (which do not check tags), or to
936 /// an LDG instruction to obtain the tag value.
937 MO_TAGGED = 0x400,
938
939 /// MO_ARM64EC_CALLMANGLE - Operand refers to the Arm64EC-mangled version
940 /// of a symbol, not the original. For dllimport symbols, this means it
941 /// uses "__imp_aux". For other symbols, this means it uses the mangled
942 /// ("#" prefix for C) name.
944};
945} // end namespace AArch64II
946
947//===----------------------------------------------------------------------===//
948// v8.3a Pointer Authentication
949//
950
951namespace AArch64PACKey {
952enum ID : uint8_t {
953 IA = 0,
954 IB = 1,
955 DA = 2,
956 DB = 3,
958};
959} // namespace AArch64PACKey
960
961/// Return 2-letter identifier string for numeric key ID.
963 switch (KeyID) {
965 return StringRef("ia");
967 return StringRef("ib");
969 return StringRef("da");
971 return StringRef("db");
972 }
973 llvm_unreachable("Unhandled AArch64PACKey::ID enum");
974}
975
976/// Return numeric key ID for 2-letter identifier string.
977inline static std::optional<AArch64PACKey::ID>
979 if (Name == "ia")
980 return AArch64PACKey::IA;
981 if (Name == "ib")
982 return AArch64PACKey::IB;
983 if (Name == "da")
984 return AArch64PACKey::DA;
985 if (Name == "db")
986 return AArch64PACKey::DB;
987 return std::nullopt;
988}
989
990namespace AArch64 {
991// The number of bits in a SVE register is architecturally defined
992// to be a multiple of this value. If <M x t> has this number of bits,
993// a <n x M x t> vector can be stored in a SVE register without any
994// redundant bits. If <M x t> has this number of bits divided by P,
995// a <n x M x t> vector is stored in a SVE register by placing index i
996// in index i*P of a <n x (M*P) x t> vector. The other elements of the
997// <n x (M*P) x t> vector (such as index 1) are undefined.
998static constexpr unsigned SVEBitsPerBlock = 128;
999static constexpr unsigned SVEMaxBitsPerVector = 2048;
1000} // end namespace AArch64
1001} // end namespace llvm
1002
1003#endif
#define LLVM_DECLARE_ENUM_AS_BITMASK(Enum, LargestValue)
LLVM_DECLARE_ENUM_AS_BITMASK can be used to declare an enum type as a bit set, so that bitwise operat...
Definition BitmaskEnum.h:67
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
Register Reg
This file contains some templates that are useful if you are working with the STL at all.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Container class for subtarget features.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:33
constexpr unsigned id() const
Definition MCRegister.h:74
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static bool isValidCBCond(AArch64CC::CondCode Code)
True, if a given condition code can be used in a fused compare-and-branch instructions,...
static CondCode getSwappedCondition(CondCode CC)
getSwappedCondition - assume the flags are set by MI(a,b), return the condition code if we modify the...
static const char * getCondCodeName(CondCode Code)
static CondCode getInvertedCondCode(CondCode Code)
static unsigned getNZCVToSatisfyCondCode(CondCode Code)
Given a condition code, return NZCV flags that would satisfy that condition.
TOF
Target Operand Flag enum.
@ MO_DLLIMPORT
MO_DLLIMPORT - On a symbol operand, this represents that the reference to the symbol is for an import...
@ MO_NC
MO_NC - Indicates whether the linker is expected to check the symbol reference for overflow.
@ MO_G1
MO_G1 - A symbol operand with this flag (granule 1) represents the bits 16-31 of a 64-bit address,...
@ MO_S
MO_S - Indicates that the bits of the symbol operand represented by MO_G0 etc are signed.
@ MO_PAGEOFF
MO_PAGEOFF - A symbol operand with this flag represents the offset of that symbol within a 4K page.
@ MO_GOT
MO_GOT - This flag indicates that a symbol operand represents the address of the GOT entry for the sy...
@ MO_PREL
MO_PREL - Indicates that the bits of the symbol operand represented by MO_G0 etc are PC relative.
@ MO_G0
MO_G0 - A symbol operand with this flag (granule 0) represents the bits 0-15 of a 64-bit address,...
@ MO_ARM64EC_CALLMANGLE
MO_ARM64EC_CALLMANGLE - Operand refers to the Arm64EC-mangled version of a symbol,...
@ MO_PAGE
MO_PAGE - A symbol operand with this flag represents the pc-relative offset of the 4K page containing...
@ MO_HI12
MO_HI12 - This flag indicates that a symbol operand represents the bits 13-24 of a 64-bit address,...
@ MO_TLS
MO_TLS - Indicates that the operand being accessed is some kind of thread-local symbol.
@ MO_G2
MO_G2 - A symbol operand with this flag (granule 2) represents the bits 32-47 of a 64-bit address,...
@ MO_TAGGED
MO_TAGGED - With MO_PAGE, indicates that the page includes a memory tag in bits 56-63.
@ MO_G3
MO_G3 - A symbol operand with this flag (granule 3) represents the high 16-bits of a 64-bit address,...
@ MO_COFFSTUB
MO_COFFSTUB - On a symbol operand "FOO", this indicates that the reference is actually to the "....
const PHint * lookupPHintByName(StringRef)
const PHint * lookupPHintByEncoding(uint16_t)
uint32_t parseGenericRegister(StringRef Name)
std::string genericRegisterString(uint32_t Bits)
static constexpr unsigned SVEMaxBitsPerVector
static constexpr unsigned SVEBitsPerBlock
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
static std::optional< AArch64PACKey::ID > AArch64StringToPACKeyID(StringRef Name)
Return numeric key ID for 2-letter identifier string.
TailFoldingOpts
An enum to describe what types of loops we should attempt to tail-fold: Disabled: None Reductions: Lo...
static AArch64Layout::VectorLayout AArch64StringToVectorLayout(StringRef LayoutStr)
static const char * AArch64VectorLayoutToString(AArch64Layout::VectorLayout Layout)
std::optional< unsigned > getSVEPredPatternFromNumElements(unsigned MinNumElts)
Return specific VL predicate pattern based on the number of elements.
static bool atomicBarrierDroppedOnZero(unsigned Opcode)
static MCRegister getXRegFromWReg(MCRegister Reg)
static MCRegister getXRegFromXRegTuple(MCRegister RegTuple)
static MCRegister getWRegFromXReg(MCRegister Reg)
unsigned getNumElementsFromSVEPredPattern(unsigned Pattern)
Return the number of active elements for VL1 to VL256 predicate pattern, zero for all other patterns.
static MCRegister getDRegFromBReg(MCRegister Reg)
static MCRegister getBRegFromDReg(MCRegister Reg)
static StringRef AArch64PACKeyIDToString(AArch64PACKey::ID KeyID)
Return 2-letter identifier string for numeric key ID.
#define N
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAliasImm(const char *N, uint16_t E, uint16_t I)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAliasReg(const char *N, uint16_t E, bool R)
constexpr SysAliasReg(const char *N, uint16_t E, bool R)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAliasReg(const char *N, uint16_t E, bool R)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAliasReg(const char *N, uint16_t E, bool R)
bool haveFeatures(FeatureBitset ActiveFeatures) const
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAlias(const char *N, uint16_t E)
bool haveFeatures(FeatureBitset ActiveFeatures) const
constexpr SysAliasOptionalReg(const char *N, uint16_t E, bool R, bool O)
constexpr SysAliasOptionalReg(const char *N, uint16_t E, bool R, bool O)
constexpr SysAlias(const char *N, uint16_t E)
constexpr SysAliasImm(const char *N, uint16_t E, uint16_t I)
constexpr SysAliasImm(const char *N, uint16_t E, uint16_t I, FeatureBitset F)
constexpr SysAliasOptionalReg(const char *N, uint16_t E, bool R, bool O, FeatureBitset F)
constexpr SysAliasOptionalReg(const char *N, uint16_t E, bool R, bool O)
constexpr SysAliasReg(const char *N, uint16_t E, bool R, FeatureBitset F)
constexpr SysAliasReg(const char *N, uint16_t E, bool R)
bool haveFeatures(FeatureBitset ActiveFeatures) const
constexpr SysAlias(const char *N, uint16_t E)
FeatureBitset getRequiredFeatures() const
const char * Name
FeatureBitset FeaturesRequired
constexpr SysAlias(const char *N, uint16_t E, FeatureBitset F)