1 //===-- ARMBaseInfo.h - Top level definitions for ARM ---*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file contains small standalone helper functions and enum definitions for
10 // the ARM 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..
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_LIB_TARGET_ARM_UTILS_ARMBASEINFO_H
17 #define LLVM_LIB_TARGET_ARM_UTILS_ARMBASEINFO_H
19 #include "llvm/ADT/StringSwitch.h"
20 #include "llvm/Support/ErrorHandling.h"
21 #include "llvm/MC/SubtargetFeature.h"
22 #include "MCTargetDesc/ARMMCTargetDesc.h"
26 // Enums corresponding to ARM condition codes
28 // The CondCodes constants map directly to the 4-bit encoding of the
29 // condition field for predicated instructions.
30 enum CondCodes
{ // Meaning (integer) Meaning (floating-point)
32 NE
, // Not equal Not equal, or unordered
33 HS
, // Carry set >, ==, or unordered
34 LO
, // Carry clear Less than
35 MI
, // Minus, negative Less than
36 PL
, // Plus, positive or zero >, ==, or unordered
37 VS
, // Overflow Unordered
38 VC
, // No overflow Not unordered
39 HI
, // Unsigned higher Greater than, or unordered
40 LS
, // Unsigned lower or same Less than or equal
41 GE
, // Greater than or equal Greater than or equal
42 LT
, // Less than Less than, or unordered
43 GT
, // Greater than Greater than
44 LE
, // Less than or equal <, ==, or unordered
45 AL
// Always (unconditional) Always (unconditional)
48 inline static CondCodes
getOppositeCondition(CondCodes CC
) {
50 default: llvm_unreachable("Unknown condition code");
68 /// getSwappedCondition - assume the flags are set by MI(a,b), return
69 /// the condition code if we modify the instructions such that flags are
71 inline static ARMCC::CondCodes
getSwappedCondition(ARMCC::CondCodes CC
) {
73 default: return ARMCC::AL
;
74 case ARMCC::EQ
: return ARMCC::EQ
;
75 case ARMCC::NE
: return ARMCC::NE
;
76 case ARMCC::HS
: return ARMCC::LS
;
77 case ARMCC::LO
: return ARMCC::HI
;
78 case ARMCC::HI
: return ARMCC::LO
;
79 case ARMCC::LS
: return ARMCC::HS
;
80 case ARMCC::GE
: return ARMCC::LE
;
81 case ARMCC::LT
: return ARMCC::GT
;
82 case ARMCC::GT
: return ARMCC::LT
;
83 case ARMCC::LE
: return ARMCC::GE
;
86 } // end namespace ARMCC
97 /// Mask values for IT and VPT Blocks, to be used by MCOperands.
98 /// Note that this is different from the "real" encoding used by the
99 /// instructions. In this encoding, the lowest set bit indicates the end of
100 /// the encoding, and above that, "1" indicates an else, while "0" indicates
105 enum class PredBlockMask
{
124 // Expands a PredBlockMask by adding an E or a T at the end, depending on Kind.
125 // e.g ExpandPredBlockMask(T, Then) = TT, ExpandPredBlockMask(TT, Else) = TTE,
127 ARM::PredBlockMask
expandPredBlockMask(ARM::PredBlockMask BlockMask
,
128 ARMVCC::VPTCodes Kind
);
130 inline static const char *ARMVPTPredToString(ARMVCC::VPTCodes CC
) {
132 case ARMVCC::None
: return "none";
133 case ARMVCC::Then
: return "t";
134 case ARMVCC::Else
: return "e";
136 llvm_unreachable("Unknown VPT code");
139 inline static unsigned ARMVectorCondCodeFromString(StringRef CC
) {
140 return StringSwitch
<unsigned>(CC
.lower())
141 .Case("t", ARMVCC::Then
)
142 .Case("e", ARMVCC::Else
)
146 inline static const char *ARMCondCodeToString(ARMCC::CondCodes CC
) {
148 case ARMCC::EQ
: return "eq";
149 case ARMCC::NE
: return "ne";
150 case ARMCC::HS
: return "hs";
151 case ARMCC::LO
: return "lo";
152 case ARMCC::MI
: return "mi";
153 case ARMCC::PL
: return "pl";
154 case ARMCC::VS
: return "vs";
155 case ARMCC::VC
: return "vc";
156 case ARMCC::HI
: return "hi";
157 case ARMCC::LS
: return "ls";
158 case ARMCC::GE
: return "ge";
159 case ARMCC::LT
: return "lt";
160 case ARMCC::GT
: return "gt";
161 case ARMCC::LE
: return "le";
162 case ARMCC::AL
: return "al";
164 llvm_unreachable("Unknown condition code");
167 inline static unsigned ARMCondCodeFromString(StringRef CC
) {
168 return StringSwitch
<unsigned>(CC
.lower())
169 .Case("eq", ARMCC::EQ
)
170 .Case("ne", ARMCC::NE
)
171 .Case("hs", ARMCC::HS
)
172 .Case("cs", ARMCC::HS
)
173 .Case("lo", ARMCC::LO
)
174 .Case("cc", ARMCC::LO
)
175 .Case("mi", ARMCC::MI
)
176 .Case("pl", ARMCC::PL
)
177 .Case("vs", ARMCC::VS
)
178 .Case("vc", ARMCC::VC
)
179 .Case("hi", ARMCC::HI
)
180 .Case("ls", ARMCC::LS
)
181 .Case("ge", ARMCC::GE
)
182 .Case("lt", ARMCC::LT
)
183 .Case("gt", ARMCC::GT
)
184 .Case("le", ARMCC::LE
)
185 .Case("al", ARMCC::AL
)
190 namespace ARMSysReg
{
191 struct MClassSysReg
{
193 uint16_t M1Encoding12
;
194 uint16_t M2M3Encoding8
;
196 FeatureBitset FeaturesRequired
;
198 // return true if FeaturesRequired are all present in ActiveFeatures
199 bool hasRequiredFeatures(FeatureBitset ActiveFeatures
) const {
200 return (FeaturesRequired
& ActiveFeatures
) == FeaturesRequired
;
203 // returns true if TestFeatures are all present in FeaturesRequired
204 bool isInRequiredFeatures(FeatureBitset TestFeatures
) const {
205 return (FeaturesRequired
& TestFeatures
) == TestFeatures
;
209 #define GET_MCLASSSYSREG_DECL
210 #include "ARMGenSystemRegister.inc"
212 // lookup system register using 12-bit SYSm value.
213 // Note: the search is uniqued using M1 mask
214 const MClassSysReg
*lookupMClassSysRegBy12bitSYSmValue(unsigned SYSm
);
216 // returns APSR with _<bits> qualifier.
217 // Note: ARMv7-M deprecates using MSR APSR without a _<bits> qualifier
218 const MClassSysReg
*lookupMClassSysRegAPSRNonDeprecated(unsigned SYSm
);
220 // lookup system registers using 8-bit SYSm value
221 const MClassSysReg
*lookupMClassSysRegBy8bitSYSmValue(unsigned SYSm
);
223 } // end namespace ARMSysReg
226 namespace ARMBankedReg
{
231 #define GET_BANKEDREG_DECL
232 #include "ARMGenSystemRegister.inc"
233 } // end namespace ARMBankedReg
235 } // end namespace llvm
237 #endif // LLVM_LIB_TARGET_ARM_UTILS_ARMBASEINFO_H