xref: /aosp_15_r20/external/llvm/lib/Target/SystemZ/SystemZInstrFormats.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//==- SystemZInstrFormats.td - SystemZ Instruction Formats --*- 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// Basic SystemZ instruction definition
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerclass InstSystemZ<int size, dag outs, dag ins, string asmstr,
15*9880d681SAndroid Build Coastguard Worker                  list<dag> pattern> : Instruction {
16*9880d681SAndroid Build Coastguard Worker  let Namespace = "SystemZ";
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = outs;
19*9880d681SAndroid Build Coastguard Worker  dag InOperandList = ins;
20*9880d681SAndroid Build Coastguard Worker  let Size = size;
21*9880d681SAndroid Build Coastguard Worker  let Pattern = pattern;
22*9880d681SAndroid Build Coastguard Worker  let AsmString = asmstr;
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker  // Some instructions come in pairs, one having a 12-bit displacement
25*9880d681SAndroid Build Coastguard Worker  // and the other having a 20-bit displacement.  Both instructions in
26*9880d681SAndroid Build Coastguard Worker  // the pair have the same DispKey and their DispSizes are "12" and "20"
27*9880d681SAndroid Build Coastguard Worker  // respectively.
28*9880d681SAndroid Build Coastguard Worker  string DispKey = "";
29*9880d681SAndroid Build Coastguard Worker  string DispSize = "none";
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  // Many register-based <INSN>R instructions have a memory-based <INSN>
32*9880d681SAndroid Build Coastguard Worker  // counterpart.  OpKey uniquely identifies <INSN>, while OpType is
33*9880d681SAndroid Build Coastguard Worker  // "reg" for <INSN>R and "mem" for <INSN>.
34*9880d681SAndroid Build Coastguard Worker  string OpKey = "";
35*9880d681SAndroid Build Coastguard Worker  string OpType = "none";
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker  // Many distinct-operands instructions have older 2-operand equivalents.
38*9880d681SAndroid Build Coastguard Worker  // NumOpsKey uniquely identifies one of these 2-operand and 3-operand pairs,
39*9880d681SAndroid Build Coastguard Worker  // with NumOpsValue being "2" or "3" as appropriate.
40*9880d681SAndroid Build Coastguard Worker  string NumOpsKey = "";
41*9880d681SAndroid Build Coastguard Worker  string NumOpsValue = "none";
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker  // True if this instruction is a simple D(X,B) load of a register
44*9880d681SAndroid Build Coastguard Worker  // (with no sign or zero extension).
45*9880d681SAndroid Build Coastguard Worker  bit SimpleBDXLoad = 0;
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker  // True if this instruction is a simple D(X,B) store of a register
48*9880d681SAndroid Build Coastguard Worker  // (with no truncation).
49*9880d681SAndroid Build Coastguard Worker  bit SimpleBDXStore = 0;
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker  // True if this instruction has a 20-bit displacement field.
52*9880d681SAndroid Build Coastguard Worker  bit Has20BitOffset = 0;
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker  // True if addresses in this instruction have an index register.
55*9880d681SAndroid Build Coastguard Worker  bit HasIndex = 0;
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker  // True if this is a 128-bit pseudo instruction that combines two 64-bit
58*9880d681SAndroid Build Coastguard Worker  // operations.
59*9880d681SAndroid Build Coastguard Worker  bit Is128Bit = 0;
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker  // The access size of all memory operands in bytes, or 0 if not known.
62*9880d681SAndroid Build Coastguard Worker  bits<5> AccessBytes = 0;
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker  // If the instruction sets CC to a useful value, this gives the mask
65*9880d681SAndroid Build Coastguard Worker  // of all possible CC results.  The mask has the same form as
66*9880d681SAndroid Build Coastguard Worker  // SystemZ::CCMASK_*.
67*9880d681SAndroid Build Coastguard Worker  bits<4> CCValues = 0;
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker  // The subset of CCValues that have the same meaning as they would after
70*9880d681SAndroid Build Coastguard Worker  // a comparison of the first operand against zero.
71*9880d681SAndroid Build Coastguard Worker  bits<4> CompareZeroCCMask = 0;
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker  // True if the instruction is conditional and if the CC mask operand
74*9880d681SAndroid Build Coastguard Worker  // comes first (as for BRC, etc.).
75*9880d681SAndroid Build Coastguard Worker  bit CCMaskFirst = 0;
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker  // Similar, but true if the CC mask operand comes last (as for LOC, etc.).
78*9880d681SAndroid Build Coastguard Worker  bit CCMaskLast = 0;
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker  // True if the instruction is the "logical" rather than "arithmetic" form,
81*9880d681SAndroid Build Coastguard Worker  // in cases where a distinction exists.
82*9880d681SAndroid Build Coastguard Worker  bit IsLogical = 0;
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  let TSFlags{0}     = SimpleBDXLoad;
85*9880d681SAndroid Build Coastguard Worker  let TSFlags{1}     = SimpleBDXStore;
86*9880d681SAndroid Build Coastguard Worker  let TSFlags{2}     = Has20BitOffset;
87*9880d681SAndroid Build Coastguard Worker  let TSFlags{3}     = HasIndex;
88*9880d681SAndroid Build Coastguard Worker  let TSFlags{4}     = Is128Bit;
89*9880d681SAndroid Build Coastguard Worker  let TSFlags{9-5}   = AccessBytes;
90*9880d681SAndroid Build Coastguard Worker  let TSFlags{13-10} = CCValues;
91*9880d681SAndroid Build Coastguard Worker  let TSFlags{17-14} = CompareZeroCCMask;
92*9880d681SAndroid Build Coastguard Worker  let TSFlags{18}    = CCMaskFirst;
93*9880d681SAndroid Build Coastguard Worker  let TSFlags{19}    = CCMaskLast;
94*9880d681SAndroid Build Coastguard Worker  let TSFlags{20}    = IsLogical;
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
98*9880d681SAndroid Build Coastguard Worker// Mappings between instructions
99*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker// Return the version of an instruction that has an unsigned 12-bit
102*9880d681SAndroid Build Coastguard Worker// displacement.
103*9880d681SAndroid Build Coastguard Workerdef getDisp12Opcode : InstrMapping {
104*9880d681SAndroid Build Coastguard Worker  let FilterClass = "InstSystemZ";
105*9880d681SAndroid Build Coastguard Worker  let RowFields = ["DispKey"];
106*9880d681SAndroid Build Coastguard Worker  let ColFields = ["DispSize"];
107*9880d681SAndroid Build Coastguard Worker  let KeyCol = ["20"];
108*9880d681SAndroid Build Coastguard Worker  let ValueCols = [["12"]];
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker// Return the version of an instruction that has a signed 20-bit displacement.
112*9880d681SAndroid Build Coastguard Workerdef getDisp20Opcode : InstrMapping {
113*9880d681SAndroid Build Coastguard Worker  let FilterClass = "InstSystemZ";
114*9880d681SAndroid Build Coastguard Worker  let RowFields = ["DispKey"];
115*9880d681SAndroid Build Coastguard Worker  let ColFields = ["DispSize"];
116*9880d681SAndroid Build Coastguard Worker  let KeyCol = ["12"];
117*9880d681SAndroid Build Coastguard Worker  let ValueCols = [["20"]];
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker// Return the memory form of a register instruction.
121*9880d681SAndroid Build Coastguard Workerdef getMemOpcode : InstrMapping {
122*9880d681SAndroid Build Coastguard Worker  let FilterClass = "InstSystemZ";
123*9880d681SAndroid Build Coastguard Worker  let RowFields = ["OpKey"];
124*9880d681SAndroid Build Coastguard Worker  let ColFields = ["OpType"];
125*9880d681SAndroid Build Coastguard Worker  let KeyCol = ["reg"];
126*9880d681SAndroid Build Coastguard Worker  let ValueCols = [["mem"]];
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker// Return the 3-operand form of a 2-operand instruction.
130*9880d681SAndroid Build Coastguard Workerdef getThreeOperandOpcode : InstrMapping {
131*9880d681SAndroid Build Coastguard Worker  let FilterClass = "InstSystemZ";
132*9880d681SAndroid Build Coastguard Worker  let RowFields = ["NumOpsKey"];
133*9880d681SAndroid Build Coastguard Worker  let ColFields = ["NumOpsValue"];
134*9880d681SAndroid Build Coastguard Worker  let KeyCol = ["2"];
135*9880d681SAndroid Build Coastguard Worker  let ValueCols = [["3"]];
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
139*9880d681SAndroid Build Coastguard Worker// Instruction formats
140*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
141*9880d681SAndroid Build Coastguard Worker//
142*9880d681SAndroid Build Coastguard Worker// Formats are specified using operand field declarations of the form:
143*9880d681SAndroid Build Coastguard Worker//
144*9880d681SAndroid Build Coastguard Worker//   bits<4> Rn   : register input or output for operand n
145*9880d681SAndroid Build Coastguard Worker//   bits<5> Vn   : vector register input or output for operand n
146*9880d681SAndroid Build Coastguard Worker//   bits<m> In   : immediate value of width m for operand n
147*9880d681SAndroid Build Coastguard Worker//   bits<4> BDn  : address operand n, which has a base and a displacement
148*9880d681SAndroid Build Coastguard Worker//   bits<m> XBDn : address operand n, which has an index, a base and a
149*9880d681SAndroid Build Coastguard Worker//                  displacement
150*9880d681SAndroid Build Coastguard Worker//   bits<m> VBDn : address operand n, which has a vector index, a base and a
151*9880d681SAndroid Build Coastguard Worker//                  displacement
152*9880d681SAndroid Build Coastguard Worker//   bits<4> Xn   : index register for address operand n
153*9880d681SAndroid Build Coastguard Worker//   bits<4> Mn   : mode value for operand n
154*9880d681SAndroid Build Coastguard Worker//
155*9880d681SAndroid Build Coastguard Worker// The operand numbers ("n" in the list above) follow the architecture manual.
156*9880d681SAndroid Build Coastguard Worker// Assembly operands sometimes have a different order; in particular, R3 often
157*9880d681SAndroid Build Coastguard Worker// is often written between operands 1 and 2.
158*9880d681SAndroid Build Coastguard Worker//
159*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerclass InstI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
162*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<2, outs, ins, asmstr, pattern> {
163*9880d681SAndroid Build Coastguard Worker  field bits<16> Inst;
164*9880d681SAndroid Build Coastguard Worker  field bits<16> SoftFail = 0;
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker  bits<8> I1;
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker  let Inst{15-8} = op;
169*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}  = I1;
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerclass InstRI<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
173*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<4, outs, ins, asmstr, pattern> {
174*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
175*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
178*9880d681SAndroid Build Coastguard Worker  bits<16> I2;
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker  let Inst{31-24} = op{11-4};
181*9880d681SAndroid Build Coastguard Worker  let Inst{23-20} = R1;
182*9880d681SAndroid Build Coastguard Worker  let Inst{19-16} = op{3-0};
183*9880d681SAndroid Build Coastguard Worker  let Inst{15-0}  = I2;
184*9880d681SAndroid Build Coastguard Worker}
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerclass InstRIEa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
187*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
188*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
189*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
192*9880d681SAndroid Build Coastguard Worker  bits<16> I2;
193*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
196*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
197*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = 0;
198*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = I2;
199*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M3;
200*9880d681SAndroid Build Coastguard Worker  let Inst{11-8}  = 0;
201*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Workerclass InstRIEb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
205*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
206*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
207*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
210*9880d681SAndroid Build Coastguard Worker  bits<4> R2;
211*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
212*9880d681SAndroid Build Coastguard Worker  bits<16> RI4;
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
215*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
216*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = R2;
217*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = RI4;
218*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M3;
219*9880d681SAndroid Build Coastguard Worker  let Inst{11-8}  = 0;
220*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerclass InstRIEc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
224*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
225*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
226*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
229*9880d681SAndroid Build Coastguard Worker  bits<8> I2;
230*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
231*9880d681SAndroid Build Coastguard Worker  bits<16> RI4;
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
234*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
235*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = M3;
236*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = RI4;
237*9880d681SAndroid Build Coastguard Worker  let Inst{15-8}  = I2;
238*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
239*9880d681SAndroid Build Coastguard Worker}
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Workerclass InstRIEd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
242*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
243*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
244*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
247*9880d681SAndroid Build Coastguard Worker  bits<4> R3;
248*9880d681SAndroid Build Coastguard Worker  bits<16> I2;
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
251*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
252*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = R3;
253*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = I2;
254*9880d681SAndroid Build Coastguard Worker  let Inst{15-8}  = 0;
255*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
256*9880d681SAndroid Build Coastguard Worker}
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Workerclass InstRIEf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
259*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
260*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
261*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
264*9880d681SAndroid Build Coastguard Worker  bits<4> R2;
265*9880d681SAndroid Build Coastguard Worker  bits<8> I3;
266*9880d681SAndroid Build Coastguard Worker  bits<8> I4;
267*9880d681SAndroid Build Coastguard Worker  bits<8> I5;
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
270*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
271*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = R2;
272*9880d681SAndroid Build Coastguard Worker  let Inst{31-24} = I3;
273*9880d681SAndroid Build Coastguard Worker  let Inst{23-16} = I4;
274*9880d681SAndroid Build Coastguard Worker  let Inst{15-8}  = I5;
275*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
276*9880d681SAndroid Build Coastguard Worker}
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Workerclass InstRIL<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
279*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
280*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
281*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
284*9880d681SAndroid Build Coastguard Worker  bits<32> I2;
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{11-4};
287*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
288*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = op{3-0};
289*9880d681SAndroid Build Coastguard Worker  let Inst{31-0}  = I2;
290*9880d681SAndroid Build Coastguard Worker}
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Workerclass InstRIS<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
293*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
294*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
295*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
298*9880d681SAndroid Build Coastguard Worker  bits<8> I2;
299*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
300*9880d681SAndroid Build Coastguard Worker  bits<16> BD4;
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
303*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
304*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = M3;
305*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = BD4;
306*9880d681SAndroid Build Coastguard Worker  let Inst{15-8}  = I2;
307*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
308*9880d681SAndroid Build Coastguard Worker}
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Workerclass InstRR<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
311*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<2, outs, ins, asmstr, pattern> {
312*9880d681SAndroid Build Coastguard Worker  field bits<16> Inst;
313*9880d681SAndroid Build Coastguard Worker  field bits<16> SoftFail = 0;
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
316*9880d681SAndroid Build Coastguard Worker  bits<4> R2;
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker  let Inst{15-8} = op;
319*9880d681SAndroid Build Coastguard Worker  let Inst{7-4}  = R1;
320*9880d681SAndroid Build Coastguard Worker  let Inst{3-0}  = R2;
321*9880d681SAndroid Build Coastguard Worker}
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Workerclass InstRRD<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
324*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<4, outs, ins, asmstr, pattern> {
325*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
326*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
327*9880d681SAndroid Build Coastguard Worker
328*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
329*9880d681SAndroid Build Coastguard Worker  bits<4> R3;
330*9880d681SAndroid Build Coastguard Worker  bits<4> R2;
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = op;
333*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = R1;
334*9880d681SAndroid Build Coastguard Worker  let Inst{11-8}  = 0;
335*9880d681SAndroid Build Coastguard Worker  let Inst{7-4}   = R3;
336*9880d681SAndroid Build Coastguard Worker  let Inst{3-0}   = R2;
337*9880d681SAndroid Build Coastguard Worker}
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Workerclass InstRRE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
340*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<4, outs, ins, asmstr, pattern> {
341*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
342*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
345*9880d681SAndroid Build Coastguard Worker  bits<4> R2;
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = op;
348*9880d681SAndroid Build Coastguard Worker  let Inst{15-8}  = 0;
349*9880d681SAndroid Build Coastguard Worker  let Inst{7-4}   = R1;
350*9880d681SAndroid Build Coastguard Worker  let Inst{3-0}   = R2;
351*9880d681SAndroid Build Coastguard Worker}
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Workerclass InstRRF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
354*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<4, outs, ins, asmstr, pattern> {
355*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
356*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
359*9880d681SAndroid Build Coastguard Worker  bits<4> R2;
360*9880d681SAndroid Build Coastguard Worker  bits<4> R3;
361*9880d681SAndroid Build Coastguard Worker  bits<4> R4;
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = op;
364*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = R3;
365*9880d681SAndroid Build Coastguard Worker  let Inst{11-8}  = R4;
366*9880d681SAndroid Build Coastguard Worker  let Inst{7-4}   = R1;
367*9880d681SAndroid Build Coastguard Worker  let Inst{3-0}   = R2;
368*9880d681SAndroid Build Coastguard Worker}
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Workerclass InstRRFc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
371*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<4, outs, ins, asmstr, pattern> {
372*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
373*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
376*9880d681SAndroid Build Coastguard Worker  bits<4> R2;
377*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
378*9880d681SAndroid Build Coastguard Worker
379*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = op;
380*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M3;
381*9880d681SAndroid Build Coastguard Worker  let Inst{11-8}  = 0;
382*9880d681SAndroid Build Coastguard Worker  let Inst{7-4}   = R1;
383*9880d681SAndroid Build Coastguard Worker  let Inst{3-0}   = R2;
384*9880d681SAndroid Build Coastguard Worker}
385*9880d681SAndroid Build Coastguard Worker
386*9880d681SAndroid Build Coastguard Workerclass InstRRS<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
387*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
388*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
389*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
392*9880d681SAndroid Build Coastguard Worker  bits<4> R2;
393*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
394*9880d681SAndroid Build Coastguard Worker  bits<16> BD4;
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
397*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
398*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = R2;
399*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = BD4;
400*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M3;
401*9880d681SAndroid Build Coastguard Worker  let Inst{11-8}  = 0;
402*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
403*9880d681SAndroid Build Coastguard Worker}
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Workerclass InstRX<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
406*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<4, outs, ins, asmstr, pattern> {
407*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
408*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
409*9880d681SAndroid Build Coastguard Worker
410*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
411*9880d681SAndroid Build Coastguard Worker  bits<20> XBD2;
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker  let Inst{31-24} = op;
414*9880d681SAndroid Build Coastguard Worker  let Inst{23-20} = R1;
415*9880d681SAndroid Build Coastguard Worker  let Inst{19-0}  = XBD2;
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard Worker  let HasIndex = 1;
418*9880d681SAndroid Build Coastguard Worker}
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Workerclass InstRXE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
421*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
422*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
423*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
426*9880d681SAndroid Build Coastguard Worker  bits<20> XBD2;
427*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
430*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
431*9880d681SAndroid Build Coastguard Worker  let Inst{35-16} = XBD2;
432*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M3;
433*9880d681SAndroid Build Coastguard Worker  let Inst{11-8}  = 0;
434*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
435*9880d681SAndroid Build Coastguard Worker
436*9880d681SAndroid Build Coastguard Worker  let HasIndex = 1;
437*9880d681SAndroid Build Coastguard Worker}
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Workerclass InstRXF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
440*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
441*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
442*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
445*9880d681SAndroid Build Coastguard Worker  bits<4> R3;
446*9880d681SAndroid Build Coastguard Worker  bits<20> XBD2;
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
449*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R3;
450*9880d681SAndroid Build Coastguard Worker  let Inst{35-16} = XBD2;
451*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = R1;
452*9880d681SAndroid Build Coastguard Worker  let Inst{11-8}  = 0;
453*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Worker  let HasIndex = 1;
456*9880d681SAndroid Build Coastguard Worker}
457*9880d681SAndroid Build Coastguard Worker
458*9880d681SAndroid Build Coastguard Workerclass InstRXY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
459*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
460*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
461*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
462*9880d681SAndroid Build Coastguard Worker
463*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
464*9880d681SAndroid Build Coastguard Worker  bits<28> XBD2;
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
467*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
468*9880d681SAndroid Build Coastguard Worker  let Inst{35-8}  = XBD2;
469*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
470*9880d681SAndroid Build Coastguard Worker
471*9880d681SAndroid Build Coastguard Worker  let Has20BitOffset = 1;
472*9880d681SAndroid Build Coastguard Worker  let HasIndex = 1;
473*9880d681SAndroid Build Coastguard Worker}
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Workerclass InstRS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
476*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<4, outs, ins, asmstr, pattern> {
477*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
478*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
481*9880d681SAndroid Build Coastguard Worker  bits<4> R3;
482*9880d681SAndroid Build Coastguard Worker  bits<16> BD2;
483*9880d681SAndroid Build Coastguard Worker
484*9880d681SAndroid Build Coastguard Worker  let Inst{31-24} = op;
485*9880d681SAndroid Build Coastguard Worker  let Inst{23-20} = R1;
486*9880d681SAndroid Build Coastguard Worker  let Inst{19-16} = R3;
487*9880d681SAndroid Build Coastguard Worker  let Inst{15-0}  = BD2;
488*9880d681SAndroid Build Coastguard Worker}
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Workerclass InstRSY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
491*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
492*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
493*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
496*9880d681SAndroid Build Coastguard Worker  bits<4> R3;
497*9880d681SAndroid Build Coastguard Worker  bits<24> BD2;
498*9880d681SAndroid Build Coastguard Worker
499*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
500*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
501*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = R3;
502*9880d681SAndroid Build Coastguard Worker  let Inst{31-8}  = BD2;
503*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard Worker  let Has20BitOffset = 1;
506*9880d681SAndroid Build Coastguard Worker}
507*9880d681SAndroid Build Coastguard Worker
508*9880d681SAndroid Build Coastguard Workerclass InstSI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
509*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<4, outs, ins, asmstr, pattern> {
510*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
511*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker  bits<16> BD1;
514*9880d681SAndroid Build Coastguard Worker  bits<8> I2;
515*9880d681SAndroid Build Coastguard Worker
516*9880d681SAndroid Build Coastguard Worker  let Inst{31-24} = op;
517*9880d681SAndroid Build Coastguard Worker  let Inst{23-16} = I2;
518*9880d681SAndroid Build Coastguard Worker  let Inst{15-0}  = BD1;
519*9880d681SAndroid Build Coastguard Worker}
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Workerclass InstSIL<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
522*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
523*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
524*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
525*9880d681SAndroid Build Coastguard Worker
526*9880d681SAndroid Build Coastguard Worker  bits<16> BD1;
527*9880d681SAndroid Build Coastguard Worker  bits<16> I2;
528*9880d681SAndroid Build Coastguard Worker
529*9880d681SAndroid Build Coastguard Worker  let Inst{47-32} = op;
530*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = BD1;
531*9880d681SAndroid Build Coastguard Worker  let Inst{15-0}  = I2;
532*9880d681SAndroid Build Coastguard Worker}
533*9880d681SAndroid Build Coastguard Worker
534*9880d681SAndroid Build Coastguard Workerclass InstSIY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
535*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
536*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
537*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Worker  bits<24> BD1;
540*9880d681SAndroid Build Coastguard Worker  bits<8> I2;
541*9880d681SAndroid Build Coastguard Worker
542*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
543*9880d681SAndroid Build Coastguard Worker  let Inst{39-32} = I2;
544*9880d681SAndroid Build Coastguard Worker  let Inst{31-8}  = BD1;
545*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
546*9880d681SAndroid Build Coastguard Worker
547*9880d681SAndroid Build Coastguard Worker  let Has20BitOffset = 1;
548*9880d681SAndroid Build Coastguard Worker}
549*9880d681SAndroid Build Coastguard Worker
550*9880d681SAndroid Build Coastguard Workerclass InstSS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
551*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
552*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
553*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
554*9880d681SAndroid Build Coastguard Worker
555*9880d681SAndroid Build Coastguard Worker  bits<24> BDL1;
556*9880d681SAndroid Build Coastguard Worker  bits<16> BD2;
557*9880d681SAndroid Build Coastguard Worker
558*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op;
559*9880d681SAndroid Build Coastguard Worker  let Inst{39-16} = BDL1;
560*9880d681SAndroid Build Coastguard Worker  let Inst{15-0}  = BD2;
561*9880d681SAndroid Build Coastguard Worker}
562*9880d681SAndroid Build Coastguard Worker
563*9880d681SAndroid Build Coastguard Workerclass InstS<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
564*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<4, outs, ins, asmstr, pattern> {
565*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
566*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
567*9880d681SAndroid Build Coastguard Worker
568*9880d681SAndroid Build Coastguard Worker  bits<16> BD2;
569*9880d681SAndroid Build Coastguard Worker
570*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = op;
571*9880d681SAndroid Build Coastguard Worker  let Inst{15-0}  = BD2;
572*9880d681SAndroid Build Coastguard Worker}
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Workerclass InstVRIa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
575*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
576*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
577*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
580*9880d681SAndroid Build Coastguard Worker  bits<16> I2;
581*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
582*9880d681SAndroid Build Coastguard Worker
583*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
584*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
585*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = 0;
586*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = I2;
587*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M3;
588*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
589*9880d681SAndroid Build Coastguard Worker  let Inst{10-8}  = 0;
590*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
591*9880d681SAndroid Build Coastguard Worker}
592*9880d681SAndroid Build Coastguard Worker
593*9880d681SAndroid Build Coastguard Workerclass InstVRIb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
594*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
595*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
596*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
597*9880d681SAndroid Build Coastguard Worker
598*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
599*9880d681SAndroid Build Coastguard Worker  bits<8> I2;
600*9880d681SAndroid Build Coastguard Worker  bits<8> I3;
601*9880d681SAndroid Build Coastguard Worker  bits<4> M4;
602*9880d681SAndroid Build Coastguard Worker
603*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
604*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
605*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = 0;
606*9880d681SAndroid Build Coastguard Worker  let Inst{31-24} = I2;
607*9880d681SAndroid Build Coastguard Worker  let Inst{23-16} = I3;
608*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M4;
609*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
610*9880d681SAndroid Build Coastguard Worker  let Inst{10-8}  = 0;
611*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
612*9880d681SAndroid Build Coastguard Worker}
613*9880d681SAndroid Build Coastguard Worker
614*9880d681SAndroid Build Coastguard Workerclass InstVRIc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
615*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
616*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
617*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
618*9880d681SAndroid Build Coastguard Worker
619*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
620*9880d681SAndroid Build Coastguard Worker  bits<5> V3;
621*9880d681SAndroid Build Coastguard Worker  bits<16> I2;
622*9880d681SAndroid Build Coastguard Worker  bits<4> M4;
623*9880d681SAndroid Build Coastguard Worker
624*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
625*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
626*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = V3{3-0};
627*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = I2;
628*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M4;
629*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
630*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = V3{4};
631*9880d681SAndroid Build Coastguard Worker  let Inst{9-8}   = 0;
632*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
633*9880d681SAndroid Build Coastguard Worker}
634*9880d681SAndroid Build Coastguard Worker
635*9880d681SAndroid Build Coastguard Workerclass InstVRId<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
636*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
637*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
638*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
639*9880d681SAndroid Build Coastguard Worker
640*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
641*9880d681SAndroid Build Coastguard Worker  bits<5> V2;
642*9880d681SAndroid Build Coastguard Worker  bits<5> V3;
643*9880d681SAndroid Build Coastguard Worker  bits<8> I4;
644*9880d681SAndroid Build Coastguard Worker  bits<4> M5;
645*9880d681SAndroid Build Coastguard Worker
646*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
647*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
648*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = V2{3-0};
649*9880d681SAndroid Build Coastguard Worker  let Inst{31-28} = V3{3-0};
650*9880d681SAndroid Build Coastguard Worker  let Inst{27-24} = 0;
651*9880d681SAndroid Build Coastguard Worker  let Inst{23-16} = I4;
652*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M5;
653*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
654*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = V2{4};
655*9880d681SAndroid Build Coastguard Worker  let Inst{9}     = V3{4};
656*9880d681SAndroid Build Coastguard Worker  let Inst{8}     = 0;
657*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
658*9880d681SAndroid Build Coastguard Worker}
659*9880d681SAndroid Build Coastguard Worker
660*9880d681SAndroid Build Coastguard Workerclass InstVRIe<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
661*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
662*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
663*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
664*9880d681SAndroid Build Coastguard Worker
665*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
666*9880d681SAndroid Build Coastguard Worker  bits<5> V2;
667*9880d681SAndroid Build Coastguard Worker  bits<12> I3;
668*9880d681SAndroid Build Coastguard Worker  bits<4> M4;
669*9880d681SAndroid Build Coastguard Worker  bits<4> M5;
670*9880d681SAndroid Build Coastguard Worker
671*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
672*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
673*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = V2{3-0};
674*9880d681SAndroid Build Coastguard Worker  let Inst{31-20} = I3;
675*9880d681SAndroid Build Coastguard Worker  let Inst{19-16} = M5;
676*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M4;
677*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
678*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = V2{4};
679*9880d681SAndroid Build Coastguard Worker  let Inst{9-8}   = 0;
680*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
681*9880d681SAndroid Build Coastguard Worker}
682*9880d681SAndroid Build Coastguard Worker
683*9880d681SAndroid Build Coastguard Worker// Depending on the instruction mnemonic, certain bits may be or-ed into
684*9880d681SAndroid Build Coastguard Worker// the M4 value provided as explicit operand.  These are passed as m4or.
685*9880d681SAndroid Build Coastguard Workerclass InstVRRa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern,
686*9880d681SAndroid Build Coastguard Worker               bits<4> m4or = 0>
687*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
688*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
689*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
690*9880d681SAndroid Build Coastguard Worker
691*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
692*9880d681SAndroid Build Coastguard Worker  bits<5> V2;
693*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
694*9880d681SAndroid Build Coastguard Worker  bits<4> M4;
695*9880d681SAndroid Build Coastguard Worker  bits<4> M5;
696*9880d681SAndroid Build Coastguard Worker
697*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
698*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
699*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = V2{3-0};
700*9880d681SAndroid Build Coastguard Worker  let Inst{31-24} = 0;
701*9880d681SAndroid Build Coastguard Worker  let Inst{23-20} = M5;
702*9880d681SAndroid Build Coastguard Worker  let Inst{19}    = !if (!eq (m4or{3}, 1), 1, M4{3});
703*9880d681SAndroid Build Coastguard Worker  let Inst{18}    = !if (!eq (m4or{2}, 1), 1, M4{2});
704*9880d681SAndroid Build Coastguard Worker  let Inst{17}    = !if (!eq (m4or{1}, 1), 1, M4{1});
705*9880d681SAndroid Build Coastguard Worker  let Inst{16}    = !if (!eq (m4or{0}, 1), 1, M4{0});
706*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M3;
707*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
708*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = V2{4};
709*9880d681SAndroid Build Coastguard Worker  let Inst{9-8}   = 0;
710*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
711*9880d681SAndroid Build Coastguard Worker}
712*9880d681SAndroid Build Coastguard Worker
713*9880d681SAndroid Build Coastguard Worker// Depending on the instruction mnemonic, certain bits may be or-ed into
714*9880d681SAndroid Build Coastguard Worker// the M5 value provided as explicit operand.  These are passed as m5or.
715*9880d681SAndroid Build Coastguard Workerclass InstVRRb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern,
716*9880d681SAndroid Build Coastguard Worker               bits<4> m5or = 0>
717*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
718*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
719*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
720*9880d681SAndroid Build Coastguard Worker
721*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
722*9880d681SAndroid Build Coastguard Worker  bits<5> V2;
723*9880d681SAndroid Build Coastguard Worker  bits<5> V3;
724*9880d681SAndroid Build Coastguard Worker  bits<4> M4;
725*9880d681SAndroid Build Coastguard Worker  bits<4> M5;
726*9880d681SAndroid Build Coastguard Worker
727*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
728*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
729*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = V2{3-0};
730*9880d681SAndroid Build Coastguard Worker  let Inst{31-28} = V3{3-0};
731*9880d681SAndroid Build Coastguard Worker  let Inst{27-24} = 0;
732*9880d681SAndroid Build Coastguard Worker  let Inst{23}    = !if (!eq (m5or{3}, 1), 1, M5{3});
733*9880d681SAndroid Build Coastguard Worker  let Inst{22}    = !if (!eq (m5or{2}, 1), 1, M5{2});
734*9880d681SAndroid Build Coastguard Worker  let Inst{21}    = !if (!eq (m5or{1}, 1), 1, M5{1});
735*9880d681SAndroid Build Coastguard Worker  let Inst{20}    = !if (!eq (m5or{0}, 1), 1, M5{0});
736*9880d681SAndroid Build Coastguard Worker  let Inst{19-16} = 0;
737*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M4;
738*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
739*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = V2{4};
740*9880d681SAndroid Build Coastguard Worker  let Inst{9}     = V3{4};
741*9880d681SAndroid Build Coastguard Worker  let Inst{8}     = 0;
742*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
743*9880d681SAndroid Build Coastguard Worker}
744*9880d681SAndroid Build Coastguard Worker
745*9880d681SAndroid Build Coastguard Workerclass InstVRRc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
746*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
747*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
748*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
749*9880d681SAndroid Build Coastguard Worker
750*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
751*9880d681SAndroid Build Coastguard Worker  bits<5> V2;
752*9880d681SAndroid Build Coastguard Worker  bits<5> V3;
753*9880d681SAndroid Build Coastguard Worker  bits<4> M4;
754*9880d681SAndroid Build Coastguard Worker  bits<4> M5;
755*9880d681SAndroid Build Coastguard Worker  bits<4> M6;
756*9880d681SAndroid Build Coastguard Worker
757*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
758*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
759*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = V2{3-0};
760*9880d681SAndroid Build Coastguard Worker  let Inst{31-28} = V3{3-0};
761*9880d681SAndroid Build Coastguard Worker  let Inst{27-24} = 0;
762*9880d681SAndroid Build Coastguard Worker  let Inst{23-20} = M6;
763*9880d681SAndroid Build Coastguard Worker  let Inst{19-16} = M5;
764*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M4;
765*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
766*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = V2{4};
767*9880d681SAndroid Build Coastguard Worker  let Inst{9}     = V3{4};
768*9880d681SAndroid Build Coastguard Worker  let Inst{8}     = 0;
769*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
770*9880d681SAndroid Build Coastguard Worker}
771*9880d681SAndroid Build Coastguard Worker
772*9880d681SAndroid Build Coastguard Worker// Depending on the instruction mnemonic, certain bits may be or-ed into
773*9880d681SAndroid Build Coastguard Worker// the M6 value provided as explicit operand.  These are passed as m6or.
774*9880d681SAndroid Build Coastguard Workerclass InstVRRd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern,
775*9880d681SAndroid Build Coastguard Worker               bits<4> m6or = 0>
776*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
777*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
778*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
779*9880d681SAndroid Build Coastguard Worker
780*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
781*9880d681SAndroid Build Coastguard Worker  bits<5> V2;
782*9880d681SAndroid Build Coastguard Worker  bits<5> V3;
783*9880d681SAndroid Build Coastguard Worker  bits<5> V4;
784*9880d681SAndroid Build Coastguard Worker  bits<4> M5;
785*9880d681SAndroid Build Coastguard Worker  bits<4> M6;
786*9880d681SAndroid Build Coastguard Worker
787*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
788*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
789*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = V2{3-0};
790*9880d681SAndroid Build Coastguard Worker  let Inst{31-28} = V3{3-0};
791*9880d681SAndroid Build Coastguard Worker  let Inst{27-24} = M5;
792*9880d681SAndroid Build Coastguard Worker  let Inst{23}    = !if (!eq (m6or{3}, 1), 1, M6{3});
793*9880d681SAndroid Build Coastguard Worker  let Inst{22}    = !if (!eq (m6or{2}, 1), 1, M6{2});
794*9880d681SAndroid Build Coastguard Worker  let Inst{21}    = !if (!eq (m6or{1}, 1), 1, M6{1});
795*9880d681SAndroid Build Coastguard Worker  let Inst{20}    = !if (!eq (m6or{0}, 1), 1, M6{0});
796*9880d681SAndroid Build Coastguard Worker  let Inst{19-16} = 0;
797*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = V4{3-0};
798*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
799*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = V2{4};
800*9880d681SAndroid Build Coastguard Worker  let Inst{9}     = V3{4};
801*9880d681SAndroid Build Coastguard Worker  let Inst{8}     = V4{4};
802*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
803*9880d681SAndroid Build Coastguard Worker}
804*9880d681SAndroid Build Coastguard Worker
805*9880d681SAndroid Build Coastguard Workerclass InstVRRe<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
806*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
807*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
808*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
809*9880d681SAndroid Build Coastguard Worker
810*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
811*9880d681SAndroid Build Coastguard Worker  bits<5> V2;
812*9880d681SAndroid Build Coastguard Worker  bits<5> V3;
813*9880d681SAndroid Build Coastguard Worker  bits<5> V4;
814*9880d681SAndroid Build Coastguard Worker  bits<4> M5;
815*9880d681SAndroid Build Coastguard Worker  bits<4> M6;
816*9880d681SAndroid Build Coastguard Worker
817*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
818*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
819*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = V2{3-0};
820*9880d681SAndroid Build Coastguard Worker  let Inst{31-28} = V3{3-0};
821*9880d681SAndroid Build Coastguard Worker  let Inst{27-24} = M6;
822*9880d681SAndroid Build Coastguard Worker  let Inst{23-20} = 0;
823*9880d681SAndroid Build Coastguard Worker  let Inst{19-16} = M5;
824*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = V4{3-0};
825*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
826*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = V2{4};
827*9880d681SAndroid Build Coastguard Worker  let Inst{9}     = V3{4};
828*9880d681SAndroid Build Coastguard Worker  let Inst{8}     = V4{4};
829*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
830*9880d681SAndroid Build Coastguard Worker}
831*9880d681SAndroid Build Coastguard Worker
832*9880d681SAndroid Build Coastguard Workerclass InstVRRf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
833*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
834*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
835*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
836*9880d681SAndroid Build Coastguard Worker
837*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
838*9880d681SAndroid Build Coastguard Worker  bits<4> R2;
839*9880d681SAndroid Build Coastguard Worker  bits<4> R3;
840*9880d681SAndroid Build Coastguard Worker
841*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
842*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
843*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = R2;
844*9880d681SAndroid Build Coastguard Worker  let Inst{31-28} = R3;
845*9880d681SAndroid Build Coastguard Worker  let Inst{27-12} = 0;
846*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
847*9880d681SAndroid Build Coastguard Worker  let Inst{10-8}  = 0;
848*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
849*9880d681SAndroid Build Coastguard Worker}
850*9880d681SAndroid Build Coastguard Worker
851*9880d681SAndroid Build Coastguard Workerclass InstVRSa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
852*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
853*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
854*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
855*9880d681SAndroid Build Coastguard Worker
856*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
857*9880d681SAndroid Build Coastguard Worker  bits<16> BD2;
858*9880d681SAndroid Build Coastguard Worker  bits<5> V3;
859*9880d681SAndroid Build Coastguard Worker  bits<4> M4;
860*9880d681SAndroid Build Coastguard Worker
861*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
862*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
863*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = V3{3-0};
864*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = BD2;
865*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M4;
866*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
867*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = V3{4};
868*9880d681SAndroid Build Coastguard Worker  let Inst{9-8}   = 0;
869*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
870*9880d681SAndroid Build Coastguard Worker}
871*9880d681SAndroid Build Coastguard Worker
872*9880d681SAndroid Build Coastguard Workerclass InstVRSb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
873*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
874*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
875*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
876*9880d681SAndroid Build Coastguard Worker
877*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
878*9880d681SAndroid Build Coastguard Worker  bits<16> BD2;
879*9880d681SAndroid Build Coastguard Worker  bits<4> R3;
880*9880d681SAndroid Build Coastguard Worker  bits<4> M4;
881*9880d681SAndroid Build Coastguard Worker
882*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
883*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
884*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = R3;
885*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = BD2;
886*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M4;
887*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
888*9880d681SAndroid Build Coastguard Worker  let Inst{10-8}  = 0;
889*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
890*9880d681SAndroid Build Coastguard Worker}
891*9880d681SAndroid Build Coastguard Worker
892*9880d681SAndroid Build Coastguard Workerclass InstVRSc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
893*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
894*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
895*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
896*9880d681SAndroid Build Coastguard Worker
897*9880d681SAndroid Build Coastguard Worker  bits<4> R1;
898*9880d681SAndroid Build Coastguard Worker  bits<16> BD2;
899*9880d681SAndroid Build Coastguard Worker  bits<5> V3;
900*9880d681SAndroid Build Coastguard Worker  bits<4> M4;
901*9880d681SAndroid Build Coastguard Worker
902*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
903*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = R1;
904*9880d681SAndroid Build Coastguard Worker  let Inst{35-32} = V3{3-0};
905*9880d681SAndroid Build Coastguard Worker  let Inst{31-16} = BD2;
906*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M4;
907*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = 0;
908*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = V3{4};
909*9880d681SAndroid Build Coastguard Worker  let Inst{9-8}   = 0;
910*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
911*9880d681SAndroid Build Coastguard Worker}
912*9880d681SAndroid Build Coastguard Worker
913*9880d681SAndroid Build Coastguard Workerclass InstVRV<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
914*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
915*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
916*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
917*9880d681SAndroid Build Coastguard Worker
918*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
919*9880d681SAndroid Build Coastguard Worker  bits<21> VBD2;
920*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
921*9880d681SAndroid Build Coastguard Worker
922*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
923*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
924*9880d681SAndroid Build Coastguard Worker  let Inst{35-16} = VBD2{19-0};
925*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M3;
926*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
927*9880d681SAndroid Build Coastguard Worker  let Inst{10}    = VBD2{20};
928*9880d681SAndroid Build Coastguard Worker  let Inst{9-8}   = 0;
929*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
930*9880d681SAndroid Build Coastguard Worker}
931*9880d681SAndroid Build Coastguard Worker
932*9880d681SAndroid Build Coastguard Workerclass InstVRX<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
933*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<6, outs, ins, asmstr, pattern> {
934*9880d681SAndroid Build Coastguard Worker  field bits<48> Inst;
935*9880d681SAndroid Build Coastguard Worker  field bits<48> SoftFail = 0;
936*9880d681SAndroid Build Coastguard Worker
937*9880d681SAndroid Build Coastguard Worker  bits<5> V1;
938*9880d681SAndroid Build Coastguard Worker  bits<20> XBD2;
939*9880d681SAndroid Build Coastguard Worker  bits<4> M3;
940*9880d681SAndroid Build Coastguard Worker
941*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = op{15-8};
942*9880d681SAndroid Build Coastguard Worker  let Inst{39-36} = V1{3-0};
943*9880d681SAndroid Build Coastguard Worker  let Inst{35-16} = XBD2;
944*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = M3;
945*9880d681SAndroid Build Coastguard Worker  let Inst{11}    = V1{4};
946*9880d681SAndroid Build Coastguard Worker  let Inst{10-8}  = 0;
947*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = op{7-0};
948*9880d681SAndroid Build Coastguard Worker}
949*9880d681SAndroid Build Coastguard Worker
950*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
951*9880d681SAndroid Build Coastguard Worker// Instruction definitions with semantics
952*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
953*9880d681SAndroid Build Coastguard Worker//
954*9880d681SAndroid Build Coastguard Worker// These classes have the form [Cond]<Category><Format>, where <Format> is one
955*9880d681SAndroid Build Coastguard Worker// of the formats defined above and where <Category> describes the inputs
956*9880d681SAndroid Build Coastguard Worker// and outputs.  "Cond" is used if the instruction is conditional,
957*9880d681SAndroid Build Coastguard Worker// in which case the 4-bit condition-code mask is added as a final operand.
958*9880d681SAndroid Build Coastguard Worker// <Category> can be one of:
959*9880d681SAndroid Build Coastguard Worker//
960*9880d681SAndroid Build Coastguard Worker//   Inherent:
961*9880d681SAndroid Build Coastguard Worker//     One register output operand and no input operands.
962*9880d681SAndroid Build Coastguard Worker//
963*9880d681SAndroid Build Coastguard Worker//   BranchUnary:
964*9880d681SAndroid Build Coastguard Worker//     One register output operand, one register input operand and
965*9880d681SAndroid Build Coastguard Worker//     one branch displacement.  The instructions stores a modified
966*9880d681SAndroid Build Coastguard Worker//     form of the source register in the destination register and
967*9880d681SAndroid Build Coastguard Worker//     branches on the result.
968*9880d681SAndroid Build Coastguard Worker//
969*9880d681SAndroid Build Coastguard Worker//   LoadMultiple:
970*9880d681SAndroid Build Coastguard Worker//     One address input operand and two explicit output operands.
971*9880d681SAndroid Build Coastguard Worker//     The instruction loads a range of registers from the address,
972*9880d681SAndroid Build Coastguard Worker//     with the explicit operands giving the first and last register
973*9880d681SAndroid Build Coastguard Worker//     to load.  Other loaded registers are added as implicit definitions.
974*9880d681SAndroid Build Coastguard Worker//
975*9880d681SAndroid Build Coastguard Worker//   StoreMultiple:
976*9880d681SAndroid Build Coastguard Worker//     Two explicit input register operands and an address operand.
977*9880d681SAndroid Build Coastguard Worker//     The instruction stores a range of registers to the address,
978*9880d681SAndroid Build Coastguard Worker//     with the explicit operands giving the first and last register
979*9880d681SAndroid Build Coastguard Worker//     to store.  Other stored registers are added as implicit uses.
980*9880d681SAndroid Build Coastguard Worker//
981*9880d681SAndroid Build Coastguard Worker//   StoreLength:
982*9880d681SAndroid Build Coastguard Worker//     One value operand, one length operand and one address operand.
983*9880d681SAndroid Build Coastguard Worker//     The instruction stores the value operand to the address but
984*9880d681SAndroid Build Coastguard Worker//     doesn't write more than the number of bytes specified by the
985*9880d681SAndroid Build Coastguard Worker//     length operand.
986*9880d681SAndroid Build Coastguard Worker//
987*9880d681SAndroid Build Coastguard Worker//   Unary:
988*9880d681SAndroid Build Coastguard Worker//     One register output operand and one input operand.
989*9880d681SAndroid Build Coastguard Worker//
990*9880d681SAndroid Build Coastguard Worker//   Store:
991*9880d681SAndroid Build Coastguard Worker//     One address operand and one other input operand.  The instruction
992*9880d681SAndroid Build Coastguard Worker//     stores to the address.
993*9880d681SAndroid Build Coastguard Worker//
994*9880d681SAndroid Build Coastguard Worker//   Binary:
995*9880d681SAndroid Build Coastguard Worker//     One register output operand and two input operands.
996*9880d681SAndroid Build Coastguard Worker//
997*9880d681SAndroid Build Coastguard Worker//   StoreBinary:
998*9880d681SAndroid Build Coastguard Worker//     One address operand and two other input operands.  The instruction
999*9880d681SAndroid Build Coastguard Worker//     stores to the address.
1000*9880d681SAndroid Build Coastguard Worker//
1001*9880d681SAndroid Build Coastguard Worker//   Compare:
1002*9880d681SAndroid Build Coastguard Worker//     Two input operands and an implicit CC output operand.
1003*9880d681SAndroid Build Coastguard Worker//
1004*9880d681SAndroid Build Coastguard Worker//   Test:
1005*9880d681SAndroid Build Coastguard Worker//     Two input operands and an implicit CC output operand.  The second
1006*9880d681SAndroid Build Coastguard Worker//     input operand is an "address" operand used as a test class mask.
1007*9880d681SAndroid Build Coastguard Worker//
1008*9880d681SAndroid Build Coastguard Worker//   Ternary:
1009*9880d681SAndroid Build Coastguard Worker//     One register output operand and three input operands.
1010*9880d681SAndroid Build Coastguard Worker//
1011*9880d681SAndroid Build Coastguard Worker//   Quaternary:
1012*9880d681SAndroid Build Coastguard Worker//     One register output operand and four input operands.
1013*9880d681SAndroid Build Coastguard Worker//
1014*9880d681SAndroid Build Coastguard Worker//   LoadAndOp:
1015*9880d681SAndroid Build Coastguard Worker//     One output operand and two input operands, one of which is an address.
1016*9880d681SAndroid Build Coastguard Worker//     The instruction both reads from and writes to the address.
1017*9880d681SAndroid Build Coastguard Worker//
1018*9880d681SAndroid Build Coastguard Worker//   CmpSwap:
1019*9880d681SAndroid Build Coastguard Worker//     One output operand and three input operands, one of which is an address.
1020*9880d681SAndroid Build Coastguard Worker//     The instruction both reads from and writes to the address.
1021*9880d681SAndroid Build Coastguard Worker//
1022*9880d681SAndroid Build Coastguard Worker//   RotateSelect:
1023*9880d681SAndroid Build Coastguard Worker//     One output operand and five input operands.  The first two operands
1024*9880d681SAndroid Build Coastguard Worker//     are registers and the other three are immediates.
1025*9880d681SAndroid Build Coastguard Worker//
1026*9880d681SAndroid Build Coastguard Worker//   Prefetch:
1027*9880d681SAndroid Build Coastguard Worker//     One 4-bit immediate operand and one address operand.  The immediate
1028*9880d681SAndroid Build Coastguard Worker//     operand is 1 for a load prefetch and 2 for a store prefetch.
1029*9880d681SAndroid Build Coastguard Worker//
1030*9880d681SAndroid Build Coastguard Worker// The format determines which input operands are tied to output operands,
1031*9880d681SAndroid Build Coastguard Worker// and also determines the shape of any address operand.
1032*9880d681SAndroid Build Coastguard Worker//
1033*9880d681SAndroid Build Coastguard Worker// Multiclasses of the form <Category><Format>Pair define two instructions,
1034*9880d681SAndroid Build Coastguard Worker// one with <Category><Format> and one with <Category><Format>Y.  The name
1035*9880d681SAndroid Build Coastguard Worker// of the first instruction has no suffix, the name of the second has
1036*9880d681SAndroid Build Coastguard Worker// an extra "y".
1037*9880d681SAndroid Build Coastguard Worker//
1038*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1039*9880d681SAndroid Build Coastguard Worker
1040*9880d681SAndroid Build Coastguard Workerclass InherentRRE<string mnemonic, bits<16> opcode, RegisterOperand cls,
1041*9880d681SAndroid Build Coastguard Worker                  dag src>
1042*9880d681SAndroid Build Coastguard Worker  : InstRRE<opcode, (outs cls:$R1), (ins),
1043*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1",
1044*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, src)]> {
1045*9880d681SAndroid Build Coastguard Worker  let R2 = 0;
1046*9880d681SAndroid Build Coastguard Worker}
1047*9880d681SAndroid Build Coastguard Worker
1048*9880d681SAndroid Build Coastguard Workerclass InherentVRIa<string mnemonic, bits<16> opcode, bits<16> value>
1049*9880d681SAndroid Build Coastguard Worker  : InstVRIa<opcode, (outs VR128:$V1), (ins), mnemonic#"\t$V1", []> {
1050*9880d681SAndroid Build Coastguard Worker  let I2 = value;
1051*9880d681SAndroid Build Coastguard Worker  let M3 = 0;
1052*9880d681SAndroid Build Coastguard Worker}
1053*9880d681SAndroid Build Coastguard Worker
1054*9880d681SAndroid Build Coastguard Workerclass BranchUnaryRI<string mnemonic, bits<12> opcode, RegisterOperand cls>
1055*9880d681SAndroid Build Coastguard Worker  : InstRI<opcode, (outs cls:$R1), (ins cls:$R1src, brtarget16:$I2),
1056*9880d681SAndroid Build Coastguard Worker           mnemonic##"\t$R1, $I2", []> {
1057*9880d681SAndroid Build Coastguard Worker  let isBranch = 1;
1058*9880d681SAndroid Build Coastguard Worker  let isTerminator = 1;
1059*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1060*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1061*9880d681SAndroid Build Coastguard Worker}
1062*9880d681SAndroid Build Coastguard Worker
1063*9880d681SAndroid Build Coastguard Workerclass LoadMultipleRS<string mnemonic, bits<8> opcode, RegisterOperand cls,
1064*9880d681SAndroid Build Coastguard Worker                     AddressingMode mode = bdaddr12only>
1065*9880d681SAndroid Build Coastguard Worker  : InstRS<opcode, (outs cls:$R1, cls:$R3), (ins mode:$BD2),
1066*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $R3, $BD2", []> {
1067*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1068*9880d681SAndroid Build Coastguard Worker}
1069*9880d681SAndroid Build Coastguard Worker
1070*9880d681SAndroid Build Coastguard Workerclass LoadMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls,
1071*9880d681SAndroid Build Coastguard Worker                      AddressingMode mode = bdaddr20only>
1072*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs cls:$R1, cls:$R3), (ins mode:$BD2),
1073*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $R3, $BD2", []> {
1074*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1075*9880d681SAndroid Build Coastguard Worker}
1076*9880d681SAndroid Build Coastguard Worker
1077*9880d681SAndroid Build Coastguard Workermulticlass LoadMultipleRSPair<string mnemonic, bits<8> rsOpcode,
1078*9880d681SAndroid Build Coastguard Worker                              bits<16> rsyOpcode, RegisterOperand cls> {
1079*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic ## #cls in {
1080*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
1081*9880d681SAndroid Build Coastguard Worker      def "" : LoadMultipleRS<mnemonic, rsOpcode, cls, bdaddr12pair>;
1082*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
1083*9880d681SAndroid Build Coastguard Worker      def Y  : LoadMultipleRSY<mnemonic#"y", rsyOpcode, cls, bdaddr20pair>;
1084*9880d681SAndroid Build Coastguard Worker  }
1085*9880d681SAndroid Build Coastguard Worker}
1086*9880d681SAndroid Build Coastguard Worker
1087*9880d681SAndroid Build Coastguard Workerclass LoadMultipleVRSa<string mnemonic, bits<16> opcode>
1088*9880d681SAndroid Build Coastguard Worker  : InstVRSa<opcode, (outs VR128:$V1, VR128:$V3), (ins bdaddr12only:$BD2),
1089*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V3, $BD2", []> {
1090*9880d681SAndroid Build Coastguard Worker  let M4 = 0;
1091*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1092*9880d681SAndroid Build Coastguard Worker}
1093*9880d681SAndroid Build Coastguard Worker
1094*9880d681SAndroid Build Coastguard Workerclass StoreRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
1095*9880d681SAndroid Build Coastguard Worker                 RegisterOperand cls>
1096*9880d681SAndroid Build Coastguard Worker  : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
1097*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $I2",
1098*9880d681SAndroid Build Coastguard Worker            [(operator cls:$R1, pcrel32:$I2)]> {
1099*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1100*9880d681SAndroid Build Coastguard Worker  // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
1101*9880d681SAndroid Build Coastguard Worker  // However, BDXs have two extra operands and are therefore 6 units more
1102*9880d681SAndroid Build Coastguard Worker  // complex.
1103*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = 7;
1104*9880d681SAndroid Build Coastguard Worker}
1105*9880d681SAndroid Build Coastguard Worker
1106*9880d681SAndroid Build Coastguard Workerclass StoreRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1107*9880d681SAndroid Build Coastguard Worker              RegisterOperand cls, bits<5> bytes,
1108*9880d681SAndroid Build Coastguard Worker              AddressingMode mode = bdxaddr12only>
1109*9880d681SAndroid Build Coastguard Worker  : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
1110*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $XBD2",
1111*9880d681SAndroid Build Coastguard Worker           [(operator cls:$R1, mode:$XBD2)]> {
1112*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1113*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1114*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1115*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1116*9880d681SAndroid Build Coastguard Worker}
1117*9880d681SAndroid Build Coastguard Worker
1118*9880d681SAndroid Build Coastguard Workerclass StoreRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1119*9880d681SAndroid Build Coastguard Worker               RegisterOperand cls, bits<5> bytes,
1120*9880d681SAndroid Build Coastguard Worker               AddressingMode mode = bdxaddr20only>
1121*9880d681SAndroid Build Coastguard Worker  : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
1122*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $XBD2",
1123*9880d681SAndroid Build Coastguard Worker            [(operator cls:$R1, mode:$XBD2)]> {
1124*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1125*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1126*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1127*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1128*9880d681SAndroid Build Coastguard Worker}
1129*9880d681SAndroid Build Coastguard Worker
1130*9880d681SAndroid Build Coastguard Workermulticlass StoreRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
1131*9880d681SAndroid Build Coastguard Worker                       SDPatternOperator operator, RegisterOperand cls,
1132*9880d681SAndroid Build Coastguard Worker                       bits<5> bytes> {
1133*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic ## #cls in {
1134*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
1135*9880d681SAndroid Build Coastguard Worker      def "" : StoreRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
1136*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
1137*9880d681SAndroid Build Coastguard Worker      def Y  : StoreRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
1138*9880d681SAndroid Build Coastguard Worker                        bdxaddr20pair>;
1139*9880d681SAndroid Build Coastguard Worker  }
1140*9880d681SAndroid Build Coastguard Worker}
1141*9880d681SAndroid Build Coastguard Worker
1142*9880d681SAndroid Build Coastguard Workerclass StoreVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1143*9880d681SAndroid Build Coastguard Worker               TypedReg tr, bits<5> bytes, bits<4> type = 0>
1144*9880d681SAndroid Build Coastguard Worker  : InstVRX<opcode, (outs), (ins tr.op:$V1, bdxaddr12only:$XBD2),
1145*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$V1, $XBD2",
1146*9880d681SAndroid Build Coastguard Worker            [(set tr.op:$V1, (tr.vt (operator bdxaddr12only:$XBD2)))]> {
1147*9880d681SAndroid Build Coastguard Worker  let M3 = type;
1148*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1149*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1150*9880d681SAndroid Build Coastguard Worker}
1151*9880d681SAndroid Build Coastguard Worker
1152*9880d681SAndroid Build Coastguard Workerclass StoreLengthVRSb<string mnemonic, bits<16> opcode,
1153*9880d681SAndroid Build Coastguard Worker                      SDPatternOperator operator, bits<5> bytes>
1154*9880d681SAndroid Build Coastguard Worker  : InstVRSb<opcode, (outs), (ins VR128:$V1, GR32:$R3, bdaddr12only:$BD2),
1155*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $R3, $BD2",
1156*9880d681SAndroid Build Coastguard Worker             [(operator VR128:$V1, GR32:$R3, bdaddr12only:$BD2)]> {
1157*9880d681SAndroid Build Coastguard Worker  let M4 = 0;
1158*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1159*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1160*9880d681SAndroid Build Coastguard Worker}
1161*9880d681SAndroid Build Coastguard Worker
1162*9880d681SAndroid Build Coastguard Workerclass StoreMultipleRS<string mnemonic, bits<8> opcode, RegisterOperand cls,
1163*9880d681SAndroid Build Coastguard Worker                      AddressingMode mode = bdaddr12only>
1164*9880d681SAndroid Build Coastguard Worker  : InstRS<opcode, (outs), (ins cls:$R1, cls:$R3, mode:$BD2),
1165*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $R3, $BD2", []> {
1166*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1167*9880d681SAndroid Build Coastguard Worker}
1168*9880d681SAndroid Build Coastguard Worker
1169*9880d681SAndroid Build Coastguard Workerclass StoreMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls,
1170*9880d681SAndroid Build Coastguard Worker                       AddressingMode mode = bdaddr20only>
1171*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs), (ins cls:$R1, cls:$R3, mode:$BD2),
1172*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $R3, $BD2", []> {
1173*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1174*9880d681SAndroid Build Coastguard Worker}
1175*9880d681SAndroid Build Coastguard Worker
1176*9880d681SAndroid Build Coastguard Workermulticlass StoreMultipleRSPair<string mnemonic, bits<8> rsOpcode,
1177*9880d681SAndroid Build Coastguard Worker                               bits<16> rsyOpcode, RegisterOperand cls> {
1178*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic ## #cls in {
1179*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
1180*9880d681SAndroid Build Coastguard Worker      def "" : StoreMultipleRS<mnemonic, rsOpcode, cls, bdaddr12pair>;
1181*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
1182*9880d681SAndroid Build Coastguard Worker      def Y  : StoreMultipleRSY<mnemonic#"y", rsyOpcode, cls, bdaddr20pair>;
1183*9880d681SAndroid Build Coastguard Worker  }
1184*9880d681SAndroid Build Coastguard Worker}
1185*9880d681SAndroid Build Coastguard Worker
1186*9880d681SAndroid Build Coastguard Workerclass StoreMultipleVRSa<string mnemonic, bits<16> opcode>
1187*9880d681SAndroid Build Coastguard Worker  : InstVRSa<opcode, (outs), (ins VR128:$V1, VR128:$V3, bdaddr12only:$BD2),
1188*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V3, $BD2", []> {
1189*9880d681SAndroid Build Coastguard Worker  let M4 = 0;
1190*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1191*9880d681SAndroid Build Coastguard Worker}
1192*9880d681SAndroid Build Coastguard Worker
1193*9880d681SAndroid Build Coastguard Worker// StoreSI* instructions are used to store an integer to memory, but the
1194*9880d681SAndroid Build Coastguard Worker// addresses are more restricted than for normal stores.  If we are in the
1195*9880d681SAndroid Build Coastguard Worker// situation of having to force either the address into a register or the
1196*9880d681SAndroid Build Coastguard Worker// constant into a register, it's usually better to do the latter.
1197*9880d681SAndroid Build Coastguard Worker// We therefore match the address in the same way as a normal store and
1198*9880d681SAndroid Build Coastguard Worker// only use the StoreSI* instruction if the matched address is suitable.
1199*9880d681SAndroid Build Coastguard Workerclass StoreSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1200*9880d681SAndroid Build Coastguard Worker              Immediate imm>
1201*9880d681SAndroid Build Coastguard Worker  : InstSI<opcode, (outs), (ins mviaddr12pair:$BD1, imm:$I2),
1202*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$BD1, $I2",
1203*9880d681SAndroid Build Coastguard Worker           [(operator imm:$I2, mviaddr12pair:$BD1)]> {
1204*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1205*9880d681SAndroid Build Coastguard Worker}
1206*9880d681SAndroid Build Coastguard Worker
1207*9880d681SAndroid Build Coastguard Workerclass StoreSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1208*9880d681SAndroid Build Coastguard Worker               Immediate imm>
1209*9880d681SAndroid Build Coastguard Worker  : InstSIY<opcode, (outs), (ins mviaddr20pair:$BD1, imm:$I2),
1210*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$BD1, $I2",
1211*9880d681SAndroid Build Coastguard Worker            [(operator imm:$I2, mviaddr20pair:$BD1)]> {
1212*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1213*9880d681SAndroid Build Coastguard Worker}
1214*9880d681SAndroid Build Coastguard Worker
1215*9880d681SAndroid Build Coastguard Workerclass StoreSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1216*9880d681SAndroid Build Coastguard Worker               Immediate imm>
1217*9880d681SAndroid Build Coastguard Worker  : InstSIL<opcode, (outs), (ins mviaddr12pair:$BD1, imm:$I2),
1218*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$BD1, $I2",
1219*9880d681SAndroid Build Coastguard Worker            [(operator imm:$I2, mviaddr12pair:$BD1)]> {
1220*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1221*9880d681SAndroid Build Coastguard Worker}
1222*9880d681SAndroid Build Coastguard Worker
1223*9880d681SAndroid Build Coastguard Workermulticlass StoreSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
1224*9880d681SAndroid Build Coastguard Worker                       SDPatternOperator operator, Immediate imm> {
1225*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic in {
1226*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
1227*9880d681SAndroid Build Coastguard Worker      def "" : StoreSI<mnemonic, siOpcode, operator, imm>;
1228*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
1229*9880d681SAndroid Build Coastguard Worker      def Y  : StoreSIY<mnemonic#"y", siyOpcode, operator, imm>;
1230*9880d681SAndroid Build Coastguard Worker  }
1231*9880d681SAndroid Build Coastguard Worker}
1232*9880d681SAndroid Build Coastguard Worker
1233*9880d681SAndroid Build Coastguard Workerclass CondStoreRSY<string mnemonic, bits<16> opcode,
1234*9880d681SAndroid Build Coastguard Worker                   RegisterOperand cls, bits<5> bytes,
1235*9880d681SAndroid Build Coastguard Worker                   AddressingMode mode = bdaddr20only>
1236*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2, cond4:$valid, cond4:$R3),
1237*9880d681SAndroid Build Coastguard Worker            mnemonic#"$R3\t$R1, $BD2", []>,
1238*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond]> {
1239*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1240*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1241*9880d681SAndroid Build Coastguard Worker  let CCMaskLast = 1;
1242*9880d681SAndroid Build Coastguard Worker}
1243*9880d681SAndroid Build Coastguard Worker
1244*9880d681SAndroid Build Coastguard Worker// Like CondStoreRSY, but used for the raw assembly form.  The condition-code
1245*9880d681SAndroid Build Coastguard Worker// mask is the third operand rather than being part of the mnemonic.
1246*9880d681SAndroid Build Coastguard Workerclass AsmCondStoreRSY<string mnemonic, bits<16> opcode,
1247*9880d681SAndroid Build Coastguard Worker                      RegisterOperand cls, bits<5> bytes,
1248*9880d681SAndroid Build Coastguard Worker                      AddressingMode mode = bdaddr20only>
1249*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2, imm32zx4:$R3),
1250*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $BD2, $R3", []>,
1251*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond]> {
1252*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1253*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1254*9880d681SAndroid Build Coastguard Worker}
1255*9880d681SAndroid Build Coastguard Worker
1256*9880d681SAndroid Build Coastguard Worker// Like CondStoreRSY, but with a fixed CC mask.
1257*9880d681SAndroid Build Coastguard Workerclass FixedCondStoreRSY<string mnemonic, bits<16> opcode,
1258*9880d681SAndroid Build Coastguard Worker                        RegisterOperand cls, bits<4> ccmask, bits<5> bytes,
1259*9880d681SAndroid Build Coastguard Worker                        AddressingMode mode = bdaddr20only>
1260*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2),
1261*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $BD2", []>,
1262*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond]> {
1263*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1264*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1265*9880d681SAndroid Build Coastguard Worker  let R3 = ccmask;
1266*9880d681SAndroid Build Coastguard Worker}
1267*9880d681SAndroid Build Coastguard Worker
1268*9880d681SAndroid Build Coastguard Workerclass UnaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1269*9880d681SAndroid Build Coastguard Worker              RegisterOperand cls1, RegisterOperand cls2>
1270*9880d681SAndroid Build Coastguard Worker  : InstRR<opcode, (outs cls1:$R1), (ins cls2:$R2),
1271*9880d681SAndroid Build Coastguard Worker           mnemonic#"r\t$R1, $R2",
1272*9880d681SAndroid Build Coastguard Worker           [(set cls1:$R1, (operator cls2:$R2))]> {
1273*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls1;
1274*9880d681SAndroid Build Coastguard Worker  let OpType = "reg";
1275*9880d681SAndroid Build Coastguard Worker}
1276*9880d681SAndroid Build Coastguard Worker
1277*9880d681SAndroid Build Coastguard Workerclass UnaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1278*9880d681SAndroid Build Coastguard Worker               RegisterOperand cls1, RegisterOperand cls2>
1279*9880d681SAndroid Build Coastguard Worker  : InstRRE<opcode, (outs cls1:$R1), (ins cls2:$R2),
1280*9880d681SAndroid Build Coastguard Worker            mnemonic#"r\t$R1, $R2",
1281*9880d681SAndroid Build Coastguard Worker            [(set cls1:$R1, (operator cls2:$R2))]> {
1282*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls1;
1283*9880d681SAndroid Build Coastguard Worker  let OpType = "reg";
1284*9880d681SAndroid Build Coastguard Worker}
1285*9880d681SAndroid Build Coastguard Worker
1286*9880d681SAndroid Build Coastguard Workerclass UnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
1287*9880d681SAndroid Build Coastguard Worker               RegisterOperand cls2>
1288*9880d681SAndroid Build Coastguard Worker  : InstRRF<opcode, (outs cls1:$R1), (ins imm32zx4:$R3, cls2:$R2),
1289*9880d681SAndroid Build Coastguard Worker            mnemonic#"r\t$R1, $R3, $R2", []> {
1290*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls1;
1291*9880d681SAndroid Build Coastguard Worker  let OpType = "reg";
1292*9880d681SAndroid Build Coastguard Worker  let R4 = 0;
1293*9880d681SAndroid Build Coastguard Worker}
1294*9880d681SAndroid Build Coastguard Worker
1295*9880d681SAndroid Build Coastguard Workerclass UnaryRRF4<string mnemonic, bits<16> opcode, RegisterOperand cls1,
1296*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls2>
1297*9880d681SAndroid Build Coastguard Worker  : InstRRF<opcode, (outs cls1:$R1), (ins imm32zx4:$R3, cls2:$R2, imm32zx4:$R4),
1298*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $R3, $R2, $R4", []>;
1299*9880d681SAndroid Build Coastguard Worker
1300*9880d681SAndroid Build Coastguard Worker// These instructions are generated by if conversion.  The old value of R1
1301*9880d681SAndroid Build Coastguard Worker// is added as an implicit use.
1302*9880d681SAndroid Build Coastguard Workerclass CondUnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
1303*9880d681SAndroid Build Coastguard Worker                   RegisterOperand cls2>
1304*9880d681SAndroid Build Coastguard Worker  : InstRRF<opcode, (outs cls1:$R1), (ins cls2:$R2, cond4:$valid, cond4:$R3),
1305*9880d681SAndroid Build Coastguard Worker            mnemonic#"r$R3\t$R1, $R2", []>,
1306*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond]> {
1307*9880d681SAndroid Build Coastguard Worker  let CCMaskLast = 1;
1308*9880d681SAndroid Build Coastguard Worker  let R4 = 0;
1309*9880d681SAndroid Build Coastguard Worker}
1310*9880d681SAndroid Build Coastguard Worker
1311*9880d681SAndroid Build Coastguard Workerclass CondUnaryRIE<string mnemonic, bits<16> opcode, RegisterOperand cls,
1312*9880d681SAndroid Build Coastguard Worker                   Immediate imm>
1313*9880d681SAndroid Build Coastguard Worker  : InstRIEd<opcode, (outs cls:$R1),
1314*9880d681SAndroid Build Coastguard Worker                     (ins imm:$I2, cond4:$valid, cond4:$R3),
1315*9880d681SAndroid Build Coastguard Worker             mnemonic#"$R3\t$R1, $I2", []>,
1316*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond2]> {
1317*9880d681SAndroid Build Coastguard Worker  let CCMaskLast = 1;
1318*9880d681SAndroid Build Coastguard Worker}
1319*9880d681SAndroid Build Coastguard Worker
1320*9880d681SAndroid Build Coastguard Worker// Like CondUnaryRRF, but used for the raw assembly form.  The condition-code
1321*9880d681SAndroid Build Coastguard Worker// mask is the third operand rather than being part of the mnemonic.
1322*9880d681SAndroid Build Coastguard Workerclass AsmCondUnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
1323*9880d681SAndroid Build Coastguard Worker                      RegisterOperand cls2>
1324*9880d681SAndroid Build Coastguard Worker  : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2, imm32zx4:$R3),
1325*9880d681SAndroid Build Coastguard Worker            mnemonic#"r\t$R1, $R2, $R3", []>,
1326*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond]> {
1327*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1328*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1329*9880d681SAndroid Build Coastguard Worker  let R4 = 0;
1330*9880d681SAndroid Build Coastguard Worker}
1331*9880d681SAndroid Build Coastguard Worker
1332*9880d681SAndroid Build Coastguard Workerclass AsmCondUnaryRIE<string mnemonic, bits<16> opcode, RegisterOperand cls,
1333*9880d681SAndroid Build Coastguard Worker                   Immediate imm>
1334*9880d681SAndroid Build Coastguard Worker  : InstRIEd<opcode, (outs cls:$R1),
1335*9880d681SAndroid Build Coastguard Worker                     (ins cls:$R1src, imm:$I2, imm32zx4:$R3),
1336*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$R1, $I2, $R3", []>,
1337*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond2]> {
1338*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1339*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1340*9880d681SAndroid Build Coastguard Worker}
1341*9880d681SAndroid Build Coastguard Worker
1342*9880d681SAndroid Build Coastguard Worker// Like CondUnaryRRF, but with a fixed CC mask.
1343*9880d681SAndroid Build Coastguard Workerclass FixedCondUnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
1344*9880d681SAndroid Build Coastguard Worker                        RegisterOperand cls2, bits<4> ccmask>
1345*9880d681SAndroid Build Coastguard Worker  : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
1346*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $R2", []>,
1347*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond]> {
1348*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1349*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1350*9880d681SAndroid Build Coastguard Worker  let R3 = ccmask;
1351*9880d681SAndroid Build Coastguard Worker  let R4 = 0;
1352*9880d681SAndroid Build Coastguard Worker}
1353*9880d681SAndroid Build Coastguard Worker
1354*9880d681SAndroid Build Coastguard Workerclass FixedCondUnaryRIE<string mnemonic, bits<16> opcode, RegisterOperand cls,
1355*9880d681SAndroid Build Coastguard Worker                   Immediate imm, bits<4> ccmask>
1356*9880d681SAndroid Build Coastguard Worker  : InstRIEd<opcode, (outs cls:$R1),
1357*9880d681SAndroid Build Coastguard Worker                     (ins cls:$R1src, imm:$I2),
1358*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$R1, $I2", []>,
1359*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond2]> {
1360*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1361*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1362*9880d681SAndroid Build Coastguard Worker  let R3 = ccmask;
1363*9880d681SAndroid Build Coastguard Worker}
1364*9880d681SAndroid Build Coastguard Worker
1365*9880d681SAndroid Build Coastguard Workerclass UnaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
1366*9880d681SAndroid Build Coastguard Worker              RegisterOperand cls, Immediate imm>
1367*9880d681SAndroid Build Coastguard Worker  : InstRI<opcode, (outs cls:$R1), (ins imm:$I2),
1368*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $I2",
1369*9880d681SAndroid Build Coastguard Worker           [(set cls:$R1, (operator imm:$I2))]>;
1370*9880d681SAndroid Build Coastguard Worker
1371*9880d681SAndroid Build Coastguard Workerclass UnaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
1372*9880d681SAndroid Build Coastguard Worker               RegisterOperand cls, Immediate imm>
1373*9880d681SAndroid Build Coastguard Worker  : InstRIL<opcode, (outs cls:$R1), (ins imm:$I2),
1374*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $I2",
1375*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator imm:$I2))]>;
1376*9880d681SAndroid Build Coastguard Worker
1377*9880d681SAndroid Build Coastguard Workerclass UnaryRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
1378*9880d681SAndroid Build Coastguard Worker                 RegisterOperand cls>
1379*9880d681SAndroid Build Coastguard Worker  : InstRIL<opcode, (outs cls:$R1), (ins pcrel32:$I2),
1380*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $I2",
1381*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator pcrel32:$I2))]> {
1382*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1383*9880d681SAndroid Build Coastguard Worker  // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
1384*9880d681SAndroid Build Coastguard Worker  // However, BDXs have two extra operands and are therefore 6 units more
1385*9880d681SAndroid Build Coastguard Worker  // complex.
1386*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = 7;
1387*9880d681SAndroid Build Coastguard Worker}
1388*9880d681SAndroid Build Coastguard Worker
1389*9880d681SAndroid Build Coastguard Workerclass CondUnaryRSY<string mnemonic, bits<16> opcode,
1390*9880d681SAndroid Build Coastguard Worker                   SDPatternOperator operator, RegisterOperand cls,
1391*9880d681SAndroid Build Coastguard Worker                   bits<5> bytes, AddressingMode mode = bdaddr20only>
1392*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs cls:$R1),
1393*9880d681SAndroid Build Coastguard Worker            (ins cls:$R1src, mode:$BD2, cond4:$valid, cond4:$R3),
1394*9880d681SAndroid Build Coastguard Worker            mnemonic#"$R3\t$R1, $BD2",
1395*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1,
1396*9880d681SAndroid Build Coastguard Worker                  (z_select_ccmask (load bdaddr20only:$BD2), cls:$R1src,
1397*9880d681SAndroid Build Coastguard Worker                                   cond4:$valid, cond4:$R3))]>,
1398*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond]> {
1399*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1400*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1401*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1402*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1403*9880d681SAndroid Build Coastguard Worker  let CCMaskLast = 1;
1404*9880d681SAndroid Build Coastguard Worker}
1405*9880d681SAndroid Build Coastguard Worker
1406*9880d681SAndroid Build Coastguard Worker// Like CondUnaryRSY, but used for the raw assembly form.  The condition-code
1407*9880d681SAndroid Build Coastguard Worker// mask is the third operand rather than being part of the mnemonic.
1408*9880d681SAndroid Build Coastguard Workerclass AsmCondUnaryRSY<string mnemonic, bits<16> opcode,
1409*9880d681SAndroid Build Coastguard Worker                      RegisterOperand cls, bits<5> bytes,
1410*9880d681SAndroid Build Coastguard Worker                      AddressingMode mode = bdaddr20only>
1411*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$BD2, imm32zx4:$R3),
1412*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $BD2, $R3", []>,
1413*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond]> {
1414*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1415*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1416*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1417*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1418*9880d681SAndroid Build Coastguard Worker}
1419*9880d681SAndroid Build Coastguard Worker
1420*9880d681SAndroid Build Coastguard Worker// Like CondUnaryRSY, but with a fixed CC mask.
1421*9880d681SAndroid Build Coastguard Workerclass FixedCondUnaryRSY<string mnemonic, bits<16> opcode,
1422*9880d681SAndroid Build Coastguard Worker                        RegisterOperand cls, bits<4> ccmask, bits<5> bytes,
1423*9880d681SAndroid Build Coastguard Worker                        AddressingMode mode = bdaddr20only>
1424*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$BD2),
1425*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $BD2", []>,
1426*9880d681SAndroid Build Coastguard Worker    Requires<[FeatureLoadStoreOnCond]> {
1427*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1428*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1429*9880d681SAndroid Build Coastguard Worker  let R3 = ccmask;
1430*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1431*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1432*9880d681SAndroid Build Coastguard Worker}
1433*9880d681SAndroid Build Coastguard Worker
1434*9880d681SAndroid Build Coastguard Workerclass UnaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1435*9880d681SAndroid Build Coastguard Worker              RegisterOperand cls, bits<5> bytes,
1436*9880d681SAndroid Build Coastguard Worker              AddressingMode mode = bdxaddr12only>
1437*9880d681SAndroid Build Coastguard Worker  : InstRX<opcode, (outs cls:$R1), (ins mode:$XBD2),
1438*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $XBD2",
1439*9880d681SAndroid Build Coastguard Worker           [(set cls:$R1, (operator mode:$XBD2))]> {
1440*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1441*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1442*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1443*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1444*9880d681SAndroid Build Coastguard Worker}
1445*9880d681SAndroid Build Coastguard Worker
1446*9880d681SAndroid Build Coastguard Workerclass UnaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1447*9880d681SAndroid Build Coastguard Worker               RegisterOperand cls, bits<5> bytes>
1448*9880d681SAndroid Build Coastguard Worker  : InstRXE<opcode, (outs cls:$R1), (ins bdxaddr12only:$XBD2),
1449*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $XBD2",
1450*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator bdxaddr12only:$XBD2))]> {
1451*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1452*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1453*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1454*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1455*9880d681SAndroid Build Coastguard Worker  let M3 = 0;
1456*9880d681SAndroid Build Coastguard Worker}
1457*9880d681SAndroid Build Coastguard Worker
1458*9880d681SAndroid Build Coastguard Workerclass UnaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1459*9880d681SAndroid Build Coastguard Worker               RegisterOperand cls, bits<5> bytes,
1460*9880d681SAndroid Build Coastguard Worker               AddressingMode mode = bdxaddr20only>
1461*9880d681SAndroid Build Coastguard Worker  : InstRXY<opcode, (outs cls:$R1), (ins mode:$XBD2),
1462*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $XBD2",
1463*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator mode:$XBD2))]> {
1464*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1465*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1466*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1467*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1468*9880d681SAndroid Build Coastguard Worker}
1469*9880d681SAndroid Build Coastguard Worker
1470*9880d681SAndroid Build Coastguard Workermulticlass UnaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
1471*9880d681SAndroid Build Coastguard Worker                       SDPatternOperator operator, RegisterOperand cls,
1472*9880d681SAndroid Build Coastguard Worker                       bits<5> bytes> {
1473*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic ## #cls in {
1474*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
1475*9880d681SAndroid Build Coastguard Worker      def "" : UnaryRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
1476*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
1477*9880d681SAndroid Build Coastguard Worker      def Y  : UnaryRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
1478*9880d681SAndroid Build Coastguard Worker                        bdxaddr20pair>;
1479*9880d681SAndroid Build Coastguard Worker  }
1480*9880d681SAndroid Build Coastguard Worker}
1481*9880d681SAndroid Build Coastguard Worker
1482*9880d681SAndroid Build Coastguard Workerclass UnaryVRIa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1483*9880d681SAndroid Build Coastguard Worker                TypedReg tr, Immediate imm, bits<4> type = 0>
1484*9880d681SAndroid Build Coastguard Worker  : InstVRIa<opcode, (outs tr.op:$V1), (ins imm:$I2),
1485*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $I2",
1486*9880d681SAndroid Build Coastguard Worker             [(set tr.op:$V1, (tr.vt (operator imm:$I2)))]> {
1487*9880d681SAndroid Build Coastguard Worker  let M3 = type;
1488*9880d681SAndroid Build Coastguard Worker}
1489*9880d681SAndroid Build Coastguard Worker
1490*9880d681SAndroid Build Coastguard Workerclass UnaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1491*9880d681SAndroid Build Coastguard Worker                TypedReg tr1, TypedReg tr2, bits<4> type = 0, bits<4> m4 = 0,
1492*9880d681SAndroid Build Coastguard Worker                bits<4> m5 = 0>
1493*9880d681SAndroid Build Coastguard Worker  : InstVRRa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2),
1494*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2",
1495*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2))))]> {
1496*9880d681SAndroid Build Coastguard Worker  let M3 = type;
1497*9880d681SAndroid Build Coastguard Worker  let M4 = m4;
1498*9880d681SAndroid Build Coastguard Worker  let M5 = m5;
1499*9880d681SAndroid Build Coastguard Worker}
1500*9880d681SAndroid Build Coastguard Worker
1501*9880d681SAndroid Build Coastguard Workermulticlass UnaryVRRaSPair<string mnemonic, bits<16> opcode,
1502*9880d681SAndroid Build Coastguard Worker                          SDPatternOperator operator,
1503*9880d681SAndroid Build Coastguard Worker                          SDPatternOperator operator_cc, TypedReg tr1,
1504*9880d681SAndroid Build Coastguard Worker                          TypedReg tr2, bits<4> type, bits<4> modifier = 0,
1505*9880d681SAndroid Build Coastguard Worker                          bits<4> modifier_cc = 1> {
1506*9880d681SAndroid Build Coastguard Worker  def "" : UnaryVRRa<mnemonic, opcode, operator, tr1, tr2, type, 0, modifier>;
1507*9880d681SAndroid Build Coastguard Worker  let Defs = [CC] in
1508*9880d681SAndroid Build Coastguard Worker    def S : UnaryVRRa<mnemonic##"s", opcode, operator_cc, tr1, tr2, type, 0,
1509*9880d681SAndroid Build Coastguard Worker                      modifier_cc>;
1510*9880d681SAndroid Build Coastguard Worker}
1511*9880d681SAndroid Build Coastguard Worker
1512*9880d681SAndroid Build Coastguard Workerclass UnaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1513*9880d681SAndroid Build Coastguard Worker               TypedReg tr, bits<5> bytes, bits<4> type = 0>
1514*9880d681SAndroid Build Coastguard Worker  : InstVRX<opcode, (outs tr.op:$V1), (ins bdxaddr12only:$XBD2),
1515*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$V1, $XBD2",
1516*9880d681SAndroid Build Coastguard Worker            [(set tr.op:$V1, (tr.vt (operator bdxaddr12only:$XBD2)))]> {
1517*9880d681SAndroid Build Coastguard Worker  let M3 = type;
1518*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1519*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1520*9880d681SAndroid Build Coastguard Worker}
1521*9880d681SAndroid Build Coastguard Worker
1522*9880d681SAndroid Build Coastguard Workerclass BinaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1523*9880d681SAndroid Build Coastguard Worker               RegisterOperand cls1, RegisterOperand cls2>
1524*9880d681SAndroid Build Coastguard Worker  : InstRR<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
1525*9880d681SAndroid Build Coastguard Worker           mnemonic#"r\t$R1, $R2",
1526*9880d681SAndroid Build Coastguard Worker           [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
1527*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls1;
1528*9880d681SAndroid Build Coastguard Worker  let OpType = "reg";
1529*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1530*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1531*9880d681SAndroid Build Coastguard Worker}
1532*9880d681SAndroid Build Coastguard Worker
1533*9880d681SAndroid Build Coastguard Workerclass BinaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1534*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls1, RegisterOperand cls2>
1535*9880d681SAndroid Build Coastguard Worker  : InstRRE<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
1536*9880d681SAndroid Build Coastguard Worker            mnemonic#"r\t$R1, $R2",
1537*9880d681SAndroid Build Coastguard Worker            [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
1538*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls1;
1539*9880d681SAndroid Build Coastguard Worker  let OpType = "reg";
1540*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1541*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1542*9880d681SAndroid Build Coastguard Worker}
1543*9880d681SAndroid Build Coastguard Worker
1544*9880d681SAndroid Build Coastguard Workerclass BinaryRRF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1545*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls1, RegisterOperand cls2>
1546*9880d681SAndroid Build Coastguard Worker  : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R2, cls2:$R3),
1547*9880d681SAndroid Build Coastguard Worker            mnemonic#"r\t$R1, $R3, $R2",
1548*9880d681SAndroid Build Coastguard Worker            [(set cls1:$R1, (operator cls1:$R2, cls2:$R3))]> {
1549*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls1;
1550*9880d681SAndroid Build Coastguard Worker  let OpType = "reg";
1551*9880d681SAndroid Build Coastguard Worker  let R4 = 0;
1552*9880d681SAndroid Build Coastguard Worker}
1553*9880d681SAndroid Build Coastguard Worker
1554*9880d681SAndroid Build Coastguard Workerclass BinaryRRFK<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1555*9880d681SAndroid Build Coastguard Worker                 RegisterOperand cls1, RegisterOperand cls2>
1556*9880d681SAndroid Build Coastguard Worker  : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R2, cls2:$R3),
1557*9880d681SAndroid Build Coastguard Worker            mnemonic#"rk\t$R1, $R2, $R3",
1558*9880d681SAndroid Build Coastguard Worker            [(set cls1:$R1, (operator cls1:$R2, cls2:$R3))]> {
1559*9880d681SAndroid Build Coastguard Worker  let R4 = 0;
1560*9880d681SAndroid Build Coastguard Worker}
1561*9880d681SAndroid Build Coastguard Worker
1562*9880d681SAndroid Build Coastguard Workermulticlass BinaryRRAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
1563*9880d681SAndroid Build Coastguard Worker                        SDPatternOperator operator, RegisterOperand cls1,
1564*9880d681SAndroid Build Coastguard Worker                        RegisterOperand cls2> {
1565*9880d681SAndroid Build Coastguard Worker  let NumOpsKey = mnemonic in {
1566*9880d681SAndroid Build Coastguard Worker    let NumOpsValue = "3" in
1567*9880d681SAndroid Build Coastguard Worker      def K : BinaryRRFK<mnemonic, opcode2, null_frag, cls1, cls2>,
1568*9880d681SAndroid Build Coastguard Worker              Requires<[FeatureDistinctOps]>;
1569*9880d681SAndroid Build Coastguard Worker    let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
1570*9880d681SAndroid Build Coastguard Worker      def "" : BinaryRR<mnemonic, opcode1, operator, cls1, cls2>;
1571*9880d681SAndroid Build Coastguard Worker  }
1572*9880d681SAndroid Build Coastguard Worker}
1573*9880d681SAndroid Build Coastguard Worker
1574*9880d681SAndroid Build Coastguard Workermulticlass BinaryRREAndK<string mnemonic, bits<16> opcode1, bits<16> opcode2,
1575*9880d681SAndroid Build Coastguard Worker                         SDPatternOperator operator, RegisterOperand cls1,
1576*9880d681SAndroid Build Coastguard Worker                         RegisterOperand cls2> {
1577*9880d681SAndroid Build Coastguard Worker  let NumOpsKey = mnemonic in {
1578*9880d681SAndroid Build Coastguard Worker    let NumOpsValue = "3" in
1579*9880d681SAndroid Build Coastguard Worker      def K : BinaryRRFK<mnemonic, opcode2, null_frag, cls1, cls2>,
1580*9880d681SAndroid Build Coastguard Worker              Requires<[FeatureDistinctOps]>;
1581*9880d681SAndroid Build Coastguard Worker    let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
1582*9880d681SAndroid Build Coastguard Worker      def "" : BinaryRRE<mnemonic, opcode1, operator, cls1, cls2>;
1583*9880d681SAndroid Build Coastguard Worker  }
1584*9880d681SAndroid Build Coastguard Worker}
1585*9880d681SAndroid Build Coastguard Worker
1586*9880d681SAndroid Build Coastguard Workerclass BinaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
1587*9880d681SAndroid Build Coastguard Worker               RegisterOperand cls, Immediate imm>
1588*9880d681SAndroid Build Coastguard Worker  : InstRI<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
1589*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $I2",
1590*9880d681SAndroid Build Coastguard Worker           [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
1591*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1592*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1593*9880d681SAndroid Build Coastguard Worker}
1594*9880d681SAndroid Build Coastguard Worker
1595*9880d681SAndroid Build Coastguard Workerclass BinaryRIE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1596*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls, Immediate imm>
1597*9880d681SAndroid Build Coastguard Worker  : InstRIEd<opcode, (outs cls:$R1), (ins cls:$R3, imm:$I2),
1598*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$R1, $R3, $I2",
1599*9880d681SAndroid Build Coastguard Worker             [(set cls:$R1, (operator cls:$R3, imm:$I2))]>;
1600*9880d681SAndroid Build Coastguard Worker
1601*9880d681SAndroid Build Coastguard Workermulticlass BinaryRIAndK<string mnemonic, bits<12> opcode1, bits<16> opcode2,
1602*9880d681SAndroid Build Coastguard Worker                        SDPatternOperator operator, RegisterOperand cls,
1603*9880d681SAndroid Build Coastguard Worker                        Immediate imm> {
1604*9880d681SAndroid Build Coastguard Worker  let NumOpsKey = mnemonic in {
1605*9880d681SAndroid Build Coastguard Worker    let NumOpsValue = "3" in
1606*9880d681SAndroid Build Coastguard Worker      def K : BinaryRIE<mnemonic##"k", opcode2, null_frag, cls, imm>,
1607*9880d681SAndroid Build Coastguard Worker              Requires<[FeatureDistinctOps]>;
1608*9880d681SAndroid Build Coastguard Worker    let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
1609*9880d681SAndroid Build Coastguard Worker      def "" : BinaryRI<mnemonic, opcode1, operator, cls, imm>;
1610*9880d681SAndroid Build Coastguard Worker  }
1611*9880d681SAndroid Build Coastguard Worker}
1612*9880d681SAndroid Build Coastguard Worker
1613*9880d681SAndroid Build Coastguard Workerclass BinaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
1614*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls, Immediate imm>
1615*9880d681SAndroid Build Coastguard Worker  : InstRIL<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
1616*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $I2",
1617*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
1618*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1619*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1620*9880d681SAndroid Build Coastguard Worker}
1621*9880d681SAndroid Build Coastguard Worker
1622*9880d681SAndroid Build Coastguard Workerclass BinaryRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1623*9880d681SAndroid Build Coastguard Worker               RegisterOperand cls>
1624*9880d681SAndroid Build Coastguard Worker  : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, shift12only:$BD2),
1625*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $BD2",
1626*9880d681SAndroid Build Coastguard Worker           [(set cls:$R1, (operator cls:$R1src, shift12only:$BD2))]> {
1627*9880d681SAndroid Build Coastguard Worker  let R3 = 0;
1628*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1629*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1630*9880d681SAndroid Build Coastguard Worker}
1631*9880d681SAndroid Build Coastguard Worker
1632*9880d681SAndroid Build Coastguard Workerclass BinaryRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1633*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls>
1634*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs cls:$R1), (ins cls:$R3, shift20only:$BD2),
1635*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $R3, $BD2",
1636*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator cls:$R3, shift20only:$BD2))]>;
1637*9880d681SAndroid Build Coastguard Worker
1638*9880d681SAndroid Build Coastguard Workermulticlass BinaryRSAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
1639*9880d681SAndroid Build Coastguard Worker                        SDPatternOperator operator, RegisterOperand cls> {
1640*9880d681SAndroid Build Coastguard Worker  let NumOpsKey = mnemonic in {
1641*9880d681SAndroid Build Coastguard Worker    let NumOpsValue = "3" in
1642*9880d681SAndroid Build Coastguard Worker      def K  : BinaryRSY<mnemonic##"k", opcode2, null_frag, cls>,
1643*9880d681SAndroid Build Coastguard Worker               Requires<[FeatureDistinctOps]>;
1644*9880d681SAndroid Build Coastguard Worker    let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
1645*9880d681SAndroid Build Coastguard Worker      def "" : BinaryRS<mnemonic, opcode1, operator, cls>;
1646*9880d681SAndroid Build Coastguard Worker  }
1647*9880d681SAndroid Build Coastguard Worker}
1648*9880d681SAndroid Build Coastguard Worker
1649*9880d681SAndroid Build Coastguard Workerclass BinaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1650*9880d681SAndroid Build Coastguard Worker               RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
1651*9880d681SAndroid Build Coastguard Worker               AddressingMode mode = bdxaddr12only>
1652*9880d681SAndroid Build Coastguard Worker  : InstRX<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
1653*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $XBD2",
1654*9880d681SAndroid Build Coastguard Worker           [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
1655*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1656*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1657*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1658*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1659*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1660*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1661*9880d681SAndroid Build Coastguard Worker}
1662*9880d681SAndroid Build Coastguard Worker
1663*9880d681SAndroid Build Coastguard Workerclass BinaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1664*9880d681SAndroid Build Coastguard Worker                  RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
1665*9880d681SAndroid Build Coastguard Worker  : InstRXE<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr12only:$XBD2),
1666*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $XBD2",
1667*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator cls:$R1src,
1668*9880d681SAndroid Build Coastguard Worker                                     (load bdxaddr12only:$XBD2)))]> {
1669*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1670*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1671*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1672*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1673*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1674*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1675*9880d681SAndroid Build Coastguard Worker  let M3 = 0;
1676*9880d681SAndroid Build Coastguard Worker}
1677*9880d681SAndroid Build Coastguard Worker
1678*9880d681SAndroid Build Coastguard Workerclass BinaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1679*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
1680*9880d681SAndroid Build Coastguard Worker                AddressingMode mode = bdxaddr20only>
1681*9880d681SAndroid Build Coastguard Worker  : InstRXY<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
1682*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $XBD2",
1683*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
1684*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1685*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1686*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
1687*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
1688*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1689*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1690*9880d681SAndroid Build Coastguard Worker}
1691*9880d681SAndroid Build Coastguard Worker
1692*9880d681SAndroid Build Coastguard Workermulticlass BinaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
1693*9880d681SAndroid Build Coastguard Worker                        SDPatternOperator operator, RegisterOperand cls,
1694*9880d681SAndroid Build Coastguard Worker                        SDPatternOperator load, bits<5> bytes> {
1695*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic ## #cls in {
1696*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
1697*9880d681SAndroid Build Coastguard Worker      def "" : BinaryRX<mnemonic, rxOpcode, operator, cls, load, bytes,
1698*9880d681SAndroid Build Coastguard Worker                        bdxaddr12pair>;
1699*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
1700*9880d681SAndroid Build Coastguard Worker      def Y  : BinaryRXY<mnemonic#"y", rxyOpcode, operator, cls, load, bytes,
1701*9880d681SAndroid Build Coastguard Worker                         bdxaddr20pair>;
1702*9880d681SAndroid Build Coastguard Worker  }
1703*9880d681SAndroid Build Coastguard Worker}
1704*9880d681SAndroid Build Coastguard Worker
1705*9880d681SAndroid Build Coastguard Workerclass BinarySI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1706*9880d681SAndroid Build Coastguard Worker               Operand imm, AddressingMode mode = bdaddr12only>
1707*9880d681SAndroid Build Coastguard Worker  : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
1708*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$BD1, $I2",
1709*9880d681SAndroid Build Coastguard Worker           [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
1710*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1711*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1712*9880d681SAndroid Build Coastguard Worker}
1713*9880d681SAndroid Build Coastguard Worker
1714*9880d681SAndroid Build Coastguard Workerclass BinarySIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1715*9880d681SAndroid Build Coastguard Worker                Operand imm, AddressingMode mode = bdaddr20only>
1716*9880d681SAndroid Build Coastguard Worker  : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
1717*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$BD1, $I2",
1718*9880d681SAndroid Build Coastguard Worker            [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
1719*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1720*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1721*9880d681SAndroid Build Coastguard Worker}
1722*9880d681SAndroid Build Coastguard Worker
1723*9880d681SAndroid Build Coastguard Workermulticlass BinarySIPair<string mnemonic, bits<8> siOpcode,
1724*9880d681SAndroid Build Coastguard Worker                        bits<16> siyOpcode, SDPatternOperator operator,
1725*9880d681SAndroid Build Coastguard Worker                        Operand imm> {
1726*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic ## #cls in {
1727*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
1728*9880d681SAndroid Build Coastguard Worker      def "" : BinarySI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
1729*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
1730*9880d681SAndroid Build Coastguard Worker      def Y  : BinarySIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
1731*9880d681SAndroid Build Coastguard Worker  }
1732*9880d681SAndroid Build Coastguard Worker}
1733*9880d681SAndroid Build Coastguard Worker
1734*9880d681SAndroid Build Coastguard Workerclass BinaryVRIb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1735*9880d681SAndroid Build Coastguard Worker                 TypedReg tr, bits<4> type>
1736*9880d681SAndroid Build Coastguard Worker  : InstVRIb<opcode, (outs tr.op:$V1), (ins imm32zx8:$I2, imm32zx8:$I3),
1737*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $I2, $I3",
1738*9880d681SAndroid Build Coastguard Worker             [(set tr.op:$V1, (tr.vt (operator imm32zx8:$I2, imm32zx8:$I3)))]> {
1739*9880d681SAndroid Build Coastguard Worker  let M4 = type;
1740*9880d681SAndroid Build Coastguard Worker}
1741*9880d681SAndroid Build Coastguard Worker
1742*9880d681SAndroid Build Coastguard Workerclass BinaryVRIc<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1743*9880d681SAndroid Build Coastguard Worker                 TypedReg tr1, TypedReg tr2, bits<4> type>
1744*9880d681SAndroid Build Coastguard Worker  : InstVRIc<opcode, (outs tr1.op:$V1), (ins tr2.op:$V3, imm32zx16:$I2),
1745*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V3, $I2",
1746*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V3),
1747*9880d681SAndroid Build Coastguard Worker                                                 imm32zx16:$I2)))]> {
1748*9880d681SAndroid Build Coastguard Worker  let M4 = type;
1749*9880d681SAndroid Build Coastguard Worker}
1750*9880d681SAndroid Build Coastguard Worker
1751*9880d681SAndroid Build Coastguard Workerclass BinaryVRIe<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1752*9880d681SAndroid Build Coastguard Worker                 TypedReg tr1, TypedReg tr2, bits<4> type, bits<4> m5>
1753*9880d681SAndroid Build Coastguard Worker  : InstVRIe<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, imm32zx12:$I3),
1754*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $I3",
1755*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2),
1756*9880d681SAndroid Build Coastguard Worker                                                 imm32zx12:$I3)))]> {
1757*9880d681SAndroid Build Coastguard Worker  let M4 = type;
1758*9880d681SAndroid Build Coastguard Worker  let M5 = m5;
1759*9880d681SAndroid Build Coastguard Worker}
1760*9880d681SAndroid Build Coastguard Worker
1761*9880d681SAndroid Build Coastguard Workerclass BinaryVRRa<string mnemonic, bits<16> opcode>
1762*9880d681SAndroid Build Coastguard Worker  : InstVRRa<opcode, (outs VR128:$V1), (ins VR128:$V2, imm32zx4:$M3),
1763*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $M3", []> {
1764*9880d681SAndroid Build Coastguard Worker  let M4 = 0;
1765*9880d681SAndroid Build Coastguard Worker  let M5 = 0;
1766*9880d681SAndroid Build Coastguard Worker}
1767*9880d681SAndroid Build Coastguard Worker
1768*9880d681SAndroid Build Coastguard Workerclass BinaryVRRb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1769*9880d681SAndroid Build Coastguard Worker                 TypedReg tr1, TypedReg tr2, bits<4> type = 0,
1770*9880d681SAndroid Build Coastguard Worker                 bits<4> modifier = 0>
1771*9880d681SAndroid Build Coastguard Worker  : InstVRRb<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3),
1772*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $V3",
1773*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2),
1774*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V3))))]> {
1775*9880d681SAndroid Build Coastguard Worker  let M4 = type;
1776*9880d681SAndroid Build Coastguard Worker  let M5 = modifier;
1777*9880d681SAndroid Build Coastguard Worker}
1778*9880d681SAndroid Build Coastguard Worker
1779*9880d681SAndroid Build Coastguard Worker// Declare a pair of instructions, one which sets CC and one which doesn't.
1780*9880d681SAndroid Build Coastguard Worker// The CC-setting form ends with "S" and sets the low bit of M5.
1781*9880d681SAndroid Build Coastguard Workermulticlass BinaryVRRbSPair<string mnemonic, bits<16> opcode,
1782*9880d681SAndroid Build Coastguard Worker                           SDPatternOperator operator,
1783*9880d681SAndroid Build Coastguard Worker                           SDPatternOperator operator_cc, TypedReg tr1,
1784*9880d681SAndroid Build Coastguard Worker                           TypedReg tr2, bits<4> type,
1785*9880d681SAndroid Build Coastguard Worker                           bits<4> modifier = 0, bits<4> modifier_cc = 1> {
1786*9880d681SAndroid Build Coastguard Worker  def "" : BinaryVRRb<mnemonic, opcode, operator, tr1, tr2, type, modifier>;
1787*9880d681SAndroid Build Coastguard Worker  let Defs = [CC] in
1788*9880d681SAndroid Build Coastguard Worker    def S : BinaryVRRb<mnemonic##"s", opcode, operator_cc, tr1, tr2, type,
1789*9880d681SAndroid Build Coastguard Worker                       modifier_cc>;
1790*9880d681SAndroid Build Coastguard Worker}
1791*9880d681SAndroid Build Coastguard Worker
1792*9880d681SAndroid Build Coastguard Workerclass BinaryVRRc<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1793*9880d681SAndroid Build Coastguard Worker                 TypedReg tr1, TypedReg tr2, bits<4> type = 0, bits<4> m5 = 0,
1794*9880d681SAndroid Build Coastguard Worker                 bits<4> m6 = 0>
1795*9880d681SAndroid Build Coastguard Worker  : InstVRRc<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3),
1796*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $V3",
1797*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2),
1798*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V3))))]> {
1799*9880d681SAndroid Build Coastguard Worker  let M4 = type;
1800*9880d681SAndroid Build Coastguard Worker  let M5 = m5;
1801*9880d681SAndroid Build Coastguard Worker  let M6 = m6;
1802*9880d681SAndroid Build Coastguard Worker}
1803*9880d681SAndroid Build Coastguard Worker
1804*9880d681SAndroid Build Coastguard Workermulticlass BinaryVRRcSPair<string mnemonic, bits<16> opcode,
1805*9880d681SAndroid Build Coastguard Worker                           SDPatternOperator operator,
1806*9880d681SAndroid Build Coastguard Worker                           SDPatternOperator operator_cc, TypedReg tr1,
1807*9880d681SAndroid Build Coastguard Worker                           TypedReg tr2, bits<4> type, bits<4> m5,
1808*9880d681SAndroid Build Coastguard Worker                           bits<4> modifier = 0, bits<4> modifier_cc = 1> {
1809*9880d681SAndroid Build Coastguard Worker  def "" : BinaryVRRc<mnemonic, opcode, operator, tr1, tr2, type, m5, modifier>;
1810*9880d681SAndroid Build Coastguard Worker  let Defs = [CC] in
1811*9880d681SAndroid Build Coastguard Worker    def S : BinaryVRRc<mnemonic##"s", opcode, operator_cc, tr1, tr2, type,
1812*9880d681SAndroid Build Coastguard Worker                       m5, modifier_cc>;
1813*9880d681SAndroid Build Coastguard Worker}
1814*9880d681SAndroid Build Coastguard Worker
1815*9880d681SAndroid Build Coastguard Workerclass BinaryVRRf<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1816*9880d681SAndroid Build Coastguard Worker                 TypedReg tr>
1817*9880d681SAndroid Build Coastguard Worker  : InstVRRf<opcode, (outs tr.op:$V1), (ins GR64:$R2, GR64:$R3),
1818*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $R2, $R3",
1819*9880d681SAndroid Build Coastguard Worker             [(set tr.op:$V1, (tr.vt (operator GR64:$R2, GR64:$R3)))]>;
1820*9880d681SAndroid Build Coastguard Worker
1821*9880d681SAndroid Build Coastguard Workerclass BinaryVRSa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1822*9880d681SAndroid Build Coastguard Worker                 TypedReg tr1, TypedReg tr2, bits<4> type>
1823*9880d681SAndroid Build Coastguard Worker  : InstVRSa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V3, shift12only:$BD2),
1824*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V3, $BD2",
1825*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V3),
1826*9880d681SAndroid Build Coastguard Worker                                                 shift12only:$BD2)))]> {
1827*9880d681SAndroid Build Coastguard Worker  let M4 = type;
1828*9880d681SAndroid Build Coastguard Worker}
1829*9880d681SAndroid Build Coastguard Worker
1830*9880d681SAndroid Build Coastguard Workerclass BinaryVRSb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1831*9880d681SAndroid Build Coastguard Worker                 bits<5> bytes>
1832*9880d681SAndroid Build Coastguard Worker  : InstVRSb<opcode, (outs VR128:$V1), (ins GR32:$R3, bdaddr12only:$BD2),
1833*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $R3, $BD2",
1834*9880d681SAndroid Build Coastguard Worker             [(set VR128:$V1, (operator GR32:$R3, bdaddr12only:$BD2))]> {
1835*9880d681SAndroid Build Coastguard Worker  let M4 = 0;
1836*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1837*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1838*9880d681SAndroid Build Coastguard Worker}
1839*9880d681SAndroid Build Coastguard Worker
1840*9880d681SAndroid Build Coastguard Workerclass BinaryVRSc<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1841*9880d681SAndroid Build Coastguard Worker                 TypedReg tr, bits<4> type>
1842*9880d681SAndroid Build Coastguard Worker  : InstVRSc<opcode, (outs GR64:$R1), (ins tr.op:$V3, shift12only:$BD2),
1843*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $V3, $BD2",
1844*9880d681SAndroid Build Coastguard Worker           [(set GR64:$R1, (operator (tr.vt tr.op:$V3), shift12only:$BD2))]> {
1845*9880d681SAndroid Build Coastguard Worker  let M4 = type;
1846*9880d681SAndroid Build Coastguard Worker}
1847*9880d681SAndroid Build Coastguard Worker
1848*9880d681SAndroid Build Coastguard Workerclass BinaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1849*9880d681SAndroid Build Coastguard Worker                TypedReg tr, bits<5> bytes>
1850*9880d681SAndroid Build Coastguard Worker  : InstVRX<opcode, (outs VR128:$V1), (ins bdxaddr12only:$XBD2, imm32zx4:$M3),
1851*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$V1, $XBD2, $M3",
1852*9880d681SAndroid Build Coastguard Worker            [(set tr.op:$V1, (tr.vt (operator bdxaddr12only:$XBD2,
1853*9880d681SAndroid Build Coastguard Worker                                              imm32zx4:$M3)))]> {
1854*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1855*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1856*9880d681SAndroid Build Coastguard Worker}
1857*9880d681SAndroid Build Coastguard Worker
1858*9880d681SAndroid Build Coastguard Workerclass StoreBinaryVRV<string mnemonic, bits<16> opcode, bits<5> bytes,
1859*9880d681SAndroid Build Coastguard Worker                     Immediate index>
1860*9880d681SAndroid Build Coastguard Worker  : InstVRV<opcode, (outs), (ins VR128:$V1, bdvaddr12only:$VBD2, index:$M3),
1861*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$V1, $VBD2, $M3", []> {
1862*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1863*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1864*9880d681SAndroid Build Coastguard Worker}
1865*9880d681SAndroid Build Coastguard Worker
1866*9880d681SAndroid Build Coastguard Workerclass StoreBinaryVRX<string mnemonic, bits<16> opcode,
1867*9880d681SAndroid Build Coastguard Worker                     SDPatternOperator operator, TypedReg tr, bits<5> bytes,
1868*9880d681SAndroid Build Coastguard Worker                     Immediate index>
1869*9880d681SAndroid Build Coastguard Worker  : InstVRX<opcode, (outs), (ins tr.op:$V1, bdxaddr12only:$XBD2, index:$M3),
1870*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$V1, $XBD2, $M3",
1871*9880d681SAndroid Build Coastguard Worker            [(operator (tr.vt tr.op:$V1), bdxaddr12only:$XBD2, index:$M3)]> {
1872*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
1873*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1874*9880d681SAndroid Build Coastguard Worker}
1875*9880d681SAndroid Build Coastguard Worker
1876*9880d681SAndroid Build Coastguard Workerclass CompareRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1877*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls1, RegisterOperand cls2>
1878*9880d681SAndroid Build Coastguard Worker  : InstRR<opcode, (outs), (ins cls1:$R1, cls2:$R2),
1879*9880d681SAndroid Build Coastguard Worker           mnemonic#"r\t$R1, $R2",
1880*9880d681SAndroid Build Coastguard Worker           [(operator cls1:$R1, cls2:$R2)]> {
1881*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls1;
1882*9880d681SAndroid Build Coastguard Worker  let OpType = "reg";
1883*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
1884*9880d681SAndroid Build Coastguard Worker}
1885*9880d681SAndroid Build Coastguard Worker
1886*9880d681SAndroid Build Coastguard Workerclass CompareRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1887*9880d681SAndroid Build Coastguard Worker                 RegisterOperand cls1, RegisterOperand cls2>
1888*9880d681SAndroid Build Coastguard Worker  : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2),
1889*9880d681SAndroid Build Coastguard Worker            mnemonic#"r\t$R1, $R2",
1890*9880d681SAndroid Build Coastguard Worker            [(operator cls1:$R1, cls2:$R2)]> {
1891*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls1;
1892*9880d681SAndroid Build Coastguard Worker  let OpType = "reg";
1893*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
1894*9880d681SAndroid Build Coastguard Worker}
1895*9880d681SAndroid Build Coastguard Worker
1896*9880d681SAndroid Build Coastguard Workerclass CompareRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
1897*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls, Immediate imm>
1898*9880d681SAndroid Build Coastguard Worker  : InstRI<opcode, (outs), (ins cls:$R1, imm:$I2),
1899*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $I2",
1900*9880d681SAndroid Build Coastguard Worker           [(operator cls:$R1, imm:$I2)]> {
1901*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
1902*9880d681SAndroid Build Coastguard Worker}
1903*9880d681SAndroid Build Coastguard Worker
1904*9880d681SAndroid Build Coastguard Workerclass CompareRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
1905*9880d681SAndroid Build Coastguard Worker                 RegisterOperand cls, Immediate imm>
1906*9880d681SAndroid Build Coastguard Worker  : InstRIL<opcode, (outs), (ins cls:$R1, imm:$I2),
1907*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $I2",
1908*9880d681SAndroid Build Coastguard Worker            [(operator cls:$R1, imm:$I2)]> {
1909*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
1910*9880d681SAndroid Build Coastguard Worker}
1911*9880d681SAndroid Build Coastguard Worker
1912*9880d681SAndroid Build Coastguard Workerclass CompareRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
1913*9880d681SAndroid Build Coastguard Worker                   RegisterOperand cls, SDPatternOperator load>
1914*9880d681SAndroid Build Coastguard Worker  : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
1915*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $I2",
1916*9880d681SAndroid Build Coastguard Worker            [(operator cls:$R1, (load pcrel32:$I2))]> {
1917*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
1918*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1919*9880d681SAndroid Build Coastguard Worker  // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
1920*9880d681SAndroid Build Coastguard Worker  // However, BDXs have two extra operands and are therefore 6 units more
1921*9880d681SAndroid Build Coastguard Worker  // complex.
1922*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = 7;
1923*9880d681SAndroid Build Coastguard Worker}
1924*9880d681SAndroid Build Coastguard Worker
1925*9880d681SAndroid Build Coastguard Workerclass CompareRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1926*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
1927*9880d681SAndroid Build Coastguard Worker                AddressingMode mode = bdxaddr12only>
1928*9880d681SAndroid Build Coastguard Worker  : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
1929*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $XBD2",
1930*9880d681SAndroid Build Coastguard Worker           [(operator cls:$R1, (load mode:$XBD2))]> {
1931*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1932*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1933*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
1934*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1935*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1936*9880d681SAndroid Build Coastguard Worker}
1937*9880d681SAndroid Build Coastguard Worker
1938*9880d681SAndroid Build Coastguard Workerclass CompareRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1939*9880d681SAndroid Build Coastguard Worker                 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
1940*9880d681SAndroid Build Coastguard Worker  : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2),
1941*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $XBD2",
1942*9880d681SAndroid Build Coastguard Worker            [(operator cls:$R1, (load bdxaddr12only:$XBD2))]> {
1943*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1944*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1945*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
1946*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1947*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1948*9880d681SAndroid Build Coastguard Worker  let M3 = 0;
1949*9880d681SAndroid Build Coastguard Worker}
1950*9880d681SAndroid Build Coastguard Worker
1951*9880d681SAndroid Build Coastguard Workerclass CompareRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1952*9880d681SAndroid Build Coastguard Worker                 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
1953*9880d681SAndroid Build Coastguard Worker                 AddressingMode mode = bdxaddr20only>
1954*9880d681SAndroid Build Coastguard Worker  : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
1955*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $XBD2",
1956*9880d681SAndroid Build Coastguard Worker            [(operator cls:$R1, (load mode:$XBD2))]> {
1957*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
1958*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
1959*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
1960*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1961*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
1962*9880d681SAndroid Build Coastguard Worker}
1963*9880d681SAndroid Build Coastguard Worker
1964*9880d681SAndroid Build Coastguard Workermulticlass CompareRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
1965*9880d681SAndroid Build Coastguard Worker                         SDPatternOperator operator, RegisterOperand cls,
1966*9880d681SAndroid Build Coastguard Worker                         SDPatternOperator load, bits<5> bytes> {
1967*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic ## #cls in {
1968*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
1969*9880d681SAndroid Build Coastguard Worker      def "" : CompareRX<mnemonic, rxOpcode, operator, cls,
1970*9880d681SAndroid Build Coastguard Worker                         load, bytes, bdxaddr12pair>;
1971*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
1972*9880d681SAndroid Build Coastguard Worker      def Y  : CompareRXY<mnemonic#"y", rxyOpcode, operator, cls,
1973*9880d681SAndroid Build Coastguard Worker                          load, bytes, bdxaddr20pair>;
1974*9880d681SAndroid Build Coastguard Worker  }
1975*9880d681SAndroid Build Coastguard Worker}
1976*9880d681SAndroid Build Coastguard Worker
1977*9880d681SAndroid Build Coastguard Workerclass CompareSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1978*9880d681SAndroid Build Coastguard Worker                SDPatternOperator load, Immediate imm,
1979*9880d681SAndroid Build Coastguard Worker                AddressingMode mode = bdaddr12only>
1980*9880d681SAndroid Build Coastguard Worker  : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
1981*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$BD1, $I2",
1982*9880d681SAndroid Build Coastguard Worker           [(operator (load mode:$BD1), imm:$I2)]> {
1983*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
1984*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1985*9880d681SAndroid Build Coastguard Worker}
1986*9880d681SAndroid Build Coastguard Worker
1987*9880d681SAndroid Build Coastguard Workerclass CompareSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1988*9880d681SAndroid Build Coastguard Worker                 SDPatternOperator load, Immediate imm>
1989*9880d681SAndroid Build Coastguard Worker  : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
1990*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$BD1, $I2",
1991*9880d681SAndroid Build Coastguard Worker            [(operator (load bdaddr12only:$BD1), imm:$I2)]> {
1992*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
1993*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
1994*9880d681SAndroid Build Coastguard Worker}
1995*9880d681SAndroid Build Coastguard Worker
1996*9880d681SAndroid Build Coastguard Workerclass CompareSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1997*9880d681SAndroid Build Coastguard Worker                 SDPatternOperator load, Immediate imm,
1998*9880d681SAndroid Build Coastguard Worker                 AddressingMode mode = bdaddr20only>
1999*9880d681SAndroid Build Coastguard Worker  : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
2000*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$BD1, $I2",
2001*9880d681SAndroid Build Coastguard Worker            [(operator (load mode:$BD1), imm:$I2)]> {
2002*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
2003*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2004*9880d681SAndroid Build Coastguard Worker}
2005*9880d681SAndroid Build Coastguard Worker
2006*9880d681SAndroid Build Coastguard Workermulticlass CompareSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
2007*9880d681SAndroid Build Coastguard Worker                         SDPatternOperator operator, SDPatternOperator load,
2008*9880d681SAndroid Build Coastguard Worker                         Immediate imm> {
2009*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic in {
2010*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
2011*9880d681SAndroid Build Coastguard Worker      def "" : CompareSI<mnemonic, siOpcode, operator, load, imm, bdaddr12pair>;
2012*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
2013*9880d681SAndroid Build Coastguard Worker      def Y  : CompareSIY<mnemonic#"y", siyOpcode, operator, load, imm,
2014*9880d681SAndroid Build Coastguard Worker                          bdaddr20pair>;
2015*9880d681SAndroid Build Coastguard Worker  }
2016*9880d681SAndroid Build Coastguard Worker}
2017*9880d681SAndroid Build Coastguard Worker
2018*9880d681SAndroid Build Coastguard Workerclass CompareVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2019*9880d681SAndroid Build Coastguard Worker                  TypedReg tr, bits<4> type>
2020*9880d681SAndroid Build Coastguard Worker  : InstVRRa<opcode, (outs), (ins tr.op:$V1, tr.op:$V2),
2021*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2",
2022*9880d681SAndroid Build Coastguard Worker             [(operator (tr.vt tr.op:$V1), (tr.vt tr.op:$V2))]> {
2023*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
2024*9880d681SAndroid Build Coastguard Worker  let M3 = type;
2025*9880d681SAndroid Build Coastguard Worker  let M4 = 0;
2026*9880d681SAndroid Build Coastguard Worker  let M5 = 0;
2027*9880d681SAndroid Build Coastguard Worker}
2028*9880d681SAndroid Build Coastguard Worker
2029*9880d681SAndroid Build Coastguard Workerclass TestRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2030*9880d681SAndroid Build Coastguard Worker              RegisterOperand cls>
2031*9880d681SAndroid Build Coastguard Worker  : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2),
2032*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $XBD2",
2033*9880d681SAndroid Build Coastguard Worker            [(operator cls:$R1, bdxaddr12only:$XBD2)]> {
2034*9880d681SAndroid Build Coastguard Worker  let M3 = 0;
2035*9880d681SAndroid Build Coastguard Worker}
2036*9880d681SAndroid Build Coastguard Worker
2037*9880d681SAndroid Build Coastguard Workerclass TernaryRRD<string mnemonic, bits<16> opcode,
2038*9880d681SAndroid Build Coastguard Worker                 SDPatternOperator operator, RegisterOperand cls>
2039*9880d681SAndroid Build Coastguard Worker  : InstRRD<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, cls:$R2),
2040*9880d681SAndroid Build Coastguard Worker            mnemonic#"r\t$R1, $R3, $R2",
2041*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator cls:$R1src, cls:$R3, cls:$R2))]> {
2042*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
2043*9880d681SAndroid Build Coastguard Worker  let OpType = "reg";
2044*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2045*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
2046*9880d681SAndroid Build Coastguard Worker}
2047*9880d681SAndroid Build Coastguard Worker
2048*9880d681SAndroid Build Coastguard Workerclass TernaryRS<string mnemonic, bits<8> opcode, RegisterOperand cls,
2049*9880d681SAndroid Build Coastguard Worker                bits<5> bytes, AddressingMode mode = bdaddr12only>
2050*9880d681SAndroid Build Coastguard Worker  : InstRS<opcode, (outs cls:$R1),
2051*9880d681SAndroid Build Coastguard Worker          (ins cls:$R1src, imm32zx4:$R3, mode:$BD2),
2052*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $R3, $BD2", []> {
2053*9880d681SAndroid Build Coastguard Worker
2054*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2055*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
2056*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2057*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
2058*9880d681SAndroid Build Coastguard Worker}
2059*9880d681SAndroid Build Coastguard Worker
2060*9880d681SAndroid Build Coastguard Workerclass TernaryRSY<string mnemonic, bits<16> opcode, RegisterOperand cls,
2061*9880d681SAndroid Build Coastguard Worker                bits<5> bytes, AddressingMode mode = bdaddr20only>
2062*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs cls:$R1),
2063*9880d681SAndroid Build Coastguard Worker           (ins cls:$R1src, imm32zx4:$R3, mode:$BD2),
2064*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $R3, $BD2", []> {
2065*9880d681SAndroid Build Coastguard Worker
2066*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2067*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
2068*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2069*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
2070*9880d681SAndroid Build Coastguard Worker}
2071*9880d681SAndroid Build Coastguard Worker
2072*9880d681SAndroid Build Coastguard Workermulticlass TernaryRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode,
2073*9880d681SAndroid Build Coastguard Worker                         RegisterOperand cls, bits<5> bytes> {
2074*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic ## #cls in {
2075*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
2076*9880d681SAndroid Build Coastguard Worker      def "" : TernaryRS<mnemonic, rsOpcode, cls, bytes, bdaddr12pair>;
2077*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
2078*9880d681SAndroid Build Coastguard Worker      def Y  : TernaryRSY<mnemonic#"y", rsyOpcode, cls, bytes, bdaddr20pair>;
2079*9880d681SAndroid Build Coastguard Worker  }
2080*9880d681SAndroid Build Coastguard Worker}
2081*9880d681SAndroid Build Coastguard Worker
2082*9880d681SAndroid Build Coastguard Workerclass TernaryRXF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2083*9880d681SAndroid Build Coastguard Worker                 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
2084*9880d681SAndroid Build Coastguard Worker  : InstRXF<opcode, (outs cls:$R1),
2085*9880d681SAndroid Build Coastguard Worker            (ins cls:$R1src, cls:$R3, bdxaddr12only:$XBD2),
2086*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $R3, $XBD2",
2087*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator cls:$R1src, cls:$R3,
2088*9880d681SAndroid Build Coastguard Worker                                     (load bdxaddr12only:$XBD2)))]> {
2089*9880d681SAndroid Build Coastguard Worker  let OpKey = mnemonic ## cls;
2090*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
2091*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2092*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
2093*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2094*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
2095*9880d681SAndroid Build Coastguard Worker}
2096*9880d681SAndroid Build Coastguard Worker
2097*9880d681SAndroid Build Coastguard Workerclass TernaryVRIa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2098*9880d681SAndroid Build Coastguard Worker                  TypedReg tr1, TypedReg tr2, Immediate imm, Immediate index>
2099*9880d681SAndroid Build Coastguard Worker  : InstVRIa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V1src, imm:$I2, index:$M3),
2100*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $I2, $M3",
2101*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V1src),
2102*9880d681SAndroid Build Coastguard Worker                                                 imm:$I2, index:$M3)))]> {
2103*9880d681SAndroid Build Coastguard Worker  let Constraints = "$V1 = $V1src";
2104*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$V1src";
2105*9880d681SAndroid Build Coastguard Worker}
2106*9880d681SAndroid Build Coastguard Worker
2107*9880d681SAndroid Build Coastguard Workerclass TernaryVRId<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2108*9880d681SAndroid Build Coastguard Worker                  TypedReg tr1, TypedReg tr2, bits<4> type>
2109*9880d681SAndroid Build Coastguard Worker  : InstVRId<opcode, (outs tr1.op:$V1),
2110*9880d681SAndroid Build Coastguard Worker             (ins tr2.op:$V2, tr2.op:$V3, imm32zx8:$I4),
2111*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $V3, $I4",
2112*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2),
2113*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V3),
2114*9880d681SAndroid Build Coastguard Worker                                                 imm32zx8:$I4)))]> {
2115*9880d681SAndroid Build Coastguard Worker  let M5 = type;
2116*9880d681SAndroid Build Coastguard Worker}
2117*9880d681SAndroid Build Coastguard Worker
2118*9880d681SAndroid Build Coastguard Workerclass TernaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2119*9880d681SAndroid Build Coastguard Worker                  TypedReg tr1, TypedReg tr2, bits<4> type, bits<4> m4or>
2120*9880d681SAndroid Build Coastguard Worker  : InstVRRa<opcode, (outs tr1.op:$V1),
2121*9880d681SAndroid Build Coastguard Worker             (ins tr2.op:$V2, imm32zx4:$M4, imm32zx4:$M5),
2122*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $M4, $M5",
2123*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2),
2124*9880d681SAndroid Build Coastguard Worker                                                 imm32zx4:$M4,
2125*9880d681SAndroid Build Coastguard Worker                                                 imm32zx4:$M5)))],
2126*9880d681SAndroid Build Coastguard Worker             m4or> {
2127*9880d681SAndroid Build Coastguard Worker  let M3 = type;
2128*9880d681SAndroid Build Coastguard Worker}
2129*9880d681SAndroid Build Coastguard Worker
2130*9880d681SAndroid Build Coastguard Workerclass TernaryVRRb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2131*9880d681SAndroid Build Coastguard Worker                  TypedReg tr1, TypedReg tr2, bits<4> type,
2132*9880d681SAndroid Build Coastguard Worker                  SDPatternOperator m5mask, bits<4> m5or>
2133*9880d681SAndroid Build Coastguard Worker  : InstVRRb<opcode, (outs tr1.op:$V1),
2134*9880d681SAndroid Build Coastguard Worker             (ins tr2.op:$V2, tr2.op:$V3, m5mask:$M5),
2135*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $V3, $M5",
2136*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2),
2137*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V3),
2138*9880d681SAndroid Build Coastguard Worker                                                 m5mask:$M5)))],
2139*9880d681SAndroid Build Coastguard Worker             m5or> {
2140*9880d681SAndroid Build Coastguard Worker  let M4 = type;
2141*9880d681SAndroid Build Coastguard Worker}
2142*9880d681SAndroid Build Coastguard Worker
2143*9880d681SAndroid Build Coastguard Workermulticlass TernaryVRRbSPair<string mnemonic, bits<16> opcode,
2144*9880d681SAndroid Build Coastguard Worker                            SDPatternOperator operator,
2145*9880d681SAndroid Build Coastguard Worker                            SDPatternOperator operator_cc, TypedReg tr1,
2146*9880d681SAndroid Build Coastguard Worker                            TypedReg tr2, bits<4> type, bits<4> m5or> {
2147*9880d681SAndroid Build Coastguard Worker  def "" : TernaryVRRb<mnemonic, opcode, operator, tr1, tr2, type,
2148*9880d681SAndroid Build Coastguard Worker                       imm32zx4even, !and (m5or, 14)>;
2149*9880d681SAndroid Build Coastguard Worker  def : InstAlias<mnemonic#"\t$V1, $V2, $V3",
2150*9880d681SAndroid Build Coastguard Worker                  (!cast<Instruction>(NAME) tr1.op:$V1, tr2.op:$V2,
2151*9880d681SAndroid Build Coastguard Worker                                            tr2.op:$V3, 0)>;
2152*9880d681SAndroid Build Coastguard Worker  let Defs = [CC] in
2153*9880d681SAndroid Build Coastguard Worker    def S : TernaryVRRb<mnemonic##"s", opcode, operator_cc, tr1, tr2, type,
2154*9880d681SAndroid Build Coastguard Worker                        imm32zx4even, !add(!and (m5or, 14), 1)>;
2155*9880d681SAndroid Build Coastguard Worker  def : InstAlias<mnemonic#"s\t$V1, $V2, $V3",
2156*9880d681SAndroid Build Coastguard Worker                  (!cast<Instruction>(NAME#"S") tr1.op:$V1, tr2.op:$V2,
2157*9880d681SAndroid Build Coastguard Worker                                                tr2.op:$V3, 0)>;
2158*9880d681SAndroid Build Coastguard Worker}
2159*9880d681SAndroid Build Coastguard Worker
2160*9880d681SAndroid Build Coastguard Workerclass TernaryVRRc<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2161*9880d681SAndroid Build Coastguard Worker                  TypedReg tr1, TypedReg tr2>
2162*9880d681SAndroid Build Coastguard Worker  : InstVRRc<opcode, (outs tr1.op:$V1),
2163*9880d681SAndroid Build Coastguard Worker             (ins tr2.op:$V2, tr2.op:$V3, imm32zx4:$M4),
2164*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $V3, $M4",
2165*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2),
2166*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V3),
2167*9880d681SAndroid Build Coastguard Worker                                                 imm32zx4:$M4)))]> {
2168*9880d681SAndroid Build Coastguard Worker  let M5 = 0;
2169*9880d681SAndroid Build Coastguard Worker  let M6 = 0;
2170*9880d681SAndroid Build Coastguard Worker}
2171*9880d681SAndroid Build Coastguard Worker
2172*9880d681SAndroid Build Coastguard Workerclass TernaryVRRd<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2173*9880d681SAndroid Build Coastguard Worker                  TypedReg tr1, TypedReg tr2, bits<4> type = 0>
2174*9880d681SAndroid Build Coastguard Worker  : InstVRRd<opcode, (outs tr1.op:$V1),
2175*9880d681SAndroid Build Coastguard Worker             (ins tr2.op:$V2, tr2.op:$V3, tr1.op:$V4),
2176*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $V3, $V4",
2177*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2),
2178*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V3),
2179*9880d681SAndroid Build Coastguard Worker                                                 (tr1.vt tr1.op:$V4))))]> {
2180*9880d681SAndroid Build Coastguard Worker  let M5 = type;
2181*9880d681SAndroid Build Coastguard Worker  let M6 = 0;
2182*9880d681SAndroid Build Coastguard Worker}
2183*9880d681SAndroid Build Coastguard Worker
2184*9880d681SAndroid Build Coastguard Workerclass TernaryVRRe<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2185*9880d681SAndroid Build Coastguard Worker                  TypedReg tr1, TypedReg tr2, bits<4> m5 = 0, bits<4> type = 0>
2186*9880d681SAndroid Build Coastguard Worker  : InstVRRe<opcode, (outs tr1.op:$V1),
2187*9880d681SAndroid Build Coastguard Worker             (ins tr2.op:$V2, tr2.op:$V3, tr1.op:$V4),
2188*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $V3, $V4",
2189*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2),
2190*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V3),
2191*9880d681SAndroid Build Coastguard Worker                                                 (tr1.vt tr1.op:$V4))))]> {
2192*9880d681SAndroid Build Coastguard Worker  let M5 = m5;
2193*9880d681SAndroid Build Coastguard Worker  let M6 = type;
2194*9880d681SAndroid Build Coastguard Worker}
2195*9880d681SAndroid Build Coastguard Worker
2196*9880d681SAndroid Build Coastguard Workerclass TernaryVRSb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2197*9880d681SAndroid Build Coastguard Worker                  TypedReg tr1, TypedReg tr2, RegisterOperand cls, bits<4> type>
2198*9880d681SAndroid Build Coastguard Worker  : InstVRSb<opcode, (outs tr1.op:$V1),
2199*9880d681SAndroid Build Coastguard Worker             (ins tr2.op:$V1src, cls:$R3, shift12only:$BD2),
2200*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $R3, $BD2",
2201*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V1src),
2202*9880d681SAndroid Build Coastguard Worker                                                 cls:$R3,
2203*9880d681SAndroid Build Coastguard Worker                                                 shift12only:$BD2)))]> {
2204*9880d681SAndroid Build Coastguard Worker  let Constraints = "$V1 = $V1src";
2205*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$V1src";
2206*9880d681SAndroid Build Coastguard Worker  let M4 = type;
2207*9880d681SAndroid Build Coastguard Worker}
2208*9880d681SAndroid Build Coastguard Worker
2209*9880d681SAndroid Build Coastguard Workerclass TernaryVRV<string mnemonic, bits<16> opcode, bits<5> bytes,
2210*9880d681SAndroid Build Coastguard Worker                 Immediate index>
2211*9880d681SAndroid Build Coastguard Worker  : InstVRV<opcode, (outs VR128:$V1),
2212*9880d681SAndroid Build Coastguard Worker           (ins VR128:$V1src, bdvaddr12only:$VBD2, index:$M3),
2213*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$V1, $VBD2, $M3", []> {
2214*9880d681SAndroid Build Coastguard Worker  let Constraints = "$V1 = $V1src";
2215*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$V1src";
2216*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2217*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
2218*9880d681SAndroid Build Coastguard Worker}
2219*9880d681SAndroid Build Coastguard Worker
2220*9880d681SAndroid Build Coastguard Workerclass TernaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2221*9880d681SAndroid Build Coastguard Worker                 TypedReg tr1, TypedReg tr2, bits<5> bytes, Immediate index>
2222*9880d681SAndroid Build Coastguard Worker  : InstVRX<opcode, (outs tr1.op:$V1),
2223*9880d681SAndroid Build Coastguard Worker           (ins tr2.op:$V1src, bdxaddr12only:$XBD2, index:$M3),
2224*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$V1, $XBD2, $M3",
2225*9880d681SAndroid Build Coastguard Worker           [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V1src),
2226*9880d681SAndroid Build Coastguard Worker                                               bdxaddr12only:$XBD2,
2227*9880d681SAndroid Build Coastguard Worker                                               index:$M3)))]> {
2228*9880d681SAndroid Build Coastguard Worker  let Constraints = "$V1 = $V1src";
2229*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$V1src";
2230*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2231*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
2232*9880d681SAndroid Build Coastguard Worker}
2233*9880d681SAndroid Build Coastguard Worker
2234*9880d681SAndroid Build Coastguard Workerclass QuaternaryVRId<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2235*9880d681SAndroid Build Coastguard Worker                     TypedReg tr1, TypedReg tr2, bits<4> type>
2236*9880d681SAndroid Build Coastguard Worker  : InstVRId<opcode, (outs tr1.op:$V1),
2237*9880d681SAndroid Build Coastguard Worker             (ins tr2.op:$V1src, tr2.op:$V2, tr2.op:$V3, imm32zx8:$I4),
2238*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $V3, $I4",
2239*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V1src),
2240*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V2),
2241*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V3),
2242*9880d681SAndroid Build Coastguard Worker                                                 imm32zx8:$I4)))]> {
2243*9880d681SAndroid Build Coastguard Worker  let Constraints = "$V1 = $V1src";
2244*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$V1src";
2245*9880d681SAndroid Build Coastguard Worker  let M5 = type;
2246*9880d681SAndroid Build Coastguard Worker}
2247*9880d681SAndroid Build Coastguard Worker
2248*9880d681SAndroid Build Coastguard Workerclass QuaternaryVRRd<string mnemonic, bits<16> opcode,
2249*9880d681SAndroid Build Coastguard Worker                     SDPatternOperator operator, TypedReg tr1, TypedReg tr2,
2250*9880d681SAndroid Build Coastguard Worker                     bits<4> type, SDPatternOperator m6mask, bits<4> m6or>
2251*9880d681SAndroid Build Coastguard Worker  : InstVRRd<opcode, (outs tr1.op:$V1),
2252*9880d681SAndroid Build Coastguard Worker             (ins tr2.op:$V2, tr2.op:$V3, tr2.op:$V4, m6mask:$M6),
2253*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$V1, $V2, $V3, $V4, $M6",
2254*9880d681SAndroid Build Coastguard Worker             [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2),
2255*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V3),
2256*9880d681SAndroid Build Coastguard Worker                                                 (tr2.vt tr2.op:$V4),
2257*9880d681SAndroid Build Coastguard Worker                                                 m6mask:$M6)))],
2258*9880d681SAndroid Build Coastguard Worker             m6or> {
2259*9880d681SAndroid Build Coastguard Worker  let M5 = type;
2260*9880d681SAndroid Build Coastguard Worker}
2261*9880d681SAndroid Build Coastguard Worker
2262*9880d681SAndroid Build Coastguard Workermulticlass QuaternaryVRRdSPair<string mnemonic, bits<16> opcode,
2263*9880d681SAndroid Build Coastguard Worker                               SDPatternOperator operator,
2264*9880d681SAndroid Build Coastguard Worker                               SDPatternOperator operator_cc, TypedReg tr1,
2265*9880d681SAndroid Build Coastguard Worker                               TypedReg tr2, bits<4> type, bits<4> m6or> {
2266*9880d681SAndroid Build Coastguard Worker  def "" : QuaternaryVRRd<mnemonic, opcode, operator, tr1, tr2, type,
2267*9880d681SAndroid Build Coastguard Worker                          imm32zx4even, !and (m6or, 14)>;
2268*9880d681SAndroid Build Coastguard Worker  def : InstAlias<mnemonic#"\t$V1, $V2, $V3, $V4",
2269*9880d681SAndroid Build Coastguard Worker                  (!cast<Instruction>(NAME) tr1.op:$V1, tr2.op:$V2,
2270*9880d681SAndroid Build Coastguard Worker                                            tr2.op:$V3, tr2.op:$V4, 0)>;
2271*9880d681SAndroid Build Coastguard Worker  let Defs = [CC] in
2272*9880d681SAndroid Build Coastguard Worker    def S : QuaternaryVRRd<mnemonic##"s", opcode, operator_cc, tr1, tr2, type,
2273*9880d681SAndroid Build Coastguard Worker                           imm32zx4even, !add (!and (m6or, 14), 1)>;
2274*9880d681SAndroid Build Coastguard Worker  def : InstAlias<mnemonic#"s\t$V1, $V2, $V3, $V4",
2275*9880d681SAndroid Build Coastguard Worker                  (!cast<Instruction>(NAME#"S") tr1.op:$V1, tr2.op:$V2,
2276*9880d681SAndroid Build Coastguard Worker                                                tr2.op:$V3, tr2.op:$V4, 0)>;
2277*9880d681SAndroid Build Coastguard Worker}
2278*9880d681SAndroid Build Coastguard Worker
2279*9880d681SAndroid Build Coastguard Workerclass LoadAndOpRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2280*9880d681SAndroid Build Coastguard Worker                  RegisterOperand cls, AddressingMode mode = bdaddr20only>
2281*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs cls:$R1), (ins cls:$R3, mode:$BD2),
2282*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $R3, $BD2",
2283*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator mode:$BD2, cls:$R3))]> {
2284*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2285*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
2286*9880d681SAndroid Build Coastguard Worker}
2287*9880d681SAndroid Build Coastguard Worker
2288*9880d681SAndroid Build Coastguard Workerclass CmpSwapRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
2289*9880d681SAndroid Build Coastguard Worker                RegisterOperand cls, AddressingMode mode = bdaddr12only>
2290*9880d681SAndroid Build Coastguard Worker  : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
2291*9880d681SAndroid Build Coastguard Worker           mnemonic#"\t$R1, $R3, $BD2",
2292*9880d681SAndroid Build Coastguard Worker           [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
2293*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2294*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
2295*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2296*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
2297*9880d681SAndroid Build Coastguard Worker}
2298*9880d681SAndroid Build Coastguard Worker
2299*9880d681SAndroid Build Coastguard Workerclass CmpSwapRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
2300*9880d681SAndroid Build Coastguard Worker                 RegisterOperand cls, AddressingMode mode = bdaddr20only>
2301*9880d681SAndroid Build Coastguard Worker  : InstRSY<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
2302*9880d681SAndroid Build Coastguard Worker            mnemonic#"\t$R1, $R3, $BD2",
2303*9880d681SAndroid Build Coastguard Worker            [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
2304*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2305*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
2306*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2307*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
2308*9880d681SAndroid Build Coastguard Worker}
2309*9880d681SAndroid Build Coastguard Worker
2310*9880d681SAndroid Build Coastguard Workermulticlass CmpSwapRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode,
2311*9880d681SAndroid Build Coastguard Worker                         SDPatternOperator operator, RegisterOperand cls> {
2312*9880d681SAndroid Build Coastguard Worker  let DispKey = mnemonic ## #cls in {
2313*9880d681SAndroid Build Coastguard Worker    let DispSize = "12" in
2314*9880d681SAndroid Build Coastguard Worker      def "" : CmpSwapRS<mnemonic, rsOpcode, operator, cls, bdaddr12pair>;
2315*9880d681SAndroid Build Coastguard Worker    let DispSize = "20" in
2316*9880d681SAndroid Build Coastguard Worker      def Y  : CmpSwapRSY<mnemonic#"y", rsyOpcode, operator, cls, bdaddr20pair>;
2317*9880d681SAndroid Build Coastguard Worker  }
2318*9880d681SAndroid Build Coastguard Worker}
2319*9880d681SAndroid Build Coastguard Worker
2320*9880d681SAndroid Build Coastguard Workerclass RotateSelectRIEf<string mnemonic, bits<16> opcode, RegisterOperand cls1,
2321*9880d681SAndroid Build Coastguard Worker                       RegisterOperand cls2>
2322*9880d681SAndroid Build Coastguard Worker  : InstRIEf<opcode, (outs cls1:$R1),
2323*9880d681SAndroid Build Coastguard Worker             (ins cls1:$R1src, cls2:$R2, imm32zx8:$I3, imm32zx8:$I4,
2324*9880d681SAndroid Build Coastguard Worker                  imm32zx6:$I5),
2325*9880d681SAndroid Build Coastguard Worker             mnemonic#"\t$R1, $R2, $I3, $I4, $I5", []> {
2326*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2327*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
2328*9880d681SAndroid Build Coastguard Worker}
2329*9880d681SAndroid Build Coastguard Worker
2330*9880d681SAndroid Build Coastguard Workerclass PrefetchRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator>
2331*9880d681SAndroid Build Coastguard Worker  : InstRXY<opcode, (outs), (ins imm32zx4:$R1, bdxaddr20only:$XBD2),
2332*9880d681SAndroid Build Coastguard Worker            mnemonic##"\t$R1, $XBD2",
2333*9880d681SAndroid Build Coastguard Worker            [(operator imm32zx4:$R1, bdxaddr20only:$XBD2)]>;
2334*9880d681SAndroid Build Coastguard Worker
2335*9880d681SAndroid Build Coastguard Workerclass PrefetchRILPC<string mnemonic, bits<12> opcode,
2336*9880d681SAndroid Build Coastguard Worker                    SDPatternOperator operator>
2337*9880d681SAndroid Build Coastguard Worker  : InstRIL<opcode, (outs), (ins imm32zx4:$R1, pcrel32:$I2),
2338*9880d681SAndroid Build Coastguard Worker            mnemonic##"\t$R1, $I2",
2339*9880d681SAndroid Build Coastguard Worker            [(operator imm32zx4:$R1, pcrel32:$I2)]> {
2340*9880d681SAndroid Build Coastguard Worker  // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
2341*9880d681SAndroid Build Coastguard Worker  // However, BDXs have two extra operands and are therefore 6 units more
2342*9880d681SAndroid Build Coastguard Worker  // complex.
2343*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = 7;
2344*9880d681SAndroid Build Coastguard Worker}
2345*9880d681SAndroid Build Coastguard Worker
2346*9880d681SAndroid Build Coastguard Worker// A floating-point load-and test operation.  Create both a normal unary
2347*9880d681SAndroid Build Coastguard Worker// operation and one that acts as a comparison against zero.
2348*9880d681SAndroid Build Coastguard Worker// Note that the comparison against zero operation is not available if we
2349*9880d681SAndroid Build Coastguard Worker// have vector support, since load-and-test instructions will partially
2350*9880d681SAndroid Build Coastguard Worker// clobber the target (vector) register.
2351*9880d681SAndroid Build Coastguard Workermulticlass LoadAndTestRRE<string mnemonic, bits<16> opcode,
2352*9880d681SAndroid Build Coastguard Worker                          RegisterOperand cls> {
2353*9880d681SAndroid Build Coastguard Worker  def "" : UnaryRRE<mnemonic, opcode, null_frag, cls, cls>;
2354*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1, Predicates = [FeatureNoVector] in
2355*9880d681SAndroid Build Coastguard Worker    def Compare : CompareRRE<mnemonic, opcode, null_frag, cls, cls>;
2356*9880d681SAndroid Build Coastguard Worker}
2357*9880d681SAndroid Build Coastguard Worker
2358*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2359*9880d681SAndroid Build Coastguard Worker// Pseudo instructions
2360*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2361*9880d681SAndroid Build Coastguard Worker//
2362*9880d681SAndroid Build Coastguard Worker// Convenience instructions that get lowered to real instructions
2363*9880d681SAndroid Build Coastguard Worker// by either SystemZTargetLowering::EmitInstrWithCustomInserter()
2364*9880d681SAndroid Build Coastguard Worker// or SystemZInstrInfo::expandPostRAPseudo().
2365*9880d681SAndroid Build Coastguard Worker//
2366*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2367*9880d681SAndroid Build Coastguard Worker
2368*9880d681SAndroid Build Coastguard Workerclass Pseudo<dag outs, dag ins, list<dag> pattern>
2369*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<0, outs, ins, "", pattern> {
2370*9880d681SAndroid Build Coastguard Worker  let isPseudo = 1;
2371*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1;
2372*9880d681SAndroid Build Coastguard Worker}
2373*9880d681SAndroid Build Coastguard Worker
2374*9880d681SAndroid Build Coastguard Worker// Like UnaryRI, but expanded after RA depending on the choice of register.
2375*9880d681SAndroid Build Coastguard Workerclass UnaryRIPseudo<SDPatternOperator operator, RegisterOperand cls,
2376*9880d681SAndroid Build Coastguard Worker                    Immediate imm>
2377*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs cls:$R1), (ins imm:$I2),
2378*9880d681SAndroid Build Coastguard Worker           [(set cls:$R1, (operator imm:$I2))]>;
2379*9880d681SAndroid Build Coastguard Worker
2380*9880d681SAndroid Build Coastguard Worker// Like UnaryRXY, but expanded after RA depending on the choice of register.
2381*9880d681SAndroid Build Coastguard Workerclass UnaryRXYPseudo<string key, SDPatternOperator operator,
2382*9880d681SAndroid Build Coastguard Worker                     RegisterOperand cls, bits<5> bytes,
2383*9880d681SAndroid Build Coastguard Worker                     AddressingMode mode = bdxaddr20only>
2384*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs cls:$R1), (ins mode:$XBD2),
2385*9880d681SAndroid Build Coastguard Worker           [(set cls:$R1, (operator mode:$XBD2))]> {
2386*9880d681SAndroid Build Coastguard Worker  let OpKey = key ## cls;
2387*9880d681SAndroid Build Coastguard Worker  let OpType = "mem";
2388*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2389*9880d681SAndroid Build Coastguard Worker  let Has20BitOffset = 1;
2390*9880d681SAndroid Build Coastguard Worker  let HasIndex = 1;
2391*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
2392*9880d681SAndroid Build Coastguard Worker}
2393*9880d681SAndroid Build Coastguard Worker
2394*9880d681SAndroid Build Coastguard Worker// Like UnaryRR, but expanded after RA depending on the choice of registers.
2395*9880d681SAndroid Build Coastguard Workerclass UnaryRRPseudo<string key, SDPatternOperator operator,
2396*9880d681SAndroid Build Coastguard Worker                    RegisterOperand cls1, RegisterOperand cls2>
2397*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs cls1:$R1), (ins cls2:$R2),
2398*9880d681SAndroid Build Coastguard Worker           [(set cls1:$R1, (operator cls2:$R2))]> {
2399*9880d681SAndroid Build Coastguard Worker  let OpKey = key ## cls1;
2400*9880d681SAndroid Build Coastguard Worker  let OpType = "reg";
2401*9880d681SAndroid Build Coastguard Worker}
2402*9880d681SAndroid Build Coastguard Worker
2403*9880d681SAndroid Build Coastguard Worker// Like BinaryRI, but expanded after RA depending on the choice of register.
2404*9880d681SAndroid Build Coastguard Workerclass BinaryRIPseudo<SDPatternOperator operator, RegisterOperand cls,
2405*9880d681SAndroid Build Coastguard Worker                     Immediate imm>
2406*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs cls:$R1), (ins cls:$R1src, imm:$I2),
2407*9880d681SAndroid Build Coastguard Worker           [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
2408*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2409*9880d681SAndroid Build Coastguard Worker}
2410*9880d681SAndroid Build Coastguard Worker
2411*9880d681SAndroid Build Coastguard Worker// Like BinaryRIE, but expanded after RA depending on the choice of register.
2412*9880d681SAndroid Build Coastguard Workerclass BinaryRIEPseudo<SDPatternOperator operator, RegisterOperand cls,
2413*9880d681SAndroid Build Coastguard Worker                      Immediate imm>
2414*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs cls:$R1), (ins cls:$R3, imm:$I2),
2415*9880d681SAndroid Build Coastguard Worker           [(set cls:$R1, (operator cls:$R3, imm:$I2))]>;
2416*9880d681SAndroid Build Coastguard Worker
2417*9880d681SAndroid Build Coastguard Worker// Like BinaryRIAndK, but expanded after RA depending on the choice of register.
2418*9880d681SAndroid Build Coastguard Workermulticlass BinaryRIAndKPseudo<string key, SDPatternOperator operator,
2419*9880d681SAndroid Build Coastguard Worker                              RegisterOperand cls, Immediate imm> {
2420*9880d681SAndroid Build Coastguard Worker  let NumOpsKey = key in {
2421*9880d681SAndroid Build Coastguard Worker    let NumOpsValue = "3" in
2422*9880d681SAndroid Build Coastguard Worker      def K : BinaryRIEPseudo<null_frag, cls, imm>,
2423*9880d681SAndroid Build Coastguard Worker              Requires<[FeatureHighWord, FeatureDistinctOps]>;
2424*9880d681SAndroid Build Coastguard Worker    let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
2425*9880d681SAndroid Build Coastguard Worker      def "" : BinaryRIPseudo<operator, cls, imm>,
2426*9880d681SAndroid Build Coastguard Worker               Requires<[FeatureHighWord]>;
2427*9880d681SAndroid Build Coastguard Worker  }
2428*9880d681SAndroid Build Coastguard Worker}
2429*9880d681SAndroid Build Coastguard Worker
2430*9880d681SAndroid Build Coastguard Worker// Like CompareRI, but expanded after RA depending on the choice of register.
2431*9880d681SAndroid Build Coastguard Workerclass CompareRIPseudo<SDPatternOperator operator, RegisterOperand cls,
2432*9880d681SAndroid Build Coastguard Worker                      Immediate imm>
2433*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs), (ins cls:$R1, imm:$I2), [(operator cls:$R1, imm:$I2)]>;
2434*9880d681SAndroid Build Coastguard Worker
2435*9880d681SAndroid Build Coastguard Worker// Like CompareRXY, but expanded after RA depending on the choice of register.
2436*9880d681SAndroid Build Coastguard Workerclass CompareRXYPseudo<SDPatternOperator operator, RegisterOperand cls,
2437*9880d681SAndroid Build Coastguard Worker                       SDPatternOperator load, bits<5> bytes,
2438*9880d681SAndroid Build Coastguard Worker                       AddressingMode mode = bdxaddr20only>
2439*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs), (ins cls:$R1, mode:$XBD2),
2440*9880d681SAndroid Build Coastguard Worker           [(operator cls:$R1, (load mode:$XBD2))]> {
2441*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2442*9880d681SAndroid Build Coastguard Worker  let Has20BitOffset = 1;
2443*9880d681SAndroid Build Coastguard Worker  let HasIndex = 1;
2444*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
2445*9880d681SAndroid Build Coastguard Worker}
2446*9880d681SAndroid Build Coastguard Worker
2447*9880d681SAndroid Build Coastguard Worker// Like StoreRXY, but expanded after RA depending on the choice of register.
2448*9880d681SAndroid Build Coastguard Workerclass StoreRXYPseudo<SDPatternOperator operator, RegisterOperand cls,
2449*9880d681SAndroid Build Coastguard Worker                     bits<5> bytes, AddressingMode mode = bdxaddr20only>
2450*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs), (ins cls:$R1, mode:$XBD2),
2451*9880d681SAndroid Build Coastguard Worker           [(operator cls:$R1, mode:$XBD2)]> {
2452*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
2453*9880d681SAndroid Build Coastguard Worker  let Has20BitOffset = 1;
2454*9880d681SAndroid Build Coastguard Worker  let HasIndex = 1;
2455*9880d681SAndroid Build Coastguard Worker  let AccessBytes = bytes;
2456*9880d681SAndroid Build Coastguard Worker}
2457*9880d681SAndroid Build Coastguard Worker
2458*9880d681SAndroid Build Coastguard Worker// Like RotateSelectRIEf, but expanded after RA depending on the choice
2459*9880d681SAndroid Build Coastguard Worker// of registers.
2460*9880d681SAndroid Build Coastguard Workerclass RotateSelectRIEfPseudo<RegisterOperand cls1, RegisterOperand cls2>
2461*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs cls1:$R1),
2462*9880d681SAndroid Build Coastguard Worker           (ins cls1:$R1src, cls2:$R2, imm32zx8:$I3, imm32zx8:$I4,
2463*9880d681SAndroid Build Coastguard Worker                imm32zx6:$I5),
2464*9880d681SAndroid Build Coastguard Worker           []> {
2465*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2466*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$R1src";
2467*9880d681SAndroid Build Coastguard Worker}
2468*9880d681SAndroid Build Coastguard Worker
2469*9880d681SAndroid Build Coastguard Worker// Implements "$dst = $cc & (8 >> CC) ? $src1 : $src2", where CC is
2470*9880d681SAndroid Build Coastguard Worker// the value of the PSW's 2-bit condition code field.
2471*9880d681SAndroid Build Coastguard Workerclass SelectWrapper<RegisterOperand cls>
2472*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs cls:$dst),
2473*9880d681SAndroid Build Coastguard Worker           (ins cls:$src1, cls:$src2, imm32zx4:$valid, imm32zx4:$cc),
2474*9880d681SAndroid Build Coastguard Worker           [(set cls:$dst, (z_select_ccmask cls:$src1, cls:$src2,
2475*9880d681SAndroid Build Coastguard Worker                                            imm32zx4:$valid, imm32zx4:$cc))]> {
2476*9880d681SAndroid Build Coastguard Worker  let usesCustomInserter = 1;
2477*9880d681SAndroid Build Coastguard Worker  // Although the instructions used by these nodes do not in themselves
2478*9880d681SAndroid Build Coastguard Worker  // change CC, the insertion requires new blocks, and CC cannot be live
2479*9880d681SAndroid Build Coastguard Worker  // across them.
2480*9880d681SAndroid Build Coastguard Worker  let Defs = [CC];
2481*9880d681SAndroid Build Coastguard Worker  let Uses = [CC];
2482*9880d681SAndroid Build Coastguard Worker}
2483*9880d681SAndroid Build Coastguard Worker
2484*9880d681SAndroid Build Coastguard Worker// Stores $new to $addr if $cc is true ("" case) or false (Inv case).
2485*9880d681SAndroid Build Coastguard Workermulticlass CondStores<RegisterOperand cls, SDPatternOperator store,
2486*9880d681SAndroid Build Coastguard Worker                      SDPatternOperator load, AddressingMode mode> {
2487*9880d681SAndroid Build Coastguard Worker  let Defs = [CC], Uses = [CC], usesCustomInserter = 1 in {
2488*9880d681SAndroid Build Coastguard Worker    def "" : Pseudo<(outs),
2489*9880d681SAndroid Build Coastguard Worker                    (ins cls:$new, mode:$addr, imm32zx4:$valid, imm32zx4:$cc),
2490*9880d681SAndroid Build Coastguard Worker                    [(store (z_select_ccmask cls:$new, (load mode:$addr),
2491*9880d681SAndroid Build Coastguard Worker                                             imm32zx4:$valid, imm32zx4:$cc),
2492*9880d681SAndroid Build Coastguard Worker                            mode:$addr)]>;
2493*9880d681SAndroid Build Coastguard Worker    def Inv : Pseudo<(outs),
2494*9880d681SAndroid Build Coastguard Worker                     (ins cls:$new, mode:$addr, imm32zx4:$valid, imm32zx4:$cc),
2495*9880d681SAndroid Build Coastguard Worker                     [(store (z_select_ccmask (load mode:$addr), cls:$new,
2496*9880d681SAndroid Build Coastguard Worker                                              imm32zx4:$valid, imm32zx4:$cc),
2497*9880d681SAndroid Build Coastguard Worker                              mode:$addr)]>;
2498*9880d681SAndroid Build Coastguard Worker  }
2499*9880d681SAndroid Build Coastguard Worker}
2500*9880d681SAndroid Build Coastguard Worker
2501*9880d681SAndroid Build Coastguard Worker// OPERATOR is ATOMIC_SWAP or an ATOMIC_LOAD_* operation.  PAT and OPERAND
2502*9880d681SAndroid Build Coastguard Worker// describe the second (non-memory) operand.
2503*9880d681SAndroid Build Coastguard Workerclass AtomicLoadBinary<SDPatternOperator operator, RegisterOperand cls,
2504*9880d681SAndroid Build Coastguard Worker                       dag pat, DAGOperand operand>
2505*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs cls:$dst), (ins bdaddr20only:$ptr, operand:$src2),
2506*9880d681SAndroid Build Coastguard Worker           [(set cls:$dst, (operator bdaddr20only:$ptr, pat))]> {
2507*9880d681SAndroid Build Coastguard Worker  let Defs = [CC];
2508*9880d681SAndroid Build Coastguard Worker  let Has20BitOffset = 1;
2509*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2510*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
2511*9880d681SAndroid Build Coastguard Worker  let usesCustomInserter = 1;
2512*9880d681SAndroid Build Coastguard Worker}
2513*9880d681SAndroid Build Coastguard Worker
2514*9880d681SAndroid Build Coastguard Worker// Specializations of AtomicLoadWBinary.
2515*9880d681SAndroid Build Coastguard Workerclass AtomicLoadBinaryReg32<SDPatternOperator operator>
2516*9880d681SAndroid Build Coastguard Worker  : AtomicLoadBinary<operator, GR32, (i32 GR32:$src2), GR32>;
2517*9880d681SAndroid Build Coastguard Workerclass AtomicLoadBinaryImm32<SDPatternOperator operator, Immediate imm>
2518*9880d681SAndroid Build Coastguard Worker  : AtomicLoadBinary<operator, GR32, (i32 imm:$src2), imm>;
2519*9880d681SAndroid Build Coastguard Workerclass AtomicLoadBinaryReg64<SDPatternOperator operator>
2520*9880d681SAndroid Build Coastguard Worker  : AtomicLoadBinary<operator, GR64, (i64 GR64:$src2), GR64>;
2521*9880d681SAndroid Build Coastguard Workerclass AtomicLoadBinaryImm64<SDPatternOperator operator, Immediate imm>
2522*9880d681SAndroid Build Coastguard Worker  : AtomicLoadBinary<operator, GR64, (i64 imm:$src2), imm>;
2523*9880d681SAndroid Build Coastguard Worker
2524*9880d681SAndroid Build Coastguard Worker// OPERATOR is ATOMIC_SWAPW or an ATOMIC_LOADW_* operation.  PAT and OPERAND
2525*9880d681SAndroid Build Coastguard Worker// describe the second (non-memory) operand.
2526*9880d681SAndroid Build Coastguard Workerclass AtomicLoadWBinary<SDPatternOperator operator, dag pat,
2527*9880d681SAndroid Build Coastguard Worker                        DAGOperand operand>
2528*9880d681SAndroid Build Coastguard Worker  : Pseudo<(outs GR32:$dst),
2529*9880d681SAndroid Build Coastguard Worker           (ins bdaddr20only:$ptr, operand:$src2, ADDR32:$bitshift,
2530*9880d681SAndroid Build Coastguard Worker                ADDR32:$negbitshift, uimm32:$bitsize),
2531*9880d681SAndroid Build Coastguard Worker           [(set GR32:$dst, (operator bdaddr20only:$ptr, pat, ADDR32:$bitshift,
2532*9880d681SAndroid Build Coastguard Worker                                      ADDR32:$negbitshift, uimm32:$bitsize))]> {
2533*9880d681SAndroid Build Coastguard Worker  let Defs = [CC];
2534*9880d681SAndroid Build Coastguard Worker  let Has20BitOffset = 1;
2535*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
2536*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
2537*9880d681SAndroid Build Coastguard Worker  let usesCustomInserter = 1;
2538*9880d681SAndroid Build Coastguard Worker}
2539*9880d681SAndroid Build Coastguard Worker
2540*9880d681SAndroid Build Coastguard Worker// Specializations of AtomicLoadWBinary.
2541*9880d681SAndroid Build Coastguard Workerclass AtomicLoadWBinaryReg<SDPatternOperator operator>
2542*9880d681SAndroid Build Coastguard Worker  : AtomicLoadWBinary<operator, (i32 GR32:$src2), GR32>;
2543*9880d681SAndroid Build Coastguard Workerclass AtomicLoadWBinaryImm<SDPatternOperator operator, Immediate imm>
2544*9880d681SAndroid Build Coastguard Worker  : AtomicLoadWBinary<operator, (i32 imm:$src2), imm>;
2545*9880d681SAndroid Build Coastguard Worker
2546*9880d681SAndroid Build Coastguard Worker// Define an instruction that operates on two fixed-length blocks of memory,
2547*9880d681SAndroid Build Coastguard Worker// and associated pseudo instructions for operating on blocks of any size.
2548*9880d681SAndroid Build Coastguard Worker// The Sequence form uses a straight-line sequence of instructions and
2549*9880d681SAndroid Build Coastguard Worker// the Loop form uses a loop of length-256 instructions followed by
2550*9880d681SAndroid Build Coastguard Worker// another instruction to handle the excess.
2551*9880d681SAndroid Build Coastguard Workermulticlass MemorySS<string mnemonic, bits<8> opcode,
2552*9880d681SAndroid Build Coastguard Worker                    SDPatternOperator sequence, SDPatternOperator loop> {
2553*9880d681SAndroid Build Coastguard Worker  def "" : InstSS<opcode, (outs), (ins bdladdr12onlylen8:$BDL1,
2554*9880d681SAndroid Build Coastguard Worker                                       bdaddr12only:$BD2),
2555*9880d681SAndroid Build Coastguard Worker                  mnemonic##"\t$BDL1, $BD2", []>;
2556*9880d681SAndroid Build Coastguard Worker  let usesCustomInserter = 1 in {
2557*9880d681SAndroid Build Coastguard Worker    def Sequence : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src,
2558*9880d681SAndroid Build Coastguard Worker                                       imm64:$length),
2559*9880d681SAndroid Build Coastguard Worker                           [(sequence bdaddr12only:$dest, bdaddr12only:$src,
2560*9880d681SAndroid Build Coastguard Worker                                      imm64:$length)]>;
2561*9880d681SAndroid Build Coastguard Worker    def Loop : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src,
2562*9880d681SAndroid Build Coastguard Worker                                   imm64:$length, GR64:$count256),
2563*9880d681SAndroid Build Coastguard Worker                      [(loop bdaddr12only:$dest, bdaddr12only:$src,
2564*9880d681SAndroid Build Coastguard Worker                             imm64:$length, GR64:$count256)]>;
2565*9880d681SAndroid Build Coastguard Worker  }
2566*9880d681SAndroid Build Coastguard Worker}
2567*9880d681SAndroid Build Coastguard Worker
2568*9880d681SAndroid Build Coastguard Worker// Define an instruction that operates on two strings, both terminated
2569*9880d681SAndroid Build Coastguard Worker// by the character in R0.  The instruction processes a CPU-determinated
2570*9880d681SAndroid Build Coastguard Worker// number of bytes at a time and sets CC to 3 if the instruction needs
2571*9880d681SAndroid Build Coastguard Worker// to be repeated.  Also define a pseudo instruction that represents
2572*9880d681SAndroid Build Coastguard Worker// the full loop (the main instruction plus the branch on CC==3).
2573*9880d681SAndroid Build Coastguard Workermulticlass StringRRE<string mnemonic, bits<16> opcode,
2574*9880d681SAndroid Build Coastguard Worker                     SDPatternOperator operator> {
2575*9880d681SAndroid Build Coastguard Worker  def "" : InstRRE<opcode, (outs GR64:$R1, GR64:$R2),
2576*9880d681SAndroid Build Coastguard Worker                   (ins GR64:$R1src, GR64:$R2src),
2577*9880d681SAndroid Build Coastguard Worker                   mnemonic#"\t$R1, $R2", []> {
2578*9880d681SAndroid Build Coastguard Worker    let Uses = [R0L];
2579*9880d681SAndroid Build Coastguard Worker    let Constraints = "$R1 = $R1src, $R2 = $R2src";
2580*9880d681SAndroid Build Coastguard Worker    let DisableEncoding = "$R1src, $R2src";
2581*9880d681SAndroid Build Coastguard Worker  }
2582*9880d681SAndroid Build Coastguard Worker  let usesCustomInserter = 1 in
2583*9880d681SAndroid Build Coastguard Worker    def Loop : Pseudo<(outs GR64:$end),
2584*9880d681SAndroid Build Coastguard Worker                      (ins GR64:$start1, GR64:$start2, GR32:$char),
2585*9880d681SAndroid Build Coastguard Worker                      [(set GR64:$end, (operator GR64:$start1, GR64:$start2,
2586*9880d681SAndroid Build Coastguard Worker                                                 GR32:$char))]>;
2587*9880d681SAndroid Build Coastguard Worker}
2588*9880d681SAndroid Build Coastguard Worker
2589*9880d681SAndroid Build Coastguard Worker// A pseudo instruction that is a direct alias of a real instruction.
2590*9880d681SAndroid Build Coastguard Worker// These aliases are used in cases where a particular register operand is
2591*9880d681SAndroid Build Coastguard Worker// fixed or where the same instruction is used with different register sizes.
2592*9880d681SAndroid Build Coastguard Worker// The size parameter is the size in bytes of the associated real instruction.
2593*9880d681SAndroid Build Coastguard Workerclass Alias<int size, dag outs, dag ins, list<dag> pattern>
2594*9880d681SAndroid Build Coastguard Worker  : InstSystemZ<size, outs, ins, "", pattern> {
2595*9880d681SAndroid Build Coastguard Worker  let isPseudo = 1;
2596*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1;
2597*9880d681SAndroid Build Coastguard Worker}
2598*9880d681SAndroid Build Coastguard Worker
2599*9880d681SAndroid Build Coastguard Workerclass UnaryAliasVRS<RegisterOperand cls1, RegisterOperand cls2>
2600*9880d681SAndroid Build Coastguard Worker : Alias<6, (outs cls1:$src1), (ins cls2:$src2), []>;
2601*9880d681SAndroid Build Coastguard Worker
2602*9880d681SAndroid Build Coastguard Worker// An alias of a UnaryVRR*, but with different register sizes.
2603*9880d681SAndroid Build Coastguard Workerclass UnaryAliasVRR<SDPatternOperator operator, TypedReg tr1, TypedReg tr2>
2604*9880d681SAndroid Build Coastguard Worker  : Alias<6, (outs tr1.op:$V1), (ins tr2.op:$V2),
2605*9880d681SAndroid Build Coastguard Worker          [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2))))]>;
2606*9880d681SAndroid Build Coastguard Worker
2607*9880d681SAndroid Build Coastguard Worker// An alias of a UnaryVRX, but with different register sizes.
2608*9880d681SAndroid Build Coastguard Workerclass UnaryAliasVRX<SDPatternOperator operator, TypedReg tr,
2609*9880d681SAndroid Build Coastguard Worker                    AddressingMode mode = bdxaddr12only>
2610*9880d681SAndroid Build Coastguard Worker  : Alias<6, (outs tr.op:$V1), (ins mode:$XBD2),
2611*9880d681SAndroid Build Coastguard Worker          [(set tr.op:$V1, (tr.vt (operator mode:$XBD2)))]>;
2612*9880d681SAndroid Build Coastguard Worker
2613*9880d681SAndroid Build Coastguard Worker// An alias of a StoreVRX, but with different register sizes.
2614*9880d681SAndroid Build Coastguard Workerclass StoreAliasVRX<SDPatternOperator operator, TypedReg tr,
2615*9880d681SAndroid Build Coastguard Worker                    AddressingMode mode = bdxaddr12only>
2616*9880d681SAndroid Build Coastguard Worker  : Alias<6, (outs), (ins tr.op:$V1, mode:$XBD2),
2617*9880d681SAndroid Build Coastguard Worker          [(operator (tr.vt tr.op:$V1), mode:$XBD2)]>;
2618*9880d681SAndroid Build Coastguard Worker
2619*9880d681SAndroid Build Coastguard Worker// An alias of a BinaryRI, but with different register sizes.
2620*9880d681SAndroid Build Coastguard Workerclass BinaryAliasRI<SDPatternOperator operator, RegisterOperand cls,
2621*9880d681SAndroid Build Coastguard Worker                    Immediate imm>
2622*9880d681SAndroid Build Coastguard Worker  : Alias<4, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
2623*9880d681SAndroid Build Coastguard Worker          [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
2624*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2625*9880d681SAndroid Build Coastguard Worker}
2626*9880d681SAndroid Build Coastguard Worker
2627*9880d681SAndroid Build Coastguard Worker// An alias of a BinaryRIL, but with different register sizes.
2628*9880d681SAndroid Build Coastguard Workerclass BinaryAliasRIL<SDPatternOperator operator, RegisterOperand cls,
2629*9880d681SAndroid Build Coastguard Worker                     Immediate imm>
2630*9880d681SAndroid Build Coastguard Worker  : Alias<6, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
2631*9880d681SAndroid Build Coastguard Worker          [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
2632*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2633*9880d681SAndroid Build Coastguard Worker}
2634*9880d681SAndroid Build Coastguard Worker
2635*9880d681SAndroid Build Coastguard Worker// An alias of a BinaryVRRf, but with different register sizes.
2636*9880d681SAndroid Build Coastguard Workerclass BinaryAliasVRRf<RegisterOperand cls>
2637*9880d681SAndroid Build Coastguard Worker  : Alias<6, (outs VR128:$V1), (ins cls:$R2, cls:$R3), []>;
2638*9880d681SAndroid Build Coastguard Worker
2639*9880d681SAndroid Build Coastguard Worker// An alias of a CompareRI, but with different register sizes.
2640*9880d681SAndroid Build Coastguard Workerclass CompareAliasRI<SDPatternOperator operator, RegisterOperand cls,
2641*9880d681SAndroid Build Coastguard Worker                     Immediate imm>
2642*9880d681SAndroid Build Coastguard Worker  : Alias<4, (outs), (ins cls:$R1, imm:$I2), [(operator cls:$R1, imm:$I2)]> {
2643*9880d681SAndroid Build Coastguard Worker  let isCompare = 1;
2644*9880d681SAndroid Build Coastguard Worker}
2645*9880d681SAndroid Build Coastguard Worker
2646*9880d681SAndroid Build Coastguard Worker// An alias of a RotateSelectRIEf, but with different register sizes.
2647*9880d681SAndroid Build Coastguard Workerclass RotateSelectAliasRIEf<RegisterOperand cls1, RegisterOperand cls2>
2648*9880d681SAndroid Build Coastguard Worker  : Alias<6, (outs cls1:$R1),
2649*9880d681SAndroid Build Coastguard Worker          (ins cls1:$R1src, cls2:$R2, imm32zx8:$I3, imm32zx8:$I4,
2650*9880d681SAndroid Build Coastguard Worker               imm32zx6:$I5), []> {
2651*9880d681SAndroid Build Coastguard Worker  let Constraints = "$R1 = $R1src";
2652*9880d681SAndroid Build Coastguard Worker}
2653