xref: /freebsd/contrib/llvm-project/llvm/lib/Target/Xtensa/XtensaRegisterInfo.td (revision 700637cbb5e582861067a11aaca4d053546871d2)
1//===- XtensaRegisterInfo.td - Xtensa Register defs --------*- tablegen -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
6// See https://llvm.org/LICENSE.txt for license information.
7// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8//
9//===----------------------------------------------------------------------===//
10
11//===----------------------------------------------------------------------===//
12// Class definitions.
13//===----------------------------------------------------------------------===//
14
15class XtensaReg<string n> : Register<n> {
16  let Namespace = "Xtensa";
17}
18
19class XtensaRegWithSubRegs<string n, list<Register> subregs>
20  : RegisterWithSubRegs<n, subregs> {
21  let Namespace = "Xtensa";
22}
23
24//===----------------------------------------------------------------------===//
25// General-purpose registers
26//===----------------------------------------------------------------------===//
27
28// Xtensa general purpose regs
29class ARReg<bits<4> num, string n, list<string> alt = []> : XtensaReg<n> {
30  let HWEncoding{3-0} = num;
31  let AltNames = alt;
32}
33
34// Return Address
35def A0 : ARReg<0, "a0">, DwarfRegNum<[0]>;
36
37// Stack Pointer (callee-saved)
38def SP : ARReg<1, "a1", ["sp"]>, DwarfRegNum<[1]>;
39
40// Function Arguments
41def A2 : ARReg<2, "a2">, DwarfRegNum<[2]>;
42def A3 : ARReg<3, "a3">, DwarfRegNum<[3]>;
43def A4 : ARReg<4, "a4">, DwarfRegNum<[4]>;
44def A5 : ARReg<5, "a5">, DwarfRegNum<[5]>;
45def A6 : ARReg<6, "a6">, DwarfRegNum<[6]>;
46def A7 : ARReg<7, "a7">, DwarfRegNum<[7]>;
47
48// Static Chain
49def A8 : ARReg<8, "a8">, DwarfRegNum<[8]>;
50
51def A9 : ARReg<9, "a9">, DwarfRegNum<[9]>;
52def A10 : ARReg<10, "a10">, DwarfRegNum<[10]>;
53def A11 : ARReg<11, "a11">, DwarfRegNum<[11]>;
54
55// Callee-saved
56def A12 : ARReg<12, "a12">, DwarfRegNum<[12]>;
57def A13 : ARReg<13, "a13">, DwarfRegNum<[13]>;
58def A14 : ARReg<14, "a14">, DwarfRegNum<[14]>;
59
60// Stack-Frame Pointer (optional) - Callee-Saved
61def A15 : ARReg<15, "a15">, DwarfRegNum<[15]>;
62
63// Register class with allocation order
64def AR : RegisterClass<"Xtensa", [i32], 32, (add
65  A8, A9, A10, A11, A12, A13, A14, A15,
66  A7, A6, A5, A4, A3, A2, A0, SP)>;
67
68//===----------------------------------------------------------------------===//
69// Special-purpose registers
70//===----------------------------------------------------------------------===//
71class SRReg<bits<8> num, string n, list<string> alt = []> : XtensaReg<n> {
72  let HWEncoding{7-0} = num;
73  let AltNames = alt;
74}
75
76// Loop Option Registers
77def LBEG : SRReg<0, "lbeg", ["LBEG", "0"]>;
78def LEND : SRReg<1, "lend", ["LEND", "1"]>;
79def LCOUNT : SRReg<2, "lcount", ["LCOUNT", "2"]>;
80
81// Shift Amount Register
82def SAR : SRReg<3, "sar", ["SAR","3"]>;
83
84// Boolean Register
85def BREG : SRReg<4, "br", ["BR","4"]>;
86
87// Literal base
88def LITBASE : SRReg<5, "litbase", ["LITBASE", "5"]>;
89
90// Windowed Register Option registers
91def WINDOWBASE : SRReg<72, "windowbase", ["WINDOWBASE", "72"]>;
92def WINDOWSTART : SRReg<73, "windowstart", ["WINDOWSTART", "73"]>;
93
94// Instuction breakpoint enable register
95def IBREAKENABLE : SRReg<96, "ibreakenable", ["IBREAKENABLE", "96"]>;
96
97// Memory Control Register
98def MEMCTL : SRReg<97, "memctl", ["MEMCTL", "97"]>;
99
100def DDR : SRReg<104, "ddr", ["DDR", "104"]>;
101
102// Instuction break address register 0
103def IBREAKA0 : SRReg<128, "ibreaka0", ["IBREAKA0", "128"]>;
104
105// Instuction break address register 1
106def IBREAKA1 : SRReg<129, "ibreaka1", ["IBREAKA1", "129"]>;
107
108// Data break address register 0
109def DBREAKA0 : SRReg<144, "dbreaka0", ["DBREAKA0", "144"]>;
110
111// Data break address register 1
112def DBREAKA1 : SRReg<145, "dbreaka1", ["DBREAKA1", "145"]>;
113
114// Data breakpoint control register 0
115def DBREAKC0 : SRReg<160, "dbreakc0", ["DBREAKC0", "160"]>;
116
117// Data breakpoint control register 1
118def DBREAKC1 : SRReg<161, "dbreakc1", ["DBREAKC1", "161"]>;
119
120def CONFIGID0 : SRReg<176, "configid0", ["CONFIGID0", "176"]>;
121
122// Exception PC1
123def EPC1 : SRReg<177, "epc1", ["EPC1", "177"]>;
124
125// Exception PC2
126def EPC2 : SRReg<178, "epc2", ["EPC2", "178"]>;
127
128// Exception PC3
129def EPC3 : SRReg<179, "epc3", ["EPC3", "179"]>;
130
131// Exception PC4
132def EPC4 : SRReg<180, "epc4", ["EPC4", "180"]>;
133
134// Exception PC5
135def EPC5 : SRReg<181, "epc5", ["EPC5", "181"]>;
136
137// Exception PC6
138def EPC6 : SRReg<182, "epc6", ["EPC6", "182"]>;
139
140// Exception PC7
141def EPC7 : SRReg<183, "epc7", ["EPC7", "183"]>;
142
143def DEPC : SRReg<192, "depc", ["DEPC", "192"]>;
144def EPS2 : SRReg<194, "eps2", ["EPS2", "194"]>;
145def EPS3 : SRReg<195, "eps3", ["EPS3", "195"]>;
146def EPS4 : SRReg<196, "eps4", ["EPS4", "196"]>;
147def EPS5 : SRReg<197, "eps5", ["EPS5", "197"]>;
148def EPS6 : SRReg<198, "eps6", ["EPS6", "198"]>;
149def EPS7 : SRReg<199, "eps7", ["EPS7", "199"]>;
150
151def CONFIGID1 : SRReg<208, "configid1", ["CONFIGID1", "208"]>;
152
153def EXCSAVE1 : SRReg<209, "excsave1", ["EXCSAVE1", "209"]>;
154def EXCSAVE2 : SRReg<210, "excsave2", ["EXCSAVE2", "210"]>;
155def EXCSAVE3 : SRReg<211, "excsave3", ["EXCSAVE3", "211"]>;
156def EXCSAVE4 : SRReg<212, "excsave4", ["EXCSAVE4", "212"]>;
157def EXCSAVE5 : SRReg<213, "excsave5", ["EXCSAVE5", "213"]>;
158def EXCSAVE6 : SRReg<214, "excsave6", ["EXCSAVE6", "214"]>;
159def EXCSAVE7 : SRReg<215, "excsave7", ["EXCSAVE7", "215"]>;
160
161def CPENABLE : SRReg<224, "cpenable", ["CPENABLE", "224"]>;
162
163// Interrupt enable mask register
164def INTERRUPT : SRReg<226, "interrupt", ["INTERRUPT", "226"]>;
165
166def INTSET : SRReg<226, "intset", ["INTSET"]>;
167
168def INTCLEAR : SRReg<227, "intclear", ["INTCLEAR", "227"]>;
169
170def INTENABLE : SRReg<228, "intenable", ["INTENABLE", "228"]>;
171
172// Processor State
173def PS : SRReg<230, "ps", ["PS", "230"]>;
174
175def EXCCAUSE : SRReg<232, "exccause", ["EXCCAUSE", "232"]>;
176
177// Cause of last debug exception register
178def DEBUGCAUSE : SRReg<233, "debugcause", ["DEBUGCAUSE", "233"]>;
179
180// Processor Clock Count Register
181def CCOUNT : SRReg<234, "ccount", ["CCOUNT", "234"]>;
182
183// Processor ID Register
184def PRID : SRReg<235, "prid", ["PRID", "235"]>;
185
186def ICOUNT : SRReg<236, "icount", ["ICOUNT", "236"]>;
187def ICOUNTLEVEL : SRReg<237, "icountlevel", ["ICOUNTLEVEL", "237"]>;
188def EXCVADDR : SRReg<238, "excvaddr", ["EXCVADDR", "238"]>;
189
190// Cycle number to interrupt register 0
191def CCOMPARE0 : SRReg<240, "ccompare0", ["CCOMPARE0", "240"]>;
192
193// Cycle number to interrupt register 1
194def CCOMPARE1 : SRReg<241, "ccompare1", ["CCOMPARE1", "241"]>;
195
196// Cycle number to interrupt register 2
197def CCOMPARE2 : SRReg<242, "ccompare2", ["CCOMPARE2", "242"]>;
198
199// Vector base register
200def VECBASE : SRReg<231, "vecbase", ["VECBASE", "231"]>;
201
202// Xtensa Miscellaneous SR
203def MISC0 : SRReg<244, "misc0", ["MISC0", "244"]>;
204def MISC1 : SRReg<245, "misc1", ["MISC1", "245"]>;
205def MISC2 : SRReg<246, "misc2", ["MISC2", "246"]>;
206def MISC3 : SRReg<247, "misc3", ["MISC3", "247"]>;
207
208// MAC16 Option registers
209def ACCLO : SRReg<16, "acclo", ["ACCLO", "16"]>;
210def ACCHI : SRReg<17, "acchi", ["ACCHI", "17"]>;
211def M0    : SRReg<32, "m0", ["M0", "32"]>;
212def M1    : SRReg<33, "m1", ["M1", "33"]>;
213def M2    : SRReg<34, "m2", ["M2", "34"]>;
214def M3    : SRReg<35, "m3", ["M3", "35"]>;
215
216def MR01 :  RegisterClass<"Xtensa", [i32], 32, (add M0, M1)>;
217def MR23 :  RegisterClass<"Xtensa", [i32], 32, (add M2, M3)>;
218def MR   :  RegisterClass<"Xtensa", [i32], 32, (add MR01, MR23)>;
219
220def SR :  RegisterClass<"Xtensa", [i32], 32, (add
221  LBEG, LEND, LCOUNT, SAR, BREG, LITBASE, ACCLO, ACCHI, MR,
222  WINDOWBASE, WINDOWSTART, IBREAKENABLE, MEMCTL, DDR, IBREAKA0, IBREAKA1,
223  DBREAKA0, DBREAKA1, DBREAKC0, DBREAKC1, CONFIGID0, EPC1, EPC2, EPC3, EPC4, EPC5,
224  EPC6, EPC7, DEPC, EPS2, EPS3, EPS4, EPS5, EPS6, EPS7, CONFIGID1, EXCSAVE1, EXCSAVE2,
225  EXCSAVE3, EXCSAVE4, EXCSAVE5, EXCSAVE6, EXCSAVE7, CPENABLE, INTERRUPT, INTSET, INTCLEAR, INTENABLE,
226  PS, VECBASE, EXCCAUSE, DEBUGCAUSE, CCOUNT, PRID, ICOUNT, ICOUNTLEVEL, EXCVADDR, CCOMPARE0,
227  CCOMPARE1, CCOMPARE2, MISC0, MISC1, MISC2, MISC3)>;
228
229//===----------------------------------------------------------------------===//
230// USER registers
231//===----------------------------------------------------------------------===//
232class URReg<bits<8> num, string n, list<string> alt = []> : XtensaReg<n> {
233  let HWEncoding{7-0} = num;
234  let AltNames = alt;
235}
236
237// Thread Pointer register
238def THREADPTR : URReg<231, "threadptr", ["THREADPTR"]>;
239
240def FCR : URReg<232, "fcr", ["FCR"]>;
241def FSR : URReg<233, "fsr", ["FSR"]>;
242
243// DFPAccel registers
244def F64R_LO : URReg<234, "f64r_lo", ["F64R_LO"]>;
245def F64R_HI : URReg<235, "f64r_hi", ["F64R_HI"]>;
246def F64S : URReg<236, "f64s", ["F64S"]>;
247
248def UR :  RegisterClass<"Xtensa", [i32], 32, (add
249  THREADPTR, FCR, FSR, F64R_LO, F64R_HI, F64S)>;
250
251//===----------------------------------------------------------------------===//
252// Floating-Point registers
253//===----------------------------------------------------------------------===//
254
255// Xtensa Floating-Point regs
256class FPReg<bits<4> num, string n> : XtensaReg<n> {
257  let HWEncoding{3-0} = num;
258}
259
260def F0 : FPReg<0, "f0">, DwarfRegNum<[19]>;
261def F1 : FPReg<1, "f1">, DwarfRegNum<[20]>;
262def F2 : FPReg<2, "f2">, DwarfRegNum<[21]>;
263def F3 : FPReg<3, "f3">, DwarfRegNum<[22]>;
264def F4 : FPReg<4, "f4">, DwarfRegNum<[23]>;
265def F5 : FPReg<5, "f5">, DwarfRegNum<[24]>;
266def F6 : FPReg<6, "f6">, DwarfRegNum<[25]>;
267def F7 : FPReg<7, "f7">, DwarfRegNum<[26]>;
268def F8 : FPReg<8, "f8">, DwarfRegNum<[27]>;
269def F9 : FPReg<9, "f9">, DwarfRegNum<[28]>;
270def F10 : FPReg<10, "f10">, DwarfRegNum<[29]>;
271def F11 : FPReg<11, "f11">, DwarfRegNum<[30]>;
272def F12 : FPReg<12, "f12">, DwarfRegNum<[31]>;
273def F13 : FPReg<13, "f13">, DwarfRegNum<[32]>;
274def F14 : FPReg<14, "f14">, DwarfRegNum<[33]>;
275def F15 : FPReg<15, "f15">, DwarfRegNum<[34]>;
276
277// Floating-Point register class with allocation order
278def FPR : RegisterClass<"Xtensa", [f32], 32, (add
279  F8, F9, F10, F11, F12, F13, F14, F15,
280  F7, F6, F5, F4, F3, F2, F1, F0)>;
281
282//===----------------------------------------------------------------------===//
283// Boolean registers
284//===----------------------------------------------------------------------===//
285class BReg<bits<4> num, string n> : XtensaReg<n> {
286  let HWEncoding{3-0} = num;
287}
288
289foreach i = 0-15 in {
290  def B#i  : BReg<i, "b"#i>;
291}
292
293// Boolean register class
294def BR : RegisterClass<"Xtensa", [v1i1], 8, (add B0, B1,
295  B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15)> {
296  let Size = 8;
297}
298