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