14
14
//===----------------------------------------------------------------------===//
15
15
16
16
let Namespace = "Z80" in {
17
- class Z80Reg<string n, bits<16> Enc = -1> : Register<n> {
18
- let HWEncoding = Enc;
17
+ class Z80Reg<string name, bits<16> enc = -1> : Register<name> {
18
+ let HWEncoding = enc;
19
+ }
20
+
21
+ // Subregister indices.
22
+ def sub_low : SubRegIndex<8>;
23
+ def sub_high : SubRegIndex<8, 8>;
24
+ def sub_short : SubRegIndex<16>;
25
+
26
+ class Z80RegPair<Z80Reg high, Z80Reg low,
27
+ bits<16> enc, bits<16> dwarf = enc>
28
+ : Z80Reg<!cond(!and(!eq(!size(high.AsmName), 1),
29
+ !eq(!size( low.AsmName), 1))
30
+ : !strconcat(high.AsmName, low.AsmName),
31
+ !and(!gt(!size(high.AsmName), 1),
32
+ !gt(!size( low.AsmName), 1),
33
+ !eq(!substr(high.AsmName,
34
+ 0, !sub(!size(high.AsmName), 1)),
35
+ !substr( low.AsmName,
36
+ 0, !sub(!size( low.AsmName), 1))))
37
+ : !substr(high.AsmName, 0, !sub(!size(high.AsmName), 1))),
38
+ enc>
39
+ , DwarfRegNum<[dwarf]> {
40
+ let SubRegs = [high, low];
41
+ let SubRegIndices = [sub_high, sub_low];
42
+ let CoveredBySubRegs = 1;
43
+ }
44
+
45
+ class EZ80ExtReg<Z80Reg short>
46
+ : Z80Reg<short.AsmName, short.HWEncoding>
47
+ , DwarfRegAlias<short> {
48
+ let SubRegs = [short];
49
+ let SubRegIndices = [sub_short];
50
+ }
19
51
}
20
52
21
- // Subregister indices.
22
- def sub_low : SubRegIndex<8>;
23
- def sub_high : SubRegIndex<8, 8>;
24
- def sub_short : SubRegIndex<16>;
25
-
26
- class Z80RegWithSubRegs<string n, list<Register> sub = [], bits<16> enc = -1>
27
- : Z80Reg<n, enc> {
28
- let SubRegs = sub;
29
- let SubRegIndices = [sub_high, sub_low];
30
- let CoveredBySubRegs = 1;
31
- }
32
-
33
- class EZ80RegPair<Z80Reg subreg>
34
- : Register<""> {
35
- let HWEncoding{1-0} = subreg.HWEncoding{1-0};
36
- let SubRegs = [subreg];
37
- let SubRegIndices = [sub_short];
38
- let AsmName = subreg.AsmName;
39
- //let AltNames = subreg.AltNames;
40
- }
41
- }
42
53
//===----------------------------------------------------------------------===//
43
54
// Register definitions...
44
55
//
@@ -55,43 +66,42 @@ def L : Z80Reg<"l", 5>;
55
66
56
67
// 8-bit index registers
57
68
let CostPerUse = [1] in {
58
- def IXH : Z80Reg<"ixh", 4>;
59
- def IXL : Z80Reg<"ixl", 5>;
60
- def IYH : Z80Reg<"iyh", 4>;
61
- def IYL : Z80Reg<"iyl", 5>;
69
+ def IXH : Z80Reg<"ixh", 4>;
70
+ def IXL : Z80Reg<"ixl", 5>;
71
+ def IYH : Z80Reg<"iyh", 4>;
72
+ def IYL : Z80Reg<"iyl", 5>;
62
73
}
63
74
64
75
// 16-bit registers
65
- def AF : Z80RegWithSubRegs<"af", [A,F], 3>, DwarfRegNum<[3]>;
66
- def BC : Z80RegWithSubRegs<"bc", [B,C], 0>, DwarfRegNum<[0]>;
67
- def DE : Z80RegWithSubRegs<"de", [D,E], 1>, DwarfRegNum<[1]>;
68
- def HL : Z80RegWithSubRegs<"hl", [H,L], 2>, DwarfRegNum<[2]>;
76
+ def AF : Z80RegPair<A, F, 3>;
77
+ def BC : Z80RegPair<B, C, 0>;
78
+ def DE : Z80RegPair<D, E, 1>;
79
+ def HL : Z80RegPair<H, L, 2>;
80
+
69
81
// 16-bit index registers
70
- let CostPerUse = 1 in {
71
- def IX : Z80RegWithSubRegs<"ix", [ IXH,IXL] , 2>;
72
- def IY : Z80RegWithSubRegs<"iy", [ IYH,IYL] , 2>;
82
+ let CostPerUse = [1] in {
83
+ def IX : Z80RegPair< IXH, IXL, 2, 4 >;
84
+ def IY : Z80RegPair< IYH, IYL, 2, 5 >;
73
85
}
74
86
75
- def SPS : Z80Reg<"sp", 3>;
87
+ // 16-bit misc registers
88
+ def SPS : Z80Reg<"sp", 3>, DwarfRegNum<[6]>;
76
89
77
90
// 24-bit registers
78
- def UBC : EZ80RegPair <BC>;
79
- def UDE : EZ80RegPair <DE>;
80
- def UHL : EZ80RegPair <HL>;
91
+ def UBC : EZ80ExtReg <BC>;
92
+ def UDE : EZ80ExtReg <DE>;
93
+ def UHL : EZ80ExtReg <HL>;
81
94
// 24-bit index registers
82
- let CostPerUse = 1 in {
83
- def UIX : EZ80RegPair <IX>;
84
- def UIY : EZ80RegPair <IY>;
95
+ let CostPerUse = [1] in {
96
+ def UIX : EZ80ExtReg <IX>;
97
+ def UIY : EZ80ExtReg <IY>;
85
98
}
86
99
87
- //definition of SPL register for EZ80 ADL mode.
88
- //It havn't common part with SPS register, so this definition is not 100%
89
- //correct, but SPS and SPL cannot be used within one function. Moreover, ADL=1
90
- //and ADL=0 instructions cannot be mixed within one ELF section, because no one
91
- //disassembler which may correctly disassemble result code.
92
- def SPL : EZ80RegPair<SPS>;
100
+ // 24-bit misc registers
101
+ def SPL : Z80Reg<"sp", 3>, DwarfRegNum<[7]>;
93
102
94
- def PC : Z80Reg<"pc">;
103
+ // misc registers
104
+ def PC : Z80Reg<"pc">, DwarfRegNum<[8]>;
95
105
96
106
//===----------------------------------------------------------------------===//
97
107
// Register Class Definitions...
@@ -119,11 +129,6 @@ def A16 : Z80RC16<(add HL, I16)>;
119
129
def R16 : Z80RC16<(add G16, I16)>;
120
130
let CopyCost = -1 in
121
131
def Z16 : Z80RC16<(add SPS, AF)>;
122
- //def S16 : Z80RC16<(add R16, AF)>;
123
- //def L16 : Z80RC16<(add G16, I16)>;
124
- //def R16 : Z80RC16<(add L16, SPS)>;
125
- //def S16 : Z80RC16<(add L16, AF)>;
126
- //def C16 : Z80RC16<(add R16, SPS)>;
127
132
128
133
def O24 : Z80RC24<(add UDE, UBC)>;
129
134
def G24 : Z80RC24<(add UHL, O24)>;
@@ -134,8 +139,3 @@ def A24 : Z80RC24<(add UHL, I24)>;
134
139
def R24 : Z80RC24<(add G24, I24)>;
135
140
let CopyCost = -1 in
136
141
def Z24 : Z80RC24<(add SPL, PC)>;
137
- //def S24 : Z80RC24<(add R24, AF)>;
138
- //def L24 : Z80RC24<(add G24, I24)>;
139
- //def R24 : Z80RC24<(add L24, SPL)>;
140
- //def S24 : Z80RC24<(add L24, AF)>;
141
- //def C24 : Z80RC24<(add R24, SPL)>;
0 commit comments