1*9880d681SAndroid Build Coastguard Worker//===-- ARMRegisterInfo.td - ARM 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 ARM register file 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker// Registers are identified with 4-bit ID numbers. 15*9880d681SAndroid Build Coastguard Workerclass ARMReg<bits<16> Enc, string n, list<Register> subregs = []> : Register<n> { 16*9880d681SAndroid Build Coastguard Worker let HWEncoding = Enc; 17*9880d681SAndroid Build Coastguard Worker let Namespace = "ARM"; 18*9880d681SAndroid Build Coastguard Worker let SubRegs = subregs; 19*9880d681SAndroid Build Coastguard Worker // All bits of ARM registers with sub-registers are covered by sub-registers. 20*9880d681SAndroid Build Coastguard Worker let CoveredBySubRegs = 1; 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerclass ARMFReg<bits<16> Enc, string n> : Register<n> { 24*9880d681SAndroid Build Coastguard Worker let HWEncoding = Enc; 25*9880d681SAndroid Build Coastguard Worker let Namespace = "ARM"; 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker// Subregister indices. 29*9880d681SAndroid Build Coastguard Workerlet Namespace = "ARM" in { 30*9880d681SAndroid Build Coastguard Workerdef qqsub_0 : SubRegIndex<256>; 31*9880d681SAndroid Build Coastguard Workerdef qqsub_1 : SubRegIndex<256, 256>; 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker// Note: Code depends on these having consecutive numbers. 34*9880d681SAndroid Build Coastguard Workerdef qsub_0 : SubRegIndex<128>; 35*9880d681SAndroid Build Coastguard Workerdef qsub_1 : SubRegIndex<128, 128>; 36*9880d681SAndroid Build Coastguard Workerdef qsub_2 : ComposedSubRegIndex<qqsub_1, qsub_0>; 37*9880d681SAndroid Build Coastguard Workerdef qsub_3 : ComposedSubRegIndex<qqsub_1, qsub_1>; 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdef dsub_0 : SubRegIndex<64>; 40*9880d681SAndroid Build Coastguard Workerdef dsub_1 : SubRegIndex<64, 64>; 41*9880d681SAndroid Build Coastguard Workerdef dsub_2 : ComposedSubRegIndex<qsub_1, dsub_0>; 42*9880d681SAndroid Build Coastguard Workerdef dsub_3 : ComposedSubRegIndex<qsub_1, dsub_1>; 43*9880d681SAndroid Build Coastguard Workerdef dsub_4 : ComposedSubRegIndex<qsub_2, dsub_0>; 44*9880d681SAndroid Build Coastguard Workerdef dsub_5 : ComposedSubRegIndex<qsub_2, dsub_1>; 45*9880d681SAndroid Build Coastguard Workerdef dsub_6 : ComposedSubRegIndex<qsub_3, dsub_0>; 46*9880d681SAndroid Build Coastguard Workerdef dsub_7 : ComposedSubRegIndex<qsub_3, dsub_1>; 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdef ssub_0 : SubRegIndex<32>; 49*9880d681SAndroid Build Coastguard Workerdef ssub_1 : SubRegIndex<32, 32>; 50*9880d681SAndroid Build Coastguard Workerdef ssub_2 : ComposedSubRegIndex<dsub_1, ssub_0>; 51*9880d681SAndroid Build Coastguard Workerdef ssub_3 : ComposedSubRegIndex<dsub_1, ssub_1>; 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdef gsub_0 : SubRegIndex<32>; 54*9880d681SAndroid Build Coastguard Workerdef gsub_1 : SubRegIndex<32, 32>; 55*9880d681SAndroid Build Coastguard Worker// Let TableGen synthesize the remaining 12 ssub_* indices. 56*9880d681SAndroid Build Coastguard Worker// We don't need to name them. 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker// Integer registers 60*9880d681SAndroid Build Coastguard Workerdef R0 : ARMReg< 0, "r0">, DwarfRegNum<[0]>; 61*9880d681SAndroid Build Coastguard Workerdef R1 : ARMReg< 1, "r1">, DwarfRegNum<[1]>; 62*9880d681SAndroid Build Coastguard Workerdef R2 : ARMReg< 2, "r2">, DwarfRegNum<[2]>; 63*9880d681SAndroid Build Coastguard Workerdef R3 : ARMReg< 3, "r3">, DwarfRegNum<[3]>; 64*9880d681SAndroid Build Coastguard Workerdef R4 : ARMReg< 4, "r4">, DwarfRegNum<[4]>; 65*9880d681SAndroid Build Coastguard Workerdef R5 : ARMReg< 5, "r5">, DwarfRegNum<[5]>; 66*9880d681SAndroid Build Coastguard Workerdef R6 : ARMReg< 6, "r6">, DwarfRegNum<[6]>; 67*9880d681SAndroid Build Coastguard Workerdef R7 : ARMReg< 7, "r7">, DwarfRegNum<[7]>; 68*9880d681SAndroid Build Coastguard Worker// These require 32-bit instructions. 69*9880d681SAndroid Build Coastguard Workerlet CostPerUse = 1 in { 70*9880d681SAndroid Build Coastguard Workerdef R8 : ARMReg< 8, "r8">, DwarfRegNum<[8]>; 71*9880d681SAndroid Build Coastguard Workerdef R9 : ARMReg< 9, "r9">, DwarfRegNum<[9]>; 72*9880d681SAndroid Build Coastguard Workerdef R10 : ARMReg<10, "r10">, DwarfRegNum<[10]>; 73*9880d681SAndroid Build Coastguard Workerdef R11 : ARMReg<11, "r11">, DwarfRegNum<[11]>; 74*9880d681SAndroid Build Coastguard Workerdef R12 : ARMReg<12, "r12">, DwarfRegNum<[12]>; 75*9880d681SAndroid Build Coastguard Workerdef SP : ARMReg<13, "sp">, DwarfRegNum<[13]>; 76*9880d681SAndroid Build Coastguard Workerdef LR : ARMReg<14, "lr">, DwarfRegNum<[14]>; 77*9880d681SAndroid Build Coastguard Workerdef PC : ARMReg<15, "pc">, DwarfRegNum<[15]>; 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker// Float registers 81*9880d681SAndroid Build Coastguard Workerdef S0 : ARMFReg< 0, "s0">; def S1 : ARMFReg< 1, "s1">; 82*9880d681SAndroid Build Coastguard Workerdef S2 : ARMFReg< 2, "s2">; def S3 : ARMFReg< 3, "s3">; 83*9880d681SAndroid Build Coastguard Workerdef S4 : ARMFReg< 4, "s4">; def S5 : ARMFReg< 5, "s5">; 84*9880d681SAndroid Build Coastguard Workerdef S6 : ARMFReg< 6, "s6">; def S7 : ARMFReg< 7, "s7">; 85*9880d681SAndroid Build Coastguard Workerdef S8 : ARMFReg< 8, "s8">; def S9 : ARMFReg< 9, "s9">; 86*9880d681SAndroid Build Coastguard Workerdef S10 : ARMFReg<10, "s10">; def S11 : ARMFReg<11, "s11">; 87*9880d681SAndroid Build Coastguard Workerdef S12 : ARMFReg<12, "s12">; def S13 : ARMFReg<13, "s13">; 88*9880d681SAndroid Build Coastguard Workerdef S14 : ARMFReg<14, "s14">; def S15 : ARMFReg<15, "s15">; 89*9880d681SAndroid Build Coastguard Workerdef S16 : ARMFReg<16, "s16">; def S17 : ARMFReg<17, "s17">; 90*9880d681SAndroid Build Coastguard Workerdef S18 : ARMFReg<18, "s18">; def S19 : ARMFReg<19, "s19">; 91*9880d681SAndroid Build Coastguard Workerdef S20 : ARMFReg<20, "s20">; def S21 : ARMFReg<21, "s21">; 92*9880d681SAndroid Build Coastguard Workerdef S22 : ARMFReg<22, "s22">; def S23 : ARMFReg<23, "s23">; 93*9880d681SAndroid Build Coastguard Workerdef S24 : ARMFReg<24, "s24">; def S25 : ARMFReg<25, "s25">; 94*9880d681SAndroid Build Coastguard Workerdef S26 : ARMFReg<26, "s26">; def S27 : ARMFReg<27, "s27">; 95*9880d681SAndroid Build Coastguard Workerdef S28 : ARMFReg<28, "s28">; def S29 : ARMFReg<29, "s29">; 96*9880d681SAndroid Build Coastguard Workerdef S30 : ARMFReg<30, "s30">; def S31 : ARMFReg<31, "s31">; 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker// Aliases of the F* registers used to hold 64-bit fp values (doubles) 99*9880d681SAndroid Build Coastguard Workerlet SubRegIndices = [ssub_0, ssub_1] in { 100*9880d681SAndroid Build Coastguard Workerdef D0 : ARMReg< 0, "d0", [S0, S1]>, DwarfRegNum<[256]>; 101*9880d681SAndroid Build Coastguard Workerdef D1 : ARMReg< 1, "d1", [S2, S3]>, DwarfRegNum<[257]>; 102*9880d681SAndroid Build Coastguard Workerdef D2 : ARMReg< 2, "d2", [S4, S5]>, DwarfRegNum<[258]>; 103*9880d681SAndroid Build Coastguard Workerdef D3 : ARMReg< 3, "d3", [S6, S7]>, DwarfRegNum<[259]>; 104*9880d681SAndroid Build Coastguard Workerdef D4 : ARMReg< 4, "d4", [S8, S9]>, DwarfRegNum<[260]>; 105*9880d681SAndroid Build Coastguard Workerdef D5 : ARMReg< 5, "d5", [S10, S11]>, DwarfRegNum<[261]>; 106*9880d681SAndroid Build Coastguard Workerdef D6 : ARMReg< 6, "d6", [S12, S13]>, DwarfRegNum<[262]>; 107*9880d681SAndroid Build Coastguard Workerdef D7 : ARMReg< 7, "d7", [S14, S15]>, DwarfRegNum<[263]>; 108*9880d681SAndroid Build Coastguard Workerdef D8 : ARMReg< 8, "d8", [S16, S17]>, DwarfRegNum<[264]>; 109*9880d681SAndroid Build Coastguard Workerdef D9 : ARMReg< 9, "d9", [S18, S19]>, DwarfRegNum<[265]>; 110*9880d681SAndroid Build Coastguard Workerdef D10 : ARMReg<10, "d10", [S20, S21]>, DwarfRegNum<[266]>; 111*9880d681SAndroid Build Coastguard Workerdef D11 : ARMReg<11, "d11", [S22, S23]>, DwarfRegNum<[267]>; 112*9880d681SAndroid Build Coastguard Workerdef D12 : ARMReg<12, "d12", [S24, S25]>, DwarfRegNum<[268]>; 113*9880d681SAndroid Build Coastguard Workerdef D13 : ARMReg<13, "d13", [S26, S27]>, DwarfRegNum<[269]>; 114*9880d681SAndroid Build Coastguard Workerdef D14 : ARMReg<14, "d14", [S28, S29]>, DwarfRegNum<[270]>; 115*9880d681SAndroid Build Coastguard Workerdef D15 : ARMReg<15, "d15", [S30, S31]>, DwarfRegNum<[271]>; 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker// VFP3 defines 16 additional double registers 119*9880d681SAndroid Build Coastguard Workerdef D16 : ARMFReg<16, "d16">, DwarfRegNum<[272]>; 120*9880d681SAndroid Build Coastguard Workerdef D17 : ARMFReg<17, "d17">, DwarfRegNum<[273]>; 121*9880d681SAndroid Build Coastguard Workerdef D18 : ARMFReg<18, "d18">, DwarfRegNum<[274]>; 122*9880d681SAndroid Build Coastguard Workerdef D19 : ARMFReg<19, "d19">, DwarfRegNum<[275]>; 123*9880d681SAndroid Build Coastguard Workerdef D20 : ARMFReg<20, "d20">, DwarfRegNum<[276]>; 124*9880d681SAndroid Build Coastguard Workerdef D21 : ARMFReg<21, "d21">, DwarfRegNum<[277]>; 125*9880d681SAndroid Build Coastguard Workerdef D22 : ARMFReg<22, "d22">, DwarfRegNum<[278]>; 126*9880d681SAndroid Build Coastguard Workerdef D23 : ARMFReg<23, "d23">, DwarfRegNum<[279]>; 127*9880d681SAndroid Build Coastguard Workerdef D24 : ARMFReg<24, "d24">, DwarfRegNum<[280]>; 128*9880d681SAndroid Build Coastguard Workerdef D25 : ARMFReg<25, "d25">, DwarfRegNum<[281]>; 129*9880d681SAndroid Build Coastguard Workerdef D26 : ARMFReg<26, "d26">, DwarfRegNum<[282]>; 130*9880d681SAndroid Build Coastguard Workerdef D27 : ARMFReg<27, "d27">, DwarfRegNum<[283]>; 131*9880d681SAndroid Build Coastguard Workerdef D28 : ARMFReg<28, "d28">, DwarfRegNum<[284]>; 132*9880d681SAndroid Build Coastguard Workerdef D29 : ARMFReg<29, "d29">, DwarfRegNum<[285]>; 133*9880d681SAndroid Build Coastguard Workerdef D30 : ARMFReg<30, "d30">, DwarfRegNum<[286]>; 134*9880d681SAndroid Build Coastguard Workerdef D31 : ARMFReg<31, "d31">, DwarfRegNum<[287]>; 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker// Advanced SIMD (NEON) defines 16 quad-word aliases 137*9880d681SAndroid Build Coastguard Workerlet SubRegIndices = [dsub_0, dsub_1] in { 138*9880d681SAndroid Build Coastguard Workerdef Q0 : ARMReg< 0, "q0", [D0, D1]>; 139*9880d681SAndroid Build Coastguard Workerdef Q1 : ARMReg< 1, "q1", [D2, D3]>; 140*9880d681SAndroid Build Coastguard Workerdef Q2 : ARMReg< 2, "q2", [D4, D5]>; 141*9880d681SAndroid Build Coastguard Workerdef Q3 : ARMReg< 3, "q3", [D6, D7]>; 142*9880d681SAndroid Build Coastguard Workerdef Q4 : ARMReg< 4, "q4", [D8, D9]>; 143*9880d681SAndroid Build Coastguard Workerdef Q5 : ARMReg< 5, "q5", [D10, D11]>; 144*9880d681SAndroid Build Coastguard Workerdef Q6 : ARMReg< 6, "q6", [D12, D13]>; 145*9880d681SAndroid Build Coastguard Workerdef Q7 : ARMReg< 7, "q7", [D14, D15]>; 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Workerlet SubRegIndices = [dsub_0, dsub_1] in { 148*9880d681SAndroid Build Coastguard Workerdef Q8 : ARMReg< 8, "q8", [D16, D17]>; 149*9880d681SAndroid Build Coastguard Workerdef Q9 : ARMReg< 9, "q9", [D18, D19]>; 150*9880d681SAndroid Build Coastguard Workerdef Q10 : ARMReg<10, "q10", [D20, D21]>; 151*9880d681SAndroid Build Coastguard Workerdef Q11 : ARMReg<11, "q11", [D22, D23]>; 152*9880d681SAndroid Build Coastguard Workerdef Q12 : ARMReg<12, "q12", [D24, D25]>; 153*9880d681SAndroid Build Coastguard Workerdef Q13 : ARMReg<13, "q13", [D26, D27]>; 154*9880d681SAndroid Build Coastguard Workerdef Q14 : ARMReg<14, "q14", [D28, D29]>; 155*9880d681SAndroid Build Coastguard Workerdef Q15 : ARMReg<15, "q15", [D30, D31]>; 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker// Current Program Status Register. 159*9880d681SAndroid Build Coastguard Worker// We model fpscr with two registers: FPSCR models the control bits and will be 160*9880d681SAndroid Build Coastguard Worker// reserved. FPSCR_NZCV models the flag bits and will be unreserved. APSR_NZCV 161*9880d681SAndroid Build Coastguard Worker// models the APSR when it's accessed by some special instructions. In such cases 162*9880d681SAndroid Build Coastguard Worker// it has the same encoding as PC. 163*9880d681SAndroid Build Coastguard Workerdef CPSR : ARMReg<0, "cpsr">; 164*9880d681SAndroid Build Coastguard Workerdef APSR : ARMReg<1, "apsr">; 165*9880d681SAndroid Build Coastguard Workerdef APSR_NZCV : ARMReg<15, "apsr_nzcv">; 166*9880d681SAndroid Build Coastguard Workerdef SPSR : ARMReg<2, "spsr">; 167*9880d681SAndroid Build Coastguard Workerdef FPSCR : ARMReg<3, "fpscr">; 168*9880d681SAndroid Build Coastguard Workerdef FPSCR_NZCV : ARMReg<3, "fpscr_nzcv"> { 169*9880d681SAndroid Build Coastguard Worker let Aliases = [FPSCR]; 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Workerdef ITSTATE : ARMReg<4, "itstate">; 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker// Special Registers - only available in privileged mode. 174*9880d681SAndroid Build Coastguard Workerdef FPSID : ARMReg<0, "fpsid">; 175*9880d681SAndroid Build Coastguard Workerdef MVFR2 : ARMReg<5, "mvfr2">; 176*9880d681SAndroid Build Coastguard Workerdef MVFR1 : ARMReg<6, "mvfr1">; 177*9880d681SAndroid Build Coastguard Workerdef MVFR0 : ARMReg<7, "mvfr0">; 178*9880d681SAndroid Build Coastguard Workerdef FPEXC : ARMReg<8, "fpexc">; 179*9880d681SAndroid Build Coastguard Workerdef FPINST : ARMReg<9, "fpinst">; 180*9880d681SAndroid Build Coastguard Workerdef FPINST2 : ARMReg<10, "fpinst2">; 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker// Register classes. 183*9880d681SAndroid Build Coastguard Worker// 184*9880d681SAndroid Build Coastguard Worker// pc == Program Counter 185*9880d681SAndroid Build Coastguard Worker// lr == Link Register 186*9880d681SAndroid Build Coastguard Worker// sp == Stack Pointer 187*9880d681SAndroid Build Coastguard Worker// r12 == ip (scratch) 188*9880d681SAndroid Build Coastguard Worker// r7 == Frame Pointer (thumb-style backtraces) 189*9880d681SAndroid Build Coastguard Worker// r9 == May be reserved as Thread Register 190*9880d681SAndroid Build Coastguard Worker// r11 == Frame Pointer (arm-style backtraces) 191*9880d681SAndroid Build Coastguard Worker// r10 == Stack Limit 192*9880d681SAndroid Build Coastguard Worker// 193*9880d681SAndroid Build Coastguard Workerdef GPR : RegisterClass<"ARM", [i32], 32, (add (sequence "R%u", 0, 12), 194*9880d681SAndroid Build Coastguard Worker SP, LR, PC)> { 195*9880d681SAndroid Build Coastguard Worker // Allocate LR as the first CSR since it is always saved anyway. 196*9880d681SAndroid Build Coastguard Worker // For Thumb1 mode, we don't want to allocate hi regs at all, as we don't 197*9880d681SAndroid Build Coastguard Worker // know how to spill them. If we make our prologue/epilogue code smarter at 198*9880d681SAndroid Build Coastguard Worker // some point, we can go back to using the above allocation orders for the 199*9880d681SAndroid Build Coastguard Worker // Thumb1 instructions that know how to use hi regs. 200*9880d681SAndroid Build Coastguard Worker let AltOrders = [(add LR, GPR), (trunc GPR, 8)]; 201*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 202*9880d681SAndroid Build Coastguard Worker return 1 + MF.getSubtarget<ARMSubtarget>().isThumb1Only(); 203*9880d681SAndroid Build Coastguard Worker }]; 204*9880d681SAndroid Build Coastguard Worker} 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker// GPRs without the PC. Some ARM instructions do not allow the PC in 207*9880d681SAndroid Build Coastguard Worker// certain operand slots, particularly as the destination. Primarily 208*9880d681SAndroid Build Coastguard Worker// useful for disassembly. 209*9880d681SAndroid Build Coastguard Workerdef GPRnopc : RegisterClass<"ARM", [i32], 32, (sub GPR, PC)> { 210*9880d681SAndroid Build Coastguard Worker let AltOrders = [(add LR, GPRnopc), (trunc GPRnopc, 8)]; 211*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 212*9880d681SAndroid Build Coastguard Worker return 1 + MF.getSubtarget<ARMSubtarget>().isThumb1Only(); 213*9880d681SAndroid Build Coastguard Worker }]; 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker// GPRs without the PC but with APSR. Some instructions allow accessing the 217*9880d681SAndroid Build Coastguard Worker// APSR, while actually encoding PC in the register field. This is useful 218*9880d681SAndroid Build Coastguard Worker// for assembly and disassembly only. 219*9880d681SAndroid Build Coastguard Workerdef GPRwithAPSR : RegisterClass<"ARM", [i32], 32, (add (sub GPR, PC), APSR_NZCV)> { 220*9880d681SAndroid Build Coastguard Worker let AltOrders = [(add LR, GPRnopc), (trunc GPRnopc, 8)]; 221*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 222*9880d681SAndroid Build Coastguard Worker return 1 + MF.getSubtarget<ARMSubtarget>().isThumb1Only(); 223*9880d681SAndroid Build Coastguard Worker }]; 224*9880d681SAndroid Build Coastguard Worker} 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker// GPRsp - Only the SP is legal. Used by Thumb1 instructions that want the 227*9880d681SAndroid Build Coastguard Worker// implied SP argument list. 228*9880d681SAndroid Build Coastguard Worker// FIXME: It would be better to not use this at all and refactor the 229*9880d681SAndroid Build Coastguard Worker// instructions to not have SP an an explicit argument. That makes 230*9880d681SAndroid Build Coastguard Worker// frame index resolution a bit trickier, though. 231*9880d681SAndroid Build Coastguard Workerdef GPRsp : RegisterClass<"ARM", [i32], 32, (add SP)>; 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker// restricted GPR register class. Many Thumb2 instructions allow the full 234*9880d681SAndroid Build Coastguard Worker// register range for operands, but have undefined behaviours when PC 235*9880d681SAndroid Build Coastguard Worker// or SP (R13 or R15) are used. The ARM ISA refers to these operands 236*9880d681SAndroid Build Coastguard Worker// via the BadReg() pseudo-code description. 237*9880d681SAndroid Build Coastguard Workerdef rGPR : RegisterClass<"ARM", [i32], 32, (sub GPR, SP, PC)> { 238*9880d681SAndroid Build Coastguard Worker let AltOrders = [(add LR, rGPR), (trunc rGPR, 8)]; 239*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 240*9880d681SAndroid Build Coastguard Worker return 1 + MF.getSubtarget<ARMSubtarget>().isThumb1Only(); 241*9880d681SAndroid Build Coastguard Worker }]; 242*9880d681SAndroid Build Coastguard Worker} 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker// Thumb registers are R0-R7 normally. Some instructions can still use 245*9880d681SAndroid Build Coastguard Worker// the general GPR register class above (MOV, e.g.) 246*9880d681SAndroid Build Coastguard Workerdef tGPR : RegisterClass<"ARM", [i32], 32, (trunc GPR, 8)>; 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker// The high registers in thumb mode, R8-R15. 249*9880d681SAndroid Build Coastguard Workerdef hGPR : RegisterClass<"ARM", [i32], 32, (sub GPR, tGPR)>; 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker// For tail calls, we can't use callee-saved registers, as they are restored 252*9880d681SAndroid Build Coastguard Worker// to the saved value before the tail call, which would clobber a call address. 253*9880d681SAndroid Build Coastguard Worker// Note, getMinimalPhysRegClass(R0) returns tGPR because of the names of 254*9880d681SAndroid Build Coastguard Worker// this class and the preceding one(!) This is what we want. 255*9880d681SAndroid Build Coastguard Workerdef tcGPR : RegisterClass<"ARM", [i32], 32, (add R0, R1, R2, R3, R12)> { 256*9880d681SAndroid Build Coastguard Worker let AltOrders = [(and tcGPR, tGPR)]; 257*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 258*9880d681SAndroid Build Coastguard Worker return MF.getSubtarget<ARMSubtarget>().isThumb1Only(); 259*9880d681SAndroid Build Coastguard Worker }]; 260*9880d681SAndroid Build Coastguard Worker} 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Worker// Condition code registers. 263*9880d681SAndroid Build Coastguard Workerdef CCR : RegisterClass<"ARM", [i32], 32, (add CPSR)> { 264*9880d681SAndroid Build Coastguard Worker let CopyCost = -1; // Don't allow copying of status registers. 265*9880d681SAndroid Build Coastguard Worker let isAllocatable = 0; 266*9880d681SAndroid Build Coastguard Worker} 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker// Scalar single precision floating point register class.. 269*9880d681SAndroid Build Coastguard Worker// FIXME: Allocation order changed to s0, s2, ... or s0, s4, ... as a quick hack 270*9880d681SAndroid Build Coastguard Worker// to avoid partial-write dependencies on D or Q (depending on platform) 271*9880d681SAndroid Build Coastguard Worker// registers (S registers are renamed as portions of D/Q registers). 272*9880d681SAndroid Build Coastguard Workerdef SPR : RegisterClass<"ARM", [f32], 32, (sequence "S%u", 0, 31)> { 273*9880d681SAndroid Build Coastguard Worker let AltOrders = [(add (decimate SPR, 2), SPR), 274*9880d681SAndroid Build Coastguard Worker (add (decimate SPR, 4), 275*9880d681SAndroid Build Coastguard Worker (decimate SPR, 2), 276*9880d681SAndroid Build Coastguard Worker (decimate (rotl SPR, 1), 4), 277*9880d681SAndroid Build Coastguard Worker (decimate (rotl SPR, 1), 2))]; 278*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 279*9880d681SAndroid Build Coastguard Worker return 1 + MF.getSubtarget<ARMSubtarget>().useStride4VFPs(MF); 280*9880d681SAndroid Build Coastguard Worker }]; 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker// Subset of SPR which can be used as a source of NEON scalars for 16-bit 284*9880d681SAndroid Build Coastguard Worker// operations 285*9880d681SAndroid Build Coastguard Workerdef SPR_8 : RegisterClass<"ARM", [f32], 32, (sequence "S%u", 0, 15)>; 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Worker// Scalar double precision floating point / generic 64-bit vector register 288*9880d681SAndroid Build Coastguard Worker// class. 289*9880d681SAndroid Build Coastguard Worker// ARM requires only word alignment for double. It's more performant if it 290*9880d681SAndroid Build Coastguard Worker// is double-word alignment though. 291*9880d681SAndroid Build Coastguard Workerdef DPR : RegisterClass<"ARM", [f64, v8i8, v4i16, v2i32, v1i64, v2f32, v4f16], 64, 292*9880d681SAndroid Build Coastguard Worker (sequence "D%u", 0, 31)> { 293*9880d681SAndroid Build Coastguard Worker // Allocate non-VFP2 registers D16-D31 first, and prefer even registers on 294*9880d681SAndroid Build Coastguard Worker // Darwin platforms. 295*9880d681SAndroid Build Coastguard Worker let AltOrders = [(rotl DPR, 16), 296*9880d681SAndroid Build Coastguard Worker (add (decimate (rotl DPR, 16), 2), (rotl DPR, 16))]; 297*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 298*9880d681SAndroid Build Coastguard Worker return 1 + MF.getSubtarget<ARMSubtarget>().useStride4VFPs(MF); 299*9880d681SAndroid Build Coastguard Worker }]; 300*9880d681SAndroid Build Coastguard Worker} 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Worker// Subset of DPR that are accessible with VFP2 (and so that also have 303*9880d681SAndroid Build Coastguard Worker// 32-bit SPR subregs). 304*9880d681SAndroid Build Coastguard Workerdef DPR_VFP2 : RegisterClass<"ARM", [f64, v8i8, v4i16, v2i32, v1i64, v2f32, v4f16], 64, 305*9880d681SAndroid Build Coastguard Worker (trunc DPR, 16)>; 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker// Subset of DPR which can be used as a source of NEON scalars for 16-bit 308*9880d681SAndroid Build Coastguard Worker// operations 309*9880d681SAndroid Build Coastguard Workerdef DPR_8 : RegisterClass<"ARM", [f64, v8i8, v4i16, v2i32, v1i64, v2f32, v4f16], 64, 310*9880d681SAndroid Build Coastguard Worker (trunc DPR, 8)>; 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker// Generic 128-bit vector register class. 313*9880d681SAndroid Build Coastguard Workerdef QPR : RegisterClass<"ARM", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, v8f16], 128, 314*9880d681SAndroid Build Coastguard Worker (sequence "Q%u", 0, 15)> { 315*9880d681SAndroid Build Coastguard Worker // Allocate non-VFP2 aliases Q8-Q15 first. 316*9880d681SAndroid Build Coastguard Worker let AltOrders = [(rotl QPR, 8)]; 317*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ return 1; }]; 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Worker// Subset of QPR that have 32-bit SPR subregs. 321*9880d681SAndroid Build Coastguard Workerdef QPR_VFP2 : RegisterClass<"ARM", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 322*9880d681SAndroid Build Coastguard Worker 128, (trunc QPR, 8)>; 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Worker// Subset of QPR that have DPR_8 and SPR_8 subregs. 325*9880d681SAndroid Build Coastguard Workerdef QPR_8 : RegisterClass<"ARM", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 326*9880d681SAndroid Build Coastguard Worker 128, (trunc QPR, 4)>; 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Worker// Pseudo-registers representing odd-even pairs of D registers. The even-odd 329*9880d681SAndroid Build Coastguard Worker// pairs are already represented by the Q registers. 330*9880d681SAndroid Build Coastguard Worker// These are needed by NEON instructions requiring two consecutive D registers. 331*9880d681SAndroid Build Coastguard Worker// There is no D31_D0 register as that is always an UNPREDICTABLE encoding. 332*9880d681SAndroid Build Coastguard Workerdef TuplesOE2D : RegisterTuples<[dsub_0, dsub_1], 333*9880d681SAndroid Build Coastguard Worker [(decimate (shl DPR, 1), 2), 334*9880d681SAndroid Build Coastguard Worker (decimate (shl DPR, 2), 2)]>; 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker// Register class representing a pair of consecutive D registers. 337*9880d681SAndroid Build Coastguard Worker// Use the Q registers for the even-odd pairs. 338*9880d681SAndroid Build Coastguard Workerdef DPair : RegisterClass<"ARM", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 339*9880d681SAndroid Build Coastguard Worker 128, (interleave QPR, TuplesOE2D)> { 340*9880d681SAndroid Build Coastguard Worker // Allocate starting at non-VFP2 registers D16-D31 first. 341*9880d681SAndroid Build Coastguard Worker // Prefer even-odd pairs as they are easier to copy. 342*9880d681SAndroid Build Coastguard Worker let AltOrders = [(add (rotl QPR, 8), (rotl DPair, 16))]; 343*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ return 1; }]; 344*9880d681SAndroid Build Coastguard Worker} 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Worker// Pseudo-registers representing even-odd pairs of GPRs from R1 to R13/SP. 347*9880d681SAndroid Build Coastguard Worker// These are needed by instructions (e.g. ldrexd/strexd) requiring even-odd GPRs. 348*9880d681SAndroid Build Coastguard Workerdef Tuples2R : RegisterTuples<[gsub_0, gsub_1], 349*9880d681SAndroid Build Coastguard Worker [(add R0, R2, R4, R6, R8, R10, R12), 350*9880d681SAndroid Build Coastguard Worker (add R1, R3, R5, R7, R9, R11, SP)]>; 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Worker// Register class representing a pair of even-odd GPRs. 353*9880d681SAndroid Build Coastguard Workerdef GPRPair : RegisterClass<"ARM", [untyped], 64, (add Tuples2R)> { 354*9880d681SAndroid Build Coastguard Worker let Size = 64; // 2 x 32 bits, we have no predefined type of that size. 355*9880d681SAndroid Build Coastguard Worker} 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker// Pseudo-registers representing 3 consecutive D registers. 358*9880d681SAndroid Build Coastguard Workerdef Tuples3D : RegisterTuples<[dsub_0, dsub_1, dsub_2], 359*9880d681SAndroid Build Coastguard Worker [(shl DPR, 0), 360*9880d681SAndroid Build Coastguard Worker (shl DPR, 1), 361*9880d681SAndroid Build Coastguard Worker (shl DPR, 2)]>; 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Worker// 3 consecutive D registers. 364*9880d681SAndroid Build Coastguard Workerdef DTriple : RegisterClass<"ARM", [untyped], 64, (add Tuples3D)> { 365*9880d681SAndroid Build Coastguard Worker let Size = 192; // 3 x 64 bits, we have no predefined type of that size. 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Worker// Pseudo 256-bit registers to represent pairs of Q registers. These should 369*9880d681SAndroid Build Coastguard Worker// never be present in the emitted code. 370*9880d681SAndroid Build Coastguard Worker// These are used for NEON load / store instructions, e.g., vld4, vst3. 371*9880d681SAndroid Build Coastguard Workerdef Tuples2Q : RegisterTuples<[qsub_0, qsub_1], [(shl QPR, 0), (shl QPR, 1)]>; 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Worker// Pseudo 256-bit vector register class to model pairs of Q registers 374*9880d681SAndroid Build Coastguard Worker// (4 consecutive D registers). 375*9880d681SAndroid Build Coastguard Workerdef QQPR : RegisterClass<"ARM", [v4i64], 256, (add Tuples2Q)> { 376*9880d681SAndroid Build Coastguard Worker // Allocate non-VFP2 aliases first. 377*9880d681SAndroid Build Coastguard Worker let AltOrders = [(rotl QQPR, 8)]; 378*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ return 1; }]; 379*9880d681SAndroid Build Coastguard Worker} 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard Worker// Tuples of 4 D regs that isn't also a pair of Q regs. 382*9880d681SAndroid Build Coastguard Workerdef TuplesOE4D : RegisterTuples<[dsub_0, dsub_1, dsub_2, dsub_3], 383*9880d681SAndroid Build Coastguard Worker [(decimate (shl DPR, 1), 2), 384*9880d681SAndroid Build Coastguard Worker (decimate (shl DPR, 2), 2), 385*9880d681SAndroid Build Coastguard Worker (decimate (shl DPR, 3), 2), 386*9880d681SAndroid Build Coastguard Worker (decimate (shl DPR, 4), 2)]>; 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Worker// 4 consecutive D registers. 389*9880d681SAndroid Build Coastguard Workerdef DQuad : RegisterClass<"ARM", [v4i64], 256, 390*9880d681SAndroid Build Coastguard Worker (interleave Tuples2Q, TuplesOE4D)>; 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Worker// Pseudo 512-bit registers to represent four consecutive Q registers. 393*9880d681SAndroid Build Coastguard Workerdef Tuples2QQ : RegisterTuples<[qqsub_0, qqsub_1], 394*9880d681SAndroid Build Coastguard Worker [(shl QQPR, 0), (shl QQPR, 2)]>; 395*9880d681SAndroid Build Coastguard Worker 396*9880d681SAndroid Build Coastguard Worker// Pseudo 512-bit vector register class to model 4 consecutive Q registers 397*9880d681SAndroid Build Coastguard Worker// (8 consecutive D registers). 398*9880d681SAndroid Build Coastguard Workerdef QQQQPR : RegisterClass<"ARM", [v8i64], 256, (add Tuples2QQ)> { 399*9880d681SAndroid Build Coastguard Worker // Allocate non-VFP2 aliases first. 400*9880d681SAndroid Build Coastguard Worker let AltOrders = [(rotl QQQQPR, 8)]; 401*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ return 1; }]; 402*9880d681SAndroid Build Coastguard Worker} 403*9880d681SAndroid Build Coastguard Worker 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Worker// Pseudo-registers representing 2-spaced consecutive D registers. 406*9880d681SAndroid Build Coastguard Workerdef Tuples2DSpc : RegisterTuples<[dsub_0, dsub_2], 407*9880d681SAndroid Build Coastguard Worker [(shl DPR, 0), 408*9880d681SAndroid Build Coastguard Worker (shl DPR, 2)]>; 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard Worker// Spaced pairs of D registers. 411*9880d681SAndroid Build Coastguard Workerdef DPairSpc : RegisterClass<"ARM", [v2i64], 64, (add Tuples2DSpc)>; 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Workerdef Tuples3DSpc : RegisterTuples<[dsub_0, dsub_2, dsub_4], 414*9880d681SAndroid Build Coastguard Worker [(shl DPR, 0), 415*9880d681SAndroid Build Coastguard Worker (shl DPR, 2), 416*9880d681SAndroid Build Coastguard Worker (shl DPR, 4)]>; 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Worker// Spaced triples of D registers. 419*9880d681SAndroid Build Coastguard Workerdef DTripleSpc : RegisterClass<"ARM", [untyped], 64, (add Tuples3DSpc)> { 420*9880d681SAndroid Build Coastguard Worker let Size = 192; // 3 x 64 bits, we have no predefined type of that size. 421*9880d681SAndroid Build Coastguard Worker} 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Workerdef Tuples4DSpc : RegisterTuples<[dsub_0, dsub_2, dsub_4, dsub_6], 424*9880d681SAndroid Build Coastguard Worker [(shl DPR, 0), 425*9880d681SAndroid Build Coastguard Worker (shl DPR, 2), 426*9880d681SAndroid Build Coastguard Worker (shl DPR, 4), 427*9880d681SAndroid Build Coastguard Worker (shl DPR, 6)]>; 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard Worker// Spaced quads of D registers. 430*9880d681SAndroid Build Coastguard Workerdef DQuadSpc : RegisterClass<"ARM", [v4i64], 64, (add Tuples3DSpc)>; 431