LLVM 22.0.0git
AArch64BaseInfo.cpp
Go to the documentation of this file.
1//===-- AArch64BaseInfo.cpp - AArch64 Base encoding information------------===//
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 provides basic encoding and assembly information for AArch64.
10//
11//===----------------------------------------------------------------------===//
12#include "AArch64BaseInfo.h"
15#include "llvm/Support/Regex.h"
16
17using namespace llvm;
18
19namespace llvm {
20 namespace AArch64AT {
21#define GET_ATsList_IMPL
22#include "AArch64GenSystemOperands.inc"
23 }
24}
25
26
27namespace llvm {
28 namespace AArch64DBnXS {
29#define GET_DBnXSsList_IMPL
30#include "AArch64GenSystemOperands.inc"
31 }
32}
33
34namespace llvm {
35 namespace AArch64DB {
36#define GET_DBsList_IMPL
37#include "AArch64GenSystemOperands.inc"
38 }
39}
40
41namespace llvm {
42 namespace AArch64DC {
43#define GET_DCsList_IMPL
44#include "AArch64GenSystemOperands.inc"
45 }
46}
47
48namespace llvm {
49 namespace AArch64IC {
50#define GET_ICsList_IMPL
51#include "AArch64GenSystemOperands.inc"
52 }
53}
54
55namespace llvm {
56 namespace AArch64ISB {
57#define GET_ISBsList_IMPL
58#include "AArch64GenSystemOperands.inc"
59 }
60}
61
62namespace llvm {
63 namespace AArch64TSB {
64#define GET_TSBsList_IMPL
65#include "AArch64GenSystemOperands.inc"
66 }
67}
68
69namespace llvm {
70 namespace AArch64PRFM {
71#define GET_PRFMsList_IMPL
72#include "AArch64GenSystemOperands.inc"
73 }
74}
75
76namespace llvm {
77 namespace AArch64SVEPRFM {
78#define GET_SVEPRFMsList_IMPL
79#include "AArch64GenSystemOperands.inc"
80 }
81}
82
83namespace llvm {
84 namespace AArch64RPRFM {
85#define GET_RPRFMsList_IMPL
86#include "AArch64GenSystemOperands.inc"
87 } // namespace AArch64RPRFM
88} // namespace llvm
89
90namespace llvm {
92#define GET_SVEPREDPATsList_IMPL
93#include "AArch64GenSystemOperands.inc"
94 }
95}
96
97namespace llvm {
99#define GET_SVEVECLENSPECIFIERsList_IMPL
100#include "AArch64GenSystemOperands.inc"
101} // namespace AArch64SVEVecLenSpecifier
102} // namespace llvm
103
104namespace llvm {
106#define GET_ExactFPImmsList_IMPL
107#include "AArch64GenSystemOperands.inc"
108 }
109}
110
111namespace llvm {
112 namespace AArch64PState {
113#define GET_PStateImm0_15sList_IMPL
114#include "AArch64GenSystemOperands.inc"
115#define GET_PStateImm0_1sList_IMPL
116#include "AArch64GenSystemOperands.inc"
117 }
118}
119
120namespace llvm {
121 namespace AArch64PSBHint {
122#define GET_PSBsList_IMPL
123#include "AArch64GenSystemOperands.inc"
124 }
125}
126
127namespace llvm {
128namespace AArch64PHint {
129#define GET_PHintsList_IMPL
130#include "AArch64GenSystemOperands.inc"
131} // namespace AArch64PHint
132} // namespace llvm
133
134namespace llvm {
135 namespace AArch64BTIHint {
136#define GET_BTIsList_IMPL
137#include "AArch64GenSystemOperands.inc"
138 }
139}
140
141namespace llvm {
143#define GET_CMHPRIORITYHINT_IMPL
144#include "AArch64GenSystemOperands.inc"
145} // namespace AArch64CMHPriorityHint
146} // namespace llvm
147
148namespace llvm {
150#define GET_TINDEX_IMPL
151#include "AArch64GenSystemOperands.inc"
152} // namespace AArch64TIndexHint
153} // namespace llvm
154
155namespace llvm {
156 namespace AArch64SysReg {
157#define GET_SysRegsList_IMPL
158#include "AArch64GenSystemOperands.inc"
159 }
160}
161
163 // Try to parse an S<op0>_<op1>_<Cn>_<Cm>_<op2> register name
164 static const Regex GenericRegPattern("^S([0-3])_([0-7])_C([0-9]|1[0-5])_C([0-9]|1[0-5])_([0-7])$");
165
166 std::string UpperName = Name.upper();
168 if (!GenericRegPattern.match(UpperName, &Ops))
169 return -1;
170
171 uint32_t Op0 = 0, Op1 = 0, CRn = 0, CRm = 0, Op2 = 0;
172 uint32_t Bits;
173 Ops[1].getAsInteger(10, Op0);
174 Ops[2].getAsInteger(10, Op1);
175 Ops[3].getAsInteger(10, CRn);
176 Ops[4].getAsInteger(10, CRm);
177 Ops[5].getAsInteger(10, Op2);
178 Bits = (Op0 << 14) | (Op1 << 11) | (CRn << 7) | (CRm << 3) | Op2;
179
180 return Bits;
181}
182
184 assert(Bits < 0x10000);
185 uint32_t Op0 = (Bits >> 14) & 0x3;
186 uint32_t Op1 = (Bits >> 11) & 0x7;
187 uint32_t CRn = (Bits >> 7) & 0xf;
188 uint32_t CRm = (Bits >> 3) & 0xf;
189 uint32_t Op2 = Bits & 0x7;
190
191 return "S" + utostr(Op0) + "_" + utostr(Op1) + "_C" + utostr(CRn) + "_C" +
192 utostr(CRm) + "_" + utostr(Op2);
193}
194
195namespace llvm {
196namespace AArch64TLBI {
197#define GET_TLBITable_IMPL
198#include "AArch64GenSystemOperands.inc"
199} // namespace AArch64TLBI
200} // namespace llvm
201
202namespace llvm {
203namespace AArch64PLBI {
204#define GET_PLBITable_IMPL
205#include "AArch64GenSystemOperands.inc"
206} // namespace AArch64PLBI
207} // namespace llvm
208
209namespace llvm {
210namespace AArch64TLBIP {
211#define GET_TLBIPTable_IMPL
212#include "AArch64GenSystemOperands.inc"
213} // namespace AArch64TLBIP
214
215namespace AArch64MLBI {
216#define GET_MLBITable_IMPL
217#include "AArch64GenSystemOperands.inc"
218} // namespace AArch64MLBI
219} // namespace llvm
220
221namespace llvm {
222namespace AArch64GIC {
223#define GET_GICTable_IMPL
224#include "AArch64GenSystemOperands.inc"
225} // namespace AArch64GIC
226} // namespace llvm
227
228namespace llvm {
229namespace AArch64GICR {
230#define GET_GICRTable_IMPL
231#include "AArch64GenSystemOperands.inc"
232} // namespace AArch64GICR
233} // namespace llvm
234
235namespace llvm {
236namespace AArch64GSB {
237#define GET_GSBTable_IMPL
238#include "AArch64GenSystemOperands.inc"
239} // namespace AArch64GSB
240} // namespace llvm
241
242namespace llvm {
243 namespace AArch64SVCR {
244#define GET_SVCRsList_IMPL
245#include "AArch64GenSystemOperands.inc"
246 }
247}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
This file defines the SmallVector class.
This file contains some functions that are useful when dealing with strings.
LLVM_ABI bool match(StringRef String, SmallVectorImpl< StringRef > *Matches=nullptr, std::string *Error=nullptr) const
matches - Match the regex against a given String.
Definition Regex.cpp:83
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
uint32_t parseGenericRegister(StringRef Name)
std::string genericRegisterString(uint32_t Bits)
This is an optimization pass for GlobalISel generic memory operations.
std::string utostr(uint64_t X, bool isNeg=false)