1*9880d681SAndroid Build Coastguard Worker//===-- PPCRegisterInfo.td - The PowerPC Register File -----*- 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//===----------------------------------------------------------------------===// 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerlet Namespace = "PPC" in { 14*9880d681SAndroid Build Coastguard Workerdef sub_lt : SubRegIndex<1>; 15*9880d681SAndroid Build Coastguard Workerdef sub_gt : SubRegIndex<1, 1>; 16*9880d681SAndroid Build Coastguard Workerdef sub_eq : SubRegIndex<1, 2>; 17*9880d681SAndroid Build Coastguard Workerdef sub_un : SubRegIndex<1, 3>; 18*9880d681SAndroid Build Coastguard Workerdef sub_32 : SubRegIndex<32>; 19*9880d681SAndroid Build Coastguard Workerdef sub_64 : SubRegIndex<64>; 20*9880d681SAndroid Build Coastguard Workerdef sub_128 : SubRegIndex<128>; 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerclass PPCReg<string n> : Register<n> { 25*9880d681SAndroid Build Coastguard Worker let Namespace = "PPC"; 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker// We identify all our registers with a 5-bit ID, for consistency's sake. 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker// GPR - One of the 32 32-bit general-purpose registers 31*9880d681SAndroid Build Coastguard Workerclass GPR<bits<5> num, string n> : PPCReg<n> { 32*9880d681SAndroid Build Coastguard Worker let HWEncoding{4-0} = num; 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker// GP8 - One of the 32 64-bit general-purpose registers 36*9880d681SAndroid Build Coastguard Workerclass GP8<GPR SubReg, string n> : PPCReg<n> { 37*9880d681SAndroid Build Coastguard Worker let HWEncoding = SubReg.HWEncoding; 38*9880d681SAndroid Build Coastguard Worker let SubRegs = [SubReg]; 39*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub_32]; 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker// SPR - One of the 32-bit special-purpose registers 43*9880d681SAndroid Build Coastguard Workerclass SPR<bits<10> num, string n> : PPCReg<n> { 44*9880d681SAndroid Build Coastguard Worker let HWEncoding{9-0} = num; 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker// FPR - One of the 32 64-bit floating-point registers 48*9880d681SAndroid Build Coastguard Workerclass FPR<bits<5> num, string n> : PPCReg<n> { 49*9880d681SAndroid Build Coastguard Worker let HWEncoding{4-0} = num; 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker// QFPR - One of the 32 256-bit floating-point vector registers (used for QPX) 53*9880d681SAndroid Build Coastguard Workerclass QFPR<FPR SubReg, string n> : PPCReg<n> { 54*9880d681SAndroid Build Coastguard Worker let HWEncoding = SubReg.HWEncoding; 55*9880d681SAndroid Build Coastguard Worker let SubRegs = [SubReg]; 56*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub_64]; 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker// VF - One of the 32 64-bit floating-point subregisters of the vector 60*9880d681SAndroid Build Coastguard Worker// registers (used by VSX). 61*9880d681SAndroid Build Coastguard Workerclass VF<bits<5> num, string n> : PPCReg<n> { 62*9880d681SAndroid Build Coastguard Worker let HWEncoding{4-0} = num; 63*9880d681SAndroid Build Coastguard Worker let HWEncoding{5} = 1; 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker// VR - One of the 32 128-bit vector registers 67*9880d681SAndroid Build Coastguard Workerclass VR<VF SubReg, string n> : PPCReg<n> { 68*9880d681SAndroid Build Coastguard Worker let HWEncoding{4-0} = SubReg.HWEncoding{4-0}; 69*9880d681SAndroid Build Coastguard Worker let HWEncoding{5} = 0; 70*9880d681SAndroid Build Coastguard Worker let SubRegs = [SubReg]; 71*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub_64]; 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker// VSRL - One of the 32 128-bit VSX registers that overlap with the scalar 75*9880d681SAndroid Build Coastguard Worker// floating-point registers. 76*9880d681SAndroid Build Coastguard Workerclass VSRL<FPR SubReg, string n> : PPCReg<n> { 77*9880d681SAndroid Build Coastguard Worker let HWEncoding = SubReg.HWEncoding; 78*9880d681SAndroid Build Coastguard Worker let SubRegs = [SubReg]; 79*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub_64]; 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker// VSRH - One of the 32 128-bit VSX registers that overlap with the vector 83*9880d681SAndroid Build Coastguard Worker// registers. 84*9880d681SAndroid Build Coastguard Workerclass VSRH<VR SubReg, string n> : PPCReg<n> { 85*9880d681SAndroid Build Coastguard Worker let HWEncoding{4-0} = SubReg.HWEncoding{4-0}; 86*9880d681SAndroid Build Coastguard Worker let HWEncoding{5} = 1; 87*9880d681SAndroid Build Coastguard Worker let SubRegs = [SubReg]; 88*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub_128]; 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker// CR - One of the 8 4-bit condition registers 92*9880d681SAndroid Build Coastguard Workerclass CR<bits<3> num, string n, list<Register> subregs> : PPCReg<n> { 93*9880d681SAndroid Build Coastguard Worker let HWEncoding{2-0} = num; 94*9880d681SAndroid Build Coastguard Worker let SubRegs = subregs; 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker// CRBIT - One of the 32 1-bit condition register fields 98*9880d681SAndroid Build Coastguard Workerclass CRBIT<bits<5> num, string n> : PPCReg<n> { 99*9880d681SAndroid Build Coastguard Worker let HWEncoding{4-0} = num; 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker// General-purpose registers 103*9880d681SAndroid Build Coastguard Workerforeach Index = 0-31 in { 104*9880d681SAndroid Build Coastguard Worker def R#Index : GPR<Index, "r"#Index>, DwarfRegNum<[-2, Index]>; 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker// 64-bit General-purpose registers 108*9880d681SAndroid Build Coastguard Workerforeach Index = 0-31 in { 109*9880d681SAndroid Build Coastguard Worker def X#Index : GP8<!cast<GPR>("R"#Index), "r"#Index>, 110*9880d681SAndroid Build Coastguard Worker DwarfRegNum<[Index, -2]>; 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker// Floating-point registers 114*9880d681SAndroid Build Coastguard Workerforeach Index = 0-31 in { 115*9880d681SAndroid Build Coastguard Worker def F#Index : FPR<Index, "f"#Index>, 116*9880d681SAndroid Build Coastguard Worker DwarfRegNum<[!add(Index, 32), !add(Index, 32)]>; 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker// Floating-point vector subregisters (for VSX) 120*9880d681SAndroid Build Coastguard Workerforeach Index = 0-31 in { 121*9880d681SAndroid Build Coastguard Worker def VF#Index : VF<Index, "vs" # !add(Index, 32)>; 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker// QPX Floating-point registers 125*9880d681SAndroid Build Coastguard Workerforeach Index = 0-31 in { 126*9880d681SAndroid Build Coastguard Worker def QF#Index : QFPR<!cast<FPR>("F"#Index), "q"#Index>, 127*9880d681SAndroid Build Coastguard Worker DwarfRegNum<[!add(Index, 32), !add(Index, 32)]>; 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker// Vector registers 131*9880d681SAndroid Build Coastguard Workerforeach Index = 0-31 in { 132*9880d681SAndroid Build Coastguard Worker def V#Index : VR<!cast<VF>("VF"#Index), "v"#Index>, 133*9880d681SAndroid Build Coastguard Worker DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>; 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker// VSX registers 137*9880d681SAndroid Build Coastguard Workerforeach Index = 0-31 in { 138*9880d681SAndroid Build Coastguard Worker def VSL#Index : VSRL<!cast<FPR>("F"#Index), "vs"#Index>, 139*9880d681SAndroid Build Coastguard Worker DwarfRegAlias<!cast<FPR>("F"#Index)>; 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Workerforeach Index = 0-31 in { 142*9880d681SAndroid Build Coastguard Worker def VSH#Index : VSRH<!cast<VR>("V"#Index), "vs" # !add(Index, 32)>, 143*9880d681SAndroid Build Coastguard Worker DwarfRegAlias<!cast<VR>("V"#Index)>; 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker// The reprsentation of r0 when treated as the constant 0. 147*9880d681SAndroid Build Coastguard Workerdef ZERO : GPR<0, "0">, DwarfRegAlias<R0>; 148*9880d681SAndroid Build Coastguard Workerdef ZERO8 : GP8<ZERO, "0">, DwarfRegAlias<X0>; 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker// Representations of the frame pointer used by ISD::FRAMEADDR. 151*9880d681SAndroid Build Coastguard Workerdef FP : GPR<0 /* arbitrary */, "**FRAME POINTER**">; 152*9880d681SAndroid Build Coastguard Workerdef FP8 : GP8<FP, "**FRAME POINTER**">; 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker// Representations of the base pointer used by setjmp. 155*9880d681SAndroid Build Coastguard Workerdef BP : GPR<0 /* arbitrary */, "**BASE POINTER**">; 156*9880d681SAndroid Build Coastguard Workerdef BP8 : GP8<BP, "**BASE POINTER**">; 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker// Condition register bits 159*9880d681SAndroid Build Coastguard Workerdef CR0LT : CRBIT< 0, "0">; 160*9880d681SAndroid Build Coastguard Workerdef CR0GT : CRBIT< 1, "1">; 161*9880d681SAndroid Build Coastguard Workerdef CR0EQ : CRBIT< 2, "2">; 162*9880d681SAndroid Build Coastguard Workerdef CR0UN : CRBIT< 3, "3">; 163*9880d681SAndroid Build Coastguard Workerdef CR1LT : CRBIT< 4, "4">; 164*9880d681SAndroid Build Coastguard Workerdef CR1GT : CRBIT< 5, "5">; 165*9880d681SAndroid Build Coastguard Workerdef CR1EQ : CRBIT< 6, "6">; 166*9880d681SAndroid Build Coastguard Workerdef CR1UN : CRBIT< 7, "7">; 167*9880d681SAndroid Build Coastguard Workerdef CR2LT : CRBIT< 8, "8">; 168*9880d681SAndroid Build Coastguard Workerdef CR2GT : CRBIT< 9, "9">; 169*9880d681SAndroid Build Coastguard Workerdef CR2EQ : CRBIT<10, "10">; 170*9880d681SAndroid Build Coastguard Workerdef CR2UN : CRBIT<11, "11">; 171*9880d681SAndroid Build Coastguard Workerdef CR3LT : CRBIT<12, "12">; 172*9880d681SAndroid Build Coastguard Workerdef CR3GT : CRBIT<13, "13">; 173*9880d681SAndroid Build Coastguard Workerdef CR3EQ : CRBIT<14, "14">; 174*9880d681SAndroid Build Coastguard Workerdef CR3UN : CRBIT<15, "15">; 175*9880d681SAndroid Build Coastguard Workerdef CR4LT : CRBIT<16, "16">; 176*9880d681SAndroid Build Coastguard Workerdef CR4GT : CRBIT<17, "17">; 177*9880d681SAndroid Build Coastguard Workerdef CR4EQ : CRBIT<18, "18">; 178*9880d681SAndroid Build Coastguard Workerdef CR4UN : CRBIT<19, "19">; 179*9880d681SAndroid Build Coastguard Workerdef CR5LT : CRBIT<20, "20">; 180*9880d681SAndroid Build Coastguard Workerdef CR5GT : CRBIT<21, "21">; 181*9880d681SAndroid Build Coastguard Workerdef CR5EQ : CRBIT<22, "22">; 182*9880d681SAndroid Build Coastguard Workerdef CR5UN : CRBIT<23, "23">; 183*9880d681SAndroid Build Coastguard Workerdef CR6LT : CRBIT<24, "24">; 184*9880d681SAndroid Build Coastguard Workerdef CR6GT : CRBIT<25, "25">; 185*9880d681SAndroid Build Coastguard Workerdef CR6EQ : CRBIT<26, "26">; 186*9880d681SAndroid Build Coastguard Workerdef CR6UN : CRBIT<27, "27">; 187*9880d681SAndroid Build Coastguard Workerdef CR7LT : CRBIT<28, "28">; 188*9880d681SAndroid Build Coastguard Workerdef CR7GT : CRBIT<29, "29">; 189*9880d681SAndroid Build Coastguard Workerdef CR7EQ : CRBIT<30, "30">; 190*9880d681SAndroid Build Coastguard Workerdef CR7UN : CRBIT<31, "31">; 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker// Condition registers 193*9880d681SAndroid Build Coastguard Workerlet SubRegIndices = [sub_lt, sub_gt, sub_eq, sub_un] in { 194*9880d681SAndroid Build Coastguard Workerdef CR0 : CR<0, "cr0", [CR0LT, CR0GT, CR0EQ, CR0UN]>, DwarfRegNum<[68, 68]>; 195*9880d681SAndroid Build Coastguard Workerdef CR1 : CR<1, "cr1", [CR1LT, CR1GT, CR1EQ, CR1UN]>, DwarfRegNum<[69, 69]>; 196*9880d681SAndroid Build Coastguard Workerdef CR2 : CR<2, "cr2", [CR2LT, CR2GT, CR2EQ, CR2UN]>, DwarfRegNum<[70, 70]>; 197*9880d681SAndroid Build Coastguard Workerdef CR3 : CR<3, "cr3", [CR3LT, CR3GT, CR3EQ, CR3UN]>, DwarfRegNum<[71, 71]>; 198*9880d681SAndroid Build Coastguard Workerdef CR4 : CR<4, "cr4", [CR4LT, CR4GT, CR4EQ, CR4UN]>, DwarfRegNum<[72, 72]>; 199*9880d681SAndroid Build Coastguard Workerdef CR5 : CR<5, "cr5", [CR5LT, CR5GT, CR5EQ, CR5UN]>, DwarfRegNum<[73, 73]>; 200*9880d681SAndroid Build Coastguard Workerdef CR6 : CR<6, "cr6", [CR6LT, CR6GT, CR6EQ, CR6UN]>, DwarfRegNum<[74, 74]>; 201*9880d681SAndroid Build Coastguard Workerdef CR7 : CR<7, "cr7", [CR7LT, CR7GT, CR7EQ, CR7UN]>, DwarfRegNum<[75, 75]>; 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker// Link register 205*9880d681SAndroid Build Coastguard Workerdef LR : SPR<8, "lr">, DwarfRegNum<[-2, 65]>; 206*9880d681SAndroid Build Coastguard Worker//let Aliases = [LR] in 207*9880d681SAndroid Build Coastguard Workerdef LR8 : SPR<8, "lr">, DwarfRegNum<[65, -2]>; 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker// Count register 210*9880d681SAndroid Build Coastguard Workerdef CTR : SPR<9, "ctr">, DwarfRegNum<[-2, 66]>; 211*9880d681SAndroid Build Coastguard Workerdef CTR8 : SPR<9, "ctr">, DwarfRegNum<[66, -2]>; 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker// VRsave register 214*9880d681SAndroid Build Coastguard Workerdef VRSAVE: SPR<256, "vrsave">, DwarfRegNum<[109]>; 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker// Carry bit. In the architecture this is really bit 0 of the XER register 217*9880d681SAndroid Build Coastguard Worker// (which really is SPR register 1); this is the only bit interesting to a 218*9880d681SAndroid Build Coastguard Worker// compiler. 219*9880d681SAndroid Build Coastguard Workerdef CARRY: SPR<1, "ca">, DwarfRegNum<[76]>; 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker// FP rounding mode: bits 30 and 31 of the FP status and control register 222*9880d681SAndroid Build Coastguard Worker// This is not allocated as a normal register; it appears only in 223*9880d681SAndroid Build Coastguard Worker// Uses and Defs. The ABI says it needs to be preserved by a function, 224*9880d681SAndroid Build Coastguard Worker// but this is not achieved by saving and restoring it as with 225*9880d681SAndroid Build Coastguard Worker// most registers, it has to be done in code; to make this work all the 226*9880d681SAndroid Build Coastguard Worker// return and call instructions are described as Uses of RM, so instructions 227*9880d681SAndroid Build Coastguard Worker// that do nothing but change RM will not get deleted. 228*9880d681SAndroid Build Coastguard Workerdef RM: PPCReg<"**ROUNDING MODE**">; 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker/// Register classes 231*9880d681SAndroid Build Coastguard Worker// Allocate volatiles first 232*9880d681SAndroid Build Coastguard Worker// then nonvolatiles in reverse order since stmw/lmw save from rN to r31 233*9880d681SAndroid Build Coastguard Workerdef GPRC : RegisterClass<"PPC", [i32], 32, (add (sequence "R%u", 2, 12), 234*9880d681SAndroid Build Coastguard Worker (sequence "R%u", 30, 13), 235*9880d681SAndroid Build Coastguard Worker R31, R0, R1, FP, BP)> { 236*9880d681SAndroid Build Coastguard Worker // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 237*9880d681SAndroid Build Coastguard Worker // put it at the end of the list. 238*9880d681SAndroid Build Coastguard Worker let AltOrders = [(add (sub GPRC, R2), R2)]; 239*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 240*9880d681SAndroid Build Coastguard Worker const PPCSubtarget &S = MF.getSubtarget<PPCSubtarget>(); 241*9880d681SAndroid Build Coastguard Worker return S.isPPC64() && S.isSVR4ABI(); 242*9880d681SAndroid Build Coastguard Worker }]; 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerdef G8RC : RegisterClass<"PPC", [i64], 64, (add (sequence "X%u", 2, 12), 246*9880d681SAndroid Build Coastguard Worker (sequence "X%u", 30, 14), 247*9880d681SAndroid Build Coastguard Worker X31, X13, X0, X1, FP8, BP8)> { 248*9880d681SAndroid Build Coastguard Worker // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 249*9880d681SAndroid Build Coastguard Worker // put it at the end of the list. 250*9880d681SAndroid Build Coastguard Worker let AltOrders = [(add (sub G8RC, X2), X2)]; 251*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 252*9880d681SAndroid Build Coastguard Worker const PPCSubtarget &S = MF.getSubtarget<PPCSubtarget>(); 253*9880d681SAndroid Build Coastguard Worker return S.isPPC64() && S.isSVR4ABI(); 254*9880d681SAndroid Build Coastguard Worker }]; 255*9880d681SAndroid Build Coastguard Worker} 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Worker// For some instructions r0 is special (representing the value 0 instead of 258*9880d681SAndroid Build Coastguard Worker// the value in the r0 register), and we use these register subclasses to 259*9880d681SAndroid Build Coastguard Worker// prevent r0 from being allocated for use by those instructions. 260*9880d681SAndroid Build Coastguard Workerdef GPRC_NOR0 : RegisterClass<"PPC", [i32], 32, (add (sub GPRC, R0), ZERO)> { 261*9880d681SAndroid Build Coastguard Worker // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 262*9880d681SAndroid Build Coastguard Worker // put it at the end of the list. 263*9880d681SAndroid Build Coastguard Worker let AltOrders = [(add (sub GPRC_NOR0, R2), R2)]; 264*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 265*9880d681SAndroid Build Coastguard Worker const PPCSubtarget &S = MF.getSubtarget<PPCSubtarget>(); 266*9880d681SAndroid Build Coastguard Worker return S.isPPC64() && S.isSVR4ABI(); 267*9880d681SAndroid Build Coastguard Worker }]; 268*9880d681SAndroid Build Coastguard Worker} 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Workerdef G8RC_NOX0 : RegisterClass<"PPC", [i64], 64, (add (sub G8RC, X0), ZERO8)> { 271*9880d681SAndroid Build Coastguard Worker // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 272*9880d681SAndroid Build Coastguard Worker // put it at the end of the list. 273*9880d681SAndroid Build Coastguard Worker let AltOrders = [(add (sub G8RC_NOX0, X2), X2)]; 274*9880d681SAndroid Build Coastguard Worker let AltOrderSelect = [{ 275*9880d681SAndroid Build Coastguard Worker const PPCSubtarget &S = MF.getSubtarget<PPCSubtarget>(); 276*9880d681SAndroid Build Coastguard Worker return S.isPPC64() && S.isSVR4ABI(); 277*9880d681SAndroid Build Coastguard Worker }]; 278*9880d681SAndroid Build Coastguard Worker} 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker// Allocate volatiles first, then non-volatiles in reverse order. With the SVR4 281*9880d681SAndroid Build Coastguard Worker// ABI the size of the Floating-point register save area is determined by the 282*9880d681SAndroid Build Coastguard Worker// allocated non-volatile register with the lowest register number, as FP 283*9880d681SAndroid Build Coastguard Worker// register N is spilled to offset 8 * (32 - N) below the back chain word of the 284*9880d681SAndroid Build Coastguard Worker// previous stack frame. By allocating non-volatiles in reverse order we make 285*9880d681SAndroid Build Coastguard Worker// sure that the Floating-point register save area is always as small as 286*9880d681SAndroid Build Coastguard Worker// possible because there aren't any unused spill slots. 287*9880d681SAndroid Build Coastguard Workerdef F8RC : RegisterClass<"PPC", [f64], 64, (add (sequence "F%u", 0, 13), 288*9880d681SAndroid Build Coastguard Worker (sequence "F%u", 31, 14))>; 289*9880d681SAndroid Build Coastguard Workerdef F4RC : RegisterClass<"PPC", [f32], 32, (add F8RC)>; 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Workerdef VRRC : RegisterClass<"PPC", [v16i8,v8i16,v4i32,v2i64,v1i128,v4f32], 128, 292*9880d681SAndroid Build Coastguard Worker (add V2, V3, V4, V5, V0, V1, V6, V7, V8, V9, V10, V11, 293*9880d681SAndroid Build Coastguard Worker V12, V13, V14, V15, V16, V17, V18, V19, V31, V30, 294*9880d681SAndroid Build Coastguard Worker V29, V28, V27, V26, V25, V24, V23, V22, V21, V20)>; 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker// VSX register classes (the allocation order mirrors that of the corresponding 297*9880d681SAndroid Build Coastguard Worker// subregister classes). 298*9880d681SAndroid Build Coastguard Workerdef VSLRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128, 299*9880d681SAndroid Build Coastguard Worker (add (sequence "VSL%u", 0, 13), 300*9880d681SAndroid Build Coastguard Worker (sequence "VSL%u", 31, 14))>; 301*9880d681SAndroid Build Coastguard Workerdef VSHRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128, 302*9880d681SAndroid Build Coastguard Worker (add VSH2, VSH3, VSH4, VSH5, VSH0, VSH1, VSH6, VSH7, 303*9880d681SAndroid Build Coastguard Worker VSH8, VSH9, VSH10, VSH11, VSH12, VSH13, VSH14, 304*9880d681SAndroid Build Coastguard Worker VSH15, VSH16, VSH17, VSH18, VSH19, VSH31, VSH30, 305*9880d681SAndroid Build Coastguard Worker VSH29, VSH28, VSH27, VSH26, VSH25, VSH24, VSH23, 306*9880d681SAndroid Build Coastguard Worker VSH22, VSH21, VSH20)>; 307*9880d681SAndroid Build Coastguard Workerdef VSRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128, 308*9880d681SAndroid Build Coastguard Worker (add VSLRC, VSHRC)>; 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Worker// Register classes for the 64-bit "scalar" VSX subregisters. 311*9880d681SAndroid Build Coastguard Workerdef VFRC : RegisterClass<"PPC", [f64], 64, 312*9880d681SAndroid Build Coastguard Worker (add VF2, VF3, VF4, VF5, VF0, VF1, VF6, VF7, 313*9880d681SAndroid Build Coastguard Worker VF8, VF9, VF10, VF11, VF12, VF13, VF14, 314*9880d681SAndroid Build Coastguard Worker VF15, VF16, VF17, VF18, VF19, VF31, VF30, 315*9880d681SAndroid Build Coastguard Worker VF29, VF28, VF27, VF26, VF25, VF24, VF23, 316*9880d681SAndroid Build Coastguard Worker VF22, VF21, VF20)>; 317*9880d681SAndroid Build Coastguard Workerdef VSFRC : RegisterClass<"PPC", [f64], 64, (add F8RC, VFRC)>; 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker// Register class for single precision scalars in VSX registers 320*9880d681SAndroid Build Coastguard Workerdef VSSRC : RegisterClass<"PPC", [f32], 32, (add VSFRC)>; 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Worker// For QPX 323*9880d681SAndroid Build Coastguard Workerdef QFRC : RegisterClass<"PPC", [v4f64], 256, (add (sequence "QF%u", 0, 13), 324*9880d681SAndroid Build Coastguard Worker (sequence "QF%u", 31, 14))>; 325*9880d681SAndroid Build Coastguard Workerdef QSRC : RegisterClass<"PPC", [v4f32], 128, (add QFRC)>; 326*9880d681SAndroid Build Coastguard Workerdef QBRC : RegisterClass<"PPC", [v4i1], 256, (add QFRC)> { 327*9880d681SAndroid Build Coastguard Worker // These are actually stored as floating-point values where a positive 328*9880d681SAndroid Build Coastguard Worker // number is true and anything else (including NaN) is false. 329*9880d681SAndroid Build Coastguard Worker let Size = 256; 330*9880d681SAndroid Build Coastguard Worker} 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Workerdef CRBITRC : RegisterClass<"PPC", [i1], 32, 333*9880d681SAndroid Build Coastguard Worker (add CR2LT, CR2GT, CR2EQ, CR2UN, 334*9880d681SAndroid Build Coastguard Worker CR3LT, CR3GT, CR3EQ, CR3UN, 335*9880d681SAndroid Build Coastguard Worker CR4LT, CR4GT, CR4EQ, CR4UN, 336*9880d681SAndroid Build Coastguard Worker CR5LT, CR5GT, CR5EQ, CR5UN, 337*9880d681SAndroid Build Coastguard Worker CR6LT, CR6GT, CR6EQ, CR6UN, 338*9880d681SAndroid Build Coastguard Worker CR7LT, CR7GT, CR7EQ, CR7UN, 339*9880d681SAndroid Build Coastguard Worker CR1LT, CR1GT, CR1EQ, CR1UN, 340*9880d681SAndroid Build Coastguard Worker CR0LT, CR0GT, CR0EQ, CR0UN)> { 341*9880d681SAndroid Build Coastguard Worker let Size = 32; 342*9880d681SAndroid Build Coastguard Worker} 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Workerdef CRRC : RegisterClass<"PPC", [i32], 32, (add CR0, CR1, CR5, CR6, 345*9880d681SAndroid Build Coastguard Worker CR7, CR2, CR3, CR4)>; 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Workerdef CRRC0 : RegisterClass<"PPC", [i32], 32, (add CR0)>; 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Worker// The CTR registers are not allocatable because they're used by the 350*9880d681SAndroid Build Coastguard Worker// decrement-and-branch instructions, and thus need to stay live across 351*9880d681SAndroid Build Coastguard Worker// multiple basic blocks. 352*9880d681SAndroid Build Coastguard Workerdef CTRRC : RegisterClass<"PPC", [i32], 32, (add CTR)> { 353*9880d681SAndroid Build Coastguard Worker let isAllocatable = 0; 354*9880d681SAndroid Build Coastguard Worker} 355*9880d681SAndroid Build Coastguard Workerdef CTRRC8 : RegisterClass<"PPC", [i64], 64, (add CTR8)> { 356*9880d681SAndroid Build Coastguard Worker let isAllocatable = 0; 357*9880d681SAndroid Build Coastguard Worker} 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Workerdef VRSAVERC : RegisterClass<"PPC", [i32], 32, (add VRSAVE)>; 360*9880d681SAndroid Build Coastguard Workerdef CARRYRC : RegisterClass<"PPC", [i32], 32, (add CARRY)> { 361*9880d681SAndroid Build Coastguard Worker let CopyCost = -1; 362*9880d681SAndroid Build Coastguard Worker} 363*9880d681SAndroid Build Coastguard Worker 364