1*9880d681SAndroid Build Coastguard Worker//===-- SIRegisterInfo.td - SI 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 SI registers 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Workerclass SIReg <string n, bits<16> regIdx = 0> : Register<n>, 14*9880d681SAndroid Build Coastguard Worker DwarfRegNum<[!cast<int>(HWEncoding)]> { 15*9880d681SAndroid Build Coastguard Worker let Namespace = "AMDGPU"; 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker // This is the not yet the complete register encoding. An additional 18*9880d681SAndroid Build Coastguard Worker // bit is set for VGPRs. 19*9880d681SAndroid Build Coastguard Worker let HWEncoding = regIdx; 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker// Special Registers 23*9880d681SAndroid Build Coastguard Workerdef VCC_LO : SIReg<"vcc_lo", 106>; 24*9880d681SAndroid Build Coastguard Workerdef VCC_HI : SIReg<"vcc_hi", 107>; 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker// VCC for 64-bit instructions 27*9880d681SAndroid Build Coastguard Workerdef VCC : RegisterWithSubRegs<"vcc", [VCC_LO, VCC_HI]>, 28*9880d681SAndroid Build Coastguard Worker DwarfRegAlias<VCC_LO> { 29*9880d681SAndroid Build Coastguard Worker let Namespace = "AMDGPU"; 30*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub0, sub1]; 31*9880d681SAndroid Build Coastguard Worker let HWEncoding = 106; 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdef EXEC_LO : SIReg<"exec_lo", 126>; 35*9880d681SAndroid Build Coastguard Workerdef EXEC_HI : SIReg<"exec_hi", 127>; 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdef EXEC : RegisterWithSubRegs<"EXEC", [EXEC_LO, EXEC_HI]>, 38*9880d681SAndroid Build Coastguard Worker DwarfRegAlias<EXEC_LO> { 39*9880d681SAndroid Build Coastguard Worker let Namespace = "AMDGPU"; 40*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub0, sub1]; 41*9880d681SAndroid Build Coastguard Worker let HWEncoding = 126; 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdef SCC : SIReg<"scc", 253>; 45*9880d681SAndroid Build Coastguard Workerdef M0 : SIReg <"m0", 124>; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker// Trap handler registers 48*9880d681SAndroid Build Coastguard Workerdef TBA_LO : SIReg<"tba_lo", 108>; 49*9880d681SAndroid Build Coastguard Workerdef TBA_HI : SIReg<"tba_hi", 109>; 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdef TBA : RegisterWithSubRegs<"tba", [TBA_LO, TBA_HI]>, 52*9880d681SAndroid Build Coastguard Worker DwarfRegAlias<TBA_LO> { 53*9880d681SAndroid Build Coastguard Worker let Namespace = "AMDGPU"; 54*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub0, sub1]; 55*9880d681SAndroid Build Coastguard Worker let HWEncoding = 108; 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdef TMA_LO : SIReg<"tma_lo", 110>; 59*9880d681SAndroid Build Coastguard Workerdef TMA_HI : SIReg<"tma_hi", 111>; 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdef TMA : RegisterWithSubRegs<"tma", [TMA_LO, TMA_HI]>, 62*9880d681SAndroid Build Coastguard Worker DwarfRegAlias<TMA_LO> { 63*9880d681SAndroid Build Coastguard Worker let Namespace = "AMDGPU"; 64*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub0, sub1]; 65*9880d681SAndroid Build Coastguard Worker let HWEncoding = 110; 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdef TTMP0 : SIReg <"ttmp0", 112>; 69*9880d681SAndroid Build Coastguard Workerdef TTMP1 : SIReg <"ttmp1", 113>; 70*9880d681SAndroid Build Coastguard Workerdef TTMP2 : SIReg <"ttmp2", 114>; 71*9880d681SAndroid Build Coastguard Workerdef TTMP3 : SIReg <"ttmp3", 115>; 72*9880d681SAndroid Build Coastguard Workerdef TTMP4 : SIReg <"ttmp4", 116>; 73*9880d681SAndroid Build Coastguard Workerdef TTMP5 : SIReg <"ttmp5", 117>; 74*9880d681SAndroid Build Coastguard Workerdef TTMP6 : SIReg <"ttmp6", 118>; 75*9880d681SAndroid Build Coastguard Workerdef TTMP7 : SIReg <"ttmp7", 119>; 76*9880d681SAndroid Build Coastguard Workerdef TTMP8 : SIReg <"ttmp8", 120>; 77*9880d681SAndroid Build Coastguard Workerdef TTMP9 : SIReg <"ttmp9", 121>; 78*9880d681SAndroid Build Coastguard Workerdef TTMP10 : SIReg <"ttmp10", 122>; 79*9880d681SAndroid Build Coastguard Workerdef TTMP11 : SIReg <"ttmp11", 123>; 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workermulticlass FLAT_SCR_LOHI_m <string n, bits<16> ci_e, bits<16> vi_e> { 82*9880d681SAndroid Build Coastguard Worker def _ci : SIReg<n, ci_e>; 83*9880d681SAndroid Build Coastguard Worker def _vi : SIReg<n, vi_e>; 84*9880d681SAndroid Build Coastguard Worker def "" : SIReg<"", 0>; 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerclass FlatReg <Register lo, Register hi, bits<16> encoding> : 88*9880d681SAndroid Build Coastguard Worker RegisterWithSubRegs<"flat_scratch", [lo, hi]>, 89*9880d681SAndroid Build Coastguard Worker DwarfRegAlias<lo> { 90*9880d681SAndroid Build Coastguard Worker let Namespace = "AMDGPU"; 91*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub0, sub1]; 92*9880d681SAndroid Build Coastguard Worker let HWEncoding = encoding; 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefm FLAT_SCR_LO : FLAT_SCR_LOHI_m<"flat_scratch_lo", 104, 102>; // Offset in units of 256-bytes. 96*9880d681SAndroid Build Coastguard Workerdefm FLAT_SCR_HI : FLAT_SCR_LOHI_m<"flat_scratch_hi", 105, 103>; // Size is the per-thread scratch size, in bytes. 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdef FLAT_SCR_ci : FlatReg<FLAT_SCR_LO_ci, FLAT_SCR_HI_ci, 104>; 99*9880d681SAndroid Build Coastguard Workerdef FLAT_SCR_vi : FlatReg<FLAT_SCR_LO_vi, FLAT_SCR_HI_vi, 102>; 100*9880d681SAndroid Build Coastguard Workerdef FLAT_SCR : FlatReg<FLAT_SCR_LO, FLAT_SCR_HI, 0>; 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker// SGPR registers 103*9880d681SAndroid Build Coastguard Workerforeach Index = 0-103 in { 104*9880d681SAndroid Build Coastguard Worker def SGPR#Index : SIReg <"SGPR"#Index, Index>; 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker// VGPR registers 108*9880d681SAndroid Build Coastguard Workerforeach Index = 0-255 in { 109*9880d681SAndroid Build Coastguard Worker def VGPR#Index : SIReg <"VGPR"#Index, Index> { 110*9880d681SAndroid Build Coastguard Worker let HWEncoding{8} = 1; 111*9880d681SAndroid Build Coastguard Worker } 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 115*9880d681SAndroid Build Coastguard Worker// Groupings using register classes and tuples 116*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdef SCC_CLASS : RegisterClass<"AMDGPU", [i1], 1, (add SCC)> { 119*9880d681SAndroid Build Coastguard Worker let CopyCost = -1; 120*9880d681SAndroid Build Coastguard Worker let isAllocatable = 0; 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker// TODO: Do we need to set DwarfRegAlias on register tuples? 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker// SGPR 32-bit registers 126*9880d681SAndroid Build Coastguard Workerdef SGPR_32 : RegisterClass<"AMDGPU", [i32, f32], 32, 127*9880d681SAndroid Build Coastguard Worker (add (sequence "SGPR%u", 0, 103))> { 128*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 1; 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker// SGPR 64-bit registers 132*9880d681SAndroid Build Coastguard Workerdef SGPR_64Regs : RegisterTuples<[sub0, sub1], 133*9880d681SAndroid Build Coastguard Worker [(add (decimate SGPR_32, 2)), 134*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 1), 2))]>; 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker// SGPR 128-bit registers 137*9880d681SAndroid Build Coastguard Workerdef SGPR_128Regs : RegisterTuples<[sub0, sub1, sub2, sub3], 138*9880d681SAndroid Build Coastguard Worker [(add (decimate SGPR_32, 4)), 139*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 1), 4)), 140*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 2), 4)), 141*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 3), 4))]>; 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker// SGPR 256-bit registers 144*9880d681SAndroid Build Coastguard Workerdef SGPR_256 : RegisterTuples<[sub0, sub1, sub2, sub3, sub4, sub5, sub6, sub7], 145*9880d681SAndroid Build Coastguard Worker [(add (decimate SGPR_32, 4)), 146*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 1), 4)), 147*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 2), 4)), 148*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 3), 4)), 149*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 4), 4)), 150*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 5), 4)), 151*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 6), 4)), 152*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 7), 4))]>; 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker// SGPR 512-bit registers 155*9880d681SAndroid Build Coastguard Workerdef SGPR_512 : RegisterTuples<[sub0, sub1, sub2, sub3, sub4, sub5, sub6, sub7, 156*9880d681SAndroid Build Coastguard Worker sub8, sub9, sub10, sub11, sub12, sub13, sub14, sub15], 157*9880d681SAndroid Build Coastguard Worker [(add (decimate SGPR_32, 4)), 158*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 1), 4)), 159*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 2), 4)), 160*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 3), 4)), 161*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 4), 4)), 162*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 5), 4)), 163*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 6), 4)), 164*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 7), 4)), 165*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 8), 4)), 166*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 9), 4)), 167*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 10), 4)), 168*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 11), 4)), 169*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 12), 4)), 170*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 13), 4)), 171*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 14), 4)), 172*9880d681SAndroid Build Coastguard Worker (add (decimate (shl SGPR_32, 15), 4))]>; 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker// Trap handler TMP 32-bit registers 175*9880d681SAndroid Build Coastguard Workerdef TTMP_32 : RegisterClass<"AMDGPU", [i32, f32], 32, 176*9880d681SAndroid Build Coastguard Worker (add (sequence "TTMP%u", 0, 11))> { 177*9880d681SAndroid Build Coastguard Worker let isAllocatable = 0; 178*9880d681SAndroid Build Coastguard Worker} 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker// Trap handler TMP 64-bit registers 181*9880d681SAndroid Build Coastguard Workerdef TTMP_64Regs : RegisterTuples<[sub0, sub1], 182*9880d681SAndroid Build Coastguard Worker [(add (decimate TTMP_32, 2)), 183*9880d681SAndroid Build Coastguard Worker (add (decimate (shl TTMP_32, 1), 2))]>; 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker// Trap handler TMP 128-bit registers 186*9880d681SAndroid Build Coastguard Workerdef TTMP_128Regs : RegisterTuples<[sub0, sub1, sub2, sub3], 187*9880d681SAndroid Build Coastguard Worker [(add (decimate TTMP_32, 4)), 188*9880d681SAndroid Build Coastguard Worker (add (decimate (shl TTMP_32, 1), 4)), 189*9880d681SAndroid Build Coastguard Worker (add (decimate (shl TTMP_32, 2), 4)), 190*9880d681SAndroid Build Coastguard Worker (add (decimate (shl TTMP_32, 3), 4))]>; 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker// VGPR 32-bit registers 193*9880d681SAndroid Build Coastguard Workerdef VGPR_32 : RegisterClass<"AMDGPU", [i32, f32], 32, 194*9880d681SAndroid Build Coastguard Worker (add (sequence "VGPR%u", 0, 255))> { 195*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 1; 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker// VGPR 64-bit registers 199*9880d681SAndroid Build Coastguard Workerdef VGPR_64 : RegisterTuples<[sub0, sub1], 200*9880d681SAndroid Build Coastguard Worker [(add (trunc VGPR_32, 255)), 201*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 1))]>; 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker// VGPR 96-bit registers 204*9880d681SAndroid Build Coastguard Workerdef VGPR_96 : RegisterTuples<[sub0, sub1, sub2], 205*9880d681SAndroid Build Coastguard Worker [(add (trunc VGPR_32, 254)), 206*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 1)), 207*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 2))]>; 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker// VGPR 128-bit registers 210*9880d681SAndroid Build Coastguard Workerdef VGPR_128 : RegisterTuples<[sub0, sub1, sub2, sub3], 211*9880d681SAndroid Build Coastguard Worker [(add (trunc VGPR_32, 253)), 212*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 1)), 213*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 2)), 214*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 3))]>; 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker// VGPR 256-bit registers 217*9880d681SAndroid Build Coastguard Workerdef VGPR_256 : RegisterTuples<[sub0, sub1, sub2, sub3, sub4, sub5, sub6, sub7], 218*9880d681SAndroid Build Coastguard Worker [(add (trunc VGPR_32, 249)), 219*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 1)), 220*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 2)), 221*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 3)), 222*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 4)), 223*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 5)), 224*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 6)), 225*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 7))]>; 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker// VGPR 512-bit registers 228*9880d681SAndroid Build Coastguard Workerdef VGPR_512 : RegisterTuples<[sub0, sub1, sub2, sub3, sub4, sub5, sub6, sub7, 229*9880d681SAndroid Build Coastguard Worker sub8, sub9, sub10, sub11, sub12, sub13, sub14, sub15], 230*9880d681SAndroid Build Coastguard Worker [(add (trunc VGPR_32, 241)), 231*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 1)), 232*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 2)), 233*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 3)), 234*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 4)), 235*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 5)), 236*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 6)), 237*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 7)), 238*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 8)), 239*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 9)), 240*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 10)), 241*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 11)), 242*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 12)), 243*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 13)), 244*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 14)), 245*9880d681SAndroid Build Coastguard Worker (add (shl VGPR_32, 15))]>; 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 248*9880d681SAndroid Build Coastguard Worker// Register classes used as source and destination 249*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerclass RegImmMatcher<string name> : AsmOperandClass { 252*9880d681SAndroid Build Coastguard Worker let Name = name; 253*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addRegOrImmOperands"; 254*9880d681SAndroid Build Coastguard Worker} 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker// Subset of SReg_32 without M0 for SMRD instructions and alike. 257*9880d681SAndroid Build Coastguard Worker// See comments in SIInstructions.td for more info. 258*9880d681SAndroid Build Coastguard Workerdef SReg_32_XM0 : RegisterClass<"AMDGPU", [i32, f32], 32, 259*9880d681SAndroid Build Coastguard Worker (add SGPR_32, VCC_LO, VCC_HI, EXEC_LO, EXEC_HI, FLAT_SCR_LO, FLAT_SCR_HI, 260*9880d681SAndroid Build Coastguard Worker TTMP_32, TMA_LO, TMA_HI, TBA_LO, TBA_HI)> { 261*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 1; 262*9880d681SAndroid Build Coastguard Worker} 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Worker// Register class for all scalar registers (SGPRs + Special Registers) 265*9880d681SAndroid Build Coastguard Workerdef SReg_32 : RegisterClass<"AMDGPU", [i32, f32], 32, 266*9880d681SAndroid Build Coastguard Worker (add SReg_32_XM0, M0)> { 267*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 1; 268*9880d681SAndroid Build Coastguard Worker} 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Workerdef SGPR_64 : RegisterClass<"AMDGPU", [v2i32, i64, f64], 32, (add SGPR_64Regs)> { 271*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 2; 272*9880d681SAndroid Build Coastguard Worker} 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Workerdef TTMP_64 : RegisterClass<"AMDGPU", [v2i32, i64, f64], 32, (add TTMP_64Regs)> { 275*9880d681SAndroid Build Coastguard Worker let isAllocatable = 0; 276*9880d681SAndroid Build Coastguard Worker} 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerdef SReg_64 : RegisterClass<"AMDGPU", [v2i32, i64, f64, i1], 32, 279*9880d681SAndroid Build Coastguard Worker (add SGPR_64, VCC, EXEC, FLAT_SCR, TTMP_64, TBA, TMA)> { 280*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 2; 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker// Requires 2 s_mov_b64 to copy 284*9880d681SAndroid Build Coastguard Workerlet CopyCost = 2 in { 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Workerdef SGPR_128 : RegisterClass<"AMDGPU", [v4i32, v16i8, v2i64], 32, (add SGPR_128Regs)> { 287*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 4; 288*9880d681SAndroid Build Coastguard Worker} 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Workerdef TTMP_128 : RegisterClass<"AMDGPU", [v4i32, v16i8, v2i64], 32, (add TTMP_128Regs)> { 291*9880d681SAndroid Build Coastguard Worker let isAllocatable = 0; 292*9880d681SAndroid Build Coastguard Worker} 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Workerdef SReg_128 : RegisterClass<"AMDGPU", [v4i32, v16i8, v2i64], 32, (add SGPR_128, TTMP_128)> { 295*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 4; 296*9880d681SAndroid Build Coastguard Worker} 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker} // End CopyCost = 2 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerdef SReg_256 : RegisterClass<"AMDGPU", [v8i32, v8f32], 32, (add SGPR_256)> { 301*9880d681SAndroid Build Coastguard Worker // Requires 4 s_mov_b64 to copy 302*9880d681SAndroid Build Coastguard Worker let CopyCost = 4; 303*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 5; 304*9880d681SAndroid Build Coastguard Worker} 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard Workerdef SReg_512 : RegisterClass<"AMDGPU", [v64i8, v16i32], 32, (add SGPR_512)> { 307*9880d681SAndroid Build Coastguard Worker // Requires 8 s_mov_b64 to copy 308*9880d681SAndroid Build Coastguard Worker let CopyCost = 8; 309*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 6; 310*9880d681SAndroid Build Coastguard Worker} 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker// Register class for all vector registers (VGPRs + Interploation Registers) 313*9880d681SAndroid Build Coastguard Workerdef VReg_64 : RegisterClass<"AMDGPU", [i64, f64, v2i32, v2f32], 32, (add VGPR_64)> { 314*9880d681SAndroid Build Coastguard Worker // Requires 2 v_mov_b32 to copy 315*9880d681SAndroid Build Coastguard Worker let CopyCost = 2; 316*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 2; 317*9880d681SAndroid Build Coastguard Worker} 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Workerdef VReg_96 : RegisterClass<"AMDGPU", [untyped], 32, (add VGPR_96)> { 320*9880d681SAndroid Build Coastguard Worker let Size = 96; 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Worker // Requires 3 v_mov_b32 to copy 323*9880d681SAndroid Build Coastguard Worker let CopyCost = 3; 324*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 3; 325*9880d681SAndroid Build Coastguard Worker} 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Workerdef VReg_128 : RegisterClass<"AMDGPU", [v4i32, v4f32, v2i64, v2f64], 32, (add VGPR_128)> { 328*9880d681SAndroid Build Coastguard Worker // Requires 4 v_mov_b32 to copy 329*9880d681SAndroid Build Coastguard Worker let CopyCost = 4; 330*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 4; 331*9880d681SAndroid Build Coastguard Worker} 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Workerdef VReg_256 : RegisterClass<"AMDGPU", [v8i32, v8f32], 32, (add VGPR_256)> { 334*9880d681SAndroid Build Coastguard Worker let CopyCost = 8; 335*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 5; 336*9880d681SAndroid Build Coastguard Worker} 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Workerdef VReg_512 : RegisterClass<"AMDGPU", [v16i32, v16f32], 32, (add VGPR_512)> { 339*9880d681SAndroid Build Coastguard Worker let CopyCost = 16; 340*9880d681SAndroid Build Coastguard Worker let AllocationPriority = 6; 341*9880d681SAndroid Build Coastguard Worker} 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Workerdef VReg_1 : RegisterClass<"AMDGPU", [i1], 32, (add VGPR_32)> { 344*9880d681SAndroid Build Coastguard Worker let Size = 32; 345*9880d681SAndroid Build Coastguard Worker} 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Workerclass RegImmOperand <RegisterClass rc> : RegisterOperand<rc> { 348*9880d681SAndroid Build Coastguard Worker let OperandNamespace = "AMDGPU"; 349*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_REG_IMM32"; 350*9880d681SAndroid Build Coastguard Worker} 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Workerclass RegInlineOperand <RegisterClass rc> : RegisterOperand<rc> { 353*9880d681SAndroid Build Coastguard Worker let OperandNamespace = "AMDGPU"; 354*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_REG_INLINE_C"; 355*9880d681SAndroid Build Coastguard Worker} 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 358*9880d681SAndroid Build Coastguard Worker// SSrc_* Operands with an SGPR or a 32-bit immediate 359*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Workerdef SSrc_32 : RegImmOperand<SReg_32> { 362*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = RegImmMatcher<"SSrc32">; 363*9880d681SAndroid Build Coastguard Worker} 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Workerdef SSrc_64 : RegImmOperand<SReg_64> { 366*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = RegImmMatcher<"SSrc64">; 367*9880d681SAndroid Build Coastguard Worker} 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 370*9880d681SAndroid Build Coastguard Worker// SCSrc_* Operands with an SGPR or a inline constant 371*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Workerdef SCSrc_32 : RegInlineOperand<SReg_32> { 374*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = RegImmMatcher<"SCSrc32">; 375*9880d681SAndroid Build Coastguard Worker} 376*9880d681SAndroid Build Coastguard Worker 377*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 378*9880d681SAndroid Build Coastguard Worker// VSrc_* Operands with an SGPR, VGPR or a 32-bit immediate 379*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard Workerdef VS_32 : RegisterClass<"AMDGPU", [i32, f32], 32, (add VGPR_32, SReg_32)>; 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Workerdef VS_64 : RegisterClass<"AMDGPU", [i64, f64], 32, (add VReg_64, SReg_64)> { 384*9880d681SAndroid Build Coastguard Worker let CopyCost = 2; 385*9880d681SAndroid Build Coastguard Worker} 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Workerdef VSrc_32 : RegisterOperand<VS_32> { 388*9880d681SAndroid Build Coastguard Worker let OperandNamespace = "AMDGPU"; 389*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_REG_IMM32"; 390*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = RegImmMatcher<"VSrc32">; 391*9880d681SAndroid Build Coastguard Worker} 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard Workerdef VSrc_64 : RegisterOperand<VS_64> { 394*9880d681SAndroid Build Coastguard Worker let OperandNamespace = "AMDGPU"; 395*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_REG_IMM32"; 396*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = RegImmMatcher<"VSrc64">; 397*9880d681SAndroid Build Coastguard Worker} 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 400*9880d681SAndroid Build Coastguard Worker// VCSrc_* Operands with an SGPR, VGPR or an inline constant 401*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Workerdef VCSrc_32 : RegisterOperand<VS_32> { 404*9880d681SAndroid Build Coastguard Worker let OperandNamespace = "AMDGPU"; 405*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_REG_INLINE_C"; 406*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = RegImmMatcher<"VCSrc32">; 407*9880d681SAndroid Build Coastguard Worker} 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Workerdef VCSrc_64 : RegisterOperand<VS_64> { 410*9880d681SAndroid Build Coastguard Worker let OperandNamespace = "AMDGPU"; 411*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_REG_INLINE_C"; 412*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = RegImmMatcher<"VCSrc64">; 413*9880d681SAndroid Build Coastguard Worker} 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 416*9880d681SAndroid Build Coastguard Worker// SCSrc_* Operands with an SGPR or an inline constant 417*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 418*9880d681SAndroid Build Coastguard Worker 419*9880d681SAndroid Build Coastguard Workerdef SCSrc_64 : RegisterOperand<SReg_64> { 420*9880d681SAndroid Build Coastguard Worker let OperandNamespace = "AMDGPU"; 421*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_REG_INLINE_C"; 422*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = RegImmMatcher<"SCSrc64">; 423*9880d681SAndroid Build Coastguard Worker} 424