blob: 45147c1a919116d8af4d5be80fe0f6c071035971 [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
Ulrich Weigand5f613df2013-05-06 16:15:19 +000037 // True if this instruction is a simple D(X,B) load of a register
38 // (with no sign or zero extension).
39 bit SimpleBDXLoad = 0;
40
41 // True if this instruction is a simple D(X,B) store of a register
42 // (with no truncation).
43 bit SimpleBDXStore = 0;
44
45 // True if this instruction has a 20-bit displacement field.
46 bit Has20BitOffset = 0;
47
48 // True if addresses in this instruction have an index register.
49 bit HasIndex = 0;
50
51 // True if this is a 128-bit pseudo instruction that combines two 64-bit
52 // operations.
53 bit Is128Bit = 0;
54
Richard Sandiforded1fab62013-07-03 10:10:02 +000055 // The access size of all memory operands in bytes, or 0 if not known.
56 bits<5> AccessBytes = 0;
57
Ulrich Weigand5f613df2013-05-06 16:15:19 +000058 let TSFlags{0} = SimpleBDXLoad;
59 let TSFlags{1} = SimpleBDXStore;
60 let TSFlags{2} = Has20BitOffset;
61 let TSFlags{3} = HasIndex;
62 let TSFlags{4} = Is128Bit;
Richard Sandiforded1fab62013-07-03 10:10:02 +000063 let TSFlags{9-5} = AccessBytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +000064}
65
66//===----------------------------------------------------------------------===//
67// Mappings between instructions
68//===----------------------------------------------------------------------===//
69
70// Return the version of an instruction that has an unsigned 12-bit
71// displacement.
72def getDisp12Opcode : InstrMapping {
73 let FilterClass = "InstSystemZ";
Richard Sandiforddf313ff2013-07-03 09:19:58 +000074 let RowFields = ["DispKey"];
75 let ColFields = ["DispSize"];
Ulrich Weigand5f613df2013-05-06 16:15:19 +000076 let KeyCol = ["20"];
77 let ValueCols = [["12"]];
78}
79
80// Return the version of an instruction that has a signed 20-bit displacement.
81def getDisp20Opcode : InstrMapping {
82 let FilterClass = "InstSystemZ";
Richard Sandiforddf313ff2013-07-03 09:19:58 +000083 let RowFields = ["DispKey"];
84 let ColFields = ["DispSize"];
Ulrich Weigand5f613df2013-05-06 16:15:19 +000085 let KeyCol = ["12"];
86 let ValueCols = [["20"]];
87}
88
Richard Sandiforded1fab62013-07-03 10:10:02 +000089def getMemOpcode : InstrMapping {
90 let FilterClass = "InstSystemZ";
91 let RowFields = ["OpKey"];
92 let ColFields = ["OpType"];
93 let KeyCol = ["reg"];
94 let ValueCols = [["mem"]];
95}
96
Ulrich Weigand5f613df2013-05-06 16:15:19 +000097//===----------------------------------------------------------------------===//
98// Instruction formats
99//===----------------------------------------------------------------------===//
100//
101// Formats are specified using operand field declarations of the form:
102//
Richard Sandifordd454ec02013-05-14 09:28:21 +0000103// bits<4> Rn : register input or output for operand n
104// bits<m> In : immediate value of width m for operand n
105// bits<4> BDn : address operand n, which has a base and a displacement
106// bits<m> XBDn : address operand n, which has an index, a base and a
107// displacement
108// bits<4> Xn : index register for address operand n
109// bits<4> Mn : mode value for operand n
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000110//
Richard Sandifordd454ec02013-05-14 09:28:21 +0000111// The operand numbers ("n" in the list above) follow the architecture manual.
112// Assembly operands sometimes have a different order; in particular, R3 often
113// is often written between operands 1 and 2.
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000114//
115//===----------------------------------------------------------------------===//
116
117class InstRI<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
118 : InstSystemZ<4, outs, ins, asmstr, pattern> {
119 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000120 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000121
122 bits<4> R1;
123 bits<16> I2;
124
125 let Inst{31-24} = op{11-4};
126 let Inst{23-20} = R1;
127 let Inst{19-16} = op{3-0};
128 let Inst{15-0} = I2;
129}
130
Richard Sandiford0fb90ab2013-05-28 10:41:11 +0000131class InstRIEb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
132 : InstSystemZ<6, outs, ins, asmstr, pattern> {
133 field bits<48> Inst;
134 field bits<48> SoftFail = 0;
135
136 bits<4> R1;
137 bits<4> R2;
138 bits<4> M3;
139 bits<16> RI4;
140
141 let Inst{47-40} = op{15-8};
142 let Inst{39-36} = R1;
143 let Inst{35-32} = R2;
144 let Inst{31-16} = RI4;
145 let Inst{15-12} = M3;
146 let Inst{11-8} = 0;
147 let Inst{7-0} = op{7-0};
148}
149
Richard Sandiforde1d9f002013-05-29 11:58:52 +0000150class InstRIEc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
151 : InstSystemZ<6, outs, ins, asmstr, pattern> {
152 field bits<48> Inst;
153 field bits<48> SoftFail = 0;
154
155 bits<4> R1;
156 bits<8> I2;
157 bits<4> M3;
158 bits<16> RI4;
159
160 let Inst{47-40} = op{15-8};
161 let Inst{39-36} = R1;
162 let Inst{35-32} = M3;
163 let Inst{31-16} = RI4;
164 let Inst{15-8} = I2;
165 let Inst{7-0} = op{7-0};
166}
167
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000168class InstRIEf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
169 : InstSystemZ<6, outs, ins, asmstr, pattern> {
170 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000171 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000172
173 bits<4> R1;
174 bits<4> R2;
175 bits<8> I3;
176 bits<8> I4;
177 bits<8> I5;
178
179 let Inst{47-40} = op{15-8};
180 let Inst{39-36} = R1;
181 let Inst{35-32} = R2;
182 let Inst{31-24} = I3;
183 let Inst{23-16} = I4;
184 let Inst{15-8} = I5;
185 let Inst{7-0} = op{7-0};
186}
187
188class InstRIL<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
189 : InstSystemZ<6, outs, ins, asmstr, pattern> {
190 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000191 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000192
193 bits<4> R1;
194 bits<32> I2;
195
196 let Inst{47-40} = op{11-4};
197 let Inst{39-36} = R1;
198 let Inst{35-32} = op{3-0};
199 let Inst{31-0} = I2;
200}
201
202class InstRR<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
203 : InstSystemZ<2, outs, ins, asmstr, pattern> {
204 field bits<16> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000205 field bits<16> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000206
207 bits<4> R1;
208 bits<4> R2;
209
210 let Inst{15-8} = op;
211 let Inst{7-4} = R1;
212 let Inst{3-0} = R2;
213}
214
215class InstRRD<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
216 : InstSystemZ<4, outs, ins, asmstr, pattern> {
217 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000218 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000219
220 bits<4> R1;
221 bits<4> R3;
222 bits<4> R2;
223
224 let Inst{31-16} = op;
225 let Inst{15-12} = R1;
226 let Inst{11-8} = 0;
227 let Inst{7-4} = R3;
228 let Inst{3-0} = R2;
229}
230
231class InstRRE<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> R2;
238
239 let Inst{31-16} = op;
240 let Inst{15-8} = 0;
241 let Inst{7-4} = R1;
242 let Inst{3-0} = R2;
243}
244
245class InstRRF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
246 : InstSystemZ<4, outs, ins, asmstr, pattern> {
247 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000248 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000249
250 bits<4> R1;
251 bits<4> R2;
252 bits<4> R3;
253
254 let Inst{31-16} = op;
255 let Inst{15-12} = R3;
256 let Inst{11-8} = 0;
257 let Inst{7-4} = R1;
258 let Inst{3-0} = R2;
259}
260
261class InstRX<bits<8> 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;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000267 bits<20> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000268
269 let Inst{31-24} = op;
270 let Inst{23-20} = R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000271 let Inst{19-0} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000272
273 let HasIndex = 1;
274}
275
276class InstRXE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
277 : InstSystemZ<6, outs, ins, asmstr, pattern> {
278 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000279 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000280
281 bits<4> R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000282 bits<20> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000283
284 let Inst{47-40} = op{15-8};
285 let Inst{39-36} = R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000286 let Inst{35-16} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000287 let Inst{15-8} = 0;
288 let Inst{7-0} = op{7-0};
289
290 let HasIndex = 1;
291}
292
293class InstRXF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
294 : InstSystemZ<6, outs, ins, asmstr, pattern> {
295 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000296 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000297
298 bits<4> R1;
299 bits<4> R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000300 bits<20> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000301
302 let Inst{47-40} = op{15-8};
303 let Inst{39-36} = R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000304 let Inst{35-16} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000305 let Inst{15-12} = R1;
306 let Inst{11-8} = 0;
307 let Inst{7-0} = op{7-0};
308
309 let HasIndex = 1;
310}
311
312class InstRXY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
313 : InstSystemZ<6, outs, ins, asmstr, pattern> {
314 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000315 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000316
317 bits<4> R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000318 bits<28> XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000319
320 let Inst{47-40} = op{15-8};
321 let Inst{39-36} = R1;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000322 let Inst{35-8} = XBD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000323 let Inst{7-0} = op{7-0};
324
325 let Has20BitOffset = 1;
326 let HasIndex = 1;
327}
328
329class InstRS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
330 : InstSystemZ<4, outs, ins, asmstr, pattern> {
331 field bits<32> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000332 field bits<32> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000333
334 bits<4> R1;
335 bits<4> R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000336 bits<16> BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000337
338 let Inst{31-24} = op;
339 let Inst{23-20} = R1;
340 let Inst{19-16} = R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000341 let Inst{15-0} = BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000342}
343
344class InstRSY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
345 : InstSystemZ<6, outs, ins, asmstr, pattern> {
346 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000347 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000348
349 bits<4> R1;
350 bits<4> R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000351 bits<24> BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000352
353 let Inst{47-40} = op{15-8};
354 let Inst{39-36} = R1;
355 let Inst{35-32} = R3;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000356 let Inst{31-8} = BD2;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000357 let Inst{7-0} = op{7-0};
358
359 let Has20BitOffset = 1;
360}
361
362class InstSI<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
Richard Sandifordd454ec02013-05-14 09:28:21 +0000367 bits<16> BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000368 bits<8> I2;
369
370 let Inst{31-24} = op;
371 let Inst{23-16} = I2;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000372 let Inst{15-0} = BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000373}
374
375class InstSIL<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
376 : InstSystemZ<6, outs, ins, asmstr, pattern> {
377 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000378 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000379
Richard Sandifordd454ec02013-05-14 09:28:21 +0000380 bits<16> BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000381 bits<16> I2;
382
383 let Inst{47-32} = op;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000384 let Inst{31-16} = BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000385 let Inst{15-0} = I2;
386}
387
388class InstSIY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
389 : InstSystemZ<6, outs, ins, asmstr, pattern> {
390 field bits<48> Inst;
Richard Sandifordeb9af292013-05-14 10:17:52 +0000391 field bits<48> SoftFail = 0;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000392
Richard Sandifordd454ec02013-05-14 09:28:21 +0000393 bits<24> BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000394 bits<8> I2;
395
396 let Inst{47-40} = op{15-8};
397 let Inst{39-32} = I2;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000398 let Inst{31-8} = BD1;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000399 let Inst{7-0} = op{7-0};
400
401 let Has20BitOffset = 1;
402}
403
Richard Sandiford1d959002013-07-02 14:56:45 +0000404class InstSS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
405 : InstSystemZ<6, outs, ins, asmstr, pattern> {
406 field bits<48> Inst;
407 field bits<48> SoftFail = 0;
408
409 bits<24> BDL1;
410 bits<16> BD2;
411
412 let Inst{47-40} = op;
413 let Inst{39-16} = BDL1;
414 let Inst{15-0} = BD2;
415}
416
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000417//===----------------------------------------------------------------------===//
418// Instruction definitions with semantics
419//===----------------------------------------------------------------------===//
420//
421// These classes have the form <Category><Format>, where <Format> is one
422// of the formats defined above and where <Category> describes the inputs
423// and outputs. <Category> can be one of:
424//
425// Inherent:
426// One register output operand and no input operands.
427//
428// Store:
429// One register or immediate input operand and one address input operand.
430// The instruction stores the first operand to the address.
431//
432// This category is used for both pure and truncating stores.
433//
434// LoadMultiple:
435// One address input operand and two explicit output operands.
436// The instruction loads a range of registers from the address,
437// with the explicit operands giving the first and last register
438// to load. Other loaded registers are added as implicit definitions.
439//
440// StoreMultiple:
441// Two explicit input register operands and an address operand.
442// The instruction stores a range of registers to the address,
443// with the explicit operands giving the first and last register
444// to store. Other stored registers are added as implicit uses.
445//
446// Unary:
447// One register output operand and one input operand. The input
448// operand may be a register, immediate or memory.
449//
450// Binary:
451// One register output operand and two input operands. The first
452// input operand is always a register and he second may be a register,
453// immediate or memory.
454//
455// Shift:
456// One register output operand and two input operands. The first
457// input operand is a register and the second has the same form as
458// an address (although it isn't actually used to address memory).
459//
460// Compare:
461// Two input operands. The first operand is always a register,
462// the second may be a register, immediate or memory.
463//
464// Ternary:
465// One register output operand and three register input operands.
466//
467// CmpSwap:
468// One output operand and three input operands. The first two
469// operands are registers and the third is an address. The instruction
470// both reads from and writes to the address.
471//
472// RotateSelect:
473// One output operand and five input operands. The first two operands
474// are registers and the other three are immediates.
475//
476// The format determines which input operands are tied to output operands,
477// and also determines the shape of any address operand.
478//
479// Multiclasses of the form <Category><Format>Pair define two instructions,
480// one with <Category><Format> and one with <Category><Format>Y. The name
481// of the first instruction has no suffix, the name of the second has
482// an extra "y".
483//
484//===----------------------------------------------------------------------===//
485
486class InherentRRE<string mnemonic, bits<16> opcode, RegisterOperand cls,
487 dag src>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000488 : InstRRE<opcode, (outs cls:$R1), (ins),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000489 mnemonic#"r\t$R1",
Richard Sandifordd454ec02013-05-14 09:28:21 +0000490 [(set cls:$R1, src)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000491 let R2 = 0;
492}
493
494class LoadMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000495 : InstRSY<opcode, (outs cls:$R1, cls:$R3), (ins bdaddr20only:$BD2),
496 mnemonic#"\t$R1, $R3, $BD2", []> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000497 let mayLoad = 1;
498}
499
500class StoreRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
501 RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000502 : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
503 mnemonic#"\t$R1, $I2",
504 [(operator cls:$R1, pcrel32:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000505 let mayStore = 1;
506 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
507 // However, BDXs have two extra operands and are therefore 6 units more
508 // complex.
509 let AddedComplexity = 7;
510}
511
512class StoreRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000513 RegisterOperand cls, bits<5> bytes,
514 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000515 : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
516 mnemonic#"\t$R1, $XBD2",
517 [(operator cls:$R1, mode:$XBD2)]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000518 let OpKey = mnemonic ## cls;
519 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000520 let mayStore = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000521 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000522}
523
524class StoreRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000525 RegisterOperand cls, bits<5> bytes,
526 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000527 : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
528 mnemonic#"\t$R1, $XBD2",
529 [(operator cls:$R1, mode:$XBD2)]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000530 let OpKey = mnemonic ## cls;
531 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000532 let mayStore = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000533 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000534}
535
536multiclass StoreRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000537 SDPatternOperator operator, RegisterOperand cls,
538 bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000539 let DispKey = mnemonic ## #cls in {
540 let DispSize = "12" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000541 def "" : StoreRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000542 let DispSize = "20" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000543 def Y : StoreRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
544 bdxaddr20pair>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000545 }
546}
547
548class StoreMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000549 : InstRSY<opcode, (outs), (ins cls:$R1, cls:$R3, bdaddr20only:$BD2),
550 mnemonic#"\t$R1, $R3, $BD2", []> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000551 let mayStore = 1;
552}
553
554class StoreSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
555 Immediate imm, AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000556 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
557 mnemonic#"\t$BD1, $I2",
558 [(operator imm:$I2, mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000559 let mayStore = 1;
560}
561
562class StoreSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
563 Immediate imm, AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000564 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
565 mnemonic#"\t$BD1, $I2",
566 [(operator imm:$I2, mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000567 let mayStore = 1;
568}
569
570class StoreSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
571 Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000572 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
573 mnemonic#"\t$BD1, $I2",
574 [(operator imm:$I2, bdaddr12only:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000575 let mayStore = 1;
576}
577
578multiclass StoreSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
579 SDPatternOperator operator, Immediate imm> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000580 let DispKey = mnemonic in {
581 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000582 def "" : StoreSI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000583 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000584 def Y : StoreSIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
585 }
586}
587
588class UnaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
589 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000590 : InstRR<opcode, (outs cls1:$R1), (ins cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000591 mnemonic#"r\t$R1, $R2",
592 [(set cls1:$R1, (operator cls2:$R2))]> {
593 let OpKey = mnemonic ## cls1;
594 let OpType = "reg";
595}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000596
597class UnaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
598 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000599 : InstRRE<opcode, (outs cls1:$R1), (ins cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000600 mnemonic#"r\t$R1, $R2",
601 [(set cls1:$R1, (operator cls2:$R2))]> {
602 let OpKey = mnemonic ## cls1;
603 let OpType = "reg";
604}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000605
606class UnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
607 RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000608 : InstRRF<opcode, (outs cls1:$R1), (ins uimm8zx4:$R3, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000609 mnemonic#"r\t$R1, $R3, $R2", []> {
610 let OpKey = mnemonic ## cls1;
611 let OpType = "reg";
612}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000613
614class UnaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
615 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000616 : InstRI<opcode, (outs cls:$R1), (ins imm:$I2),
617 mnemonic#"\t$R1, $I2",
618 [(set cls:$R1, (operator imm:$I2))]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000619
620class UnaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
621 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000622 : InstRIL<opcode, (outs cls:$R1), (ins imm:$I2),
623 mnemonic#"\t$R1, $I2",
624 [(set cls:$R1, (operator imm:$I2))]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000625
626class UnaryRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
627 RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000628 : InstRIL<opcode, (outs cls:$R1), (ins pcrel32:$I2),
629 mnemonic#"\t$R1, $I2",
630 [(set cls:$R1, (operator pcrel32:$I2))]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000631 let mayLoad = 1;
632 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
633 // However, BDXs have two extra operands and are therefore 6 units more
634 // complex.
635 let AddedComplexity = 7;
636}
637
638class UnaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000639 RegisterOperand cls, bits<5> bytes,
640 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000641 : InstRX<opcode, (outs cls:$R1), (ins mode:$XBD2),
642 mnemonic#"\t$R1, $XBD2",
643 [(set cls:$R1, (operator mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000644 let OpKey = mnemonic ## cls;
645 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000646 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000647 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000648}
649
650class UnaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000651 RegisterOperand cls, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000652 : InstRXE<opcode, (outs cls:$R1), (ins bdxaddr12only:$XBD2),
653 mnemonic#"\t$R1, $XBD2",
654 [(set cls:$R1, (operator bdxaddr12only:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000655 let OpKey = mnemonic ## cls;
656 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000657 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000658 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000659}
660
661class UnaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000662 RegisterOperand cls, bits<5> bytes,
663 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000664 : InstRXY<opcode, (outs cls:$R1), (ins mode:$XBD2),
665 mnemonic#"\t$R1, $XBD2",
666 [(set cls:$R1, (operator mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000667 let OpKey = mnemonic ## cls;
668 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000669 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000670 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000671}
672
673multiclass UnaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000674 SDPatternOperator operator, RegisterOperand cls,
675 bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000676 let DispKey = mnemonic ## #cls in {
677 let DispSize = "12" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000678 def "" : UnaryRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000679 let DispSize = "20" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000680 def Y : UnaryRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
681 bdxaddr20pair>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000682 }
683}
684
685class BinaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
686 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000687 : InstRR<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000688 mnemonic#"r\t$R1, $R2",
Richard Sandifordd454ec02013-05-14 09:28:21 +0000689 [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000690 let OpKey = mnemonic ## cls1;
691 let OpType = "reg";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000692 let Constraints = "$R1 = $R1src";
693 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000694}
695
696class BinaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
697 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000698 : InstRRE<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000699 mnemonic#"r\t$R1, $R2",
Richard Sandifordd454ec02013-05-14 09:28:21 +0000700 [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000701 let OpKey = mnemonic ## cls1;
702 let OpType = "reg";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000703 let Constraints = "$R1 = $R1src";
704 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000705}
706
Richard Sandifordd454ec02013-05-14 09:28:21 +0000707class BinaryRRF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
708 RegisterOperand cls1, RegisterOperand cls2>
709 : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R3, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000710 mnemonic#"r\t$R1, $R3, $R2",
711 [(set cls1:$R1, (operator cls1:$R3, cls2:$R2))]> {
712 let OpKey = mnemonic ## cls1;
713 let OpType = "reg";
714}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000715
716class BinaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
717 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000718 : InstRI<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
719 mnemonic#"\t$R1, $I2",
720 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
721 let Constraints = "$R1 = $R1src";
722 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000723}
724
725class BinaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
726 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000727 : InstRIL<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
728 mnemonic#"\t$R1, $I2",
729 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
730 let Constraints = "$R1 = $R1src";
731 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000732}
733
734class BinaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000735 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000736 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000737 : InstRX<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
738 mnemonic#"\t$R1, $XBD2",
739 [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000740 let OpKey = mnemonic ## cls;
741 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000742 let Constraints = "$R1 = $R1src";
743 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000744 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000745 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000746}
747
748class BinaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000749 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000750 : InstRXE<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr12only:$XBD2),
751 mnemonic#"\t$R1, $XBD2",
752 [(set cls:$R1, (operator cls:$R1src,
753 (load bdxaddr12only:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000754 let OpKey = mnemonic ## cls;
755 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000756 let Constraints = "$R1 = $R1src";
757 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000758 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000759 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000760}
761
762class BinaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000763 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000764 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000765 : InstRXY<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
766 mnemonic#"\t$R1, $XBD2",
767 [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000768 let OpKey = mnemonic ## cls;
769 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000770 let Constraints = "$R1 = $R1src";
771 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000772 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000773 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000774}
775
776multiclass BinaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
777 SDPatternOperator operator, RegisterOperand cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000778 SDPatternOperator load, bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000779 let DispKey = mnemonic ## #cls in {
780 let DispSize = "12" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000781 def "" : BinaryRX<mnemonic, rxOpcode, operator, cls, load, bytes,
782 bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000783 let DispSize = "20" in
Richard Sandiforded1fab62013-07-03 10:10:02 +0000784 def Y : BinaryRXY<mnemonic#"y", rxyOpcode, operator, cls, load, bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000785 bdxaddr20pair>;
786 }
787}
788
789class BinarySI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
790 Operand imm, AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000791 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
792 mnemonic#"\t$BD1, $I2",
793 [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000794 let mayLoad = 1;
795 let mayStore = 1;
796}
797
798class BinarySIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
799 Operand imm, AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000800 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
801 mnemonic#"\t$BD1, $I2",
802 [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000803 let mayLoad = 1;
804 let mayStore = 1;
805}
806
807multiclass BinarySIPair<string mnemonic, bits<8> siOpcode,
808 bits<16> siyOpcode, SDPatternOperator operator,
809 Operand imm> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000810 let DispKey = mnemonic ## #cls in {
811 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000812 def "" : BinarySI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000813 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000814 def Y : BinarySIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
815 }
816}
817
818class ShiftRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000819 RegisterOperand cls>
820 : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, shift12only:$BD2),
Richard Sandifordd454ec02013-05-14 09:28:21 +0000821 mnemonic#"\t$R1, $BD2",
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000822 [(set cls:$R1, (operator cls:$R1src, shift12only:$BD2))]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000823 let R3 = 0;
Richard Sandifordd454ec02013-05-14 09:28:21 +0000824 let Constraints = "$R1 = $R1src";
825 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000826}
827
828class ShiftRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000829 RegisterOperand cls>
830 : InstRSY<opcode, (outs cls:$R1), (ins cls:$R3, shift20only:$BD2),
Richard Sandifordd454ec02013-05-14 09:28:21 +0000831 mnemonic#"\t$R1, $R3, $BD2",
Richard Sandiford27d1cfe2013-07-19 16:09:03 +0000832 [(set cls:$R1, (operator cls:$R3, shift20only:$BD2))]>;
833
834multiclass ShiftRSAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
835 SDPatternOperator operator, RegisterOperand cls> {
836 def K : ShiftRSY<mnemonic##"k", opcode2, null_frag, cls>,
837 Requires<[FeatureDistinctOps]>;
838 def "" : ShiftRS<mnemonic, opcode1, operator, cls>;
839}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000840
841class CompareRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
842 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000843 : InstRR<opcode, (outs), (ins cls1:$R1, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000844 mnemonic#"r\t$R1, $R2",
845 [(operator cls1:$R1, cls2:$R2)]> {
846 let OpKey = mnemonic ## cls1;
847 let OpType = "reg";
848}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000849
850class CompareRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
851 RegisterOperand cls1, RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000852 : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000853 mnemonic#"r\t$R1, $R2",
854 [(operator cls1:$R1, cls2:$R2)]> {
855 let OpKey = mnemonic ## cls1;
856 let OpType = "reg";
857}
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000858
859class CompareRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
860 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000861 : InstRI<opcode, (outs), (ins cls:$R1, imm:$I2),
862 mnemonic#"\t$R1, $I2",
863 [(operator cls:$R1, imm:$I2)]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000864
865class CompareRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
866 RegisterOperand cls, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000867 : InstRIL<opcode, (outs), (ins cls:$R1, imm:$I2),
868 mnemonic#"\t$R1, $I2",
869 [(operator cls:$R1, imm:$I2)]>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000870
871class CompareRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
872 RegisterOperand cls, SDPatternOperator load>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000873 : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
874 mnemonic#"\t$R1, $I2",
875 [(operator cls:$R1, (load pcrel32:$I2))]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000876 let mayLoad = 1;
877 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
878 // However, BDXs have two extra operands and are therefore 6 units more
879 // complex.
880 let AddedComplexity = 7;
881}
882
883class CompareRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000884 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000885 AddressingMode mode = bdxaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000886 : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
887 mnemonic#"\t$R1, $XBD2",
888 [(operator cls:$R1, (load mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000889 let OpKey = mnemonic ## cls;
890 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000891 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000892 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000893}
894
895class CompareRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000896 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000897 : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2),
898 mnemonic#"\t$R1, $XBD2",
899 [(operator cls:$R1, (load bdxaddr12only:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000900 let OpKey = mnemonic ## cls;
901 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000902 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000903 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000904}
905
906class CompareRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000907 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000908 AddressingMode mode = bdxaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000909 : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
910 mnemonic#"\t$R1, $XBD2",
911 [(operator cls:$R1, (load mode:$XBD2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000912 let OpKey = mnemonic ## cls;
913 let OpType = "mem";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000914 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000915 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000916}
917
918multiclass CompareRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
919 SDPatternOperator operator, RegisterOperand cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000920 SDPatternOperator load, bits<5> bytes> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000921 let DispKey = mnemonic ## #cls in {
922 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000923 def "" : CompareRX<mnemonic, rxOpcode, operator, cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000924 load, bytes, bdxaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000925 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000926 def Y : CompareRXY<mnemonic#"y", rxyOpcode, operator, cls,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000927 load, bytes, bdxaddr20pair>;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000928 }
929}
930
931class CompareSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
932 SDPatternOperator load, Immediate imm,
933 AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000934 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
935 mnemonic#"\t$BD1, $I2",
936 [(operator (load mode:$BD1), imm:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000937 let mayLoad = 1;
938}
939
940class CompareSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
941 SDPatternOperator load, Immediate imm>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000942 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
943 mnemonic#"\t$BD1, $I2",
944 [(operator (load bdaddr12only:$BD1), imm:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000945 let mayLoad = 1;
946}
947
948class CompareSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
949 SDPatternOperator load, Immediate imm,
950 AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000951 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
952 mnemonic#"\t$BD1, $I2",
953 [(operator (load mode:$BD1), imm:$I2)]> {
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000954 let mayLoad = 1;
955}
956
957multiclass CompareSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
958 SDPatternOperator operator, SDPatternOperator load,
959 Immediate imm> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000960 let DispKey = mnemonic in {
961 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000962 def "" : CompareSI<mnemonic, siOpcode, operator, load, imm, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +0000963 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000964 def Y : CompareSIY<mnemonic#"y", siyOpcode, operator, load, imm,
965 bdaddr20pair>;
966 }
967}
968
969class TernaryRRD<string mnemonic, bits<16> opcode,
970 SDPatternOperator operator, RegisterOperand cls>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000971 : InstRRD<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, cls:$R2),
Richard Sandiforded1fab62013-07-03 10:10:02 +0000972 mnemonic#"r\t$R1, $R3, $R2",
Richard Sandifordd454ec02013-05-14 09:28:21 +0000973 [(set cls:$R1, (operator cls:$R1src, cls:$R3, cls:$R2))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000974 let OpKey = mnemonic ## cls;
975 let OpType = "reg";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000976 let Constraints = "$R1 = $R1src";
977 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000978}
979
980class TernaryRXF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
Richard Sandiforded1fab62013-07-03 10:10:02 +0000981 RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000982 : InstRXF<opcode, (outs cls:$R1),
983 (ins cls:$R1src, cls:$R3, bdxaddr12only:$XBD2),
984 mnemonic#"\t$R1, $R3, $XBD2",
985 [(set cls:$R1, (operator cls:$R1src, cls:$R3,
986 (load bdxaddr12only:$XBD2)))]> {
Richard Sandiforded1fab62013-07-03 10:10:02 +0000987 let OpKey = mnemonic ## cls;
988 let OpType = "mem";
Richard Sandifordd454ec02013-05-14 09:28:21 +0000989 let Constraints = "$R1 = $R1src";
990 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000991 let mayLoad = 1;
Richard Sandiforded1fab62013-07-03 10:10:02 +0000992 let AccessBytes = bytes;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000993}
994
995class CmpSwapRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
996 RegisterOperand cls, AddressingMode mode = bdaddr12only>
Richard Sandifordd454ec02013-05-14 09:28:21 +0000997 : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
998 mnemonic#"\t$R1, $R3, $BD2",
999 [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
1000 let Constraints = "$R1 = $R1src";
1001 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001002 let mayLoad = 1;
1003 let mayStore = 1;
1004}
1005
1006class CmpSwapRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
1007 RegisterOperand cls, AddressingMode mode = bdaddr20only>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001008 : InstRSY<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
1009 mnemonic#"\t$R1, $R3, $BD2",
1010 [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
1011 let Constraints = "$R1 = $R1src";
1012 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001013 let mayLoad = 1;
1014 let mayStore = 1;
1015}
1016
1017multiclass CmpSwapRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode,
1018 SDPatternOperator operator, RegisterOperand cls> {
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001019 let DispKey = mnemonic ## #cls in {
1020 let DispSize = "12" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001021 def "" : CmpSwapRS<mnemonic, rsOpcode, operator, cls, bdaddr12pair>;
Richard Sandiforddf313ff2013-07-03 09:19:58 +00001022 let DispSize = "20" in
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001023 def Y : CmpSwapRSY<mnemonic#"y", rsyOpcode, operator, cls, bdaddr20pair>;
1024 }
1025}
1026
1027class RotateSelectRIEf<string mnemonic, bits<16> opcode, RegisterOperand cls1,
1028 RegisterOperand cls2>
Richard Sandifordd454ec02013-05-14 09:28:21 +00001029 : InstRIEf<opcode, (outs cls1:$R1),
Richard Sandiford67ddcd62013-07-11 08:37:13 +00001030 (ins cls1:$R1src, cls2:$R2, uimm8:$I3, uimm8:$I4, uimm8zx6:$I5),
Richard Sandifordd454ec02013-05-14 09:28:21 +00001031 mnemonic#"\t$R1, $R2, $I3, $I4, $I5", []> {
1032 let Constraints = "$R1 = $R1src";
1033 let DisableEncoding = "$R1src";
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001034}
1035
1036//===----------------------------------------------------------------------===//
1037// Pseudo instructions
1038//===----------------------------------------------------------------------===//
1039//
1040// Convenience instructions that get lowered to real instructions
1041// by either SystemZTargetLowering::EmitInstrWithCustomInserter()
1042// or SystemZInstrInfo::expandPostRAPseudo().
1043//
1044//===----------------------------------------------------------------------===//
1045
1046class Pseudo<dag outs, dag ins, list<dag> pattern>
1047 : InstSystemZ<0, outs, ins, "", pattern> {
1048 let isPseudo = 1;
1049 let isCodeGenOnly = 1;
1050}
1051
1052// Implements "$dst = $cc & (8 >> CC) ? $src1 : $src2", where CC is
1053// the value of the PSW's 2-bit condition code field.
1054class SelectWrapper<RegisterOperand cls>
1055 : Pseudo<(outs cls:$dst), (ins cls:$src1, cls:$src2, i8imm:$cc),
1056 [(set cls:$dst, (z_select_ccmask cls:$src1, cls:$src2, imm:$cc))]> {
1057 let usesCustomInserter = 1;
1058 // Although the instructions used by these nodes do not in themselves
Richard Sandiford14a44492013-05-22 13:38:45 +00001059 // change CC, the insertion requires new blocks, and CC cannot be live
1060 // across them.
1061 let Defs = [CC];
1062 let Uses = [CC];
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001063}
1064
Richard Sandifordb86a8342013-06-27 09:27:40 +00001065// Stores $new to $addr if $cc is true ("" case) or false (Inv case).
1066multiclass CondStores<RegisterOperand cls, SDPatternOperator store,
1067 SDPatternOperator load, AddressingMode mode> {
1068 let Defs = [CC], Uses = [CC], usesCustomInserter = 1 in {
1069 def "" : Pseudo<(outs), (ins mode:$addr, cls:$new, i8imm:$cc),
1070 [(store (z_select_ccmask cls:$new, (load mode:$addr),
1071 imm:$cc), mode:$addr)]>;
1072 def Inv : Pseudo<(outs), (ins mode:$addr, cls:$new, i8imm:$cc),
1073 [(store (z_select_ccmask (load mode:$addr), cls:$new,
1074 imm:$cc), mode:$addr)]>;
1075 }
1076}
1077
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001078// OPERATOR is ATOMIC_SWAP or an ATOMIC_LOAD_* operation. PAT and OPERAND
1079// describe the second (non-memory) operand.
1080class AtomicLoadBinary<SDPatternOperator operator, RegisterOperand cls,
1081 dag pat, DAGOperand operand>
1082 : Pseudo<(outs cls:$dst), (ins bdaddr20only:$ptr, operand:$src2),
1083 [(set cls:$dst, (operator bdaddr20only:$ptr, pat))]> {
Richard Sandiford14a44492013-05-22 13:38:45 +00001084 let Defs = [CC];
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001085 let Has20BitOffset = 1;
1086 let mayLoad = 1;
1087 let mayStore = 1;
1088 let usesCustomInserter = 1;
1089}
1090
1091// Specializations of AtomicLoadWBinary.
1092class AtomicLoadBinaryReg32<SDPatternOperator operator>
1093 : AtomicLoadBinary<operator, GR32, (i32 GR32:$src2), GR32>;
1094class AtomicLoadBinaryImm32<SDPatternOperator operator, Immediate imm>
1095 : AtomicLoadBinary<operator, GR32, (i32 imm:$src2), imm>;
1096class AtomicLoadBinaryReg64<SDPatternOperator operator>
1097 : AtomicLoadBinary<operator, GR64, (i64 GR64:$src2), GR64>;
1098class AtomicLoadBinaryImm64<SDPatternOperator operator, Immediate imm>
1099 : AtomicLoadBinary<operator, GR64, (i64 imm:$src2), imm>;
1100
1101// OPERATOR is ATOMIC_SWAPW or an ATOMIC_LOADW_* operation. PAT and OPERAND
1102// describe the second (non-memory) operand.
1103class AtomicLoadWBinary<SDPatternOperator operator, dag pat,
1104 DAGOperand operand>
1105 : Pseudo<(outs GR32:$dst),
1106 (ins bdaddr20only:$ptr, operand:$src2, ADDR32:$bitshift,
1107 ADDR32:$negbitshift, uimm32:$bitsize),
1108 [(set GR32:$dst, (operator bdaddr20only:$ptr, pat, ADDR32:$bitshift,
1109 ADDR32:$negbitshift, uimm32:$bitsize))]> {
Richard Sandiford14a44492013-05-22 13:38:45 +00001110 let Defs = [CC];
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001111 let Has20BitOffset = 1;
1112 let mayLoad = 1;
1113 let mayStore = 1;
1114 let usesCustomInserter = 1;
1115}
1116
1117// Specializations of AtomicLoadWBinary.
1118class AtomicLoadWBinaryReg<SDPatternOperator operator>
1119 : AtomicLoadWBinary<operator, (i32 GR32:$src2), GR32>;
1120class AtomicLoadWBinaryImm<SDPatternOperator operator, Immediate imm>
1121 : AtomicLoadWBinary<operator, (i32 imm:$src2), imm>;