Skip to content

Commit cd44215

Browse files
committed
[M68k] Convert register Aliases to AltNames
This makes it simpler to determine when two registers are actually the same vs just partially aliasing. The only real caveat is that it becomes impossible to know which name was used for the register previously. (i.e. parsing assembly and then disassembling it can result in the register name changing.) Differential Revision: https://reviews.llvm.org/D98536
1 parent 51884c6 commit cd44215

File tree

2 files changed

+42
-46
lines changed

2 files changed

+42
-46
lines changed

llvm/lib/Target/M68k/M68kRegisterInfo.td

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515

1616
class MxReg<string N, bits<16> ENC,
1717
list<Register> SUBREGS = [], list<SubRegIndex> SUBIDX,
18-
list<int> DWREGS = []>
19-
: Register<N>, DwarfRegNum<DWREGS> {
18+
list<int> DWREGS = [], list<string> ALTNAMES = []>
19+
: Register<N, ALTNAMES>, DwarfRegNum<DWREGS> {
2020
let Namespace = "M68k";
2121
let HWEncoding = ENC;
2222
let SubRegs = SUBREGS;
@@ -29,46 +29,45 @@ let Namespace = "M68k" in {
2929
def MxSubRegIndex16Lo : SubRegIndex<16, 0>;
3030
}
3131

32-
// Generate Data registers and theirs smaller variants
33-
foreach Index = 0-7 in {
34-
def "BD"#Index : MxReg<"d"#Index, Index, [], [], [Index]>;
35-
36-
def "WD"#Index
37-
: MxReg<"d"#Index, Index,
38-
[!cast<Register>("BD"#Index)], [MxSubRegIndex8Lo],
39-
[Index]>;
40-
41-
def "D"#Index
42-
: MxReg<"d"#Index, Index,
43-
[!cast<Register>("WD"#Index)], [MxSubRegIndex16Lo],
44-
[Index]>;
45-
46-
} // foreach
47-
48-
// Generate Address registers and theirs smaller variants
49-
foreach Index = 0-7 in {
50-
def "WA"#Index
51-
: MxReg<"a"#Index, Index, [], [], [!add(8,Index)]>;
52-
53-
def "A"#Index
54-
: MxReg<"a"#Index, Index,
55-
[!cast<Register>("WA"#Index)], [MxSubRegIndex16Lo],
56-
[!add(8,Index)]>;
32+
multiclass MxDataRegister<int INDEX, string REG_NAME, list<string> ALTNAMES = []> {
33+
def "B"#NAME : MxReg<REG_NAME, INDEX, [], [], [INDEX], ALTNAMES>;
34+
def "W"#NAME
35+
: MxReg<REG_NAME, INDEX,
36+
[!cast<Register>("B"#NAME)], [MxSubRegIndex8Lo],
37+
[INDEX], ALTNAMES>;
38+
def NAME
39+
: MxReg<REG_NAME, INDEX,
40+
[!cast<Register>("W"#NAME)], [MxSubRegIndex16Lo],
41+
[INDEX], ALTNAMES>;
5742
}
5843

59-
// Alias Registers
60-
class MxAliasReg<string N, MxReg REG>
61-
: MxReg<N, REG.HWEncoding, [], [], REG.DwarfNumbers> {
62-
let Aliases = [REG];
44+
multiclass MxAddressRegister<int INDEX, string REG_NAME, list<string> ALTNAMES = []> {
45+
def "W"#NAME
46+
: MxReg<REG_NAME, INDEX, [], [], [!add(8,INDEX)], ALTNAMES>;
47+
def NAME
48+
: MxReg<REG_NAME, INDEX,
49+
[!cast<Register>("W"#NAME)], [MxSubRegIndex16Lo],
50+
[!add(8,INDEX)], ALTNAMES>;
6351
}
6452

65-
def BP : MxAliasReg<"bp", A5>;
66-
def FP : MxAliasReg<"fp", A6>;
67-
def SP : MxAliasReg<"sp", A7>;
53+
defm D0 : MxDataRegister<0, "d0">;
54+
defm D1 : MxDataRegister<1, "d1">;
55+
defm D2 : MxDataRegister<2, "d2">;
56+
defm D3 : MxDataRegister<3, "d3">;
57+
defm D4 : MxDataRegister<4, "d4">;
58+
defm D5 : MxDataRegister<5, "d5">;
59+
defm D6 : MxDataRegister<6, "d6">;
60+
defm D7 : MxDataRegister<7, "d7">;
61+
62+
defm A0 : MxAddressRegister<0, "a0">;
63+
defm A1 : MxAddressRegister<1, "a1">;
64+
defm A2 : MxAddressRegister<2, "a2">;
65+
defm A3 : MxAddressRegister<3, "a3">;
66+
defm A4 : MxAddressRegister<4, "a4">;
67+
defm A5 : MxAddressRegister<5, "a5", ["bp"]>;
68+
defm A6 : MxAddressRegister<6, "a6", ["fp"]>;
69+
defm SP : MxAddressRegister<7, "sp", ["usp", "ssp", "isp", "a7"]>;
6870

69-
def USP : MxAliasReg<"usp", A7>;
70-
def SSP : MxAliasReg<"ssp", A7>;
71-
def ISP : MxAliasReg<"isp", A7>;
7271

7372
// Pseudo Registers
7473
class MxPseudoReg<string N, list<Register> SUBREGS = [], list<SubRegIndex> SUBIDX = []>
@@ -92,10 +91,10 @@ def DR16 : MxRegClass<[i16], 16, (sequence "WD%u", 0, 7)>;
9291
def DR32 : MxRegClass<[i32], 32, (sequence "D%u", 0, 7)>;
9392

9493
// Address Registers
95-
def AR16 : MxRegClass<[i16], 16, (sequence "WA%u", 0, 6)>;
94+
def AR16 : MxRegClass<[i16], 16, (add (sequence "WA%u", 0, 6), WSP)>;
9695
def AR32 : MxRegClass<[i32], 32, (add (sequence "A%u", 0, 6), SP)>;
9796

98-
def AR32_NOSP : MxRegClass<[i32], 32, (add (sequence "A%u", 0, 6))>;
97+
def AR32_NOSP : MxRegClass<[i32], 32, (sequence "A%u", 0, 6)>;
9998

10099
// Index Register Classes
101100
// FIXME try alternative ordering like `D0, D1, A0, A1, ...`
@@ -124,7 +123,5 @@ def XR16_TC : MxRegClass<[i16], 16, (add DR16_TC, AR16_TC)>;
124123
def XR32_TC : MxRegClass<[i32], 32, (add DR32_TC, AR32_TC)>;
125124

126125
// These classes provide spill/restore order if used with MOVEM instruction
127-
def SPILL : MxRegClass<[i32], 32, (add (add (sequence "D%u", 0, 7),
128-
(sequence "A%u", 0, 6)), SP)>;
129-
def SPILL_R : MxRegClass<[i32], 32, (add SP, (add (sequence "A%u", 6, 0),
130-
(sequence "D%u", 7, 0)))>;
126+
def SPILL : MxRegClass<[i32], 32, (add XR32)>;
127+
def SPILL_R : MxRegClass<[i32], 32, (add SP, (sequence "A%u", 6, 0), (sequence "D%u", 7, 0))>;

llvm/lib/Target/M68k/MCTargetDesc/M68kBaseInfo.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,15 +182,14 @@ static inline bool isAddressRegister(unsigned RegNo) {
182182
case M68k::WA4:
183183
case M68k::WA5:
184184
case M68k::WA6:
185-
case M68k::WA7:
185+
case M68k::WSP:
186186
case M68k::A0:
187187
case M68k::A1:
188188
case M68k::A2:
189189
case M68k::A3:
190190
case M68k::A4:
191191
case M68k::A5:
192192
case M68k::A6:
193-
case M68k::A7:
194193
case M68k::SP:
195194
return true;
196195
default:
@@ -237,7 +236,7 @@ static inline unsigned getMaskedSpillRegister(unsigned order) {
237236
case 14:
238237
return M68k::A6;
239238
case 15:
240-
return M68k::A7;
239+
return M68k::SP;
241240
}
242241
}
243242

0 commit comments

Comments
 (0)