xref: /aosp_15_r20/external/llvm/lib/Target/SystemZ/SystemZRegisterInfo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//==- SystemZRegisterInfo.td - SystemZ register definitions -*- 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// Class definitions.
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerclass SystemZReg<string n> : Register<n> {
15*9880d681SAndroid Build Coastguard Worker  let Namespace = "SystemZ";
16*9880d681SAndroid Build Coastguard Worker}
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerclass SystemZRegWithSubregs<string n, list<Register> subregs>
19*9880d681SAndroid Build Coastguard Worker  : RegisterWithSubRegs<n, subregs> {
20*9880d681SAndroid Build Coastguard Worker  let Namespace = "SystemZ";
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerlet Namespace = "SystemZ" in {
24*9880d681SAndroid Build Coastguard Workerdef subreg_l32   : SubRegIndex<32, 0>;  // Also acts as subreg_ll32.
25*9880d681SAndroid Build Coastguard Workerdef subreg_h32   : SubRegIndex<32, 32>; // Also acts as subreg_lh32.
26*9880d681SAndroid Build Coastguard Workerdef subreg_l64   : SubRegIndex<64, 0>;
27*9880d681SAndroid Build Coastguard Workerdef subreg_h64   : SubRegIndex<64, 64>;
28*9880d681SAndroid Build Coastguard Workerdef subreg_r32   : SubRegIndex<32, 32>; // Reinterpret a wider reg as 32 bits.
29*9880d681SAndroid Build Coastguard Workerdef subreg_r64   : SubRegIndex<64, 64>; // Reinterpret a wider reg as 64 bits.
30*9880d681SAndroid Build Coastguard Workerdef subreg_hh32  : ComposedSubRegIndex<subreg_h64, subreg_h32>;
31*9880d681SAndroid Build Coastguard Workerdef subreg_hl32  : ComposedSubRegIndex<subreg_h64, subreg_l32>;
32*9880d681SAndroid Build Coastguard Workerdef subreg_hr32  : ComposedSubRegIndex<subreg_h64, subreg_r32>;
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker// Define a register class that contains values of types TYPES and an
36*9880d681SAndroid Build Coastguard Worker// associated operand called NAME.  SIZE is the size and alignment
37*9880d681SAndroid Build Coastguard Worker// of the registers and REGLIST is the list of individual registers.
38*9880d681SAndroid Build Coastguard Workermulticlass SystemZRegClass<string name, list<ValueType> types, int size,
39*9880d681SAndroid Build Coastguard Worker                           dag regList> {
40*9880d681SAndroid Build Coastguard Worker  def AsmOperand : AsmOperandClass {
41*9880d681SAndroid Build Coastguard Worker    let Name = name;
42*9880d681SAndroid Build Coastguard Worker    let ParserMethod = "parse"##name;
43*9880d681SAndroid Build Coastguard Worker    let RenderMethod = "addRegOperands";
44*9880d681SAndroid Build Coastguard Worker  }
45*9880d681SAndroid Build Coastguard Worker  def Bit : RegisterClass<"SystemZ", types, size, regList> {
46*9880d681SAndroid Build Coastguard Worker    let Size = size;
47*9880d681SAndroid Build Coastguard Worker  }
48*9880d681SAndroid Build Coastguard Worker  def "" : RegisterOperand<!cast<RegisterClass>(name##"Bit")> {
49*9880d681SAndroid Build Coastguard Worker    let ParserMatchClass = !cast<AsmOperandClass>(name##"AsmOperand");
50*9880d681SAndroid Build Coastguard Worker  }
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
54*9880d681SAndroid Build Coastguard Worker// General-purpose registers
55*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker// Lower 32 bits of one of the 16 64-bit general-purpose registers
58*9880d681SAndroid Build Coastguard Workerclass GPR32<bits<16> num, string n> : SystemZReg<n> {
59*9880d681SAndroid Build Coastguard Worker  let HWEncoding = num;
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker// One of the 16 64-bit general-purpose registers.
63*9880d681SAndroid Build Coastguard Workerclass GPR64<bits<16> num, string n, GPR32 low, GPR32 high>
64*9880d681SAndroid Build Coastguard Worker : SystemZRegWithSubregs<n, [low, high]> {
65*9880d681SAndroid Build Coastguard Worker  let HWEncoding = num;
66*9880d681SAndroid Build Coastguard Worker  let SubRegIndices = [subreg_l32, subreg_h32];
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker// 8 even-odd pairs of GPR64s.
70*9880d681SAndroid Build Coastguard Workerclass GPR128<bits<16> num, string n, GPR64 low, GPR64 high>
71*9880d681SAndroid Build Coastguard Worker : SystemZRegWithSubregs<n, [low, high]> {
72*9880d681SAndroid Build Coastguard Worker  let HWEncoding = num;
73*9880d681SAndroid Build Coastguard Worker  let SubRegIndices = [subreg_l64, subreg_h64];
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker// General-purpose registers
77*9880d681SAndroid Build Coastguard Workerforeach I = 0-15 in {
78*9880d681SAndroid Build Coastguard Worker  def R#I#L : GPR32<I, "r"#I>;
79*9880d681SAndroid Build Coastguard Worker  def R#I#H : GPR32<I, "r"#I>;
80*9880d681SAndroid Build Coastguard Worker  def R#I#D : GPR64<I, "r"#I, !cast<GPR32>("R"#I#"L"), !cast<GPR32>("R"#I#"H")>,
81*9880d681SAndroid Build Coastguard Worker                    DwarfRegNum<[I]>;
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerforeach I = [0, 2, 4, 6, 8, 10, 12, 14] in {
85*9880d681SAndroid Build Coastguard Worker  def R#I#Q : GPR128<I, "r"#I, !cast<GPR64>("R"#!add(I, 1)#"D"),
86*9880d681SAndroid Build Coastguard Worker                     !cast<GPR64>("R"#I#"D")>;
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker/// Allocate the callee-saved R6-R13 backwards. That way they can be saved
90*9880d681SAndroid Build Coastguard Worker/// together with R14 and R15 in one prolog instruction.
91*9880d681SAndroid Build Coastguard Workerdefm GR32  : SystemZRegClass<"GR32",  [i32], 32,
92*9880d681SAndroid Build Coastguard Worker                             (add (sequence "R%uL",  0, 5),
93*9880d681SAndroid Build Coastguard Worker                                  (sequence "R%uL", 15, 6))>;
94*9880d681SAndroid Build Coastguard Workerdefm GRH32 : SystemZRegClass<"GRH32", [i32], 32,
95*9880d681SAndroid Build Coastguard Worker                             (add (sequence "R%uH",  0, 5),
96*9880d681SAndroid Build Coastguard Worker                                  (sequence "R%uH", 15, 6))>;
97*9880d681SAndroid Build Coastguard Workerdefm GR64  : SystemZRegClass<"GR64",  [i64], 64,
98*9880d681SAndroid Build Coastguard Worker                             (add (sequence "R%uD",  0, 5),
99*9880d681SAndroid Build Coastguard Worker                                  (sequence "R%uD", 15, 6))>;
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker// Combine the low and high GR32s into a single class.  This can only be
102*9880d681SAndroid Build Coastguard Worker// used for virtual registers if the high-word facility is available.
103*9880d681SAndroid Build Coastguard Workerdefm GRX32 : SystemZRegClass<"GRX32", [i32], 32,
104*9880d681SAndroid Build Coastguard Worker                             (add (sequence "R%uL",  0, 5),
105*9880d681SAndroid Build Coastguard Worker                                  (sequence "R%uH",  0, 5),
106*9880d681SAndroid Build Coastguard Worker                                  R15L, R15H, R14L, R14H, R13L, R13H,
107*9880d681SAndroid Build Coastguard Worker                                  R12L, R12H, R11L, R11H, R10L, R10H,
108*9880d681SAndroid Build Coastguard Worker                                  R9L, R9H, R8L, R8H, R7L, R7H, R6L, R6H)>;
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker// The architecture doesn't really have any i128 support, so model the
111*9880d681SAndroid Build Coastguard Worker// register pairs as untyped instead.
112*9880d681SAndroid Build Coastguard Workerdefm GR128 : SystemZRegClass<"GR128", [untyped], 128,
113*9880d681SAndroid Build Coastguard Worker                             (add R0Q, R2Q, R4Q, R12Q, R10Q, R8Q, R6Q, R14Q)>;
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker// Base and index registers.  Everything except R0, which in an address
116*9880d681SAndroid Build Coastguard Worker// context evaluates as 0.
117*9880d681SAndroid Build Coastguard Workerdefm ADDR32 : SystemZRegClass<"ADDR32", [i32], 32, (sub GR32Bit, R0L)>;
118*9880d681SAndroid Build Coastguard Workerdefm ADDR64 : SystemZRegClass<"ADDR64", [i64], 64, (sub GR64Bit, R0D)>;
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker// Not used directly, but needs to exist for ADDR32 and ADDR64 subregs
121*9880d681SAndroid Build Coastguard Worker// of a GR128.
122*9880d681SAndroid Build Coastguard Workerdefm ADDR128 : SystemZRegClass<"ADDR128", [untyped], 128, (sub GR128Bit, R0Q)>;
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
125*9880d681SAndroid Build Coastguard Worker// Floating-point registers
126*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker// Maps FPR register numbers to their DWARF encoding.
129*9880d681SAndroid Build Coastguard Workerclass DwarfMapping<int id> { int Id = id; }
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdef F0Dwarf  : DwarfMapping<16>;
132*9880d681SAndroid Build Coastguard Workerdef F2Dwarf  : DwarfMapping<17>;
133*9880d681SAndroid Build Coastguard Workerdef F4Dwarf  : DwarfMapping<18>;
134*9880d681SAndroid Build Coastguard Workerdef F6Dwarf  : DwarfMapping<19>;
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerdef F1Dwarf  : DwarfMapping<20>;
137*9880d681SAndroid Build Coastguard Workerdef F3Dwarf  : DwarfMapping<21>;
138*9880d681SAndroid Build Coastguard Workerdef F5Dwarf  : DwarfMapping<22>;
139*9880d681SAndroid Build Coastguard Workerdef F7Dwarf  : DwarfMapping<23>;
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerdef F8Dwarf  : DwarfMapping<24>;
142*9880d681SAndroid Build Coastguard Workerdef F10Dwarf : DwarfMapping<25>;
143*9880d681SAndroid Build Coastguard Workerdef F12Dwarf : DwarfMapping<26>;
144*9880d681SAndroid Build Coastguard Workerdef F14Dwarf : DwarfMapping<27>;
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdef F9Dwarf  : DwarfMapping<28>;
147*9880d681SAndroid Build Coastguard Workerdef F11Dwarf : DwarfMapping<29>;
148*9880d681SAndroid Build Coastguard Workerdef F13Dwarf : DwarfMapping<30>;
149*9880d681SAndroid Build Coastguard Workerdef F15Dwarf : DwarfMapping<31>;
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerdef F16Dwarf : DwarfMapping<68>;
152*9880d681SAndroid Build Coastguard Workerdef F18Dwarf : DwarfMapping<69>;
153*9880d681SAndroid Build Coastguard Workerdef F20Dwarf : DwarfMapping<70>;
154*9880d681SAndroid Build Coastguard Workerdef F22Dwarf : DwarfMapping<71>;
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerdef F17Dwarf : DwarfMapping<72>;
157*9880d681SAndroid Build Coastguard Workerdef F19Dwarf : DwarfMapping<73>;
158*9880d681SAndroid Build Coastguard Workerdef F21Dwarf : DwarfMapping<74>;
159*9880d681SAndroid Build Coastguard Workerdef F23Dwarf : DwarfMapping<75>;
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdef F24Dwarf : DwarfMapping<76>;
162*9880d681SAndroid Build Coastguard Workerdef F26Dwarf : DwarfMapping<77>;
163*9880d681SAndroid Build Coastguard Workerdef F28Dwarf : DwarfMapping<78>;
164*9880d681SAndroid Build Coastguard Workerdef F30Dwarf : DwarfMapping<79>;
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerdef F25Dwarf : DwarfMapping<80>;
167*9880d681SAndroid Build Coastguard Workerdef F27Dwarf : DwarfMapping<81>;
168*9880d681SAndroid Build Coastguard Workerdef F29Dwarf : DwarfMapping<82>;
169*9880d681SAndroid Build Coastguard Workerdef F31Dwarf : DwarfMapping<83>;
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker// Upper 32 bits of one of the floating-point registers
172*9880d681SAndroid Build Coastguard Workerclass FPR32<bits<16> num, string n> : SystemZReg<n> {
173*9880d681SAndroid Build Coastguard Worker  let HWEncoding = num;
174*9880d681SAndroid Build Coastguard Worker}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker// One of the floating-point registers.
177*9880d681SAndroid Build Coastguard Workerclass FPR64<bits<16> num, string n, FPR32 high>
178*9880d681SAndroid Build Coastguard Worker : SystemZRegWithSubregs<n, [high]> {
179*9880d681SAndroid Build Coastguard Worker  let HWEncoding = num;
180*9880d681SAndroid Build Coastguard Worker  let SubRegIndices = [subreg_r32];
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker// 8 pairs of FPR64s, with a one-register gap inbetween.
184*9880d681SAndroid Build Coastguard Workerclass FPR128<bits<16> num, string n, FPR64 low, FPR64 high>
185*9880d681SAndroid Build Coastguard Worker : SystemZRegWithSubregs<n, [low, high]> {
186*9880d681SAndroid Build Coastguard Worker  let HWEncoding = num;
187*9880d681SAndroid Build Coastguard Worker  let SubRegIndices = [subreg_l64, subreg_h64];
188*9880d681SAndroid Build Coastguard Worker}
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker// Floating-point registers.  Registers 16-31 require the vector facility.
191*9880d681SAndroid Build Coastguard Workerforeach I = 0-15 in {
192*9880d681SAndroid Build Coastguard Worker  def F#I#S : FPR32<I, "f"#I>;
193*9880d681SAndroid Build Coastguard Worker  def F#I#D : FPR64<I, "f"#I, !cast<FPR32>("F"#I#"S")>,
194*9880d681SAndroid Build Coastguard Worker              DwarfRegNum<[!cast<DwarfMapping>("F"#I#"Dwarf").Id]>;
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Workerforeach I = 16-31 in {
197*9880d681SAndroid Build Coastguard Worker  def F#I#S : FPR32<I, "v"#I>;
198*9880d681SAndroid Build Coastguard Worker  def F#I#D : FPR64<I, "v"#I, !cast<FPR32>("F"#I#"S")>,
199*9880d681SAndroid Build Coastguard Worker              DwarfRegNum<[!cast<DwarfMapping>("F"#I#"Dwarf").Id]>;
200*9880d681SAndroid Build Coastguard Worker}
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Workerforeach I = [0, 1, 4, 5, 8, 9, 12, 13] in {
203*9880d681SAndroid Build Coastguard Worker  def F#I#Q  : FPR128<I, "f"#I, !cast<FPR64>("F"#!add(I, 2)#"D"),
204*9880d681SAndroid Build Coastguard Worker                     !cast<FPR64>("F"#I#"D")>;
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker// There's no store-multiple instruction for FPRs, so we're not fussy
208*9880d681SAndroid Build Coastguard Worker// about the order in which call-saved registers are allocated.
209*9880d681SAndroid Build Coastguard Workerdefm FP32  : SystemZRegClass<"FP32", [f32], 32, (sequence "F%uS", 0, 15)>;
210*9880d681SAndroid Build Coastguard Workerdefm FP64  : SystemZRegClass<"FP64", [f64], 64, (sequence "F%uD", 0, 15)>;
211*9880d681SAndroid Build Coastguard Workerdefm FP128 : SystemZRegClass<"FP128", [f128], 128,
212*9880d681SAndroid Build Coastguard Worker                             (add F0Q, F1Q, F4Q, F5Q, F8Q, F9Q, F12Q, F13Q)>;
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
215*9880d681SAndroid Build Coastguard Worker// Vector registers
216*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker// A full 128-bit vector register, with an FPR64 as its high part.
219*9880d681SAndroid Build Coastguard Workerclass VR128<bits<16> num, string n, FPR64 high>
220*9880d681SAndroid Build Coastguard Worker  : SystemZRegWithSubregs<n, [high]> {
221*9880d681SAndroid Build Coastguard Worker  let HWEncoding = num;
222*9880d681SAndroid Build Coastguard Worker  let SubRegIndices = [subreg_r64];
223*9880d681SAndroid Build Coastguard Worker}
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker// Full vector registers.
226*9880d681SAndroid Build Coastguard Workerforeach I = 0-31 in {
227*9880d681SAndroid Build Coastguard Worker  def V#I : VR128<I, "v"#I, !cast<FPR64>("F"#I#"D")>,
228*9880d681SAndroid Build Coastguard Worker            DwarfRegNum<[!cast<DwarfMapping>("F"#I#"Dwarf").Id]>;
229*9880d681SAndroid Build Coastguard Worker}
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker// Class used to store 32-bit values in the first element of a vector
232*9880d681SAndroid Build Coastguard Worker// register.  f32 scalars are used for the WLEDB and WLDEB instructions.
233*9880d681SAndroid Build Coastguard Workerdefm VR32 : SystemZRegClass<"VR32", [f32, v4i8, v2i16], 32,
234*9880d681SAndroid Build Coastguard Worker                            (add (sequence "F%uS", 0, 7),
235*9880d681SAndroid Build Coastguard Worker                                 (sequence "F%uS", 16, 31),
236*9880d681SAndroid Build Coastguard Worker                                 (sequence "F%uS", 8, 15))>;
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker// Class used to store 64-bit values in the upper half of a vector register.
239*9880d681SAndroid Build Coastguard Worker// The vector facility also includes scalar f64 instructions that operate
240*9880d681SAndroid Build Coastguard Worker// on the full vector register set.
241*9880d681SAndroid Build Coastguard Workerdefm VR64 : SystemZRegClass<"VR64", [f64, v8i8, v4i16, v2i32, v2f32], 64,
242*9880d681SAndroid Build Coastguard Worker                            (add (sequence "F%uD", 0, 7),
243*9880d681SAndroid Build Coastguard Worker                                 (sequence "F%uD", 16, 31),
244*9880d681SAndroid Build Coastguard Worker                                 (sequence "F%uD", 8, 15))>;
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker// The subset of vector registers that can be used for floating-point
247*9880d681SAndroid Build Coastguard Worker// operations too.
248*9880d681SAndroid Build Coastguard Workerdefm VF128 : SystemZRegClass<"VF128",
249*9880d681SAndroid Build Coastguard Worker                             [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 128,
250*9880d681SAndroid Build Coastguard Worker                             (sequence "V%u", 0, 15)>;
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Worker// All vector registers.
253*9880d681SAndroid Build Coastguard Workerdefm VR128 : SystemZRegClass<"VR128",
254*9880d681SAndroid Build Coastguard Worker                             [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 128,
255*9880d681SAndroid Build Coastguard Worker                             (add (sequence "V%u", 0, 7),
256*9880d681SAndroid Build Coastguard Worker                                  (sequence "V%u", 16, 31),
257*9880d681SAndroid Build Coastguard Worker                                  (sequence "V%u", 8, 15))>;
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker// Attaches a ValueType to a register operand, to make the instruction
260*9880d681SAndroid Build Coastguard Worker// definitions easier.
261*9880d681SAndroid Build Coastguard Workerclass TypedReg<ValueType vtin, RegisterOperand opin> {
262*9880d681SAndroid Build Coastguard Worker  ValueType vt = vtin;
263*9880d681SAndroid Build Coastguard Worker  RegisterOperand op = opin;
264*9880d681SAndroid Build Coastguard Worker}
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerdef v32eb   : TypedReg<f32,     VR32>;
267*9880d681SAndroid Build Coastguard Workerdef v64g    : TypedReg<i64,     VR64>;
268*9880d681SAndroid Build Coastguard Workerdef v64db   : TypedReg<f64,     VR64>;
269*9880d681SAndroid Build Coastguard Workerdef v128b   : TypedReg<v16i8,   VR128>;
270*9880d681SAndroid Build Coastguard Workerdef v128h   : TypedReg<v8i16,   VR128>;
271*9880d681SAndroid Build Coastguard Workerdef v128f   : TypedReg<v4i32,   VR128>;
272*9880d681SAndroid Build Coastguard Workerdef v128g   : TypedReg<v2i64,   VR128>;
273*9880d681SAndroid Build Coastguard Workerdef v128q   : TypedReg<v16i8,   VR128>;
274*9880d681SAndroid Build Coastguard Workerdef v128eb  : TypedReg<v4f32,   VR128>;
275*9880d681SAndroid Build Coastguard Workerdef v128db  : TypedReg<v2f64,   VR128>;
276*9880d681SAndroid Build Coastguard Workerdef v128any : TypedReg<untyped, VR128>;
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
279*9880d681SAndroid Build Coastguard Worker// Other registers
280*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Worker// The 2-bit condition code field of the PSW.  Every register named in an
283*9880d681SAndroid Build Coastguard Worker// inline asm needs a class associated with it.
284*9880d681SAndroid Build Coastguard Workerdef CC : SystemZReg<"cc">;
285*9880d681SAndroid Build Coastguard Workerlet isAllocatable = 0 in
286*9880d681SAndroid Build Coastguard Worker  def CCRegs : RegisterClass<"SystemZ", [i32], 32, (add CC)>;
287