123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 |
- //===- RISCVSystemOperands.td ------------------------------*- tablegen -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines the symbolic operands permitted for various kinds of
- // RISC-V system instruction.
- //
- //===----------------------------------------------------------------------===//
- include "llvm/TableGen/SearchableTable.td"
- //===----------------------------------------------------------------------===//
- // CSR (control and status register read/write) instruction options.
- //===----------------------------------------------------------------------===//
- class SysReg<string name, bits<12> op> {
- string Name = name;
- // A maximum of one alias is supported right now.
- string AltName = name;
- // A maximum of one deprecated name is supported right now. Unlike the
- // `AltName` alias, a `DeprecatedName` generates a diagnostic when the name is
- // used to encourage software to migrate away from the name.
- string DeprecatedName = "";
- bits<12> Encoding = op;
- // FIXME: add these additional fields when needed.
- // Privilege Access: Read and Write = 0, 1, 2; Read-Only = 3.
- // Privilege Mode: User = 0, System = 1 or Machine = 3.
- // bits<2> ReadWrite = op{11 - 10};
- // bits<2> XMode = op{9 - 8};
- // Check Extra field name and what bits 7-6 correspond to.
- // bits<2> Extra = op{7 - 6};
- // Register number without the privilege bits.
- // bits<6> Number = op{5 - 0};
- code FeaturesRequired = [{ {} }];
- bit isRV32Only = 0;
- }
- def SysRegsList : GenericTable {
- let FilterClass = "SysReg";
- // FIXME: add "ReadWrite", "Mode", "Extra", "Number" fields when needed.
- let Fields = [
- "Name", "AltName", "DeprecatedName", "Encoding", "FeaturesRequired",
- "isRV32Only",
- ];
- let PrimaryKey = [ "Encoding" ];
- let PrimaryKeyName = "lookupSysRegByEncoding";
- }
- def lookupSysRegByName : SearchIndex {
- let Table = SysRegsList;
- let Key = [ "Name" ];
- }
- def lookupSysRegByAltName : SearchIndex {
- let Table = SysRegsList;
- let Key = [ "AltName" ];
- }
- def lookupSysRegByDeprecatedName : SearchIndex {
- let Table = SysRegsList;
- let Key = [ "DeprecatedName" ];
- }
- // The following CSR encodings match those given in Tables 2.2,
- // 2.3, 2.4 and 2.5 in the RISC-V Instruction Set Manual
- // Volume II: Privileged Architecture.
- //===----------------------------------------------------------------------===//
- // User Trap Setup
- //===----------------------------------------------------------------------===//
- def : SysReg<"ustatus", 0x000>;
- def : SysReg<"uie", 0x004>;
- def : SysReg<"utvec", 0x005>;
- //===----------------------------------------------------------------------===//
- // User Trap Handling
- //===----------------------------------------------------------------------===//
- def : SysReg<"uscratch", 0x040>;
- def : SysReg<"uepc", 0x041>;
- def : SysReg<"ucause", 0x042>;
- let DeprecatedName = "ubadaddr" in
- def : SysReg<"utval", 0x043>;
- def : SysReg<"uip", 0x044>;
- //===----------------------------------------------------------------------===//
- // User Floating-Point CSRs
- //===----------------------------------------------------------------------===//
- def SysRegFFLAGS : SysReg<"fflags", 0x001>;
- def SysRegFRM : SysReg<"frm", 0x002>;
- def SysRegFCSR : SysReg<"fcsr", 0x003>;
- //===----------------------------------------------------------------------===//
- // User Counter/Timers
- //===----------------------------------------------------------------------===//
- def CYCLE : SysReg<"cycle", 0xC00>;
- def TIME : SysReg<"time", 0xC01>;
- def INSTRET : SysReg<"instret", 0xC02>;
- // hpmcounter3-hpmcounter31 at 0xC03-0xC1F.
- foreach i = 3...31 in
- def : SysReg<"hpmcounter"#i, !add(0xC03, !sub(i, 3))>;
- let isRV32Only = 1 in {
- def CYCLEH : SysReg<"cycleh", 0xC80>;
- def TIMEH : SysReg<"timeh", 0xC81>;
- def INSTRETH : SysReg<"instreth", 0xC82>;
- // hpmcounter3h-hpmcounter31h at 0xC83-0xC9F.
- foreach i = 3...31 in
- def : SysReg<"hpmcounter"#i#"h", !add(0xC83, !sub(i, 3))>;
- }
- //===----------------------------------------------------------------------===//
- // Supervisor Trap Setup
- //===----------------------------------------------------------------------===//
- def : SysReg<"sstatus", 0x100>;
- def : SysReg<"sedeleg", 0x102>;
- def : SysReg<"sideleg", 0x103>;
- def : SysReg<"sie", 0x104>;
- def : SysReg<"stvec", 0x105>;
- def : SysReg<"scounteren", 0x106>;
- def : SysReg<"stimecmp", 0x14D>;
- let isRV32Only = 1 in
- def : SysReg<"stimecmph", 0x15D>;
- //===----------------------------------------------------------------------===//
- // Supervisor Configuration
- //===----------------------------------------------------------------------===//
- def : SysReg<"senvcfg", 0x10A>;
- //===----------------------------------------------------------------------===//
- // Supervisor Trap Handling
- //===----------------------------------------------------------------------===//
- def : SysReg<"sscratch", 0x140>;
- def : SysReg<"sepc", 0x141>;
- def : SysReg<"scause", 0x142>;
- let DeprecatedName = "sbadaddr" in
- def : SysReg<"stval", 0x143>;
- def : SysReg<"sip", 0x144>;
- //===----------------------------------------------------------------------===//
- // Supervisor Protection and Translation
- //===----------------------------------------------------------------------===//
- let DeprecatedName = "sptbr" in
- def : SysReg<"satp", 0x180>;
- //===----------------------------------------------------------------------===//
- // Debug/Trace Registers
- //===----------------------------------------------------------------------===//
- def : SysReg<"scontext", 0x5A8>;
- //===----------------------------------------------------------------------===//
- // Supervisor Count Overflow (defined in Sscofpmf)
- //===----------------------------------------------------------------------===//
- def : SysReg<"scountovf", 0xDA0>;
- //===----------------------------------------------------------------------===//
- // Hypervisor Trap Setup
- //===----------------------------------------------------------------------===//
- def : SysReg<"hstatus", 0x600>;
- def : SysReg<"hedeleg", 0x602>;
- def : SysReg<"hideleg", 0x603>;
- def : SysReg<"hie", 0x604>;
- def : SysReg<"hcounteren", 0x606>;
- def : SysReg<"hgeie", 0x607>;
- //===----------------------------------------------------------------------===//
- // Hypervisor Trap Handling
- //===----------------------------------------------------------------------===//
- def : SysReg<"htval", 0x643>;
- def : SysReg<"hip", 0x644>;
- def : SysReg<"hvip", 0x645>;
- def : SysReg<"htinst", 0x64A>;
- def : SysReg<"hgeip", 0xE12>;
- //===----------------------------------------------------------------------===//
- // Hypervisor Configuration
- //===----------------------------------------------------------------------===//
- def : SysReg<"henvcfg", 0x60A>;
- let isRV32Only = 1 in
- def : SysReg<"henvcfgh", 0x61A>;
- //===----------------------------------------------------------------------===//
- // Hypervisor Protection and Translation
- //===----------------------------------------------------------------------===//
- def : SysReg<"hgatp", 0x680>;
- //===----------------------------------------------------------------------===//
- // Debug/Trace Registers
- //===----------------------------------------------------------------------===//
- def : SysReg<"hcontext", 0x6A8>;
- //===----------------------------------------------------------------------===//
- // Hypervisor Counter/Timer Virtualization Registers
- //===----------------------------------------------------------------------===//
- def : SysReg<"htimedelta", 0x605>;
- let isRV32Only = 1 in
- def : SysReg<"htimedeltah", 0x615>;
- //===----------------------------------------------------------------------===//
- // Virtual Supervisor Registers
- //===----------------------------------------------------------------------===//
- def : SysReg<"vsstatus", 0x200>;
- def : SysReg<"vsie", 0x204>;
- def : SysReg<"vstvec", 0x205>;
- def : SysReg<"vsscratch", 0x240>;
- def : SysReg<"vsepc", 0x241>;
- def : SysReg<"vscause", 0x242>;
- def : SysReg<"vstval", 0x243>;
- def : SysReg<"vsip", 0x244>;
- def : SysReg<"vstimecmp", 0x24D>;
- let isRV32Only = 1 in
- def : SysReg<"vstimecmph", 0x25D>;
- def : SysReg<"vsatp", 0x280>;
- //===----------------------------------------------------------------------===//
- // Machine Information Registers
- //===----------------------------------------------------------------------===//
- def : SysReg<"mvendorid", 0xF11>;
- def : SysReg<"marchid", 0xF12>;
- def : SysReg<"mimpid", 0xF13>;
- def : SysReg<"mhartid", 0xF14>;
- def : SysReg<"mconfigptr", 0xF15>;
- //===----------------------------------------------------------------------===//
- // Machine Trap Setup
- //===----------------------------------------------------------------------===//
- def : SysReg<"mstatus", 0x300>;
- def : SysReg<"misa", 0x301>;
- def : SysReg<"medeleg", 0x302>;
- def : SysReg<"mideleg", 0x303>;
- def : SysReg<"mie", 0x304>;
- def : SysReg<"mtvec", 0x305>;
- def : SysReg<"mcounteren", 0x306>;
- let isRV32Only = 1 in
- def : SysReg<"mstatush", 0x310>;
- //===----------------------------------------------------------------------===//
- // Machine Trap Handling
- //===----------------------------------------------------------------------===//
- def : SysReg<"mscratch", 0x340>;
- def : SysReg<"mepc", 0x341>;
- def : SysReg<"mcause", 0x342>;
- let DeprecatedName = "mbadaddr" in
- def : SysReg<"mtval", 0x343>;
- def : SysReg<"mip", 0x344>;
- def : SysReg<"mtinst", 0x34A>;
- def : SysReg<"mtval2", 0x34B>;
- //===----------------------------------------------------------------------===//
- // Machine Configuration
- //===----------------------------------------------------------------------===//
- def : SysReg<"menvcfg", 0x30A>;
- let isRV32Only = 1 in
- def : SysReg<"menvcfgh", 0x31A>;
- def : SysReg<"mseccfg", 0x747>;
- let isRV32Only = 1 in
- def : SysReg<"mseccfgh", 0x757>;
- //===----------------------------------------------------------------------===//
- // Machine Protection and Translation
- //===----------------------------------------------------------------------===//
- // pmpcfg0-pmpcfg15 at 0x3A0-0x3AF. Odd-numbered registers are RV32-only.
- foreach i = 0...15 in {
- let isRV32Only = !and(i, 1) in
- def : SysReg<"pmpcfg"#i, !add(0x3A0, i)>;
- }
- // pmpaddr0-pmpaddr63 at 0x3B0-0x3EF.
- foreach i = 0...63 in
- def : SysReg<"pmpaddr"#i, !add(0x3B0, i)>;
- //===----------------------------------------------------------------------===//
- // Machine Counter and Timers
- //===----------------------------------------------------------------------===//
- def : SysReg<"mcycle", 0xB00>;
- def : SysReg<"minstret", 0xB02>;
- // mhpmcounter3-mhpmcounter31 at 0xB03-0xB1F.
- foreach i = 3...31 in
- def : SysReg<"mhpmcounter"#i, !add(0xB03, !sub(i, 3))>;
- let isRV32Only = 1 in {
- def: SysReg<"mcycleh", 0xB80>;
- def: SysReg<"minstreth", 0xB82>;
- // mhpmcounter3h-mhpmcounter31h at 0xB83-0xB9F.
- foreach i = 3...31 in
- def : SysReg<"mhpmcounter"#i#"h", !add(0xB83, !sub(i, 3))>;
- }
- //===----------------------------------------------------------------------===//
- // Machine Counter Setup
- //===----------------------------------------------------------------------===//
- let AltName = "mucounteren" in // Privileged spec v1.9.1 Name
- def : SysReg<"mcountinhibit", 0x320>;
- // mhpmevent3-mhpmevent31 at 0x323-0x33F.
- foreach i = 3...31 in
- def : SysReg<"mhpmevent"#i, !add(0x323, !sub(i, 3))>;
- // mhpmevent3h-mhpmevent31h at 0x723-0x73F
- foreach i = 3...31 in {
- let isRV32Only = 1 in
- def : SysReg<"mhpmevent"#i#"h", !add(0x723, !sub(i, 3))>;
- }
- //===----------------------------------------------------------------------===//
- // Debug/ Trace Registers (shared with Debug Mode)
- //===----------------------------------------------------------------------===//
- def : SysReg<"tselect", 0x7A0>;
- def : SysReg<"tdata1", 0x7A1>;
- def : SysReg<"tdata2", 0x7A2>;
- def : SysReg<"tdata3", 0x7A3>;
- def : SysReg<"mcontext", 0x7A8>;
- //===----------------------------------------------------------------------===//
- // Debug Mode Registers
- //===----------------------------------------------------------------------===//
- def : SysReg<"dcsr", 0x7B0>;
- def : SysReg<"dpc", 0x7B1>;
- // "dscratch" is an alternative name for "dscratch0" which appeared in earlier
- // drafts of the RISC-V debug spec
- let AltName = "dscratch" in
- def : SysReg<"dscratch0", 0x7B2>;
- def : SysReg<"dscratch1", 0x7B3>;
- //===----------------------------------------------------------------------===//
- // User Vector CSRs
- //===----------------------------------------------------------------------===//
- def : SysReg<"vstart", 0x008>;
- def : SysReg<"vxsat", 0x009>;
- def : SysReg<"vxrm", 0x00A>;
- def : SysReg<"vcsr", 0x00F>;
- def : SysReg<"vl", 0xC20>;
- def : SysReg<"vtype", 0xC21>;
- def SysRegVLENB: SysReg<"vlenb", 0xC22>;
- //===----------------------------------------------------------------------===//
- // State Enable Extension (Smstateen)
- //===----------------------------------------------------------------------===//
- // sstateen0-sstateen3 at 0x10C-0x10F, mstateen0-mstateen3 at 0x30C-0x30F,
- // mstateen0h-mstateen3h at 0x31C-0x31F, hstateen0-hstateen3 at 0x60C-0x60F,
- // and hstateen0h-hstateen3h at 0x61C-0x61F.
- foreach i = 0...3 in {
- def : SysReg<"sstateen"#i, !add(0x10C, i)>;
- def : SysReg<"mstateen"#i, !add(0x30C, i)>;
- let isRV32Only = 1 in
- def : SysReg<"mstateen"#i#"h", !add(0x31C, i)>;
- def : SysReg<"hstateen"#i, !add(0x60C, i)>;
- let isRV32Only = 1 in
- def : SysReg<"hstateen"#i#"h", !add(0x61C, i)>;
- }
- //===-----------------------------------------------
- // Entropy Source CSR
- //===-----------------------------------------------
- def SEED : SysReg<"seed", 0x015>;
|