15
15
16
16
class MxReg<string N, bits<16> ENC,
17
17
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> {
20
20
let Namespace = "M68k";
21
21
let HWEncoding = ENC;
22
22
let SubRegs = SUBREGS;
@@ -29,46 +29,45 @@ let Namespace = "M68k" in {
29
29
def MxSubRegIndex16Lo : SubRegIndex<16, 0>;
30
30
}
31
31
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>;
57
42
}
58
43
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>;
63
51
}
64
52
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"]>;
68
70
69
- def USP : MxAliasReg<"usp", A7>;
70
- def SSP : MxAliasReg<"ssp", A7>;
71
- def ISP : MxAliasReg<"isp", A7>;
72
71
73
72
// Pseudo Registers
74
73
class MxPseudoReg<string N, list<Register> SUBREGS = [], list<SubRegIndex> SUBIDX = []>
@@ -92,10 +91,10 @@ def DR16 : MxRegClass<[i16], 16, (sequence "WD%u", 0, 7)>;
92
91
def DR32 : MxRegClass<[i32], 32, (sequence "D%u", 0, 7)>;
93
92
94
93
// 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 )>;
96
95
def AR32 : MxRegClass<[i32], 32, (add (sequence "A%u", 0, 6), SP)>;
97
96
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)>;
99
98
100
99
// Index Register Classes
101
100
// FIXME try alternative ordering like `D0, D1, A0, A1, ...`
@@ -124,7 +123,5 @@ def XR16_TC : MxRegClass<[i16], 16, (add DR16_TC, AR16_TC)>;
124
123
def XR32_TC : MxRegClass<[i32], 32, (add DR32_TC, AR32_TC)>;
125
124
126
125
// 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))>;
0 commit comments