1 //==- SystemZInstrFormats.td - SystemZ Instruction Formats --*- tablegen -*-==//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 //===----------------------------------------------------------------------===//
11 // Basic SystemZ instruction definition
12 //===----------------------------------------------------------------------===//
14 class InstSystemZ<int size, dag outs, dag ins, string asmstr,
15 list<dag> pattern> : Instruction {
16 let Namespace = "SystemZ";
18 dag OutOperandList = outs;
19 dag InOperandList = ins;
21 let Pattern = pattern;
22 let AsmString = asmstr;
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"
29 string DispSize = "none";
31 // True if this instruction is a simple D(X,B) load of a register
32 // (with no sign or zero extension).
33 bit SimpleBDXLoad = 0;
35 // True if this instruction is a simple D(X,B) store of a register
36 // (with no truncation).
37 bit SimpleBDXStore = 0;
39 // True if this instruction has a 20-bit displacement field.
40 bit Has20BitOffset = 0;
42 // True if addresses in this instruction have an index register.
45 // True if this is a 128-bit pseudo instruction that combines two 64-bit
49 let TSFlags{0} = SimpleBDXLoad;
50 let TSFlags{1} = SimpleBDXStore;
51 let TSFlags{2} = Has20BitOffset;
52 let TSFlags{3} = HasIndex;
53 let TSFlags{4} = Is128Bit;
56 //===----------------------------------------------------------------------===//
57 // Mappings between instructions
58 //===----------------------------------------------------------------------===//
60 // Return the version of an instruction that has an unsigned 12-bit
62 def getDisp12Opcode : InstrMapping {
63 let FilterClass = "InstSystemZ";
64 let RowFields = ["DispKey"];
65 let ColFields = ["DispSize"];
67 let ValueCols = [["12"]];
70 // Return the version of an instruction that has a signed 20-bit displacement.
71 def getDisp20Opcode : InstrMapping {
72 let FilterClass = "InstSystemZ";
73 let RowFields = ["DispKey"];
74 let ColFields = ["DispSize"];
76 let ValueCols = [["20"]];
79 //===----------------------------------------------------------------------===//
80 // Instruction formats
81 //===----------------------------------------------------------------------===//
83 // Formats are specified using operand field declarations of the form:
85 // bits<4> Rn : register input or output for operand n
86 // bits<m> In : immediate value of width m for operand n
87 // bits<4> BDn : address operand n, which has a base and a displacement
88 // bits<m> XBDn : address operand n, which has an index, a base and a
90 // bits<4> Xn : index register for address operand n
91 // bits<4> Mn : mode value for operand n
93 // The operand numbers ("n" in the list above) follow the architecture manual.
94 // Assembly operands sometimes have a different order; in particular, R3 often
95 // is often written between operands 1 and 2.
97 //===----------------------------------------------------------------------===//
99 class InstRI<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
100 : InstSystemZ<4, outs, ins, asmstr, pattern> {
102 field bits<32> SoftFail = 0;
107 let Inst{31-24} = op{11-4};
108 let Inst{23-20} = R1;
109 let Inst{19-16} = op{3-0};
113 class InstRIEb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
114 : InstSystemZ<6, outs, ins, asmstr, pattern> {
116 field bits<48> SoftFail = 0;
123 let Inst{47-40} = op{15-8};
124 let Inst{39-36} = R1;
125 let Inst{35-32} = R2;
126 let Inst{31-16} = RI4;
127 let Inst{15-12} = M3;
129 let Inst{7-0} = op{7-0};
132 class InstRIEc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
133 : InstSystemZ<6, outs, ins, asmstr, pattern> {
135 field bits<48> SoftFail = 0;
142 let Inst{47-40} = op{15-8};
143 let Inst{39-36} = R1;
144 let Inst{35-32} = M3;
145 let Inst{31-16} = RI4;
147 let Inst{7-0} = op{7-0};
150 class InstRIEf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
151 : InstSystemZ<6, outs, ins, asmstr, pattern> {
153 field bits<48> SoftFail = 0;
161 let Inst{47-40} = op{15-8};
162 let Inst{39-36} = R1;
163 let Inst{35-32} = R2;
164 let Inst{31-24} = I3;
165 let Inst{23-16} = I4;
167 let Inst{7-0} = op{7-0};
170 class InstRIL<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
171 : InstSystemZ<6, outs, ins, asmstr, pattern> {
173 field bits<48> SoftFail = 0;
178 let Inst{47-40} = op{11-4};
179 let Inst{39-36} = R1;
180 let Inst{35-32} = op{3-0};
184 class InstRR<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
185 : InstSystemZ<2, outs, ins, asmstr, pattern> {
187 field bits<16> SoftFail = 0;
197 class InstRRD<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
198 : InstSystemZ<4, outs, ins, asmstr, pattern> {
200 field bits<32> SoftFail = 0;
206 let Inst{31-16} = op;
207 let Inst{15-12} = R1;
213 class InstRRE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
214 : InstSystemZ<4, outs, ins, asmstr, pattern> {
216 field bits<32> SoftFail = 0;
221 let Inst{31-16} = op;
227 class InstRRF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
228 : InstSystemZ<4, outs, ins, asmstr, pattern> {
230 field bits<32> SoftFail = 0;
236 let Inst{31-16} = op;
237 let Inst{15-12} = R3;
243 class InstRX<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
244 : InstSystemZ<4, outs, ins, asmstr, pattern> {
246 field bits<32> SoftFail = 0;
251 let Inst{31-24} = op;
252 let Inst{23-20} = R1;
253 let Inst{19-0} = XBD2;
258 class InstRXE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
259 : InstSystemZ<6, outs, ins, asmstr, pattern> {
261 field bits<48> SoftFail = 0;
266 let Inst{47-40} = op{15-8};
267 let Inst{39-36} = R1;
268 let Inst{35-16} = XBD2;
270 let Inst{7-0} = op{7-0};
275 class InstRXF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
276 : InstSystemZ<6, outs, ins, asmstr, pattern> {
278 field bits<48> SoftFail = 0;
284 let Inst{47-40} = op{15-8};
285 let Inst{39-36} = R3;
286 let Inst{35-16} = XBD2;
287 let Inst{15-12} = R1;
289 let Inst{7-0} = op{7-0};
294 class InstRXY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
295 : InstSystemZ<6, outs, ins, asmstr, pattern> {
297 field bits<48> SoftFail = 0;
302 let Inst{47-40} = op{15-8};
303 let Inst{39-36} = R1;
304 let Inst{35-8} = XBD2;
305 let Inst{7-0} = op{7-0};
307 let Has20BitOffset = 1;
311 class InstRS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
312 : InstSystemZ<4, outs, ins, asmstr, pattern> {
314 field bits<32> SoftFail = 0;
320 let Inst{31-24} = op;
321 let Inst{23-20} = R1;
322 let Inst{19-16} = R3;
323 let Inst{15-0} = BD2;
326 class InstRSY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
327 : InstSystemZ<6, outs, ins, asmstr, pattern> {
329 field bits<48> SoftFail = 0;
335 let Inst{47-40} = op{15-8};
336 let Inst{39-36} = R1;
337 let Inst{35-32} = R3;
338 let Inst{31-8} = BD2;
339 let Inst{7-0} = op{7-0};
341 let Has20BitOffset = 1;
344 class InstSI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
345 : InstSystemZ<4, outs, ins, asmstr, pattern> {
347 field bits<32> SoftFail = 0;
352 let Inst{31-24} = op;
353 let Inst{23-16} = I2;
354 let Inst{15-0} = BD1;
357 class InstSIL<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
358 : InstSystemZ<6, outs, ins, asmstr, pattern> {
360 field bits<48> SoftFail = 0;
365 let Inst{47-32} = op;
366 let Inst{31-16} = BD1;
370 class InstSIY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
371 : InstSystemZ<6, outs, ins, asmstr, pattern> {
373 field bits<48> SoftFail = 0;
378 let Inst{47-40} = op{15-8};
379 let Inst{39-32} = I2;
380 let Inst{31-8} = BD1;
381 let Inst{7-0} = op{7-0};
383 let Has20BitOffset = 1;
386 class InstSS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
387 : InstSystemZ<6, outs, ins, asmstr, pattern> {
389 field bits<48> SoftFail = 0;
394 let Inst{47-40} = op;
395 let Inst{39-16} = BDL1;
396 let Inst{15-0} = BD2;
399 //===----------------------------------------------------------------------===//
400 // Instruction definitions with semantics
401 //===----------------------------------------------------------------------===//
403 // These classes have the form <Category><Format>, where <Format> is one
404 // of the formats defined above and where <Category> describes the inputs
405 // and outputs. <Category> can be one of:
408 // One register output operand and no input operands.
411 // One register or immediate input operand and one address input operand.
412 // The instruction stores the first operand to the address.
414 // This category is used for both pure and truncating stores.
417 // One address input operand and two explicit output operands.
418 // The instruction loads a range of registers from the address,
419 // with the explicit operands giving the first and last register
420 // to load. Other loaded registers are added as implicit definitions.
423 // Two explicit input register operands and an address operand.
424 // The instruction stores a range of registers to the address,
425 // with the explicit operands giving the first and last register
426 // to store. Other stored registers are added as implicit uses.
429 // One register output operand and one input operand. The input
430 // operand may be a register, immediate or memory.
433 // One register output operand and two input operands. The first
434 // input operand is always a register and he second may be a register,
435 // immediate or memory.
438 // One register output operand and two input operands. The first
439 // input operand is a register and the second has the same form as
440 // an address (although it isn't actually used to address memory).
443 // Two input operands. The first operand is always a register,
444 // the second may be a register, immediate or memory.
447 // One register output operand and three register input operands.
450 // One output operand and three input operands. The first two
451 // operands are registers and the third is an address. The instruction
452 // both reads from and writes to the address.
455 // One output operand and five input operands. The first two operands
456 // are registers and the other three are immediates.
458 // The format determines which input operands are tied to output operands,
459 // and also determines the shape of any address operand.
461 // Multiclasses of the form <Category><Format>Pair define two instructions,
462 // one with <Category><Format> and one with <Category><Format>Y. The name
463 // of the first instruction has no suffix, the name of the second has
466 //===----------------------------------------------------------------------===//
468 class InherentRRE<string mnemonic, bits<16> opcode, RegisterOperand cls,
470 : InstRRE<opcode, (outs cls:$R1), (ins),
472 [(set cls:$R1, src)]> {
476 class LoadMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
477 : InstRSY<opcode, (outs cls:$R1, cls:$R3), (ins bdaddr20only:$BD2),
478 mnemonic#"\t$R1, $R3, $BD2", []> {
482 class StoreRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
484 : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
485 mnemonic#"\t$R1, $I2",
486 [(operator cls:$R1, pcrel32:$I2)]> {
488 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
489 // However, BDXs have two extra operands and are therefore 6 units more
491 let AddedComplexity = 7;
494 class StoreRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
495 RegisterOperand cls, AddressingMode mode = bdxaddr12only>
496 : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
497 mnemonic#"\t$R1, $XBD2",
498 [(operator cls:$R1, mode:$XBD2)]> {
502 class StoreRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
503 RegisterOperand cls, AddressingMode mode = bdxaddr20only>
504 : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
505 mnemonic#"\t$R1, $XBD2",
506 [(operator cls:$R1, mode:$XBD2)]> {
510 multiclass StoreRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
511 SDPatternOperator operator, RegisterOperand cls> {
512 let DispKey = mnemonic ## #cls in {
513 let DispSize = "12" in
514 def "" : StoreRX<mnemonic, rxOpcode, operator, cls, bdxaddr12pair>;
515 let DispSize = "20" in
516 def Y : StoreRXY<mnemonic#"y", rxyOpcode, operator, cls, bdxaddr20pair>;
520 class StoreMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
521 : InstRSY<opcode, (outs), (ins cls:$R1, cls:$R3, bdaddr20only:$BD2),
522 mnemonic#"\t$R1, $R3, $BD2", []> {
526 class StoreSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
527 Immediate imm, AddressingMode mode = bdaddr12only>
528 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
529 mnemonic#"\t$BD1, $I2",
530 [(operator imm:$I2, mode:$BD1)]> {
534 class StoreSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
535 Immediate imm, AddressingMode mode = bdaddr20only>
536 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
537 mnemonic#"\t$BD1, $I2",
538 [(operator imm:$I2, mode:$BD1)]> {
542 class StoreSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
544 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
545 mnemonic#"\t$BD1, $I2",
546 [(operator imm:$I2, bdaddr12only:$BD1)]> {
550 multiclass StoreSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
551 SDPatternOperator operator, Immediate imm> {
552 let DispKey = mnemonic in {
553 let DispSize = "12" in
554 def "" : StoreSI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
555 let DispSize = "20" in
556 def Y : StoreSIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
560 class UnaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
561 RegisterOperand cls1, RegisterOperand cls2>
562 : InstRR<opcode, (outs cls1:$R1), (ins cls2:$R2),
563 mnemonic#"\t$R1, $R2",
564 [(set cls1:$R1, (operator cls2:$R2))]>;
566 class UnaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
567 RegisterOperand cls1, RegisterOperand cls2>
568 : InstRRE<opcode, (outs cls1:$R1), (ins cls2:$R2),
569 mnemonic#"\t$R1, $R2",
570 [(set cls1:$R1, (operator cls2:$R2))]>;
572 class UnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
573 RegisterOperand cls2>
574 : InstRRF<opcode, (outs cls1:$R1), (ins uimm8zx4:$R3, cls2:$R2),
575 mnemonic#"\t$R1, $R3, $R2", []>;
577 class UnaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
578 RegisterOperand cls, Immediate imm>
579 : InstRI<opcode, (outs cls:$R1), (ins imm:$I2),
580 mnemonic#"\t$R1, $I2",
581 [(set cls:$R1, (operator imm:$I2))]>;
583 class UnaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
584 RegisterOperand cls, Immediate imm>
585 : InstRIL<opcode, (outs cls:$R1), (ins imm:$I2),
586 mnemonic#"\t$R1, $I2",
587 [(set cls:$R1, (operator imm:$I2))]>;
589 class UnaryRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
591 : InstRIL<opcode, (outs cls:$R1), (ins pcrel32:$I2),
592 mnemonic#"\t$R1, $I2",
593 [(set cls:$R1, (operator pcrel32:$I2))]> {
595 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
596 // However, BDXs have two extra operands and are therefore 6 units more
598 let AddedComplexity = 7;
601 class UnaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
602 RegisterOperand cls, AddressingMode mode = bdxaddr12only>
603 : InstRX<opcode, (outs cls:$R1), (ins mode:$XBD2),
604 mnemonic#"\t$R1, $XBD2",
605 [(set cls:$R1, (operator mode:$XBD2))]> {
609 class UnaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
611 : InstRXE<opcode, (outs cls:$R1), (ins bdxaddr12only:$XBD2),
612 mnemonic#"\t$R1, $XBD2",
613 [(set cls:$R1, (operator bdxaddr12only:$XBD2))]> {
617 class UnaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
618 RegisterOperand cls, AddressingMode mode = bdxaddr20only>
619 : InstRXY<opcode, (outs cls:$R1), (ins mode:$XBD2),
620 mnemonic#"\t$R1, $XBD2",
621 [(set cls:$R1, (operator mode:$XBD2))]> {
625 multiclass UnaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
626 SDPatternOperator operator, RegisterOperand cls> {
627 let DispKey = mnemonic ## #cls in {
628 let DispSize = "12" in
629 def "" : UnaryRX<mnemonic, rxOpcode, operator, cls, bdxaddr12pair>;
630 let DispSize = "20" in
631 def Y : UnaryRXY<mnemonic#"y", rxyOpcode, operator, cls, bdxaddr20pair>;
635 class BinaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
636 RegisterOperand cls1, RegisterOperand cls2>
637 : InstRR<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
638 mnemonic#"\t$R1, $R2",
639 [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
640 let Constraints = "$R1 = $R1src";
641 let DisableEncoding = "$R1src";
644 class BinaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
645 RegisterOperand cls1, RegisterOperand cls2>
646 : InstRRE<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
647 mnemonic#"\t$R1, $R2",
648 [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
649 let Constraints = "$R1 = $R1src";
650 let DisableEncoding = "$R1src";
653 class BinaryRRF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
654 RegisterOperand cls1, RegisterOperand cls2>
655 : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R3, cls2:$R2),
656 mnemonic#"\t$R1, $R3, $R2",
657 [(set cls1:$R1, (operator cls1:$R3, cls2:$R2))]>;
659 class BinaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
660 RegisterOperand cls, Immediate imm>
661 : InstRI<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
662 mnemonic#"\t$R1, $I2",
663 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
664 let Constraints = "$R1 = $R1src";
665 let DisableEncoding = "$R1src";
668 class BinaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
669 RegisterOperand cls, Immediate imm>
670 : InstRIL<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
671 mnemonic#"\t$R1, $I2",
672 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
673 let Constraints = "$R1 = $R1src";
674 let DisableEncoding = "$R1src";
677 class BinaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
678 RegisterOperand cls, SDPatternOperator load,
679 AddressingMode mode = bdxaddr12only>
680 : InstRX<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
681 mnemonic#"\t$R1, $XBD2",
682 [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
683 let Constraints = "$R1 = $R1src";
684 let DisableEncoding = "$R1src";
688 class BinaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
689 RegisterOperand cls, SDPatternOperator load>
690 : InstRXE<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr12only:$XBD2),
691 mnemonic#"\t$R1, $XBD2",
692 [(set cls:$R1, (operator cls:$R1src,
693 (load bdxaddr12only:$XBD2)))]> {
694 let Constraints = "$R1 = $R1src";
695 let DisableEncoding = "$R1src";
699 class BinaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
700 RegisterOperand cls, SDPatternOperator load,
701 AddressingMode mode = bdxaddr20only>
702 : InstRXY<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
703 mnemonic#"\t$R1, $XBD2",
704 [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
705 let Constraints = "$R1 = $R1src";
706 let DisableEncoding = "$R1src";
710 multiclass BinaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
711 SDPatternOperator operator, RegisterOperand cls,
712 SDPatternOperator load> {
713 let DispKey = mnemonic ## #cls in {
714 let DispSize = "12" in
715 def "" : BinaryRX<mnemonic, rxOpcode, operator, cls, load, bdxaddr12pair>;
716 let DispSize = "20" in
717 def Y : BinaryRXY<mnemonic#"y", rxyOpcode, operator, cls, load,
722 class BinarySI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
723 Operand imm, AddressingMode mode = bdaddr12only>
724 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
725 mnemonic#"\t$BD1, $I2",
726 [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
731 class BinarySIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
732 Operand imm, AddressingMode mode = bdaddr20only>
733 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
734 mnemonic#"\t$BD1, $I2",
735 [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
740 multiclass BinarySIPair<string mnemonic, bits<8> siOpcode,
741 bits<16> siyOpcode, SDPatternOperator operator,
743 let DispKey = mnemonic ## #cls in {
744 let DispSize = "12" in
745 def "" : BinarySI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
746 let DispSize = "20" in
747 def Y : BinarySIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
751 class ShiftRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
752 RegisterOperand cls, AddressingMode mode>
753 : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$BD2),
754 mnemonic#"\t$R1, $BD2",
755 [(set cls:$R1, (operator cls:$R1src, mode:$BD2))]> {
757 let Constraints = "$R1 = $R1src";
758 let DisableEncoding = "$R1src";
761 class ShiftRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
762 RegisterOperand cls, AddressingMode mode>
763 : InstRSY<opcode, (outs cls:$R1), (ins cls:$R3, mode:$BD2),
764 mnemonic#"\t$R1, $R3, $BD2",
765 [(set cls:$R1, (operator cls:$R3, mode:$BD2))]>;
767 class CompareRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
768 RegisterOperand cls1, RegisterOperand cls2>
769 : InstRR<opcode, (outs), (ins cls1:$R1, cls2:$R2),
770 mnemonic#"\t$R1, $R2",
771 [(operator cls1:$R1, cls2:$R2)]>;
773 class CompareRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
774 RegisterOperand cls1, RegisterOperand cls2>
775 : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2),
776 mnemonic#"\t$R1, $R2",
777 [(operator cls1:$R1, cls2:$R2)]>;
779 class CompareRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
780 RegisterOperand cls, Immediate imm>
781 : InstRI<opcode, (outs), (ins cls:$R1, imm:$I2),
782 mnemonic#"\t$R1, $I2",
783 [(operator cls:$R1, imm:$I2)]>;
785 class CompareRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
786 RegisterOperand cls, Immediate imm>
787 : InstRIL<opcode, (outs), (ins cls:$R1, imm:$I2),
788 mnemonic#"\t$R1, $I2",
789 [(operator cls:$R1, imm:$I2)]>;
791 class CompareRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
792 RegisterOperand cls, SDPatternOperator load>
793 : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
794 mnemonic#"\t$R1, $I2",
795 [(operator cls:$R1, (load pcrel32:$I2))]> {
797 // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
798 // However, BDXs have two extra operands and are therefore 6 units more
800 let AddedComplexity = 7;
803 class CompareRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
804 RegisterOperand cls, SDPatternOperator load,
805 AddressingMode mode = bdxaddr12only>
806 : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
807 mnemonic#"\t$R1, $XBD2",
808 [(operator cls:$R1, (load mode:$XBD2))]> {
812 class CompareRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
813 RegisterOperand cls, SDPatternOperator load>
814 : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2),
815 mnemonic#"\t$R1, $XBD2",
816 [(operator cls:$R1, (load bdxaddr12only:$XBD2))]> {
820 class CompareRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
821 RegisterOperand cls, SDPatternOperator load,
822 AddressingMode mode = bdxaddr20only>
823 : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
824 mnemonic#"\t$R1, $XBD2",
825 [(operator cls:$R1, (load mode:$XBD2))]> {
829 multiclass CompareRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
830 SDPatternOperator operator, RegisterOperand cls,
831 SDPatternOperator load> {
832 let DispKey = mnemonic ## #cls in {
833 let DispSize = "12" in
834 def "" : CompareRX<mnemonic, rxOpcode, operator, cls,
835 load, bdxaddr12pair>;
836 let DispSize = "20" in
837 def Y : CompareRXY<mnemonic#"y", rxyOpcode, operator, cls,
838 load, bdxaddr20pair>;
842 class CompareSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
843 SDPatternOperator load, Immediate imm,
844 AddressingMode mode = bdaddr12only>
845 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
846 mnemonic#"\t$BD1, $I2",
847 [(operator (load mode:$BD1), imm:$I2)]> {
851 class CompareSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
852 SDPatternOperator load, Immediate imm>
853 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
854 mnemonic#"\t$BD1, $I2",
855 [(operator (load bdaddr12only:$BD1), imm:$I2)]> {
859 class CompareSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
860 SDPatternOperator load, Immediate imm,
861 AddressingMode mode = bdaddr20only>
862 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
863 mnemonic#"\t$BD1, $I2",
864 [(operator (load mode:$BD1), imm:$I2)]> {
868 multiclass CompareSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
869 SDPatternOperator operator, SDPatternOperator load,
871 let DispKey = mnemonic in {
872 let DispSize = "12" in
873 def "" : CompareSI<mnemonic, siOpcode, operator, load, imm, bdaddr12pair>;
874 let DispSize = "20" in
875 def Y : CompareSIY<mnemonic#"y", siyOpcode, operator, load, imm,
880 class TernaryRRD<string mnemonic, bits<16> opcode,
881 SDPatternOperator operator, RegisterOperand cls>
882 : InstRRD<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, cls:$R2),
883 mnemonic#"\t$R1, $R3, $R2",
884 [(set cls:$R1, (operator cls:$R1src, cls:$R3, cls:$R2))]> {
885 let Constraints = "$R1 = $R1src";
886 let DisableEncoding = "$R1src";
889 class TernaryRXF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
890 RegisterOperand cls, SDPatternOperator load>
891 : InstRXF<opcode, (outs cls:$R1),
892 (ins cls:$R1src, cls:$R3, bdxaddr12only:$XBD2),
893 mnemonic#"\t$R1, $R3, $XBD2",
894 [(set cls:$R1, (operator cls:$R1src, cls:$R3,
895 (load bdxaddr12only:$XBD2)))]> {
896 let Constraints = "$R1 = $R1src";
897 let DisableEncoding = "$R1src";
901 class CmpSwapRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
902 RegisterOperand cls, AddressingMode mode = bdaddr12only>
903 : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
904 mnemonic#"\t$R1, $R3, $BD2",
905 [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
906 let Constraints = "$R1 = $R1src";
907 let DisableEncoding = "$R1src";
912 class CmpSwapRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
913 RegisterOperand cls, AddressingMode mode = bdaddr20only>
914 : InstRSY<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
915 mnemonic#"\t$R1, $R3, $BD2",
916 [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
917 let Constraints = "$R1 = $R1src";
918 let DisableEncoding = "$R1src";
923 multiclass CmpSwapRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode,
924 SDPatternOperator operator, RegisterOperand cls> {
925 let DispKey = mnemonic ## #cls in {
926 let DispSize = "12" in
927 def "" : CmpSwapRS<mnemonic, rsOpcode, operator, cls, bdaddr12pair>;
928 let DispSize = "20" in
929 def Y : CmpSwapRSY<mnemonic#"y", rsyOpcode, operator, cls, bdaddr20pair>;
933 class RotateSelectRIEf<string mnemonic, bits<16> opcode, RegisterOperand cls1,
934 RegisterOperand cls2>
935 : InstRIEf<opcode, (outs cls1:$R1),
936 (ins cls1:$R1src, cls2:$R2,
937 uimm8zx6:$I3, uimm8zx6:$I4, uimm8zx6:$I5),
938 mnemonic#"\t$R1, $R2, $I3, $I4, $I5", []> {
939 let Constraints = "$R1 = $R1src";
940 let DisableEncoding = "$R1src";
943 //===----------------------------------------------------------------------===//
944 // Pseudo instructions
945 //===----------------------------------------------------------------------===//
947 // Convenience instructions that get lowered to real instructions
948 // by either SystemZTargetLowering::EmitInstrWithCustomInserter()
949 // or SystemZInstrInfo::expandPostRAPseudo().
951 //===----------------------------------------------------------------------===//
953 class Pseudo<dag outs, dag ins, list<dag> pattern>
954 : InstSystemZ<0, outs, ins, "", pattern> {
956 let isCodeGenOnly = 1;
959 // Implements "$dst = $cc & (8 >> CC) ? $src1 : $src2", where CC is
960 // the value of the PSW's 2-bit condition code field.
961 class SelectWrapper<RegisterOperand cls>
962 : Pseudo<(outs cls:$dst), (ins cls:$src1, cls:$src2, i8imm:$cc),
963 [(set cls:$dst, (z_select_ccmask cls:$src1, cls:$src2, imm:$cc))]> {
964 let usesCustomInserter = 1;
965 // Although the instructions used by these nodes do not in themselves
966 // change CC, the insertion requires new blocks, and CC cannot be live
972 // Stores $new to $addr if $cc is true ("" case) or false (Inv case).
973 multiclass CondStores<RegisterOperand cls, SDPatternOperator store,
974 SDPatternOperator load, AddressingMode mode> {
975 let Defs = [CC], Uses = [CC], usesCustomInserter = 1 in {
976 def "" : Pseudo<(outs), (ins mode:$addr, cls:$new, i8imm:$cc),
977 [(store (z_select_ccmask cls:$new, (load mode:$addr),
978 imm:$cc), mode:$addr)]>;
979 def Inv : Pseudo<(outs), (ins mode:$addr, cls:$new, i8imm:$cc),
980 [(store (z_select_ccmask (load mode:$addr), cls:$new,
981 imm:$cc), mode:$addr)]>;
985 // OPERATOR is ATOMIC_SWAP or an ATOMIC_LOAD_* operation. PAT and OPERAND
986 // describe the second (non-memory) operand.
987 class AtomicLoadBinary<SDPatternOperator operator, RegisterOperand cls,
988 dag pat, DAGOperand operand>
989 : Pseudo<(outs cls:$dst), (ins bdaddr20only:$ptr, operand:$src2),
990 [(set cls:$dst, (operator bdaddr20only:$ptr, pat))]> {
992 let Has20BitOffset = 1;
995 let usesCustomInserter = 1;
998 // Specializations of AtomicLoadWBinary.
999 class AtomicLoadBinaryReg32<SDPatternOperator operator>
1000 : AtomicLoadBinary<operator, GR32, (i32 GR32:$src2), GR32>;
1001 class AtomicLoadBinaryImm32<SDPatternOperator operator, Immediate imm>
1002 : AtomicLoadBinary<operator, GR32, (i32 imm:$src2), imm>;
1003 class AtomicLoadBinaryReg64<SDPatternOperator operator>
1004 : AtomicLoadBinary<operator, GR64, (i64 GR64:$src2), GR64>;
1005 class AtomicLoadBinaryImm64<SDPatternOperator operator, Immediate imm>
1006 : AtomicLoadBinary<operator, GR64, (i64 imm:$src2), imm>;
1008 // OPERATOR is ATOMIC_SWAPW or an ATOMIC_LOADW_* operation. PAT and OPERAND
1009 // describe the second (non-memory) operand.
1010 class AtomicLoadWBinary<SDPatternOperator operator, dag pat,
1012 : Pseudo<(outs GR32:$dst),
1013 (ins bdaddr20only:$ptr, operand:$src2, ADDR32:$bitshift,
1014 ADDR32:$negbitshift, uimm32:$bitsize),
1015 [(set GR32:$dst, (operator bdaddr20only:$ptr, pat, ADDR32:$bitshift,
1016 ADDR32:$negbitshift, uimm32:$bitsize))]> {
1018 let Has20BitOffset = 1;
1021 let usesCustomInserter = 1;
1024 // Specializations of AtomicLoadWBinary.
1025 class AtomicLoadWBinaryReg<SDPatternOperator operator>
1026 : AtomicLoadWBinary<operator, (i32 GR32:$src2), GR32>;
1027 class AtomicLoadWBinaryImm<SDPatternOperator operator, Immediate imm>
1028 : AtomicLoadWBinary<operator, (i32 imm:$src2), imm>;