xref: /aosp_15_r20/external/llvm/lib/Target/AMDGPU/SIRegisterInfo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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