[SampleProfileLoader] Fix integer overflow in generateMDProfMetadata (#90217)
[llvm-project.git] / llvm / lib / Target / RISCV / RISCVSystemOperands.td
blob01c2767119502c2de59e68e2258a6638b849b41e
1 //===- RISCVSystemOperands.td ------------------------------*- tablegen -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the symbolic operands permitted for various kinds of
10 // RISC-V system instruction.
12 //===----------------------------------------------------------------------===//
14 include "llvm/TableGen/SearchableTable.td"
16 //===----------------------------------------------------------------------===//
17 // CSR (control and status register read/write) instruction options.
18 //===----------------------------------------------------------------------===//
20 class SysReg<string name, bits<12> op> {
21   string Name = name;
22   // A maximum of one alias is supported right now.
23   string AltName = name;
24   // A maximum of one deprecated name is supported right now.  Unlike the
25   // `AltName` alias, a `DeprecatedName` generates a diagnostic when the name is
26   // used to encourage software to migrate away from the name.
27   string DeprecatedName = "";
28   bits<12> Encoding = op;
29   // FIXME: add these additional fields when needed.
30   // Privilege Access: Read and Write = 0, 1, 2; Read-Only = 3.
31   // Privilege Mode: User = 0, System = 1 or Machine = 3.
32   // bits<2> ReadWrite = op{11 - 10};
33   // bits<2> XMode = op{9 - 8};
34   // Check Extra field name and what bits 7-6 correspond to.
35   // bits<2> Extra = op{7 - 6};
36   // Register number without the privilege bits.
37   // bits<6> Number = op{5 - 0};
38   code FeaturesRequired = [{ {} }];
39   bit isRV32Only = 0;
42 def SysRegsList : GenericTable {
43   let FilterClass = "SysReg";
44   // FIXME: add "ReadWrite", "Mode", "Extra", "Number" fields when needed.
45   let Fields = [
46     "Name", "AltName", "DeprecatedName", "Encoding", "FeaturesRequired",
47     "isRV32Only",
48   ];
50   let PrimaryKey = [ "Encoding" ];
51   let PrimaryKeyName = "lookupSysRegByEncoding";
54 def lookupSysRegByName : SearchIndex {
55   let Table = SysRegsList;
56   let Key = [ "Name" ];
59 def lookupSysRegByAltName : SearchIndex {
60   let Table = SysRegsList;
61   let Key = [ "AltName" ];
64 def lookupSysRegByDeprecatedName : SearchIndex {
65   let Table = SysRegsList;
66   let Key = [ "DeprecatedName" ];
69 // The following CSR encodings match those given in Tables 2.2,
70 // 2.3, 2.4, 2.5 and 2.6 in the RISC-V Instruction Set Manual
71 // Volume II: Privileged Architecture.
73 //===----------------------------------------------------------------------===//
74 // User Floating-Point CSRs
75 //===----------------------------------------------------------------------===//
77 def SysRegFFLAGS : SysReg<"fflags", 0x001>;
78 def SysRegFRM    : SysReg<"frm", 0x002>;
79 def SysRegFCSR   : SysReg<"fcsr", 0x003>;
81 //===----------------------------------------------------------------------===//
82 // User Counter/Timers
83 //===----------------------------------------------------------------------===//
84 def CYCLE   : SysReg<"cycle", 0xC00>;
85 def TIME    : SysReg<"time", 0xC01>;
86 def INSTRET : SysReg<"instret", 0xC02>;
88 // hpmcounter3-hpmcounter31 at 0xC03-0xC1F.
89 foreach i = 3...31 in
90   def : SysReg<"hpmcounter"#i, !add(0xC03, !sub(i, 3))>;
92 let isRV32Only = 1 in {
93 def CYCLEH   : SysReg<"cycleh", 0xC80>;
94 def TIMEH    : SysReg<"timeh", 0xC81>;
95 def INSTRETH : SysReg<"instreth", 0xC82>;
97 // hpmcounter3h-hpmcounter31h at 0xC83-0xC9F.
98 foreach i = 3...31 in
99   def : SysReg<"hpmcounter"#i#"h", !add(0xC83, !sub(i, 3))>;
102 //===----------------------------------------------------------------------===//
103 // Supervisor Trap Setup
104 //===----------------------------------------------------------------------===//
105 def : SysReg<"sstatus", 0x100>;
106 def : SysReg<"sie", 0x104>;
107 def : SysReg<"stvec", 0x105>;
108 def : SysReg<"scounteren", 0x106>;
109 def : SysReg<"stimecmp", 0x14D>;
110 let isRV32Only = 1 in
111 def : SysReg<"stimecmph", 0x15D>;
113 //===----------------------------------------------------------------------===//
114 // Supervisor Configuration
115 //===----------------------------------------------------------------------===//
117 def : SysReg<"senvcfg", 0x10A>;
119 //===----------------------------------------------------------------------===//
120 // Supervisor Trap Handling
121 //===----------------------------------------------------------------------===//
122 def : SysReg<"sscratch", 0x140>;
123 def : SysReg<"sepc", 0x141>;
124 def : SysReg<"scause", 0x142>;
125 let DeprecatedName = "sbadaddr" in
126 def : SysReg<"stval", 0x143>;
127 def : SysReg<"sip", 0x144>;
129 //===----------------------------------------------------------------------===//
130 // Supervisor Protection and Translation
131 //===----------------------------------------------------------------------===//
132 let DeprecatedName = "sptbr" in
133 def : SysReg<"satp", 0x180>;
135 //===----------------------------------------------------------------------===//
136 // Quality-of-Service(QoS) Identifiers (Ssqosid)
137 //===----------------------------------------------------------------------===//
138 def : SysReg<"srmcfg", 0x181>;
140 //===----------------------------------------------------------------------===//
141 // Debug/Trace Registers
142 //===----------------------------------------------------------------------===//
144 def : SysReg<"scontext", 0x5A8>;
146 //===----------------------------------------------------------------------===//
147 // Supervisor Count Overflow (defined in Sscofpmf)
148 //===----------------------------------------------------------------------===//
150 def : SysReg<"scountovf", 0xDA0>;
152 //===----------------------------------------------------------------------===//
153 // Hypervisor Trap Setup
154 //===----------------------------------------------------------------------===//
156 def : SysReg<"hstatus", 0x600>;
157 def : SysReg<"hedeleg", 0x602>;
158 def : SysReg<"hideleg", 0x603>;
159 def : SysReg<"hie", 0x604>;
160 def : SysReg<"hcounteren", 0x606>;
161 def : SysReg<"hgeie", 0x607>;
163 //===----------------------------------------------------------------------===//
164 // Hypervisor Trap Handling
165 //===----------------------------------------------------------------------===//
167 def : SysReg<"htval", 0x643>;
168 def : SysReg<"hip", 0x644>;
169 def : SysReg<"hvip", 0x645>;
170 def : SysReg<"htinst", 0x64A>;
171 def : SysReg<"hgeip", 0xE12>;
173 //===----------------------------------------------------------------------===//
174 // Hypervisor Configuration
175 //===----------------------------------------------------------------------===//
177 def : SysReg<"henvcfg", 0x60A>;
178 let isRV32Only = 1 in
179 def : SysReg<"henvcfgh", 0x61A>;
181 //===----------------------------------------------------------------------===//
182 // Hypervisor Protection and Translation
183 //===----------------------------------------------------------------------===//
185 def : SysReg<"hgatp", 0x680>;
187 //===----------------------------------------------------------------------===//
188 // Debug/Trace Registers
189 //===----------------------------------------------------------------------===//
191 def : SysReg<"hcontext", 0x6A8>;
193 //===----------------------------------------------------------------------===//
194 // Hypervisor Counter/Timer Virtualization Registers
195 //===----------------------------------------------------------------------===//
197 def : SysReg<"htimedelta", 0x605>;
198 let isRV32Only = 1 in
199 def : SysReg<"htimedeltah", 0x615>;
201 //===----------------------------------------------------------------------===//
202 // Virtual Supervisor Registers
203 //===----------------------------------------------------------------------===//
205 def : SysReg<"vsstatus", 0x200>;
206 def : SysReg<"vsie", 0x204>;
207 def : SysReg<"vstvec", 0x205>;
208 def : SysReg<"vsscratch", 0x240>;
209 def : SysReg<"vsepc", 0x241>;
210 def : SysReg<"vscause", 0x242>;
211 def : SysReg<"vstval", 0x243>;
212 def : SysReg<"vsip", 0x244>;
213 def : SysReg<"vstimecmp", 0x24D>;
214 let isRV32Only = 1 in
215 def : SysReg<"vstimecmph", 0x25D>;
216 def : SysReg<"vsatp", 0x280>;
218 //===----------------------------------------------------------------------===//
219 // Machine Information Registers
220 //===----------------------------------------------------------------------===//
222 def : SysReg<"mvendorid", 0xF11>;
223 def : SysReg<"marchid", 0xF12>;
224 def : SysReg<"mimpid", 0xF13>;
225 def : SysReg<"mhartid", 0xF14>;
226 def : SysReg<"mconfigptr", 0xF15>;
228 //===----------------------------------------------------------------------===//
229 // Machine Trap Setup
230 //===----------------------------------------------------------------------===//
231 def : SysReg<"mstatus", 0x300>;
232 def : SysReg<"misa", 0x301>;
233 def : SysReg<"medeleg", 0x302>;
234 def : SysReg<"mideleg", 0x303>;
235 def : SysReg<"mie", 0x304>;
236 def : SysReg<"mtvec", 0x305>;
237 def : SysReg<"mcounteren", 0x306>;
238 let isRV32Only = 1 in
239 def : SysReg<"mstatush", 0x310>;
241 //===----------------------------------------------------------------------===//
242 // Machine Trap Handling
243 //===----------------------------------------------------------------------===//
244 def : SysReg<"mscratch", 0x340>;
245 def : SysReg<"mepc", 0x341>;
246 def : SysReg<"mcause", 0x342>;
247 let DeprecatedName = "mbadaddr" in
248 def : SysReg<"mtval", 0x343>;
249 def : SysReg<"mip", 0x344>;
250 def : SysReg<"mtinst", 0x34A>;
251 def : SysReg<"mtval2", 0x34B>;
253 //===----------------------------------------------------------------------===//
254 // Machine Configuration
255 //===----------------------------------------------------------------------===//
257 def : SysReg<"menvcfg", 0x30A>;
258 let isRV32Only = 1 in
259 def : SysReg<"menvcfgh", 0x31A>;
260 def : SysReg<"mseccfg", 0x747>;
261 let isRV32Only = 1 in
262 def : SysReg<"mseccfgh", 0x757>;
264 //===----------------------------------------------------------------------===//
265 // Machine Protection and Translation
266 //===----------------------------------------------------------------------===//
268 // pmpcfg0-pmpcfg15 at 0x3A0-0x3AF. Odd-numbered registers are RV32-only.
269 foreach i = 0...15 in {
270   let isRV32Only = !and(i, 1) in
271   def : SysReg<"pmpcfg"#i, !add(0x3A0, i)>;
274 // pmpaddr0-pmpaddr63 at 0x3B0-0x3EF.
275 foreach i = 0...63 in
276   def : SysReg<"pmpaddr"#i, !add(0x3B0, i)>;
278 //===----------------------------------------------------------------------===//
279 // Machine Counter and Timers
280 //===----------------------------------------------------------------------===//
281 def : SysReg<"mcycle", 0xB00>;
282 def : SysReg<"minstret", 0xB02>;
284 // mhpmcounter3-mhpmcounter31 at 0xB03-0xB1F.
285 foreach i = 3...31 in
286   def : SysReg<"mhpmcounter"#i, !add(0xB03, !sub(i, 3))>;
288 let isRV32Only = 1 in {
289 def: SysReg<"mcycleh", 0xB80>;
290 def: SysReg<"minstreth", 0xB82>;
292 // mhpmcounter3h-mhpmcounter31h at 0xB83-0xB9F.
293 foreach i = 3...31 in
294   def : SysReg<"mhpmcounter"#i#"h", !add(0xB83, !sub(i, 3))>;
297 //===----------------------------------------------------------------------===//
298 // Machine Counter Setup
299 //===----------------------------------------------------------------------===//
300 let AltName = "mucounteren" in // Privileged spec v1.9.1 Name
301 def : SysReg<"mcountinhibit", 0x320>;
303 // mhpmevent3-mhpmevent31 at 0x323-0x33F.
304 foreach i = 3...31 in
305   def : SysReg<"mhpmevent"#i, !add(0x323, !sub(i, 3))>;
307 // mhpmevent3h-mhpmevent31h at 0x723-0x73F
308 foreach i = 3...31 in {
309   let isRV32Only = 1 in
310   def : SysReg<"mhpmevent"#i#"h", !add(0x723, !sub(i, 3))>;
313 //===----------------------------------------------------------------------===//
314 // Debug/ Trace Registers (shared with Debug Mode)
315 //===----------------------------------------------------------------------===//
316 def : SysReg<"tselect", 0x7A0>;
317 def : SysReg<"tdata1", 0x7A1>;
318 def : SysReg<"tdata2", 0x7A2>;
319 def : SysReg<"tdata3", 0x7A3>;
320 def : SysReg<"mcontext", 0x7A8>;
322 //===----------------------------------------------------------------------===//
323 // Debug Mode Registers
324 //===----------------------------------------------------------------------===//
325 def : SysReg<"dcsr", 0x7B0>;
326 def : SysReg<"dpc", 0x7B1>;
328 // "dscratch" is an alternative name for "dscratch0" which appeared in earlier
329 // drafts of the RISC-V debug spec
330 let AltName = "dscratch" in
331 def : SysReg<"dscratch0", 0x7B2>;
332 def : SysReg<"dscratch1", 0x7B3>;
334 //===----------------------------------------------------------------------===//
335 // User Vector CSRs
336 //===----------------------------------------------------------------------===//
337 def : SysReg<"vstart", 0x008>;
338 def : SysReg<"vxsat", 0x009>;
339 def SysRegVXRM : SysReg<"vxrm", 0x00A>;
340 def : SysReg<"vcsr", 0x00F>;
341 def SysRegVL : SysReg<"vl", 0xC20>;
342 def : SysReg<"vtype", 0xC21>;
343 def SysRegVLENB: SysReg<"vlenb", 0xC22>;
345 //===----------------------------------------------------------------------===//
346 // Shadow Stack CSR
347 //===----------------------------------------------------------------------===//
348 def : SysReg<"ssp", 0x011>;
350 //===----------------------------------------------------------------------===//
351 // State Enable Extension (Smstateen)
352 //===----------------------------------------------------------------------===//
354 // sstateen0-sstateen3 at 0x10C-0x10F, mstateen0-mstateen3 at 0x30C-0x30F,
355 // mstateen0h-mstateen3h at 0x31C-0x31F, hstateen0-hstateen3 at 0x60C-0x60F,
356 // and hstateen0h-hstateen3h at 0x61C-0x61F.
357 foreach i = 0...3 in {
358   def : SysReg<"sstateen"#i, !add(0x10C, i)>;
359   def : SysReg<"mstateen"#i, !add(0x30C, i)>;
360   let isRV32Only = 1 in
361   def : SysReg<"mstateen"#i#"h", !add(0x31C, i)>;
362   def : SysReg<"hstateen"#i, !add(0x60C, i)>;
363   let isRV32Only = 1 in
364   def : SysReg<"hstateen"#i#"h", !add(0x61C, i)>;
367 //===-----------------------------------------------
368 // Entropy Source CSR
369 //===-----------------------------------------------
371 def SEED : SysReg<"seed", 0x015>;
373 //===-----------------------------------------------
374 // Advanced Interrupt Architecture
375 //===-----------------------------------------------
377 // Machine-level CSRs
378 def : SysReg<"miselect", 0x350>;
379 def : SysReg<"mireg", 0x351>;
380 def : SysReg<"mtopei", 0x35C>;
381 def : SysReg<"mtopi", 0xFB0>;
382 def : SysReg<"mvien", 0x308>;
383 def : SysReg<"mvip", 0x309>;
384 let isRV32Only = 1 in {
385 def : SysReg<"midelegh", 0x313>;
386 def : SysReg<"mieh", 0x314>;
387 def : SysReg<"mvienh", 0x318>;
388 def : SysReg<"mviph", 0x319>;
389 def : SysReg<"miph", 0x354>;
390 } // isRV32Only
392 // Supervisor-level CSRs
393 def : SysReg<"siselect", 0x150>;
394 def : SysReg<"sireg", 0x151>;
395 def : SysReg<"stopei", 0x15C>;
396 def : SysReg<"stopi", 0xDB0>;
397 let isRV32Only = 1 in {
398 def : SysReg<"sieh", 0x114>;
399 def : SysReg<"siph", 0x154>;
400 } // isRV32Only
402 // Hypervisor and VS CSRs
403 def : SysReg<"hvien", 0x608>;
404 def : SysReg<"hvictl", 0x609>;
405 def : SysReg<"hviprio1", 0x646>;
406 def : SysReg<"hviprio2", 0x647>;
407 def : SysReg<"vsiselect", 0x250>;
408 def : SysReg<"vsireg", 0x251>;
409 def : SysReg<"vstopei", 0x25C>;
410 def : SysReg<"vstopi", 0xEB0>;
411 let isRV32Only = 1 in {
412 def : SysReg<"hidelegh", 0x613>;
413 def : SysReg<"hvienh", 0x618>;
414 def : SysReg<"hviph", 0x655>;
415 def : SysReg<"hviprio1h", 0x656>;
416 def : SysReg<"hviprio2h", 0x657>;
417 def : SysReg<"vsieh", 0x214>;
418 def : SysReg<"vsiph", 0x254>;
419 } // isRV32Only
421 //===-----------------------------------------------
422 // Jump Vector Table CSR
423 //===-----------------------------------------------
425 def : SysReg<"jvt", 0x017>;
427 //===-----------------------------------------------
428 // Resumable Non-Maskable Interrupts(Smrnmi) CSRs
429 //===-----------------------------------------------
430 def : SysReg<"mnscratch", 0x740>;
431 def : SysReg<"mnepc", 0x741>;
432 def : SysReg<"mncause", 0x742>;
433 def : SysReg<"mnstatus", 0x744>;