blob: f0999756281bec9ae87076c8d03af81ea8b6f854 [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
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000184class InstRIEf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
185 : InstSystemZ<6, outs, ins, asmstr, pattern> {
186 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000187 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000188
189 bits<4> R1;
190 bits<4> R2;
191 bits<8> I3;
192 bits<8> I4;
193 bits<8> I5;
194
195 let Inst{47-40} = op{15-8};
196 let Inst{39-36} = R1;
197 let Inst{35-32} = R2;
198 let Inst{31-24} = I3;
199 let Inst{23-16} = I4;
200 let Inst{15-8} = I5;
201 let Inst{7-0} = op{7-0};
202}
203
204class InstRIL<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
205 : InstSystemZ<6, outs, ins, asmstr, pattern> {
206 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000207 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000208
209 bits<4> R1;
210 bits<32> I2;
211
212 let Inst{47-40} = op{11-4};
213 let Inst{39-36} = R1;
214 let Inst{35-32} = op{3-0};
215 let Inst{31-0} = I2;
216}
217
218class InstRR<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
219 : InstSystemZ<2, outs, ins, asmstr, pattern> {
220 field bits<16> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000221 field bits<16> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000222
223 bits<4> R1;
224 bits<4> R2;
225
226 let Inst{15-8} = op;
227 let Inst{7-4} = R1;
228 let Inst{3-0} = R2;
229}
230
231class InstRRD<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
232 : InstSystemZ<4, outs, ins, asmstr, pattern> {
233 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000234 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000235
236 bits<4> R1;
237 bits<4> R3;
238 bits<4> R2;
239
240 let Inst{31-16} = op;
241 let Inst{15-12} = R1;
242 let Inst{11-8} = 0;
243 let Inst{7-4} = R3;
244 let Inst{3-0} = R2;
245}
246
247class InstRRE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
248 : InstSystemZ<4, outs, ins, asmstr, pattern> {
249 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000250 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000251
252 bits<4> R1;
253 bits<4> R2;
254
255 let Inst{31-16} = op;
256 let Inst{15-8} = 0;
257 let Inst{7-4} = R1;
258 let Inst{3-0} = R2;
259}
260
261class InstRRF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
262 : InstSystemZ<4, outs, ins, asmstr, pattern> {
263 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000264 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000265
266 bits<4> R1;
267 bits<4> R2;
268 bits<4> R3;
269
270 let Inst{31-16} = op;
271 let Inst{15-12} = R3;
272 let Inst{11-8} = 0;
273 let Inst{7-4} = R1;
274 let Inst{3-0} = R2;
275}
276
277class InstRX<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
278 : InstSystemZ<4, outs, ins, asmstr, pattern> {
279 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000280 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000281
282 bits<4> R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000283 bits<20> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000284
285 let Inst{31-24} = op;
286 let Inst{23-20} = R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000287 let Inst{19-0} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000288
289 let HasIndex = 1;
290}
291
292class InstRXE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
293 : InstSystemZ<6, outs, ins, asmstr, pattern> {
294 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000295 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000296
297 bits<4> R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000298 bits<20> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000299
300 let Inst{47-40} = op{15-8};
301 let Inst{39-36} = R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000302 let Inst{35-16} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000303 let Inst{15-8} = 0;
304 let Inst{7-0} = op{7-0};
305
306 let HasIndex = 1;
307}
308
309class InstRXF<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;
315 bits<4> R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000316 bits<20> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000317
318 let Inst{47-40} = op{15-8};
319 let Inst{39-36} = R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000320 let Inst{35-16} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000321 let Inst{15-12} = R1;
322 let Inst{11-8} = 0;
323 let Inst{7-0} = op{7-0};
324
325 let HasIndex = 1;
326}
327
328class InstRXY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
329 : InstSystemZ<6, outs, ins, asmstr, pattern> {
330 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000331 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000332
333 bits<4> R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000334 bits<28> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000335
336 let Inst{47-40} = op{15-8};
337 let Inst{39-36} = R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000338 let Inst{35-8} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000339 let Inst{7-0} = op{7-0};
340
341 let Has20BitOffset = 1;
342 let HasIndex = 1;
343}
344
345class InstRS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
346 : InstSystemZ<4, outs, ins, asmstr, pattern> {
347 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000348 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000349
350 bits<4> R1;
351 bits<4> R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000352 bits<16> BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000353
354 let Inst{31-24} = op;
355 let Inst{23-20} = R1;
356 let Inst{19-16} = R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000357 let Inst{15-0} = BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000358}
359
360class InstRSY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
361 : InstSystemZ<6, outs, ins, asmstr, pattern> {
362 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000363 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000364
365 bits<4> R1;
366 bits<4> R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000367 bits<24> BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000368
369 let Inst{47-40} = op{15-8};
370 let Inst{39-36} = R1;
371 let Inst{35-32} = R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000372 let Inst{31-8} = BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000373 let Inst{7-0} = op{7-0};
374
375 let Has20BitOffset = 1;
376}
377
378class InstSI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
379 : InstSystemZ<4, outs, ins, asmstr, pattern> {
380 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000381 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000382
Richard Sandifordd454ec02013-05-14 09:28:21 +0000383 bits<16> BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000384 bits<8> I2;
385
386 let Inst{31-24} = op;
387 let Inst{23-16} = I2;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000388 let Inst{15-0} = BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000389}
390
391class InstSIL<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
392 : InstSystemZ<6, outs, ins, asmstr, pattern> {
393 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000394 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000395
Richard Sandifordd454ec02013-05-14 09:28:21 +0000396 bits<16> BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000397 bits<16> I2;
398
399 let Inst{47-32} = op;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000400 let Inst{31-16} = BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000401 let Inst{15-0} = I2;
402}
403
404class InstSIY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
405 : InstSystemZ<6, outs, ins, asmstr, pattern> {
406 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000407 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000408
Richard Sandifordd454ec02013-05-14 09:28:21 +0000409 bits<24> BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000410 bits<8> I2;
411
412 let Inst{47-40} = op{15-8};
413 let Inst{39-32} = I2;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000414 let Inst{31-8} = BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000415 let Inst{7-0} = op{7-0};
416
417 let Has20BitOffset = 1;
418}
419
Richard Sandiford1d959002013-07-02 14:56:45 +0000420class InstSS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
421 : InstSystemZ<6, outs, ins, asmstr, pattern> {
422 field bits<48> Inst;
423 field bits<48> SoftFail = 0;
424
425 bits<24> BDL1;
426 bits<16> BD2;
427
428 let Inst{47-40} = op;
429 let Inst{39-16} = BDL1;
430 let Inst{15-0} = BD2;
431}
432
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000433//===----------------------------------------------------------------------===//
434// Instruction definitions with semantics
435//===----------------------------------------------------------------------===//
436//
437// These classes have the form <Category><Format>, where <Format> is one
438// of the formats defined above and where <Category> describes the inputs
439// and outputs. <Category> can be one of:
440//
441// Inherent:
442// One register output operand and no input operands.
443//
444// Store:
445// One register or immediate input operand and one address input operand.
446// The instruction stores the first operand to the address.
447//
448// This category is used for both pure and truncating stores.
449//
450// LoadMultiple:
451// One address input operand and two explicit output operands.
452// The instruction loads a range of registers from the address,
453// with the explicit operands giving the first and last register
454// to load. Other loaded registers are added as implicit definitions.
455//
456// StoreMultiple:
457// Two explicit input register operands and an address operand.
458// The instruction stores a range of registers to the address,
459// with the explicit operands giving the first and last register
460// to store. Other stored registers are added as implicit uses.
461//
462// Unary:
463// One register output operand and one input operand. The input
464// operand may be a register, immediate or memory.
465//
466// Binary:
467// One register output operand and two input operands. The first
468// input operand is always a register and he second may be a register,
469// immediate or memory.
470//
471// Shift:
472// One register output operand and two input operands. The first
473// input operand is a register and the second has the same form as
474// an address (although it isn't actually used to address memory).
475//
476// Compare:
477// Two input operands. The first operand is always a register,
478// the second may be a register, immediate or memory.
479//
480// Ternary:
481// One register output operand and three register input operands.
482//
483// CmpSwap:
484// One output operand and three input operands. The first two
485// operands are registers and the third is an address. The instruction
486// both reads from and writes to the address.
487//
488// RotateSelect:
489// One output operand and five input operands. The first two operands
490// are registers and the other three are immediates.
491//
492// The format determines which input operands are tied to output operands,
493// and also determines the shape of any address operand.
494//
495// Multiclasses of the form <Category><Format>Pair define two instructions,
496// one with <Category><Format> and one with <Category><Format>Y. The name
497// of the first instruction has no suffix, the name of the second has
498// an extra "y".
499//
500//===----------------------------------------------------------------------===//
501
502class InherentRRE<string mnemonic, bits<16> opcode, RegisterOperand cls,
503 dag src>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000504 : InstRRE<opcode, (outs cls:$R1), (ins),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000505 mnemonic#"r\t$R1",
Richard Sandifordd454ec02013-05-14 09:28:21 +0000506 [(set cls:$R1, src)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000507 let R2 = 0;
508}
509
510class LoadMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000511 : InstRSY<opcode, (outs cls:$R1, cls:$R3), (ins bdaddr20only:$BD2),
512 mnemonic#"\t$R1, $R3, $BD2", []> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000513 let mayLoad = 1;
514}
515
516class StoreRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
517 RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000518 : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
519 mnemonic#"\t$R1, $I2",
520 [(operator cls:$R1, pcrel32:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000521 let mayStore = 1;
522 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
523 // However, BDXs have two extra operands and are therefore 6 units more
524 // complex.
525 let AddedComplexity = 7;
526}
527
528class StoreRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000529 RegisterOperand cls, bits<5> bytes,
530 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000531 : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
532 mnemonic#"\t$R1, $XBD2",
533 [(operator cls:$R1, mode:$XBD2)]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000534 let OpKey = mnemonic ## cls;
535 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000536 let mayStore = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000537 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000538}
539
540class StoreRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000541 RegisterOperand cls, bits<5> bytes,
542 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000543 : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
544 mnemonic#"\t$R1, $XBD2",
545 [(operator cls:$R1, mode:$XBD2)]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000546 let OpKey = mnemonic ## cls;
547 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000548 let mayStore = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000549 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000550}
551
552multiclass StoreRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000553 SDPatternOperator operator, RegisterOperand cls,
554 bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000555 let DispKey = mnemonic ## #cls in {
556 let DispSize = "12" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000557 def "" : StoreRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000558 let DispSize = "20" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000559 def Y : StoreRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
560 bdxaddr20pair>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000561 }
562}
563
564class StoreMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000565 : InstRSY<opcode, (outs), (ins cls:$R1, cls:$R3, bdaddr20only:$BD2),
566 mnemonic#"\t$R1, $R3, $BD2", []> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000567 let mayStore = 1;
568}
569
570class StoreSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
571 Immediate imm, AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000572 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
573 mnemonic#"\t$BD1, $I2",
574 [(operator imm:$I2, mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000575 let mayStore = 1;
576}
577
578class StoreSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
579 Immediate imm, AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000580 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
581 mnemonic#"\t$BD1, $I2",
582 [(operator imm:$I2, mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000583 let mayStore = 1;
584}
585
586class StoreSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
587 Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000588 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
589 mnemonic#"\t$BD1, $I2",
590 [(operator imm:$I2, bdaddr12only:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000591 let mayStore = 1;
592}
593
594multiclass StoreSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
595 SDPatternOperator operator, Immediate imm> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000596 let DispKey = mnemonic in {
597 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000598 def "" : StoreSI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000599 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000600 def Y : StoreSIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
601 }
602}
603
604class UnaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
605 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000606 : InstRR<opcode, (outs cls1:$R1), (ins cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000607 mnemonic#"r\t$R1, $R2",
608 [(set cls1:$R1, (operator cls2:$R2))]> {
609 let OpKey = mnemonic ## cls1;
610 let OpType = "reg";
611}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000612
613class UnaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
614 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000615 : InstRRE<opcode, (outs cls1:$R1), (ins cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000616 mnemonic#"r\t$R1, $R2",
617 [(set cls1:$R1, (operator cls2:$R2))]> {
618 let OpKey = mnemonic ## cls1;
619 let OpType = "reg";
620}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000621
622class UnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
623 RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000624 : InstRRF<opcode, (outs cls1:$R1), (ins uimm8zx4:$R3, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000625 mnemonic#"r\t$R1, $R3, $R2", []> {
626 let OpKey = mnemonic ## cls1;
627 let OpType = "reg";
628}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000629
630class UnaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
631 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000632 : InstRI<opcode, (outs cls:$R1), (ins imm:$I2),
633 mnemonic#"\t$R1, $I2",
634 [(set cls:$R1, (operator imm:$I2))]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000635
636class UnaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
637 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000638 : InstRIL<opcode, (outs cls:$R1), (ins imm:$I2),
639 mnemonic#"\t$R1, $I2",
640 [(set cls:$R1, (operator imm:$I2))]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000641
642class UnaryRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
643 RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000644 : InstRIL<opcode, (outs cls:$R1), (ins pcrel32:$I2),
645 mnemonic#"\t$R1, $I2",
646 [(set cls:$R1, (operator pcrel32:$I2))]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000647 let mayLoad = 1;
648 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
649 // However, BDXs have two extra operands and are therefore 6 units more
650 // complex.
651 let AddedComplexity = 7;
652}
653
654class UnaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000655 RegisterOperand cls, bits<5> bytes,
656 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000657 : InstRX<opcode, (outs cls:$R1), (ins mode:$XBD2),
658 mnemonic#"\t$R1, $XBD2",
659 [(set cls:$R1, (operator mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000660 let OpKey = mnemonic ## cls;
661 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000662 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000663 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000664}
665
666class UnaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000667 RegisterOperand cls, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000668 : InstRXE<opcode, (outs cls:$R1), (ins bdxaddr12only:$XBD2),
669 mnemonic#"\t$R1, $XBD2",
670 [(set cls:$R1, (operator bdxaddr12only:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000671 let OpKey = mnemonic ## cls;
672 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000673 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000674 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000675}
676
677class UnaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000678 RegisterOperand cls, bits<5> bytes,
679 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000680 : InstRXY<opcode, (outs cls:$R1), (ins mode:$XBD2),
681 mnemonic#"\t$R1, $XBD2",
682 [(set cls:$R1, (operator mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000683 let OpKey = mnemonic ## cls;
684 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000685 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000686 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000687}
688
689multiclass UnaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000690 SDPatternOperator operator, RegisterOperand cls,
691 bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000692 let DispKey = mnemonic ## #cls in {
693 let DispSize = "12" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000694 def "" : UnaryRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000695 let DispSize = "20" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000696 def Y : UnaryRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
697 bdxaddr20pair>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000698 }
699}
700
701class BinaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
702 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000703 : InstRR<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000704 mnemonic#"r\t$R1, $R2",
Richard Sandifordd454ec02013-05-14 09:28:21 +0000705 [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000706 let OpKey = mnemonic ## cls1;
707 let OpType = "reg";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000708 let Constraints = "$R1 = $R1src";
709 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000710}
711
712class BinaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
713 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000714 : InstRRE<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000715 mnemonic#"r\t$R1, $R2",
Richard Sandifordd454ec02013-05-14 09:28:21 +0000716 [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000717 let OpKey = mnemonic ## cls1;
718 let OpType = "reg";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000719 let Constraints = "$R1 = $R1src";
720 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000721}
722
Richard Sandifordd454ec02013-05-14 09:28:21 +0000723class BinaryRRF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
724 RegisterOperand cls1, RegisterOperand cls2>
725 : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R3, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000726 mnemonic#"r\t$R1, $R3, $R2",
727 [(set cls1:$R1, (operator cls1:$R3, cls2:$R2))]> {
728 let OpKey = mnemonic ## cls1;
729 let OpType = "reg";
730}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000731
Richard Sandiford0175b4a2013-07-19 16:21:55 +0000732class BinaryRRFK<string mnemonic, bits<16> opcode, SDPatternOperator operator,
733 RegisterOperand cls1, RegisterOperand cls2>
734 : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R2, cls2:$R3),
735 mnemonic#"rk\t$R1, $R2, $R3",
736 [(set cls1:$R1, (operator cls1:$R2, cls2:$R3))]>;
737
738multiclass BinaryRRAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
739 SDPatternOperator operator, RegisterOperand cls1,
740 RegisterOperand cls2> {
741 let NumOpsKey = mnemonic in {
742 let NumOpsValue = "3" in
743 def K : BinaryRRFK<mnemonic, opcode2, null_frag, cls1, cls2>,
744 Requires<[FeatureDistinctOps]>;
745 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
746 def "" : BinaryRR<mnemonic, opcode1, operator, cls1, cls2>;
747 }
748}
749
Richard Sandifordc57e5862013-07-19 16:24:22 +0000750multiclass BinaryRREAndK<string mnemonic, bits<16> opcode1, bits<16> opcode2,
751 SDPatternOperator operator, RegisterOperand cls1,
752 RegisterOperand cls2> {
753 let NumOpsKey = mnemonic in {
754 let NumOpsValue = "3" in
755 def K : BinaryRRFK<mnemonic, opcode2, null_frag, cls1, cls2>,
756 Requires<[FeatureDistinctOps]>;
757 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
758 def "" : BinaryRRE<mnemonic, opcode1, operator, cls1, cls2>;
759 }
760}
761
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000762class BinaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
763 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000764 : InstRI<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
765 mnemonic#"\t$R1, $I2",
766 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
767 let Constraints = "$R1 = $R1src";
768 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000769}
770
771class BinaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
772 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000773 : InstRIL<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
774 mnemonic#"\t$R1, $I2",
775 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
776 let Constraints = "$R1 = $R1src";
777 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000778}
779
780class BinaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000781 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000782 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000783 : InstRX<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
784 mnemonic#"\t$R1, $XBD2",
785 [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000786 let OpKey = mnemonic ## cls;
787 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000788 let Constraints = "$R1 = $R1src";
789 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000790 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000791 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000792}
793
794class BinaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000795 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000796 : InstRXE<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr12only:$XBD2),
797 mnemonic#"\t$R1, $XBD2",
798 [(set cls:$R1, (operator cls:$R1src,
799 (load bdxaddr12only:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000800 let OpKey = mnemonic ## cls;
801 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000802 let Constraints = "$R1 = $R1src";
803 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000804 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000805 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000806}
807
808class BinaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000809 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000810 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000811 : InstRXY<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
812 mnemonic#"\t$R1, $XBD2",
813 [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000814 let OpKey = mnemonic ## cls;
815 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000816 let Constraints = "$R1 = $R1src";
817 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000818 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000819 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000820}
821
822multiclass BinaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
823 SDPatternOperator operator, RegisterOperand cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000824 SDPatternOperator load, bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000825 let DispKey = mnemonic ## #cls in {
826 let DispSize = "12" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000827 def "" : BinaryRX<mnemonic, rxOpcode, operator, cls, load, bytes,
828 bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000829 let DispSize = "20" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000830 def Y : BinaryRXY<mnemonic#"y", rxyOpcode, operator, cls, load, bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000831 bdxaddr20pair>;
832 }
833}
834
835class BinarySI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
836 Operand imm, AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000837 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
838 mnemonic#"\t$BD1, $I2",
839 [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000840 let mayLoad = 1;
841 let mayStore = 1;
842}
843
844class BinarySIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
845 Operand imm, AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000846 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
847 mnemonic#"\t$BD1, $I2",
848 [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000849 let mayLoad = 1;
850 let mayStore = 1;
851}
852
853multiclass BinarySIPair<string mnemonic, bits<8> siOpcode,
854 bits<16> siyOpcode, SDPatternOperator operator,
855 Operand imm> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000856 let DispKey = mnemonic ## #cls in {
857 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000858 def "" : BinarySI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000859 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000860 def Y : BinarySIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
861 }
862}
863
864class ShiftRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000865 RegisterOperand cls>
866 : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, shift12only:$BD2),
Richard Sandifordd454ec02013-05-14 09:28:21 +0000867 mnemonic#"\t$R1, $BD2",
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000868 [(set cls:$R1, (operator cls:$R1src, shift12only:$BD2))]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000869 let R3 = 0;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000870 let Constraints = "$R1 = $R1src";
871 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000872}
873
874class ShiftRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000875 RegisterOperand cls>
876 : InstRSY<opcode, (outs cls:$R1), (ins cls:$R3, shift20only:$BD2),
Richard Sandifordd454ec02013-05-14 09:28:21 +0000877 mnemonic#"\t$R1, $R3, $BD2",
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000878 [(set cls:$R1, (operator cls:$R3, shift20only:$BD2))]>;
879
880multiclass ShiftRSAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
881 SDPatternOperator operator, RegisterOperand cls> {
Richard Sandifordff6c5a52013-07-19 16:12:08 +0000882 let NumOpsKey = mnemonic in {
883 let NumOpsValue = "3" in
884 def K : ShiftRSY<mnemonic##"k", opcode2, null_frag, cls>,
885 Requires<[FeatureDistinctOps]>;
886 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
887 def "" : ShiftRS<mnemonic, opcode1, operator, cls>;
888 }
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000889}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000890
891class CompareRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
892 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000893 : InstRR<opcode, (outs), (ins cls1:$R1, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000894 mnemonic#"r\t$R1, $R2",
895 [(operator cls1:$R1, cls2:$R2)]> {
896 let OpKey = mnemonic ## cls1;
897 let OpType = "reg";
898}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000899
900class CompareRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
901 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000902 : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000903 mnemonic#"r\t$R1, $R2",
904 [(operator cls1:$R1, cls2:$R2)]> {
905 let OpKey = mnemonic ## cls1;
906 let OpType = "reg";
907}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000908
909class CompareRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
910 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000911 : InstRI<opcode, (outs), (ins cls:$R1, imm:$I2),
912 mnemonic#"\t$R1, $I2",
913 [(operator cls:$R1, imm:$I2)]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000914
915class CompareRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
916 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000917 : InstRIL<opcode, (outs), (ins cls:$R1, imm:$I2),
918 mnemonic#"\t$R1, $I2",
919 [(operator cls:$R1, imm:$I2)]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000920
921class CompareRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
922 RegisterOperand cls, SDPatternOperator load>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000923 : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
924 mnemonic#"\t$R1, $I2",
925 [(operator cls:$R1, (load pcrel32:$I2))]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000926 let mayLoad = 1;
927 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
928 // However, BDXs have two extra operands and are therefore 6 units more
929 // complex.
930 let AddedComplexity = 7;
931}
932
933class CompareRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000934 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000935 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000936 : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
937 mnemonic#"\t$R1, $XBD2",
938 [(operator cls:$R1, (load mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000939 let OpKey = mnemonic ## cls;
940 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000941 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000942 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000943}
944
945class CompareRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000946 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000947 : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2),
948 mnemonic#"\t$R1, $XBD2",
949 [(operator cls:$R1, (load bdxaddr12only:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000950 let OpKey = mnemonic ## cls;
951 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000952 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000953 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000954}
955
956class CompareRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000957 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000958 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000959 : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
960 mnemonic#"\t$R1, $XBD2",
961 [(operator cls:$R1, (load mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000962 let OpKey = mnemonic ## cls;
963 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000964 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000965 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000966}
967
968multiclass CompareRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
969 SDPatternOperator operator, RegisterOperand cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000970 SDPatternOperator load, bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000971 let DispKey = mnemonic ## #cls in {
972 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000973 def "" : CompareRX<mnemonic, rxOpcode, operator, cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000974 load, bytes, bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000975 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000976 def Y : CompareRXY<mnemonic#"y", rxyOpcode, operator, cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000977 load, bytes, bdxaddr20pair>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000978 }
979}
980
981class CompareSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
982 SDPatternOperator load, Immediate imm,
983 AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000984 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
985 mnemonic#"\t$BD1, $I2",
986 [(operator (load mode:$BD1), imm:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000987 let mayLoad = 1;
988}
989
990class CompareSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
991 SDPatternOperator load, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000992 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
993 mnemonic#"\t$BD1, $I2",
994 [(operator (load bdaddr12only:$BD1), imm:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000995 let mayLoad = 1;
996}
997
998class CompareSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
999 SDPatternOperator load, Immediate imm,
1000 AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001001 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
1002 mnemonic#"\t$BD1, $I2",
1003 [(operator (load mode:$BD1), imm:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001004 let mayLoad = 1;
1005}
1006
1007multiclass CompareSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
1008 SDPatternOperator operator, SDPatternOperator load,
1009 Immediate imm> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001010 let DispKey = mnemonic in {
1011 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001012 def "" : CompareSI<mnemonic, siOpcode, operator, load, imm, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001013 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001014 def Y : CompareSIY<mnemonic#"y", siyOpcode, operator, load, imm,
1015 bdaddr20pair>;
1016 }
1017}
1018
1019class TernaryRRD<string mnemonic, bits<16> opcode,
1020 SDPatternOperator operator, RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001021 : InstRRD<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, cls:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +00001022 mnemonic#"r\t$R1, $R3, $R2",
Richard Sandifordd454ec02013-05-14 09:28:21 +00001023 [(set cls:$R1, (operator cls:$R1src, cls:$R3, cls:$R2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +00001024 let OpKey = mnemonic ## cls;
1025 let OpType = "reg";
Richard Sandifordd454ec02013-05-14 09:28:21 +00001026 let Constraints = "$R1 = $R1src";
1027 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001028}
1029
1030class TernaryRXF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +00001031 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001032 : InstRXF<opcode, (outs cls:$R1),
1033 (ins cls:$R1src, cls:$R3, bdxaddr12only:$XBD2),
1034 mnemonic#"\t$R1, $R3, $XBD2",
1035 [(set cls:$R1, (operator cls:$R1src, cls:$R3,
1036 (load bdxaddr12only:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +00001037 let OpKey = mnemonic ## cls;
1038 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +00001039 let Constraints = "$R1 = $R1src";
1040 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001041 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +00001042 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001043}
1044
1045class CmpSwapRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
1046 RegisterOperand cls, AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001047 : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
1048 mnemonic#"\t$R1, $R3, $BD2",
1049 [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
1050 let Constraints = "$R1 = $R1src";
1051 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001052 let mayLoad = 1;
1053 let mayStore = 1;
1054}
1055
1056class CmpSwapRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1057 RegisterOperand cls, AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001058 : InstRSY<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
1059 mnemonic#"\t$R1, $R3, $BD2",
1060 [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
1061 let Constraints = "$R1 = $R1src";
1062 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001063 let mayLoad = 1;
1064 let mayStore = 1;
1065}
1066
1067multiclass CmpSwapRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode,
1068 SDPatternOperator operator, RegisterOperand cls> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001069 let DispKey = mnemonic ## #cls in {
1070 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001071 def "" : CmpSwapRS<mnemonic, rsOpcode, operator, cls, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001072 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001073 def Y : CmpSwapRSY<mnemonic#"y", rsyOpcode, operator, cls, bdaddr20pair>;
1074 }
1075}
1076
1077class RotateSelectRIEf<string mnemonic, bits<16> opcode, RegisterOperand cls1,
1078 RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001079 : InstRIEf<opcode, (outs cls1:$R1),
Richard Sandiford67ddcd62013-07-11 08:37:13 +00001080 (ins cls1:$R1src, cls2:$R2, uimm8:$I3, uimm8:$I4, uimm8zx6:$I5),
Richard Sandifordd454ec02013-05-14 09:28:21 +00001081 mnemonic#"\t$R1, $R2, $I3, $I4, $I5", []> {
1082 let Constraints = "$R1 = $R1src";
1083 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001084}
1085
1086//===----------------------------------------------------------------------===//
1087// Pseudo instructions
1088//===----------------------------------------------------------------------===//
1089//
1090// Convenience instructions that get lowered to real instructions
1091// by either SystemZTargetLowering::EmitInstrWithCustomInserter()
1092// or SystemZInstrInfo::expandPostRAPseudo().
1093//
1094//===----------------------------------------------------------------------===//
1095
1096class Pseudo<dag outs, dag ins, list<dag> pattern>
1097 : InstSystemZ<0, outs, ins, "", pattern> {
1098 let isPseudo = 1;
1099 let isCodeGenOnly = 1;
1100}
1101
1102// Implements "$dst = $cc & (8 >> CC) ? $src1 : $src2", where CC is
1103// the value of the PSW's 2-bit condition code field.
1104class SelectWrapper<RegisterOperand cls>
1105 : Pseudo<(outs cls:$dst), (ins cls:$src1, cls:$src2, i8imm:$cc),
1106 [(set cls:$dst, (z_select_ccmask cls:$src1, cls:$src2, imm:$cc))]> {
1107 let usesCustomInserter = 1;
1108 // Although the instructions used by these nodes do not in themselves
Richard Sandiford14a44492013-05-22 13:38:45 +00001109 // change CC, the insertion requires new blocks, and CC cannot be live
1110 // across them.
1111 let Defs = [CC];
1112 let Uses = [CC];
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001113}
1114
Richard Sandifordb86a8342013-06-27 09:27:40 +00001115// Stores $new to $addr if $cc is true ("" case) or false (Inv case).
1116multiclass CondStores<RegisterOperand cls, SDPatternOperator store,
1117 SDPatternOperator load, AddressingMode mode> {
1118 let Defs = [CC], Uses = [CC], usesCustomInserter = 1 in {
1119 def "" : Pseudo<(outs), (ins mode:$addr, cls:$new, i8imm:$cc),
1120 [(store (z_select_ccmask cls:$new, (load mode:$addr),
1121 imm:$cc), mode:$addr)]>;
1122 def Inv : Pseudo<(outs), (ins mode:$addr, cls:$new, i8imm:$cc),
1123 [(store (z_select_ccmask (load mode:$addr), cls:$new,
1124 imm:$cc), mode:$addr)]>;
1125 }
1126}
1127
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001128// OPERATOR is ATOMIC_SWAP or an ATOMIC_LOAD_* operation. PAT and OPERAND
1129// describe the second (non-memory) operand.
1130class AtomicLoadBinary<SDPatternOperator operator, RegisterOperand cls,
1131 dag pat, DAGOperand operand>
1132 : Pseudo<(outs cls:$dst), (ins bdaddr20only:$ptr, operand:$src2),
1133 [(set cls:$dst, (operator bdaddr20only:$ptr, pat))]> {
Richard Sandiford14a44492013-05-22 13:38:45 +00001134 let Defs = [CC];
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001135 let Has20BitOffset = 1;
1136 let mayLoad = 1;
1137 let mayStore = 1;
1138 let usesCustomInserter = 1;
1139}
1140
1141// Specializations of AtomicLoadWBinary.
1142class AtomicLoadBinaryReg32<SDPatternOperator operator>
1143 : AtomicLoadBinary<operator, GR32, (i32 GR32:$src2), GR32>;
1144class AtomicLoadBinaryImm32<SDPatternOperator operator, Immediate imm>
1145 : AtomicLoadBinary<operator, GR32, (i32 imm:$src2), imm>;
1146class AtomicLoadBinaryReg64<SDPatternOperator operator>
1147 : AtomicLoadBinary<operator, GR64, (i64 GR64:$src2), GR64>;
1148class AtomicLoadBinaryImm64<SDPatternOperator operator, Immediate imm>
1149 : AtomicLoadBinary<operator, GR64, (i64 imm:$src2), imm>;
1150
1151// OPERATOR is ATOMIC_SWAPW or an ATOMIC_LOADW_* operation. PAT and OPERAND
1152// describe the second (non-memory) operand.
1153class AtomicLoadWBinary<SDPatternOperator operator, dag pat,
1154 DAGOperand operand>
1155 : Pseudo<(outs GR32:$dst),
1156 (ins bdaddr20only:$ptr, operand:$src2, ADDR32:$bitshift,
1157 ADDR32:$negbitshift, uimm32:$bitsize),
1158 [(set GR32:$dst, (operator bdaddr20only:$ptr, pat, ADDR32:$bitshift,
1159 ADDR32:$negbitshift, uimm32:$bitsize))]> {
Richard Sandiford14a44492013-05-22 13:38:45 +00001160 let Defs = [CC];
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001161 let Has20BitOffset = 1;
1162 let mayLoad = 1;
1163 let mayStore = 1;
1164 let usesCustomInserter = 1;
1165}
1166
1167// Specializations of AtomicLoadWBinary.
1168class AtomicLoadWBinaryReg<SDPatternOperator operator>
1169 : AtomicLoadWBinary<operator, (i32 GR32:$src2), GR32>;
1170class AtomicLoadWBinaryImm<SDPatternOperator operator, Immediate imm>
1171 : AtomicLoadWBinary<operator, (i32 imm:$src2), imm>;