blob: b92c350fdd895a1a51828f1199172921894eca81 [file] [log] [blame]
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001//==- SystemZInstrFormats.td - SystemZ Instruction Formats --*- tablegen -*-==//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10//===----------------------------------------------------------------------===//
11// Basic SystemZ instruction definition
12//===----------------------------------------------------------------------===//
13
14class InstSystemZ<int size, dag outs, dag ins, string asmstr,
15 list<dag> pattern> : Instruction {
16 let Namespace = "SystemZ";
17
18 dag OutOperandList = outs;
19 dag InOperandList = ins;
20 let Size = size;
21 let Pattern = pattern;
22 let AsmString = asmstr;
23
Richard Sandiforddf313ff2013-07-03 09:19:58 +000024 // Some instructions come in pairs, one having a 12-bit displacement
25 // and the other having a 20-bit displacement. Both instructions in
26 // the pair have the same DispKey and their DispSizes are "12" and "20"
27 // respectively.
28 string DispKey = "";
29 string DispSize = "none";
Ulrich Weigand5f613df2013-05-06 16:15:19 +000030
Richard Sandiforded1fab62013-07-03 10:10:02 +000031 // Many register-based <INSN>R instructions have a memory-based <INSN>
32 // counterpart. OpKey uniquely identifies <INSN>, while OpType is
33 // "reg" for <INSN>R and "mem" for <INSN>.
34 string OpKey = "";
35 string OpType = "none";
36
Richard Sandifordff6c5a52013-07-19 16:12:08 +000037 // Many distinct-operands instructions have older 2-operand equivalents.
38 // NumOpsKey uniquely identifies one of these 2-operand and 3-operand pairs,
39 // with NumOpsValue being "2" or "3" as appropriate.
40 string NumOpsKey = "";
41 string NumOpsValue = "none";
42
Ulrich Weigand5f613df2013-05-06 16:15:19 +000043 // True if this instruction is a simple D(X,B) load of a register
44 // (with no sign or zero extension).
45 bit SimpleBDXLoad = 0;
46
47 // True if this instruction is a simple D(X,B) store of a register
48 // (with no truncation).
49 bit SimpleBDXStore = 0;
50
51 // True if this instruction has a 20-bit displacement field.
52 bit Has20BitOffset = 0;
53
54 // True if addresses in this instruction have an index register.
55 bit HasIndex = 0;
56
57 // True if this is a 128-bit pseudo instruction that combines two 64-bit
58 // operations.
59 bit Is128Bit = 0;
60
Richard Sandiforded1fab62013-07-03 10:10:02 +000061 // The access size of all memory operands in bytes, or 0 if not known.
62 bits<5> AccessBytes = 0;
63
Ulrich Weigand5f613df2013-05-06 16:15:19 +000064 let TSFlags{0} = SimpleBDXLoad;
65 let TSFlags{1} = SimpleBDXStore;
66 let TSFlags{2} = Has20BitOffset;
67 let TSFlags{3} = HasIndex;
68 let TSFlags{4} = Is128Bit;
Richard Sandiforded1fab62013-07-03 10:10:02 +000069 let TSFlags{9-5} = AccessBytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +000070}
71
72//===----------------------------------------------------------------------===//
73// Mappings between instructions
74//===----------------------------------------------------------------------===//
75
76// Return the version of an instruction that has an unsigned 12-bit
77// displacement.
78def getDisp12Opcode : InstrMapping {
79 let FilterClass = "InstSystemZ";
Richard Sandiforddf313ff2013-07-03 09:19:58 +000080 let RowFields = ["DispKey"];
81 let ColFields = ["DispSize"];
Ulrich Weigand5f613df2013-05-06 16:15:19 +000082 let KeyCol = ["20"];
83 let ValueCols = [["12"]];
84}
85
86// Return the version of an instruction that has a signed 20-bit displacement.
87def getDisp20Opcode : InstrMapping {
88 let FilterClass = "InstSystemZ";
Richard Sandiforddf313ff2013-07-03 09:19:58 +000089 let RowFields = ["DispKey"];
90 let ColFields = ["DispSize"];
Ulrich Weigand5f613df2013-05-06 16:15:19 +000091 let KeyCol = ["12"];
92 let ValueCols = [["20"]];
93}
94
Richard Sandifordff6c5a52013-07-19 16:12:08 +000095// Return the memory form of a register instruction.
Richard Sandiforded1fab62013-07-03 10:10:02 +000096def getMemOpcode : InstrMapping {
97 let FilterClass = "InstSystemZ";
98 let RowFields = ["OpKey"];
99 let ColFields = ["OpType"];
100 let KeyCol = ["reg"];
101 let ValueCols = [["mem"]];
102}
103
Richard Sandifordff6c5a52013-07-19 16:12:08 +0000104// Return the 3-operand form of a 2-operand instruction.
105def getThreeOperandOpcode : InstrMapping {
106 let FilterClass = "InstSystemZ";
107 let RowFields = ["NumOpsKey"];
108 let ColFields = ["NumOpsValue"];
109 let KeyCol = ["2"];
110 let ValueCols = [["3"]];
111}
112
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000113//===----------------------------------------------------------------------===//
114// Instruction formats
115//===----------------------------------------------------------------------===//
116//
117// Formats are specified using operand field declarations of the form:
118//
Richard Sandifordd454ec02013-05-14 09:28:21 +0000119// bits<4> Rn : register input or output for operand n
120// bits<m> In : immediate value of width m for operand n
121// bits<4> BDn : address operand n, which has a base and a displacement
122// bits<m> XBDn : address operand n, which has an index, a base and a
123// displacement
124// bits<4> Xn : index register for address operand n
125// bits<4> Mn : mode value for operand n
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000126//
Richard Sandifordd454ec02013-05-14 09:28:21 +0000127// The operand numbers ("n" in the list above) follow the architecture manual.
128// Assembly operands sometimes have a different order; in particular, R3 often
129// is often written between operands 1 and 2.
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000130//
131//===----------------------------------------------------------------------===//
132
133class InstRI<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
134 : InstSystemZ<4, outs, ins, asmstr, pattern> {
135 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000136 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000137
138 bits<4> R1;
139 bits<16> I2;
140
141 let Inst{31-24} = op{11-4};
142 let Inst{23-20} = R1;
143 let Inst{19-16} = op{3-0};
144 let Inst{15-0} = I2;
145}
146
Richard Sandiford0fb90ab2013-05-28 10:41:11 +0000147class InstRIEb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
148 : InstSystemZ<6, outs, ins, asmstr, pattern> {
149 field bits<48> Inst;
150 field bits<48> SoftFail = 0;
151
152 bits<4> R1;
153 bits<4> R2;
154 bits<4> M3;
155 bits<16> RI4;
156
157 let Inst{47-40} = op{15-8};
158 let Inst{39-36} = R1;
159 let Inst{35-32} = R2;
160 let Inst{31-16} = RI4;
161 let Inst{15-12} = M3;
162 let Inst{11-8} = 0;
163 let Inst{7-0} = op{7-0};
164}
165
Richard Sandiforde1d9f002013-05-29 11:58:52 +0000166class InstRIEc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
167 : InstSystemZ<6, outs, ins, asmstr, pattern> {
168 field bits<48> Inst;
169 field bits<48> SoftFail = 0;
170
171 bits<4> R1;
172 bits<8> I2;
173 bits<4> M3;
174 bits<16> RI4;
175
176 let Inst{47-40} = op{15-8};
177 let Inst{39-36} = R1;
178 let Inst{35-32} = M3;
179 let Inst{31-16} = RI4;
180 let Inst{15-8} = I2;
181 let Inst{7-0} = op{7-0};
182}
183
Richard Sandiford7d6a4532013-07-19 16:32:12 +0000184class InstRIEd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
185 : InstSystemZ<6, outs, ins, asmstr, pattern> {
186 field bits<48> Inst;
187 field bits<48> SoftFail = 0;
188
189 bits<4> R1;
190 bits<4> R3;
191 bits<16> I2;
192
193 let Inst{47-40} = op{15-8};
194 let Inst{39-36} = R1;
195 let Inst{35-32} = R3;
196 let Inst{31-16} = I2;
197 let Inst{15-8} = 0;
198 let Inst{7-0} = op{7-0};
199}
200
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000201class InstRIEf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
202 : InstSystemZ<6, outs, ins, asmstr, pattern> {
203 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000204 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000205
206 bits<4> R1;
207 bits<4> R2;
208 bits<8> I3;
209 bits<8> I4;
210 bits<8> I5;
211
212 let Inst{47-40} = op{15-8};
213 let Inst{39-36} = R1;
214 let Inst{35-32} = R2;
215 let Inst{31-24} = I3;
216 let Inst{23-16} = I4;
217 let Inst{15-8} = I5;
218 let Inst{7-0} = op{7-0};
219}
220
221class InstRIL<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
222 : InstSystemZ<6, outs, ins, asmstr, pattern> {
223 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000224 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000225
226 bits<4> R1;
227 bits<32> I2;
228
229 let Inst{47-40} = op{11-4};
230 let Inst{39-36} = R1;
231 let Inst{35-32} = op{3-0};
232 let Inst{31-0} = I2;
233}
234
235class InstRR<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
236 : InstSystemZ<2, outs, ins, asmstr, pattern> {
237 field bits<16> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000238 field bits<16> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000239
240 bits<4> R1;
241 bits<4> R2;
242
243 let Inst{15-8} = op;
244 let Inst{7-4} = R1;
245 let Inst{3-0} = R2;
246}
247
248class InstRRD<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
249 : InstSystemZ<4, outs, ins, asmstr, pattern> {
250 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000251 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000252
253 bits<4> R1;
254 bits<4> R3;
255 bits<4> R2;
256
257 let Inst{31-16} = op;
258 let Inst{15-12} = R1;
259 let Inst{11-8} = 0;
260 let Inst{7-4} = R3;
261 let Inst{3-0} = R2;
262}
263
264class InstRRE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
265 : InstSystemZ<4, outs, ins, asmstr, pattern> {
266 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000267 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000268
269 bits<4> R1;
270 bits<4> R2;
271
272 let Inst{31-16} = op;
273 let Inst{15-8} = 0;
274 let Inst{7-4} = R1;
275 let Inst{3-0} = R2;
276}
277
278class InstRRF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
279 : InstSystemZ<4, outs, ins, asmstr, pattern> {
280 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000281 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000282
283 bits<4> R1;
284 bits<4> R2;
285 bits<4> R3;
286
287 let Inst{31-16} = op;
288 let Inst{15-12} = R3;
289 let Inst{11-8} = 0;
290 let Inst{7-4} = R1;
291 let Inst{3-0} = R2;
292}
293
294class InstRX<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
295 : InstSystemZ<4, outs, ins, asmstr, pattern> {
296 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000297 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000298
299 bits<4> R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000300 bits<20> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000301
302 let Inst{31-24} = op;
303 let Inst{23-20} = R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000304 let Inst{19-0} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000305
306 let HasIndex = 1;
307}
308
309class InstRXE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
310 : InstSystemZ<6, outs, ins, asmstr, pattern> {
311 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000312 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000313
314 bits<4> R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000315 bits<20> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000316
317 let Inst{47-40} = op{15-8};
318 let Inst{39-36} = R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000319 let Inst{35-16} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000320 let Inst{15-8} = 0;
321 let Inst{7-0} = op{7-0};
322
323 let HasIndex = 1;
324}
325
326class InstRXF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
327 : InstSystemZ<6, outs, ins, asmstr, pattern> {
328 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000329 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000330
331 bits<4> R1;
332 bits<4> R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000333 bits<20> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000334
335 let Inst{47-40} = op{15-8};
336 let Inst{39-36} = R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000337 let Inst{35-16} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000338 let Inst{15-12} = R1;
339 let Inst{11-8} = 0;
340 let Inst{7-0} = op{7-0};
341
342 let HasIndex = 1;
343}
344
345class InstRXY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
346 : InstSystemZ<6, outs, ins, asmstr, pattern> {
347 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000348 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000349
350 bits<4> R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000351 bits<28> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000352
353 let Inst{47-40} = op{15-8};
354 let Inst{39-36} = R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000355 let Inst{35-8} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000356 let Inst{7-0} = op{7-0};
357
358 let Has20BitOffset = 1;
359 let HasIndex = 1;
360}
361
362class InstRS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
363 : InstSystemZ<4, outs, ins, asmstr, pattern> {
364 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000365 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000366
367 bits<4> R1;
368 bits<4> R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000369 bits<16> BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000370
371 let Inst{31-24} = op;
372 let Inst{23-20} = R1;
373 let Inst{19-16} = R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000374 let Inst{15-0} = BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000375}
376
377class InstRSY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
378 : InstSystemZ<6, outs, ins, asmstr, pattern> {
379 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000380 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000381
382 bits<4> R1;
383 bits<4> R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000384 bits<24> BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000385
386 let Inst{47-40} = op{15-8};
387 let Inst{39-36} = R1;
388 let Inst{35-32} = R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000389 let Inst{31-8} = BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000390 let Inst{7-0} = op{7-0};
391
392 let Has20BitOffset = 1;
393}
394
395class InstSI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
396 : InstSystemZ<4, outs, ins, asmstr, pattern> {
397 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000398 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000399
Richard Sandifordd454ec02013-05-14 09:28:21 +0000400 bits<16> BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000401 bits<8> I2;
402
403 let Inst{31-24} = op;
404 let Inst{23-16} = I2;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000405 let Inst{15-0} = BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000406}
407
408class InstSIL<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
409 : InstSystemZ<6, outs, ins, asmstr, pattern> {
410 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000411 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000412
Richard Sandifordd454ec02013-05-14 09:28:21 +0000413 bits<16> BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000414 bits<16> I2;
415
416 let Inst{47-32} = op;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000417 let Inst{31-16} = BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000418 let Inst{15-0} = I2;
419}
420
421class InstSIY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
422 : InstSystemZ<6, outs, ins, asmstr, pattern> {
423 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000424 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000425
Richard Sandifordd454ec02013-05-14 09:28:21 +0000426 bits<24> BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000427 bits<8> I2;
428
429 let Inst{47-40} = op{15-8};
430 let Inst{39-32} = I2;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000431 let Inst{31-8} = BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000432 let Inst{7-0} = op{7-0};
433
434 let Has20BitOffset = 1;
435}
436
Richard Sandiford1d959002013-07-02 14:56:45 +0000437class InstSS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
438 : InstSystemZ<6, outs, ins, asmstr, pattern> {
439 field bits<48> Inst;
440 field bits<48> SoftFail = 0;
441
442 bits<24> BDL1;
443 bits<16> BD2;
444
445 let Inst{47-40} = op;
446 let Inst{39-16} = BDL1;
447 let Inst{15-0} = BD2;
448}
449
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000450//===----------------------------------------------------------------------===//
451// Instruction definitions with semantics
452//===----------------------------------------------------------------------===//
453//
Richard Sandiforda68e6f52013-07-25 08:57:02 +0000454// These classes have the form [Cond]<Category><Format>, where <Format> is one
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000455// of the formats defined above and where <Category> describes the inputs
Richard Sandiforda68e6f52013-07-25 08:57:02 +0000456// and outputs. "Cond" is used if the instruction is conditional,
457// in which case the 4-bit condition-code mask is added as a final operand.
458// <Category> can be one of:
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000459//
460// Inherent:
461// One register output operand and no input operands.
462//
463// Store:
464// One register or immediate input operand and one address input operand.
465// The instruction stores the first operand to the address.
466//
467// This category is used for both pure and truncating stores.
468//
469// LoadMultiple:
470// One address input operand and two explicit output operands.
471// The instruction loads a range of registers from the address,
472// with the explicit operands giving the first and last register
473// to load. Other loaded registers are added as implicit definitions.
474//
475// StoreMultiple:
476// Two explicit input register operands and an address operand.
477// The instruction stores a range of registers to the address,
478// with the explicit operands giving the first and last register
479// to store. Other stored registers are added as implicit uses.
480//
481// Unary:
482// One register output operand and one input operand. The input
483// operand may be a register, immediate or memory.
484//
485// Binary:
486// One register output operand and two input operands. The first
487// input operand is always a register and he second may be a register,
488// immediate or memory.
489//
490// Shift:
491// One register output operand and two input operands. The first
492// input operand is a register and the second has the same form as
493// an address (although it isn't actually used to address memory).
494//
495// Compare:
496// Two input operands. The first operand is always a register,
497// the second may be a register, immediate or memory.
498//
499// Ternary:
500// One register output operand and three register input operands.
501//
502// CmpSwap:
503// One output operand and three input operands. The first two
504// operands are registers and the third is an address. The instruction
505// both reads from and writes to the address.
506//
507// RotateSelect:
508// One output operand and five input operands. The first two operands
509// are registers and the other three are immediates.
510//
511// The format determines which input operands are tied to output operands,
512// and also determines the shape of any address operand.
513//
514// Multiclasses of the form <Category><Format>Pair define two instructions,
515// one with <Category><Format> and one with <Category><Format>Y. The name
516// of the first instruction has no suffix, the name of the second has
517// an extra "y".
518//
519//===----------------------------------------------------------------------===//
520
521class InherentRRE<string mnemonic, bits<16> opcode, RegisterOperand cls,
522 dag src>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000523 : InstRRE<opcode, (outs cls:$R1), (ins),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000524 mnemonic#"r\t$R1",
Richard Sandifordd454ec02013-05-14 09:28:21 +0000525 [(set cls:$R1, src)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000526 let R2 = 0;
527}
528
529class LoadMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000530 : InstRSY<opcode, (outs cls:$R1, cls:$R3), (ins bdaddr20only:$BD2),
531 mnemonic#"\t$R1, $R3, $BD2", []> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000532 let mayLoad = 1;
533}
534
535class StoreRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
536 RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000537 : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
538 mnemonic#"\t$R1, $I2",
539 [(operator cls:$R1, pcrel32:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000540 let mayStore = 1;
541 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
542 // However, BDXs have two extra operands and are therefore 6 units more
543 // complex.
544 let AddedComplexity = 7;
545}
546
547class StoreRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000548 RegisterOperand cls, bits<5> bytes,
549 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000550 : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
551 mnemonic#"\t$R1, $XBD2",
552 [(operator cls:$R1, mode:$XBD2)]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000553 let OpKey = mnemonic ## cls;
554 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000555 let mayStore = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000556 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000557}
558
559class StoreRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000560 RegisterOperand cls, bits<5> bytes,
561 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000562 : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
563 mnemonic#"\t$R1, $XBD2",
564 [(operator cls:$R1, mode:$XBD2)]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000565 let OpKey = mnemonic ## cls;
566 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000567 let mayStore = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000568 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000569}
570
571multiclass StoreRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000572 SDPatternOperator operator, RegisterOperand cls,
573 bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000574 let DispKey = mnemonic ## #cls in {
575 let DispSize = "12" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000576 def "" : StoreRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000577 let DispSize = "20" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000578 def Y : StoreRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
579 bdxaddr20pair>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000580 }
581}
582
583class StoreMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000584 : InstRSY<opcode, (outs), (ins cls:$R1, cls:$R3, bdaddr20only:$BD2),
585 mnemonic#"\t$R1, $R3, $BD2", []> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000586 let mayStore = 1;
587}
588
589class StoreSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
590 Immediate imm, AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000591 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
592 mnemonic#"\t$BD1, $I2",
593 [(operator imm:$I2, mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000594 let mayStore = 1;
595}
596
597class StoreSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
598 Immediate imm, AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000599 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
600 mnemonic#"\t$BD1, $I2",
601 [(operator imm:$I2, mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000602 let mayStore = 1;
603}
604
605class StoreSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
606 Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000607 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
608 mnemonic#"\t$BD1, $I2",
609 [(operator imm:$I2, bdaddr12only:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000610 let mayStore = 1;
611}
612
613multiclass StoreSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
614 SDPatternOperator operator, Immediate imm> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000615 let DispKey = mnemonic in {
616 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000617 def "" : StoreSI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000618 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000619 def Y : StoreSIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
620 }
621}
622
Richard Sandiforda68e6f52013-07-25 08:57:02 +0000623class CondStoreRSY<string mnemonic, bits<16> opcode,
624 RegisterOperand cls, bits<5> bytes,
625 AddressingMode mode = bdaddr20only>
626 : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2, cond4:$R3),
627 mnemonic#"$R3\t$R1, $BD2", []>,
628 Requires<[FeatureLoadStoreOnCond]> {
629 let mayStore = 1;
630 let AccessBytes = bytes;
631}
632
633// Like CondStoreRSY, but used for the raw assembly form. The condition-code
634// mask is the third operand rather than being part of the mnemonic.
635class AsmCondStoreRSY<string mnemonic, bits<16> opcode,
636 RegisterOperand cls, bits<5> bytes,
637 AddressingMode mode = bdaddr20only>
638 : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2, uimm8zx4:$R3),
639 mnemonic#"\t$R1, $BD2, $R3", []>,
640 Requires<[FeatureLoadStoreOnCond]> {
641 let mayStore = 1;
642 let AccessBytes = bytes;
643}
644
645// Like CondStoreRSY, but with a fixed CC mask.
646class FixedCondStoreRSY<string mnemonic, bits<16> opcode,
647 RegisterOperand cls, bits<4> ccmask, bits<5> bytes,
648 AddressingMode mode = bdaddr20only>
649 : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2),
650 mnemonic#"\t$R1, $BD2", []>,
651 Requires<[FeatureLoadStoreOnCond]> {
652 let mayStore = 1;
653 let AccessBytes = bytes;
654 let R3 = ccmask;
655}
656
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000657class UnaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
658 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000659 : InstRR<opcode, (outs cls1:$R1), (ins cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000660 mnemonic#"r\t$R1, $R2",
661 [(set cls1:$R1, (operator cls2:$R2))]> {
662 let OpKey = mnemonic ## cls1;
663 let OpType = "reg";
664}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000665
666class UnaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
667 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000668 : InstRRE<opcode, (outs cls1:$R1), (ins cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000669 mnemonic#"r\t$R1, $R2",
670 [(set cls1:$R1, (operator cls2:$R2))]> {
671 let OpKey = mnemonic ## cls1;
672 let OpType = "reg";
673}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000674
675class UnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
676 RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000677 : InstRRF<opcode, (outs cls1:$R1), (ins uimm8zx4:$R3, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000678 mnemonic#"r\t$R1, $R3, $R2", []> {
679 let OpKey = mnemonic ## cls1;
680 let OpType = "reg";
681}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000682
683class UnaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
684 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000685 : InstRI<opcode, (outs cls:$R1), (ins imm:$I2),
686 mnemonic#"\t$R1, $I2",
687 [(set cls:$R1, (operator imm:$I2))]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000688
689class UnaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
690 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000691 : InstRIL<opcode, (outs cls:$R1), (ins imm:$I2),
692 mnemonic#"\t$R1, $I2",
693 [(set cls:$R1, (operator imm:$I2))]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000694
695class UnaryRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
696 RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000697 : InstRIL<opcode, (outs cls:$R1), (ins pcrel32:$I2),
698 mnemonic#"\t$R1, $I2",
699 [(set cls:$R1, (operator pcrel32:$I2))]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000700 let mayLoad = 1;
701 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
702 // However, BDXs have two extra operands and are therefore 6 units more
703 // complex.
704 let AddedComplexity = 7;
705}
706
707class UnaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000708 RegisterOperand cls, bits<5> bytes,
709 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000710 : InstRX<opcode, (outs cls:$R1), (ins mode:$XBD2),
711 mnemonic#"\t$R1, $XBD2",
712 [(set cls:$R1, (operator mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000713 let OpKey = mnemonic ## cls;
714 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000715 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000716 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000717}
718
719class UnaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000720 RegisterOperand cls, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000721 : InstRXE<opcode, (outs cls:$R1), (ins bdxaddr12only:$XBD2),
722 mnemonic#"\t$R1, $XBD2",
723 [(set cls:$R1, (operator bdxaddr12only:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000724 let OpKey = mnemonic ## cls;
725 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000726 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000727 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000728}
729
730class UnaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000731 RegisterOperand cls, bits<5> bytes,
732 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000733 : InstRXY<opcode, (outs cls:$R1), (ins mode:$XBD2),
734 mnemonic#"\t$R1, $XBD2",
735 [(set cls:$R1, (operator mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000736 let OpKey = mnemonic ## cls;
737 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000738 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000739 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000740}
741
742multiclass UnaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000743 SDPatternOperator operator, RegisterOperand cls,
744 bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000745 let DispKey = mnemonic ## #cls in {
746 let DispSize = "12" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000747 def "" : UnaryRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000748 let DispSize = "20" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000749 def Y : UnaryRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
750 bdxaddr20pair>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000751 }
752}
753
754class BinaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
755 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000756 : InstRR<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000757 mnemonic#"r\t$R1, $R2",
Richard Sandifordd454ec02013-05-14 09:28:21 +0000758 [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000759 let OpKey = mnemonic ## cls1;
760 let OpType = "reg";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000761 let Constraints = "$R1 = $R1src";
762 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000763}
764
765class BinaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
766 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000767 : InstRRE<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000768 mnemonic#"r\t$R1, $R2",
Richard Sandifordd454ec02013-05-14 09:28:21 +0000769 [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000770 let OpKey = mnemonic ## cls1;
771 let OpType = "reg";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000772 let Constraints = "$R1 = $R1src";
773 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000774}
775
Richard Sandifordd454ec02013-05-14 09:28:21 +0000776class BinaryRRF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
777 RegisterOperand cls1, RegisterOperand cls2>
778 : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R3, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000779 mnemonic#"r\t$R1, $R3, $R2",
780 [(set cls1:$R1, (operator cls1:$R3, cls2:$R2))]> {
781 let OpKey = mnemonic ## cls1;
782 let OpType = "reg";
783}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000784
Richard Sandiford0175b4a2013-07-19 16:21:55 +0000785class BinaryRRFK<string mnemonic, bits<16> opcode, SDPatternOperator operator,
786 RegisterOperand cls1, RegisterOperand cls2>
787 : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R2, cls2:$R3),
788 mnemonic#"rk\t$R1, $R2, $R3",
789 [(set cls1:$R1, (operator cls1:$R2, cls2:$R3))]>;
790
791multiclass BinaryRRAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
792 SDPatternOperator operator, RegisterOperand cls1,
793 RegisterOperand cls2> {
794 let NumOpsKey = mnemonic in {
795 let NumOpsValue = "3" in
796 def K : BinaryRRFK<mnemonic, opcode2, null_frag, cls1, cls2>,
797 Requires<[FeatureDistinctOps]>;
798 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
799 def "" : BinaryRR<mnemonic, opcode1, operator, cls1, cls2>;
800 }
801}
802
Richard Sandifordc57e5862013-07-19 16:24:22 +0000803multiclass BinaryRREAndK<string mnemonic, bits<16> opcode1, bits<16> opcode2,
804 SDPatternOperator operator, RegisterOperand cls1,
805 RegisterOperand cls2> {
806 let NumOpsKey = mnemonic in {
807 let NumOpsValue = "3" in
808 def K : BinaryRRFK<mnemonic, opcode2, null_frag, cls1, cls2>,
809 Requires<[FeatureDistinctOps]>;
810 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
811 def "" : BinaryRRE<mnemonic, opcode1, operator, cls1, cls2>;
812 }
813}
814
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000815class BinaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
816 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000817 : InstRI<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
818 mnemonic#"\t$R1, $I2",
819 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
820 let Constraints = "$R1 = $R1src";
821 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000822}
823
Richard Sandiford7d6a4532013-07-19 16:32:12 +0000824class BinaryRIE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
825 RegisterOperand cls, Immediate imm>
826 : InstRIEd<opcode, (outs cls:$R1), (ins cls:$R3, imm:$I2),
827 mnemonic#"\t$R1, $R3, $I2",
828 [(set cls:$R1, (operator cls:$R3, imm:$I2))]>;
829
830multiclass BinaryRIAndK<string mnemonic, bits<12> opcode1, bits<16> opcode2,
831 SDPatternOperator operator, RegisterOperand cls,
832 Immediate imm> {
833 let NumOpsKey = mnemonic in {
834 let NumOpsValue = "3" in
835 def K : BinaryRIE<mnemonic##"k", opcode2, null_frag, cls, imm>,
836 Requires<[FeatureDistinctOps]>;
837 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
838 def "" : BinaryRI<mnemonic, opcode1, operator, cls, imm>;
839 }
840}
841
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000842class BinaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
843 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000844 : InstRIL<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
845 mnemonic#"\t$R1, $I2",
846 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
847 let Constraints = "$R1 = $R1src";
848 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000849}
850
851class BinaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000852 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000853 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000854 : InstRX<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
855 mnemonic#"\t$R1, $XBD2",
856 [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000857 let OpKey = mnemonic ## cls;
858 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000859 let Constraints = "$R1 = $R1src";
860 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000861 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000862 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000863}
864
865class BinaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000866 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000867 : InstRXE<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr12only:$XBD2),
868 mnemonic#"\t$R1, $XBD2",
869 [(set cls:$R1, (operator cls:$R1src,
870 (load bdxaddr12only:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000871 let OpKey = mnemonic ## cls;
872 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000873 let Constraints = "$R1 = $R1src";
874 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000875 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000876 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000877}
878
879class BinaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000880 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000881 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000882 : InstRXY<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
883 mnemonic#"\t$R1, $XBD2",
884 [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000885 let OpKey = mnemonic ## cls;
886 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000887 let Constraints = "$R1 = $R1src";
888 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000889 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000890 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000891}
892
893multiclass BinaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
894 SDPatternOperator operator, RegisterOperand cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000895 SDPatternOperator load, bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000896 let DispKey = mnemonic ## #cls in {
897 let DispSize = "12" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000898 def "" : BinaryRX<mnemonic, rxOpcode, operator, cls, load, bytes,
899 bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000900 let DispSize = "20" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000901 def Y : BinaryRXY<mnemonic#"y", rxyOpcode, operator, cls, load, bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000902 bdxaddr20pair>;
903 }
904}
905
906class BinarySI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
907 Operand imm, AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000908 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
909 mnemonic#"\t$BD1, $I2",
910 [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000911 let mayLoad = 1;
912 let mayStore = 1;
913}
914
915class BinarySIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
916 Operand imm, AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000917 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
918 mnemonic#"\t$BD1, $I2",
919 [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000920 let mayLoad = 1;
921 let mayStore = 1;
922}
923
924multiclass BinarySIPair<string mnemonic, bits<8> siOpcode,
925 bits<16> siyOpcode, SDPatternOperator operator,
926 Operand imm> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000927 let DispKey = mnemonic ## #cls in {
928 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000929 def "" : BinarySI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000930 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000931 def Y : BinarySIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
932 }
933}
934
935class ShiftRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000936 RegisterOperand cls>
937 : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, shift12only:$BD2),
Richard Sandifordd454ec02013-05-14 09:28:21 +0000938 mnemonic#"\t$R1, $BD2",
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000939 [(set cls:$R1, (operator cls:$R1src, shift12only:$BD2))]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000940 let R3 = 0;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000941 let Constraints = "$R1 = $R1src";
942 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000943}
944
945class ShiftRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000946 RegisterOperand cls>
947 : InstRSY<opcode, (outs cls:$R1), (ins cls:$R3, shift20only:$BD2),
Richard Sandifordd454ec02013-05-14 09:28:21 +0000948 mnemonic#"\t$R1, $R3, $BD2",
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000949 [(set cls:$R1, (operator cls:$R3, shift20only:$BD2))]>;
950
951multiclass ShiftRSAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
952 SDPatternOperator operator, RegisterOperand cls> {
Richard Sandifordff6c5a52013-07-19 16:12:08 +0000953 let NumOpsKey = mnemonic in {
954 let NumOpsValue = "3" in
955 def K : ShiftRSY<mnemonic##"k", opcode2, null_frag, cls>,
956 Requires<[FeatureDistinctOps]>;
957 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
958 def "" : ShiftRS<mnemonic, opcode1, operator, cls>;
959 }
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000960}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000961
962class CompareRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
963 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000964 : InstRR<opcode, (outs), (ins cls1:$R1, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000965 mnemonic#"r\t$R1, $R2",
966 [(operator cls1:$R1, cls2:$R2)]> {
967 let OpKey = mnemonic ## cls1;
968 let OpType = "reg";
969}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000970
971class CompareRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
972 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000973 : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000974 mnemonic#"r\t$R1, $R2",
975 [(operator cls1:$R1, cls2:$R2)]> {
976 let OpKey = mnemonic ## cls1;
977 let OpType = "reg";
978}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000979
980class CompareRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
981 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000982 : InstRI<opcode, (outs), (ins cls:$R1, imm:$I2),
983 mnemonic#"\t$R1, $I2",
984 [(operator cls:$R1, imm:$I2)]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000985
986class CompareRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
987 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000988 : InstRIL<opcode, (outs), (ins cls:$R1, imm:$I2),
989 mnemonic#"\t$R1, $I2",
990 [(operator cls:$R1, imm:$I2)]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000991
992class CompareRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
993 RegisterOperand cls, SDPatternOperator load>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000994 : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
995 mnemonic#"\t$R1, $I2",
996 [(operator cls:$R1, (load pcrel32:$I2))]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000997 let mayLoad = 1;
998 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
999 // However, BDXs have two extra operands and are therefore 6 units more
1000 // complex.
1001 let AddedComplexity = 7;
1002}
1003
1004class CompareRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +00001005 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001006 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001007 : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
1008 mnemonic#"\t$R1, $XBD2",
1009 [(operator cls:$R1, (load mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +00001010 let OpKey = mnemonic ## cls;
1011 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001012 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +00001013 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001014}
1015
1016class CompareRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +00001017 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001018 : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2),
1019 mnemonic#"\t$R1, $XBD2",
1020 [(operator cls:$R1, (load bdxaddr12only:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +00001021 let OpKey = mnemonic ## cls;
1022 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001023 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +00001024 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001025}
1026
1027class CompareRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +00001028 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001029 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001030 : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
1031 mnemonic#"\t$R1, $XBD2",
1032 [(operator cls:$R1, (load mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +00001033 let OpKey = mnemonic ## cls;
1034 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001035 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +00001036 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001037}
1038
1039multiclass CompareRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
1040 SDPatternOperator operator, RegisterOperand cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +00001041 SDPatternOperator load, bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001042 let DispKey = mnemonic ## #cls in {
1043 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001044 def "" : CompareRX<mnemonic, rxOpcode, operator, cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +00001045 load, bytes, bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001046 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001047 def Y : CompareRXY<mnemonic#"y", rxyOpcode, operator, cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +00001048 load, bytes, bdxaddr20pair>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001049 }
1050}
1051
1052class CompareSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1053 SDPatternOperator load, Immediate imm,
1054 AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001055 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
1056 mnemonic#"\t$BD1, $I2",
1057 [(operator (load mode:$BD1), imm:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001058 let mayLoad = 1;
1059}
1060
1061class CompareSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1062 SDPatternOperator load, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001063 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
1064 mnemonic#"\t$BD1, $I2",
1065 [(operator (load bdaddr12only:$BD1), imm:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001066 let mayLoad = 1;
1067}
1068
1069class CompareSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1070 SDPatternOperator load, Immediate imm,
1071 AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001072 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
1073 mnemonic#"\t$BD1, $I2",
1074 [(operator (load mode:$BD1), imm:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001075 let mayLoad = 1;
1076}
1077
1078multiclass CompareSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
1079 SDPatternOperator operator, SDPatternOperator load,
1080 Immediate imm> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001081 let DispKey = mnemonic in {
1082 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001083 def "" : CompareSI<mnemonic, siOpcode, operator, load, imm, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001084 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001085 def Y : CompareSIY<mnemonic#"y", siyOpcode, operator, load, imm,
1086 bdaddr20pair>;
1087 }
1088}
1089
1090class TernaryRRD<string mnemonic, bits<16> opcode,
1091 SDPatternOperator operator, RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001092 : InstRRD<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, cls:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +00001093 mnemonic#"r\t$R1, $R3, $R2",
Richard Sandifordd454ec02013-05-14 09:28:21 +00001094 [(set cls:$R1, (operator cls:$R1src, cls:$R3, cls:$R2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +00001095 let OpKey = mnemonic ## cls;
1096 let OpType = "reg";
Richard Sandifordd454ec02013-05-14 09:28:21 +00001097 let Constraints = "$R1 = $R1src";
1098 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001099}
1100
1101class TernaryRXF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +00001102 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001103 : InstRXF<opcode, (outs cls:$R1),
1104 (ins cls:$R1src, cls:$R3, bdxaddr12only:$XBD2),
1105 mnemonic#"\t$R1, $R3, $XBD2",
1106 [(set cls:$R1, (operator cls:$R1src, cls:$R3,
1107 (load bdxaddr12only:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +00001108 let OpKey = mnemonic ## cls;
1109 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +00001110 let Constraints = "$R1 = $R1src";
1111 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001112 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +00001113 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001114}
1115
1116class CmpSwapRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1117 RegisterOperand cls, AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001118 : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
1119 mnemonic#"\t$R1, $R3, $BD2",
1120 [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
1121 let Constraints = "$R1 = $R1src";
1122 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001123 let mayLoad = 1;
1124 let mayStore = 1;
1125}
1126
1127class CmpSwapRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1128 RegisterOperand cls, AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001129 : InstRSY<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
1130 mnemonic#"\t$R1, $R3, $BD2",
1131 [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
1132 let Constraints = "$R1 = $R1src";
1133 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001134 let mayLoad = 1;
1135 let mayStore = 1;
1136}
1137
1138multiclass CmpSwapRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode,
1139 SDPatternOperator operator, RegisterOperand cls> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001140 let DispKey = mnemonic ## #cls in {
1141 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001142 def "" : CmpSwapRS<mnemonic, rsOpcode, operator, cls, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001143 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001144 def Y : CmpSwapRSY<mnemonic#"y", rsyOpcode, operator, cls, bdaddr20pair>;
1145 }
1146}
1147
1148class RotateSelectRIEf<string mnemonic, bits<16> opcode, RegisterOperand cls1,
1149 RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001150 : InstRIEf<opcode, (outs cls1:$R1),
Richard Sandiford67ddcd62013-07-11 08:37:13 +00001151 (ins cls1:$R1src, cls2:$R2, uimm8:$I3, uimm8:$I4, uimm8zx6:$I5),
Richard Sandifordd454ec02013-05-14 09:28:21 +00001152 mnemonic#"\t$R1, $R2, $I3, $I4, $I5", []> {
1153 let Constraints = "$R1 = $R1src";
1154 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001155}
1156
1157//===----------------------------------------------------------------------===//
1158// Pseudo instructions
1159//===----------------------------------------------------------------------===//
1160//
1161// Convenience instructions that get lowered to real instructions
1162// by either SystemZTargetLowering::EmitInstrWithCustomInserter()
1163// or SystemZInstrInfo::expandPostRAPseudo().
1164//
1165//===----------------------------------------------------------------------===//
1166
1167class Pseudo<dag outs, dag ins, list<dag> pattern>
1168 : InstSystemZ<0, outs, ins, "", pattern> {
1169 let isPseudo = 1;
1170 let isCodeGenOnly = 1;
1171}
1172
1173// Implements "$dst = $cc & (8 >> CC) ? $src1 : $src2", where CC is
1174// the value of the PSW's 2-bit condition code field.
1175class SelectWrapper<RegisterOperand cls>
1176 : Pseudo<(outs cls:$dst), (ins cls:$src1, cls:$src2, i8imm:$cc),
1177 [(set cls:$dst, (z_select_ccmask cls:$src1, cls:$src2, imm:$cc))]> {
1178 let usesCustomInserter = 1;
1179 // Although the instructions used by these nodes do not in themselves
Richard Sandiford14a44492013-05-22 13:38:45 +00001180 // change CC, the insertion requires new blocks, and CC cannot be live
1181 // across them.
1182 let Defs = [CC];
1183 let Uses = [CC];
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001184}
1185
Richard Sandifordb86a8342013-06-27 09:27:40 +00001186// Stores $new to $addr if $cc is true ("" case) or false (Inv case).
1187multiclass CondStores<RegisterOperand cls, SDPatternOperator store,
1188 SDPatternOperator load, AddressingMode mode> {
1189 let Defs = [CC], Uses = [CC], usesCustomInserter = 1 in {
Richard Sandiforda68e6f52013-07-25 08:57:02 +00001190 def "" : Pseudo<(outs), (ins cls:$new, mode:$addr, uimm8zx4:$cc),
Richard Sandifordb86a8342013-06-27 09:27:40 +00001191 [(store (z_select_ccmask cls:$new, (load mode:$addr),
Richard Sandiforda68e6f52013-07-25 08:57:02 +00001192 uimm8zx4:$cc), mode:$addr)]>;
1193 def Inv : Pseudo<(outs), (ins cls:$new, mode:$addr, uimm8zx4:$cc),
Richard Sandifordb86a8342013-06-27 09:27:40 +00001194 [(store (z_select_ccmask (load mode:$addr), cls:$new,
Richard Sandiforda68e6f52013-07-25 08:57:02 +00001195 uimm8zx4:$cc), mode:$addr)]>;
Richard Sandifordb86a8342013-06-27 09:27:40 +00001196 }
1197}
1198
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001199// OPERATOR is ATOMIC_SWAP or an ATOMIC_LOAD_* operation. PAT and OPERAND
1200// describe the second (non-memory) operand.
1201class AtomicLoadBinary<SDPatternOperator operator, RegisterOperand cls,
1202 dag pat, DAGOperand operand>
1203 : Pseudo<(outs cls:$dst), (ins bdaddr20only:$ptr, operand:$src2),
1204 [(set cls:$dst, (operator bdaddr20only:$ptr, pat))]> {
Richard Sandiford14a44492013-05-22 13:38:45 +00001205 let Defs = [CC];
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001206 let Has20BitOffset = 1;
1207 let mayLoad = 1;
1208 let mayStore = 1;
1209 let usesCustomInserter = 1;
1210}
1211
1212// Specializations of AtomicLoadWBinary.
1213class AtomicLoadBinaryReg32<SDPatternOperator operator>
1214 : AtomicLoadBinary<operator, GR32, (i32 GR32:$src2), GR32>;
1215class AtomicLoadBinaryImm32<SDPatternOperator operator, Immediate imm>
1216 : AtomicLoadBinary<operator, GR32, (i32 imm:$src2), imm>;
1217class AtomicLoadBinaryReg64<SDPatternOperator operator>
1218 : AtomicLoadBinary<operator, GR64, (i64 GR64:$src2), GR64>;
1219class AtomicLoadBinaryImm64<SDPatternOperator operator, Immediate imm>
1220 : AtomicLoadBinary<operator, GR64, (i64 imm:$src2), imm>;
1221
1222// OPERATOR is ATOMIC_SWAPW or an ATOMIC_LOADW_* operation. PAT and OPERAND
1223// describe the second (non-memory) operand.
1224class AtomicLoadWBinary<SDPatternOperator operator, dag pat,
1225 DAGOperand operand>
1226 : Pseudo<(outs GR32:$dst),
1227 (ins bdaddr20only:$ptr, operand:$src2, ADDR32:$bitshift,
1228 ADDR32:$negbitshift, uimm32:$bitsize),
1229 [(set GR32:$dst, (operator bdaddr20only:$ptr, pat, ADDR32:$bitshift,
1230 ADDR32:$negbitshift, uimm32:$bitsize))]> {
Richard Sandiford14a44492013-05-22 13:38:45 +00001231 let Defs = [CC];
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001232 let Has20BitOffset = 1;
1233 let mayLoad = 1;
1234 let mayStore = 1;
1235 let usesCustomInserter = 1;
1236}
1237
1238// Specializations of AtomicLoadWBinary.
1239class AtomicLoadWBinaryReg<SDPatternOperator operator>
1240 : AtomicLoadWBinary<operator, (i32 GR32:$src2), GR32>;
1241class AtomicLoadWBinaryImm<SDPatternOperator operator, Immediate imm>
1242 : AtomicLoadWBinary<operator, (i32 imm:$src2), imm>;