• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1//===-- HexagonRegisterInfo.td - Hexagon Register defs -----*- tablegen -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10//===----------------------------------------------------------------------===//
11//  Declarations that describe the Hexagon register file.
12//===----------------------------------------------------------------------===//
13
14let Namespace = "Hexagon" in {
15
16  class HexagonReg<bits<5> num, string n, list<string> alt = [],
17                   list<Register> alias = []> : Register<n, alt> {
18    field bits<5> Num;
19    let Aliases = alias;
20    let HWEncoding{4-0} = num;
21  }
22
23  class HexagonDoubleReg<bits<5> num, string n, list<Register> subregs,
24                         list<string> alt = []> :
25        RegisterWithSubRegs<n, subregs> {
26    field bits<5> Num;
27
28    let AltNames = alt;
29    let HWEncoding{4-0} = num;
30  }
31
32  // Registers are identified with 5-bit ID numbers.
33  // Ri - 32-bit integer registers.
34  class Ri<bits<5> num, string n, list<string> alt = []> :
35        HexagonReg<num, n, alt> {
36    let Num = num;
37  }
38
39  // Rf - 32-bit floating-point registers.
40  class Rf<bits<5> num, string n> : HexagonReg<num, n> {
41    let Num = num;
42  }
43
44
45  // Rd - 64-bit registers.
46  class Rd<bits<5> num, string n, list<Register> subregs,
47           list<string> alt = []> :
48        HexagonDoubleReg<num, n, subregs, alt> {
49    let Num = num;
50    let SubRegs = subregs;
51  }
52
53  // Rp - predicate registers
54  class Rp<bits<5> num, string n> : HexagonReg<num, n> {
55    let Num = num;
56  }
57
58
59  // Rq - vector predicate registers
60  class Rq<bits<3> num, string n> : Register<n, []> {
61    let HWEncoding{2-0} = num;
62  }
63
64  // Rc - control registers
65  class Rc<bits<5> num, string n,
66           list<string> alt = [], list<Register> alias = []> :
67        HexagonReg<num, n, alt, alias> {
68    let Num = num;
69  }
70
71  // Rcc - 64-bit control registers.
72  class Rcc<bits<5> num, string n, list<Register> subregs,
73            list<string> alt = []> :
74        HexagonDoubleReg<num, n, subregs, alt> {
75    let Num = num;
76    let SubRegs = subregs;
77  }
78
79  // Mx - address modifier registers
80  class Mx<bits<1> num, string n> : HexagonReg<{0b0000, num}, n> {
81    let Num = !cast<bits<5>>(num);
82  }
83
84  def subreg_loreg  : SubRegIndex<32>;
85  def subreg_hireg  : SubRegIndex<32, 32>;
86  def subreg_overflow : SubRegIndex<1, 0>;
87
88  // Integer registers.
89  foreach i = 0-28 in {
90    def R#i  : Ri<i, "r"#i>,  DwarfRegNum<[i]>;
91  }
92
93  def R29 : Ri<29, "r29", ["sp"]>, DwarfRegNum<[29]>;
94  def R30 : Ri<30, "r30", ["fp"]>, DwarfRegNum<[30]>;
95  def R31 : Ri<31, "r31", ["lr"]>, DwarfRegNum<[31]>;
96
97  // Aliases of the R* registers used to hold 64-bit int values (doubles).
98  let SubRegIndices = [subreg_loreg, subreg_hireg], CoveredBySubRegs = 1 in {
99  def D0  : Rd< 0,  "r1:0",  [R0,  R1]>,  DwarfRegNum<[32]>;
100  def D1  : Rd< 2,  "r3:2",  [R2,  R3]>,  DwarfRegNum<[34]>;
101  def D2  : Rd< 4,  "r5:4",  [R4,  R5]>,  DwarfRegNum<[36]>;
102  def D3  : Rd< 6,  "r7:6",  [R6,  R7]>,  DwarfRegNum<[38]>;
103  def D4  : Rd< 8,  "r9:8",  [R8,  R9]>,  DwarfRegNum<[40]>;
104  def D5  : Rd<10, "r11:10", [R10, R11]>, DwarfRegNum<[42]>;
105  def D6  : Rd<12, "r13:12", [R12, R13]>, DwarfRegNum<[44]>;
106  def D7  : Rd<14, "r15:14", [R14, R15]>, DwarfRegNum<[46]>;
107  def D8  : Rd<16, "r17:16", [R16, R17]>, DwarfRegNum<[48]>;
108  def D9  : Rd<18, "r19:18", [R18, R19]>, DwarfRegNum<[50]>;
109  def D10 : Rd<20, "r21:20", [R20, R21]>, DwarfRegNum<[52]>;
110  def D11 : Rd<22, "r23:22", [R22, R23]>, DwarfRegNum<[54]>;
111  def D12 : Rd<24, "r25:24", [R24, R25]>, DwarfRegNum<[56]>;
112  def D13 : Rd<26, "r27:26", [R26, R27]>, DwarfRegNum<[58]>;
113  def D14 : Rd<28, "r29:28", [R28, R29]>, DwarfRegNum<[60]>;
114  def D15 : Rd<30, "r31:30", [R30, R31], ["lr:fp"]>, DwarfRegNum<[62]>;
115  }
116
117  // Predicate registers.
118  def P0 : Rp<0, "p0">, DwarfRegNum<[63]>;
119  def P1 : Rp<1, "p1">, DwarfRegNum<[64]>;
120  def P2 : Rp<2, "p2">, DwarfRegNum<[65]>;
121  def P3 : Rp<3, "p3">, DwarfRegNum<[66]>;
122
123  // Modifier registers.
124  // C6 and C7 can also be M0 and M1, but register names must be unique, even
125  // if belonging to different register classes.
126  def M0 : Mx<0, "m0">, DwarfRegNum<[72]>;
127  def M1 : Mx<1, "m1">, DwarfRegNum<[73]>;
128
129  // Fake register to represent USR.OVF bit. Artihmetic/saturating instruc-
130  // tions modify this bit, and multiple such instructions are allowed in the
131  // same packet. We need to ignore output dependencies on this bit, but not
132  // on the entire USR.
133  def USR_OVF : Rc<?, "usr.ovf">;
134
135  def USR  : Rc<8,  "usr",       ["c8"]>,   DwarfRegNum<[75]> {
136    let SubRegIndices = [subreg_overflow];
137    let SubRegs = [USR_OVF];
138  }
139
140  // Control registers.
141  def SA0  : Rc<0,  "sa0",       ["c0"]>,   DwarfRegNum<[67]>;
142  def LC0  : Rc<1,  "lc0",       ["c1"]>,   DwarfRegNum<[68]>;
143  def SA1  : Rc<2,  "sa1",       ["c2"]>,   DwarfRegNum<[69]>;
144  def LC1  : Rc<3,  "lc1",       ["c3"]>,   DwarfRegNum<[70]>;
145  def P3_0 : Rc<4,  "p3:0",      ["c4"], [P0, P1, P2, P3]>,
146                                            DwarfRegNum<[71]>;
147  def C5   : Rc<5,  "c5",        ["c5"]>,   DwarfRegNum<[72]>; // future use
148  def C6   : Rc<6,  "c6",        [], [M0]>, DwarfRegNum<[73]>;
149  def C7   : Rc<7,  "c7",        [], [M1]>, DwarfRegNum<[74]>;
150  // Define C8 separately and make it aliased with USR.
151  // The problem is that USR has subregisters (e.g. overflow). If USR was
152  // specified as a subregister of C9_8, it would imply that subreg_overflow
153  // and subreg_loreg can be composed, which leads to all kinds of issues
154  // with lane masks.
155  def C8   : Rc<8,  "c8",       [], [USR]>, DwarfRegNum<[75]>;
156  def PC   : Rc<9,  "pc">,                  DwarfRegNum<[76]>;
157  def UGP  : Rc<10, "ugp",       ["c10"]>,  DwarfRegNum<[77]>;
158  def GP   : Rc<11, "gp">,                  DwarfRegNum<[78]>;
159  def CS0  : Rc<12, "cs0",       ["c12"]>,  DwarfRegNum<[79]>;
160  def CS1  : Rc<13, "cs1",       ["c13"]>,  DwarfRegNum<[80]>;
161  def UPCL : Rc<14, "upcyclelo", ["c14"]>,  DwarfRegNum<[81]>;
162  def UPCH : Rc<15, "upcyclehi", ["c15"]>,  DwarfRegNum<[82]>;
163}
164
165  // Control registers pairs.
166  let SubRegIndices = [subreg_loreg, subreg_hireg], CoveredBySubRegs = 1 in {
167    def C1_0   : Rcc<0,   "c1:0",  [SA0, LC0], ["lc0:sa0"]>, DwarfRegNum<[67]>;
168    def C3_2   : Rcc<2,   "c3:2",  [SA1, LC1], ["lc1:sa1"]>, DwarfRegNum<[69]>;
169    def C7_6   : Rcc<6,   "c7:6",  [C6, C7],   ["m1:0"]>,    DwarfRegNum<[72]>;
170    // Use C8 instead of USR as a subregister of C9_8.
171    def C9_8   : Rcc<8,   "c9:8",  [C8, PC]>,                DwarfRegNum<[74]>;
172    def C11_10 : Rcc<10, "c11:10", [UGP, GP]>,               DwarfRegNum<[76]>;
173    def CS     : Rcc<12, "c13:12", [CS0, CS1], ["cs1:0"]>,   DwarfRegNum<[78]>;
174    def UPC    : Rcc<14, "c15:14", [UPCL, UPCH]>,            DwarfRegNum<[80]>;
175  }
176
177  foreach i = 0-31 in {
178    def V#i  : Ri<i, "v"#i>,  DwarfRegNum<[!add(i, 99)]>;
179  }
180
181  // Aliases of the V* registers used to hold double vec values.
182  let SubRegIndices = [subreg_loreg, subreg_hireg], CoveredBySubRegs = 1 in {
183  def W0  : Rd< 0,  "v1:0",  [V0,  V1]>,  DwarfRegNum<[99]>;
184  def W1  : Rd< 2,  "v3:2",  [V2,  V3]>,  DwarfRegNum<[101]>;
185  def W2  : Rd< 4,  "v5:4",  [V4,  V5]>,  DwarfRegNum<[103]>;
186  def W3  : Rd< 6,  "v7:6",  [V6,  V7]>,  DwarfRegNum<[105]>;
187  def W4  : Rd< 8,  "v9:8",  [V8,  V9]>,  DwarfRegNum<[107]>;
188  def W5  : Rd<10, "v11:10", [V10, V11]>, DwarfRegNum<[109]>;
189  def W6  : Rd<12, "v13:12", [V12, V13]>, DwarfRegNum<[111]>;
190  def W7  : Rd<14, "v15:14", [V14, V15]>, DwarfRegNum<[113]>;
191  def W8  : Rd<16, "v17:16", [V16, V17]>, DwarfRegNum<[115]>;
192  def W9  : Rd<18, "v19:18", [V18, V19]>, DwarfRegNum<[117]>;
193  def W10 : Rd<20, "v21:20", [V20, V21]>, DwarfRegNum<[119]>;
194  def W11 : Rd<22, "v23:22", [V22, V23]>, DwarfRegNum<[121]>;
195  def W12 : Rd<24, "v25:24", [V24, V25]>, DwarfRegNum<[123]>;
196  def W13 : Rd<26, "v27:26", [V26, V27]>, DwarfRegNum<[125]>;
197  def W14 : Rd<28, "v29:28", [V28, V29]>, DwarfRegNum<[127]>;
198  def W15 : Rd<30, "v31:30", [V30, V31]>, DwarfRegNum<[129]>;
199  }
200
201  // Vector Predicate registers.
202  def Q0 : Rq<0, "q0">, DwarfRegNum<[131]>;
203  def Q1 : Rq<1, "q1">, DwarfRegNum<[132]>;
204  def Q2 : Rq<2, "q2">, DwarfRegNum<[133]>;
205  def Q3 : Rq<3, "q3">, DwarfRegNum<[134]>;
206
207// Register classes.
208//
209// FIXME: the register order should be defined in terms of the preferred
210// allocation order...
211//
212def IntRegs : RegisterClass<"Hexagon", [i32, f32, v4i8, v2i16], 32,
213                            (add (sequence "R%u", 0, 9),
214                                 (sequence "R%u", 12, 28),
215                                 R10, R11, R29, R30, R31)> {
216}
217
218// Registers are listed in reverse order for allocation preference reasons.
219def IntRegsLow8 : RegisterClass<"Hexagon", [i32], 32,
220                                (add R7, R6, R5, R4, R3, R2, R1, R0)> ;
221
222def DoubleRegs : RegisterClass<"Hexagon", [i64, f64, v8i8, v4i16, v2i32], 64,
223                               (add (sequence "D%u", 0, 4),
224                                    (sequence "D%u", 6, 13), D5, D14, D15)>;
225
226def VectorRegs : RegisterClass<"Hexagon", [v64i8, v32i16, v16i32, v8i64], 512,
227                               (add (sequence "V%u", 0, 31))>;
228
229def VecDblRegs : RegisterClass<"Hexagon",
230                         [v128i8, v64i16, v32i32, v16i64], 1024,
231                               (add (sequence "W%u", 0, 15))>;
232
233def VectorRegs128B : RegisterClass<"Hexagon",
234                         [v128i8, v64i16, v32i32, v16i64], 1024,
235                               (add (sequence "V%u", 0, 31))>;
236
237def VecDblRegs128B : RegisterClass<"Hexagon",
238                         [v256i8,v128i16,v64i32,v32i64], 2048,
239                               (add (sequence "W%u", 0, 15))>;
240
241def VecPredRegs : RegisterClass<"Hexagon", [v512i1], 512,
242                                (add (sequence "Q%u", 0, 3))>;
243
244def VecPredRegs128B : RegisterClass<"Hexagon", [v1024i1], 1024,
245                                   (add (sequence "Q%u", 0, 3))>;
246
247def PredRegs : RegisterClass<"Hexagon",
248                             [i1, v2i1, v4i1, v8i1, v4i8, v2i16, i32], 32,
249                             (add (sequence "P%u", 0, 3))>
250{
251  let Size = 32;
252}
253
254let Size = 32 in
255def ModRegs : RegisterClass<"Hexagon", [i32], 32, (add M0, M1)>;
256
257let Size = 32, isAllocatable = 0 in
258def CtrRegs : RegisterClass<"Hexagon", [i32], 32,
259                           (add LC0, SA0, LC1, SA1,
260                                P3_0,
261                                 M0, M1, C6, C7, CS0, CS1, UPCL, UPCH,
262                                 USR, USR_OVF, UGP, GP, PC)>;
263
264let Size = 64, isAllocatable = 0 in
265def CtrRegs64 : RegisterClass<"Hexagon", [i64], 64,
266                              (add C1_0, C3_2, C7_6, C9_8, C11_10, CS, UPC)>;
267
268def VolatileV3 {
269  list<Register> Regs = [D0, D1, D2, D3, D4, D5, D6, D7,
270                         R28, R31,
271                         P0, P1, P2, P3,
272                         M0, M1,
273                         LC0, LC1, SA0, SA1, USR, USR_OVF, CS0, CS1,
274                         V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11,
275                         V12, V13, V14, V15, V16, V17, V18, V19, V20, V21,
276                         V22, V23, V24, V25, V26, V27, V28, V29, V30, V31,
277                         W0, W1, W2, W3, W4, W5, W6, W7, W8, W9, W10, W11,
278                         W12, W13, W14, W15,
279                         Q0, Q1, Q2, Q3];
280}
281
282def PositiveHalfWord : PatLeaf<(i32 IntRegs:$a),
283[{
284  return isPositiveHalfWord(N);
285}]>;
286