1//===-- HexagonRegisterInfo.td - Hexagon Register defs -----*- 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//===----------------------------------------------------------------------===// 10// Declarations that describe the Hexagon register file. 11//===----------------------------------------------------------------------===// 12 13let Namespace = "Hexagon" in { 14 15 class HexagonReg<bits<5> num, string n, list<string> alt = [], 16 list<Register> alias = []> : Register<n, alt> { 17 let Aliases = alias; 18 let HWEncoding{4-0} = num; 19 } 20 21 // These registers are used to preserve a distinction between 22 // vector register pairs of differing order. 23 class HexagonFakeReg<string n> : Register<n> { 24 let isArtificial = 1; 25 } 26 27 class HexagonDoubleReg<bits<5> num, string n, list<Register> subregs, 28 list<string> alt = []> : 29 RegisterWithSubRegs<n, subregs> { 30 let AltNames = alt; 31 let HWEncoding{4-0} = num; 32 } 33 34 class HexagonSys<bits<7> num, string n, list<string> alt = [], 35 list<Register> alias = []> : Register<n, alt> { 36 let Aliases = alias; 37 let HWEncoding{6-0} = num; 38 } 39 40 class HexagonDoubleSys<bits<7> num, string n, list<Register> subregs, 41 list<string> alt = []> : 42 RegisterWithSubRegs<n, subregs> { 43 let AltNames = alt; 44 let HWEncoding{6-0} = num; 45 } 46 47 // Registers are identified with 5-bit ID numbers. 48 // Ri - 32-bit integer registers. 49 class Ri<bits<5> num, string n, list<string> alt = []> : 50 HexagonReg<num, n, alt>; 51 52 // Rp - false/pseudo registers. These registers are used 53 // to provide a distinct set of aliases for both styles of vector 54 // register pairs without encountering subregister indexing constraints. 55 class R_fake<string n> : 56 HexagonFakeReg<n>; 57 58 59 // Rf - 32-bit floating-point registers. 60 class Rf<bits<5> num, string n> : HexagonReg<num, n>; 61 62 // Rd - 64-bit registers. 63 class Rd<bits<5> num, string n, list<Register> subregs, 64 list<string> alt = []> : 65 HexagonDoubleReg<num, n, subregs, alt> { 66 let SubRegs = subregs; 67 } 68 69 // Rp - predicate registers 70 class Rp<bits<5> num, string n> : HexagonReg<num, n>; 71 72 73 // Rq - vector predicate registers 74 class Rq<bits<3> num, string n> : Register<n, []> { 75 let HWEncoding{2-0} = num; 76 } 77 78 // Rc - control registers 79 class Rc<bits<5> num, string n, 80 list<string> alt = [], list<Register> alias = []> : 81 HexagonReg<num, n, alt, alias>; 82 83 // Rcc - 64-bit control registers. 84 class Rcc<bits<5> num, string n, list<Register> subregs, 85 list<string> alt = []> : 86 HexagonDoubleReg<num, n, subregs, alt> { 87 let SubRegs = subregs; 88 } 89 90 // Rs - system registers 91 class Rs<bits<7> num, string n, 92 list<string> alt = [], list<Register> alias = []> : 93 HexagonSys<num, n, alt, alias>; 94 95 // Rss - 64-bit system registers. 96 class Rss<bits<7> num, string n, list<Register> subregs, 97 list<string> alt = []> : 98 HexagonDoubleSys<num, n, subregs, alt> { 99 let SubRegs = subregs; 100 } 101 102 // Mx - address modifier registers 103 class Mx<bits<1> num, string n> : Register<n, []> { 104 let HWEncoding{0} = num; 105 } 106 107 // Rg - Guest/Hypervisor registers 108 class Rg<bits<5> num, string n, 109 list<string> alt = [], list<Register> alias = []> : 110 HexagonReg<num, n, alt, alias>; 111 112 // Rgg - 64-bit Guest/Hypervisor registers 113 class Rgg<bits<5> num, string n, list<Register> subregs> : 114 HexagonDoubleReg<num, n, subregs> { 115 let SubRegs = subregs; 116 } 117 118 def isub_lo : SubRegIndex<32>; 119 def isub_hi : SubRegIndex<32, 32>; 120 def vsub_lo : SubRegIndex<512>; 121 def vsub_hi : SubRegIndex<512, 512>; 122 def vsub_fake: SubRegIndex<512>; 123 def wsub_lo : SubRegIndex<1024>; 124 def wsub_hi : SubRegIndex<1024, 1024>; 125 def subreg_overflow : SubRegIndex<1, 0>; 126 127 // Integer registers. 128 foreach i = 0-28 in { 129 def R#i : Ri<i, "r"#i>, DwarfRegNum<[i]>; 130 } 131 def R29 : Ri<29, "r29", ["sp"]>, DwarfRegNum<[29]>; 132 def R30 : Ri<30, "r30", ["fp"]>, DwarfRegNum<[30]>; 133 def R31 : Ri<31, "r31", ["lr"]>, DwarfRegNum<[31]>; 134 135 // Aliases of the R* registers used to hold 64-bit int values (doubles). 136 let SubRegIndices = [isub_lo, isub_hi], CoveredBySubRegs = 1 in { 137 def D0 : Rd< 0, "r1:0", [R0, R1]>, DwarfRegNum<[32]>; 138 def D1 : Rd< 2, "r3:2", [R2, R3]>, DwarfRegNum<[34]>; 139 def D2 : Rd< 4, "r5:4", [R4, R5]>, DwarfRegNum<[36]>; 140 def D3 : Rd< 6, "r7:6", [R6, R7]>, DwarfRegNum<[38]>; 141 def D4 : Rd< 8, "r9:8", [R8, R9]>, DwarfRegNum<[40]>; 142 def D5 : Rd<10, "r11:10", [R10, R11]>, DwarfRegNum<[42]>; 143 def D6 : Rd<12, "r13:12", [R12, R13]>, DwarfRegNum<[44]>; 144 def D7 : Rd<14, "r15:14", [R14, R15]>, DwarfRegNum<[46]>; 145 def D8 : Rd<16, "r17:16", [R16, R17]>, DwarfRegNum<[48]>; 146 def D9 : Rd<18, "r19:18", [R18, R19]>, DwarfRegNum<[50]>; 147 def D10 : Rd<20, "r21:20", [R20, R21]>, DwarfRegNum<[52]>; 148 def D11 : Rd<22, "r23:22", [R22, R23]>, DwarfRegNum<[54]>; 149 def D12 : Rd<24, "r25:24", [R24, R25]>, DwarfRegNum<[56]>; 150 def D13 : Rd<26, "r27:26", [R26, R27]>, DwarfRegNum<[58]>; 151 def D14 : Rd<28, "r29:28", [R28, R29]>, DwarfRegNum<[60]>; 152 def D15 : Rd<30, "r31:30", [R30, R31], ["lr:fp"]>, DwarfRegNum<[62]>; 153 } 154 155 // Predicate registers. 156 def P0 : Rp<0, "p0">, DwarfRegNum<[63]>; 157 def P1 : Rp<1, "p1">, DwarfRegNum<[64]>; 158 def P2 : Rp<2, "p2">, DwarfRegNum<[65]>; 159 def P3 : Rp<3, "p3">, DwarfRegNum<[66]>; 160 161 // Fake register to represent USR.OVF bit. Arithmetic/saturating instruc- 162 // tions modify this bit, and multiple such instructions are allowed in the 163 // same packet. We need to ignore output dependencies on this bit, but not 164 // on the entire USR. 165 def USR_OVF : Rc<?, "usr.ovf">; 166 167 def USR : Rc<8, "usr", ["c8"]>, DwarfRegNum<[75]> { 168 let SubRegIndices = [subreg_overflow]; 169 let SubRegs = [USR_OVF]; 170 } 171 172 // Control registers. 173 def SA0: Rc<0, "sa0", ["c0"]>, DwarfRegNum<[67]>; 174 def LC0: Rc<1, "lc0", ["c1"]>, DwarfRegNum<[68]>; 175 def SA1: Rc<2, "sa1", ["c2"]>, DwarfRegNum<[69]>; 176 def LC1: Rc<3, "lc1", ["c3"]>, DwarfRegNum<[70]>; 177 def P3_0: Rc<4, "p3:0", ["c4"], [P0, P1, P2, P3]>, 178 DwarfRegNum<[71]>; 179 // When defining more Cn registers, make sure to explicitly mark them 180 // as reserved in HexagonRegisterInfo.cpp. 181 def C5: Rc<5, "c5", ["c5"]>, DwarfRegNum<[72]>; 182 def M0: Rc<6, "m0", ["c6"]>, DwarfRegNum<[73]>; 183 def M1: Rc<7, "m1", ["c7"]>, DwarfRegNum<[74]>; 184 // Define C8 separately and make it aliased with USR. 185 // The problem is that USR has subregisters (e.g. overflow). If USR was 186 // specified as a subregister of C9_8, it would imply that subreg_overflow 187 // and isub_lo can be composed, which leads to all kinds of issues 188 // with lane masks. 189 def C8: Rc<8, "c8", [], [USR]>, DwarfRegNum<[75]>; 190 def PC: Rc<9, "pc", ["c9"]>, DwarfRegNum<[76]>; 191 def UGP: Rc<10, "ugp", ["c10"]>, DwarfRegNum<[77]>; 192 def GP: Rc<11, "gp", ["c11"]>, DwarfRegNum<[78]>; 193 def CS0: Rc<12, "cs0", ["c12"]>, DwarfRegNum<[79]>; 194 def CS1: Rc<13, "cs1", ["c13"]>, DwarfRegNum<[80]>; 195 def UPCYCLELO: Rc<14, "upcyclelo", ["c14"]>, DwarfRegNum<[81]>; 196 def UPCYCLEHI: Rc<15, "upcyclehi", ["c15"]>, DwarfRegNum<[82]>; 197 def FRAMELIMIT: Rc<16, "framelimit", ["c16"]>, DwarfRegNum<[83]>; 198 def FRAMEKEY: Rc<17, "framekey", ["c17"]>, DwarfRegNum<[84]>; 199 def PKTCOUNTLO: Rc<18, "pktcountlo", ["c18"]>, DwarfRegNum<[85]>; 200 def PKTCOUNTHI: Rc<19, "pktcounthi", ["c19"]>, DwarfRegNum<[86]>; 201 def UTIMERLO: Rc<30, "utimerlo", ["c30"]>, DwarfRegNum<[97]>; 202 def UTIMERHI: Rc<31, "utimerhi", ["c31"]>, DwarfRegNum<[98]>; 203 204 // Control registers pairs. 205 let SubRegIndices = [isub_lo, isub_hi], CoveredBySubRegs = 1 in { 206 def C1_0 : Rcc<0, "c1:0", [SA0, LC0], ["lc0:sa0"]>, DwarfRegNum<[67]>; 207 def C3_2 : Rcc<2, "c3:2", [SA1, LC1], ["lc1:sa1"]>, DwarfRegNum<[69]>; 208 def C5_4 : Rcc<4, "c5:4", [P3_0, C5]>, DwarfRegNum<[71]>; 209 def C7_6 : Rcc<6, "c7:6", [M0, M1], ["m1:0"]>, DwarfRegNum<[72]>; 210 // Use C8 instead of USR as a subregister of C9_8. 211 def C9_8 : Rcc<8, "c9:8", [C8, PC]>, DwarfRegNum<[74]>; 212 def C11_10 : Rcc<10, "c11:10", [UGP, GP]>, DwarfRegNum<[76]>; 213 def CS : Rcc<12, "c13:12", [CS0, CS1], ["cs1:0"]>, DwarfRegNum<[78]>; 214 def UPCYCLE: Rcc<14, "c15:14", [UPCYCLELO, UPCYCLEHI], ["upcycle"]>, 215 DwarfRegNum<[80]>; 216 def C17_16 : Rcc<16, "c17:16", [FRAMELIMIT, FRAMEKEY]>, DwarfRegNum<[83]>; 217 def PKTCOUNT : Rcc<18, "c19:18", [PKTCOUNTLO, PKTCOUNTHI], ["pktcount"]>, 218 DwarfRegNum<[85]>; 219 def UTIMER : Rcc<30, "c31:30", [UTIMERLO, UTIMERHI], ["utimer"]>, 220 DwarfRegNum<[97]>; 221 } 222 223 foreach i = 0-31 in { 224 def V#i : Ri<i, "v"#i>, DwarfRegNum<[!add(i, 99)]>; 225 def VF#i : R_fake<"__"#!add(i,999999)>, DwarfRegNum<[!add(i, 999999)]>; 226 def VFR#i : R_fake<"__"#!add(i,9999999)>, DwarfRegNum<[!add(i, 9999999)]>; 227 } 228 def VTMP : Ri<0, "vtmp">, DwarfRegNum<[131]>; 229 230 // Aliases of the V* registers used to hold double vec values. 231 let SubRegIndices = [vsub_lo, vsub_hi, vsub_fake], CoveredBySubRegs = 1 in { 232 def W0 : Rd< 0, "v1:0", [V0, V1, VF0]>, DwarfRegNum<[99]>; 233 def W1 : Rd< 2, "v3:2", [V2, V3, VF1]>, DwarfRegNum<[101]>; 234 def W2 : Rd< 4, "v5:4", [V4, V5, VF2]>, DwarfRegNum<[103]>; 235 def W3 : Rd< 6, "v7:6", [V6, V7, VF3]>, DwarfRegNum<[105]>; 236 def W4 : Rd< 8, "v9:8", [V8, V9, VF4]>, DwarfRegNum<[107]>; 237 def W5 : Rd<10, "v11:10", [V10, V11, VF5]>, DwarfRegNum<[109]>; 238 def W6 : Rd<12, "v13:12", [V12, V13, VF6]>, DwarfRegNum<[111]>; 239 def W7 : Rd<14, "v15:14", [V14, V15, VF7]>, DwarfRegNum<[113]>; 240 def W8 : Rd<16, "v17:16", [V16, V17, VF8]>, DwarfRegNum<[115]>; 241 def W9 : Rd<18, "v19:18", [V18, V19, VF9]>, DwarfRegNum<[117]>; 242 def W10 : Rd<20, "v21:20", [V20, V21, VF10]>, DwarfRegNum<[119]>; 243 def W11 : Rd<22, "v23:22", [V22, V23, VF11]>, DwarfRegNum<[121]>; 244 def W12 : Rd<24, "v25:24", [V24, V25, VF12]>, DwarfRegNum<[123]>; 245 def W13 : Rd<26, "v27:26", [V26, V27, VF13]>, DwarfRegNum<[125]>; 246 def W14 : Rd<28, "v29:28", [V28, V29, VF14]>, DwarfRegNum<[127]>; 247 def W15 : Rd<30, "v31:30", [V30, V31, VF15]>, DwarfRegNum<[129]>; 248 } 249 250 // Reverse Aliases of the V* registers used to hold double vec values. 251 let SubRegIndices = [vsub_lo, vsub_hi, vsub_fake], CoveredBySubRegs = 1 in { 252 def WR0 : Rd< 1, "v0:1", [V0, V1, VFR0]>, DwarfRegNum<[161]>; 253 def WR1 : Rd< 3, "v2:3", [V2, V3, VFR1]>, DwarfRegNum<[162]>; 254 def WR2 : Rd< 5, "v4:5", [V4, V5, VFR2]>, DwarfRegNum<[163]>; 255 def WR3 : Rd< 7, "v6:7", [V6, V7, VFR3]>, DwarfRegNum<[164]>; 256 def WR4 : Rd< 9, "v8:9", [V8, V9, VFR4]>, DwarfRegNum<[165]>; 257 def WR5 : Rd<11, "v10:11", [V10, V11, VFR5]>, DwarfRegNum<[166]>; 258 def WR6 : Rd<13, "v12:13", [V12, V13, VFR6]>, DwarfRegNum<[167]>; 259 def WR7 : Rd<15, "v14:15", [V14, V15, VFR7]>, DwarfRegNum<[168]>; 260 def WR8 : Rd<17, "v16:17", [V16, V17, VFR8]>, DwarfRegNum<[169]>; 261 def WR9 : Rd<19, "v18:19", [V18, V19, VFR9]>, DwarfRegNum<[170]>; 262 def WR10: Rd<21, "v20:21", [V20, V21, VFR10]>, DwarfRegNum<[171]>; 263 def WR11: Rd<23, "v22:23", [V22, V23, VFR11]>, DwarfRegNum<[172]>; 264 def WR12: Rd<25, "v24:25", [V24, V25, VFR12]>, DwarfRegNum<[173]>; 265 def WR13: Rd<27, "v26:27", [V26, V27, VFR13]>, DwarfRegNum<[174]>; 266 def WR14: Rd<29, "v28:29", [V28, V29, VFR14]>, DwarfRegNum<[175]>; 267 def WR15: Rd<31, "v30:31", [V30, V31, VFR15]>, DwarfRegNum<[176]>; 268 } 269 270 // Aliases of the V* registers used to hold quad vec values. 271 let SubRegIndices = [wsub_lo, wsub_hi], CoveredBySubRegs = 1 in { 272 def VQ0 : Rd< 0, "v3:0", [W0, W1]>, DwarfRegNum<[252]>; 273 def VQ1 : Rd< 4, "v7:4", [W2, W3]>, DwarfRegNum<[253]>; 274 def VQ2 : Rd< 8, "v11:8", [W4, W5]>, DwarfRegNum<[254]>; 275 def VQ3 : Rd<12, "v15:12", [W6, W7]>, DwarfRegNum<[255]>; 276 def VQ4 : Rd<16, "v19:16", [W8, W9]>, DwarfRegNum<[256]>; 277 def VQ5 : Rd<20, "v23:20", [W10, W11]>, DwarfRegNum<[257]>; 278 def VQ6 : Rd<24, "v27:24", [W12, W13]>, DwarfRegNum<[258]>; 279 def VQ7 : Rd<28, "v31:28", [W14, W15]>, DwarfRegNum<[259]>; 280 } 281 282 // Vector Predicate registers. 283 def Q0 : Rq<0, "q0">, DwarfRegNum<[131]>; 284 def Q1 : Rq<1, "q1">, DwarfRegNum<[132]>; 285 def Q2 : Rq<2, "q2">, DwarfRegNum<[133]>; 286 def Q3 : Rq<3, "q3">, DwarfRegNum<[134]>; 287 288 // System registers. 289 def SGP0 : Rs<0, "sgp0", ["s0"]>, DwarfRegNum<[144]>; 290 def SGP1 : Rs<1, "sgp1", ["s1"]>, DwarfRegNum<[145]>; 291 def STID : Rs<2, "stid", ["s2"]>, DwarfRegNum<[146]>; 292 def ELR : Rs<3, "elr", ["s3"]>, DwarfRegNum<[147]>; 293 def BADVA0 : Rs<4, "badva0", ["s4"]>, DwarfRegNum<[148]>; 294 def BADVA1 : Rs<5, "badva1", ["s5"]>, DwarfRegNum<[149]>; 295 def SSR : Rs<6, "ssr", ["s6"]>, DwarfRegNum<[150]>; 296 def CCR : Rs<7, "ccr", ["s7"]>, DwarfRegNum<[151]>; 297 def HTID : Rs<8, "htid", ["s8"]>, DwarfRegNum<[152]>; 298 def BADVA : Rs<9, "badva", ["s9"]>, DwarfRegNum<[153]>; 299 def IMASK : Rs<10, "imask", ["s10"]>, DwarfRegNum<[154]>; 300 def S11 : Rs<11, "s11">, DwarfRegNum<[155]>; 301 def S12 : Rs<12, "s12">, DwarfRegNum<[156]>; 302 def S13 : Rs<13, "s13">, DwarfRegNum<[157]>; 303 def S14 : Rs<14, "s14">, DwarfRegNum<[158]>; 304 def S15 : Rs<15, "s15">, DwarfRegNum<[159]>; 305 def EVB : Rs<16, "evb", ["s16"]>, DwarfRegNum<[160]>; 306 def MODECTL : Rs<17, "modectl", ["s17"]>, DwarfRegNum<[161]>; 307 def SYSCFG : Rs<18, "syscfg", ["s18"]>, DwarfRegNum<[162]>; 308 def S19 : Rs<19, "s19", ["s19"]>, DwarfRegNum<[163]>; 309 def S20 : Rs<20, "s20", ["s20"]>, DwarfRegNum<[164]>; 310 def VID : Rs<21, "vid", ["s21"]>, DwarfRegNum<[165]>; 311 def S22 : Rs<22, "s22", ["s22"]>, DwarfRegNum<[166]>; 312 def S23 : Rs<23, "s23">, DwarfRegNum<[167]>; 313 def S24 : Rs<24, "s24">, DwarfRegNum<[168]>; 314 def S25 : Rs<25, "s25">, DwarfRegNum<[169]>; 315 def S26 : Rs<26, "s26">, DwarfRegNum<[170]>; 316 def CFGBASE : Rs<27, "cfgbase", ["s27"]>, DwarfRegNum<[171]>; 317 def DIAG : Rs<28, "diag", ["s28"]>, DwarfRegNum<[172]>; 318 def REV : Rs<29, "rev", ["s29"]>, DwarfRegNum<[173]>; 319 def PCYCLELO : Rs<30, "pcyclelo", ["s30"]>, DwarfRegNum<[174]>; 320 def PCYCLEHI : Rs<31, "pcyclehi", ["s31"]>, DwarfRegNum<[175]>; 321 def ISDBST : Rs<32, "isdbst", ["s32"]>, DwarfRegNum<[176]>; 322 def ISDBCFG0 : Rs<33, "isdbcfg0", ["s33"]>, DwarfRegNum<[177]>; 323 def ISDBCFG1 : Rs<34, "isdbcfg1", ["s34"]>, DwarfRegNum<[178]>; 324 def S35 : Rs<35, "s35">, DwarfRegNum<[179]>; 325 def BRKPTPC0 : Rs<36, "brkptpc0", ["s36"]>, DwarfRegNum<[180]>; 326 def BRKPTCFG0: Rs<37, "brkptcfg0", ["s37"]>, DwarfRegNum<[181]>; 327 def BRKPTPC1 : Rs<38, "brkptpc1", ["s38"]>, DwarfRegNum<[182]>; 328 def BRKPTCFG1: Rs<39, "brkptcfg1", ["s39"]>, DwarfRegNum<[183]>; 329 def ISDBMBXIN: Rs<40, "isdbmbxin", ["s40"]>, DwarfRegNum<[184]>; 330 def ISDBMBXOUT: Rs<41, "isdbmbxout", ["s41"]>, DwarfRegNum<[185]>; 331 def ISDBEN: Rs<42, "isdben", ["s42"]>, DwarfRegNum<[186]>; 332 def ISDBGPR: Rs<43, "isdbgpr", ["s43"]>, DwarfRegNum<[187]>; 333 def S44: Rs<44, "s44">, DwarfRegNum<[188]>; 334 def S45: Rs<45, "s45">, DwarfRegNum<[189]>; 335 def S46: Rs<46, "s46">, DwarfRegNum<[190]>; 336 def S47: Rs<47, "s47">, DwarfRegNum<[191]>; 337 def PMUCNT0: Rs<48, "pmucnt0", ["s48"]>, DwarfRegNum<[192]>; 338 def PMUCNT1: Rs<49, "pmucnt1", ["s49"]>, DwarfRegNum<[193]>; 339 def PMUCNT2: Rs<50, "pmucnt2", ["s50"]>, DwarfRegNum<[194]>; 340 def PMUCNT3: Rs<51, "pmucnt3", ["s51"]>, DwarfRegNum<[195]>; 341 def PMUEVTCFG: Rs<52, "pmuevtcfg", ["s52"]>, DwarfRegNum<[196]>; 342 def PMUCFG: Rs<53, "pmucfg", ["s53"]>, DwarfRegNum<[197]>; 343 def S54: Rs<54, "s54">, DwarfRegNum<[198]>; 344 def S55: Rs<55, "s55">, DwarfRegNum<[199]>; 345 def S56: Rs<56, "s56">, DwarfRegNum<[200]>; 346 def S57: Rs<57, "s57">, DwarfRegNum<[201]>; 347 def S58: Rs<58, "s58">, DwarfRegNum<[202]>; 348 def S59: Rs<59, "s59">, DwarfRegNum<[203]>; 349 def S60: Rs<60, "s60">, DwarfRegNum<[204]>; 350 def S61: Rs<61, "s61">, DwarfRegNum<[205]>; 351 def S62: Rs<62, "s62">, DwarfRegNum<[206]>; 352 def S63: Rs<63, "s63">, DwarfRegNum<[207]>; 353 def S64: Rs<64, "s64">, DwarfRegNum<[208]>; 354 def S65: Rs<65, "s65">, DwarfRegNum<[209]>; 355 def S66: Rs<66, "s66">, DwarfRegNum<[210]>; 356 def S67: Rs<67, "s67">, DwarfRegNum<[211]>; 357 def S68: Rs<68, "s68">, DwarfRegNum<[212]>; 358 def S69: Rs<69, "s69">, DwarfRegNum<[213]>; 359 def S70: Rs<70, "s70">, DwarfRegNum<[214]>; 360 def S71: Rs<71, "s71">, DwarfRegNum<[215]>; 361 def S72: Rs<72, "s72">, DwarfRegNum<[216]>; 362 def S73: Rs<73, "s73">, DwarfRegNum<[217]>; 363 def S74: Rs<74, "s74">, DwarfRegNum<[218]>; 364 def S75: Rs<75, "s75">, DwarfRegNum<[219]>; 365 def S76: Rs<76, "s76">, DwarfRegNum<[220]>; 366 def S77: Rs<77, "s77">, DwarfRegNum<[221]>; 367 def S78: Rs<78, "s78">, DwarfRegNum<[222]>; 368 def S79: Rs<79, "s79">, DwarfRegNum<[223]>; 369 def S80: Rs<80, "s80">, DwarfRegNum<[224]>; 370 371 // System Register Pair 372 let SubRegIndices = [isub_lo, isub_hi], CoveredBySubRegs = 1 in { 373 def SGP1_0 : Rss<0, "s1:0", [SGP0, SGP1], ["sgp1:0"]>, DwarfRegNum<[144]>; 374 def S3_2 : Rss<2, "s3:2", [STID, ELR]>, DwarfRegNum<[146]>; 375 def S5_4 : Rss<4, "s5:4", [BADVA0, BADVA1], ["badva1:0"]>, 376 DwarfRegNum<[148]>; 377 def S7_6 : Rss<6, "s7:6", [SSR, CCR], ["ccr:ssr"]>, DwarfRegNum<[150]>; 378 def S9_8 : Rss<8, "s9:8", [HTID, BADVA]>, DwarfRegNum<[152]>; 379 def S11_10 : Rss<10, "s11:10", [IMASK, S11]>, DwarfRegNum<[154]>; 380 def S13_12 : Rss<12, "s13:12", [S12, S13]>, DwarfRegNum<[156]>; 381 def S15_14 : Rss<14, "s15:14", [S14, S15]>, DwarfRegNum<[158]>; 382 def S17_16 : Rss<16, "s17:16", [EVB, MODECTL]>, DwarfRegNum<[160]>; 383 def S19_18 : Rss<18, "s19:18", [SYSCFG, S19]>, DwarfRegNum<[162]>; 384 def S21_20 : Rss<20, "s21:20", [S20, VID]>, DwarfRegNum<[164]>; 385 def S23_22 : Rss<22, "s23:22", [S22, S23]>, DwarfRegNum<[166]>; 386 def S25_24 : Rss<24, "s25:24", [S24, S25]>, DwarfRegNum<[168]>; 387 def S27_26 : Rss<26, "s27:26", [S26, CFGBASE]>, DwarfRegNum<[170]>; 388 def S29_28 : Rss<28, "s29:28", [DIAG, REV]>, DwarfRegNum<[172]>; 389 def S31_30 : Rss<30, "s31:30", [PCYCLELO, PCYCLEHI], ["pcycle"]>, DwarfRegNum<[174]>; 390 def S33_32 : Rss<32, "s33:32", [ISDBST, ISDBCFG0]>, DwarfRegNum<[176]>; 391 def S35_34 : Rss<34, "s35:34", [ISDBCFG1, S35]>, DwarfRegNum<[178]>; 392 def S37_36 : Rss<36, "s37:36", [BRKPTPC0, BRKPTCFG0]>, DwarfRegNum<[180]>; 393 def S39_38 : Rss<38, "s39:38", [BRKPTPC1, BRKPTCFG1]>, DwarfRegNum<[182]>; 394 def S41_40 : Rss<40, "s41:40", [ISDBMBXIN, ISDBMBXOUT]>, DwarfRegNum<[184]>; 395 def S43_42 : Rss<42, "s43:42", [ISDBEN, ISDBGPR]>, DwarfRegNum<[186]>; 396 def S45_44 : Rss<44, "s45:44", [S44, S45]>, DwarfRegNum<[188]>; 397 def S47_46 : Rss<46, "s47:46", [S46, S47]>, DwarfRegNum<[190]>; 398 def S49_48 : Rss<48, "s49:48", [PMUCNT0, PMUCNT1]>, DwarfRegNum<[192]>; 399 def S51_50 : Rss<50, "s51:50", [PMUCNT2, PMUCNT3]>, DwarfRegNum<[194]>; 400 def S53_52 : Rss<52, "s53:52", [PMUEVTCFG, PMUCFG]>, DwarfRegNum<[196]>; 401 def S55_54 : Rss<54, "s55:54", [S54, S55]>, DwarfRegNum<[198]>; 402 def S57_56 : Rss<56, "s57:56", [S56, S57]>, DwarfRegNum<[200]>; 403 def S59_58 : Rss<58, "s59:58", [S58, S59]>, DwarfRegNum<[202]>; 404 def S61_60 : Rss<60, "s61:60", [S60, S61]>, DwarfRegNum<[204]>; 405 def S63_62 : Rss<62, "s63:62", [S62, S63]>, DwarfRegNum<[206]>; 406 def S65_64 : Rss<64, "s65:64", [S64, S65]>, DwarfRegNum<[208]>; 407 def S67_66 : Rss<66, "s67:66", [S66, S67]>, DwarfRegNum<[210]>; 408 def S69_68 : Rss<68, "s69:68", [S68, S69]>, DwarfRegNum<[212]>; 409 def S71_70 : Rss<70, "s71:70", [S70, S71]>, DwarfRegNum<[214]>; 410 def S73_72 : Rss<72, "s73:72", [S72, S73]>, DwarfRegNum<[216]>; 411 def S75_74 : Rss<74, "s75:74", [S74, S75]>, DwarfRegNum<[218]>; 412 def S77_76 : Rss<76, "s77:76", [S77, S76]>, DwarfRegNum<[219]>; 413 def S79_78 : Rss<78, "s79:78", [S79, S78]>, DwarfRegNum<[220]>; 414 } 415 416 // Guest Registers 417 def GELR: Rg<0, "gelr", ["g0"]>, DwarfRegNum<[220]>; 418 def GSR: Rg<1, "gsr", ["g1"]>, DwarfRegNum<[221]>; 419 def GOSP: Rg<2, "gosp", ["g2"]>, DwarfRegNum<[222]>; 420 def G3: Rg<3, "gbadva", ["g3"]>, DwarfRegNum<[223]>; 421 def G4: Rg<4, "g4">, DwarfRegNum<[224]>; 422 def G5: Rg<5, "g5">, DwarfRegNum<[225]>; 423 def G6: Rg<6, "g6">, DwarfRegNum<[226]>; 424 def G7: Rg<7, "g7">, DwarfRegNum<[227]>; 425 def G8: Rg<8, "g8">, DwarfRegNum<[228]>; 426 def G9: Rg<9, "g9">, DwarfRegNum<[229]>; 427 def G10: Rg<10, "g10">, DwarfRegNum<[230]>; 428 def G11: Rg<11, "g11">, DwarfRegNum<[231]>; 429 def G12: Rg<12, "g12">, DwarfRegNum<[232]>; 430 def G13: Rg<13, "g13">, DwarfRegNum<[233]>; 431 def G14: Rg<14, "g14">, DwarfRegNum<[234]>; 432 def G15: Rg<15, "g15">, DwarfRegNum<[235]>; 433 def GPMUCNT4: Rg<16, "gpmucnt4", ["g16"]>, DwarfRegNum<[236]>; 434 def GPMUCNT5: Rg<17, "gpmucnt5", ["g17"]>, DwarfRegNum<[237]>; 435 def GPMUCNT6: Rg<18, "gpmucnt6", ["g18"]>, DwarfRegNum<[238]>; 436 def GPMUCNT7: Rg<19, "gpmucnt7", ["g19"]>, DwarfRegNum<[239]>; 437 def G20: Rg<20, "g20">, DwarfRegNum<[240]>; 438 def G21: Rg<21, "g21">, DwarfRegNum<[241]>; 439 def G22: Rg<22, "g22">, DwarfRegNum<[242]>; 440 def G23: Rg<23, "g23">, DwarfRegNum<[243]>; 441 def GPCYCLELO: Rg<24, "gpcyclelo", ["g24"]>, DwarfRegNum<[244]>; 442 def GPCYCLEHI: Rg<25, "gpcyclehi", ["g25"]>, DwarfRegNum<[245]>; 443 def GPMUCNT0: Rg<26, "gpmucnt0", ["g26"]>, DwarfRegNum<[246]>; 444 def GPMUCNT1: Rg<27, "gpmucnt1", ["g27"]>, DwarfRegNum<[247]>; 445 def GPMUCNT2: Rg<28, "gpmucnt2", ["g28"]>, DwarfRegNum<[248]>; 446 def GPMUCNT3: Rg<29, "gpmucnt3", ["g29"]>, DwarfRegNum<[249]>; 447 def G30: Rg<30, "g30">, DwarfRegNum<[250]>; 448 def G31: Rg<31, "g31">, DwarfRegNum<[251]>; 449 450 // Guest Register Pairs 451 let SubRegIndices = [isub_lo, isub_hi], CoveredBySubRegs = 1 in { 452 def G1_0 : Rgg<0, "g1:0", [GELR, GSR]>, DwarfRegNum<[220]>; 453 def G3_2 : Rgg<2, "g3:2", [GOSP, G3]>, DwarfRegNum<[222]>; 454 def G5_4 : Rgg<4, "g5:4", [G4, G5]>, DwarfRegNum<[224]>; 455 def G7_6 : Rgg<6, "g7:6", [G6, G7]>, DwarfRegNum<[226]>; 456 def G9_8 : Rgg<8, "g9:8", [G8, G9]>, DwarfRegNum<[228]>; 457 def G11_10 : Rgg<10, "g11:10", [G10, G11]>, DwarfRegNum<[230]>; 458 def G13_12 : Rgg<12, "g13:12", [G12, G13]>, DwarfRegNum<[232]>; 459 def G15_14 : Rgg<14, "g15:14", [G14, G15]>, DwarfRegNum<[234]>; 460 def G17_16 : Rgg<16, "g17:16", [GPMUCNT4, GPMUCNT5]>, DwarfRegNum<[236]>; 461 def G19_18 : Rgg<18, "g19:18", [GPMUCNT6, GPMUCNT7]>, DwarfRegNum<[238]>; 462 def G21_20 : Rgg<20, "g21:20", [G20, G21]>, DwarfRegNum<[240]>; 463 def G23_22 : Rgg<22, "g23:22", [G22, G23]>, DwarfRegNum<[242]>; 464 def G25_24 : Rgg<24, "g25:24", [GPCYCLELO, GPCYCLEHI]>, DwarfRegNum<[244]>; 465 def G27_26 : Rgg<26, "g27:26", [GPMUCNT0, GPMUCNT1]>, DwarfRegNum<[246]>; 466 def G29_28 : Rgg<28, "g29:28", [GPMUCNT2, GPMUCNT3]>, DwarfRegNum<[248]>; 467 def G31_30 : Rgg<30, "g31:30", [G30, G31]>, DwarfRegNum<[250]>; 468 } 469 470} 471 472// HVX types 473 474def VecI1: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 475 [v64i1, v128i1, v64i1]>; 476def VecI8: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 477 [v64i8, v128i8, v64i8]>; 478def VecI16: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 479 [v32i16, v64i16, v32i16]>; 480def VecI32: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 481 [v16i32, v32i32, v16i32]>; 482def VecF16: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 483 [v32f16, v64f16, v32f16]>; 484def VecF32: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 485 [v16f32, v32f32, v16f32]>; 486 487def VecPI8: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 488 [v128i8, v256i8, v128i8]>; 489def VecPI16: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 490 [v64i16, v128i16, v64i16]>; 491def VecPI32: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 492 [v32i32, v64i32, v32i32]>; 493def VecPF16: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 494 [v64f16, v128f16, v64f16]>; 495def VecPF32: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 496 [v32f32, v64f32, v32f32]>; 497 498def VecQ8: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 499 [v64i1, v128i1, v64i1]>; 500def VecQ16: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 501 [v32i1, v64i1, v32i1]>; 502def VecQ32: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode], 503 [v16i1, v32i1, v16i1]>; 504 505// HVX register classes 506 507def HvxVR : RegisterClass<"Hexagon", [VecI8, VecI16, VecI32, VecF16, VecF32], 512, 508 (add (sequence "V%u", 0, 31), VTMP)> { 509 let RegInfos = RegInfoByHwMode<[Hvx64, Hvx128, DefaultMode], 510 [RegInfo<512,512,512>, RegInfo<1024,1024,1024>, RegInfo<512,512,512>]>; 511} 512 513def HvxWR : RegisterClass<"Hexagon", [VecPI8, VecPI16, VecPI32, VecPF16, VecPF32], 1024, 514 (add (sequence "W%u", 0, 15), (sequence "WR%u", 0, 15))> { 515 let RegInfos = RegInfoByHwMode<[Hvx64, Hvx128, DefaultMode], 516 [RegInfo<1024,1024,512>, RegInfo<2048,2048,1024>, RegInfo<1024,1024,512>]>; 517} 518 519def HvxQR : RegisterClass<"Hexagon", [VecI1, VecQ8, VecQ16, VecQ32], 128, 520 (add Q0, Q1, Q2, Q3)> { 521 let RegInfos = RegInfoByHwMode<[Hvx64, Hvx128, DefaultMode], 522 [RegInfo<64,512,512>, RegInfo<128,1024,1024>, RegInfo<64,512,512>]>; 523} 524 525def HvxVQR : RegisterClass<"Hexagon", [untyped], 2048, 526 (add (sequence "VQ%u", 0, 7))> { 527 let RegInfos = RegInfoByHwMode<[Hvx64, Hvx128, DefaultMode], 528 [RegInfo<2048,2048,512>, RegInfo<4096,4096,1024>, RegInfo<2048,2048,512>]>; 529} 530 531// Core register classes 532 533def IntRegs : RegisterClass<"Hexagon", [i32, f32, v4i8, v2i16], 32, 534 (add (sequence "R%u", 0, 9), (sequence "R%u", 12, 28), 535 R10, R11, R29, R30, R31)>; 536 537// Registers are listed in reverse order for allocation preference reasons. 538def GeneralSubRegs : RegisterClass<"Hexagon", [i32], 32, 539 (add R23, R22, R21, R20, R19, R18, R17, R16, 540 R7, R6, R5, R4, R3, R2, R1, R0)>; 541 542def IntRegsLow8 : RegisterClass<"Hexagon", [i32], 32, 543 (add R7, R6, R5, R4, R3, R2, R1, R0)> ; 544 545def DoubleRegs : RegisterClass<"Hexagon", [i64, f64, v8i8, v4i16, v2i32], 64, 546 (add (sequence "D%u", 0, 4), (sequence "D%u", 6, 13), D5, D14, D15)>; 547 548def GeneralDoubleLow8Regs : RegisterClass<"Hexagon", [i64], 64, 549 (add D11, D10, D9, D8, D3, D2, D1, D0)>; 550 551let Size = 32 in 552def PredRegs : RegisterClass<"Hexagon", 553 [i1, v2i1, v4i1, v8i1, v4i8, v2i16, i32], 32, (add P0, P1, P2, P3)>; 554 555let Size = 32 in 556def ModRegs : RegisterClass<"Hexagon", [i32], 32, (add M0, M1)>; 557 558let Size = 32, isAllocatable = 0 in 559def CtrRegs : RegisterClass<"Hexagon", [i32], 32, 560 (add LC0, SA0, LC1, SA1, P3_0, C5, C8, PC, UGP, GP, CS0, CS1, 561 UPCYCLELO, UPCYCLEHI, 562 FRAMELIMIT, FRAMEKEY, PKTCOUNTLO, PKTCOUNTHI, UTIMERLO, UTIMERHI, 563 M0, M1, USR)>; 564 565let Size = 64 in 566def VectRegRev : RegisterClass<"Hexagon", [i64], 64, 567 (add (sequence "WR%u", 0, 15))>; 568 569let isAllocatable = 0 in 570def UsrBits : RegisterClass<"Hexagon", [i1], 0, (add USR_OVF)>; 571 572let Size = 64, isAllocatable = 0 in 573def CtrRegs64 : RegisterClass<"Hexagon", [i64], 64, 574 (add C1_0, C3_2, C5_4, C7_6, C9_8, C11_10, CS, UPCYCLE, C17_16, 575 PKTCOUNT, UTIMER)>; 576 577let Size = 32, isAllocatable = 0 in 578def GuestRegs : RegisterClass<"Hexagon", [i32], 32, 579 (add GELR, GSR, GOSP, 580 (sequence "G%u", 3, 15), 581 GPMUCNT4, GPMUCNT5, GPMUCNT6, GPMUCNT7, 582 G20, G21, G22, G23, 583 GPCYCLELO, GPCYCLEHI, GPMUCNT0, GPMUCNT1, 584 GPMUCNT2, GPMUCNT3, 585 G30, G31)>; 586 587let Size = 64, isAllocatable = 0 in 588def GuestRegs64 : RegisterClass<"Hexagon", [i64], 64, 589 (add G1_0, G3_2, 590 G5_4, G7_6, G9_8, G11_10, G13_12, G15_14, 591 G17_16, G19_18, 592 G21_20, G23_22, 593 G25_24, G27_26, G29_28, 594 G31_30)>; 595 596let Size = 32, isAllocatable = 0 in 597def SysRegs : RegisterClass<"Hexagon", [i32], 32, 598 (add SGP0, SGP1, STID, ELR, BADVA0, BADVA1, 599 SSR, CCR, HTID, BADVA, IMASK, 600 S11, S12, S13, S14, S15, 601 S19, S23, S25, 602 EVB, MODECTL, SYSCFG, S20, VID, S22, S24, 603 S26, CFGBASE, DIAG, REV, PCYCLEHI, 604 PCYCLELO, ISDBST, ISDBCFG0, ISDBCFG1, S35, 605 BRKPTPC0, BRKPTCFG0, BRKPTPC1, BRKPTCFG1, 606 ISDBMBXIN, ISDBMBXOUT, ISDBEN, ISDBGPR, 607 S44, S45, S46, S47, 608 PMUCNT0, PMUCNT1, PMUCNT2, PMUCNT3, 609 PMUEVTCFG, PMUCFG, S54, S55, S56, S57, 610 S58, S59, S60, S61, S62, S63, S64, S65, S66, S67, 611 S68, S69, S70, S71, S72, S73, S74, S75, S76, S77, 612 S78, S79, S80 613 )>; 614 615let Size = 64, isAllocatable = 0 in 616def SysRegs64 : RegisterClass<"Hexagon", [i64], 64, 617 (add SGP1_0, 618 S3_2, S5_4, S7_6, S9_8, 619 S11_10, S13_12, S15_14, 620 S17_16, S19_18, S21_20, 621 S23_22, S25_24, 622 S27_26, S29_28, S31_30, S33_32, S35_34, 623 S37_36, S39_38, S41_40, S43_42, S45_44, 624 S47_46, S49_48, S51_50, S53_52, 625 S55_54, S57_56, S59_58, 626 S61_60, S63_62, S65_64, S67_66, S69_68, 627 S71_70, S73_72, S75_74, S77_76, S79_78 628 )>; 629 630// These registers are new for v62 and onward. 631// The function RegisterMatchesArch() uses this list for validation. 632let isAllocatable = 0 in 633def V62Regs : RegisterClass<"Hexagon", [i32], 32, 634 (add FRAMELIMIT, FRAMEKEY, C17_16, PKTCOUNTLO, PKTCOUNTHI, PKTCOUNT, 635 UTIMERLO, UTIMERHI, UTIMER)>; 636 637// These registers are new for v65 and onward. 638let Size = 32, isAllocatable = 0 in 639def V65Regs : RegisterClass<"Hexagon", [i32], 32, (add VTMP)>; 640 641 642def HexagonCSR 643 : CalleeSavedRegs<(add R16, R17, R18, R19, R20, R21, R22, R23, 644 R24, R25, R26, R27)>; 645