Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit 65d41d8

Browse files
committed
[ARM] Tidy up banked registers encoding
Moves encoding (SYSm) information of banked registers to ARMSystemRegister.td, where it rightly belongs and forms a single point of reference in the code. Reviewed by: @fhahn, @rovka, @olista01 Differential Revision: https://reviews.llvm.org/D36219 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309910 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent ca9f2fd commit 65d41d8

File tree

5 files changed

+74
-77
lines changed

5 files changed

+74
-77
lines changed

lib/Target/ARM/ARMISelDAGToDAG.cpp

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3765,41 +3765,10 @@ static void getIntOperandsFromRegisterString(StringRef RegString,
37653765
// which mode it is to be used, e.g. usr. Returns -1 to signify that the string
37663766
// was invalid.
37673767
static inline int getBankedRegisterMask(StringRef RegString) {
3768-
return StringSwitch<int>(RegString.lower())
3769-
.Case("r8_usr", 0x00)
3770-
.Case("r9_usr", 0x01)
3771-
.Case("r10_usr", 0x02)
3772-
.Case("r11_usr", 0x03)
3773-
.Case("r12_usr", 0x04)
3774-
.Case("sp_usr", 0x05)
3775-
.Case("lr_usr", 0x06)
3776-
.Case("r8_fiq", 0x08)
3777-
.Case("r9_fiq", 0x09)
3778-
.Case("r10_fiq", 0x0a)
3779-
.Case("r11_fiq", 0x0b)
3780-
.Case("r12_fiq", 0x0c)
3781-
.Case("sp_fiq", 0x0d)
3782-
.Case("lr_fiq", 0x0e)
3783-
.Case("lr_irq", 0x10)
3784-
.Case("sp_irq", 0x11)
3785-
.Case("lr_svc", 0x12)
3786-
.Case("sp_svc", 0x13)
3787-
.Case("lr_abt", 0x14)
3788-
.Case("sp_abt", 0x15)
3789-
.Case("lr_und", 0x16)
3790-
.Case("sp_und", 0x17)
3791-
.Case("lr_mon", 0x1c)
3792-
.Case("sp_mon", 0x1d)
3793-
.Case("elr_hyp", 0x1e)
3794-
.Case("sp_hyp", 0x1f)
3795-
.Case("spsr_fiq", 0x2e)
3796-
.Case("spsr_irq", 0x30)
3797-
.Case("spsr_svc", 0x32)
3798-
.Case("spsr_abt", 0x34)
3799-
.Case("spsr_und", 0x36)
3800-
.Case("spsr_mon", 0x3c)
3801-
.Case("spsr_hyp", 0x3e)
3802-
.Default(-1);
3768+
auto TheReg = ARMBankedReg::lookupBankedRegByName(RegString.lower());
3769+
if (!TheReg)
3770+
return -1;
3771+
return TheReg->Encoding;
38033772
}
38043773

38053774
// The flags here are common to those allowed for apsr in the A class cores and

lib/Target/ARM/ARMSystemRegister.td

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,51 @@ let Requires = [{ {ARM::Feature8MSecExt} }] in {
106106
def : MClassSysReg<0, 0, 1, 0x894, "control_ns">;
107107
def : MClassSysReg<0, 0, 1, 0x898, "sp_ns">;
108108
}
109+
110+
111+
// Banked Registers
112+
//
113+
class BankedReg<string name, bits<8> enc>
114+
: SearchableTable {
115+
string Name;
116+
bits<8> Encoding;
117+
let Name = name;
118+
let Encoding = enc;
119+
let SearchableFields = ["Name", "Encoding"];
120+
}
121+
122+
// The values here come from B9.2.3 of the ARM ARM, where bits 4-0 are SysM
123+
// and bit 5 is R.
124+
def : BankedReg<"r8_usr", 0x00>;
125+
def : BankedReg<"r9_usr", 0x01>;
126+
def : BankedReg<"r10_usr", 0x02>;
127+
def : BankedReg<"r11_usr", 0x03>;
128+
def : BankedReg<"r12_usr", 0x04>;
129+
def : BankedReg<"sp_usr", 0x05>;
130+
def : BankedReg<"lr_usr", 0x06>;
131+
def : BankedReg<"r8_fiq", 0x08>;
132+
def : BankedReg<"r9_fiq", 0x09>;
133+
def : BankedReg<"r10_fiq", 0x0a>;
134+
def : BankedReg<"r11_fiq", 0x0b>;
135+
def : BankedReg<"r12_fiq", 0x0c>;
136+
def : BankedReg<"sp_fiq", 0x0d>;
137+
def : BankedReg<"lr_fiq", 0x0e>;
138+
def : BankedReg<"lr_irq", 0x10>;
139+
def : BankedReg<"sp_irq", 0x11>;
140+
def : BankedReg<"lr_svc", 0x12>;
141+
def : BankedReg<"sp_svc", 0x13>;
142+
def : BankedReg<"lr_abt", 0x14>;
143+
def : BankedReg<"sp_abt", 0x15>;
144+
def : BankedReg<"lr_und", 0x16>;
145+
def : BankedReg<"sp_und", 0x17>;
146+
def : BankedReg<"lr_mon", 0x1c>;
147+
def : BankedReg<"sp_mon", 0x1d>;
148+
def : BankedReg<"elr_hyp", 0x1e>;
149+
def : BankedReg<"sp_hyp", 0x1f>;
150+
def : BankedReg<"spsr_fiq", 0x2e>;
151+
def : BankedReg<"spsr_irq", 0x30>;
152+
def : BankedReg<"spsr_svc", 0x32>;
153+
def : BankedReg<"spsr_abt", 0x34>;
154+
def : BankedReg<"spsr_und", 0x36>;
155+
def : BankedReg<"spsr_mon", 0x3c>;
156+
def : BankedReg<"spsr_hyp", 0x3e>;

lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4175,46 +4175,10 @@ ARMAsmParser::parseBankedRegOperand(OperandVector &Operands) {
41754175
return MatchOperand_NoMatch;
41764176
StringRef RegName = Tok.getString();
41774177

4178-
// The values here come from B9.2.3 of the ARM ARM, where bits 4-0 are SysM
4179-
// and bit 5 is R.
4180-
unsigned Encoding = StringSwitch<unsigned>(RegName.lower())
4181-
.Case("r8_usr", 0x00)
4182-
.Case("r9_usr", 0x01)
4183-
.Case("r10_usr", 0x02)
4184-
.Case("r11_usr", 0x03)
4185-
.Case("r12_usr", 0x04)
4186-
.Case("sp_usr", 0x05)
4187-
.Case("lr_usr", 0x06)
4188-
.Case("r8_fiq", 0x08)
4189-
.Case("r9_fiq", 0x09)
4190-
.Case("r10_fiq", 0x0a)
4191-
.Case("r11_fiq", 0x0b)
4192-
.Case("r12_fiq", 0x0c)
4193-
.Case("sp_fiq", 0x0d)
4194-
.Case("lr_fiq", 0x0e)
4195-
.Case("lr_irq", 0x10)
4196-
.Case("sp_irq", 0x11)
4197-
.Case("lr_svc", 0x12)
4198-
.Case("sp_svc", 0x13)
4199-
.Case("lr_abt", 0x14)
4200-
.Case("sp_abt", 0x15)
4201-
.Case("lr_und", 0x16)
4202-
.Case("sp_und", 0x17)
4203-
.Case("lr_mon", 0x1c)
4204-
.Case("sp_mon", 0x1d)
4205-
.Case("elr_hyp", 0x1e)
4206-
.Case("sp_hyp", 0x1f)
4207-
.Case("spsr_fiq", 0x2e)
4208-
.Case("spsr_irq", 0x30)
4209-
.Case("spsr_svc", 0x32)
4210-
.Case("spsr_abt", 0x34)
4211-
.Case("spsr_und", 0x36)
4212-
.Case("spsr_mon", 0x3c)
4213-
.Case("spsr_hyp", 0x3e)
4214-
.Default(~0U);
4215-
4216-
if (Encoding == ~0U)
4178+
auto TheReg = ARMBankedReg::lookupBankedRegByName(RegName.lower());
4179+
if (!TheReg)
42174180
return MatchOperand_NoMatch;
4181+
unsigned Encoding = TheReg->Encoding;
42184182

42194183
Parser.Lex(); // Eat identifier token.
42204184
Operands.push_back(ARMOperand::CreateBankedReg(Encoding, S));

lib/Target/ARM/Utils/ARMBaseInfo.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
using namespace llvm;
2020
namespace llvm {
21-
namespace ARMSysReg {
21+
namespace ARMSysReg {
2222

2323
// lookup system register using 12-bit SYSm value.
2424
// Note: the search is uniqued using M1 mask
@@ -40,5 +40,10 @@ const MClassSysReg *lookupMClassSysRegBy8bitSYSmValue(unsigned SYSm) {
4040
#define GET_MCLASSSYSREG_IMPL
4141
#include "ARMGenSystemRegister.inc"
4242

43-
}
44-
}
43+
} // end namespace ARMSysReg
44+
45+
namespace ARMBankedReg {
46+
#define GET_BANKEDREG_IMPL
47+
#include "ARMGenSystemRegister.inc"
48+
} // end namespce ARMSysReg
49+
} // end namespace llvm

lib/Target/ARM/Utils/ARMBaseInfo.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
namespace llvm {
2626

27+
// System Registers
2728
namespace ARMSysReg {
2829
struct MClassSysReg {
2930
const char *Name;
@@ -59,6 +60,16 @@ namespace ARMSysReg {
5960

6061
} // end namespace ARMSysReg
6162

63+
// Banked Registers
64+
namespace ARMBankedReg {
65+
struct BankedReg {
66+
const char *Name;
67+
uint16_t Encoding;
68+
};
69+
#define GET_BANKEDREG_DECL
70+
#include "ARMGenSystemRegister.inc"
71+
} // end namespace ARMBankedReg
72+
6273
} // end namespace llvm
6374

6475
#endif // LLVM_LIB_TARGET_ARM_UTILS_ARMBASEINFO_H

0 commit comments

Comments
 (0)