Home | History | Annotate | Download | only in SystemZ
      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<m> In   : immediate value of width m for operand n
    146 //   bits<4> BDn  : address operand n, which has a base and a displacement
    147 //   bits<m> XBDn : address operand n, which has an index, a base and a
    148 //                  displacement
    149 //   bits<4> Xn   : index register for address operand n
    150 //   bits<4> Mn   : mode value for operand n
    151 //
    152 // The operand numbers ("n" in the list above) follow the architecture manual.
    153 // Assembly operands sometimes have a different order; in particular, R3 often
    154 // is often written between operands 1 and 2.
    155 //
    156 //===----------------------------------------------------------------------===//
    157 
    158 class InstRI<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    159   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    160   field bits<32> Inst;
    161   field bits<32> SoftFail = 0;
    162 
    163   bits<4> R1;
    164   bits<16> I2;
    165 
    166   let Inst{31-24} = op{11-4};
    167   let Inst{23-20} = R1;
    168   let Inst{19-16} = op{3-0};
    169   let Inst{15-0}  = I2;
    170 }
    171 
    172 class InstRIEb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    173   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    174   field bits<48> Inst;
    175   field bits<48> SoftFail = 0;
    176 
    177   bits<4> R1;
    178   bits<4> R2;
    179   bits<4> M3;
    180   bits<16> RI4;
    181 
    182   let Inst{47-40} = op{15-8};
    183   let Inst{39-36} = R1;
    184   let Inst{35-32} = R2;
    185   let Inst{31-16} = RI4;
    186   let Inst{15-12} = M3;
    187   let Inst{11-8}  = 0;
    188   let Inst{7-0}   = op{7-0};
    189 }
    190 
    191 class InstRIEc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    192   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    193   field bits<48> Inst;
    194   field bits<48> SoftFail = 0;
    195 
    196   bits<4> R1;
    197   bits<8> I2;
    198   bits<4> M3;
    199   bits<16> RI4;
    200 
    201   let Inst{47-40} = op{15-8};
    202   let Inst{39-36} = R1;
    203   let Inst{35-32} = M3;
    204   let Inst{31-16} = RI4;
    205   let Inst{15-8}  = I2;
    206   let Inst{7-0}   = op{7-0};
    207 }
    208 
    209 class InstRIEd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    210   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    211   field bits<48> Inst;
    212   field bits<48> SoftFail = 0;
    213 
    214   bits<4> R1;
    215   bits<4> R3;
    216   bits<16> I2;
    217 
    218   let Inst{47-40} = op{15-8};
    219   let Inst{39-36} = R1;
    220   let Inst{35-32} = R3;
    221   let Inst{31-16} = I2;
    222   let Inst{15-8}  = 0;
    223   let Inst{7-0}   = op{7-0};
    224 }
    225 
    226 class InstRIEf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    227   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    228   field bits<48> Inst;
    229   field bits<48> SoftFail = 0;
    230 
    231   bits<4> R1;
    232   bits<4> R2;
    233   bits<8> I3;
    234   bits<8> I4;
    235   bits<8> I5;
    236 
    237   let Inst{47-40} = op{15-8};
    238   let Inst{39-36} = R1;
    239   let Inst{35-32} = R2;
    240   let Inst{31-24} = I3;
    241   let Inst{23-16} = I4;
    242   let Inst{15-8}  = I5;
    243   let Inst{7-0}   = op{7-0};
    244 }
    245 
    246 class InstRIL<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    247   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    248   field bits<48> Inst;
    249   field bits<48> SoftFail = 0;
    250 
    251   bits<4> R1;
    252   bits<32> I2;
    253 
    254   let Inst{47-40} = op{11-4};
    255   let Inst{39-36} = R1;
    256   let Inst{35-32} = op{3-0};
    257   let Inst{31-0}  = I2;
    258 }
    259 
    260 class InstRR<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    261   : InstSystemZ<2, outs, ins, asmstr, pattern> {
    262   field bits<16> Inst;
    263   field bits<16> SoftFail = 0;
    264 
    265   bits<4> R1;
    266   bits<4> R2;
    267 
    268   let Inst{15-8} = op;
    269   let Inst{7-4}  = R1;
    270   let Inst{3-0}  = R2;
    271 }
    272 
    273 class InstRRD<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    274   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    275   field bits<32> Inst;
    276   field bits<32> SoftFail = 0;
    277 
    278   bits<4> R1;
    279   bits<4> R3;
    280   bits<4> R2;
    281 
    282   let Inst{31-16} = op;
    283   let Inst{15-12} = R1;
    284   let Inst{11-8}  = 0;
    285   let Inst{7-4}   = R3;
    286   let Inst{3-0}   = R2;
    287 }
    288 
    289 class InstRRE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    290   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    291   field bits<32> Inst;
    292   field bits<32> SoftFail = 0;
    293 
    294   bits<4> R1;
    295   bits<4> R2;
    296 
    297   let Inst{31-16} = op;
    298   let Inst{15-8}  = 0;
    299   let Inst{7-4}   = R1;
    300   let Inst{3-0}   = R2;
    301 }
    302 
    303 class InstRRF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    304   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    305   field bits<32> Inst;
    306   field bits<32> SoftFail = 0;
    307 
    308   bits<4> R1;
    309   bits<4> R2;
    310   bits<4> R3;
    311 
    312   let Inst{31-16} = op;
    313   let Inst{15-12} = R3;
    314   let Inst{11-8}  = 0;
    315   let Inst{7-4}   = R1;
    316   let Inst{3-0}   = R2;
    317 }
    318 
    319 class InstRX<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    320   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    321   field bits<32> Inst;
    322   field bits<32> SoftFail = 0;
    323 
    324   bits<4> R1;
    325   bits<20> XBD2;
    326 
    327   let Inst{31-24} = op;
    328   let Inst{23-20} = R1;
    329   let Inst{19-0}  = XBD2;
    330 
    331   let HasIndex = 1;
    332 }
    333 
    334 class InstRXE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    335   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    336   field bits<48> Inst;
    337   field bits<48> SoftFail = 0;
    338 
    339   bits<4> R1;
    340   bits<20> XBD2;
    341 
    342   let Inst{47-40} = op{15-8};
    343   let Inst{39-36} = R1;
    344   let Inst{35-16} = XBD2;
    345   let Inst{15-8}  = 0;
    346   let Inst{7-0}   = op{7-0};
    347 
    348   let HasIndex = 1;
    349 }
    350 
    351 class InstRXF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    352   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    353   field bits<48> Inst;
    354   field bits<48> SoftFail = 0;
    355 
    356   bits<4> R1;
    357   bits<4> R3;
    358   bits<20> XBD2;
    359 
    360   let Inst{47-40} = op{15-8};
    361   let Inst{39-36} = R3;
    362   let Inst{35-16} = XBD2;
    363   let Inst{15-12} = R1;
    364   let Inst{11-8}  = 0;
    365   let Inst{7-0}   = op{7-0};
    366 
    367   let HasIndex = 1;
    368 }
    369 
    370 class InstRXY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    371   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    372   field bits<48> Inst;
    373   field bits<48> SoftFail = 0;
    374 
    375   bits<4> R1;
    376   bits<28> XBD2;
    377 
    378   let Inst{47-40} = op{15-8};
    379   let Inst{39-36} = R1;
    380   let Inst{35-8}  = XBD2;
    381   let Inst{7-0}   = op{7-0};
    382 
    383   let Has20BitOffset = 1;
    384   let HasIndex = 1;
    385 }
    386 
    387 class InstRS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    388   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    389   field bits<32> Inst;
    390   field bits<32> SoftFail = 0;
    391 
    392   bits<4> R1;
    393   bits<4> R3;
    394   bits<16> BD2;
    395 
    396   let Inst{31-24} = op;
    397   let Inst{23-20} = R1;
    398   let Inst{19-16} = R3;
    399   let Inst{15-0}  = BD2;
    400 }
    401 
    402 class InstRSY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    403   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    404   field bits<48> Inst;
    405   field bits<48> SoftFail = 0;
    406 
    407   bits<4> R1;
    408   bits<4> R3;
    409   bits<24> BD2;
    410 
    411   let Inst{47-40} = op{15-8};
    412   let Inst{39-36} = R1;
    413   let Inst{35-32} = R3;
    414   let Inst{31-8}  = BD2;
    415   let Inst{7-0}   = op{7-0};
    416 
    417   let Has20BitOffset = 1;
    418 }
    419 
    420 class InstSI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    421   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    422   field bits<32> Inst;
    423   field bits<32> SoftFail = 0;
    424 
    425   bits<16> BD1;
    426   bits<8> I2;
    427 
    428   let Inst{31-24} = op;
    429   let Inst{23-16} = I2;
    430   let Inst{15-0}  = BD1;
    431 }
    432 
    433 class InstSIL<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    434   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    435   field bits<48> Inst;
    436   field bits<48> SoftFail = 0;
    437 
    438   bits<16> BD1;
    439   bits<16> I2;
    440 
    441   let Inst{47-32} = op;
    442   let Inst{31-16} = BD1;
    443   let Inst{15-0}  = I2;
    444 }
    445 
    446 class InstSIY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    447   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    448   field bits<48> Inst;
    449   field bits<48> SoftFail = 0;
    450 
    451   bits<24> BD1;
    452   bits<8> I2;
    453 
    454   let Inst{47-40} = op{15-8};
    455   let Inst{39-32} = I2;
    456   let Inst{31-8}  = BD1;
    457   let Inst{7-0}   = op{7-0};
    458 
    459   let Has20BitOffset = 1;
    460 }
    461 
    462 class InstSS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    463   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    464   field bits<48> Inst;
    465   field bits<48> SoftFail = 0;
    466 
    467   bits<24> BDL1;
    468   bits<16> BD2;
    469 
    470   let Inst{47-40} = op;
    471   let Inst{39-16} = BDL1;
    472   let Inst{15-0}  = BD2;
    473 }
    474 
    475 //===----------------------------------------------------------------------===//
    476 // Instruction definitions with semantics
    477 //===----------------------------------------------------------------------===//
    478 //
    479 // These classes have the form [Cond]<Category><Format>, where <Format> is one
    480 // of the formats defined above and where <Category> describes the inputs
    481 // and outputs.  "Cond" is used if the instruction is conditional,
    482 // in which case the 4-bit condition-code mask is added as a final operand.
    483 // <Category> can be one of:
    484 //
    485 //   Inherent:
    486 //     One register output operand and no input operands.
    487 //
    488 //   BranchUnary:
    489 //     One register output operand, one register input operand and
    490 //     one branch displacement.  The instructions stores a modified
    491 //     form of the source register in the destination register and
    492 //     branches on the result.
    493 //
    494 //   Store:
    495 //     One register or immediate input operand and one address input operand.
    496 //     The instruction stores the first operand to the address.
    497 //
    498 //     This category is used for both pure and truncating stores.
    499 //
    500 //   LoadMultiple:
    501 //     One address input operand and two explicit output operands.
    502 //     The instruction loads a range of registers from the address,
    503 //     with the explicit operands giving the first and last register
    504 //     to load.  Other loaded registers are added as implicit definitions.
    505 //
    506 //   StoreMultiple:
    507 //     Two explicit input register operands and an address operand.
    508 //     The instruction stores a range of registers to the address,
    509 //     with the explicit operands giving the first and last register
    510 //     to store.  Other stored registers are added as implicit uses.
    511 //
    512 //   Unary:
    513 //     One register output operand and one input operand.  The input
    514 //     operand may be a register, immediate or memory.
    515 //
    516 //   Binary:
    517 //     One register output operand and two input operands.  The first
    518 //     input operand is always a register and he second may be a register,
    519 //     immediate or memory.
    520 //
    521 //   Shift:
    522 //     One register output operand and two input operands.  The first
    523 //     input operand is a register and the second has the same form as
    524 //     an address (although it isn't actually used to address memory).
    525 //
    526 //   Compare:
    527 //     Two input operands.  The first operand is always a register,
    528 //     the second may be a register, immediate or memory.
    529 //
    530 //   Ternary:
    531 //     One register output operand and three register input operands.
    532 //
    533 //   CmpSwap:
    534 //     One output operand and three input operands.  The first two
    535 //     operands are registers and the third is an address.  The instruction
    536 //     both reads from and writes to the address.
    537 //
    538 //   RotateSelect:
    539 //     One output operand and five input operands.  The first two operands
    540 //     are registers and the other three are immediates.
    541 //
    542 // The format determines which input operands are tied to output operands,
    543 // and also determines the shape of any address operand.
    544 //
    545 // Multiclasses of the form <Category><Format>Pair define two instructions,
    546 // one with <Category><Format> and one with <Category><Format>Y.  The name
    547 // of the first instruction has no suffix, the name of the second has
    548 // an extra "y".
    549 //
    550 //===----------------------------------------------------------------------===//
    551 
    552 class InherentRRE<string mnemonic, bits<16> opcode, RegisterOperand cls,
    553                   dag src>
    554   : InstRRE<opcode, (outs cls:$R1), (ins),
    555             mnemonic#"r\t$R1",
    556             [(set cls:$R1, src)]> {
    557   let R2 = 0;
    558 }
    559 
    560 class BranchUnaryRI<string mnemonic, bits<12> opcode, RegisterOperand cls>
    561   : InstRI<opcode, (outs cls:$R1), (ins cls:$R1src, brtarget16:$I2),
    562            mnemonic##"\t$R1, $I2", []> {
    563   let isBranch = 1;
    564   let isTerminator = 1;
    565   let Constraints = "$R1 = $R1src";
    566   let DisableEncoding = "$R1src";
    567 }
    568 
    569 class LoadMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
    570   : InstRSY<opcode, (outs cls:$R1, cls:$R3), (ins bdaddr20only:$BD2),
    571             mnemonic#"\t$R1, $R3, $BD2", []> {
    572   let mayLoad = 1;
    573 }
    574 
    575 class StoreRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
    576                  RegisterOperand cls>
    577   : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
    578             mnemonic#"\t$R1, $I2",
    579             [(operator cls:$R1, pcrel32:$I2)]> {
    580   let mayStore = 1;
    581   // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
    582   // However, BDXs have two extra operands and are therefore 6 units more
    583   // complex.
    584   let AddedComplexity = 7;
    585 }
    586 
    587 class StoreRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
    588               RegisterOperand cls, bits<5> bytes,
    589               AddressingMode mode = bdxaddr12only>
    590   : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
    591            mnemonic#"\t$R1, $XBD2",
    592            [(operator cls:$R1, mode:$XBD2)]> {
    593   let OpKey = mnemonic ## cls;
    594   let OpType = "mem";
    595   let mayStore = 1;
    596   let AccessBytes = bytes;
    597 }
    598 
    599 class StoreRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    600                RegisterOperand cls, bits<5> bytes,
    601                AddressingMode mode = bdxaddr20only>
    602   : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
    603             mnemonic#"\t$R1, $XBD2",
    604             [(operator cls:$R1, mode:$XBD2)]> {
    605   let OpKey = mnemonic ## cls;
    606   let OpType = "mem";
    607   let mayStore = 1;
    608   let AccessBytes = bytes;
    609 }
    610 
    611 multiclass StoreRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
    612                        SDPatternOperator operator, RegisterOperand cls,
    613                        bits<5> bytes> {
    614   let DispKey = mnemonic ## #cls in {
    615     let DispSize = "12" in
    616       def "" : StoreRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
    617     let DispSize = "20" in
    618       def Y  : StoreRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
    619                         bdxaddr20pair>;
    620   }
    621 }
    622 
    623 class StoreMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
    624   : InstRSY<opcode, (outs), (ins cls:$R1, cls:$R3, bdaddr20only:$BD2),
    625             mnemonic#"\t$R1, $R3, $BD2", []> {
    626   let mayStore = 1;
    627 }
    628 
    629 class StoreSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
    630               Immediate imm, AddressingMode mode = bdaddr12only>
    631   : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
    632            mnemonic#"\t$BD1, $I2",
    633            [(operator imm:$I2, mode:$BD1)]> {
    634   let mayStore = 1;
    635 }
    636 
    637 class StoreSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    638                Immediate imm, AddressingMode mode = bdaddr20only>
    639   : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
    640             mnemonic#"\t$BD1, $I2",
    641             [(operator imm:$I2, mode:$BD1)]> {
    642   let mayStore = 1;
    643 }
    644 
    645 class StoreSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    646                Immediate imm>
    647   : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
    648             mnemonic#"\t$BD1, $I2",
    649             [(operator imm:$I2, bdaddr12only:$BD1)]> {
    650   let mayStore = 1;
    651 }
    652 
    653 multiclass StoreSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
    654                        SDPatternOperator operator, Immediate imm> {
    655   let DispKey = mnemonic in {
    656     let DispSize = "12" in
    657       def "" : StoreSI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
    658     let DispSize = "20" in
    659       def Y  : StoreSIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
    660   }
    661 }
    662 
    663 class CondStoreRSY<string mnemonic, bits<16> opcode,
    664                    RegisterOperand cls, bits<5> bytes,
    665                    AddressingMode mode = bdaddr20only>
    666   : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2, cond4:$valid, cond4:$R3),
    667             mnemonic#"$R3\t$R1, $BD2", []>,
    668     Requires<[FeatureLoadStoreOnCond]> {
    669   let mayStore = 1;
    670   let AccessBytes = bytes;
    671   let CCMaskLast = 1;
    672 }
    673 
    674 // Like CondStoreRSY, but used for the raw assembly form.  The condition-code
    675 // mask is the third operand rather than being part of the mnemonic.
    676 class AsmCondStoreRSY<string mnemonic, bits<16> opcode,
    677                       RegisterOperand cls, bits<5> bytes,
    678                       AddressingMode mode = bdaddr20only>
    679   : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2, uimm8zx4:$R3),
    680             mnemonic#"\t$R1, $BD2, $R3", []>,
    681     Requires<[FeatureLoadStoreOnCond]> {
    682   let mayStore = 1;
    683   let AccessBytes = bytes;
    684 }
    685 
    686 // Like CondStoreRSY, but with a fixed CC mask.
    687 class FixedCondStoreRSY<string mnemonic, bits<16> opcode,
    688                         RegisterOperand cls, bits<4> ccmask, bits<5> bytes,
    689                         AddressingMode mode = bdaddr20only>
    690   : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2),
    691             mnemonic#"\t$R1, $BD2", []>,
    692     Requires<[FeatureLoadStoreOnCond]> {
    693   let mayStore = 1;
    694   let AccessBytes = bytes;
    695   let R3 = ccmask;
    696 }
    697 
    698 class UnaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
    699               RegisterOperand cls1, RegisterOperand cls2>
    700   : InstRR<opcode, (outs cls1:$R1), (ins cls2:$R2),
    701            mnemonic#"r\t$R1, $R2",
    702            [(set cls1:$R1, (operator cls2:$R2))]> {
    703   let OpKey = mnemonic ## cls1;
    704   let OpType = "reg";
    705 }
    706 
    707 class UnaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    708                RegisterOperand cls1, RegisterOperand cls2>
    709   : InstRRE<opcode, (outs cls1:$R1), (ins cls2:$R2),
    710             mnemonic#"r\t$R1, $R2",
    711             [(set cls1:$R1, (operator cls2:$R2))]> {
    712   let OpKey = mnemonic ## cls1;
    713   let OpType = "reg";
    714 }
    715 
    716 class UnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
    717                RegisterOperand cls2>
    718   : InstRRF<opcode, (outs cls1:$R1), (ins uimm8zx4:$R3, cls2:$R2),
    719             mnemonic#"r\t$R1, $R3, $R2", []> {
    720   let OpKey = mnemonic ## cls1;
    721   let OpType = "reg";
    722 }
    723 
    724 // These instructions are generated by if conversion.  The old value of R1
    725 // is added as an implicit use.
    726 class CondUnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
    727                    RegisterOperand cls2>
    728   : InstRRF<opcode, (outs cls1:$R1), (ins cls2:$R2, cond4:$valid, cond4:$R3),
    729             mnemonic#"r$R3\t$R1, $R2", []>,
    730     Requires<[FeatureLoadStoreOnCond]> {
    731   let CCMaskLast = 1;
    732 }
    733 
    734 // Like CondUnaryRRF, but used for the raw assembly form.  The condition-code
    735 // mask is the third operand rather than being part of the mnemonic.
    736 class AsmCondUnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
    737                       RegisterOperand cls2>
    738   : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2, uimm8zx4:$R3),
    739             mnemonic#"r\t$R1, $R2, $R3", []>,
    740     Requires<[FeatureLoadStoreOnCond]> {
    741   let Constraints = "$R1 = $R1src";
    742   let DisableEncoding = "$R1src";
    743 }
    744 
    745 // Like CondUnaryRRF, but with a fixed CC mask.
    746 class FixedCondUnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
    747                         RegisterOperand cls2, bits<4> ccmask>
    748   : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
    749             mnemonic#"\t$R1, $R2", []>,
    750     Requires<[FeatureLoadStoreOnCond]> {
    751   let Constraints = "$R1 = $R1src";
    752   let DisableEncoding = "$R1src";
    753   let R3 = ccmask;
    754 }
    755 
    756 class UnaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
    757               RegisterOperand cls, Immediate imm>
    758   : InstRI<opcode, (outs cls:$R1), (ins imm:$I2),
    759            mnemonic#"\t$R1, $I2",
    760            [(set cls:$R1, (operator imm:$I2))]>;
    761 
    762 class UnaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
    763                RegisterOperand cls, Immediate imm>
    764   : InstRIL<opcode, (outs cls:$R1), (ins imm:$I2),
    765             mnemonic#"\t$R1, $I2",
    766             [(set cls:$R1, (operator imm:$I2))]>;
    767 
    768 class UnaryRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
    769                  RegisterOperand cls>
    770   : InstRIL<opcode, (outs cls:$R1), (ins pcrel32:$I2),
    771             mnemonic#"\t$R1, $I2",
    772             [(set cls:$R1, (operator pcrel32:$I2))]> {
    773   let mayLoad = 1;
    774   // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
    775   // However, BDXs have two extra operands and are therefore 6 units more
    776   // complex.
    777   let AddedComplexity = 7;
    778 }
    779 
    780 class CondUnaryRSY<string mnemonic, bits<16> opcode,
    781                    SDPatternOperator operator, RegisterOperand cls,
    782                    bits<5> bytes, AddressingMode mode = bdaddr20only>
    783   : InstRSY<opcode, (outs cls:$R1),
    784             (ins cls:$R1src, mode:$BD2, cond4:$valid, cond4:$R3),
    785             mnemonic#"$R3\t$R1, $BD2",
    786             [(set cls:$R1,
    787                   (z_select_ccmask (load bdaddr20only:$BD2), cls:$R1src,
    788                                    cond4:$valid, cond4:$R3))]>,
    789     Requires<[FeatureLoadStoreOnCond]> {
    790   let Constraints = "$R1 = $R1src";
    791   let DisableEncoding = "$R1src";
    792   let mayLoad = 1;
    793   let AccessBytes = bytes;
    794   let CCMaskLast = 1;
    795 }
    796 
    797 // Like CondUnaryRSY, but used for the raw assembly form.  The condition-code
    798 // mask is the third operand rather than being part of the mnemonic.
    799 class AsmCondUnaryRSY<string mnemonic, bits<16> opcode,
    800                       RegisterOperand cls, bits<5> bytes,
    801                       AddressingMode mode = bdaddr20only>
    802   : InstRSY<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$BD2, uimm8zx4:$R3),
    803             mnemonic#"\t$R1, $BD2, $R3", []>,
    804     Requires<[FeatureLoadStoreOnCond]> {
    805   let mayLoad = 1;
    806   let AccessBytes = bytes;
    807   let Constraints = "$R1 = $R1src";
    808   let DisableEncoding = "$R1src";
    809 }
    810 
    811 // Like CondUnaryRSY, but with a fixed CC mask.
    812 class FixedCondUnaryRSY<string mnemonic, bits<16> opcode,
    813                         RegisterOperand cls, bits<4> ccmask, bits<5> bytes,
    814                         AddressingMode mode = bdaddr20only>
    815   : InstRSY<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$BD2),
    816             mnemonic#"\t$R1, $BD2", []>,
    817     Requires<[FeatureLoadStoreOnCond]> {
    818   let Constraints = "$R1 = $R1src";
    819   let DisableEncoding = "$R1src";
    820   let R3 = ccmask;
    821   let mayLoad = 1;
    822   let AccessBytes = bytes;
    823 }
    824 
    825 class UnaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
    826               RegisterOperand cls, bits<5> bytes,
    827               AddressingMode mode = bdxaddr12only>
    828   : InstRX<opcode, (outs cls:$R1), (ins mode:$XBD2),
    829            mnemonic#"\t$R1, $XBD2",
    830            [(set cls:$R1, (operator mode:$XBD2))]> {
    831   let OpKey = mnemonic ## cls;
    832   let OpType = "mem";
    833   let mayLoad = 1;
    834   let AccessBytes = bytes;
    835 }
    836 
    837 class UnaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    838                RegisterOperand cls, bits<5> bytes>
    839   : InstRXE<opcode, (outs cls:$R1), (ins bdxaddr12only:$XBD2),
    840             mnemonic#"\t$R1, $XBD2",
    841             [(set cls:$R1, (operator bdxaddr12only:$XBD2))]> {
    842   let OpKey = mnemonic ## cls;
    843   let OpType = "mem";
    844   let mayLoad = 1;
    845   let AccessBytes = bytes;
    846 }
    847 
    848 class UnaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    849                RegisterOperand cls, bits<5> bytes,
    850                AddressingMode mode = bdxaddr20only>
    851   : InstRXY<opcode, (outs cls:$R1), (ins mode:$XBD2),
    852             mnemonic#"\t$R1, $XBD2",
    853             [(set cls:$R1, (operator mode:$XBD2))]> {
    854   let OpKey = mnemonic ## cls;
    855   let OpType = "mem";
    856   let mayLoad = 1;
    857   let AccessBytes = bytes;
    858 }
    859 
    860 multiclass UnaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
    861                        SDPatternOperator operator, RegisterOperand cls,
    862                        bits<5> bytes> {
    863   let DispKey = mnemonic ## #cls in {
    864     let DispSize = "12" in
    865       def "" : UnaryRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
    866     let DispSize = "20" in
    867       def Y  : UnaryRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
    868                         bdxaddr20pair>;
    869   }
    870 }
    871 
    872 class BinaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
    873                RegisterOperand cls1, RegisterOperand cls2>
    874   : InstRR<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
    875            mnemonic#"r\t$R1, $R2",
    876            [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
    877   let OpKey = mnemonic ## cls1;
    878   let OpType = "reg";
    879   let Constraints = "$R1 = $R1src";
    880   let DisableEncoding = "$R1src";
    881 }
    882 
    883 class BinaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    884                 RegisterOperand cls1, RegisterOperand cls2>
    885   : InstRRE<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
    886             mnemonic#"r\t$R1, $R2",
    887             [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
    888   let OpKey = mnemonic ## cls1;
    889   let OpType = "reg";
    890   let Constraints = "$R1 = $R1src";
    891   let DisableEncoding = "$R1src";
    892 }
    893 
    894 class BinaryRRF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    895                 RegisterOperand cls1, RegisterOperand cls2>
    896   : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R3, cls2:$R2),
    897             mnemonic#"r\t$R1, $R3, $R2",
    898             [(set cls1:$R1, (operator cls1:$R3, cls2:$R2))]> {
    899   let OpKey = mnemonic ## cls1;
    900   let OpType = "reg";
    901 }
    902 
    903 class BinaryRRFK<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    904                  RegisterOperand cls1, RegisterOperand cls2>
    905   : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R2, cls2:$R3),
    906             mnemonic#"rk\t$R1, $R2, $R3",
    907             [(set cls1:$R1, (operator cls1:$R2, cls2:$R3))]>;
    908 
    909 multiclass BinaryRRAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
    910                         SDPatternOperator operator, RegisterOperand cls1,
    911                         RegisterOperand cls2> {
    912   let NumOpsKey = mnemonic in {
    913     let NumOpsValue = "3" in
    914       def K : BinaryRRFK<mnemonic, opcode2, null_frag, cls1, cls2>,
    915               Requires<[FeatureDistinctOps]>;
    916     let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
    917       def "" : BinaryRR<mnemonic, opcode1, operator, cls1, cls2>;
    918   }
    919 }
    920 
    921 multiclass BinaryRREAndK<string mnemonic, bits<16> opcode1, bits<16> opcode2,
    922                          SDPatternOperator operator, RegisterOperand cls1,
    923                          RegisterOperand cls2> {
    924   let NumOpsKey = mnemonic in {
    925     let NumOpsValue = "3" in
    926       def K : BinaryRRFK<mnemonic, opcode2, null_frag, cls1, cls2>,
    927               Requires<[FeatureDistinctOps]>;
    928     let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
    929       def "" : BinaryRRE<mnemonic, opcode1, operator, cls1, cls2>;
    930   }
    931 }
    932 
    933 class BinaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
    934                RegisterOperand cls, Immediate imm>
    935   : InstRI<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
    936            mnemonic#"\t$R1, $I2",
    937            [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
    938   let Constraints = "$R1 = $R1src";
    939   let DisableEncoding = "$R1src";
    940 }
    941 
    942 class BinaryRIE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    943                 RegisterOperand cls, Immediate imm>
    944   : InstRIEd<opcode, (outs cls:$R1), (ins cls:$R3, imm:$I2),
    945              mnemonic#"\t$R1, $R3, $I2",
    946              [(set cls:$R1, (operator cls:$R3, imm:$I2))]>;
    947 
    948 multiclass BinaryRIAndK<string mnemonic, bits<12> opcode1, bits<16> opcode2,
    949                         SDPatternOperator operator, RegisterOperand cls,
    950                         Immediate imm> {
    951   let NumOpsKey = mnemonic in {
    952     let NumOpsValue = "3" in
    953       def K : BinaryRIE<mnemonic##"k", opcode2, null_frag, cls, imm>,
    954               Requires<[FeatureDistinctOps]>;
    955     let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
    956       def "" : BinaryRI<mnemonic, opcode1, operator, cls, imm>;
    957   }
    958 }
    959 
    960 class BinaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
    961                 RegisterOperand cls, Immediate imm>
    962   : InstRIL<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
    963             mnemonic#"\t$R1, $I2",
    964             [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
    965   let Constraints = "$R1 = $R1src";
    966   let DisableEncoding = "$R1src";
    967 }
    968 
    969 class BinaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
    970                RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
    971                AddressingMode mode = bdxaddr12only>
    972   : InstRX<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
    973            mnemonic#"\t$R1, $XBD2",
    974            [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
    975   let OpKey = mnemonic ## cls;
    976   let OpType = "mem";
    977   let Constraints = "$R1 = $R1src";
    978   let DisableEncoding = "$R1src";
    979   let mayLoad = 1;
    980   let AccessBytes = bytes;
    981 }
    982 
    983 class BinaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    984                   RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
    985   : InstRXE<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr12only:$XBD2),
    986             mnemonic#"\t$R1, $XBD2",
    987             [(set cls:$R1, (operator cls:$R1src,
    988                                      (load bdxaddr12only:$XBD2)))]> {
    989   let OpKey = mnemonic ## cls;
    990   let OpType = "mem";
    991   let Constraints = "$R1 = $R1src";
    992   let DisableEncoding = "$R1src";
    993   let mayLoad = 1;
    994   let AccessBytes = bytes;
    995 }
    996 
    997 class BinaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
    998                 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
    999                 AddressingMode mode = bdxaddr20only>
   1000   : InstRXY<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
   1001             mnemonic#"\t$R1, $XBD2",
   1002             [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
   1003   let OpKey = mnemonic ## cls;
   1004   let OpType = "mem";
   1005   let Constraints = "$R1 = $R1src";
   1006   let DisableEncoding = "$R1src";
   1007   let mayLoad = 1;
   1008   let AccessBytes = bytes;
   1009 }
   1010 
   1011 multiclass BinaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
   1012                         SDPatternOperator operator, RegisterOperand cls,
   1013                         SDPatternOperator load, bits<5> bytes> {
   1014   let DispKey = mnemonic ## #cls in {
   1015     let DispSize = "12" in
   1016       def "" : BinaryRX<mnemonic, rxOpcode, operator, cls, load, bytes,
   1017                         bdxaddr12pair>;
   1018     let DispSize = "20" in
   1019       def Y  : BinaryRXY<mnemonic#"y", rxyOpcode, operator, cls, load, bytes,
   1020                          bdxaddr20pair>;
   1021   }
   1022 }
   1023 
   1024 class BinarySI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   1025                Operand imm, AddressingMode mode = bdaddr12only>
   1026   : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
   1027            mnemonic#"\t$BD1, $I2",
   1028            [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
   1029   let mayLoad = 1;
   1030   let mayStore = 1;
   1031 }
   1032 
   1033 class BinarySIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   1034                 Operand imm, AddressingMode mode = bdaddr20only>
   1035   : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
   1036             mnemonic#"\t$BD1, $I2",
   1037             [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
   1038   let mayLoad = 1;
   1039   let mayStore = 1;
   1040 }
   1041 
   1042 multiclass BinarySIPair<string mnemonic, bits<8> siOpcode,
   1043                         bits<16> siyOpcode, SDPatternOperator operator,
   1044                         Operand imm> {
   1045   let DispKey = mnemonic ## #cls in {
   1046     let DispSize = "12" in
   1047       def "" : BinarySI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
   1048     let DispSize = "20" in
   1049       def Y  : BinarySIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
   1050   }
   1051 }
   1052 
   1053 class ShiftRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   1054               RegisterOperand cls>
   1055   : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, shift12only:$BD2),
   1056            mnemonic#"\t$R1, $BD2",
   1057            [(set cls:$R1, (operator cls:$R1src, shift12only:$BD2))]> {
   1058   let R3 = 0;
   1059   let Constraints = "$R1 = $R1src";
   1060   let DisableEncoding = "$R1src";
   1061 }
   1062 
   1063 class ShiftRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   1064                RegisterOperand cls>
   1065   : InstRSY<opcode, (outs cls:$R1), (ins cls:$R3, shift20only:$BD2),
   1066             mnemonic#"\t$R1, $R3, $BD2",
   1067             [(set cls:$R1, (operator cls:$R3, shift20only:$BD2))]>;
   1068 
   1069 multiclass ShiftRSAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
   1070                        SDPatternOperator operator, RegisterOperand cls> {
   1071   let NumOpsKey = mnemonic in {
   1072     let NumOpsValue = "3" in
   1073       def K  : ShiftRSY<mnemonic##"k", opcode2, null_frag, cls>,
   1074                Requires<[FeatureDistinctOps]>;
   1075     let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
   1076       def "" : ShiftRS<mnemonic, opcode1, operator, cls>;
   1077   }
   1078 }
   1079 
   1080 class CompareRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   1081                 RegisterOperand cls1, RegisterOperand cls2>
   1082   : InstRR<opcode, (outs), (ins cls1:$R1, cls2:$R2),
   1083            mnemonic#"r\t$R1, $R2",
   1084            [(operator cls1:$R1, cls2:$R2)]> {
   1085   let OpKey = mnemonic ## cls1;
   1086   let OpType = "reg";
   1087   let isCompare = 1;
   1088 }
   1089 
   1090 class CompareRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   1091                  RegisterOperand cls1, RegisterOperand cls2>
   1092   : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2),
   1093             mnemonic#"r\t$R1, $R2",
   1094             [(operator cls1:$R1, cls2:$R2)]> {
   1095   let OpKey = mnemonic ## cls1;
   1096   let OpType = "reg";
   1097   let isCompare = 1;
   1098 }
   1099 
   1100 class CompareRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   1101                 RegisterOperand cls, Immediate imm>
   1102   : InstRI<opcode, (outs), (ins cls:$R1, imm:$I2),
   1103            mnemonic#"\t$R1, $I2",
   1104            [(operator cls:$R1, imm:$I2)]> {
   1105   let isCompare = 1;
   1106 }
   1107 
   1108 class CompareRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   1109                  RegisterOperand cls, Immediate imm>
   1110   : InstRIL<opcode, (outs), (ins cls:$R1, imm:$I2),
   1111             mnemonic#"\t$R1, $I2",
   1112             [(operator cls:$R1, imm:$I2)]> {
   1113   let isCompare = 1;
   1114 }
   1115 
   1116 class CompareRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   1117                    RegisterOperand cls, SDPatternOperator load>
   1118   : InstRIL<opcode, (outs), (ins cls:$R1, pcrel32:$I2),
   1119             mnemonic#"\t$R1, $I2",
   1120             [(operator cls:$R1, (load pcrel32:$I2))]> {
   1121   let isCompare = 1;
   1122   let mayLoad = 1;
   1123   // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
   1124   // However, BDXs have two extra operands and are therefore 6 units more
   1125   // complex.
   1126   let AddedComplexity = 7;
   1127 }
   1128 
   1129 class CompareRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   1130                 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
   1131                 AddressingMode mode = bdxaddr12only>
   1132   : InstRX<opcode, (outs), (ins cls:$R1, mode:$XBD2),
   1133            mnemonic#"\t$R1, $XBD2",
   1134            [(operator cls:$R1, (load mode:$XBD2))]> {
   1135   let OpKey = mnemonic ## cls;
   1136   let OpType = "mem";
   1137   let isCompare = 1;
   1138   let mayLoad = 1;
   1139   let AccessBytes = bytes;
   1140 }
   1141 
   1142 class CompareRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   1143                  RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
   1144   : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2),
   1145             mnemonic#"\t$R1, $XBD2",
   1146             [(operator cls:$R1, (load bdxaddr12only:$XBD2))]> {
   1147   let OpKey = mnemonic ## cls;
   1148   let OpType = "mem";
   1149   let isCompare = 1;
   1150   let mayLoad = 1;
   1151   let AccessBytes = bytes;
   1152 }
   1153 
   1154 class CompareRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   1155                  RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
   1156                  AddressingMode mode = bdxaddr20only>
   1157   : InstRXY<opcode, (outs), (ins cls:$R1, mode:$XBD2),
   1158             mnemonic#"\t$R1, $XBD2",
   1159             [(operator cls:$R1, (load mode:$XBD2))]> {
   1160   let OpKey = mnemonic ## cls;
   1161   let OpType = "mem";
   1162   let isCompare = 1;
   1163   let mayLoad = 1;
   1164   let AccessBytes = bytes;
   1165 }
   1166 
   1167 multiclass CompareRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
   1168                          SDPatternOperator operator, RegisterOperand cls,
   1169                          SDPatternOperator load, bits<5> bytes> {
   1170   let DispKey = mnemonic ## #cls in {
   1171     let DispSize = "12" in
   1172       def "" : CompareRX<mnemonic, rxOpcode, operator, cls,
   1173                          load, bytes, bdxaddr12pair>;
   1174     let DispSize = "20" in
   1175       def Y  : CompareRXY<mnemonic#"y", rxyOpcode, operator, cls,
   1176                           load, bytes, bdxaddr20pair>;
   1177   }
   1178 }
   1179 
   1180 class CompareSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   1181                 SDPatternOperator load, Immediate imm,
   1182                 AddressingMode mode = bdaddr12only>
   1183   : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
   1184            mnemonic#"\t$BD1, $I2",
   1185            [(operator (load mode:$BD1), imm:$I2)]> {
   1186   let isCompare = 1;
   1187   let mayLoad = 1;
   1188 }
   1189 
   1190 class CompareSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   1191                  SDPatternOperator load, Immediate imm>
   1192   : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
   1193             mnemonic#"\t$BD1, $I2",
   1194             [(operator (load bdaddr12only:$BD1), imm:$I2)]> {
   1195   let isCompare = 1;
   1196   let mayLoad = 1;
   1197 }
   1198 
   1199 class CompareSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   1200                  SDPatternOperator load, Immediate imm,
   1201                  AddressingMode mode = bdaddr20only>
   1202   : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
   1203             mnemonic#"\t$BD1, $I2",
   1204             [(operator (load mode:$BD1), imm:$I2)]> {
   1205   let isCompare = 1;
   1206   let mayLoad = 1;
   1207 }
   1208 
   1209 multiclass CompareSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
   1210                          SDPatternOperator operator, SDPatternOperator load,
   1211                          Immediate imm> {
   1212   let DispKey = mnemonic in {
   1213     let DispSize = "12" in
   1214       def "" : CompareSI<mnemonic, siOpcode, operator, load, imm, bdaddr12pair>;
   1215     let DispSize = "20" in
   1216       def Y  : CompareSIY<mnemonic#"y", siyOpcode, operator, load, imm,
   1217                           bdaddr20pair>;
   1218   }
   1219 }
   1220 
   1221 class TernaryRRD<string mnemonic, bits<16> opcode,
   1222                  SDPatternOperator operator, RegisterOperand cls>
   1223   : InstRRD<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, cls:$R2),
   1224             mnemonic#"r\t$R1, $R3, $R2",
   1225             [(set cls:$R1, (operator cls:$R1src, cls:$R3, cls:$R2))]> {
   1226   let OpKey = mnemonic ## cls;
   1227   let OpType = "reg";
   1228   let Constraints = "$R1 = $R1src";
   1229   let DisableEncoding = "$R1src";
   1230 }
   1231 
   1232 class TernaryRXF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   1233                  RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
   1234   : InstRXF<opcode, (outs cls:$R1),
   1235             (ins cls:$R1src, cls:$R3, bdxaddr12only:$XBD2),
   1236             mnemonic#"\t$R1, $R3, $XBD2",
   1237             [(set cls:$R1, (operator cls:$R1src, cls:$R3,
   1238                                      (load bdxaddr12only:$XBD2)))]> {
   1239   let OpKey = mnemonic ## cls;
   1240   let OpType = "mem";
   1241   let Constraints = "$R1 = $R1src";
   1242   let DisableEncoding = "$R1src";
   1243   let mayLoad = 1;
   1244   let AccessBytes = bytes;
   1245 }
   1246 
   1247 class CmpSwapRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   1248                 RegisterOperand cls, AddressingMode mode = bdaddr12only>
   1249   : InstRS<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
   1250            mnemonic#"\t$R1, $R3, $BD2",
   1251            [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
   1252   let Constraints = "$R1 = $R1src";
   1253   let DisableEncoding = "$R1src";
   1254   let mayLoad = 1;
   1255   let mayStore = 1;
   1256 }
   1257 
   1258 class CmpSwapRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   1259                  RegisterOperand cls, AddressingMode mode = bdaddr20only>
   1260   : InstRSY<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
   1261             mnemonic#"\t$R1, $R3, $BD2",
   1262             [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
   1263   let Constraints = "$R1 = $R1src";
   1264   let DisableEncoding = "$R1src";
   1265   let mayLoad = 1;
   1266   let mayStore = 1;
   1267 }
   1268 
   1269 multiclass CmpSwapRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode,
   1270                          SDPatternOperator operator, RegisterOperand cls> {
   1271   let DispKey = mnemonic ## #cls in {
   1272     let DispSize = "12" in
   1273       def "" : CmpSwapRS<mnemonic, rsOpcode, operator, cls, bdaddr12pair>;
   1274     let DispSize = "20" in
   1275       def Y  : CmpSwapRSY<mnemonic#"y", rsyOpcode, operator, cls, bdaddr20pair>;
   1276   }
   1277 }
   1278 
   1279 class RotateSelectRIEf<string mnemonic, bits<16> opcode, RegisterOperand cls1,
   1280                        RegisterOperand cls2>
   1281   : InstRIEf<opcode, (outs cls1:$R1),
   1282              (ins cls1:$R1src, cls2:$R2, uimm8:$I3, uimm8:$I4, uimm8zx6:$I5),
   1283              mnemonic#"\t$R1, $R2, $I3, $I4, $I5", []> {
   1284   let Constraints = "$R1 = $R1src";
   1285   let DisableEncoding = "$R1src";
   1286 }
   1287 
   1288 // A floating-point load-and test operation.  Create both a normal unary
   1289 // operation and one that acts as a comparison against zero.
   1290 multiclass LoadAndTestRRE<string mnemonic, bits<16> opcode,
   1291                           RegisterOperand cls> {
   1292   def "" : UnaryRRE<mnemonic, opcode, null_frag, cls, cls>;
   1293   let isCodeGenOnly = 1 in
   1294     def Compare : CompareRRE<mnemonic, opcode, null_frag, cls, cls>;
   1295 }
   1296 
   1297 //===----------------------------------------------------------------------===//
   1298 // Pseudo instructions
   1299 //===----------------------------------------------------------------------===//
   1300 //
   1301 // Convenience instructions that get lowered to real instructions
   1302 // by either SystemZTargetLowering::EmitInstrWithCustomInserter()
   1303 // or SystemZInstrInfo::expandPostRAPseudo().
   1304 //
   1305 //===----------------------------------------------------------------------===//
   1306 
   1307 class Pseudo<dag outs, dag ins, list<dag> pattern>
   1308   : InstSystemZ<0, outs, ins, "", pattern> {
   1309   let isPseudo = 1;
   1310   let isCodeGenOnly = 1;
   1311 }
   1312 
   1313 // Implements "$dst = $cc & (8 >> CC) ? $src1 : $src2", where CC is
   1314 // the value of the PSW's 2-bit condition code field.
   1315 class SelectWrapper<RegisterOperand cls>
   1316   : Pseudo<(outs cls:$dst),
   1317            (ins cls:$src1, cls:$src2, uimm8zx4:$valid, uimm8zx4:$cc),
   1318            [(set cls:$dst, (z_select_ccmask cls:$src1, cls:$src2,
   1319                                             uimm8zx4:$valid, uimm8zx4:$cc))]> {
   1320   let usesCustomInserter = 1;
   1321   // Although the instructions used by these nodes do not in themselves
   1322   // change CC, the insertion requires new blocks, and CC cannot be live
   1323   // across them.
   1324   let Defs = [CC];
   1325   let Uses = [CC];
   1326 }
   1327 
   1328 // Stores $new to $addr if $cc is true ("" case) or false (Inv case).
   1329 multiclass CondStores<RegisterOperand cls, SDPatternOperator store,
   1330                       SDPatternOperator load, AddressingMode mode> {
   1331   let Defs = [CC], Uses = [CC], usesCustomInserter = 1 in {
   1332     def "" : Pseudo<(outs),
   1333                     (ins cls:$new, mode:$addr, uimm8zx4:$valid, uimm8zx4:$cc),
   1334                     [(store (z_select_ccmask cls:$new, (load mode:$addr),
   1335                                              uimm8zx4:$valid, uimm8zx4:$cc),
   1336                             mode:$addr)]>;
   1337     def Inv : Pseudo<(outs),
   1338                      (ins cls:$new, mode:$addr, uimm8zx4:$valid, uimm8zx4:$cc),
   1339                      [(store (z_select_ccmask (load mode:$addr), cls:$new,
   1340                                               uimm8zx4:$valid, uimm8zx4:$cc),
   1341                               mode:$addr)]>;
   1342   }
   1343 }
   1344 
   1345 // OPERATOR is ATOMIC_SWAP or an ATOMIC_LOAD_* operation.  PAT and OPERAND
   1346 // describe the second (non-memory) operand.
   1347 class AtomicLoadBinary<SDPatternOperator operator, RegisterOperand cls,
   1348                        dag pat, DAGOperand operand>
   1349   : Pseudo<(outs cls:$dst), (ins bdaddr20only:$ptr, operand:$src2),
   1350            [(set cls:$dst, (operator bdaddr20only:$ptr, pat))]> {
   1351   let Defs = [CC];
   1352   let Has20BitOffset = 1;
   1353   let mayLoad = 1;
   1354   let mayStore = 1;
   1355   let usesCustomInserter = 1;
   1356 }
   1357 
   1358 // Specializations of AtomicLoadWBinary.
   1359 class AtomicLoadBinaryReg32<SDPatternOperator operator>
   1360   : AtomicLoadBinary<operator, GR32, (i32 GR32:$src2), GR32>;
   1361 class AtomicLoadBinaryImm32<SDPatternOperator operator, Immediate imm>
   1362   : AtomicLoadBinary<operator, GR32, (i32 imm:$src2), imm>;
   1363 class AtomicLoadBinaryReg64<SDPatternOperator operator>
   1364   : AtomicLoadBinary<operator, GR64, (i64 GR64:$src2), GR64>;
   1365 class AtomicLoadBinaryImm64<SDPatternOperator operator, Immediate imm>
   1366   : AtomicLoadBinary<operator, GR64, (i64 imm:$src2), imm>;
   1367 
   1368 // OPERATOR is ATOMIC_SWAPW or an ATOMIC_LOADW_* operation.  PAT and OPERAND
   1369 // describe the second (non-memory) operand.
   1370 class AtomicLoadWBinary<SDPatternOperator operator, dag pat,
   1371                         DAGOperand operand>
   1372   : Pseudo<(outs GR32:$dst),
   1373            (ins bdaddr20only:$ptr, operand:$src2, ADDR32:$bitshift,
   1374                 ADDR32:$negbitshift, uimm32:$bitsize),
   1375            [(set GR32:$dst, (operator bdaddr20only:$ptr, pat, ADDR32:$bitshift,
   1376                                       ADDR32:$negbitshift, uimm32:$bitsize))]> {
   1377   let Defs = [CC];
   1378   let Has20BitOffset = 1;
   1379   let mayLoad = 1;
   1380   let mayStore = 1;
   1381   let usesCustomInserter = 1;
   1382 }
   1383 
   1384 // Specializations of AtomicLoadWBinary.
   1385 class AtomicLoadWBinaryReg<SDPatternOperator operator>
   1386   : AtomicLoadWBinary<operator, (i32 GR32:$src2), GR32>;
   1387 class AtomicLoadWBinaryImm<SDPatternOperator operator, Immediate imm>
   1388   : AtomicLoadWBinary<operator, (i32 imm:$src2), imm>;
   1389