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