1*9880d681SAndroid Build Coastguard Worker//===-- HexagonRegisterInfo.td - Hexagon Register defs -----*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 11*9880d681SAndroid Build Coastguard Worker// Declarations that describe the Hexagon register file. 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerlet Namespace = "Hexagon" in { 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker class HexagonReg<bits<5> num, string n, list<string> alt = [], 17*9880d681SAndroid Build Coastguard Worker list<Register> alias = []> : Register<n, alt> { 18*9880d681SAndroid Build Coastguard Worker field bits<5> Num; 19*9880d681SAndroid Build Coastguard Worker let Aliases = alias; 20*9880d681SAndroid Build Coastguard Worker let HWEncoding{4-0} = num; 21*9880d681SAndroid Build Coastguard Worker } 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker class HexagonDoubleReg<bits<5> num, string n, list<Register> subregs, 24*9880d681SAndroid Build Coastguard Worker list<string> alt = []> : 25*9880d681SAndroid Build Coastguard Worker RegisterWithSubRegs<n, subregs> { 26*9880d681SAndroid Build Coastguard Worker field bits<5> Num; 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker let AltNames = alt; 29*9880d681SAndroid Build Coastguard Worker let HWEncoding{4-0} = num; 30*9880d681SAndroid Build Coastguard Worker } 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker // Registers are identified with 5-bit ID numbers. 33*9880d681SAndroid Build Coastguard Worker // Ri - 32-bit integer registers. 34*9880d681SAndroid Build Coastguard Worker class Ri<bits<5> num, string n, list<string> alt = []> : 35*9880d681SAndroid Build Coastguard Worker HexagonReg<num, n, alt> { 36*9880d681SAndroid Build Coastguard Worker let Num = num; 37*9880d681SAndroid Build Coastguard Worker } 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker // Rf - 32-bit floating-point registers. 40*9880d681SAndroid Build Coastguard Worker class Rf<bits<5> num, string n> : HexagonReg<num, n> { 41*9880d681SAndroid Build Coastguard Worker let Num = num; 42*9880d681SAndroid Build Coastguard Worker } 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker // Rd - 64-bit registers. 46*9880d681SAndroid Build Coastguard Worker class Rd<bits<5> num, string n, list<Register> subregs, 47*9880d681SAndroid Build Coastguard Worker list<string> alt = []> : 48*9880d681SAndroid Build Coastguard Worker HexagonDoubleReg<num, n, subregs, alt> { 49*9880d681SAndroid Build Coastguard Worker let Num = num; 50*9880d681SAndroid Build Coastguard Worker let SubRegs = subregs; 51*9880d681SAndroid Build Coastguard Worker } 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker // Rp - predicate registers 54*9880d681SAndroid Build Coastguard Worker class Rp<bits<5> num, string n> : HexagonReg<num, n> { 55*9880d681SAndroid Build Coastguard Worker let Num = num; 56*9880d681SAndroid Build Coastguard Worker } 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker // Rq - vector predicate registers 60*9880d681SAndroid Build Coastguard Worker class Rq<bits<3> num, string n> : Register<n, []> { 61*9880d681SAndroid Build Coastguard Worker let HWEncoding{2-0} = num; 62*9880d681SAndroid Build Coastguard Worker } 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker // Rc - control registers 65*9880d681SAndroid Build Coastguard Worker class Rc<bits<5> num, string n, 66*9880d681SAndroid Build Coastguard Worker list<string> alt = [], list<Register> alias = []> : 67*9880d681SAndroid Build Coastguard Worker HexagonReg<num, n, alt, alias> { 68*9880d681SAndroid Build Coastguard Worker let Num = num; 69*9880d681SAndroid Build Coastguard Worker } 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker // Rcc - 64-bit control registers. 72*9880d681SAndroid Build Coastguard Worker class Rcc<bits<5> num, string n, list<Register> subregs, 73*9880d681SAndroid Build Coastguard Worker list<string> alt = []> : 74*9880d681SAndroid Build Coastguard Worker HexagonDoubleReg<num, n, subregs, alt> { 75*9880d681SAndroid Build Coastguard Worker let Num = num; 76*9880d681SAndroid Build Coastguard Worker let SubRegs = subregs; 77*9880d681SAndroid Build Coastguard Worker } 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker // Mx - address modifier registers 80*9880d681SAndroid Build Coastguard Worker class Mx<bits<1> num, string n> : HexagonReg<{0b0000, num}, n> { 81*9880d681SAndroid Build Coastguard Worker let Num = !cast<bits<5>>(num); 82*9880d681SAndroid Build Coastguard Worker } 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker def subreg_loreg : SubRegIndex<32>; 85*9880d681SAndroid Build Coastguard Worker def subreg_hireg : SubRegIndex<32, 32>; 86*9880d681SAndroid Build Coastguard Worker def subreg_overflow : SubRegIndex<1, 0>; 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker // Integer registers. 89*9880d681SAndroid Build Coastguard Worker foreach i = 0-28 in { 90*9880d681SAndroid Build Coastguard Worker def R#i : Ri<i, "r"#i>, DwarfRegNum<[i]>; 91*9880d681SAndroid Build Coastguard Worker } 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker def R29 : Ri<29, "r29", ["sp"]>, DwarfRegNum<[29]>; 94*9880d681SAndroid Build Coastguard Worker def R30 : Ri<30, "r30", ["fp"]>, DwarfRegNum<[30]>; 95*9880d681SAndroid Build Coastguard Worker def R31 : Ri<31, "r31", ["lr"]>, DwarfRegNum<[31]>; 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker // Aliases of the R* registers used to hold 64-bit int values (doubles). 98*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [subreg_loreg, subreg_hireg], CoveredBySubRegs = 1 in { 99*9880d681SAndroid Build Coastguard Worker def D0 : Rd< 0, "r1:0", [R0, R1]>, DwarfRegNum<[32]>; 100*9880d681SAndroid Build Coastguard Worker def D1 : Rd< 2, "r3:2", [R2, R3]>, DwarfRegNum<[34]>; 101*9880d681SAndroid Build Coastguard Worker def D2 : Rd< 4, "r5:4", [R4, R5]>, DwarfRegNum<[36]>; 102*9880d681SAndroid Build Coastguard Worker def D3 : Rd< 6, "r7:6", [R6, R7]>, DwarfRegNum<[38]>; 103*9880d681SAndroid Build Coastguard Worker def D4 : Rd< 8, "r9:8", [R8, R9]>, DwarfRegNum<[40]>; 104*9880d681SAndroid Build Coastguard Worker def D5 : Rd<10, "r11:10", [R10, R11]>, DwarfRegNum<[42]>; 105*9880d681SAndroid Build Coastguard Worker def D6 : Rd<12, "r13:12", [R12, R13]>, DwarfRegNum<[44]>; 106*9880d681SAndroid Build Coastguard Worker def D7 : Rd<14, "r15:14", [R14, R15]>, DwarfRegNum<[46]>; 107*9880d681SAndroid Build Coastguard Worker def D8 : Rd<16, "r17:16", [R16, R17]>, DwarfRegNum<[48]>; 108*9880d681SAndroid Build Coastguard Worker def D9 : Rd<18, "r19:18", [R18, R19]>, DwarfRegNum<[50]>; 109*9880d681SAndroid Build Coastguard Worker def D10 : Rd<20, "r21:20", [R20, R21]>, DwarfRegNum<[52]>; 110*9880d681SAndroid Build Coastguard Worker def D11 : Rd<22, "r23:22", [R22, R23]>, DwarfRegNum<[54]>; 111*9880d681SAndroid Build Coastguard Worker def D12 : Rd<24, "r25:24", [R24, R25]>, DwarfRegNum<[56]>; 112*9880d681SAndroid Build Coastguard Worker def D13 : Rd<26, "r27:26", [R26, R27]>, DwarfRegNum<[58]>; 113*9880d681SAndroid Build Coastguard Worker def D14 : Rd<28, "r29:28", [R28, R29]>, DwarfRegNum<[60]>; 114*9880d681SAndroid Build Coastguard Worker def D15 : Rd<30, "r31:30", [R30, R31], ["lr:fp"]>, DwarfRegNum<[62]>; 115*9880d681SAndroid Build Coastguard Worker } 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker // Predicate registers. 118*9880d681SAndroid Build Coastguard Worker def P0 : Rp<0, "p0">, DwarfRegNum<[63]>; 119*9880d681SAndroid Build Coastguard Worker def P1 : Rp<1, "p1">, DwarfRegNum<[64]>; 120*9880d681SAndroid Build Coastguard Worker def P2 : Rp<2, "p2">, DwarfRegNum<[65]>; 121*9880d681SAndroid Build Coastguard Worker def P3 : Rp<3, "p3">, DwarfRegNum<[66]>; 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker // Modifier registers. 124*9880d681SAndroid Build Coastguard Worker // C6 and C7 can also be M0 and M1, but register names must be unique, even 125*9880d681SAndroid Build Coastguard Worker // if belonging to different register classes. 126*9880d681SAndroid Build Coastguard Worker def M0 : Mx<0, "m0">, DwarfRegNum<[72]>; 127*9880d681SAndroid Build Coastguard Worker def M1 : Mx<1, "m1">, DwarfRegNum<[73]>; 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker // Fake register to represent USR.OVF bit. Artihmetic/saturating instruc- 130*9880d681SAndroid Build Coastguard Worker // tions modify this bit, and multiple such instructions are allowed in the 131*9880d681SAndroid Build Coastguard Worker // same packet. We need to ignore output dependencies on this bit, but not 132*9880d681SAndroid Build Coastguard Worker // on the entire USR. 133*9880d681SAndroid Build Coastguard Worker def USR_OVF : Rc<?, "usr.ovf">; 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker def USR : Rc<8, "usr", ["c8"]>, DwarfRegNum<[75]> { 136*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [subreg_overflow]; 137*9880d681SAndroid Build Coastguard Worker let SubRegs = [USR_OVF]; 138*9880d681SAndroid Build Coastguard Worker } 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker // Control registers. 141*9880d681SAndroid Build Coastguard Worker def SA0 : Rc<0, "sa0", ["c0"]>, DwarfRegNum<[67]>; 142*9880d681SAndroid Build Coastguard Worker def LC0 : Rc<1, "lc0", ["c1"]>, DwarfRegNum<[68]>; 143*9880d681SAndroid Build Coastguard Worker def SA1 : Rc<2, "sa1", ["c2"]>, DwarfRegNum<[69]>; 144*9880d681SAndroid Build Coastguard Worker def LC1 : Rc<3, "lc1", ["c3"]>, DwarfRegNum<[70]>; 145*9880d681SAndroid Build Coastguard Worker def P3_0 : Rc<4, "p3:0", ["c4"], [P0, P1, P2, P3]>, 146*9880d681SAndroid Build Coastguard Worker DwarfRegNum<[71]>; 147*9880d681SAndroid Build Coastguard Worker def C5 : Rc<5, "c5", ["c5"]>, DwarfRegNum<[72]>; // future use 148*9880d681SAndroid Build Coastguard Worker def C6 : Rc<6, "c6", [], [M0]>, DwarfRegNum<[73]>; 149*9880d681SAndroid Build Coastguard Worker def C7 : Rc<7, "c7", [], [M1]>, DwarfRegNum<[74]>; 150*9880d681SAndroid Build Coastguard Worker // Define C8 separately and make it aliased with USR. 151*9880d681SAndroid Build Coastguard Worker // The problem is that USR has subregisters (e.g. overflow). If USR was 152*9880d681SAndroid Build Coastguard Worker // specified as a subregister of C9_8, it would imply that subreg_overflow 153*9880d681SAndroid Build Coastguard Worker // and subreg_loreg can be composed, which leads to all kinds of issues 154*9880d681SAndroid Build Coastguard Worker // with lane masks. 155*9880d681SAndroid Build Coastguard Worker def C8 : Rc<8, "c8", [], [USR]>, DwarfRegNum<[75]>; 156*9880d681SAndroid Build Coastguard Worker def PC : Rc<9, "pc">, DwarfRegNum<[76]>; 157*9880d681SAndroid Build Coastguard Worker def UGP : Rc<10, "ugp", ["c10"]>, DwarfRegNum<[77]>; 158*9880d681SAndroid Build Coastguard Worker def GP : Rc<11, "gp">, DwarfRegNum<[78]>; 159*9880d681SAndroid Build Coastguard Worker def CS0 : Rc<12, "cs0", ["c12"]>, DwarfRegNum<[79]>; 160*9880d681SAndroid Build Coastguard Worker def CS1 : Rc<13, "cs1", ["c13"]>, DwarfRegNum<[80]>; 161*9880d681SAndroid Build Coastguard Worker def UPCL : Rc<14, "upcyclelo", ["c14"]>, DwarfRegNum<[81]>; 162*9880d681SAndroid Build Coastguard Worker def UPCH : Rc<15, "upcyclehi", ["c15"]>, DwarfRegNum<[82]>; 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker // Control registers pairs. 166*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [subreg_loreg, subreg_hireg], CoveredBySubRegs = 1 in { 167*9880d681SAndroid Build Coastguard Worker def C1_0 : Rcc<0, "c1:0", [SA0, LC0], ["lc0:sa0"]>, DwarfRegNum<[67]>; 168*9880d681SAndroid Build Coastguard Worker def C3_2 : Rcc<2, "c3:2", [SA1, LC1], ["lc1:sa1"]>, DwarfRegNum<[69]>; 169*9880d681SAndroid Build Coastguard Worker def C7_6 : Rcc<6, "c7:6", [C6, C7], ["m1:0"]>, DwarfRegNum<[72]>; 170*9880d681SAndroid Build Coastguard Worker // Use C8 instead of USR as a subregister of C9_8. 171*9880d681SAndroid Build Coastguard Worker def C9_8 : Rcc<8, "c9:8", [C8, PC]>, DwarfRegNum<[74]>; 172*9880d681SAndroid Build Coastguard Worker def C11_10 : Rcc<10, "c11:10", [UGP, GP]>, DwarfRegNum<[76]>; 173*9880d681SAndroid Build Coastguard Worker def CS : Rcc<12, "c13:12", [CS0, CS1], ["cs1:0"]>, DwarfRegNum<[78]>; 174*9880d681SAndroid Build Coastguard Worker def UPC : Rcc<14, "c15:14", [UPCL, UPCH]>, DwarfRegNum<[80]>; 175*9880d681SAndroid Build Coastguard Worker } 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker foreach i = 0-31 in { 178*9880d681SAndroid Build Coastguard Worker def V#i : Ri<i, "v"#i>, DwarfRegNum<[!add(i, 99)]>; 179*9880d681SAndroid Build Coastguard Worker } 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker // Aliases of the V* registers used to hold double vec values. 182*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [subreg_loreg, subreg_hireg], CoveredBySubRegs = 1 in { 183*9880d681SAndroid Build Coastguard Worker def W0 : Rd< 0, "v1:0", [V0, V1]>, DwarfRegNum<[99]>; 184*9880d681SAndroid Build Coastguard Worker def W1 : Rd< 2, "v3:2", [V2, V3]>, DwarfRegNum<[101]>; 185*9880d681SAndroid Build Coastguard Worker def W2 : Rd< 4, "v5:4", [V4, V5]>, DwarfRegNum<[103]>; 186*9880d681SAndroid Build Coastguard Worker def W3 : Rd< 6, "v7:6", [V6, V7]>, DwarfRegNum<[105]>; 187*9880d681SAndroid Build Coastguard Worker def W4 : Rd< 8, "v9:8", [V8, V9]>, DwarfRegNum<[107]>; 188*9880d681SAndroid Build Coastguard Worker def W5 : Rd<10, "v11:10", [V10, V11]>, DwarfRegNum<[109]>; 189*9880d681SAndroid Build Coastguard Worker def W6 : Rd<12, "v13:12", [V12, V13]>, DwarfRegNum<[111]>; 190*9880d681SAndroid Build Coastguard Worker def W7 : Rd<14, "v15:14", [V14, V15]>, DwarfRegNum<[113]>; 191*9880d681SAndroid Build Coastguard Worker def W8 : Rd<16, "v17:16", [V16, V17]>, DwarfRegNum<[115]>; 192*9880d681SAndroid Build Coastguard Worker def W9 : Rd<18, "v19:18", [V18, V19]>, DwarfRegNum<[117]>; 193*9880d681SAndroid Build Coastguard Worker def W10 : Rd<20, "v21:20", [V20, V21]>, DwarfRegNum<[119]>; 194*9880d681SAndroid Build Coastguard Worker def W11 : Rd<22, "v23:22", [V22, V23]>, DwarfRegNum<[121]>; 195*9880d681SAndroid Build Coastguard Worker def W12 : Rd<24, "v25:24", [V24, V25]>, DwarfRegNum<[123]>; 196*9880d681SAndroid Build Coastguard Worker def W13 : Rd<26, "v27:26", [V26, V27]>, DwarfRegNum<[125]>; 197*9880d681SAndroid Build Coastguard Worker def W14 : Rd<28, "v29:28", [V28, V29]>, DwarfRegNum<[127]>; 198*9880d681SAndroid Build Coastguard Worker def W15 : Rd<30, "v31:30", [V30, V31]>, DwarfRegNum<[129]>; 199*9880d681SAndroid Build Coastguard Worker } 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Worker // Vector Predicate registers. 202*9880d681SAndroid Build Coastguard Worker def Q0 : Rq<0, "q0">, DwarfRegNum<[131]>; 203*9880d681SAndroid Build Coastguard Worker def Q1 : Rq<1, "q1">, DwarfRegNum<[132]>; 204*9880d681SAndroid Build Coastguard Worker def Q2 : Rq<2, "q2">, DwarfRegNum<[133]>; 205*9880d681SAndroid Build Coastguard Worker def Q3 : Rq<3, "q3">, DwarfRegNum<[134]>; 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker// Register classes. 208*9880d681SAndroid Build Coastguard Worker// 209*9880d681SAndroid Build Coastguard Worker// FIXME: the register order should be defined in terms of the preferred 210*9880d681SAndroid Build Coastguard Worker// allocation order... 211*9880d681SAndroid Build Coastguard Worker// 212*9880d681SAndroid Build Coastguard Workerdef IntRegs : RegisterClass<"Hexagon", [i32, f32, v4i8, v2i16], 32, 213*9880d681SAndroid Build Coastguard Worker (add (sequence "R%u", 0, 9), 214*9880d681SAndroid Build Coastguard Worker (sequence "R%u", 12, 28), 215*9880d681SAndroid Build Coastguard Worker R10, R11, R29, R30, R31)> { 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker// Registers are listed in reverse order for allocation preference reasons. 219*9880d681SAndroid Build Coastguard Workerdef IntRegsLow8 : RegisterClass<"Hexagon", [i32], 32, 220*9880d681SAndroid Build Coastguard Worker (add R7, R6, R5, R4, R3, R2, R1, R0)> ; 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdef DoubleRegs : RegisterClass<"Hexagon", [i64, f64, v8i8, v4i16, v2i32], 64, 223*9880d681SAndroid Build Coastguard Worker (add (sequence "D%u", 0, 4), 224*9880d681SAndroid Build Coastguard Worker (sequence "D%u", 6, 13), D5, D14, D15)>; 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Workerdef VectorRegs : RegisterClass<"Hexagon", [v64i8, v32i16, v16i32, v8i64], 512, 227*9880d681SAndroid Build Coastguard Worker (add (sequence "V%u", 0, 31))>; 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerdef VecDblRegs : RegisterClass<"Hexagon", 230*9880d681SAndroid Build Coastguard Worker [v128i8, v64i16, v32i32, v16i64], 1024, 231*9880d681SAndroid Build Coastguard Worker (add (sequence "W%u", 0, 15))>; 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Workerdef VectorRegs128B : RegisterClass<"Hexagon", 234*9880d681SAndroid Build Coastguard Worker [v128i8, v64i16, v32i32, v16i64], 1024, 235*9880d681SAndroid Build Coastguard Worker (add (sequence "V%u", 0, 31))>; 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Workerdef VecDblRegs128B : RegisterClass<"Hexagon", 238*9880d681SAndroid Build Coastguard Worker [v256i8,v128i16,v64i32,v32i64], 2048, 239*9880d681SAndroid Build Coastguard Worker (add (sequence "W%u", 0, 15))>; 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Workerdef VecPredRegs : RegisterClass<"Hexagon", [v512i1], 512, 242*9880d681SAndroid Build Coastguard Worker (add (sequence "Q%u", 0, 3))>; 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Workerdef VecPredRegs128B : RegisterClass<"Hexagon", [v1024i1], 1024, 245*9880d681SAndroid Build Coastguard Worker (add (sequence "Q%u", 0, 3))>; 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerdef PredRegs : RegisterClass<"Hexagon", 248*9880d681SAndroid Build Coastguard Worker [i1, v2i1, v4i1, v8i1, v4i8, v2i16, i32], 32, 249*9880d681SAndroid Build Coastguard Worker (add (sequence "P%u", 0, 3))> 250*9880d681SAndroid Build Coastguard Worker{ 251*9880d681SAndroid Build Coastguard Worker let Size = 32; 252*9880d681SAndroid Build Coastguard Worker} 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Workerlet Size = 32 in 255*9880d681SAndroid Build Coastguard Workerdef ModRegs : RegisterClass<"Hexagon", [i32], 32, (add M0, M1)>; 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Workerlet Size = 32, isAllocatable = 0 in 258*9880d681SAndroid Build Coastguard Workerdef CtrRegs : RegisterClass<"Hexagon", [i32], 32, 259*9880d681SAndroid Build Coastguard Worker (add LC0, SA0, LC1, SA1, 260*9880d681SAndroid Build Coastguard Worker P3_0, 261*9880d681SAndroid Build Coastguard Worker M0, M1, C6, C7, CS0, CS1, UPCL, UPCH, 262*9880d681SAndroid Build Coastguard Worker USR, USR_OVF, UGP, GP, PC)>; 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Workerlet Size = 64, isAllocatable = 0 in 265*9880d681SAndroid Build Coastguard Workerdef CtrRegs64 : RegisterClass<"Hexagon", [i64], 64, 266*9880d681SAndroid Build Coastguard Worker (add C1_0, C3_2, C7_6, C9_8, C11_10, CS, UPC)>; 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Workerdef VolatileV3 { 269*9880d681SAndroid Build Coastguard Worker list<Register> Regs = [D0, D1, D2, D3, D4, D5, D6, D7, 270*9880d681SAndroid Build Coastguard Worker R28, R31, 271*9880d681SAndroid Build Coastguard Worker P0, P1, P2, P3, 272*9880d681SAndroid Build Coastguard Worker M0, M1, 273*9880d681SAndroid Build Coastguard Worker LC0, LC1, SA0, SA1, USR, USR_OVF, CS0, CS1, 274*9880d681SAndroid Build Coastguard Worker V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, 275*9880d681SAndroid Build Coastguard Worker V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, 276*9880d681SAndroid Build Coastguard Worker V22, V23, V24, V25, V26, V27, V28, V29, V30, V31, 277*9880d681SAndroid Build Coastguard Worker W0, W1, W2, W3, W4, W5, W6, W7, W8, W9, W10, W11, 278*9880d681SAndroid Build Coastguard Worker W12, W13, W14, W15, 279*9880d681SAndroid Build Coastguard Worker Q0, Q1, Q2, Q3]; 280*9880d681SAndroid Build Coastguard Worker} 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Workerdef PositiveHalfWord : PatLeaf<(i32 IntRegs:$a), 283*9880d681SAndroid Build Coastguard Worker[{ 284*9880d681SAndroid Build Coastguard Worker return isPositiveHalfWord(N); 285*9880d681SAndroid Build Coastguard Worker}]>; 286