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   let hasSideEffects = 0;
     25   let mayLoad = 0;
     26   let mayStore = 0;
     27 
     28   // Some instructions come in pairs, one having a 12-bit displacement
     29   // and the other having a 20-bit displacement.  Both instructions in
     30   // the pair have the same DispKey and their DispSizes are "12" and "20"
     31   // respectively.
     32   string DispKey = "";
     33   string DispSize = "none";
     34 
     35   // Many register-based <INSN>R instructions have a memory-based <INSN>
     36   // counterpart.  OpKey uniquely identifies <INSN>R, while OpType is
     37   // "reg" for <INSN>R and "mem" for <INSN>.
     38   string OpKey = "";
     39   string OpType = "none";
     40 
     41   // Many distinct-operands instructions have older 2-operand equivalents.
     42   // NumOpsKey uniquely identifies one of these 2-operand and 3-operand pairs,
     43   // with NumOpsValue being "2" or "3" as appropriate.
     44   string NumOpsKey = "";
     45   string NumOpsValue = "none";
     46 
     47   // True if this instruction is a simple D(X,B) load of a register
     48   // (with no sign or zero extension).
     49   bit SimpleBDXLoad = 0;
     50 
     51   // True if this instruction is a simple D(X,B) store of a register
     52   // (with no truncation).
     53   bit SimpleBDXStore = 0;
     54 
     55   // True if this instruction has a 20-bit displacement field.
     56   bit Has20BitOffset = 0;
     57 
     58   // True if addresses in this instruction have an index register.
     59   bit HasIndex = 0;
     60 
     61   // True if this is a 128-bit pseudo instruction that combines two 64-bit
     62   // operations.
     63   bit Is128Bit = 0;
     64 
     65   // The access size of all memory operands in bytes, or 0 if not known.
     66   bits<5> AccessBytes = 0;
     67 
     68   // If the instruction sets CC to a useful value, this gives the mask
     69   // of all possible CC results.  The mask has the same form as
     70   // SystemZ::CCMASK_*.
     71   bits<4> CCValues = 0;
     72 
     73   // The subset of CCValues that have the same meaning as they would after
     74   // a comparison of the first operand against zero.
     75   bits<4> CompareZeroCCMask = 0;
     76 
     77   // True if the instruction is conditional and if the CC mask operand
     78   // comes first (as for BRC, etc.).
     79   bit CCMaskFirst = 0;
     80 
     81   // Similar, but true if the CC mask operand comes last (as for LOC, etc.).
     82   bit CCMaskLast = 0;
     83 
     84   // True if the instruction is the "logical" rather than "arithmetic" form,
     85   // in cases where a distinction exists.
     86   bit IsLogical = 0;
     87 
     88   let TSFlags{0}     = SimpleBDXLoad;
     89   let TSFlags{1}     = SimpleBDXStore;
     90   let TSFlags{2}     = Has20BitOffset;
     91   let TSFlags{3}     = HasIndex;
     92   let TSFlags{4}     = Is128Bit;
     93   let TSFlags{9-5}   = AccessBytes;
     94   let TSFlags{13-10} = CCValues;
     95   let TSFlags{17-14} = CompareZeroCCMask;
     96   let TSFlags{18}    = CCMaskFirst;
     97   let TSFlags{19}    = CCMaskLast;
     98   let TSFlags{20}    = IsLogical;
     99 }
    100 
    101 //===----------------------------------------------------------------------===//
    102 // Mappings between instructions
    103 //===----------------------------------------------------------------------===//
    104 
    105 // Return the version of an instruction that has an unsigned 12-bit
    106 // displacement.
    107 def getDisp12Opcode : InstrMapping {
    108   let FilterClass = "InstSystemZ";
    109   let RowFields = ["DispKey"];
    110   let ColFields = ["DispSize"];
    111   let KeyCol = ["20"];
    112   let ValueCols = [["12"]];
    113 }
    114 
    115 // Return the version of an instruction that has a signed 20-bit displacement.
    116 def getDisp20Opcode : InstrMapping {
    117   let FilterClass = "InstSystemZ";
    118   let RowFields = ["DispKey"];
    119   let ColFields = ["DispSize"];
    120   let KeyCol = ["12"];
    121   let ValueCols = [["20"]];
    122 }
    123 
    124 // Return the memory form of a register instruction.
    125 def getMemOpcode : InstrMapping {
    126   let FilterClass = "InstSystemZ";
    127   let RowFields = ["OpKey"];
    128   let ColFields = ["OpType"];
    129   let KeyCol = ["reg"];
    130   let ValueCols = [["mem"]];
    131 }
    132 
    133 // Return the 3-operand form of a 2-operand instruction.
    134 def getThreeOperandOpcode : InstrMapping {
    135   let FilterClass = "InstSystemZ";
    136   let RowFields = ["NumOpsKey"];
    137   let ColFields = ["NumOpsValue"];
    138   let KeyCol = ["2"];
    139   let ValueCols = [["3"]];
    140 }
    141 
    142 //===----------------------------------------------------------------------===//
    143 // Instruction formats
    144 //===----------------------------------------------------------------------===//
    145 //
    146 // Formats are specified using operand field declarations of the form:
    147 //
    148 //   bits<4> Rn   : register input or output for operand n
    149 //   bits<5> Vn   : vector register input or output for operand n
    150 //   bits<m> In   : immediate value of width m for operand n
    151 //   bits<4> BDn  : address operand n, which has a base and a displacement
    152 //   bits<m> XBDn : address operand n, which has an index, a base and a
    153 //                  displacement
    154 //   bits<m> VBDn : address operand n, which has a vector index, a base and a
    155 //                  displacement
    156 //   bits<4> Xn   : index register for address operand n
    157 //   bits<4> Mn   : mode value for operand n
    158 //
    159 // The operand numbers ("n" in the list above) follow the architecture manual.
    160 // Assembly operands sometimes have a different order; in particular, R3 often
    161 // is often written between operands 1 and 2.
    162 //
    163 //===----------------------------------------------------------------------===//
    164 
    165 class InstE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    166   : InstSystemZ<2, outs, ins, asmstr, pattern> {
    167   field bits<16> Inst;
    168   field bits<16> SoftFail = 0;
    169 
    170   let Inst = op;
    171 }
    172 
    173 class InstI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    174   : InstSystemZ<2, outs, ins, asmstr, pattern> {
    175   field bits<16> Inst;
    176   field bits<16> SoftFail = 0;
    177 
    178   bits<8> I1;
    179 
    180   let Inst{15-8} = op;
    181   let Inst{7-0}  = I1;
    182 }
    183 
    184 class InstIE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    185   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    186   field bits<32> Inst;
    187   field bits<32> SoftFail = 0;
    188 
    189   bits<4> I1;
    190   bits<4> I2;
    191 
    192   let Inst{31-16} = op;
    193   let Inst{15-8}  = 0;
    194   let Inst{7-4}   = I1;
    195   let Inst{3-0}   = I2;
    196 }
    197 
    198 class InstMII<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    199   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    200   field bits<48> Inst;
    201   field bits<48> SoftFail = 0;
    202 
    203   bits<4> M1;
    204   bits<12> RI2;
    205   bits<24> RI3;
    206 
    207   let Inst{47-40} = op;
    208   let Inst{39-36} = M1;
    209   let Inst{35-24} = RI2;
    210   let Inst{23-0}  = RI3;
    211 }
    212 
    213 class InstRIa<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    214   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    215   field bits<32> Inst;
    216   field bits<32> SoftFail = 0;
    217 
    218   bits<4> R1;
    219   bits<16> I2;
    220 
    221   let Inst{31-24} = op{11-4};
    222   let Inst{23-20} = R1;
    223   let Inst{19-16} = op{3-0};
    224   let Inst{15-0}  = I2;
    225 }
    226 
    227 class InstRIb<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    228   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    229   field bits<32> Inst;
    230   field bits<32> SoftFail = 0;
    231 
    232   bits<4> R1;
    233   bits<16> RI2;
    234 
    235   let Inst{31-24} = op{11-4};
    236   let Inst{23-20} = R1;
    237   let Inst{19-16} = op{3-0};
    238   let Inst{15-0}  = RI2;
    239 }
    240 
    241 class InstRIc<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    242   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    243   field bits<32> Inst;
    244   field bits<32> SoftFail = 0;
    245 
    246   bits<4> M1;
    247   bits<16> RI2;
    248 
    249   let Inst{31-24} = op{11-4};
    250   let Inst{23-20} = M1;
    251   let Inst{19-16} = op{3-0};
    252   let Inst{15-0}  = RI2;
    253 }
    254 
    255 class InstRIEa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    256   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    257   field bits<48> Inst;
    258   field bits<48> SoftFail = 0;
    259 
    260   bits<4> R1;
    261   bits<16> I2;
    262   bits<4> M3;
    263 
    264   let Inst{47-40} = op{15-8};
    265   let Inst{39-36} = R1;
    266   let Inst{35-32} = 0;
    267   let Inst{31-16} = I2;
    268   let Inst{15-12} = M3;
    269   let Inst{11-8}  = 0;
    270   let Inst{7-0}   = op{7-0};
    271 }
    272 
    273 class InstRIEb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    274   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    275   field bits<48> Inst;
    276   field bits<48> SoftFail = 0;
    277 
    278   bits<4> R1;
    279   bits<4> R2;
    280   bits<4> M3;
    281   bits<16> RI4;
    282 
    283   let Inst{47-40} = op{15-8};
    284   let Inst{39-36} = R1;
    285   let Inst{35-32} = R2;
    286   let Inst{31-16} = RI4;
    287   let Inst{15-12} = M3;
    288   let Inst{11-8}  = 0;
    289   let Inst{7-0}   = op{7-0};
    290 }
    291 
    292 class InstRIEc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    293   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    294   field bits<48> Inst;
    295   field bits<48> SoftFail = 0;
    296 
    297   bits<4> R1;
    298   bits<8> I2;
    299   bits<4> M3;
    300   bits<16> RI4;
    301 
    302   let Inst{47-40} = op{15-8};
    303   let Inst{39-36} = R1;
    304   let Inst{35-32} = M3;
    305   let Inst{31-16} = RI4;
    306   let Inst{15-8}  = I2;
    307   let Inst{7-0}   = op{7-0};
    308 }
    309 
    310 class InstRIEd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    311   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    312   field bits<48> Inst;
    313   field bits<48> SoftFail = 0;
    314 
    315   bits<4> R1;
    316   bits<4> R3;
    317   bits<16> I2;
    318 
    319   let Inst{47-40} = op{15-8};
    320   let Inst{39-36} = R1;
    321   let Inst{35-32} = R3;
    322   let Inst{31-16} = I2;
    323   let Inst{15-8}  = 0;
    324   let Inst{7-0}   = op{7-0};
    325 }
    326 
    327 class InstRIEe<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    328   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    329   field bits<48> Inst;
    330   field bits<48> SoftFail = 0;
    331 
    332   bits<4> R1;
    333   bits<4> R3;
    334   bits<16> RI2;
    335 
    336   let Inst{47-40} = op{15-8};
    337   let Inst{39-36} = R1;
    338   let Inst{35-32} = R3;
    339   let Inst{31-16} = RI2;
    340   let Inst{15-8}  = 0;
    341   let Inst{7-0}   = op{7-0};
    342 }
    343 
    344 class InstRIEf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    345   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    346   field bits<48> Inst;
    347   field bits<48> SoftFail = 0;
    348 
    349   bits<4> R1;
    350   bits<4> R2;
    351   bits<8> I3;
    352   bits<8> I4;
    353   bits<8> I5;
    354 
    355   let Inst{47-40} = op{15-8};
    356   let Inst{39-36} = R1;
    357   let Inst{35-32} = R2;
    358   let Inst{31-24} = I3;
    359   let Inst{23-16} = I4;
    360   let Inst{15-8}  = I5;
    361   let Inst{7-0}   = op{7-0};
    362 }
    363 
    364 class InstRIEg<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    365   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    366   field bits<48> Inst;
    367   field bits<48> SoftFail = 0;
    368 
    369   bits<4> R1;
    370   bits<4> M3;
    371   bits<16> I2;
    372 
    373   let Inst{47-40} = op{15-8};
    374   let Inst{39-36} = R1;
    375   let Inst{35-32} = M3;
    376   let Inst{31-16} = I2;
    377   let Inst{15-8}  = 0;
    378   let Inst{7-0}   = op{7-0};
    379 }
    380 
    381 class InstRILa<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    382   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    383   field bits<48> Inst;
    384   field bits<48> SoftFail = 0;
    385 
    386   bits<4> R1;
    387   bits<32> I2;
    388 
    389   let Inst{47-40} = op{11-4};
    390   let Inst{39-36} = R1;
    391   let Inst{35-32} = op{3-0};
    392   let Inst{31-0}  = I2;
    393 }
    394 
    395 class InstRILb<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    396   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    397   field bits<48> Inst;
    398   field bits<48> SoftFail = 0;
    399 
    400   bits<4> R1;
    401   bits<32> RI2;
    402 
    403   let Inst{47-40} = op{11-4};
    404   let Inst{39-36} = R1;
    405   let Inst{35-32} = op{3-0};
    406   let Inst{31-0}  = RI2;
    407 }
    408 
    409 class InstRILc<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    410   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    411   field bits<48> Inst;
    412   field bits<48> SoftFail = 0;
    413 
    414   bits<4> M1;
    415   bits<32> RI2;
    416 
    417   let Inst{47-40} = op{11-4};
    418   let Inst{39-36} = M1;
    419   let Inst{35-32} = op{3-0};
    420   let Inst{31-0}  = RI2;
    421 }
    422 
    423 class InstRIS<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    424   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    425   field bits<48> Inst;
    426   field bits<48> SoftFail = 0;
    427 
    428   bits<4> R1;
    429   bits<8> I2;
    430   bits<4> M3;
    431   bits<16> BD4;
    432 
    433   let Inst{47-40} = op{15-8};
    434   let Inst{39-36} = R1;
    435   let Inst{35-32} = M3;
    436   let Inst{31-16} = BD4;
    437   let Inst{15-8}  = I2;
    438   let Inst{7-0}   = op{7-0};
    439 }
    440 
    441 class InstRR<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    442   : InstSystemZ<2, outs, ins, asmstr, pattern> {
    443   field bits<16> Inst;
    444   field bits<16> SoftFail = 0;
    445 
    446   bits<4> R1;
    447   bits<4> R2;
    448 
    449   let Inst{15-8} = op;
    450   let Inst{7-4}  = R1;
    451   let Inst{3-0}  = R2;
    452 }
    453 
    454 class InstRRD<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    455   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    456   field bits<32> Inst;
    457   field bits<32> SoftFail = 0;
    458 
    459   bits<4> R1;
    460   bits<4> R3;
    461   bits<4> R2;
    462 
    463   let Inst{31-16} = op;
    464   let Inst{15-12} = R1;
    465   let Inst{11-8}  = 0;
    466   let Inst{7-4}   = R3;
    467   let Inst{3-0}   = R2;
    468 }
    469 
    470 class InstRRE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    471   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    472   field bits<32> Inst;
    473   field bits<32> SoftFail = 0;
    474 
    475   bits<4> R1;
    476   bits<4> R2;
    477 
    478   let Inst{31-16} = op;
    479   let Inst{15-8}  = 0;
    480   let Inst{7-4}   = R1;
    481   let Inst{3-0}   = R2;
    482 }
    483 
    484 class InstRRFa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    485   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    486   field bits<32> Inst;
    487   field bits<32> SoftFail = 0;
    488 
    489   bits<4> R1;
    490   bits<4> R2;
    491   bits<4> R3;
    492   bits<4> M4;
    493 
    494   let Inst{31-16} = op;
    495   let Inst{15-12} = R3;
    496   let Inst{11-8}  = M4;
    497   let Inst{7-4}   = R1;
    498   let Inst{3-0}   = R2;
    499 }
    500 
    501 class InstRRFb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    502   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    503   field bits<32> Inst;
    504   field bits<32> SoftFail = 0;
    505 
    506   bits<4> R1;
    507   bits<4> R2;
    508   bits<4> R3;
    509   bits<4> M4;
    510 
    511   let Inst{31-16} = op;
    512   let Inst{15-12} = R3;
    513   let Inst{11-8}  = M4;
    514   let Inst{7-4}   = R1;
    515   let Inst{3-0}   = R2;
    516 }
    517 
    518 class InstRRFc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    519   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    520   field bits<32> Inst;
    521   field bits<32> SoftFail = 0;
    522 
    523   bits<4> R1;
    524   bits<4> R2;
    525   bits<4> M3;
    526 
    527   let Inst{31-16} = op;
    528   let Inst{15-12} = M3;
    529   let Inst{11-8}  = 0;
    530   let Inst{7-4}   = R1;
    531   let Inst{3-0}   = R2;
    532 }
    533 
    534 class InstRRFd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    535   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    536   field bits<32> Inst;
    537   field bits<32> SoftFail = 0;
    538 
    539   bits<4> R1;
    540   bits<4> R2;
    541   bits<4> M4;
    542 
    543   let Inst{31-16} = op;
    544   let Inst{15-12} = 0;
    545   let Inst{11-8}  = M4;
    546   let Inst{7-4}   = R1;
    547   let Inst{3-0}   = R2;
    548 }
    549 
    550 class InstRRFe<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    551   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    552   field bits<32> Inst;
    553   field bits<32> SoftFail = 0;
    554 
    555   bits<4> R1;
    556   bits<4> R2;
    557   bits<4> M3;
    558   bits<4> M4;
    559 
    560   let Inst{31-16} = op;
    561   let Inst{15-12} = M3;
    562   let Inst{11-8}  = M4;
    563   let Inst{7-4}   = R1;
    564   let Inst{3-0}   = R2;
    565 }
    566 
    567 class InstRRS<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    568   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    569   field bits<48> Inst;
    570   field bits<48> SoftFail = 0;
    571 
    572   bits<4> R1;
    573   bits<4> R2;
    574   bits<4> M3;
    575   bits<16> BD4;
    576 
    577   let Inst{47-40} = op{15-8};
    578   let Inst{39-36} = R1;
    579   let Inst{35-32} = R2;
    580   let Inst{31-16} = BD4;
    581   let Inst{15-12} = M3;
    582   let Inst{11-8}  = 0;
    583   let Inst{7-0}   = op{7-0};
    584 }
    585 
    586 class InstRXa<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    587   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    588   field bits<32> Inst;
    589   field bits<32> SoftFail = 0;
    590 
    591   bits<4> R1;
    592   bits<20> XBD2;
    593 
    594   let Inst{31-24} = op;
    595   let Inst{23-20} = R1;
    596   let Inst{19-0}  = XBD2;
    597 
    598   let HasIndex = 1;
    599 }
    600 
    601 class InstRXb<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    602   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    603   field bits<32> Inst;
    604   field bits<32> SoftFail = 0;
    605 
    606   bits<4> M1;
    607   bits<20> XBD2;
    608 
    609   let Inst{31-24} = op;
    610   let Inst{23-20} = M1;
    611   let Inst{19-0}  = XBD2;
    612 
    613   let HasIndex = 1;
    614 }
    615 
    616 class InstRXE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    617   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    618   field bits<48> Inst;
    619   field bits<48> SoftFail = 0;
    620 
    621   bits<4> R1;
    622   bits<20> XBD2;
    623   bits<4> M3;
    624 
    625   let Inst{47-40} = op{15-8};
    626   let Inst{39-36} = R1;
    627   let Inst{35-16} = XBD2;
    628   let Inst{15-12} = M3;
    629   let Inst{11-8}  = 0;
    630   let Inst{7-0}   = op{7-0};
    631 
    632   let HasIndex = 1;
    633 }
    634 
    635 class InstRXF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    636   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    637   field bits<48> Inst;
    638   field bits<48> SoftFail = 0;
    639 
    640   bits<4> R1;
    641   bits<4> R3;
    642   bits<20> XBD2;
    643 
    644   let Inst{47-40} = op{15-8};
    645   let Inst{39-36} = R3;
    646   let Inst{35-16} = XBD2;
    647   let Inst{15-12} = R1;
    648   let Inst{11-8}  = 0;
    649   let Inst{7-0}   = op{7-0};
    650 
    651   let HasIndex = 1;
    652 }
    653 
    654 class InstRXYa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    655   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    656   field bits<48> Inst;
    657   field bits<48> SoftFail = 0;
    658 
    659   bits<4> R1;
    660   bits<28> XBD2;
    661 
    662   let Inst{47-40} = op{15-8};
    663   let Inst{39-36} = R1;
    664   let Inst{35-8}  = XBD2;
    665   let Inst{7-0}   = op{7-0};
    666 
    667   let Has20BitOffset = 1;
    668   let HasIndex = 1;
    669 }
    670 
    671 class InstRXYb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    672   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    673   field bits<48> Inst;
    674   field bits<48> SoftFail = 0;
    675 
    676   bits<4> M1;
    677   bits<28> XBD2;
    678 
    679   let Inst{47-40} = op{15-8};
    680   let Inst{39-36} = M1;
    681   let Inst{35-8}  = XBD2;
    682   let Inst{7-0}   = op{7-0};
    683 
    684   let Has20BitOffset = 1;
    685   let HasIndex = 1;
    686 }
    687 
    688 class InstRSa<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    689   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    690   field bits<32> Inst;
    691   field bits<32> SoftFail = 0;
    692 
    693   bits<4> R1;
    694   bits<4> R3;
    695   bits<16> BD2;
    696 
    697   let Inst{31-24} = op;
    698   let Inst{23-20} = R1;
    699   let Inst{19-16} = R3;
    700   let Inst{15-0}  = BD2;
    701 }
    702 
    703 class InstRSb<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    704   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    705   field bits<32> Inst;
    706   field bits<32> SoftFail = 0;
    707 
    708   bits<4> R1;
    709   bits<4> M3;
    710   bits<16> BD2;
    711 
    712   let Inst{31-24} = op;
    713   let Inst{23-20} = R1;
    714   let Inst{19-16} = M3;
    715   let Inst{15-0}  = BD2;
    716 }
    717 
    718 class InstRSI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    719   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    720   field bits<32> Inst;
    721   field bits<32> SoftFail = 0;
    722 
    723   bits<4> R1;
    724   bits<4> R3;
    725   bits<16> RI2;
    726 
    727   let Inst{31-24} = op;
    728   let Inst{23-20} = R1;
    729   let Inst{19-16} = R3;
    730   let Inst{15-0}  = RI2;
    731 }
    732 
    733 class InstRSLa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    734   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    735   field bits<48> Inst;
    736   field bits<48> SoftFail = 0;
    737 
    738   bits<20> BDL1;
    739 
    740   let Inst{47-40} = op{15-8};
    741   let Inst{39-36} = BDL1{19-16};
    742   let Inst{35-32} = 0;
    743   let Inst{31-16} = BDL1{15-0};
    744   let Inst{15-8}  = 0;
    745   let Inst{7-0}   = op{7-0};
    746 }
    747 
    748 class InstRSLb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    749   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    750   field bits<48> Inst;
    751   field bits<48> SoftFail = 0;
    752 
    753   bits<4> R1;
    754   bits<24> BDL2;
    755   bits<4> M3;
    756 
    757   let Inst{47-40} = op{15-8};
    758   let Inst{39-16} = BDL2;
    759   let Inst{15-12} = R1;
    760   let Inst{11-8}  = M3;
    761   let Inst{7-0}   = op{7-0};
    762 }
    763 
    764 class InstRSYa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    765   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    766   field bits<48> Inst;
    767   field bits<48> SoftFail = 0;
    768 
    769   bits<4> R1;
    770   bits<4> R3;
    771   bits<24> BD2;
    772 
    773   let Inst{47-40} = op{15-8};
    774   let Inst{39-36} = R1;
    775   let Inst{35-32} = R3;
    776   let Inst{31-8}  = BD2;
    777   let Inst{7-0}   = op{7-0};
    778 
    779   let Has20BitOffset = 1;
    780 }
    781 
    782 class InstRSYb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    783   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    784   field bits<48> Inst;
    785   field bits<48> SoftFail = 0;
    786 
    787   bits<4> R1;
    788   bits<4> M3;
    789   bits<24> BD2;
    790 
    791   let Inst{47-40} = op{15-8};
    792   let Inst{39-36} = R1;
    793   let Inst{35-32} = M3;
    794   let Inst{31-8}  = BD2;
    795   let Inst{7-0}   = op{7-0};
    796 
    797   let Has20BitOffset = 1;
    798 }
    799 
    800 class InstSI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    801   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    802   field bits<32> Inst;
    803   field bits<32> SoftFail = 0;
    804 
    805   bits<16> BD1;
    806   bits<8> I2;
    807 
    808   let Inst{31-24} = op;
    809   let Inst{23-16} = I2;
    810   let Inst{15-0}  = BD1;
    811 }
    812 
    813 class InstSIL<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    814   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    815   field bits<48> Inst;
    816   field bits<48> SoftFail = 0;
    817 
    818   bits<16> BD1;
    819   bits<16> I2;
    820 
    821   let Inst{47-32} = op;
    822   let Inst{31-16} = BD1;
    823   let Inst{15-0}  = I2;
    824 }
    825 
    826 class InstSIY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    827   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    828   field bits<48> Inst;
    829   field bits<48> SoftFail = 0;
    830 
    831   bits<24> BD1;
    832   bits<8> I2;
    833 
    834   let Inst{47-40} = op{15-8};
    835   let Inst{39-32} = I2;
    836   let Inst{31-8}  = BD1;
    837   let Inst{7-0}   = op{7-0};
    838 
    839   let Has20BitOffset = 1;
    840 }
    841 
    842 class InstSMI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    843   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    844   field bits<48> Inst;
    845   field bits<48> SoftFail = 0;
    846 
    847   bits<4> M1;
    848   bits<16> RI2;
    849   bits<16> BD3;
    850 
    851   let Inst{47-40} = op;
    852   let Inst{39-36} = M1;
    853   let Inst{35-32} = 0;
    854   let Inst{31-16} = BD3;
    855   let Inst{15-0}  = RI2;
    856 }
    857 
    858 class InstSSa<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    859   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    860   field bits<48> Inst;
    861   field bits<48> SoftFail = 0;
    862 
    863   bits<24> BDL1;
    864   bits<16> BD2;
    865 
    866   let Inst{47-40} = op;
    867   let Inst{39-16} = BDL1;
    868   let Inst{15-0}  = BD2;
    869 }
    870 
    871 class InstSSb<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    872   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    873   field bits<48> Inst;
    874   field bits<48> SoftFail = 0;
    875 
    876   bits<20> BDL1;
    877   bits<20> BDL2;
    878 
    879   let Inst{47-40} = op;
    880   let Inst{39-36} = BDL1{19-16};
    881   let Inst{35-32} = BDL2{19-16};
    882   let Inst{31-16} = BDL1{15-0};
    883   let Inst{15-0}  = BDL2{15-0};
    884 }
    885 
    886 class InstSSc<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    887   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    888   field bits<48> Inst;
    889   field bits<48> SoftFail = 0;
    890 
    891   bits<20> BDL1;
    892   bits<16> BD2;
    893   bits<4> I3;
    894 
    895   let Inst{47-40} = op;
    896   let Inst{39-36} = BDL1{19-16};
    897   let Inst{35-32} = I3;
    898   let Inst{31-16} = BDL1{15-0};
    899   let Inst{15-0}  = BD2;
    900 }
    901 
    902 class InstSSd<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    903   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    904   field bits<48> Inst;
    905   field bits<48> SoftFail = 0;
    906 
    907   bits<20> RBD1;
    908   bits<16> BD2;
    909   bits<4> R3;
    910 
    911   let Inst{47-40} = op;
    912   let Inst{39-36} = RBD1{19-16};
    913   let Inst{35-32} = R3;
    914   let Inst{31-16} = RBD1{15-0};
    915   let Inst{15-0}  = BD2;
    916 }
    917 
    918 class InstSSe<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    919   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    920   field bits<48> Inst;
    921   field bits<48> SoftFail = 0;
    922 
    923   bits<4> R1;
    924   bits<16> BD2;
    925   bits<4> R3;
    926   bits<16> BD4;
    927 
    928   let Inst{47-40} = op;
    929   let Inst{39-36} = R1;
    930   let Inst{35-32} = R3;
    931   let Inst{31-16} = BD2;
    932   let Inst{15-0}  = BD4;
    933 }
    934 
    935 class InstSSf<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    936   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    937   field bits<48> Inst;
    938   field bits<48> SoftFail = 0;
    939 
    940   bits<16> BD1;
    941   bits<24> BDL2;
    942 
    943   let Inst{47-40} = op;
    944   let Inst{39-32} = BDL2{23-16};
    945   let Inst{31-16} = BD1;
    946   let Inst{15-0}  = BDL2{15-0};
    947 }
    948 
    949 class InstSSE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    950   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    951   field bits<48> Inst;
    952   field bits<48> SoftFail = 0;
    953 
    954   bits<16> BD1;
    955   bits<16> BD2;
    956 
    957   let Inst{47-32} = op;
    958   let Inst{31-16} = BD1;
    959   let Inst{15-0}  = BD2;
    960 }
    961 
    962 class InstSSF<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    963   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    964   field bits<48> Inst;
    965   field bits<48> SoftFail = 0;
    966 
    967   bits<16> BD1;
    968   bits<16> BD2;
    969   bits<4>  R3;
    970 
    971   let Inst{47-40} = op{11-4};
    972   let Inst{39-36} = R3;
    973   let Inst{35-32} = op{3-0};
    974   let Inst{31-16} = BD1;
    975   let Inst{15-0}  = BD2;
    976 }
    977 
    978 class InstS<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    979   : InstSystemZ<4, outs, ins, asmstr, pattern> {
    980   field bits<32> Inst;
    981   field bits<32> SoftFail = 0;
    982 
    983   bits<16> BD2;
    984 
    985   let Inst{31-16} = op;
    986   let Inst{15-0}  = BD2;
    987 }
    988 
    989 class InstVRIa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
    990   : InstSystemZ<6, outs, ins, asmstr, pattern> {
    991   field bits<48> Inst;
    992   field bits<48> SoftFail = 0;
    993 
    994   bits<5> V1;
    995   bits<16> I2;
    996   bits<4> M3;
    997 
    998   let Inst{47-40} = op{15-8};
    999   let Inst{39-36} = V1{3-0};
   1000   let Inst{35-32} = 0;
   1001   let Inst{31-16} = I2;
   1002   let Inst{15-12} = M3;
   1003   let Inst{11}    = V1{4};
   1004   let Inst{10-8}  = 0;
   1005   let Inst{7-0}   = op{7-0};
   1006 }
   1007 
   1008 class InstVRIb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1009   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1010   field bits<48> Inst;
   1011   field bits<48> SoftFail = 0;
   1012 
   1013   bits<5> V1;
   1014   bits<8> I2;
   1015   bits<8> I3;
   1016   bits<4> M4;
   1017 
   1018   let Inst{47-40} = op{15-8};
   1019   let Inst{39-36} = V1{3-0};
   1020   let Inst{35-32} = 0;
   1021   let Inst{31-24} = I2;
   1022   let Inst{23-16} = I3;
   1023   let Inst{15-12} = M4;
   1024   let Inst{11}    = V1{4};
   1025   let Inst{10-8}  = 0;
   1026   let Inst{7-0}   = op{7-0};
   1027 }
   1028 
   1029 class InstVRIc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1030   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1031   field bits<48> Inst;
   1032   field bits<48> SoftFail = 0;
   1033 
   1034   bits<5> V1;
   1035   bits<5> V3;
   1036   bits<16> I2;
   1037   bits<4> M4;
   1038 
   1039   let Inst{47-40} = op{15-8};
   1040   let Inst{39-36} = V1{3-0};
   1041   let Inst{35-32} = V3{3-0};
   1042   let Inst{31-16} = I2;
   1043   let Inst{15-12} = M4;
   1044   let Inst{11}    = V1{4};
   1045   let Inst{10}    = V3{4};
   1046   let Inst{9-8}   = 0;
   1047   let Inst{7-0}   = op{7-0};
   1048 }
   1049 
   1050 class InstVRId<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1051   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1052   field bits<48> Inst;
   1053   field bits<48> SoftFail = 0;
   1054 
   1055   bits<5> V1;
   1056   bits<5> V2;
   1057   bits<5> V3;
   1058   bits<8> I4;
   1059   bits<4> M5;
   1060 
   1061   let Inst{47-40} = op{15-8};
   1062   let Inst{39-36} = V1{3-0};
   1063   let Inst{35-32} = V2{3-0};
   1064   let Inst{31-28} = V3{3-0};
   1065   let Inst{27-24} = 0;
   1066   let Inst{23-16} = I4;
   1067   let Inst{15-12} = M5;
   1068   let Inst{11}    = V1{4};
   1069   let Inst{10}    = V2{4};
   1070   let Inst{9}     = V3{4};
   1071   let Inst{8}     = 0;
   1072   let Inst{7-0}   = op{7-0};
   1073 }
   1074 
   1075 class InstVRIe<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1076   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1077   field bits<48> Inst;
   1078   field bits<48> SoftFail = 0;
   1079 
   1080   bits<5> V1;
   1081   bits<5> V2;
   1082   bits<12> I3;
   1083   bits<4> M4;
   1084   bits<4> M5;
   1085 
   1086   let Inst{47-40} = op{15-8};
   1087   let Inst{39-36} = V1{3-0};
   1088   let Inst{35-32} = V2{3-0};
   1089   let Inst{31-20} = I3;
   1090   let Inst{19-16} = M5;
   1091   let Inst{15-12} = M4;
   1092   let Inst{11}    = V1{4};
   1093   let Inst{10}    = V2{4};
   1094   let Inst{9-8}   = 0;
   1095   let Inst{7-0}   = op{7-0};
   1096 }
   1097 
   1098 class InstVRIf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1099   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1100   field bits<48> Inst;
   1101   field bits<48> SoftFail = 0;
   1102 
   1103   bits<5> V1;
   1104   bits<5> V2;
   1105   bits<5> V3;
   1106   bits<8> I4;
   1107   bits<4> M5;
   1108 
   1109   let Inst{47-40} = op{15-8};
   1110   let Inst{39-36} = V1{3-0};
   1111   let Inst{35-32} = V2{3-0};
   1112   let Inst{31-28} = V3{3-0};
   1113   let Inst{27-24} = 0;
   1114   let Inst{23-20} = M5;
   1115   let Inst{19-12} = I4;
   1116   let Inst{11}    = V1{4};
   1117   let Inst{10}    = V2{4};
   1118   let Inst{9}     = V3{4};
   1119   let Inst{8}     = 0;
   1120   let Inst{7-0}   = op{7-0};
   1121 }
   1122 
   1123 class InstVRIg<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1124   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1125   field bits<48> Inst;
   1126   field bits<48> SoftFail = 0;
   1127 
   1128   bits<5> V1;
   1129   bits<5> V2;
   1130   bits<8> I3;
   1131   bits<8> I4;
   1132   bits<4> M5;
   1133 
   1134   let Inst{47-40} = op{15-8};
   1135   let Inst{39-36} = V1{3-0};
   1136   let Inst{35-32} = V2{3-0};
   1137   let Inst{31-24} = I4;
   1138   let Inst{23-20} = M5;
   1139   let Inst{19-12} = I3;
   1140   let Inst{11}    = V1{4};
   1141   let Inst{10}    = V2{4};
   1142   let Inst{9-8}   = 0;
   1143   let Inst{7-0}   = op{7-0};
   1144 }
   1145 
   1146 class InstVRIh<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1147   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1148   field bits<48> Inst;
   1149   field bits<48> SoftFail = 0;
   1150 
   1151   bits<5> V1;
   1152   bits<16> I2;
   1153   bits<4> I3;
   1154 
   1155   let Inst{47-40} = op{15-8};
   1156   let Inst{39-36} = V1{3-0};
   1157   let Inst{35-32} = 0;
   1158   let Inst{31-16} = I2;
   1159   let Inst{15-12} = I3;
   1160   let Inst{11}    = V1{4};
   1161   let Inst{10-8}  = 0;
   1162   let Inst{7-0}   = op{7-0};
   1163 }
   1164 
   1165 class InstVRIi<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1166   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1167   field bits<48> Inst;
   1168   field bits<48> SoftFail = 0;
   1169 
   1170   bits<5> V1;
   1171   bits<4> R2;
   1172   bits<8> I3;
   1173   bits<4> M4;
   1174 
   1175   let Inst{47-40} = op{15-8};
   1176   let Inst{39-36} = V1{3-0};
   1177   let Inst{35-32} = R2;
   1178   let Inst{31-24} = 0;
   1179   let Inst{23-20} = M4;
   1180   let Inst{19-12} = I3;
   1181   let Inst{11}    = V1{4};
   1182   let Inst{10-8}  = 0;
   1183   let Inst{7-0}   = op{7-0};
   1184 }
   1185 
   1186 // Depending on the instruction mnemonic, certain bits may be or-ed into
   1187 // the M4 value provided as explicit operand.  These are passed as m4or.
   1188 class InstVRRa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern,
   1189                bits<4> m4or = 0>
   1190   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1191   field bits<48> Inst;
   1192   field bits<48> SoftFail = 0;
   1193 
   1194   bits<5> V1;
   1195   bits<5> V2;
   1196   bits<4> M3;
   1197   bits<4> M4;
   1198   bits<4> M5;
   1199 
   1200   let Inst{47-40} = op{15-8};
   1201   let Inst{39-36} = V1{3-0};
   1202   let Inst{35-32} = V2{3-0};
   1203   let Inst{31-24} = 0;
   1204   let Inst{23-20} = M5;
   1205   let Inst{19}    = !if (!eq (m4or{3}, 1), 1, M4{3});
   1206   let Inst{18}    = !if (!eq (m4or{2}, 1), 1, M4{2});
   1207   let Inst{17}    = !if (!eq (m4or{1}, 1), 1, M4{1});
   1208   let Inst{16}    = !if (!eq (m4or{0}, 1), 1, M4{0});
   1209   let Inst{15-12} = M3;
   1210   let Inst{11}    = V1{4};
   1211   let Inst{10}    = V2{4};
   1212   let Inst{9-8}   = 0;
   1213   let Inst{7-0}   = op{7-0};
   1214 }
   1215 
   1216 // Depending on the instruction mnemonic, certain bits may be or-ed into
   1217 // the M5 value provided as explicit operand.  These are passed as m5or.
   1218 class InstVRRb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern,
   1219                bits<4> m5or = 0>
   1220   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1221   field bits<48> Inst;
   1222   field bits<48> SoftFail = 0;
   1223 
   1224   bits<5> V1;
   1225   bits<5> V2;
   1226   bits<5> V3;
   1227   bits<4> M4;
   1228   bits<4> M5;
   1229 
   1230   let Inst{47-40} = op{15-8};
   1231   let Inst{39-36} = V1{3-0};
   1232   let Inst{35-32} = V2{3-0};
   1233   let Inst{31-28} = V3{3-0};
   1234   let Inst{27-24} = 0;
   1235   let Inst{23}    = !if (!eq (m5or{3}, 1), 1, M5{3});
   1236   let Inst{22}    = !if (!eq (m5or{2}, 1), 1, M5{2});
   1237   let Inst{21}    = !if (!eq (m5or{1}, 1), 1, M5{1});
   1238   let Inst{20}    = !if (!eq (m5or{0}, 1), 1, M5{0});
   1239   let Inst{19-16} = 0;
   1240   let Inst{15-12} = M4;
   1241   let Inst{11}    = V1{4};
   1242   let Inst{10}    = V2{4};
   1243   let Inst{9}     = V3{4};
   1244   let Inst{8}     = 0;
   1245   let Inst{7-0}   = op{7-0};
   1246 }
   1247 
   1248 class InstVRRc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1249   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1250   field bits<48> Inst;
   1251   field bits<48> SoftFail = 0;
   1252 
   1253   bits<5> V1;
   1254   bits<5> V2;
   1255   bits<5> V3;
   1256   bits<4> M4;
   1257   bits<4> M5;
   1258   bits<4> M6;
   1259 
   1260   let Inst{47-40} = op{15-8};
   1261   let Inst{39-36} = V1{3-0};
   1262   let Inst{35-32} = V2{3-0};
   1263   let Inst{31-28} = V3{3-0};
   1264   let Inst{27-24} = 0;
   1265   let Inst{23-20} = M6;
   1266   let Inst{19-16} = M5;
   1267   let Inst{15-12} = M4;
   1268   let Inst{11}    = V1{4};
   1269   let Inst{10}    = V2{4};
   1270   let Inst{9}     = V3{4};
   1271   let Inst{8}     = 0;
   1272   let Inst{7-0}   = op{7-0};
   1273 }
   1274 
   1275 // Depending on the instruction mnemonic, certain bits may be or-ed into
   1276 // the M6 value provided as explicit operand.  These are passed as m6or.
   1277 class InstVRRd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern,
   1278                bits<4> m6or = 0>
   1279   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1280   field bits<48> Inst;
   1281   field bits<48> SoftFail = 0;
   1282 
   1283   bits<5> V1;
   1284   bits<5> V2;
   1285   bits<5> V3;
   1286   bits<5> V4;
   1287   bits<4> M5;
   1288   bits<4> M6;
   1289 
   1290   let Inst{47-40} = op{15-8};
   1291   let Inst{39-36} = V1{3-0};
   1292   let Inst{35-32} = V2{3-0};
   1293   let Inst{31-28} = V3{3-0};
   1294   let Inst{27-24} = M5;
   1295   let Inst{23}    = !if (!eq (m6or{3}, 1), 1, M6{3});
   1296   let Inst{22}    = !if (!eq (m6or{2}, 1), 1, M6{2});
   1297   let Inst{21}    = !if (!eq (m6or{1}, 1), 1, M6{1});
   1298   let Inst{20}    = !if (!eq (m6or{0}, 1), 1, M6{0});
   1299   let Inst{19-16} = 0;
   1300   let Inst{15-12} = V4{3-0};
   1301   let Inst{11}    = V1{4};
   1302   let Inst{10}    = V2{4};
   1303   let Inst{9}     = V3{4};
   1304   let Inst{8}     = V4{4};
   1305   let Inst{7-0}   = op{7-0};
   1306 }
   1307 
   1308 class InstVRRe<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1309   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1310   field bits<48> Inst;
   1311   field bits<48> SoftFail = 0;
   1312 
   1313   bits<5> V1;
   1314   bits<5> V2;
   1315   bits<5> V3;
   1316   bits<5> V4;
   1317   bits<4> M5;
   1318   bits<4> M6;
   1319 
   1320   let Inst{47-40} = op{15-8};
   1321   let Inst{39-36} = V1{3-0};
   1322   let Inst{35-32} = V2{3-0};
   1323   let Inst{31-28} = V3{3-0};
   1324   let Inst{27-24} = M6;
   1325   let Inst{23-20} = 0;
   1326   let Inst{19-16} = M5;
   1327   let Inst{15-12} = V4{3-0};
   1328   let Inst{11}    = V1{4};
   1329   let Inst{10}    = V2{4};
   1330   let Inst{9}     = V3{4};
   1331   let Inst{8}     = V4{4};
   1332   let Inst{7-0}   = op{7-0};
   1333 }
   1334 
   1335 class InstVRRf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1336   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1337   field bits<48> Inst;
   1338   field bits<48> SoftFail = 0;
   1339 
   1340   bits<5> V1;
   1341   bits<4> R2;
   1342   bits<4> R3;
   1343 
   1344   let Inst{47-40} = op{15-8};
   1345   let Inst{39-36} = V1{3-0};
   1346   let Inst{35-32} = R2;
   1347   let Inst{31-28} = R3;
   1348   let Inst{27-12} = 0;
   1349   let Inst{11}    = V1{4};
   1350   let Inst{10-8}  = 0;
   1351   let Inst{7-0}   = op{7-0};
   1352 }
   1353 
   1354 class InstVRRg<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1355   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1356   field bits<48> Inst;
   1357   field bits<48> SoftFail = 0;
   1358 
   1359   bits<5> V1;
   1360 
   1361   let Inst{47-40} = op{15-8};
   1362   let Inst{39-36} = 0;
   1363   let Inst{35-32} = V1{3-0};
   1364   let Inst{31-12} = 0;
   1365   let Inst{11}    = 0;
   1366   let Inst{10}    = V1{4};
   1367   let Inst{9-8}   = 0;
   1368   let Inst{7-0}   = op{7-0};
   1369 }
   1370 
   1371 class InstVRRh<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1372   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1373   field bits<48> Inst;
   1374   field bits<48> SoftFail = 0;
   1375 
   1376   bits<5> V1;
   1377   bits<5> V2;
   1378   bits<4> M3;
   1379 
   1380   let Inst{47-40} = op{15-8};
   1381   let Inst{39-36} = 0;
   1382   let Inst{35-32} = V1{3-0};
   1383   let Inst{31-28} = V2{3-0};
   1384   let Inst{27-24} = 0;
   1385   let Inst{23-20} = M3;
   1386   let Inst{19-12} = 0;
   1387   let Inst{11}    = 0;
   1388   let Inst{10}    = V1{4};
   1389   let Inst{9}     = V2{4};
   1390   let Inst{8}     = 0;
   1391   let Inst{7-0}   = op{7-0};
   1392 }
   1393 
   1394 class InstVRRi<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1395   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1396   field bits<48> Inst;
   1397   field bits<48> SoftFail = 0;
   1398 
   1399   bits<4> R1;
   1400   bits<5> V2;
   1401   bits<4> M3;
   1402 
   1403   let Inst{47-40} = op{15-8};
   1404   let Inst{39-36} = R1;
   1405   let Inst{35-32} = V2{3-0};
   1406   let Inst{31-24} = 0;
   1407   let Inst{23-20} = M3;
   1408   let Inst{19-12} = 0;
   1409   let Inst{11}    = 0;
   1410   let Inst{10}    = V2{4};
   1411   let Inst{9-8}   = 0;
   1412   let Inst{7-0}   = op{7-0};
   1413 }
   1414 
   1415 class InstVRSa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1416   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1417   field bits<48> Inst;
   1418   field bits<48> SoftFail = 0;
   1419 
   1420   bits<5> V1;
   1421   bits<16> BD2;
   1422   bits<5> V3;
   1423   bits<4> M4;
   1424 
   1425   let Inst{47-40} = op{15-8};
   1426   let Inst{39-36} = V1{3-0};
   1427   let Inst{35-32} = V3{3-0};
   1428   let Inst{31-16} = BD2;
   1429   let Inst{15-12} = M4;
   1430   let Inst{11}    = V1{4};
   1431   let Inst{10}    = V3{4};
   1432   let Inst{9-8}   = 0;
   1433   let Inst{7-0}   = op{7-0};
   1434 }
   1435 
   1436 class InstVRSb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1437   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1438   field bits<48> Inst;
   1439   field bits<48> SoftFail = 0;
   1440 
   1441   bits<5> V1;
   1442   bits<16> BD2;
   1443   bits<4> R3;
   1444   bits<4> M4;
   1445 
   1446   let Inst{47-40} = op{15-8};
   1447   let Inst{39-36} = V1{3-0};
   1448   let Inst{35-32} = R3;
   1449   let Inst{31-16} = BD2;
   1450   let Inst{15-12} = M4;
   1451   let Inst{11}    = V1{4};
   1452   let Inst{10-8}  = 0;
   1453   let Inst{7-0}   = op{7-0};
   1454 }
   1455 
   1456 class InstVRSc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1457   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1458   field bits<48> Inst;
   1459   field bits<48> SoftFail = 0;
   1460 
   1461   bits<4> R1;
   1462   bits<16> BD2;
   1463   bits<5> V3;
   1464   bits<4> M4;
   1465 
   1466   let Inst{47-40} = op{15-8};
   1467   let Inst{39-36} = R1;
   1468   let Inst{35-32} = V3{3-0};
   1469   let Inst{31-16} = BD2;
   1470   let Inst{15-12} = M4;
   1471   let Inst{11}    = 0;
   1472   let Inst{10}    = V3{4};
   1473   let Inst{9-8}   = 0;
   1474   let Inst{7-0}   = op{7-0};
   1475 }
   1476 
   1477 class InstVRSd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1478   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1479   field bits<48> Inst;
   1480   field bits<48> SoftFail = 0;
   1481 
   1482   bits<5> V1;
   1483   bits<16> BD2;
   1484   bits<4> R3;
   1485 
   1486   let Inst{47-40} = op{15-8};
   1487   let Inst{39-36} = 0;
   1488   let Inst{35-32} = R3;
   1489   let Inst{31-16} = BD2;
   1490   let Inst{15-12} = V1{3-0};
   1491   let Inst{11-9}  = 0;
   1492   let Inst{8}     = V1{4};
   1493   let Inst{7-0}   = op{7-0};
   1494 }
   1495 
   1496 class InstVRV<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1497   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1498   field bits<48> Inst;
   1499   field bits<48> SoftFail = 0;
   1500 
   1501   bits<5> V1;
   1502   bits<21> VBD2;
   1503   bits<4> M3;
   1504 
   1505   let Inst{47-40} = op{15-8};
   1506   let Inst{39-36} = V1{3-0};
   1507   let Inst{35-16} = VBD2{19-0};
   1508   let Inst{15-12} = M3;
   1509   let Inst{11}    = V1{4};
   1510   let Inst{10}    = VBD2{20};
   1511   let Inst{9-8}   = 0;
   1512   let Inst{7-0}   = op{7-0};
   1513 }
   1514 
   1515 class InstVRX<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1516   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1517   field bits<48> Inst;
   1518   field bits<48> SoftFail = 0;
   1519 
   1520   bits<5> V1;
   1521   bits<20> XBD2;
   1522   bits<4> M3;
   1523 
   1524   let Inst{47-40} = op{15-8};
   1525   let Inst{39-36} = V1{3-0};
   1526   let Inst{35-16} = XBD2;
   1527   let Inst{15-12} = M3;
   1528   let Inst{11}    = V1{4};
   1529   let Inst{10-8}  = 0;
   1530   let Inst{7-0}   = op{7-0};
   1531 }
   1532 
   1533 class InstVSI<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
   1534   : InstSystemZ<6, outs, ins, asmstr, pattern> {
   1535   field bits<48> Inst;
   1536   field bits<48> SoftFail = 0;
   1537 
   1538   bits<5> V1;
   1539   bits<16> BD2;
   1540   bits<8> I3;
   1541 
   1542   let Inst{47-40} = op{15-8};
   1543   let Inst{39-32} = I3;
   1544   let Inst{31-16} = BD2;
   1545   let Inst{15-12} = V1{3-0};
   1546   let Inst{11-9}  = 0;
   1547   let Inst{8}     = V1{4};
   1548   let Inst{7-0}   = op{7-0};
   1549 }
   1550 
   1551 //===----------------------------------------------------------------------===//
   1552 // Instruction classes for .insn directives
   1553 //===----------------------------------------------------------------------===//
   1554 
   1555 class DirectiveInsnE<dag outs, dag ins, string asmstr, list<dag> pattern>
   1556   : InstE<0, outs, ins, asmstr, pattern> {
   1557   bits<16> enc;
   1558 
   1559   let Inst = enc;
   1560 }
   1561 
   1562 class DirectiveInsnRI<dag outs, dag ins, string asmstr, list<dag> pattern>
   1563   : InstRIa<0, outs, ins, asmstr, pattern> {
   1564   bits<32> enc;
   1565 
   1566   let Inst{31-24} = enc{31-24};
   1567   let Inst{19-16} = enc{19-16};
   1568 }
   1569 
   1570 class DirectiveInsnRIE<dag outs, dag ins, string asmstr, list<dag> pattern>
   1571   : InstRIEd<0, outs, ins, asmstr, pattern> {
   1572   bits<48> enc;
   1573 
   1574   let Inst{47-40} = enc{47-40};
   1575   let Inst{7-0}   = enc{7-0};
   1576 }
   1577 
   1578 class DirectiveInsnRIL<dag outs, dag ins, string asmstr, list<dag> pattern>
   1579   : InstRILa<0, outs, ins, asmstr, pattern> {
   1580   bits<48> enc;
   1581   string type;
   1582 
   1583   let Inst{47-40} = enc{47-40};
   1584   let Inst{35-32} = enc{35-32};
   1585 }
   1586 
   1587 class DirectiveInsnRIS<dag outs, dag ins, string asmstr, list<dag> pattern>
   1588   : InstRIS<0, outs, ins, asmstr, pattern> {
   1589   bits<48> enc;
   1590 
   1591   let Inst{47-40} = enc{47-40};
   1592   let Inst{7-0}   = enc{7-0};
   1593 }
   1594 
   1595 class DirectiveInsnRR<dag outs, dag ins, string asmstr, list<dag> pattern>
   1596   : InstRR<0, outs, ins, asmstr, pattern> {
   1597   bits<16> enc;
   1598 
   1599   let Inst{15-8} = enc{15-8};
   1600 }
   1601 
   1602 class DirectiveInsnRRE<dag outs, dag ins, string asmstr, list<dag> pattern>
   1603   : InstRRE<0, outs, ins, asmstr, pattern> {
   1604   bits<32> enc;
   1605 
   1606   let Inst{31-16} = enc{31-16};
   1607 }
   1608 
   1609 class DirectiveInsnRRF<dag outs, dag ins, string asmstr, list<dag> pattern>
   1610   : InstRRFa<0, outs, ins, asmstr, pattern> {
   1611   bits<32> enc;
   1612 
   1613   let Inst{31-16} = enc{31-16};
   1614 }
   1615 
   1616 class DirectiveInsnRRS<dag outs, dag ins, string asmstr, list<dag> pattern>
   1617   : InstRRS<0, outs, ins, asmstr, pattern> {
   1618   bits<48> enc;
   1619 
   1620   let Inst{47-40} = enc{47-40};
   1621   let Inst{7-0}   = enc{7-0};
   1622 }
   1623 
   1624 class DirectiveInsnRS<dag outs, dag ins, string asmstr, list<dag> pattern>
   1625   : InstRSa<0, outs, ins, asmstr, pattern> {
   1626   bits<32> enc;
   1627 
   1628   let Inst{31-24} = enc{31-24};
   1629 }
   1630 
   1631 // RSE is like RSY except with a 12 bit displacement (instead of 20).
   1632 class DirectiveInsnRSE<dag outs, dag ins, string asmstr, list<dag> pattern>
   1633   : InstRSYa<6, outs, ins, asmstr, pattern> {
   1634   bits <48> enc;
   1635 
   1636   let Inst{47-40} = enc{47-40};
   1637   let Inst{31-16} = BD2{15-0};
   1638   let Inst{15-8}  = 0;
   1639   let Inst{7-0}   = enc{7-0};
   1640 }
   1641 
   1642 class DirectiveInsnRSI<dag outs, dag ins, string asmstr, list<dag> pattern>
   1643   : InstRSI<0, outs, ins, asmstr, pattern> {
   1644   bits<32> enc;
   1645 
   1646   let Inst{31-24} = enc{31-24};
   1647 }
   1648 
   1649 class DirectiveInsnRSY<dag outs, dag ins, string asmstr, list<dag> pattern>
   1650   : InstRSYa<0, outs, ins, asmstr, pattern> {
   1651   bits<48> enc;
   1652 
   1653   let Inst{47-40} = enc{47-40};
   1654   let Inst{7-0}   = enc{7-0};
   1655 }
   1656 
   1657 class DirectiveInsnRX<dag outs, dag ins, string asmstr, list<dag> pattern>
   1658   : InstRXa<0, outs, ins, asmstr, pattern> {
   1659   bits<32> enc;
   1660 
   1661   let Inst{31-24} = enc{31-24};
   1662 }
   1663 
   1664 class DirectiveInsnRXE<dag outs, dag ins, string asmstr, list<dag> pattern>
   1665   : InstRXE<0, outs, ins, asmstr, pattern> {
   1666   bits<48> enc;
   1667 
   1668   let M3 = 0;
   1669 
   1670   let Inst{47-40} = enc{47-40};
   1671   let Inst{7-0}   = enc{7-0};
   1672 }
   1673 
   1674 class DirectiveInsnRXF<dag outs, dag ins, string asmstr, list<dag> pattern>
   1675   : InstRXF<0, outs, ins, asmstr, pattern> {
   1676   bits<48> enc;
   1677 
   1678   let Inst{47-40} = enc{47-40};
   1679   let Inst{7-0}   = enc{7-0};
   1680 }
   1681 
   1682 class DirectiveInsnRXY<dag outs, dag ins, string asmstr, list<dag> pattern>
   1683   : InstRXYa<0, outs, ins, asmstr, pattern> {
   1684   bits<48> enc;
   1685 
   1686   let Inst{47-40} = enc{47-40};
   1687   let Inst{7-0}   = enc{7-0};
   1688 }
   1689 
   1690 class DirectiveInsnS<dag outs, dag ins, string asmstr, list<dag> pattern>
   1691   : InstS<0, outs, ins, asmstr, pattern> {
   1692   bits<32> enc;
   1693 
   1694   let Inst{31-16} = enc{31-16};
   1695 }
   1696 
   1697 class DirectiveInsnSI<dag outs, dag ins, string asmstr, list<dag> pattern>
   1698   : InstSI<0, outs, ins, asmstr, pattern> {
   1699   bits<32> enc;
   1700 
   1701   let Inst{31-24} = enc{31-24};
   1702 }
   1703 
   1704 class DirectiveInsnSIY<dag outs, dag ins, string asmstr, list<dag> pattern>
   1705   : InstSIY<0, outs, ins, asmstr, pattern> {
   1706   bits<48> enc;
   1707 
   1708   let Inst{47-40} = enc{47-40};
   1709   let Inst{7-0}   = enc{7-0};
   1710 }
   1711 
   1712 class DirectiveInsnSIL<dag outs, dag ins, string asmstr, list<dag> pattern>
   1713   : InstSIL<0, outs, ins, asmstr, pattern> {
   1714   bits<48> enc;
   1715 
   1716   let Inst{47-32} = enc{47-32};
   1717 }
   1718 
   1719 class DirectiveInsnSS<dag outs, dag ins, string asmstr, list<dag> pattern>
   1720   : InstSSd<0, outs, ins, asmstr, pattern> {
   1721   bits<48> enc;
   1722 
   1723   let Inst{47-40} = enc{47-40};
   1724 }
   1725 
   1726 class DirectiveInsnSSE<dag outs, dag ins, string asmstr, list<dag> pattern>
   1727   : InstSSE<0, outs, ins, asmstr, pattern> {
   1728   bits<48> enc;
   1729 
   1730   let Inst{47-32} = enc{47-32};
   1731 }
   1732 
   1733 class DirectiveInsnSSF<dag outs, dag ins, string asmstr, list<dag> pattern>
   1734   : InstSSF<0, outs, ins, asmstr, pattern> {
   1735   bits<48> enc;
   1736 
   1737   let Inst{47-40} = enc{47-40};
   1738   let Inst{35-32} = enc{35-32};
   1739 }
   1740 
   1741 //===----------------------------------------------------------------------===//
   1742 // Variants of instructions with condition mask
   1743 //===----------------------------------------------------------------------===//
   1744 //
   1745 // For instructions using a condition mask (e.g. conditional branches,
   1746 // compare-and-branch instructions, or conditional move instructions),
   1747 // we generally need to create multiple instruction patterns:
   1748 //
   1749 // - One used for code generation, which encodes the condition mask as an
   1750 //   MI operand, but writes out an extended mnemonic for better readability.
   1751 // - One pattern for the base form of the instruction with an explicit
   1752 //   condition mask (encoded as a plain integer MI operand).
   1753 // - Specific patterns for each extended mnemonic, where the condition mask
   1754 //   is implied by the pattern name and not otherwise encoded at all.
   1755 //
   1756 // We need the latter primarily for the assembler and disassembler, since the
   1757 // assembler parser is not able to decode part of an instruction mnemonic
   1758 // into an operand.  Thus we provide separate patterns for each mnemonic.
   1759 //
   1760 // Note that in some cases there are two different mnemonics for the same
   1761 // condition mask.  In this case we cannot have both instructions available
   1762 // to the disassembler at the same time since the encodings are not distinct.
   1763 // Therefore the alternate forms are marked isAsmParserOnly.
   1764 //
   1765 // We don't make one of the two names an alias of the other because
   1766 // we need the custom parsing routines to select the correct register class.
   1767 //
   1768 // This section provides helpers for generating the specific forms.
   1769 //
   1770 //===----------------------------------------------------------------------===//
   1771 
   1772 // A class to describe a variant of an instruction with condition mask.
   1773 class CondVariant<bits<4> ccmaskin, string suffixin, bit alternatein> {
   1774   // The fixed condition mask to use.
   1775   bits<4> ccmask = ccmaskin;
   1776 
   1777   // The suffix to use for the extended assembler mnemonic.
   1778   string suffix = suffixin;
   1779 
   1780   // Whether this is an alternate that needs to be marked isAsmParserOnly.
   1781   bit alternate = alternatein;
   1782 }
   1783 
   1784 // Condition mask 15 means "always true", which is used to define
   1785 // unconditional branches as a variant of conditional branches.
   1786 def CondAlways : CondVariant<15, "", 0>;
   1787 
   1788 // Condition masks for general instructions that can set all 4 bits.
   1789 def CondVariantO   : CondVariant<1,  "o",   0>;
   1790 def CondVariantH   : CondVariant<2,  "h",   0>;
   1791 def CondVariantP   : CondVariant<2,  "p",   1>;
   1792 def CondVariantNLE : CondVariant<3,  "nle", 0>;
   1793 def CondVariantL   : CondVariant<4,  "l",   0>;
   1794 def CondVariantM   : CondVariant<4,  "m",   1>;
   1795 def CondVariantNHE : CondVariant<5,  "nhe", 0>;
   1796 def CondVariantLH  : CondVariant<6,  "lh",  0>;
   1797 def CondVariantNE  : CondVariant<7,  "ne",  0>;
   1798 def CondVariantNZ  : CondVariant<7,  "nz",  1>;
   1799 def CondVariantE   : CondVariant<8,  "e",   0>;
   1800 def CondVariantZ   : CondVariant<8,  "z",   1>;
   1801 def CondVariantNLH : CondVariant<9,  "nlh", 0>;
   1802 def CondVariantHE  : CondVariant<10, "he",  0>;
   1803 def CondVariantNL  : CondVariant<11, "nl",  0>;
   1804 def CondVariantNM  : CondVariant<11, "nm",  1>;
   1805 def CondVariantLE  : CondVariant<12, "le",  0>;
   1806 def CondVariantNH  : CondVariant<13, "nh",  0>;
   1807 def CondVariantNP  : CondVariant<13, "np",  1>;
   1808 def CondVariantNO  : CondVariant<14, "no",  0>;
   1809 
   1810 // A helper class to look up one of the above by name.
   1811 class CV<string name>
   1812   : CondVariant<!cast<CondVariant>("CondVariant"#name).ccmask,
   1813                 !cast<CondVariant>("CondVariant"#name).suffix,
   1814                 !cast<CondVariant>("CondVariant"#name).alternate>;
   1815 
   1816 // Condition masks for integer instructions (e.g. compare-and-branch).
   1817 // This is like the list above, except that condition 3 is not possible
   1818 // and that the low bit of the mask is therefore always 0.  This means
   1819 // that each condition has two names.  Conditions "o" and "no" are not used.
   1820 def IntCondVariantH   : CondVariant<2,  "h",   0>;
   1821 def IntCondVariantNLE : CondVariant<2,  "nle", 1>;
   1822 def IntCondVariantL   : CondVariant<4,  "l",   0>;
   1823 def IntCondVariantNHE : CondVariant<4,  "nhe", 1>;
   1824 def IntCondVariantLH  : CondVariant<6,  "lh",  0>;
   1825 def IntCondVariantNE  : CondVariant<6,  "ne",  1>;
   1826 def IntCondVariantE   : CondVariant<8,  "e",   0>;
   1827 def IntCondVariantNLH : CondVariant<8,  "nlh", 1>;
   1828 def IntCondVariantHE  : CondVariant<10, "he",  0>;
   1829 def IntCondVariantNL  : CondVariant<10, "nl",  1>;
   1830 def IntCondVariantLE  : CondVariant<12, "le",  0>;
   1831 def IntCondVariantNH  : CondVariant<12, "nh",  1>;
   1832 
   1833 // A helper class to look up one of the above by name.
   1834 class ICV<string name>
   1835   : CondVariant<!cast<CondVariant>("IntCondVariant"#name).ccmask,
   1836                 !cast<CondVariant>("IntCondVariant"#name).suffix,
   1837                 !cast<CondVariant>("IntCondVariant"#name).alternate>;
   1838 
   1839 //===----------------------------------------------------------------------===//
   1840 // Instruction definitions with semantics
   1841 //===----------------------------------------------------------------------===//
   1842 //
   1843 // These classes have the form [Cond]<Category><Format>, where <Format> is one
   1844 // of the formats defined above and where <Category> describes the inputs
   1845 // and outputs.  "Cond" is used if the instruction is conditional,
   1846 // in which case the 4-bit condition-code mask is added as a final operand.
   1847 // <Category> can be one of:
   1848 //
   1849 //   Inherent:
   1850 //     One register output operand and no input operands.
   1851 //
   1852 //   InherentDual:
   1853 //     Two register output operands and no input operands.
   1854 //
   1855 //   StoreInherent:
   1856 //     One address operand.  The instruction stores to the address.
   1857 //
   1858 //   SideEffectInherent:
   1859 //     No input or output operands, but causes some side effect.
   1860 //
   1861 //   Branch:
   1862 //     One branch target.  The instruction branches to the target.
   1863 //
   1864 //   Call:
   1865 //     One output operand and one branch target.  The instruction stores
   1866 //     the return address to the output operand and branches to the target.
   1867 //
   1868 //   CmpBranch:
   1869 //     Two input operands and one optional branch target.  The instruction
   1870 //     compares the two input operands and branches or traps on the result.
   1871 //
   1872 //   BranchUnary:
   1873 //     One register output operand, one register input operand and one branch
   1874 //     target.  The instructions stores a modified form of the source register
   1875 //     in the destination register and branches on the result.
   1876 //
   1877 //   BranchBinary:
   1878 //     One register output operand, two register input operands and one branch
   1879 //     target. The instructions stores a modified form of one of the source
   1880 //     registers in the destination register and branches on the result.
   1881 //
   1882 //   LoadMultiple:
   1883 //     One address input operand and two explicit output operands.
   1884 //     The instruction loads a range of registers from the address,
   1885 //     with the explicit operands giving the first and last register
   1886 //     to load.  Other loaded registers are added as implicit definitions.
   1887 //
   1888 //   StoreMultiple:
   1889 //     Two explicit input register operands and an address operand.
   1890 //     The instruction stores a range of registers to the address,
   1891 //     with the explicit operands giving the first and last register
   1892 //     to store.  Other stored registers are added as implicit uses.
   1893 //
   1894 //   StoreLength:
   1895 //     One value operand, one length operand and one address operand.
   1896 //     The instruction stores the value operand to the address but
   1897 //     doesn't write more than the number of bytes specified by the
   1898 //     length operand.
   1899 //
   1900 //   LoadAddress:
   1901 //     One register output operand and one address operand.
   1902 //
   1903 //   SideEffectAddress:
   1904 //     One address operand.  No output operands, but causes some side effect.
   1905 //
   1906 //   Unary:
   1907 //     One register output operand and one input operand.
   1908 //
   1909 //   Store:
   1910 //     One address operand and one other input operand.  The instruction
   1911 //     stores to the address.
   1912 //
   1913 //   SideEffectUnary:
   1914 //     One input operand.  No output operands, but causes some side effect.
   1915 //
   1916 //   Binary:
   1917 //     One register output operand and two input operands.
   1918 //
   1919 //   StoreBinary:
   1920 //     One address operand and two other input operands.  The instruction
   1921 //     stores to the address.
   1922 //
   1923 //   SideEffectBinary:
   1924 //     Two input operands.  No output operands, but causes some side effect.
   1925 //
   1926 //   Compare:
   1927 //     Two input operands and an implicit CC output operand.
   1928 //
   1929 //   Test:
   1930 //     One or two input operands and an implicit CC output operand.  If
   1931 //     present, the second input operand is an "address" operand used as
   1932 //     a test class mask.
   1933 //
   1934 //   Ternary:
   1935 //     One register output operand and three input operands.
   1936 //
   1937 //   SideEffectTernary:
   1938 //     Three input operands.  No output operands, but causes some side effect.
   1939 //
   1940 //   Quaternary:
   1941 //     One register output operand and four input operands.
   1942 //
   1943 //   LoadAndOp:
   1944 //     One output operand and two input operands, one of which is an address.
   1945 //     The instruction both reads from and writes to the address.
   1946 //
   1947 //   CmpSwap:
   1948 //     One output operand and three input operands, one of which is an address.
   1949 //     The instruction both reads from and writes to the address.
   1950 //
   1951 //   RotateSelect:
   1952 //     One output operand and five input operands.  The first two operands
   1953 //     are registers and the other three are immediates.
   1954 //
   1955 //   Prefetch:
   1956 //     One 4-bit immediate operand and one address operand.  The immediate
   1957 //     operand is 1 for a load prefetch and 2 for a store prefetch.
   1958 //
   1959 //   BranchPreload:
   1960 //     One 4-bit immediate operand and two address operands.
   1961 //
   1962 // The format determines which input operands are tied to output operands,
   1963 // and also determines the shape of any address operand.
   1964 //
   1965 // Multiclasses of the form <Category><Format>Pair define two instructions,
   1966 // one with <Category><Format> and one with <Category><Format>Y.  The name
   1967 // of the first instruction has no suffix, the name of the second has
   1968 // an extra "y".
   1969 //
   1970 //===----------------------------------------------------------------------===//
   1971 
   1972 class InherentRRE<string mnemonic, bits<16> opcode, RegisterOperand cls,
   1973                   SDPatternOperator operator>
   1974   : InstRRE<opcode, (outs cls:$R1), (ins),
   1975             mnemonic#"\t$R1",
   1976             [(set cls:$R1, (operator))]> {
   1977   let R2 = 0;
   1978 }
   1979 
   1980 class InherentDualRRE<string mnemonic, bits<16> opcode, RegisterOperand cls>
   1981   : InstRRE<opcode, (outs cls:$R1, cls:$R2), (ins),
   1982             mnemonic#"\t$R1, $R2", []>;
   1983 
   1984 class InherentVRIa<string mnemonic, bits<16> opcode, bits<16> value>
   1985   : InstVRIa<opcode, (outs VR128:$V1), (ins), mnemonic#"\t$V1", []> {
   1986   let I2 = value;
   1987   let M3 = 0;
   1988 }
   1989 
   1990 class StoreInherentS<string mnemonic, bits<16> opcode,
   1991                      SDPatternOperator operator, bits<5> bytes>
   1992   : InstS<opcode, (outs), (ins bdaddr12only:$BD2),
   1993           mnemonic#"\t$BD2", [(operator bdaddr12only:$BD2)]> {
   1994   let mayStore = 1;
   1995   let AccessBytes = bytes;
   1996 }
   1997 
   1998 class SideEffectInherentE<string mnemonic, bits<16>opcode>
   1999   : InstE<opcode, (outs), (ins), mnemonic, []>;
   2000 
   2001 class SideEffectInherentS<string mnemonic, bits<16> opcode,
   2002                           SDPatternOperator operator>
   2003   : InstS<opcode, (outs), (ins), mnemonic, [(operator)]> {
   2004   let BD2 = 0;
   2005 }
   2006 
   2007 class SideEffectInherentRRE<string mnemonic, bits<16> opcode>
   2008   : InstRRE<opcode, (outs), (ins), mnemonic, []> {
   2009   let R1 = 0;
   2010   let R2 = 0;
   2011 }
   2012 
   2013 // Allow an optional TLS marker symbol to generate TLS call relocations.
   2014 class CallRI<string mnemonic, bits<12> opcode>
   2015   : InstRIb<opcode, (outs), (ins GR64:$R1, brtarget16tls:$RI2),
   2016             mnemonic#"\t$R1, $RI2", []>;
   2017 
   2018 // Allow an optional TLS marker symbol to generate TLS call relocations.
   2019 class CallRIL<string mnemonic, bits<12> opcode>
   2020   : InstRILb<opcode, (outs), (ins GR64:$R1, brtarget32tls:$RI2),
   2021              mnemonic#"\t$R1, $RI2", []>;
   2022 
   2023 class CallRR<string mnemonic, bits<8> opcode>
   2024   : InstRR<opcode, (outs), (ins GR64:$R1, ADDR64:$R2),
   2025            mnemonic#"\t$R1, $R2", []>;
   2026 
   2027 class CallRX<string mnemonic, bits<8> opcode>
   2028   : InstRXa<opcode, (outs), (ins GR64:$R1, bdxaddr12only:$XBD2),
   2029             mnemonic#"\t$R1, $XBD2", []>;
   2030 
   2031 class CondBranchRI<string mnemonic, bits<12> opcode,
   2032                    SDPatternOperator operator = null_frag>
   2033   : InstRIc<opcode, (outs), (ins cond4:$valid, cond4:$M1, brtarget16:$RI2),
   2034             !subst("#", "${M1}", mnemonic)#"\t$RI2",
   2035             [(operator cond4:$valid, cond4:$M1, bb:$RI2)]> {
   2036   let CCMaskFirst = 1;
   2037 }
   2038 
   2039 class AsmCondBranchRI<string mnemonic, bits<12> opcode>
   2040   : InstRIc<opcode, (outs), (ins imm32zx4:$M1, brtarget16:$RI2),
   2041             mnemonic#"\t$M1, $RI2", []>;
   2042 
   2043 class FixedCondBranchRI<CondVariant V, string mnemonic, bits<12> opcode,
   2044                         SDPatternOperator operator = null_frag>
   2045   : InstRIc<opcode, (outs), (ins brtarget16:$RI2),
   2046             !subst("#", V.suffix, mnemonic)#"\t$RI2", [(operator bb:$RI2)]> {
   2047   let isAsmParserOnly = V.alternate;
   2048   let M1 = V.ccmask;
   2049 }
   2050 
   2051 class CondBranchRIL<string mnemonic, bits<12> opcode>
   2052   : InstRILc<opcode, (outs), (ins cond4:$valid, cond4:$M1, brtarget32:$RI2),
   2053              !subst("#", "${M1}", mnemonic)#"\t$RI2", []> {
   2054   let CCMaskFirst = 1;
   2055 }
   2056 
   2057 class AsmCondBranchRIL<string mnemonic, bits<12> opcode>
   2058   : InstRILc<opcode, (outs), (ins imm32zx4:$M1, brtarget32:$RI2),
   2059              mnemonic#"\t$M1, $RI2", []>;
   2060 
   2061 class FixedCondBranchRIL<CondVariant V, string mnemonic, bits<12> opcode>
   2062   : InstRILc<opcode, (outs), (ins brtarget32:$RI2),
   2063              !subst("#", V.suffix, mnemonic)#"\t$RI2", []> {
   2064   let isAsmParserOnly = V.alternate;
   2065   let M1 = V.ccmask;
   2066 }
   2067 
   2068 class CondBranchRR<string mnemonic, bits<8> opcode>
   2069   : InstRR<opcode, (outs), (ins cond4:$valid, cond4:$R1, GR64:$R2),
   2070            !subst("#", "${R1}", mnemonic)#"\t$R2", []> {
   2071   let CCMaskFirst = 1;
   2072 }
   2073 
   2074 class AsmCondBranchRR<string mnemonic, bits<8> opcode>
   2075   : InstRR<opcode, (outs), (ins imm32zx4:$R1, GR64:$R2),
   2076            mnemonic#"\t$R1, $R2", []>;
   2077 
   2078 class FixedCondBranchRR<CondVariant V, string mnemonic, bits<8> opcode,
   2079                       SDPatternOperator operator = null_frag>
   2080   : InstRR<opcode, (outs), (ins ADDR64:$R2),
   2081            !subst("#", V.suffix, mnemonic)#"\t$R2", [(operator ADDR64:$R2)]> {
   2082   let isAsmParserOnly = V.alternate;
   2083   let R1 = V.ccmask;
   2084 }
   2085 
   2086 class CondBranchRX<string mnemonic, bits<8> opcode>
   2087   : InstRXb<opcode, (outs), (ins cond4:$valid, cond4:$M1, bdxaddr12only:$XBD2),
   2088             !subst("#", "${M1}", mnemonic)#"\t$XBD2", []> {
   2089   let CCMaskFirst = 1;
   2090 }
   2091 
   2092 class AsmCondBranchRX<string mnemonic, bits<8> opcode>
   2093   : InstRXb<opcode, (outs), (ins imm32zx4:$M1, bdxaddr12only:$XBD2),
   2094             mnemonic#"\t$M1, $XBD2", []>;
   2095 
   2096 class FixedCondBranchRX<CondVariant V, string mnemonic, bits<8> opcode>
   2097   : InstRXb<opcode, (outs), (ins bdxaddr12only:$XBD2),
   2098             !subst("#", V.suffix, mnemonic)#"\t$XBD2", []> {
   2099   let isAsmParserOnly = V.alternate;
   2100   let M1 = V.ccmask;
   2101 }
   2102 
   2103 class CondBranchRXY<string mnemonic, bits<16> opcode>
   2104   : InstRXYb<opcode, (outs), (ins cond4:$valid, cond4:$M1, bdxaddr20only:$XBD2),
   2105              !subst("#", "${M1}", mnemonic)#"\t$XBD2", []> {
   2106   let CCMaskFirst = 1;
   2107   let mayLoad = 1;
   2108 }
   2109 
   2110 class AsmCondBranchRXY<string mnemonic, bits<16> opcode>
   2111   : InstRXYb<opcode, (outs), (ins imm32zx4:$M1, bdxaddr20only:$XBD2),
   2112              mnemonic#"\t$M1, $XBD2", []> {
   2113   let mayLoad = 1;
   2114 }
   2115 
   2116 class FixedCondBranchRXY<CondVariant V, string mnemonic, bits<16> opcode,
   2117                          SDPatternOperator operator = null_frag>
   2118   : InstRXYb<opcode, (outs), (ins bdxaddr20only:$XBD2),
   2119              !subst("#", V.suffix, mnemonic)#"\t$XBD2",
   2120              [(operator (load bdxaddr20only:$XBD2))]> {
   2121   let isAsmParserOnly = V.alternate;
   2122   let M1 = V.ccmask;
   2123   let mayLoad = 1;
   2124 }
   2125 
   2126 class CmpBranchRIEa<string mnemonic, bits<16> opcode,
   2127                     RegisterOperand cls, Immediate imm>
   2128   : InstRIEa<opcode, (outs), (ins cls:$R1, imm:$I2, cond4:$M3),
   2129              mnemonic#"$M3\t$R1, $I2", []>;
   2130 
   2131 class AsmCmpBranchRIEa<string mnemonic, bits<16> opcode,
   2132                        RegisterOperand cls, Immediate imm>
   2133   : InstRIEa<opcode, (outs), (ins cls:$R1, imm:$I2, imm32zx4:$M3),
   2134              mnemonic#"\t$R1, $I2, $M3", []>;
   2135 
   2136 class FixedCmpBranchRIEa<CondVariant V, string mnemonic, bits<16> opcode,
   2137                           RegisterOperand cls, Immediate imm>
   2138   : InstRIEa<opcode, (outs), (ins cls:$R1, imm:$I2),
   2139              mnemonic#V.suffix#"\t$R1, $I2", []> {
   2140   let isAsmParserOnly = V.alternate;
   2141   let M3 = V.ccmask;
   2142 }
   2143 
   2144 multiclass CmpBranchRIEaPair<string mnemonic, bits<16> opcode,
   2145                              RegisterOperand cls, Immediate imm> {
   2146   let isCodeGenOnly = 1 in
   2147     def "" : CmpBranchRIEa<mnemonic, opcode, cls, imm>;
   2148   def Asm : AsmCmpBranchRIEa<mnemonic, opcode, cls, imm>;
   2149 }
   2150 
   2151 class CmpBranchRIEb<string mnemonic, bits<16> opcode,
   2152                     RegisterOperand cls>
   2153   : InstRIEb<opcode, (outs),
   2154              (ins cls:$R1, cls:$R2, cond4:$M3, brtarget16:$RI4),
   2155              mnemonic#"$M3\t$R1, $R2, $RI4", []>;
   2156 
   2157 class AsmCmpBranchRIEb<string mnemonic, bits<16> opcode,
   2158                        RegisterOperand cls>
   2159   : InstRIEb<opcode, (outs),
   2160              (ins cls:$R1, cls:$R2, imm32zx4:$M3, brtarget16:$RI4),
   2161              mnemonic#"\t$R1, $R2, $M3, $RI4", []>;
   2162 
   2163 class FixedCmpBranchRIEb<CondVariant V, string mnemonic, bits<16> opcode,
   2164                          RegisterOperand cls>
   2165   : InstRIEb<opcode, (outs), (ins cls:$R1, cls:$R2, brtarget16:$RI4),
   2166              mnemonic#V.suffix#"\t$R1, $R2, $RI4", []> {
   2167   let isAsmParserOnly = V.alternate;
   2168   let M3 = V.ccmask;
   2169 }
   2170 
   2171 multiclass CmpBranchRIEbPair<string mnemonic, bits<16> opcode,
   2172                              RegisterOperand cls> {
   2173   let isCodeGenOnly = 1 in
   2174     def "" : CmpBranchRIEb<mnemonic, opcode, cls>;
   2175   def Asm : AsmCmpBranchRIEb<mnemonic, opcode, cls>;
   2176 }
   2177 
   2178 class CmpBranchRIEc<string mnemonic, bits<16> opcode,
   2179                     RegisterOperand cls, Immediate imm>
   2180   : InstRIEc<opcode, (outs),
   2181              (ins cls:$R1, imm:$I2, cond4:$M3, brtarget16:$RI4),
   2182              mnemonic#"$M3\t$R1, $I2, $RI4", []>;
   2183 
   2184 class AsmCmpBranchRIEc<string mnemonic, bits<16> opcode,
   2185                        RegisterOperand cls, Immediate imm>
   2186   : InstRIEc<opcode, (outs),
   2187              (ins cls:$R1, imm:$I2, imm32zx4:$M3, brtarget16:$RI4),
   2188              mnemonic#"\t$R1, $I2, $M3, $RI4", []>;
   2189 
   2190 class FixedCmpBranchRIEc<CondVariant V, string mnemonic, bits<16> opcode,
   2191                          RegisterOperand cls, Immediate imm>
   2192   : InstRIEc<opcode, (outs), (ins cls:$R1, imm:$I2, brtarget16:$RI4),
   2193              mnemonic#V.suffix#"\t$R1, $I2, $RI4", []> {
   2194   let isAsmParserOnly = V.alternate;
   2195   let M3 = V.ccmask;
   2196 }
   2197 
   2198 multiclass CmpBranchRIEcPair<string mnemonic, bits<16> opcode,
   2199                             RegisterOperand cls, Immediate imm> {
   2200   let isCodeGenOnly = 1 in
   2201     def "" : CmpBranchRIEc<mnemonic, opcode, cls, imm>;
   2202   def Asm : AsmCmpBranchRIEc<mnemonic, opcode, cls, imm>;
   2203 }
   2204 
   2205 class CmpBranchRRFc<string mnemonic, bits<16> opcode,
   2206                     RegisterOperand cls>
   2207   : InstRRFc<opcode, (outs), (ins cls:$R1, cls:$R2, cond4:$M3),
   2208              mnemonic#"$M3\t$R1, $R2", []>;
   2209 
   2210 class AsmCmpBranchRRFc<string mnemonic, bits<16> opcode,
   2211                        RegisterOperand cls>
   2212   : InstRRFc<opcode, (outs), (ins cls:$R1, cls:$R2, imm32zx4:$M3),
   2213              mnemonic#"\t$R1, $R2, $M3", []>;
   2214 
   2215 multiclass CmpBranchRRFcPair<string mnemonic, bits<16> opcode,
   2216                              RegisterOperand cls> {
   2217   let isCodeGenOnly = 1 in
   2218     def "" : CmpBranchRRFc<mnemonic, opcode, cls>;
   2219   def Asm : AsmCmpBranchRRFc<mnemonic, opcode, cls>;
   2220 }
   2221 
   2222 class FixedCmpBranchRRFc<CondVariant V, string mnemonic, bits<16> opcode,
   2223                           RegisterOperand cls>
   2224   : InstRRFc<opcode, (outs), (ins cls:$R1, cls:$R2),
   2225              mnemonic#V.suffix#"\t$R1, $R2", []> {
   2226   let isAsmParserOnly = V.alternate;
   2227   let M3 = V.ccmask;
   2228 }
   2229 
   2230 class CmpBranchRRS<string mnemonic, bits<16> opcode,
   2231                    RegisterOperand cls>
   2232   : InstRRS<opcode, (outs),
   2233             (ins cls:$R1, cls:$R2, cond4:$M3, bdaddr12only:$BD4),
   2234             mnemonic#"$M3\t$R1, $R2, $BD4", []>;
   2235 
   2236 class AsmCmpBranchRRS<string mnemonic, bits<16> opcode,
   2237                       RegisterOperand cls>
   2238   : InstRRS<opcode, (outs),
   2239             (ins cls:$R1, cls:$R2, imm32zx4:$M3, bdaddr12only:$BD4),
   2240             mnemonic#"\t$R1, $R2, $M3, $BD4", []>;
   2241 
   2242 class FixedCmpBranchRRS<CondVariant V, string mnemonic, bits<16> opcode,
   2243                         RegisterOperand cls>
   2244   : InstRRS<opcode, (outs), (ins cls:$R1, cls:$R2, bdaddr12only:$BD4),
   2245             mnemonic#V.suffix#"\t$R1, $R2, $BD4", []> {
   2246   let isAsmParserOnly = V.alternate;
   2247   let M3 = V.ccmask;
   2248 }
   2249 
   2250 multiclass CmpBranchRRSPair<string mnemonic, bits<16> opcode,
   2251                             RegisterOperand cls> {
   2252   let isCodeGenOnly = 1 in
   2253     def "" : CmpBranchRRS<mnemonic, opcode, cls>;
   2254   def Asm : AsmCmpBranchRRS<mnemonic, opcode, cls>;
   2255 }
   2256 
   2257 class CmpBranchRIS<string mnemonic, bits<16> opcode,
   2258                    RegisterOperand cls, Immediate imm>
   2259   : InstRIS<opcode, (outs),
   2260             (ins cls:$R1, imm:$I2, cond4:$M3, bdaddr12only:$BD4),
   2261             mnemonic#"$M3\t$R1, $I2, $BD4", []>;
   2262 
   2263 class AsmCmpBranchRIS<string mnemonic, bits<16> opcode,
   2264                       RegisterOperand cls, Immediate imm>
   2265   : InstRIS<opcode, (outs),
   2266             (ins cls:$R1, imm:$I2, imm32zx4:$M3, bdaddr12only:$BD4),
   2267             mnemonic#"\t$R1, $I2, $M3, $BD4", []>;
   2268 
   2269 class FixedCmpBranchRIS<CondVariant V, string mnemonic, bits<16> opcode,
   2270                         RegisterOperand cls, Immediate imm>
   2271   : InstRIS<opcode, (outs), (ins cls:$R1, imm:$I2, bdaddr12only:$BD4),
   2272             mnemonic#V.suffix#"\t$R1, $I2, $BD4", []> {
   2273   let isAsmParserOnly = V.alternate;
   2274   let M3 = V.ccmask;
   2275 }
   2276 
   2277 multiclass CmpBranchRISPair<string mnemonic, bits<16> opcode,
   2278                             RegisterOperand cls, Immediate imm> {
   2279   let isCodeGenOnly = 1 in
   2280     def "" : CmpBranchRIS<mnemonic, opcode, cls, imm>;
   2281   def Asm : AsmCmpBranchRIS<mnemonic, opcode, cls, imm>;
   2282 }
   2283 
   2284 class CmpBranchRSYb<string mnemonic, bits<16> opcode,
   2285                     RegisterOperand cls>
   2286   : InstRSYb<opcode, (outs), (ins cls:$R1, bdaddr20only:$BD2, cond4:$M3),
   2287              mnemonic#"$M3\t$R1, $BD2", []>;
   2288 
   2289 class AsmCmpBranchRSYb<string mnemonic, bits<16> opcode,
   2290                        RegisterOperand cls>
   2291   : InstRSYb<opcode, (outs), (ins cls:$R1, bdaddr20only:$BD2, imm32zx4:$M3),
   2292              mnemonic#"\t$R1, $M3, $BD2", []>;
   2293 
   2294 multiclass CmpBranchRSYbPair<string mnemonic, bits<16> opcode,
   2295                              RegisterOperand cls> {
   2296   let isCodeGenOnly = 1 in
   2297     def "" : CmpBranchRSYb<mnemonic, opcode, cls>;
   2298   def Asm : AsmCmpBranchRSYb<mnemonic, opcode, cls>;
   2299 }
   2300 
   2301 class FixedCmpBranchRSYb<CondVariant V, string mnemonic, bits<16> opcode,
   2302                           RegisterOperand cls>
   2303   : InstRSYb<opcode, (outs), (ins cls:$R1, bdaddr20only:$BD2),
   2304              mnemonic#V.suffix#"\t$R1, $BD2", []> {
   2305   let isAsmParserOnly = V.alternate;
   2306   let M3 = V.ccmask;
   2307 }
   2308 
   2309 class BranchUnaryRI<string mnemonic, bits<12> opcode, RegisterOperand cls>
   2310   : InstRIb<opcode, (outs cls:$R1), (ins cls:$R1src, brtarget16:$RI2),
   2311             mnemonic##"\t$R1, $RI2", []> {
   2312   let Constraints = "$R1 = $R1src";
   2313   let DisableEncoding = "$R1src";
   2314 }
   2315 
   2316 class BranchUnaryRIL<string mnemonic, bits<12> opcode, RegisterOperand cls>
   2317   : InstRILb<opcode, (outs cls:$R1), (ins cls:$R1src, brtarget32:$RI2),
   2318              mnemonic##"\t$R1, $RI2", []> {
   2319   let Constraints = "$R1 = $R1src";
   2320   let DisableEncoding = "$R1src";
   2321 }
   2322 
   2323 class BranchUnaryRR<string mnemonic, bits<8> opcode, RegisterOperand cls>
   2324   : InstRR<opcode, (outs cls:$R1), (ins cls:$R1src, GR64:$R2),
   2325            mnemonic##"\t$R1, $R2", []> {
   2326   let Constraints = "$R1 = $R1src";
   2327   let DisableEncoding = "$R1src";
   2328 }
   2329 
   2330 class BranchUnaryRRE<string mnemonic, bits<16> opcode, RegisterOperand cls>
   2331   : InstRRE<opcode, (outs cls:$R1), (ins cls:$R1src, GR64:$R2),
   2332             mnemonic##"\t$R1, $R2", []> {
   2333   let Constraints = "$R1 = $R1src";
   2334   let DisableEncoding = "$R1src";
   2335 }
   2336 
   2337 class BranchUnaryRX<string mnemonic, bits<8> opcode, RegisterOperand cls>
   2338   : InstRXa<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr12only:$XBD2),
   2339             mnemonic##"\t$R1, $XBD2", []> {
   2340   let Constraints = "$R1 = $R1src";
   2341   let DisableEncoding = "$R1src";
   2342 }
   2343 
   2344 class BranchUnaryRXY<string mnemonic, bits<16> opcode, RegisterOperand cls>
   2345   : InstRXYa<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr20only:$XBD2),
   2346              mnemonic##"\t$R1, $XBD2", []> {
   2347   let Constraints = "$R1 = $R1src";
   2348   let DisableEncoding = "$R1src";
   2349 }
   2350 
   2351 class BranchBinaryRSI<string mnemonic, bits<8> opcode, RegisterOperand cls>
   2352   : InstRSI<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, brtarget16:$RI2),
   2353             mnemonic##"\t$R1, $R3, $RI2", []> {
   2354   let Constraints = "$R1 = $R1src";
   2355   let DisableEncoding = "$R1src";
   2356 }
   2357 
   2358 class BranchBinaryRIEe<string mnemonic, bits<16> opcode, RegisterOperand cls>
   2359   : InstRIEe<opcode, (outs cls:$R1),
   2360              (ins cls:$R1src, cls:$R3, brtarget16:$RI2),
   2361              mnemonic##"\t$R1, $R3, $RI2", []> {
   2362   let Constraints = "$R1 = $R1src";
   2363   let DisableEncoding = "$R1src";
   2364 }
   2365 
   2366 class BranchBinaryRS<string mnemonic, bits<8> opcode, RegisterOperand cls>
   2367   : InstRSa<opcode, (outs cls:$R1),
   2368             (ins cls:$R1src, cls:$R3, bdaddr12only:$BD2),
   2369             mnemonic##"\t$R1, $R3, $BD2", []> {
   2370   let Constraints = "$R1 = $R1src";
   2371   let DisableEncoding = "$R1src";
   2372 }
   2373 
   2374 class BranchBinaryRSY<string mnemonic, bits<16> opcode, RegisterOperand cls>
   2375   : InstRSYa<opcode,
   2376              (outs cls:$R1), (ins cls:$R1src, cls:$R3, bdaddr20only:$BD2),
   2377              mnemonic##"\t$R1, $R3, $BD2", []> {
   2378   let Constraints = "$R1 = $R1src";
   2379   let DisableEncoding = "$R1src";
   2380 }
   2381 
   2382 class LoadMultipleRS<string mnemonic, bits<8> opcode, RegisterOperand cls,
   2383                      AddressingMode mode = bdaddr12only>
   2384   : InstRSa<opcode, (outs cls:$R1, cls:$R3), (ins mode:$BD2),
   2385             mnemonic#"\t$R1, $R3, $BD2", []> {
   2386   let mayLoad = 1;
   2387 }
   2388 
   2389 class LoadMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls,
   2390                       AddressingMode mode = bdaddr20only>
   2391   : InstRSYa<opcode, (outs cls:$R1, cls:$R3), (ins mode:$BD2),
   2392              mnemonic#"\t$R1, $R3, $BD2", []> {
   2393   let mayLoad = 1;
   2394 }
   2395 
   2396 multiclass LoadMultipleRSPair<string mnemonic, bits<8> rsOpcode,
   2397                               bits<16> rsyOpcode, RegisterOperand cls> {
   2398   let DispKey = mnemonic ## #cls in {
   2399     let DispSize = "12" in
   2400       def "" : LoadMultipleRS<mnemonic, rsOpcode, cls, bdaddr12pair>;
   2401     let DispSize = "20" in
   2402       def Y  : LoadMultipleRSY<mnemonic#"y", rsyOpcode, cls, bdaddr20pair>;
   2403   }
   2404 }
   2405 
   2406 class LoadMultipleSSe<string mnemonic, bits<8> opcode, RegisterOperand cls>
   2407   : InstSSe<opcode, (outs cls:$R1, cls:$R3),
   2408             (ins bdaddr12only:$BD2, bdaddr12only:$BD4),
   2409             mnemonic#"\t$R1, $R3, $BD2, $BD4", []> {
   2410   let mayLoad = 1;
   2411 }
   2412 
   2413 class LoadMultipleVRSa<string mnemonic, bits<16> opcode>
   2414   : InstVRSa<opcode, (outs VR128:$V1, VR128:$V3), (ins bdaddr12only:$BD2),
   2415              mnemonic#"\t$V1, $V3, $BD2", []> {
   2416   let M4 = 0;
   2417   let mayLoad = 1;
   2418 }
   2419 
   2420 class StoreRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   2421                  RegisterOperand cls>
   2422   : InstRILb<opcode, (outs), (ins cls:$R1, pcrel32:$RI2),
   2423              mnemonic#"\t$R1, $RI2",
   2424              [(operator cls:$R1, pcrel32:$RI2)]> {
   2425   let mayStore = 1;
   2426   // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
   2427   // However, BDXs have two extra operands and are therefore 6 units more
   2428   // complex.
   2429   let AddedComplexity = 7;
   2430 }
   2431 
   2432 class StoreRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   2433               RegisterOperand cls, bits<5> bytes,
   2434               AddressingMode mode = bdxaddr12only>
   2435   : InstRXa<opcode, (outs), (ins cls:$R1, mode:$XBD2),
   2436             mnemonic#"\t$R1, $XBD2",
   2437             [(operator cls:$R1, mode:$XBD2)]> {
   2438   let OpKey = mnemonic#"r"#cls;
   2439   let OpType = "mem";
   2440   let mayStore = 1;
   2441   let AccessBytes = bytes;
   2442 }
   2443 
   2444 class StoreRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   2445                RegisterOperand cls, bits<5> bytes,
   2446                AddressingMode mode = bdxaddr20only>
   2447   : InstRXYa<opcode, (outs), (ins cls:$R1, mode:$XBD2),
   2448              mnemonic#"\t$R1, $XBD2",
   2449              [(operator cls:$R1, mode:$XBD2)]> {
   2450   let OpKey = mnemonic#"r"#cls;
   2451   let OpType = "mem";
   2452   let mayStore = 1;
   2453   let AccessBytes = bytes;
   2454 }
   2455 
   2456 multiclass StoreRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
   2457                        SDPatternOperator operator, RegisterOperand cls,
   2458                        bits<5> bytes> {
   2459   let DispKey = mnemonic ## #cls in {
   2460     let DispSize = "12" in
   2461       def "" : StoreRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
   2462     let DispSize = "20" in
   2463       def Y  : StoreRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
   2464                         bdxaddr20pair>;
   2465   }
   2466 }
   2467 
   2468 class StoreVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   2469                TypedReg tr, bits<5> bytes, bits<4> type = 0>
   2470   : InstVRX<opcode, (outs), (ins tr.op:$V1, bdxaddr12only:$XBD2),
   2471             mnemonic#"\t$V1, $XBD2",
   2472             [(set (tr.vt tr.op:$V1), (operator bdxaddr12only:$XBD2))]> {
   2473   let M3 = type;
   2474   let mayStore = 1;
   2475   let AccessBytes = bytes;
   2476 }
   2477 
   2478 class StoreLengthVRSb<string mnemonic, bits<16> opcode,
   2479                       SDPatternOperator operator, bits<5> bytes>
   2480   : InstVRSb<opcode, (outs), (ins VR128:$V1, GR32:$R3, bdaddr12only:$BD2),
   2481              mnemonic#"\t$V1, $R3, $BD2",
   2482              [(operator VR128:$V1, GR32:$R3, bdaddr12only:$BD2)]> {
   2483   let M4 = 0;
   2484   let mayStore = 1;
   2485   let AccessBytes = bytes;
   2486 }
   2487 
   2488 class StoreLengthVRSd<string mnemonic, bits<16> opcode,
   2489                       SDPatternOperator operator, bits<5> bytes>
   2490   : InstVRSd<opcode, (outs), (ins VR128:$V1, GR32:$R3, bdaddr12only:$BD2),
   2491              mnemonic#"\t$V1, $R3, $BD2",
   2492              [(operator VR128:$V1, GR32:$R3, bdaddr12only:$BD2)]> {
   2493   let mayStore = 1;
   2494   let AccessBytes = bytes;
   2495 }
   2496 
   2497 class StoreLengthVSI<string mnemonic, bits<16> opcode,
   2498                      SDPatternOperator operator, bits<5> bytes>
   2499   : InstVSI<opcode, (outs), (ins VR128:$V1, bdaddr12only:$BD2, imm32zx8:$I3),
   2500             mnemonic#"\t$V1, $BD2, $I3",
   2501             [(operator VR128:$V1, imm32zx8:$I3, bdaddr12only:$BD2)]> {
   2502   let mayStore = 1;
   2503   let AccessBytes = bytes;
   2504 }
   2505 
   2506 class StoreMultipleRS<string mnemonic, bits<8> opcode, RegisterOperand cls,
   2507                       AddressingMode mode = bdaddr12only>
   2508   : InstRSa<opcode, (outs), (ins cls:$R1, cls:$R3, mode:$BD2),
   2509             mnemonic#"\t$R1, $R3, $BD2", []> {
   2510   let mayStore = 1;
   2511 }
   2512 
   2513 class StoreMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls,
   2514                        AddressingMode mode = bdaddr20only>
   2515   : InstRSYa<opcode, (outs), (ins cls:$R1, cls:$R3, mode:$BD2),
   2516              mnemonic#"\t$R1, $R3, $BD2", []> {
   2517   let mayStore = 1;
   2518 }
   2519 
   2520 multiclass StoreMultipleRSPair<string mnemonic, bits<8> rsOpcode,
   2521                                bits<16> rsyOpcode, RegisterOperand cls> {
   2522   let DispKey = mnemonic ## #cls in {
   2523     let DispSize = "12" in
   2524       def "" : StoreMultipleRS<mnemonic, rsOpcode, cls, bdaddr12pair>;
   2525     let DispSize = "20" in
   2526       def Y  : StoreMultipleRSY<mnemonic#"y", rsyOpcode, cls, bdaddr20pair>;
   2527   }
   2528 }
   2529 
   2530 class StoreMultipleVRSa<string mnemonic, bits<16> opcode>
   2531   : InstVRSa<opcode, (outs), (ins VR128:$V1, VR128:$V3, bdaddr12only:$BD2),
   2532              mnemonic#"\t$V1, $V3, $BD2", []> {
   2533   let M4 = 0;
   2534   let mayStore = 1;
   2535 }
   2536 
   2537 // StoreSI* instructions are used to store an integer to memory, but the
   2538 // addresses are more restricted than for normal stores.  If we are in the
   2539 // situation of having to force either the address into a register or the
   2540 // constant into a register, it's usually better to do the latter.
   2541 // We therefore match the address in the same way as a normal store and
   2542 // only use the StoreSI* instruction if the matched address is suitable.
   2543 class StoreSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   2544               Immediate imm>
   2545   : InstSI<opcode, (outs), (ins mviaddr12pair:$BD1, imm:$I2),
   2546            mnemonic#"\t$BD1, $I2",
   2547            [(operator imm:$I2, mviaddr12pair:$BD1)]> {
   2548   let mayStore = 1;
   2549 }
   2550 
   2551 class StoreSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   2552                Immediate imm>
   2553   : InstSIY<opcode, (outs), (ins mviaddr20pair:$BD1, imm:$I2),
   2554             mnemonic#"\t$BD1, $I2",
   2555             [(operator imm:$I2, mviaddr20pair:$BD1)]> {
   2556   let mayStore = 1;
   2557 }
   2558 
   2559 class StoreSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   2560                Immediate imm>
   2561   : InstSIL<opcode, (outs), (ins mviaddr12pair:$BD1, imm:$I2),
   2562             mnemonic#"\t$BD1, $I2",
   2563             [(operator imm:$I2, mviaddr12pair:$BD1)]> {
   2564   let mayStore = 1;
   2565 }
   2566 
   2567 multiclass StoreSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
   2568                        SDPatternOperator operator, Immediate imm> {
   2569   let DispKey = mnemonic in {
   2570     let DispSize = "12" in
   2571       def "" : StoreSI<mnemonic, siOpcode, operator, imm>;
   2572     let DispSize = "20" in
   2573       def Y  : StoreSIY<mnemonic#"y", siyOpcode, operator, imm>;
   2574   }
   2575 }
   2576 
   2577 class StoreSSE<string mnemonic, bits<16> opcode>
   2578   : InstSSE<opcode, (outs), (ins bdaddr12only:$BD1, bdaddr12only:$BD2),
   2579             mnemonic#"\t$BD1, $BD2", []> {
   2580   let mayStore = 1;
   2581 }
   2582 
   2583 class CondStoreRSY<string mnemonic, bits<16> opcode,
   2584                    RegisterOperand cls, bits<5> bytes,
   2585                    AddressingMode mode = bdaddr20only>
   2586   : InstRSYb<opcode, (outs), (ins cls:$R1, mode:$BD2, cond4:$valid, cond4:$M3),
   2587             mnemonic#"$M3\t$R1, $BD2", []> {
   2588   let mayStore = 1;
   2589   let AccessBytes = bytes;
   2590   let CCMaskLast = 1;
   2591 }
   2592 
   2593 // Like CondStoreRSY, but used for the raw assembly form.  The condition-code
   2594 // mask is the third operand rather than being part of the mnemonic.
   2595 class AsmCondStoreRSY<string mnemonic, bits<16> opcode,
   2596                       RegisterOperand cls, bits<5> bytes,
   2597                       AddressingMode mode = bdaddr20only>
   2598   : InstRSYb<opcode, (outs), (ins cls:$R1, mode:$BD2, imm32zx4:$M3),
   2599              mnemonic#"\t$R1, $BD2, $M3", []> {
   2600   let mayStore = 1;
   2601   let AccessBytes = bytes;
   2602 }
   2603 
   2604 // Like CondStoreRSY, but with a fixed CC mask.
   2605 class FixedCondStoreRSY<CondVariant V, string mnemonic, bits<16> opcode,
   2606                         RegisterOperand cls, bits<5> bytes,
   2607                         AddressingMode mode = bdaddr20only>
   2608   : InstRSYb<opcode, (outs), (ins cls:$R1, mode:$BD2),
   2609              mnemonic#V.suffix#"\t$R1, $BD2", []> {
   2610   let mayStore = 1;
   2611   let AccessBytes = bytes;
   2612   let isAsmParserOnly = V.alternate;
   2613   let M3 = V.ccmask;
   2614 }
   2615 
   2616 multiclass CondStoreRSYPair<string mnemonic, bits<16> opcode,
   2617                             RegisterOperand cls, bits<5> bytes,
   2618                             AddressingMode mode = bdaddr20only> {
   2619   let isCodeGenOnly = 1 in
   2620     def "" : CondStoreRSY<mnemonic, opcode, cls, bytes, mode>;
   2621   def Asm : AsmCondStoreRSY<mnemonic, opcode, cls, bytes, mode>;
   2622 }
   2623 
   2624 class SideEffectUnaryI<string mnemonic, bits<8> opcode, Immediate imm>
   2625   : InstI<opcode, (outs), (ins imm:$I1),
   2626           mnemonic#"\t$I1", []>;
   2627 
   2628 class SideEffectUnaryRR<string mnemonic, bits<8>opcode, RegisterOperand cls>
   2629   : InstRR<opcode, (outs), (ins cls:$R1),
   2630            mnemonic#"\t$R1", []> {
   2631   let R2 = 0;
   2632 }
   2633 
   2634 class SideEffectUnaryRRE<string mnemonic, bits<16> opcode, RegisterOperand cls,
   2635                          SDPatternOperator operator>
   2636   : InstRRE<opcode, (outs), (ins cls:$R1),
   2637             mnemonic#"\t$R1", [(operator cls:$R1)]> {
   2638   let R2 = 0;
   2639 }
   2640 
   2641 class SideEffectUnaryS<string mnemonic, bits<16> opcode,
   2642                        SDPatternOperator operator, bits<5> bytes,
   2643                        AddressingMode mode = bdaddr12only>
   2644   : InstS<opcode, (outs), (ins mode:$BD2),
   2645           mnemonic#"\t$BD2", [(operator mode:$BD2)]> {
   2646   let mayLoad = 1;
   2647   let AccessBytes = bytes;
   2648 }
   2649 
   2650 class SideEffectAddressS<string mnemonic, bits<16> opcode,
   2651                         SDPatternOperator operator,
   2652                         AddressingMode mode = bdaddr12only>
   2653   : InstS<opcode, (outs), (ins mode:$BD2),
   2654           mnemonic#"\t$BD2", [(operator mode:$BD2)]>;
   2655 
   2656 class LoadAddressRX<string mnemonic, bits<8> opcode,
   2657                     SDPatternOperator operator, AddressingMode mode>
   2658   : InstRXa<opcode, (outs GR64:$R1), (ins mode:$XBD2),
   2659             mnemonic#"\t$R1, $XBD2",
   2660             [(set GR64:$R1, (operator mode:$XBD2))]>;
   2661 
   2662 class LoadAddressRXY<string mnemonic, bits<16> opcode,
   2663                      SDPatternOperator operator, AddressingMode mode>
   2664   : InstRXYa<opcode, (outs GR64:$R1), (ins mode:$XBD2),
   2665              mnemonic#"\t$R1, $XBD2",
   2666              [(set GR64:$R1, (operator mode:$XBD2))]>;
   2667 
   2668 multiclass LoadAddressRXPair<string mnemonic, bits<8> rxOpcode,
   2669                              bits<16> rxyOpcode, SDPatternOperator operator> {
   2670   let DispKey = mnemonic in {
   2671     let DispSize = "12" in
   2672       def "" : LoadAddressRX<mnemonic, rxOpcode, operator, laaddr12pair>;
   2673     let DispSize = "20" in
   2674       def Y  : LoadAddressRXY<mnemonic#"y", rxyOpcode, operator, laaddr20pair>;
   2675   }
   2676 }
   2677 
   2678 class LoadAddressRIL<string mnemonic, bits<12> opcode,
   2679                      SDPatternOperator operator>
   2680   : InstRILb<opcode, (outs GR64:$R1), (ins pcrel32:$RI2),
   2681              mnemonic#"\t$R1, $RI2",
   2682              [(set GR64:$R1, (operator pcrel32:$RI2))]>;
   2683 
   2684 class UnaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   2685               RegisterOperand cls1, RegisterOperand cls2>
   2686   : InstRR<opcode, (outs cls1:$R1), (ins cls2:$R2),
   2687            mnemonic#"\t$R1, $R2",
   2688            [(set cls1:$R1, (operator cls2:$R2))]> {
   2689   let OpKey = mnemonic#cls1;
   2690   let OpType = "reg";
   2691 }
   2692 
   2693 class UnaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   2694                RegisterOperand cls1, RegisterOperand cls2>
   2695   : InstRRE<opcode, (outs cls1:$R1), (ins cls2:$R2),
   2696             mnemonic#"\t$R1, $R2",
   2697             [(set cls1:$R1, (operator cls2:$R2))]> {
   2698   let OpKey = mnemonic#cls1;
   2699   let OpType = "reg";
   2700 }
   2701 
   2702 class UnaryTiedRRE<string mnemonic, bits<16> opcode, RegisterOperand cls>
   2703   : InstRRE<opcode, (outs cls:$R1), (ins cls:$R1src),
   2704             mnemonic#"\t$R1", []> {
   2705   let Constraints = "$R1 = $R1src";
   2706   let DisableEncoding = "$R1src";
   2707   let R2 = 0;
   2708 }
   2709 
   2710 class UnaryMemRRFc<string mnemonic, bits<16> opcode,
   2711                    RegisterOperand cls1, RegisterOperand cls2>
   2712   : InstRRFc<opcode, (outs cls2:$R2, cls1:$R1), (ins cls1:$R1src),
   2713             mnemonic#"\t$R1, $R2", []> {
   2714   let Constraints = "$R1 = $R1src";
   2715   let DisableEncoding = "$R1src";
   2716   let M3 = 0;
   2717 }
   2718 
   2719 class UnaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   2720               RegisterOperand cls, Immediate imm>
   2721   : InstRIa<opcode, (outs cls:$R1), (ins imm:$I2),
   2722             mnemonic#"\t$R1, $I2",
   2723             [(set cls:$R1, (operator imm:$I2))]>;
   2724 
   2725 class UnaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   2726                RegisterOperand cls, Immediate imm>
   2727   : InstRILa<opcode, (outs cls:$R1), (ins imm:$I2),
   2728              mnemonic#"\t$R1, $I2",
   2729              [(set cls:$R1, (operator imm:$I2))]>;
   2730 
   2731 class UnaryRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   2732                  RegisterOperand cls>
   2733   : InstRILb<opcode, (outs cls:$R1), (ins pcrel32:$RI2),
   2734              mnemonic#"\t$R1, $RI2",
   2735              [(set cls:$R1, (operator pcrel32:$RI2))]> {
   2736   let mayLoad = 1;
   2737   // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
   2738   // However, BDXs have two extra operands and are therefore 6 units more
   2739   // complex.
   2740   let AddedComplexity = 7;
   2741 }
   2742 
   2743 class CondUnaryRSY<string mnemonic, bits<16> opcode,
   2744                    SDPatternOperator operator, RegisterOperand cls,
   2745                    bits<5> bytes, AddressingMode mode = bdaddr20only>
   2746   : InstRSYb<opcode, (outs cls:$R1),
   2747              (ins cls:$R1src, mode:$BD2, cond4:$valid, cond4:$M3),
   2748              mnemonic#"$M3\t$R1, $BD2",
   2749              [(set cls:$R1,
   2750                    (z_select_ccmask (operator bdaddr20only:$BD2), cls:$R1src,
   2751                                     cond4:$valid, cond4:$M3))]> {
   2752   let Constraints = "$R1 = $R1src";
   2753   let DisableEncoding = "$R1src";
   2754   let mayLoad = 1;
   2755   let AccessBytes = bytes;
   2756   let CCMaskLast = 1;
   2757 }
   2758 
   2759 // Like CondUnaryRSY, but used for the raw assembly form.  The condition-code
   2760 // mask is the third operand rather than being part of the mnemonic.
   2761 class AsmCondUnaryRSY<string mnemonic, bits<16> opcode,
   2762                       RegisterOperand cls, bits<5> bytes,
   2763                       AddressingMode mode = bdaddr20only>
   2764   : InstRSYb<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$BD2, imm32zx4:$M3),
   2765              mnemonic#"\t$R1, $BD2, $M3", []> {
   2766   let mayLoad = 1;
   2767   let AccessBytes = bytes;
   2768   let Constraints = "$R1 = $R1src";
   2769   let DisableEncoding = "$R1src";
   2770 }
   2771 
   2772 // Like CondUnaryRSY, but with a fixed CC mask.
   2773 class FixedCondUnaryRSY<CondVariant V, string mnemonic, bits<16> opcode,
   2774                         RegisterOperand cls, bits<5> bytes,
   2775                         AddressingMode mode = bdaddr20only>
   2776   : InstRSYb<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$BD2),
   2777              mnemonic#V.suffix#"\t$R1, $BD2", []> {
   2778   let Constraints = "$R1 = $R1src";
   2779   let DisableEncoding = "$R1src";
   2780   let mayLoad = 1;
   2781   let AccessBytes = bytes;
   2782   let isAsmParserOnly = V.alternate;
   2783   let M3 = V.ccmask;
   2784 }
   2785 
   2786 multiclass CondUnaryRSYPair<string mnemonic, bits<16> opcode,
   2787                             SDPatternOperator operator,
   2788                             RegisterOperand cls, bits<5> bytes,
   2789                             AddressingMode mode = bdaddr20only> {
   2790   let isCodeGenOnly = 1 in
   2791     def "" : CondUnaryRSY<mnemonic, opcode, operator, cls, bytes, mode>;
   2792   def Asm : AsmCondUnaryRSY<mnemonic, opcode, cls, bytes, mode>;
   2793 }
   2794 
   2795 class UnaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   2796               RegisterOperand cls, bits<5> bytes,
   2797               AddressingMode mode = bdxaddr12only>
   2798   : InstRXa<opcode, (outs cls:$R1), (ins mode:$XBD2),
   2799             mnemonic#"\t$R1, $XBD2",
   2800             [(set cls:$R1, (operator mode:$XBD2))]> {
   2801   let OpKey = mnemonic#"r"#cls;
   2802   let OpType = "mem";
   2803   let mayLoad = 1;
   2804   let AccessBytes = bytes;
   2805 }
   2806 
   2807 class UnaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   2808                RegisterOperand cls, bits<5> bytes>
   2809   : InstRXE<opcode, (outs cls:$R1), (ins bdxaddr12only:$XBD2),
   2810             mnemonic#"\t$R1, $XBD2",
   2811             [(set cls:$R1, (operator bdxaddr12only:$XBD2))]> {
   2812   let OpKey = mnemonic#"r"#cls;
   2813   let OpType = "mem";
   2814   let mayLoad = 1;
   2815   let AccessBytes = bytes;
   2816   let M3 = 0;
   2817 }
   2818 
   2819 class UnaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   2820                RegisterOperand cls, bits<5> bytes,
   2821                AddressingMode mode = bdxaddr20only>
   2822   : InstRXYa<opcode, (outs cls:$R1), (ins mode:$XBD2),
   2823              mnemonic#"\t$R1, $XBD2",
   2824              [(set cls:$R1, (operator mode:$XBD2))]> {
   2825   let OpKey = mnemonic#"r"#cls;
   2826   let OpType = "mem";
   2827   let mayLoad = 1;
   2828   let AccessBytes = bytes;
   2829 }
   2830 
   2831 multiclass UnaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
   2832                        SDPatternOperator operator, RegisterOperand cls,
   2833                        bits<5> bytes> {
   2834   let DispKey = mnemonic ## #cls in {
   2835     let DispSize = "12" in
   2836       def "" : UnaryRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>;
   2837     let DispSize = "20" in
   2838       def Y  : UnaryRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes,
   2839                         bdxaddr20pair>;
   2840   }
   2841 }
   2842 
   2843 class UnaryVRIa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   2844                 TypedReg tr, Immediate imm, bits<4> type = 0>
   2845   : InstVRIa<opcode, (outs tr.op:$V1), (ins imm:$I2),
   2846              mnemonic#"\t$V1, $I2",
   2847              [(set (tr.vt tr.op:$V1), (operator imm:$I2))]> {
   2848   let M3 = type;
   2849 }
   2850 
   2851 class UnaryVRIaGeneric<string mnemonic, bits<16> opcode, Immediate imm>
   2852   : InstVRIa<opcode, (outs VR128:$V1), (ins imm:$I2, imm32zx4:$M3),
   2853              mnemonic#"\t$V1, $I2, $M3", []>;
   2854 
   2855 class UnaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   2856                 TypedReg tr1, TypedReg tr2, bits<4> type = 0, bits<4> m4 = 0,
   2857                 bits<4> m5 = 0>
   2858   : InstVRRa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2),
   2859              mnemonic#"\t$V1, $V2",
   2860              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2)))]> {
   2861   let M3 = type;
   2862   let M4 = m4;
   2863   let M5 = m5;
   2864 }
   2865 
   2866 class UnaryVRRaGeneric<string mnemonic, bits<16> opcode, bits<4> m4 = 0,
   2867                        bits<4> m5 = 0>
   2868   : InstVRRa<opcode, (outs VR128:$V1), (ins VR128:$V2, imm32zx4:$M3),
   2869              mnemonic#"\t$V1, $V2, $M3", []> {
   2870   let M4 = m4;
   2871   let M5 = m5;
   2872 }
   2873 
   2874 class UnaryVRRaFloatGeneric<string mnemonic, bits<16> opcode, bits<4> m5 = 0>
   2875   : InstVRRa<opcode, (outs VR128:$V1),
   2876              (ins VR128:$V2, imm32zx4:$M3, imm32zx4:$M4),
   2877              mnemonic#"\t$V1, $V2, $M3, $M4", []> {
   2878   let M5 = m5;
   2879 }
   2880 
   2881 // Declare a pair of instructions, one which sets CC and one which doesn't.
   2882 // The CC-setting form ends with "S" and sets the low bit of M5.
   2883 // The form that does not set CC has an extra operand to optionally allow
   2884 // specifying arbitrary M5 values in assembler.
   2885 multiclass UnaryExtraVRRaSPair<string mnemonic, bits<16> opcode,
   2886                                SDPatternOperator operator,
   2887                                SDPatternOperator operator_cc,
   2888                                TypedReg tr1, TypedReg tr2, bits<4> type> {
   2889   let M3 = type, M4 = 0 in
   2890     def "" : InstVRRa<opcode, (outs tr1.op:$V1),
   2891                       (ins tr2.op:$V2, imm32zx4:$M5),
   2892                       mnemonic#"\t$V1, $V2, $M5", []>;
   2893   def : Pat<(tr1.vt (operator (tr2.vt tr2.op:$V2))),
   2894             (!cast<Instruction>(NAME) tr2.op:$V2, 0)>;
   2895   def : InstAlias<mnemonic#"\t$V1, $V2",
   2896                   (!cast<Instruction>(NAME) tr1.op:$V1, tr2.op:$V2, 0)>;
   2897   let Defs = [CC] in
   2898     def S : UnaryVRRa<mnemonic##"s", opcode, operator_cc, tr1, tr2,
   2899                       type, 0, 1>;
   2900 }
   2901 
   2902 multiclass UnaryExtraVRRaSPairGeneric<string mnemonic, bits<16> opcode> {
   2903   let M4 = 0 in
   2904     def "" : InstVRRa<opcode, (outs VR128:$V1),
   2905                      (ins VR128:$V2, imm32zx4:$M3, imm32zx4:$M5),
   2906                      mnemonic#"\t$V1, $V2, $M3, $M5", []>;
   2907   def : InstAlias<mnemonic#"\t$V1, $V2, $M3",
   2908                   (!cast<Instruction>(NAME) VR128:$V1, VR128:$V2,
   2909                                             imm32zx4:$M3, 0)>;
   2910 }
   2911 
   2912 class UnaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   2913                TypedReg tr, bits<5> bytes, bits<4> type = 0>
   2914   : InstVRX<opcode, (outs tr.op:$V1), (ins bdxaddr12only:$XBD2),
   2915             mnemonic#"\t$V1, $XBD2",
   2916             [(set (tr.vt tr.op:$V1), (operator bdxaddr12only:$XBD2))]> {
   2917   let M3 = type;
   2918   let mayLoad = 1;
   2919   let AccessBytes = bytes;
   2920 }
   2921 
   2922 class UnaryVRXGeneric<string mnemonic, bits<16> opcode>
   2923   : InstVRX<opcode, (outs VR128:$V1), (ins bdxaddr12only:$XBD2, imm32zx4:$M3),
   2924             mnemonic#"\t$V1, $XBD2, $M3", []> {
   2925   let mayLoad = 1;
   2926 }
   2927 
   2928 class SideEffectBinaryRX<string mnemonic, bits<8> opcode,
   2929                          RegisterOperand cls>
   2930   : InstRXa<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2),
   2931             mnemonic##"\t$R1, $XBD2", []>;
   2932 
   2933 class SideEffectBinaryRXY<string mnemonic, bits<16> opcode,
   2934                           RegisterOperand cls>
   2935   : InstRXYa<opcode, (outs), (ins cls:$R1, bdxaddr20only:$XBD2),
   2936              mnemonic##"\t$R1, $XBD2", []>;
   2937 
   2938 class SideEffectBinaryRILPC<string mnemonic, bits<12> opcode,
   2939                             RegisterOperand cls>
   2940   : InstRILb<opcode, (outs), (ins cls:$R1, pcrel32:$RI2),
   2941              mnemonic##"\t$R1, $RI2", []> {
   2942   // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
   2943   // However, BDXs have two extra operands and are therefore 6 units more
   2944   // complex.
   2945   let AddedComplexity = 7;
   2946 }
   2947 
   2948 class SideEffectBinaryRRE<string mnemonic, bits<16> opcode,
   2949                           RegisterOperand cls1, RegisterOperand cls2>
   2950   : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2),
   2951             mnemonic#"\t$R1, $R2", []>;
   2952 
   2953 class SideEffectBinaryRRFa<string mnemonic, bits<16> opcode,
   2954                            RegisterOperand cls1, RegisterOperand cls2>
   2955   : InstRRFa<opcode, (outs), (ins cls1:$R1, cls2:$R2),
   2956              mnemonic#"\t$R1, $R2", []> {
   2957   let R3 = 0;
   2958   let M4 = 0;
   2959 }
   2960 
   2961 class SideEffectBinaryRRFc<string mnemonic, bits<16> opcode,
   2962                            RegisterOperand cls1, RegisterOperand cls2>
   2963   : InstRRFc<opcode, (outs), (ins cls1:$R1, cls2:$R2),
   2964              mnemonic#"\t$R1, $R2", []> {
   2965   let M3 = 0;
   2966 }
   2967 
   2968 class SideEffectBinaryIE<string mnemonic, bits<16> opcode,
   2969                          Immediate imm1, Immediate imm2>
   2970   : InstIE<opcode, (outs), (ins imm1:$I1, imm2:$I2),
   2971            mnemonic#"\t$I1, $I2", []>;
   2972 
   2973 class SideEffectBinarySI<string mnemonic, bits<8> opcode, Operand imm>
   2974   : InstSI<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
   2975            mnemonic#"\t$BD1, $I2", []>;
   2976 
   2977 class SideEffectBinarySIL<string mnemonic, bits<16> opcode,
   2978                           SDPatternOperator operator, Immediate imm>
   2979   : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
   2980             mnemonic#"\t$BD1, $I2", [(operator bdaddr12only:$BD1, imm:$I2)]>;
   2981 
   2982 class SideEffectBinarySSa<string mnemonic, bits<8> opcode>
   2983   : InstSSa<opcode, (outs), (ins bdladdr12onlylen8:$BDL1, bdaddr12only:$BD2),
   2984             mnemonic##"\t$BDL1, $BD2", []>;
   2985 
   2986 class SideEffectBinarySSb<string mnemonic, bits<8> opcode>
   2987   : InstSSb<opcode,
   2988             (outs), (ins bdladdr12onlylen4:$BDL1, bdladdr12onlylen4:$BDL2),
   2989             mnemonic##"\t$BDL1, $BDL2", []>;
   2990 
   2991 class SideEffectBinarySSf<string mnemonic, bits<8> opcode>
   2992   : InstSSf<opcode, (outs), (ins bdaddr12only:$BD1, bdladdr12onlylen8:$BDL2),
   2993             mnemonic##"\t$BD1, $BDL2", []>;
   2994 
   2995 class SideEffectBinarySSE<string mnemonic, bits<16> opcode>
   2996   : InstSSE<opcode, (outs), (ins bdaddr12only:$BD1, bdaddr12only:$BD2),
   2997             mnemonic#"\t$BD1, $BD2", []>;
   2998 
   2999 class SideEffectBinaryMemMemRR<string mnemonic, bits<8> opcode,
   3000                                RegisterOperand cls1, RegisterOperand cls2>
   3001   : InstRR<opcode, (outs cls1:$R1, cls2:$R2), (ins cls1:$R1src, cls2:$R2src),
   3002            mnemonic#"\t$R1, $R2", []> {
   3003     let Constraints = "$R1 = $R1src, $R2 = $R2src";
   3004     let DisableEncoding = "$R1src, $R2src";
   3005 }
   3006 
   3007 class SideEffectBinaryMemRRE<string mnemonic, bits<16> opcode,
   3008                              RegisterOperand cls1, RegisterOperand cls2>
   3009   : InstRRE<opcode, (outs cls2:$R2), (ins cls1:$R1, cls2:$R2src),
   3010             mnemonic#"\t$R1, $R2", []> {
   3011   let Constraints = "$R2 = $R2src";
   3012   let DisableEncoding = "$R2src";
   3013 }
   3014 
   3015 class SideEffectBinaryMemMemRRE<string mnemonic, bits<16> opcode,
   3016                                 RegisterOperand cls1, RegisterOperand cls2>
   3017   : InstRRE<opcode, (outs cls1:$R1, cls2:$R2), (ins cls1:$R1src, cls2:$R2src),
   3018             mnemonic#"\t$R1, $R2", []> {
   3019     let Constraints = "$R1 = $R1src, $R2 = $R2src";
   3020     let DisableEncoding = "$R1src, $R2src";
   3021 }
   3022 
   3023 class SideEffectBinaryMemMemRRFc<string mnemonic, bits<16> opcode,
   3024                                  RegisterOperand cls1, RegisterOperand cls2>
   3025   : InstRRFc<opcode, (outs cls1:$R1, cls2:$R2), (ins cls1:$R1src, cls2:$R2src),
   3026              mnemonic#"\t$R1, $R2", []> {
   3027   let Constraints = "$R1 = $R1src, $R2 = $R2src";
   3028   let DisableEncoding = "$R1src, $R2src";
   3029   let M3 = 0;
   3030 }
   3031 
   3032 class BinaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   3033                RegisterOperand cls1, RegisterOperand cls2>
   3034   : InstRR<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
   3035            mnemonic#"\t$R1, $R2",
   3036            [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
   3037   let OpKey = mnemonic#cls1;
   3038   let OpType = "reg";
   3039   let Constraints = "$R1 = $R1src";
   3040   let DisableEncoding = "$R1src";
   3041 }
   3042 
   3043 class BinaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3044                 RegisterOperand cls1, RegisterOperand cls2>
   3045   : InstRRE<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
   3046             mnemonic#"\t$R1, $R2",
   3047             [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> {
   3048   let OpKey = mnemonic#cls1;
   3049   let OpType = "reg";
   3050   let Constraints = "$R1 = $R1src";
   3051   let DisableEncoding = "$R1src";
   3052 }
   3053 
   3054 class BinaryRRD<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3055                 RegisterOperand cls1, RegisterOperand cls2>
   3056   : InstRRD<opcode, (outs cls1:$R1), (ins cls2:$R3, cls2:$R2),
   3057             mnemonic#"\t$R1, $R3, $R2",
   3058             [(set cls1:$R1, (operator cls2:$R3, cls2:$R2))]> {
   3059   let OpKey = mnemonic#cls;
   3060   let OpType = "reg";
   3061 }
   3062 
   3063 class BinaryRRFa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3064                  RegisterOperand cls1, RegisterOperand cls2,
   3065                  RegisterOperand cls3>
   3066   : InstRRFa<opcode, (outs cls1:$R1), (ins cls2:$R2, cls3:$R3),
   3067              mnemonic#"\t$R1, $R2, $R3",
   3068              [(set cls1:$R1, (operator cls2:$R2, cls3:$R3))]> {
   3069   let M4 = 0;
   3070 }
   3071 
   3072 multiclass BinaryRRAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
   3073                         SDPatternOperator operator, RegisterOperand cls1,
   3074                         RegisterOperand cls2> {
   3075   let NumOpsKey = mnemonic in {
   3076     let NumOpsValue = "3" in
   3077       def K : BinaryRRFa<mnemonic#"k", opcode2, null_frag, cls1, cls1, cls2>,
   3078               Requires<[FeatureDistinctOps]>;
   3079     let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
   3080       def "" : BinaryRR<mnemonic, opcode1, operator, cls1, cls2>;
   3081   }
   3082 }
   3083 
   3084 multiclass BinaryRREAndK<string mnemonic, bits<16> opcode1, bits<16> opcode2,
   3085                          SDPatternOperator operator, RegisterOperand cls1,
   3086                          RegisterOperand cls2> {
   3087   let NumOpsKey = mnemonic in {
   3088     let NumOpsValue = "3" in
   3089       def K : BinaryRRFa<mnemonic#"k", opcode2, null_frag, cls1, cls1, cls2>,
   3090               Requires<[FeatureDistinctOps]>;
   3091     let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
   3092       def "" : BinaryRRE<mnemonic, opcode1, operator, cls1, cls2>;
   3093   }
   3094 }
   3095 
   3096 class BinaryRRFb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3097                  RegisterOperand cls1, RegisterOperand cls2,
   3098                  RegisterOperand cls3>
   3099   : InstRRFb<opcode, (outs cls1:$R1), (ins cls2:$R2, cls3:$R3),
   3100              mnemonic#"\t$R1, $R3, $R2",
   3101              [(set cls1:$R1, (operator cls2:$R2, cls3:$R3))]> {
   3102   let M4 = 0;
   3103 }
   3104 
   3105 class BinaryMemRRFc<string mnemonic, bits<16> opcode,
   3106                     RegisterOperand cls1, RegisterOperand cls2, Immediate imm>
   3107   : InstRRFc<opcode, (outs cls2:$R2, cls1:$R1), (ins cls1:$R1src, imm:$M3),
   3108             mnemonic#"\t$R1, $R2, $M3", []> {
   3109   let Constraints = "$R1 = $R1src";
   3110   let DisableEncoding = "$R1src";
   3111 }
   3112 
   3113 multiclass BinaryMemRRFcOpt<string mnemonic, bits<16> opcode,
   3114                             RegisterOperand cls1, RegisterOperand cls2> {
   3115   def "" : BinaryMemRRFc<mnemonic, opcode, cls1, cls2, imm32zx4>;
   3116   def Opt : UnaryMemRRFc<mnemonic, opcode, cls1, cls2>;
   3117 }
   3118 
   3119 class BinaryRRFd<string mnemonic, bits<16> opcode, RegisterOperand cls1,
   3120                 RegisterOperand cls2>
   3121   : InstRRFd<opcode, (outs cls1:$R1), (ins cls2:$R2, imm32zx4:$M4),
   3122              mnemonic#"\t$R1, $R2, $M4", []>;
   3123 
   3124 class BinaryRRFe<string mnemonic, bits<16> opcode, RegisterOperand cls1,
   3125                 RegisterOperand cls2>
   3126   : InstRRFe<opcode, (outs cls1:$R1), (ins imm32zx4:$M3, cls2:$R2),
   3127              mnemonic#"\t$R1, $M3, $R2", []> {
   3128   let M4 = 0;
   3129 }
   3130 
   3131 class CondBinaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
   3132                    RegisterOperand cls2>
   3133   : InstRRFc<opcode, (outs cls1:$R1),
   3134              (ins cls1:$R1src, cls2:$R2, cond4:$valid, cond4:$M3),
   3135              mnemonic#"$M3\t$R1, $R2",
   3136              [(set cls1:$R1, (z_select_ccmask cls2:$R2, cls1:$R1src,
   3137                                               cond4:$valid, cond4:$M3))]> {
   3138   let Constraints = "$R1 = $R1src";
   3139   let DisableEncoding = "$R1src";
   3140   let CCMaskLast = 1;
   3141 }
   3142 
   3143 // Like CondBinaryRRF, but used for the raw assembly form.  The condition-code
   3144 // mask is the third operand rather than being part of the mnemonic.
   3145 class AsmCondBinaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1,
   3146                        RegisterOperand cls2>
   3147   : InstRRFc<opcode, (outs cls1:$R1),
   3148              (ins cls1:$R1src, cls2:$R2, imm32zx4:$M3),
   3149              mnemonic#"\t$R1, $R2, $M3", []> {
   3150   let Constraints = "$R1 = $R1src";
   3151   let DisableEncoding = "$R1src";
   3152 }
   3153 
   3154 // Like CondBinaryRRF, but with a fixed CC mask.
   3155 class FixedCondBinaryRRF<CondVariant V, string mnemonic, bits<16> opcode,
   3156                          RegisterOperand cls1, RegisterOperand cls2>
   3157   : InstRRFc<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
   3158              mnemonic#V.suffix#"\t$R1, $R2", []> {
   3159   let Constraints = "$R1 = $R1src";
   3160   let DisableEncoding = "$R1src";
   3161   let isAsmParserOnly = V.alternate;
   3162   let M3 = V.ccmask;
   3163 }
   3164 
   3165 multiclass CondBinaryRRFPair<string mnemonic, bits<16> opcode,
   3166                              RegisterOperand cls1, RegisterOperand cls2> {
   3167   let isCodeGenOnly = 1 in
   3168     def "" : CondBinaryRRF<mnemonic, opcode, cls1, cls2>;
   3169   def Asm : AsmCondBinaryRRF<mnemonic, opcode, cls1, cls2>;
   3170 }
   3171 
   3172 class BinaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   3173                RegisterOperand cls, Immediate imm>
   3174   : InstRIa<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
   3175             mnemonic#"\t$R1, $I2",
   3176             [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
   3177   let Constraints = "$R1 = $R1src";
   3178   let DisableEncoding = "$R1src";
   3179 }
   3180 
   3181 class BinaryRIE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3182                 RegisterOperand cls, Immediate imm>
   3183   : InstRIEd<opcode, (outs cls:$R1), (ins cls:$R3, imm:$I2),
   3184              mnemonic#"\t$R1, $R3, $I2",
   3185              [(set cls:$R1, (operator cls:$R3, imm:$I2))]>;
   3186 
   3187 multiclass BinaryRIAndK<string mnemonic, bits<12> opcode1, bits<16> opcode2,
   3188                         SDPatternOperator operator, RegisterOperand cls,
   3189                         Immediate imm> {
   3190   let NumOpsKey = mnemonic in {
   3191     let NumOpsValue = "3" in
   3192       def K : BinaryRIE<mnemonic##"k", opcode2, null_frag, cls, imm>,
   3193               Requires<[FeatureDistinctOps]>;
   3194     let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
   3195       def "" : BinaryRI<mnemonic, opcode1, operator, cls, imm>;
   3196   }
   3197 }
   3198 
   3199 class CondBinaryRIE<string mnemonic, bits<16> opcode, RegisterOperand cls,
   3200                     Immediate imm>
   3201   : InstRIEg<opcode, (outs cls:$R1),
   3202              (ins cls:$R1src, imm:$I2, cond4:$valid, cond4:$M3),
   3203              mnemonic#"$M3\t$R1, $I2",
   3204              [(set cls:$R1, (z_select_ccmask imm:$I2, cls:$R1src,
   3205                                              cond4:$valid, cond4:$M3))]> {
   3206   let Constraints = "$R1 = $R1src";
   3207   let DisableEncoding = "$R1src";
   3208   let CCMaskLast = 1;
   3209 }
   3210 
   3211 // Like CondBinaryRIE, but used for the raw assembly form.  The condition-code
   3212 // mask is the third operand rather than being part of the mnemonic.
   3213 class AsmCondBinaryRIE<string mnemonic, bits<16> opcode, RegisterOperand cls,
   3214                        Immediate imm>
   3215   : InstRIEg<opcode, (outs cls:$R1),
   3216              (ins cls:$R1src, imm:$I2, imm32zx4:$M3),
   3217              mnemonic#"\t$R1, $I2, $M3", []> {
   3218   let Constraints = "$R1 = $R1src";
   3219   let DisableEncoding = "$R1src";
   3220 }
   3221 
   3222 // Like CondBinaryRIE, but with a fixed CC mask.
   3223 class FixedCondBinaryRIE<CondVariant V, string mnemonic, bits<16> opcode,
   3224                          RegisterOperand cls, Immediate imm>
   3225   : InstRIEg<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
   3226              mnemonic#V.suffix#"\t$R1, $I2", []> {
   3227   let Constraints = "$R1 = $R1src";
   3228   let DisableEncoding = "$R1src";
   3229   let isAsmParserOnly = V.alternate;
   3230   let M3 = V.ccmask;
   3231 }
   3232 
   3233 multiclass CondBinaryRIEPair<string mnemonic, bits<16> opcode,
   3234                              RegisterOperand cls, Immediate imm> {
   3235   let isCodeGenOnly = 1 in
   3236     def "" : CondBinaryRIE<mnemonic, opcode, cls, imm>;
   3237   def Asm : AsmCondBinaryRIE<mnemonic, opcode, cls, imm>;
   3238 }
   3239 
   3240 class BinaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   3241                 RegisterOperand cls, Immediate imm>
   3242   : InstRILa<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
   3243              mnemonic#"\t$R1, $I2",
   3244              [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
   3245   let Constraints = "$R1 = $R1src";
   3246   let DisableEncoding = "$R1src";
   3247 }
   3248 
   3249 class BinaryRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   3250                RegisterOperand cls>
   3251   : InstRSa<opcode, (outs cls:$R1), (ins cls:$R1src, shift12only:$BD2),
   3252             mnemonic#"\t$R1, $BD2",
   3253             [(set cls:$R1, (operator cls:$R1src, shift12only:$BD2))]> {
   3254   let R3 = 0;
   3255   let Constraints = "$R1 = $R1src";
   3256   let DisableEncoding = "$R1src";
   3257 }
   3258 
   3259 class BinaryRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3260                 RegisterOperand cls>
   3261   : InstRSYa<opcode, (outs cls:$R1), (ins cls:$R3, shift20only:$BD2),
   3262              mnemonic#"\t$R1, $R3, $BD2",
   3263              [(set cls:$R1, (operator cls:$R3, shift20only:$BD2))]>;
   3264 
   3265 multiclass BinaryRSAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2,
   3266                         SDPatternOperator operator, RegisterOperand cls> {
   3267   let NumOpsKey = mnemonic in {
   3268     let NumOpsValue = "3" in
   3269       def K  : BinaryRSY<mnemonic##"k", opcode2, null_frag, cls>,
   3270                Requires<[FeatureDistinctOps]>;
   3271     let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
   3272       def "" : BinaryRS<mnemonic, opcode1, operator, cls>;
   3273   }
   3274 }
   3275 
   3276 class BinaryRSL<string mnemonic, bits<16> opcode, RegisterOperand cls>
   3277   : InstRSLb<opcode, (outs cls:$R1),
   3278              (ins bdladdr12onlylen8:$BDL2, imm32zx4:$M3),
   3279              mnemonic#"\t$R1, $BDL2, $M3", []> {
   3280   let mayLoad = 1;
   3281 }
   3282 
   3283 class BinaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   3284                RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
   3285                AddressingMode mode = bdxaddr12only>
   3286   : InstRXa<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
   3287             mnemonic#"\t$R1, $XBD2",
   3288             [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
   3289   let OpKey = mnemonic#"r"#cls;
   3290   let OpType = "mem";
   3291   let Constraints = "$R1 = $R1src";
   3292   let DisableEncoding = "$R1src";
   3293   let mayLoad = 1;
   3294   let AccessBytes = bytes;
   3295 }
   3296 
   3297 class BinaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3298                   RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
   3299   : InstRXE<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr12only:$XBD2),
   3300             mnemonic#"\t$R1, $XBD2",
   3301             [(set cls:$R1, (operator cls:$R1src,
   3302                                      (load bdxaddr12only:$XBD2)))]> {
   3303   let OpKey = mnemonic#"r"#cls;
   3304   let OpType = "mem";
   3305   let Constraints = "$R1 = $R1src";
   3306   let DisableEncoding = "$R1src";
   3307   let mayLoad = 1;
   3308   let AccessBytes = bytes;
   3309   let M3 = 0;
   3310 }
   3311 
   3312 class BinaryRXF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3313                 RegisterOperand cls1, RegisterOperand cls2,
   3314                 SDPatternOperator load, bits<5> bytes>
   3315   : InstRXF<opcode, (outs cls1:$R1), (ins cls2:$R3, bdxaddr12only:$XBD2),
   3316             mnemonic#"\t$R1, $R3, $XBD2",
   3317             [(set cls1:$R1, (operator cls2:$R3, (load bdxaddr12only:$XBD2)))]> {
   3318   let OpKey = mnemonic#"r"#cls;
   3319   let OpType = "mem";
   3320   let mayLoad = 1;
   3321   let AccessBytes = bytes;
   3322 }
   3323 
   3324 class BinaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3325                 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
   3326                 AddressingMode mode = bdxaddr20only>
   3327   : InstRXYa<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2),
   3328              mnemonic#"\t$R1, $XBD2",
   3329              [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> {
   3330   let OpKey = mnemonic#"r"#cls;
   3331   let OpType = "mem";
   3332   let Constraints = "$R1 = $R1src";
   3333   let DisableEncoding = "$R1src";
   3334   let mayLoad = 1;
   3335   let AccessBytes = bytes;
   3336 }
   3337 
   3338 multiclass BinaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
   3339                         SDPatternOperator operator, RegisterOperand cls,
   3340                         SDPatternOperator load, bits<5> bytes> {
   3341   let DispKey = mnemonic ## #cls in {
   3342     let DispSize = "12" in
   3343       def "" : BinaryRX<mnemonic, rxOpcode, operator, cls, load, bytes,
   3344                         bdxaddr12pair>;
   3345     let DispSize = "20" in
   3346       def Y  : BinaryRXY<mnemonic#"y", rxyOpcode, operator, cls, load, bytes,
   3347                          bdxaddr20pair>;
   3348   }
   3349 }
   3350 
   3351 class BinarySI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   3352                Operand imm, AddressingMode mode = bdaddr12only>
   3353   : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
   3354            mnemonic#"\t$BD1, $I2",
   3355            [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
   3356   let mayLoad = 1;
   3357   let mayStore = 1;
   3358 }
   3359 
   3360 class BinarySIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3361                 Operand imm, AddressingMode mode = bdaddr20only>
   3362   : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
   3363             mnemonic#"\t$BD1, $I2",
   3364             [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> {
   3365   let mayLoad = 1;
   3366   let mayStore = 1;
   3367 }
   3368 
   3369 multiclass BinarySIPair<string mnemonic, bits<8> siOpcode,
   3370                         bits<16> siyOpcode, SDPatternOperator operator,
   3371                         Operand imm> {
   3372   let DispKey = mnemonic ## #cls in {
   3373     let DispSize = "12" in
   3374       def "" : BinarySI<mnemonic, siOpcode, operator, imm, bdaddr12pair>;
   3375     let DispSize = "20" in
   3376       def Y  : BinarySIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>;
   3377   }
   3378 }
   3379 
   3380 class BinarySSF<string mnemonic, bits<12> opcode, RegisterOperand cls>
   3381   : InstSSF<opcode, (outs cls:$R3), (ins bdaddr12pair:$BD1, bdaddr12pair:$BD2),
   3382             mnemonic#"\t$R3, $BD1, $BD2", []> {
   3383   let mayLoad = 1;
   3384 }
   3385 
   3386 class BinaryVRIb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3387                  TypedReg tr, bits<4> type>
   3388   : InstVRIb<opcode, (outs tr.op:$V1), (ins imm32zx8:$I2, imm32zx8:$I3),
   3389              mnemonic#"\t$V1, $I2, $I3",
   3390              [(set (tr.vt tr.op:$V1), (operator imm32zx8:$I2, imm32zx8:$I3))]> {
   3391   let M4 = type;
   3392 }
   3393 
   3394 class BinaryVRIbGeneric<string mnemonic, bits<16> opcode>
   3395   : InstVRIb<opcode, (outs VR128:$V1),
   3396              (ins imm32zx8:$I2, imm32zx8:$I3, imm32zx4:$M4),
   3397              mnemonic#"\t$V1, $I2, $I3, $M4", []>;
   3398 
   3399 class BinaryVRIc<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3400                  TypedReg tr1, TypedReg tr2, bits<4> type>
   3401   : InstVRIc<opcode, (outs tr1.op:$V1), (ins tr2.op:$V3, imm32zx16:$I2),
   3402              mnemonic#"\t$V1, $V3, $I2",
   3403              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V3),
   3404                                                   imm32zx16:$I2))]> {
   3405   let M4 = type;
   3406 }
   3407 
   3408 class BinaryVRIcGeneric<string mnemonic, bits<16> opcode>
   3409   : InstVRIc<opcode, (outs VR128:$V1),
   3410              (ins VR128:$V3, imm32zx16:$I2, imm32zx4:$M4),
   3411              mnemonic#"\t$V1, $V3, $I2, $M4", []>;
   3412 
   3413 class BinaryVRIe<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3414                  TypedReg tr1, TypedReg tr2, bits<4> type, bits<4> m5>
   3415   : InstVRIe<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, imm32zx12:$I3),
   3416              mnemonic#"\t$V1, $V2, $I3",
   3417              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   3418                                                   imm32zx12:$I3))]> {
   3419   let M4 = type;
   3420   let M5 = m5;
   3421 }
   3422 
   3423 class BinaryVRIeFloatGeneric<string mnemonic, bits<16> opcode>
   3424   : InstVRIe<opcode, (outs VR128:$V1),
   3425              (ins VR128:$V2, imm32zx12:$I3, imm32zx4:$M4, imm32zx4:$M5),
   3426              mnemonic#"\t$V1, $V2, $I3, $M4, $M5", []>;
   3427 
   3428 class BinaryVRIh<string mnemonic, bits<16> opcode>
   3429   : InstVRIh<opcode, (outs VR128:$V1),
   3430              (ins imm32zx16:$I2, imm32zx4:$I3),
   3431              mnemonic#"\t$V1, $I2, $I3", []>;
   3432 
   3433 class BinaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3434                  TypedReg tr1, TypedReg tr2, bits<4> type = 0, bits<4> m4 = 0>
   3435   : InstVRRa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, imm32zx4:$M5),
   3436              mnemonic#"\t$V1, $V2, $M5",
   3437              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   3438                                                   imm32zx12:$M5))]> {
   3439   let M3 = type;
   3440   let M4 = m4;
   3441 }
   3442 
   3443 class BinaryVRRaFloatGeneric<string mnemonic, bits<16> opcode>
   3444   : InstVRRa<opcode, (outs VR128:$V1),
   3445              (ins VR128:$V2, imm32zx4:$M3, imm32zx4:$M4, imm32zx4:$M5),
   3446              mnemonic#"\t$V1, $V2, $M3, $M4, $M5", []>;
   3447 
   3448 class BinaryVRRb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3449                  TypedReg tr1, TypedReg tr2, bits<4> type = 0,
   3450                  bits<4> modifier = 0>
   3451   : InstVRRb<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3),
   3452              mnemonic#"\t$V1, $V2, $V3",
   3453              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   3454                                                   (tr2.vt tr2.op:$V3)))]> {
   3455   let M4 = type;
   3456   let M5 = modifier;
   3457 }
   3458 
   3459 // Declare a pair of instructions, one which sets CC and one which doesn't.
   3460 // The CC-setting form ends with "S" and sets the low bit of M5.
   3461 multiclass BinaryVRRbSPair<string mnemonic, bits<16> opcode,
   3462                            SDPatternOperator operator,
   3463                            SDPatternOperator operator_cc, TypedReg tr1,
   3464                            TypedReg tr2, bits<4> type, bits<4> modifier = 0> {
   3465   def "" : BinaryVRRb<mnemonic, opcode, operator, tr1, tr2, type,
   3466                       !and (modifier, 14)>;
   3467   let Defs = [CC] in
   3468     def S : BinaryVRRb<mnemonic##"s", opcode, operator_cc, tr1, tr2, type,
   3469                        !add (!and (modifier, 14), 1)>;
   3470 }
   3471 
   3472 class BinaryVRRbSPairGeneric<string mnemonic, bits<16> opcode>
   3473   : InstVRRb<opcode, (outs VR128:$V1),
   3474              (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5),
   3475              mnemonic#"\t$V1, $V2, $V3, $M4, $M5", []>;
   3476 
   3477 // Declare a pair of instructions, one which sets CC and one which doesn't.
   3478 // The CC-setting form ends with "S" and sets the low bit of M5.
   3479 // The form that does not set CC has an extra operand to optionally allow
   3480 // specifying arbitrary M5 values in assembler.
   3481 multiclass BinaryExtraVRRbSPair<string mnemonic, bits<16> opcode,
   3482                                 SDPatternOperator operator,
   3483                                 SDPatternOperator operator_cc,
   3484                                 TypedReg tr1, TypedReg tr2, bits<4> type> {
   3485   let M4 = type in
   3486     def "" : InstVRRb<opcode, (outs tr1.op:$V1),
   3487                       (ins tr2.op:$V2, tr2.op:$V3, imm32zx4:$M5),
   3488                       mnemonic#"\t$V1, $V2, $V3, $M5", []>;
   3489   def : Pat<(tr1.vt (operator (tr2.vt tr2.op:$V2), (tr2.vt tr2.op:$V3))),
   3490             (!cast<Instruction>(NAME) tr2.op:$V2, tr2.op:$V3, 0)>;
   3491   def : InstAlias<mnemonic#"\t$V1, $V2, $V3",
   3492                   (!cast<Instruction>(NAME) tr1.op:$V1, tr2.op:$V2,
   3493                                             tr2.op:$V3, 0)>;
   3494   let Defs = [CC] in
   3495     def S : BinaryVRRb<mnemonic##"s", opcode, operator_cc, tr1, tr2, type, 1>;
   3496 }
   3497 
   3498 multiclass BinaryExtraVRRbSPairGeneric<string mnemonic, bits<16> opcode> {
   3499   def "" : InstVRRb<opcode, (outs VR128:$V1),
   3500                    (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5),
   3501                    mnemonic#"\t$V1, $V2, $V3, $M4, $M5", []>;
   3502   def : InstAlias<mnemonic#"\t$V1, $V2, $V3, $M4",
   3503                   (!cast<Instruction>(NAME) VR128:$V1, VR128:$V2, VR128:$V3,
   3504                                             imm32zx4:$M4, 0)>;
   3505 }
   3506 
   3507 class BinaryVRRc<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3508                  TypedReg tr1, TypedReg tr2, bits<4> type = 0, bits<4> m5 = 0,
   3509                  bits<4> m6 = 0>
   3510   : InstVRRc<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3),
   3511              mnemonic#"\t$V1, $V2, $V3",
   3512              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   3513                                                   (tr2.vt tr2.op:$V3)))]> {
   3514   let M4 = type;
   3515   let M5 = m5;
   3516   let M6 = m6;
   3517 }
   3518 
   3519 class BinaryVRRcGeneric<string mnemonic, bits<16> opcode, bits<4> m5 = 0,
   3520                         bits<4> m6 = 0>
   3521   : InstVRRc<opcode, (outs VR128:$V1),
   3522              (ins VR128:$V2, VR128:$V3, imm32zx4:$M4),
   3523              mnemonic#"\t$V1, $V2, $V3, $M4", []> {
   3524   let M5 = m5;
   3525   let M6 = m6;
   3526 }
   3527 
   3528 class BinaryVRRcFloatGeneric<string mnemonic, bits<16> opcode, bits<4> m6 = 0>
   3529   : InstVRRc<opcode, (outs VR128:$V1),
   3530              (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5),
   3531              mnemonic#"\t$V1, $V2, $V3, $M4, $M5", []> {
   3532   let M6 = m6;
   3533 }
   3534 
   3535 // Declare a pair of instructions, one which sets CC and one which doesn't.
   3536 // The CC-setting form ends with "S" and sets the low bit of M5.
   3537 multiclass BinaryVRRcSPair<string mnemonic, bits<16> opcode,
   3538                            SDPatternOperator operator,
   3539                            SDPatternOperator operator_cc, TypedReg tr1,
   3540                            TypedReg tr2, bits<4> type, bits<4> m5,
   3541                            bits<4> modifier = 0> {
   3542   def "" : BinaryVRRc<mnemonic, opcode, operator, tr1, tr2, type,
   3543                       m5, !and (modifier, 14)>;
   3544   let Defs = [CC] in
   3545     def S : BinaryVRRc<mnemonic##"s", opcode, operator_cc, tr1, tr2, type,
   3546                        m5, !add (!and (modifier, 14), 1)>;
   3547 }
   3548 
   3549 class BinaryVRRcSPairFloatGeneric<string mnemonic, bits<16> opcode>
   3550   : InstVRRc<opcode, (outs VR128:$V1),
   3551              (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5,
   3552                   imm32zx4:$M6),
   3553              mnemonic#"\t$V1, $V2, $V3, $M4, $M5, $M6", []>;
   3554 
   3555 class BinaryVRRf<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3556                  TypedReg tr>
   3557   : InstVRRf<opcode, (outs tr.op:$V1), (ins GR64:$R2, GR64:$R3),
   3558              mnemonic#"\t$V1, $R2, $R3",
   3559              [(set (tr.vt tr.op:$V1), (operator GR64:$R2, GR64:$R3))]>;
   3560 
   3561 class BinaryVRRi<string mnemonic, bits<16> opcode, RegisterOperand cls>
   3562   : InstVRRi<opcode, (outs cls:$R1), (ins VR128:$V2, imm32zx4:$M3),
   3563              mnemonic#"\t$R1, $V2, $M3", []>;
   3564 
   3565 class BinaryVRSa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3566                  TypedReg tr1, TypedReg tr2, bits<4> type>
   3567   : InstVRSa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V3, shift12only:$BD2),
   3568              mnemonic#"\t$V1, $V3, $BD2",
   3569              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V3),
   3570                                                   shift12only:$BD2))]> {
   3571   let M4 = type;
   3572 }
   3573 
   3574 class BinaryVRSaGeneric<string mnemonic, bits<16> opcode>
   3575   : InstVRSa<opcode, (outs VR128:$V1),
   3576              (ins VR128:$V3, shift12only:$BD2, imm32zx4:$M4),
   3577              mnemonic#"\t$V1, $V3, $BD2, $M4", []>;
   3578 
   3579 class BinaryVRSb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3580                  bits<5> bytes>
   3581   : InstVRSb<opcode, (outs VR128:$V1), (ins GR32:$R3, bdaddr12only:$BD2),
   3582              mnemonic#"\t$V1, $R3, $BD2",
   3583              [(set VR128:$V1, (operator GR32:$R3, bdaddr12only:$BD2))]> {
   3584   let M4 = 0;
   3585   let mayLoad = 1;
   3586   let AccessBytes = bytes;
   3587 }
   3588 
   3589 class BinaryVRSc<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3590                  TypedReg tr, bits<4> type>
   3591   : InstVRSc<opcode, (outs GR64:$R1), (ins tr.op:$V3, shift12only:$BD2),
   3592            mnemonic#"\t$R1, $V3, $BD2",
   3593            [(set GR64:$R1, (operator (tr.vt tr.op:$V3), shift12only:$BD2))]> {
   3594   let M4 = type;
   3595 }
   3596 
   3597 class BinaryVRScGeneric<string mnemonic, bits<16> opcode>
   3598   : InstVRSc<opcode, (outs GR64:$R1),
   3599              (ins VR128:$V3, shift12only:$BD2, imm32zx4: $M4),
   3600              mnemonic#"\t$R1, $V3, $BD2, $M4", []>;
   3601 
   3602 class BinaryVRSd<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3603                  bits<5> bytes>
   3604   : InstVRSd<opcode, (outs VR128:$V1), (ins GR32:$R3, bdaddr12only:$BD2),
   3605              mnemonic#"\t$V1, $R3, $BD2",
   3606              [(set VR128:$V1, (operator GR32:$R3, bdaddr12only:$BD2))]> {
   3607   let mayLoad = 1;
   3608   let AccessBytes = bytes;
   3609 }
   3610 
   3611 class BinaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3612                 TypedReg tr, bits<5> bytes>
   3613   : InstVRX<opcode, (outs VR128:$V1), (ins bdxaddr12only:$XBD2, imm32zx4:$M3),
   3614             mnemonic#"\t$V1, $XBD2, $M3",
   3615             [(set (tr.vt tr.op:$V1), (operator bdxaddr12only:$XBD2,
   3616                                                imm32zx4:$M3))]> {
   3617   let mayLoad = 1;
   3618   let AccessBytes = bytes;
   3619 }
   3620 
   3621 class StoreBinaryRS<string mnemonic, bits<8> opcode, RegisterOperand cls,
   3622                     bits<5> bytes, AddressingMode mode = bdaddr12only>
   3623   : InstRSb<opcode, (outs), (ins cls:$R1, imm32zx4:$M3, mode:$BD2),
   3624             mnemonic#"\t$R1, $M3, $BD2", []> {
   3625   let mayStore = 1;
   3626   let AccessBytes = bytes;
   3627 }
   3628 
   3629 class StoreBinaryRSY<string mnemonic, bits<16> opcode, RegisterOperand cls,
   3630                      bits<5> bytes, AddressingMode mode = bdaddr20only>
   3631   : InstRSYb<opcode, (outs), (ins cls:$R1, imm32zx4:$M3, mode:$BD2),
   3632              mnemonic#"\t$R1, $M3, $BD2", []> {
   3633   let mayStore = 1;
   3634   let AccessBytes = bytes;
   3635 }
   3636 
   3637 multiclass StoreBinaryRSPair<string mnemonic, bits<8> rsOpcode,
   3638                              bits<16> rsyOpcode, RegisterOperand cls,
   3639                              bits<5> bytes> {
   3640   let DispKey = mnemonic ## #cls in {
   3641     let DispSize = "12" in
   3642       def "" : StoreBinaryRS<mnemonic, rsOpcode, cls, bytes, bdaddr12pair>;
   3643     let DispSize = "20" in
   3644       def Y  : StoreBinaryRSY<mnemonic#"y", rsyOpcode, cls, bytes,
   3645                               bdaddr20pair>;
   3646   }
   3647 }
   3648 
   3649 class StoreBinaryRSL<string mnemonic, bits<16> opcode, RegisterOperand cls>
   3650   : InstRSLb<opcode, (outs),
   3651              (ins cls:$R1, bdladdr12onlylen8:$BDL2, imm32zx4:$M3),
   3652              mnemonic#"\t$R1, $BDL2, $M3", []> {
   3653   let mayStore = 1;
   3654 }
   3655 
   3656 class BinaryVSI<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3657                 bits<5> bytes>
   3658   : InstVSI<opcode, (outs VR128:$V1), (ins bdaddr12only:$BD2, imm32zx8:$I3),
   3659             mnemonic#"\t$V1, $BD2, $I3",
   3660             [(set VR128:$V1, (operator imm32zx8:$I3, bdaddr12only:$BD2))]> {
   3661   let mayLoad = 1;
   3662   let AccessBytes = bytes;
   3663 }
   3664 
   3665 class StoreBinaryVRV<string mnemonic, bits<16> opcode, bits<5> bytes,
   3666                      Immediate index>
   3667   : InstVRV<opcode, (outs), (ins VR128:$V1, bdvaddr12only:$VBD2, index:$M3),
   3668             mnemonic#"\t$V1, $VBD2, $M3", []> {
   3669   let mayStore = 1;
   3670   let AccessBytes = bytes;
   3671 }
   3672 
   3673 class StoreBinaryVRX<string mnemonic, bits<16> opcode,
   3674                      SDPatternOperator operator, TypedReg tr, bits<5> bytes,
   3675                      Immediate index>
   3676   : InstVRX<opcode, (outs), (ins tr.op:$V1, bdxaddr12only:$XBD2, index:$M3),
   3677             mnemonic#"\t$V1, $XBD2, $M3",
   3678             [(operator (tr.vt tr.op:$V1), bdxaddr12only:$XBD2, index:$M3)]> {
   3679   let mayStore = 1;
   3680   let AccessBytes = bytes;
   3681 }
   3682 
   3683 class MemoryBinarySSd<string mnemonic, bits<8> opcode,
   3684                       RegisterOperand cls>
   3685   : InstSSd<opcode, (outs),
   3686             (ins bdraddr12only:$RBD1, bdaddr12only:$BD2, cls:$R3),
   3687             mnemonic#"\t$RBD1, $BD2, $R3", []>;
   3688 
   3689 class CompareRR<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   3690                 RegisterOperand cls1, RegisterOperand cls2>
   3691   : InstRR<opcode, (outs), (ins cls1:$R1, cls2:$R2),
   3692            mnemonic#"\t$R1, $R2",
   3693            [(set CC, (operator cls1:$R1, cls2:$R2))]> {
   3694   let OpKey = mnemonic#cls1;
   3695   let OpType = "reg";
   3696   let isCompare = 1;
   3697 }
   3698 
   3699 class CompareRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3700                  RegisterOperand cls1, RegisterOperand cls2>
   3701   : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2),
   3702             mnemonic#"\t$R1, $R2",
   3703             [(set CC, (operator cls1:$R1, cls2:$R2))]> {
   3704   let OpKey = mnemonic#cls1;
   3705   let OpType = "reg";
   3706   let isCompare = 1;
   3707 }
   3708 
   3709 class CompareRI<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   3710                 RegisterOperand cls, Immediate imm>
   3711   : InstRIa<opcode, (outs), (ins cls:$R1, imm:$I2),
   3712             mnemonic#"\t$R1, $I2",
   3713             [(set CC, (operator cls:$R1, imm:$I2))]> {
   3714   let isCompare = 1;
   3715 }
   3716 
   3717 class CompareRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   3718                  RegisterOperand cls, Immediate imm>
   3719   : InstRILa<opcode, (outs), (ins cls:$R1, imm:$I2),
   3720              mnemonic#"\t$R1, $I2",
   3721              [(set CC, (operator cls:$R1, imm:$I2))]> {
   3722   let isCompare = 1;
   3723 }
   3724 
   3725 class CompareRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator,
   3726                    RegisterOperand cls, SDPatternOperator load>
   3727   : InstRILb<opcode, (outs), (ins cls:$R1, pcrel32:$RI2),
   3728              mnemonic#"\t$R1, $RI2",
   3729              [(set CC, (operator cls:$R1, (load pcrel32:$RI2)))]> {
   3730   let isCompare = 1;
   3731   let mayLoad = 1;
   3732   // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
   3733   // However, BDXs have two extra operands and are therefore 6 units more
   3734   // complex.
   3735   let AddedComplexity = 7;
   3736 }
   3737 
   3738 class CompareRX<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   3739                 RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
   3740                 AddressingMode mode = bdxaddr12only>
   3741   : InstRXa<opcode, (outs), (ins cls:$R1, mode:$XBD2),
   3742             mnemonic#"\t$R1, $XBD2",
   3743             [(set CC, (operator cls:$R1, (load mode:$XBD2)))]> {
   3744   let OpKey = mnemonic#"r"#cls;
   3745   let OpType = "mem";
   3746   let isCompare = 1;
   3747   let mayLoad = 1;
   3748   let AccessBytes = bytes;
   3749 }
   3750 
   3751 class CompareRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3752                  RegisterOperand cls, SDPatternOperator load, bits<5> bytes>
   3753   : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2),
   3754             mnemonic#"\t$R1, $XBD2",
   3755             [(set CC, (operator cls:$R1, (load bdxaddr12only:$XBD2)))]> {
   3756   let OpKey = mnemonic#"r"#cls;
   3757   let OpType = "mem";
   3758   let isCompare = 1;
   3759   let mayLoad = 1;
   3760   let AccessBytes = bytes;
   3761   let M3 = 0;
   3762 }
   3763 
   3764 class CompareRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3765                  RegisterOperand cls, SDPatternOperator load, bits<5> bytes,
   3766                  AddressingMode mode = bdxaddr20only>
   3767   : InstRXYa<opcode, (outs), (ins cls:$R1, mode:$XBD2),
   3768              mnemonic#"\t$R1, $XBD2",
   3769              [(set CC, (operator cls:$R1, (load mode:$XBD2)))]> {
   3770   let OpKey = mnemonic#"r"#cls;
   3771   let OpType = "mem";
   3772   let isCompare = 1;
   3773   let mayLoad = 1;
   3774   let AccessBytes = bytes;
   3775 }
   3776 
   3777 multiclass CompareRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode,
   3778                          SDPatternOperator operator, RegisterOperand cls,
   3779                          SDPatternOperator load, bits<5> bytes> {
   3780   let DispKey = mnemonic ## #cls in {
   3781     let DispSize = "12" in
   3782       def "" : CompareRX<mnemonic, rxOpcode, operator, cls,
   3783                          load, bytes, bdxaddr12pair>;
   3784     let DispSize = "20" in
   3785       def Y  : CompareRXY<mnemonic#"y", rxyOpcode, operator, cls,
   3786                           load, bytes, bdxaddr20pair>;
   3787   }
   3788 }
   3789 
   3790 class CompareRS<string mnemonic, bits<8> opcode, RegisterOperand cls,
   3791                 bits<5> bytes, AddressingMode mode = bdaddr12only>
   3792   : InstRSb<opcode, (outs), (ins cls:$R1, imm32zx4:$M3, mode:$BD2),
   3793             mnemonic#"\t$R1, $M3, $BD2", []> {
   3794   let mayLoad = 1;
   3795   let AccessBytes = bytes;
   3796 }
   3797 
   3798 class CompareRSY<string mnemonic, bits<16> opcode, RegisterOperand cls,
   3799                  bits<5> bytes, AddressingMode mode = bdaddr20only>
   3800   : InstRSYb<opcode, (outs), (ins cls:$R1, imm32zx4:$M3, mode:$BD2),
   3801              mnemonic#"\t$R1, $M3, $BD2", []> {
   3802   let mayLoad = 1;
   3803   let AccessBytes = bytes;
   3804 }
   3805 
   3806 multiclass CompareRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode,
   3807                          RegisterOperand cls, bits<5> bytes> {
   3808   let DispKey = mnemonic ## #cls in {
   3809     let DispSize = "12" in
   3810       def "" : CompareRS<mnemonic, rsOpcode, cls, bytes, bdaddr12pair>;
   3811     let DispSize = "20" in
   3812       def Y  : CompareRSY<mnemonic#"y", rsyOpcode, cls, bytes, bdaddr20pair>;
   3813   }
   3814 }
   3815 
   3816 class CompareSSb<string mnemonic, bits<8> opcode>
   3817   : InstSSb<opcode,
   3818             (outs), (ins bdladdr12onlylen4:$BDL1, bdladdr12onlylen4:$BDL2),
   3819             mnemonic##"\t$BDL1, $BDL2", []> {
   3820   let isCompare = 1;
   3821   let mayLoad = 1;
   3822 }
   3823 
   3824 class CompareSI<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   3825                 SDPatternOperator load, Immediate imm,
   3826                 AddressingMode mode = bdaddr12only>
   3827   : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2),
   3828            mnemonic#"\t$BD1, $I2",
   3829            [(set CC, (operator (load mode:$BD1), imm:$I2))]> {
   3830   let isCompare = 1;
   3831   let mayLoad = 1;
   3832 }
   3833 
   3834 class CompareSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3835                  SDPatternOperator load, Immediate imm>
   3836   : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
   3837             mnemonic#"\t$BD1, $I2",
   3838             [(set CC, (operator (load bdaddr12only:$BD1), imm:$I2))]> {
   3839   let isCompare = 1;
   3840   let mayLoad = 1;
   3841 }
   3842 
   3843 class CompareSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3844                  SDPatternOperator load, Immediate imm,
   3845                  AddressingMode mode = bdaddr20only>
   3846   : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2),
   3847             mnemonic#"\t$BD1, $I2",
   3848             [(set CC, (operator (load mode:$BD1), imm:$I2))]> {
   3849   let isCompare = 1;
   3850   let mayLoad = 1;
   3851 }
   3852 
   3853 multiclass CompareSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode,
   3854                          SDPatternOperator operator, SDPatternOperator load,
   3855                          Immediate imm> {
   3856   let DispKey = mnemonic in {
   3857     let DispSize = "12" in
   3858       def "" : CompareSI<mnemonic, siOpcode, operator, load, imm, bdaddr12pair>;
   3859     let DispSize = "20" in
   3860       def Y  : CompareSIY<mnemonic#"y", siyOpcode, operator, load, imm,
   3861                           bdaddr20pair>;
   3862   }
   3863 }
   3864 
   3865 class CompareVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3866                   TypedReg tr, bits<4> type>
   3867   : InstVRRa<opcode, (outs), (ins tr.op:$V1, tr.op:$V2),
   3868              mnemonic#"\t$V1, $V2",
   3869              [(set CC, (operator (tr.vt tr.op:$V1), (tr.vt tr.op:$V2)))]> {
   3870   let isCompare = 1;
   3871   let M3 = type;
   3872   let M4 = 0;
   3873   let M5 = 0;
   3874 }
   3875 
   3876 class CompareVRRaGeneric<string mnemonic, bits<16> opcode>
   3877   : InstVRRa<opcode, (outs), (ins VR128:$V1, VR128:$V2, imm32zx4:$M3),
   3878              mnemonic#"\t$V1, $V2, $M3", []> {
   3879   let isCompare = 1;
   3880   let M4 = 0;
   3881   let M5 = 0;
   3882 }
   3883 
   3884 class CompareVRRaFloatGeneric<string mnemonic, bits<16> opcode>
   3885   : InstVRRa<opcode, (outs),
   3886              (ins VR64:$V1, VR64:$V2, imm32zx4:$M3, imm32zx4:$M4),
   3887              mnemonic#"\t$V1, $V2, $M3, $M4", []> {
   3888   let isCompare = 1;
   3889   let M5 = 0;
   3890 }
   3891 
   3892 class CompareVRRh<string mnemonic, bits<16> opcode>
   3893   : InstVRRh<opcode, (outs), (ins VR128:$V1, VR128:$V2, imm32zx4:$M3),
   3894              mnemonic#"\t$V1, $V2, $M3", []> {
   3895   let isCompare = 1;
   3896 }
   3897 
   3898 class TestInherentS<string mnemonic, bits<16> opcode,
   3899                     SDPatternOperator operator>
   3900   : InstS<opcode, (outs), (ins), mnemonic, [(set CC, (operator))]> {
   3901   let BD2 = 0;
   3902 }
   3903 
   3904 class TestRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   3905               RegisterOperand cls>
   3906   : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2),
   3907             mnemonic#"\t$R1, $XBD2",
   3908             [(set CC, (operator cls:$R1, bdxaddr12only:$XBD2))]> {
   3909   let M3 = 0;
   3910 }
   3911 
   3912 class TestBinarySIL<string mnemonic, bits<16> opcode,
   3913                     SDPatternOperator operator, Immediate imm>
   3914   : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2),
   3915             mnemonic#"\t$BD1, $I2",
   3916             [(set CC, (operator bdaddr12only:$BD1, imm:$I2))]>;
   3917 
   3918 class TestRSL<string mnemonic, bits<16> opcode>
   3919   : InstRSLa<opcode, (outs), (ins bdladdr12onlylen4:$BDL1),
   3920              mnemonic#"\t$BDL1", []> {
   3921   let mayLoad = 1;
   3922 }
   3923 
   3924 class TestVRRg<string mnemonic, bits<16> opcode>
   3925   : InstVRRg<opcode, (outs), (ins VR128:$V1),
   3926              mnemonic#"\t$V1", []>;
   3927 
   3928 class SideEffectTernarySSc<string mnemonic, bits<8> opcode>
   3929   : InstSSc<opcode, (outs), (ins bdladdr12onlylen4:$BDL1,
   3930                                  shift12only:$BD2, imm32zx4:$I3),
   3931             mnemonic##"\t$BDL1, $BD2, $I3", []>;
   3932 
   3933 class SideEffectTernaryRRFa<string mnemonic, bits<16> opcode,
   3934                             RegisterOperand cls1, RegisterOperand cls2,
   3935                             RegisterOperand cls3>
   3936   : InstRRFa<opcode, (outs), (ins cls1:$R1, cls2:$R2, cls3:$R3),
   3937              mnemonic#"\t$R1, $R2, $R3", []> {
   3938   let M4 = 0;
   3939 }
   3940 
   3941 class SideEffectTernaryRRFb<string mnemonic, bits<16> opcode,
   3942                             RegisterOperand cls1, RegisterOperand cls2,
   3943                             RegisterOperand cls3>
   3944   : InstRRFb<opcode, (outs), (ins cls1:$R1, cls2:$R2, cls3:$R3),
   3945              mnemonic#"\t$R1, $R3, $R2", []> {
   3946   let M4 = 0;
   3947 }
   3948 
   3949 class SideEffectTernaryMemMemMemRRFb<string mnemonic, bits<16> opcode,
   3950                                      RegisterOperand cls1,
   3951                                      RegisterOperand cls2,
   3952                                      RegisterOperand cls3>
   3953   : InstRRFb<opcode, (outs cls1:$R1, cls2:$R2, cls3:$R3),
   3954              (ins cls1:$R1src, cls2:$R2src, cls3:$R3src),
   3955              mnemonic#"\t$R1, $R3, $R2", []> {
   3956   let Constraints = "$R1 = $R1src, $R2 = $R2src, $R3 = $R3src";
   3957   let DisableEncoding = "$R1src, $R2src, $R3src";
   3958   let M4 = 0;
   3959 }
   3960 
   3961 class SideEffectTernaryRRFc<string mnemonic, bits<16> opcode,
   3962                             RegisterOperand cls1, RegisterOperand cls2,
   3963                             Immediate imm>
   3964   : InstRRFc<opcode, (outs), (ins cls1:$R1, cls2:$R2, imm:$M3),
   3965              mnemonic#"\t$R1, $R2, $M3", []>;
   3966 
   3967 multiclass SideEffectTernaryRRFcOpt<string mnemonic, bits<16> opcode,
   3968                                     RegisterOperand cls1,
   3969                                     RegisterOperand cls2> {
   3970   def "" : SideEffectTernaryRRFc<mnemonic, opcode, cls1, cls2, imm32zx4>;
   3971   def Opt : SideEffectBinaryRRFc<mnemonic, opcode, cls1, cls2>;
   3972 }
   3973 
   3974 class SideEffectTernaryMemMemRRFc<string mnemonic, bits<16> opcode,
   3975                                   RegisterOperand cls1, RegisterOperand cls2,
   3976                                   Immediate imm>
   3977   : InstRRFc<opcode, (outs cls1:$R1, cls2:$R2),
   3978              (ins cls1:$R1src, cls2:$R2src, imm:$M3),
   3979              mnemonic#"\t$R1, $R2, $M3", []> {
   3980   let Constraints = "$R1 = $R1src, $R2 = $R2src";
   3981   let DisableEncoding = "$R1src, $R2src";
   3982 }
   3983 
   3984 multiclass SideEffectTernaryMemMemRRFcOpt<string mnemonic, bits<16> opcode,
   3985                                           RegisterOperand cls1,
   3986                                           RegisterOperand cls2> {
   3987   def "" : SideEffectTernaryMemMemRRFc<mnemonic, opcode, cls1, cls2, imm32zx4>;
   3988   def Opt : SideEffectBinaryMemMemRRFc<mnemonic, opcode, cls1, cls2>;
   3989 }
   3990 
   3991 class SideEffectTernarySSF<string mnemonic, bits<12> opcode,
   3992                            RegisterOperand cls>
   3993   : InstSSF<opcode, (outs),
   3994             (ins bdaddr12only:$BD1, bdaddr12only:$BD2, cls:$R3),
   3995             mnemonic#"\t$BD1, $BD2, $R3", []>;
   3996 
   3997 class TernaryRRFa<string mnemonic, bits<16> opcode,
   3998                  RegisterOperand cls1, RegisterOperand cls2,
   3999                  RegisterOperand cls3>
   4000   : InstRRFa<opcode, (outs cls1:$R1), (ins cls2:$R2, cls3:$R3, imm32zx4:$M4),
   4001              mnemonic#"\t$R1, $R2, $R3, $M4", []>;
   4002 
   4003 class TernaryRRFb<string mnemonic, bits<16> opcode,
   4004                   RegisterOperand cls1, RegisterOperand cls2,
   4005                   RegisterOperand cls3>
   4006   : InstRRFb<opcode, (outs cls1:$R1, cls3:$R3),
   4007              (ins cls1:$R1src, cls2:$R2, imm32zx4:$M4),
   4008              mnemonic#"\t$R1, $R3, $R2, $M4", []> {
   4009   let Constraints = "$R1 = $R1src";
   4010   let DisableEncoding = "$R1src";
   4011 }
   4012 
   4013 class TernaryRRFe<string mnemonic, bits<16> opcode, RegisterOperand cls1,
   4014                   RegisterOperand cls2>
   4015   : InstRRFe<opcode, (outs cls1:$R1),
   4016              (ins imm32zx4:$M3, cls2:$R2, imm32zx4:$M4),
   4017              mnemonic#"\t$R1, $M3, $R2, $M4", []>;
   4018 
   4019 class TernaryRRD<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4020                  RegisterOperand cls1, RegisterOperand cls2>
   4021   : InstRRD<opcode, (outs cls1:$R1), (ins cls2:$R1src, cls2:$R3, cls2:$R2),
   4022             mnemonic#"\t$R1, $R3, $R2",
   4023             [(set cls1:$R1, (operator cls2:$R1src, cls2:$R3, cls2:$R2))]> {
   4024   let OpKey = mnemonic#cls;
   4025   let OpType = "reg";
   4026   let Constraints = "$R1 = $R1src";
   4027   let DisableEncoding = "$R1src";
   4028 }
   4029 
   4030 class TernaryRS<string mnemonic, bits<8> opcode, RegisterOperand cls,
   4031                 bits<5> bytes, AddressingMode mode = bdaddr12only>
   4032   : InstRSb<opcode, (outs cls:$R1),
   4033             (ins cls:$R1src, imm32zx4:$M3, mode:$BD2),
   4034             mnemonic#"\t$R1, $M3, $BD2", []> {
   4035 
   4036   let Constraints = "$R1 = $R1src";
   4037   let DisableEncoding = "$R1src";
   4038   let mayLoad = 1;
   4039   let AccessBytes = bytes;
   4040 }
   4041 
   4042 class TernaryRSY<string mnemonic, bits<16> opcode, RegisterOperand cls,
   4043                 bits<5> bytes, AddressingMode mode = bdaddr20only>
   4044   : InstRSYb<opcode, (outs cls:$R1),
   4045              (ins cls:$R1src, imm32zx4:$M3, mode:$BD2),
   4046              mnemonic#"\t$R1, $M3, $BD2", []> {
   4047 
   4048   let Constraints = "$R1 = $R1src";
   4049   let DisableEncoding = "$R1src";
   4050   let mayLoad = 1;
   4051   let AccessBytes = bytes;
   4052 }
   4053 
   4054 multiclass TernaryRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode,
   4055                          RegisterOperand cls, bits<5> bytes> {
   4056   let DispKey = mnemonic ## #cls in {
   4057     let DispSize = "12" in
   4058       def "" : TernaryRS<mnemonic, rsOpcode, cls, bytes, bdaddr12pair>;
   4059     let DispSize = "20" in
   4060       def Y  : TernaryRSY<mnemonic#"y", rsyOpcode, cls, bytes, bdaddr20pair>;
   4061   }
   4062 }
   4063 
   4064 class SideEffectTernaryRS<string mnemonic, bits<8> opcode,
   4065                           RegisterOperand cls1, RegisterOperand cls2>
   4066   : InstRSa<opcode, (outs),
   4067             (ins cls1:$R1, cls2:$R3, bdaddr12only:$BD2),
   4068             mnemonic#"\t$R1, $R3, $BD2", []>;
   4069 
   4070 class SideEffectTernaryRSY<string mnemonic, bits<16> opcode,
   4071                            RegisterOperand cls1, RegisterOperand cls2>
   4072   : InstRSYa<opcode, (outs),
   4073              (ins cls1:$R1, cls2:$R3, bdaddr20only:$BD2),
   4074              mnemonic#"\t$R1, $R3, $BD2", []>;
   4075 
   4076 class SideEffectTernaryMemMemRS<string mnemonic, bits<8> opcode,
   4077                                 RegisterOperand cls1, RegisterOperand cls2>
   4078   : InstRSa<opcode, (outs cls1:$R1, cls2:$R3),
   4079             (ins cls1:$R1src, cls2:$R3src, shift12only:$BD2),
   4080             mnemonic#"\t$R1, $R3, $BD2", []> {
   4081     let Constraints = "$R1 = $R1src, $R3 = $R3src";
   4082     let DisableEncoding = "$R1src, $R3src";
   4083 }
   4084 
   4085 class SideEffectTernaryMemMemRSY<string mnemonic, bits<16> opcode,
   4086                                  RegisterOperand cls1, RegisterOperand cls2>
   4087   : InstRSYa<opcode, (outs cls1:$R1, cls2:$R3),
   4088              (ins cls1:$R1src, cls2:$R3src, shift20only:$BD2),
   4089              mnemonic#"\t$R1, $R3, $BD2", []> {
   4090     let Constraints = "$R1 = $R1src, $R3 = $R3src";
   4091     let DisableEncoding = "$R1src, $R3src";
   4092 }
   4093 
   4094 class TernaryRXF<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4095                  RegisterOperand cls1, RegisterOperand cls2,
   4096                  SDPatternOperator load, bits<5> bytes>
   4097   : InstRXF<opcode, (outs cls1:$R1),
   4098             (ins cls2:$R1src, cls2:$R3, bdxaddr12only:$XBD2),
   4099             mnemonic#"\t$R1, $R3, $XBD2",
   4100             [(set cls1:$R1, (operator cls2:$R1src, cls2:$R3,
   4101                                       (load bdxaddr12only:$XBD2)))]> {
   4102   let OpKey = mnemonic#"r"#cls;
   4103   let OpType = "mem";
   4104   let Constraints = "$R1 = $R1src";
   4105   let DisableEncoding = "$R1src";
   4106   let mayLoad = 1;
   4107   let AccessBytes = bytes;
   4108 }
   4109 
   4110 class TernaryVRIa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4111                   TypedReg tr1, TypedReg tr2, Immediate imm, Immediate index>
   4112   : InstVRIa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V1src, imm:$I2, index:$M3),
   4113              mnemonic#"\t$V1, $I2, $M3",
   4114              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src),
   4115                                                   imm:$I2, index:$M3))]> {
   4116   let Constraints = "$V1 = $V1src";
   4117   let DisableEncoding = "$V1src";
   4118 }
   4119 
   4120 class TernaryVRId<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4121                   TypedReg tr1, TypedReg tr2, bits<4> type>
   4122   : InstVRId<opcode, (outs tr1.op:$V1),
   4123              (ins tr2.op:$V2, tr2.op:$V3, imm32zx8:$I4),
   4124              mnemonic#"\t$V1, $V2, $V3, $I4",
   4125              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   4126                                                   (tr2.vt tr2.op:$V3),
   4127                                                   imm32zx8:$I4))]> {
   4128   let M5 = type;
   4129 }
   4130 
   4131 class TernaryVRIi<string mnemonic, bits<16> opcode, RegisterOperand cls>
   4132   : InstVRIi<opcode, (outs VR128:$V1),
   4133              (ins cls:$R2, imm32zx8:$I3, imm32zx4:$M4),
   4134              mnemonic#"\t$V1, $R2, $I3, $M4", []>;
   4135 
   4136 class TernaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4137                   TypedReg tr1, TypedReg tr2, bits<4> type, bits<4> m4or>
   4138   : InstVRRa<opcode, (outs tr1.op:$V1),
   4139              (ins tr2.op:$V2, imm32zx4:$M4, imm32zx4:$M5),
   4140              mnemonic#"\t$V1, $V2, $M4, $M5",
   4141              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   4142                                                   imm32zx4:$M4,
   4143                                                   imm32zx4:$M5))],
   4144              m4or> {
   4145   let M3 = type;
   4146 }
   4147 
   4148 class TernaryVRRaFloatGeneric<string mnemonic, bits<16> opcode>
   4149   : InstVRRa<opcode, (outs VR128:$V1),
   4150              (ins VR128:$V2, imm32zx4:$M3, imm32zx4:$M4, imm32zx4:$M5),
   4151              mnemonic#"\t$V1, $V2, $M3, $M4, $M5", []>;
   4152 
   4153 class TernaryVRRb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4154                   TypedReg tr1, TypedReg tr2, bits<4> type,
   4155                   SDPatternOperator m5mask, bits<4> m5or>
   4156   : InstVRRb<opcode, (outs tr1.op:$V1),
   4157              (ins tr2.op:$V2, tr2.op:$V3, m5mask:$M5),
   4158              mnemonic#"\t$V1, $V2, $V3, $M5",
   4159              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   4160                                                   (tr2.vt tr2.op:$V3),
   4161                                                   m5mask:$M5))],
   4162              m5or> {
   4163   let M4 = type;
   4164 }
   4165 
   4166 // Declare a pair of instructions, one which sets CC and one which doesn't.
   4167 // The CC-setting form ends with "S" and sets the low bit of M5.
   4168 // Also create aliases to make use of M5 operand optional in assembler.
   4169 multiclass TernaryOptVRRbSPair<string mnemonic, bits<16> opcode,
   4170                                SDPatternOperator operator,
   4171                                SDPatternOperator operator_cc,
   4172                                TypedReg tr1, TypedReg tr2, bits<4> type,
   4173                                bits<4> modifier = 0> {
   4174   def "" : TernaryVRRb<mnemonic, opcode, operator, tr1, tr2, type,
   4175                        imm32zx4even, !and (modifier, 14)>;
   4176   def : InstAlias<mnemonic#"\t$V1, $V2, $V3",
   4177                   (!cast<Instruction>(NAME) tr1.op:$V1, tr2.op:$V2,
   4178                                             tr2.op:$V3, 0)>;
   4179   let Defs = [CC] in
   4180     def S : TernaryVRRb<mnemonic##"s", opcode, operator_cc, tr1, tr2, type,
   4181                         imm32zx4even, !add(!and (modifier, 14), 1)>;
   4182   def : InstAlias<mnemonic#"s\t$V1, $V2, $V3",
   4183                   (!cast<Instruction>(NAME#"S") tr1.op:$V1, tr2.op:$V2,
   4184                                                 tr2.op:$V3, 0)>;
   4185 }
   4186 
   4187 multiclass TernaryOptVRRbSPairGeneric<string mnemonic, bits<16> opcode> {
   4188   def "" : InstVRRb<opcode, (outs VR128:$V1),
   4189                    (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5),
   4190                    mnemonic#"\t$V1, $V2, $V3, $M4, $M5", []>;
   4191   def : InstAlias<mnemonic#"\t$V1, $V2, $V3, $M4",
   4192                   (!cast<Instruction>(NAME) VR128:$V1, VR128:$V2, VR128:$V3,
   4193                                             imm32zx4:$M4, 0)>;
   4194 }
   4195 
   4196 class TernaryVRRc<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4197                   TypedReg tr1, TypedReg tr2>
   4198   : InstVRRc<opcode, (outs tr1.op:$V1),
   4199              (ins tr2.op:$V2, tr2.op:$V3, imm32zx4:$M4),
   4200              mnemonic#"\t$V1, $V2, $V3, $M4",
   4201              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   4202                                                   (tr2.vt tr2.op:$V3),
   4203                                                   imm32zx4:$M4))]> {
   4204   let M5 = 0;
   4205   let M6 = 0;
   4206 }
   4207 
   4208 class TernaryVRRcFloat<string mnemonic, bits<16> opcode,
   4209                        SDPatternOperator operator, TypedReg tr1, TypedReg tr2,
   4210                        bits<4> type = 0, bits<4> m5 = 0>
   4211   : InstVRRc<opcode, (outs tr1.op:$V1),
   4212              (ins tr2.op:$V2, tr2.op:$V3, imm32zx4:$M6),
   4213              mnemonic#"\t$V1, $V2, $V3, $M6",
   4214              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   4215                                                   (tr2.vt tr2.op:$V3),
   4216                                                   imm32zx4:$M6))]> {
   4217   let M4 = type;
   4218   let M5 = m5;
   4219 }
   4220 
   4221 class TernaryVRRcFloatGeneric<string mnemonic, bits<16> opcode>
   4222   : InstVRRc<opcode, (outs VR128:$V1),
   4223              (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5,
   4224                   imm32zx4:$M6),
   4225              mnemonic#"\t$V1, $V2, $V3, $M4, $M5, $M6", []>;
   4226 
   4227 class TernaryVRRd<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4228                   TypedReg tr1, TypedReg tr2, bits<4> type = 0>
   4229   : InstVRRd<opcode, (outs tr1.op:$V1),
   4230              (ins tr2.op:$V2, tr2.op:$V3, tr1.op:$V4),
   4231              mnemonic#"\t$V1, $V2, $V3, $V4",
   4232              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   4233                                                   (tr2.vt tr2.op:$V3),
   4234                                                   (tr1.vt tr1.op:$V4)))]> {
   4235   let M5 = type;
   4236   let M6 = 0;
   4237 }
   4238 
   4239 class TernaryVRRdGeneric<string mnemonic, bits<16> opcode>
   4240   : InstVRRd<opcode, (outs VR128:$V1),
   4241              (ins VR128:$V2, VR128:$V3, VR128:$V4, imm32zx4:$M5),
   4242              mnemonic#"\t$V1, $V2, $V3, $V4, $M5", []> {
   4243   let M6 = 0;
   4244 }
   4245 
   4246 class TernaryVRRe<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4247                   TypedReg tr1, TypedReg tr2, bits<4> m5 = 0, bits<4> type = 0>
   4248   : InstVRRe<opcode, (outs tr1.op:$V1),
   4249              (ins tr2.op:$V2, tr2.op:$V3, tr1.op:$V4),
   4250              mnemonic#"\t$V1, $V2, $V3, $V4",
   4251              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   4252                                                   (tr2.vt tr2.op:$V3),
   4253                                                   (tr1.vt tr1.op:$V4)))]> {
   4254   let M5 = m5;
   4255   let M6 = type;
   4256 }
   4257 
   4258 class TernaryVRReFloatGeneric<string mnemonic, bits<16> opcode>
   4259   : InstVRRe<opcode, (outs VR128:$V1),
   4260              (ins VR128:$V2, VR128:$V3, VR128:$V4, imm32zx4:$M5, imm32zx4:$M6),
   4261              mnemonic#"\t$V1, $V2, $V3, $V4, $M5, $M6", []>;
   4262 
   4263 class TernaryVRSb<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4264                   TypedReg tr1, TypedReg tr2, RegisterOperand cls, bits<4> type>
   4265   : InstVRSb<opcode, (outs tr1.op:$V1),
   4266              (ins tr2.op:$V1src, cls:$R3, shift12only:$BD2),
   4267              mnemonic#"\t$V1, $R3, $BD2",
   4268              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src),
   4269                                                   cls:$R3,
   4270                                                   shift12only:$BD2))]> {
   4271   let Constraints = "$V1 = $V1src";
   4272   let DisableEncoding = "$V1src";
   4273   let M4 = type;
   4274 }
   4275 
   4276 class TernaryVRSbGeneric<string mnemonic, bits<16> opcode>
   4277   : InstVRSb<opcode, (outs VR128:$V1),
   4278              (ins VR128:$V1src, GR64:$R3, shift12only:$BD2, imm32zx4:$M4),
   4279              mnemonic#"\t$V1, $R3, $BD2, $M4", []> {
   4280   let Constraints = "$V1 = $V1src";
   4281   let DisableEncoding = "$V1src";
   4282 }
   4283 
   4284 class TernaryVRV<string mnemonic, bits<16> opcode, bits<5> bytes,
   4285                  Immediate index>
   4286   : InstVRV<opcode, (outs VR128:$V1),
   4287            (ins VR128:$V1src, bdvaddr12only:$VBD2, index:$M3),
   4288            mnemonic#"\t$V1, $VBD2, $M3", []> {
   4289   let Constraints = "$V1 = $V1src";
   4290   let DisableEncoding = "$V1src";
   4291   let mayLoad = 1;
   4292   let AccessBytes = bytes;
   4293 }
   4294 
   4295 class TernaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4296                  TypedReg tr1, TypedReg tr2, bits<5> bytes, Immediate index>
   4297   : InstVRX<opcode, (outs tr1.op:$V1),
   4298            (ins tr2.op:$V1src, bdxaddr12only:$XBD2, index:$M3),
   4299            mnemonic#"\t$V1, $XBD2, $M3",
   4300            [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src),
   4301                                                 bdxaddr12only:$XBD2,
   4302                                                 index:$M3))]> {
   4303   let Constraints = "$V1 = $V1src";
   4304   let DisableEncoding = "$V1src";
   4305   let mayLoad = 1;
   4306   let AccessBytes = bytes;
   4307 }
   4308 
   4309 class QuaternaryVRId<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4310                      TypedReg tr1, TypedReg tr2, bits<4> type>
   4311   : InstVRId<opcode, (outs tr1.op:$V1),
   4312              (ins tr2.op:$V1src, tr2.op:$V2, tr2.op:$V3, imm32zx8:$I4),
   4313              mnemonic#"\t$V1, $V2, $V3, $I4",
   4314              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src),
   4315                                                   (tr2.vt tr2.op:$V2),
   4316                                                   (tr2.vt tr2.op:$V3),
   4317                                                   imm32zx8:$I4))]> {
   4318   let Constraints = "$V1 = $V1src";
   4319   let DisableEncoding = "$V1src";
   4320   let M5 = type;
   4321 }
   4322 
   4323 class QuaternaryVRIdGeneric<string mnemonic, bits<16> opcode>
   4324   : InstVRId<opcode, (outs VR128:$V1),
   4325              (ins VR128:$V1src, VR128:$V2, VR128:$V3,
   4326                   imm32zx8:$I4, imm32zx4:$M5),
   4327              mnemonic#"\t$V1, $V2, $V3, $I4, $M5", []> {
   4328   let Constraints = "$V1 = $V1src";
   4329   let DisableEncoding = "$V1src";
   4330 }
   4331 
   4332 class QuaternaryVRIf<string mnemonic, bits<16> opcode>
   4333   : InstVRIf<opcode, (outs VR128:$V1),
   4334              (ins VR128:$V2, VR128:$V3,
   4335                   imm32zx8:$I4, imm32zx4:$M5),
   4336              mnemonic#"\t$V1, $V2, $V3, $I4, $M5", []>;
   4337 
   4338 class QuaternaryVRIg<string mnemonic, bits<16> opcode>
   4339   : InstVRIg<opcode, (outs VR128:$V1),
   4340              (ins VR128:$V2, imm32zx8:$I3,
   4341                   imm32zx8:$I4, imm32zx4:$M5),
   4342              mnemonic#"\t$V1, $V2, $I3, $I4, $M5", []>;
   4343 
   4344 class QuaternaryVRRd<string mnemonic, bits<16> opcode,
   4345                      SDPatternOperator operator, TypedReg tr1, TypedReg tr2,
   4346                      TypedReg tr3, TypedReg tr4, bits<4> type,
   4347                      SDPatternOperator m6mask = imm32zx4, bits<4> m6or = 0>
   4348   : InstVRRd<opcode, (outs tr1.op:$V1),
   4349              (ins tr2.op:$V2, tr3.op:$V3, tr4.op:$V4, m6mask:$M6),
   4350              mnemonic#"\t$V1, $V2, $V3, $V4, $M6",
   4351              [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2),
   4352                                                   (tr3.vt tr3.op:$V3),
   4353                                                   (tr4.vt tr4.op:$V4),
   4354                                                   m6mask:$M6))],
   4355              m6or> {
   4356   let M5 = type;
   4357 }
   4358 
   4359 class QuaternaryVRRdGeneric<string mnemonic, bits<16> opcode>
   4360   : InstVRRd<opcode, (outs VR128:$V1),
   4361              (ins VR128:$V2, VR128:$V3, VR128:$V4, imm32zx4:$M5, imm32zx4:$M6),
   4362              mnemonic#"\t$V1, $V2, $V3, $V4, $M5, $M6", []>;
   4363 
   4364 // Declare a pair of instructions, one which sets CC and one which doesn't.
   4365 // The CC-setting form ends with "S" and sets the low bit of M6.
   4366 // Also create aliases to make use of M6 operand optional in assembler.
   4367 multiclass QuaternaryOptVRRdSPair<string mnemonic, bits<16> opcode,
   4368                                   SDPatternOperator operator,
   4369                                 SDPatternOperator operator_cc,
   4370                                 TypedReg tr1, TypedReg tr2, bits<4> type,
   4371                                 bits<4> modifier = 0> {
   4372   def "" : QuaternaryVRRd<mnemonic, opcode, operator,
   4373                           tr1, tr2, tr2, tr2, type,
   4374                           imm32zx4even, !and (modifier, 14)>;
   4375   def : InstAlias<mnemonic#"\t$V1, $V2, $V3, $V4",
   4376                   (!cast<Instruction>(NAME) tr1.op:$V1, tr2.op:$V2,
   4377                                             tr2.op:$V3, tr2.op:$V4, 0)>;
   4378   let Defs = [CC] in
   4379     def S : QuaternaryVRRd<mnemonic##"s", opcode, operator_cc,
   4380                            tr1, tr2, tr2, tr2, type,
   4381                            imm32zx4even, !add (!and (modifier, 14), 1)>;
   4382   def : InstAlias<mnemonic#"s\t$V1, $V2, $V3, $V4",
   4383                   (!cast<Instruction>(NAME#"S") tr1.op:$V1, tr2.op:$V2,
   4384                                                 tr2.op:$V3, tr2.op:$V4, 0)>;
   4385 }
   4386 
   4387 multiclass QuaternaryOptVRRdSPairGeneric<string mnemonic, bits<16> opcode> {
   4388   def "" : QuaternaryVRRdGeneric<mnemonic, opcode>;
   4389   def : InstAlias<mnemonic#"\t$V1, $V2, $V3, $V4, $M5",
   4390                   (!cast<Instruction>(NAME) VR128:$V1, VR128:$V2, VR128:$V3,
   4391                                             VR128:$V4, imm32zx4:$M5, 0)>;
   4392 }
   4393 
   4394 class SideEffectQuaternaryRRFa<string mnemonic, bits<16> opcode,
   4395                                RegisterOperand cls1, RegisterOperand cls2,
   4396                                RegisterOperand cls3>
   4397   : InstRRFa<opcode, (outs), (ins cls1:$R1, cls2:$R2, cls3:$R3, imm32zx4:$M4),
   4398              mnemonic#"\t$R1, $R2, $R3, $M4", []>;
   4399 
   4400 multiclass SideEffectQuaternaryRRFaOptOpt<string mnemonic, bits<16> opcode,
   4401                                           RegisterOperand cls1,
   4402                                           RegisterOperand cls2,
   4403                                           RegisterOperand cls3> {
   4404   def "" : SideEffectQuaternaryRRFa<mnemonic, opcode, cls1, cls2, cls3>;
   4405   def Opt : SideEffectTernaryRRFa<mnemonic, opcode, cls1, cls2, cls3>;
   4406   def OptOpt : SideEffectBinaryRRFa<mnemonic, opcode, cls1, cls2>;
   4407 }
   4408 
   4409 class SideEffectQuaternaryRRFb<string mnemonic, bits<16> opcode,
   4410                                RegisterOperand cls1, RegisterOperand cls2,
   4411                                RegisterOperand cls3>
   4412   : InstRRFb<opcode, (outs), (ins cls1:$R1, cls2:$R2, cls3:$R3, imm32zx4:$M4),
   4413              mnemonic#"\t$R1, $R3, $R2, $M4", []>;
   4414 
   4415 multiclass SideEffectQuaternaryRRFbOpt<string mnemonic, bits<16> opcode,
   4416                                        RegisterOperand cls1,
   4417                                        RegisterOperand cls2,
   4418                                        RegisterOperand cls3> {
   4419   def "" : SideEffectQuaternaryRRFb<mnemonic, opcode, cls1, cls2, cls3>;
   4420   def Opt : SideEffectTernaryRRFb<mnemonic, opcode, cls1, cls2, cls3>;
   4421 }
   4422 
   4423 class SideEffectQuaternarySSe<string mnemonic, bits<8> opcode,
   4424                               RegisterOperand cls>
   4425   : InstSSe<opcode, (outs),
   4426             (ins cls:$R1, bdaddr12only:$BD2, cls:$R3, bdaddr12only:$BD4),
   4427             mnemonic#"\t$R1, $BD2, $R3, $BD4", []>;
   4428 
   4429 class LoadAndOpRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4430                   RegisterOperand cls, AddressingMode mode = bdaddr20only>
   4431   : InstRSYa<opcode, (outs cls:$R1), (ins cls:$R3, mode:$BD2),
   4432              mnemonic#"\t$R1, $R3, $BD2",
   4433              [(set cls:$R1, (operator mode:$BD2, cls:$R3))]> {
   4434   let mayLoad = 1;
   4435   let mayStore = 1;
   4436 }
   4437 
   4438 class CmpSwapRRE<string mnemonic, bits<16> opcode,
   4439                  RegisterOperand cls1, RegisterOperand cls2>
   4440   : InstRRE<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2),
   4441             mnemonic#"\t$R1, $R2", []> {
   4442   let Constraints = "$R1 = $R1src";
   4443   let DisableEncoding = "$R1src";
   4444   let mayLoad = 1;
   4445   let mayStore = 1;
   4446 }
   4447 
   4448 class CmpSwapRS<string mnemonic, bits<8> opcode, SDPatternOperator operator,
   4449                 RegisterOperand cls, AddressingMode mode = bdaddr12only>
   4450   : InstRSa<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
   4451             mnemonic#"\t$R1, $R3, $BD2",
   4452             [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
   4453   let Constraints = "$R1 = $R1src";
   4454   let DisableEncoding = "$R1src";
   4455   let mayLoad = 1;
   4456   let mayStore = 1;
   4457 }
   4458 
   4459 class CmpSwapRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator,
   4460                  RegisterOperand cls, AddressingMode mode = bdaddr20only>
   4461   : InstRSYa<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2),
   4462              mnemonic#"\t$R1, $R3, $BD2",
   4463              [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> {
   4464   let Constraints = "$R1 = $R1src";
   4465   let DisableEncoding = "$R1src";
   4466   let mayLoad = 1;
   4467   let mayStore = 1;
   4468 }
   4469 
   4470 multiclass CmpSwapRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode,
   4471                          SDPatternOperator operator, RegisterOperand cls> {
   4472   let DispKey = mnemonic ## #cls in {
   4473     let DispSize = "12" in
   4474       def "" : CmpSwapRS<mnemonic, rsOpcode, operator, cls, bdaddr12pair>;
   4475     let DispSize = "20" in
   4476       def Y  : CmpSwapRSY<mnemonic#"y", rsyOpcode, operator, cls, bdaddr20pair>;
   4477   }
   4478 }
   4479 
   4480 class RotateSelectRIEf<string mnemonic, bits<16> opcode, RegisterOperand cls1,
   4481                        RegisterOperand cls2>
   4482   : InstRIEf<opcode, (outs cls1:$R1),
   4483              (ins cls1:$R1src, cls2:$R2, imm32zx8:$I3, imm32zx8:$I4,
   4484                   imm32zx6:$I5),
   4485              mnemonic#"\t$R1, $R2, $I3, $I4, $I5", []> {
   4486   let Constraints = "$R1 = $R1src";
   4487   let DisableEncoding = "$R1src";
   4488 }
   4489 
   4490 class PrefetchRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator>
   4491   : InstRXYb<opcode, (outs), (ins imm32zx4:$M1, bdxaddr20only:$XBD2),
   4492              mnemonic##"\t$M1, $XBD2",
   4493              [(operator imm32zx4:$M1, bdxaddr20only:$XBD2)]>;
   4494 
   4495 class PrefetchRILPC<string mnemonic, bits<12> opcode,
   4496                     SDPatternOperator operator>
   4497   : InstRILc<opcode, (outs), (ins imm32zx4:$M1, pcrel32:$RI2),
   4498              mnemonic##"\t$M1, $RI2",
   4499              [(operator imm32zx4:$M1, pcrel32:$RI2)]> {
   4500   // We want PC-relative addresses to be tried ahead of BD and BDX addresses.
   4501   // However, BDXs have two extra operands and are therefore 6 units more
   4502   // complex.
   4503   let AddedComplexity = 7;
   4504 }
   4505 
   4506 class BranchPreloadSMI<string mnemonic, bits<8> opcode>
   4507   : InstSMI<opcode, (outs),
   4508             (ins imm32zx4:$M1, brtarget16bpp:$RI2, bdxaddr12only:$BD3),
   4509             mnemonic#"\t$M1, $RI2, $BD3", []>;
   4510 
   4511 class BranchPreloadMII<string mnemonic, bits<8> opcode>
   4512   : InstMII<opcode, (outs),
   4513             (ins imm32zx4:$M1, brtarget12bpp:$RI2, brtarget24bpp:$RI3),
   4514             mnemonic#"\t$M1, $RI2, $RI3", []>;
   4515 
   4516 // A floating-point load-and test operation.  Create both a normal unary
   4517 // operation and one that acts as a comparison against zero.
   4518 // Note that the comparison against zero operation is not available if we
   4519 // have vector support, since load-and-test instructions will partially
   4520 // clobber the target (vector) register.
   4521 multiclass LoadAndTestRRE<string mnemonic, bits<16> opcode,
   4522                           RegisterOperand cls> {
   4523   def "" : UnaryRRE<mnemonic, opcode, null_frag, cls, cls>;
   4524   let isCodeGenOnly = 1, Predicates = [FeatureNoVector] in
   4525     def Compare : CompareRRE<mnemonic, opcode, null_frag, cls, cls>;
   4526 }
   4527 
   4528 //===----------------------------------------------------------------------===//
   4529 // Pseudo instructions
   4530 //===----------------------------------------------------------------------===//
   4531 //
   4532 // Convenience instructions that get lowered to real instructions
   4533 // by either SystemZTargetLowering::EmitInstrWithCustomInserter()
   4534 // or SystemZInstrInfo::expandPostRAPseudo().
   4535 //
   4536 //===----------------------------------------------------------------------===//
   4537 
   4538 class Pseudo<dag outs, dag ins, list<dag> pattern>
   4539   : InstSystemZ<0, outs, ins, "", pattern> {
   4540   let isPseudo = 1;
   4541   let isCodeGenOnly = 1;
   4542 }
   4543 
   4544 // Like UnaryRI, but expanded after RA depending on the choice of register.
   4545 class UnaryRIPseudo<SDPatternOperator operator, RegisterOperand cls,
   4546                     Immediate imm>
   4547   : Pseudo<(outs cls:$R1), (ins imm:$I2),
   4548            [(set cls:$R1, (operator imm:$I2))]>;
   4549 
   4550 // Like UnaryRXY, but expanded after RA depending on the choice of register.
   4551 class UnaryRXYPseudo<string key, SDPatternOperator operator,
   4552                      RegisterOperand cls, bits<5> bytes,
   4553                      AddressingMode mode = bdxaddr20only>
   4554   : Pseudo<(outs cls:$R1), (ins mode:$XBD2),
   4555            [(set cls:$R1, (operator mode:$XBD2))]> {
   4556   let OpKey = key#"r"#cls;
   4557   let OpType = "mem";
   4558   let mayLoad = 1;
   4559   let Has20BitOffset = 1;
   4560   let HasIndex = 1;
   4561   let AccessBytes = bytes;
   4562 }
   4563 
   4564 // Like UnaryRR, but expanded after RA depending on the choice of registers.
   4565 class UnaryRRPseudo<string key, SDPatternOperator operator,
   4566                     RegisterOperand cls1, RegisterOperand cls2>
   4567   : Pseudo<(outs cls1:$R1), (ins cls2:$R2),
   4568            [(set cls1:$R1, (operator cls2:$R2))]> {
   4569   let OpKey = key#cls1;
   4570   let OpType = "reg";
   4571 }
   4572 
   4573 // Like BinaryRI, but expanded after RA depending on the choice of register.
   4574 class BinaryRIPseudo<SDPatternOperator operator, RegisterOperand cls,
   4575                      Immediate imm>
   4576   : Pseudo<(outs cls:$R1), (ins cls:$R1src, imm:$I2),
   4577            [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
   4578   let Constraints = "$R1 = $R1src";
   4579 }
   4580 
   4581 // Like BinaryRIE, but expanded after RA depending on the choice of register.
   4582 class BinaryRIEPseudo<SDPatternOperator operator, RegisterOperand cls,
   4583                       Immediate imm>
   4584   : Pseudo<(outs cls:$R1), (ins cls:$R3, imm:$I2),
   4585            [(set cls:$R1, (operator cls:$R3, imm:$I2))]>;
   4586 
   4587 // Like BinaryRIAndK, but expanded after RA depending on the choice of register.
   4588 multiclass BinaryRIAndKPseudo<string key, SDPatternOperator operator,
   4589                               RegisterOperand cls, Immediate imm> {
   4590   let NumOpsKey = key in {
   4591     let NumOpsValue = "3" in
   4592       def K : BinaryRIEPseudo<null_frag, cls, imm>,
   4593               Requires<[FeatureHighWord, FeatureDistinctOps]>;
   4594     let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in
   4595       def "" : BinaryRIPseudo<operator, cls, imm>,
   4596                Requires<[FeatureHighWord]>;
   4597   }
   4598 }
   4599 
   4600 // Like CompareRI, but expanded after RA depending on the choice of register.
   4601 class CompareRIPseudo<SDPatternOperator operator, RegisterOperand cls,
   4602                       Immediate imm>
   4603   : Pseudo<(outs), (ins cls:$R1, imm:$I2),
   4604            [(set CC, (operator cls:$R1, imm:$I2))]> {
   4605   let isCompare = 1;
   4606 }
   4607 
   4608 // Like CompareRXY, but expanded after RA depending on the choice of register.
   4609 class CompareRXYPseudo<SDPatternOperator operator, RegisterOperand cls,
   4610                        SDPatternOperator load, bits<5> bytes,
   4611                        AddressingMode mode = bdxaddr20only>
   4612   : Pseudo<(outs), (ins cls:$R1, mode:$XBD2),
   4613            [(set CC, (operator cls:$R1, (load mode:$XBD2)))]> {
   4614   let mayLoad = 1;
   4615   let Has20BitOffset = 1;
   4616   let HasIndex = 1;
   4617   let AccessBytes = bytes;
   4618 }
   4619 
   4620 // Like TestBinarySIL, but expanded later.
   4621 class TestBinarySILPseudo<SDPatternOperator operator, Immediate imm>
   4622   : Pseudo<(outs), (ins bdaddr12only:$BD1, imm:$I2),
   4623            [(set CC, (operator bdaddr12only:$BD1, imm:$I2))]>;
   4624 
   4625 // Like CondBinaryRRF, but expanded after RA depending on the choice of
   4626 // register.
   4627 class CondBinaryRRFPseudo<RegisterOperand cls1, RegisterOperand cls2>
   4628   : Pseudo<(outs cls1:$R1),
   4629            (ins cls1:$R1src, cls2:$R2, cond4:$valid, cond4:$M3),
   4630            [(set cls1:$R1, (z_select_ccmask cls2:$R2, cls1:$R1src,
   4631                                             cond4:$valid, cond4:$M3))]> {
   4632   let Constraints = "$R1 = $R1src";
   4633   let DisableEncoding = "$R1src";
   4634   let CCMaskLast = 1;
   4635 }
   4636 
   4637 // Like CondBinaryRIE, but expanded after RA depending on the choice of
   4638 // register.
   4639 class CondBinaryRIEPseudo<RegisterOperand cls, Immediate imm>
   4640   : Pseudo<(outs cls:$R1),
   4641            (ins cls:$R1src, imm:$I2, cond4:$valid, cond4:$M3),
   4642            [(set cls:$R1, (z_select_ccmask imm:$I2, cls:$R1src,
   4643                                            cond4:$valid, cond4:$M3))]> {
   4644   let Constraints = "$R1 = $R1src";
   4645   let DisableEncoding = "$R1src";
   4646   let CCMaskLast = 1;
   4647 }
   4648 
   4649 // Like CondUnaryRSY, but expanded after RA depending on the choice of
   4650 // register.
   4651 class CondUnaryRSYPseudo<SDPatternOperator operator, RegisterOperand cls,
   4652                          bits<5> bytes, AddressingMode mode = bdaddr20only>
   4653   : Pseudo<(outs cls:$R1),
   4654            (ins cls:$R1src, mode:$BD2, cond4:$valid, cond4:$R3),
   4655            [(set cls:$R1,
   4656                  (z_select_ccmask (operator mode:$BD2), cls:$R1src,
   4657                                   cond4:$valid, cond4:$R3))]> {
   4658   let Constraints = "$R1 = $R1src";
   4659   let DisableEncoding = "$R1src";
   4660   let mayLoad = 1;
   4661   let AccessBytes = bytes;
   4662   let CCMaskLast = 1;
   4663 }
   4664 
   4665 // Like CondStoreRSY, but expanded after RA depending on the choice of
   4666 // register.
   4667 class CondStoreRSYPseudo<RegisterOperand cls, bits<5> bytes,
   4668                          AddressingMode mode = bdaddr20only>
   4669   : Pseudo<(outs), (ins cls:$R1, mode:$BD2, cond4:$valid, cond4:$R3), []> {
   4670   let mayStore = 1;
   4671   let AccessBytes = bytes;
   4672   let CCMaskLast = 1;
   4673 }
   4674 
   4675 // Like StoreRXY, but expanded after RA depending on the choice of register.
   4676 class StoreRXYPseudo<SDPatternOperator operator, RegisterOperand cls,
   4677                      bits<5> bytes, AddressingMode mode = bdxaddr20only>
   4678   : Pseudo<(outs), (ins cls:$R1, mode:$XBD2),
   4679            [(operator cls:$R1, mode:$XBD2)]> {
   4680   let mayStore = 1;
   4681   let Has20BitOffset = 1;
   4682   let HasIndex = 1;
   4683   let AccessBytes = bytes;
   4684 }
   4685 
   4686 // Like RotateSelectRIEf, but expanded after RA depending on the choice
   4687 // of registers.
   4688 class RotateSelectRIEfPseudo<RegisterOperand cls1, RegisterOperand cls2>
   4689   : Pseudo<(outs cls1:$R1),
   4690            (ins cls1:$R1src, cls2:$R2, imm32zx8:$I3, imm32zx8:$I4,
   4691                 imm32zx6:$I5),
   4692            []> {
   4693   let Constraints = "$R1 = $R1src";
   4694   let DisableEncoding = "$R1src";
   4695 }
   4696 
   4697 // Implements "$dst = $cc & (8 >> CC) ? $src1 : $src2", where CC is
   4698 // the value of the PSW's 2-bit condition code field.
   4699 class SelectWrapper<ValueType vt, RegisterOperand cls>
   4700   : Pseudo<(outs cls:$dst),
   4701            (ins cls:$src1, cls:$src2, imm32zx4:$valid, imm32zx4:$cc),
   4702            [(set (vt cls:$dst), (z_select_ccmask cls:$src1, cls:$src2,
   4703                                             imm32zx4:$valid, imm32zx4:$cc))]> {
   4704   let usesCustomInserter = 1;
   4705   let hasNoSchedulingInfo = 1;
   4706   let Uses = [CC];
   4707 }
   4708 
   4709 // Stores $new to $addr if $cc is true ("" case) or false (Inv case).
   4710 multiclass CondStores<RegisterOperand cls, SDPatternOperator store,
   4711                       SDPatternOperator load, AddressingMode mode> {
   4712   let Uses = [CC], usesCustomInserter = 1, hasNoSchedulingInfo = 1,
   4713       mayLoad = 1, mayStore = 1 in {
   4714     def "" : Pseudo<(outs),
   4715                     (ins cls:$new, mode:$addr, imm32zx4:$valid, imm32zx4:$cc),
   4716                     [(store (z_select_ccmask cls:$new, (load mode:$addr),
   4717                                              imm32zx4:$valid, imm32zx4:$cc),
   4718                             mode:$addr)]>;
   4719     def Inv : Pseudo<(outs),
   4720                      (ins cls:$new, mode:$addr, imm32zx4:$valid, imm32zx4:$cc),
   4721                      [(store (z_select_ccmask (load mode:$addr), cls:$new,
   4722                                               imm32zx4:$valid, imm32zx4:$cc),
   4723                               mode:$addr)]>;
   4724   }
   4725 }
   4726 
   4727 // OPERATOR is ATOMIC_SWAP or an ATOMIC_LOAD_* operation.  PAT and OPERAND
   4728 // describe the second (non-memory) operand.
   4729 class AtomicLoadBinary<SDPatternOperator operator, RegisterOperand cls,
   4730                        dag pat, DAGOperand operand>
   4731   : Pseudo<(outs cls:$dst), (ins bdaddr20only:$ptr, operand:$src2),
   4732            [(set cls:$dst, (operator bdaddr20only:$ptr, pat))]> {
   4733   let Defs = [CC];
   4734   let Has20BitOffset = 1;
   4735   let mayLoad = 1;
   4736   let mayStore = 1;
   4737   let usesCustomInserter = 1;
   4738   let hasNoSchedulingInfo = 1;
   4739 }
   4740 
   4741 // Specializations of AtomicLoadWBinary.
   4742 class AtomicLoadBinaryReg32<SDPatternOperator operator>
   4743   : AtomicLoadBinary<operator, GR32, (i32 GR32:$src2), GR32>;
   4744 class AtomicLoadBinaryImm32<SDPatternOperator operator, Immediate imm>
   4745   : AtomicLoadBinary<operator, GR32, (i32 imm:$src2), imm>;
   4746 class AtomicLoadBinaryReg64<SDPatternOperator operator>
   4747   : AtomicLoadBinary<operator, GR64, (i64 GR64:$src2), GR64>;
   4748 class AtomicLoadBinaryImm64<SDPatternOperator operator, Immediate imm>
   4749   : AtomicLoadBinary<operator, GR64, (i64 imm:$src2), imm>;
   4750 
   4751 // OPERATOR is ATOMIC_SWAPW or an ATOMIC_LOADW_* operation.  PAT and OPERAND
   4752 // describe the second (non-memory) operand.
   4753 class AtomicLoadWBinary<SDPatternOperator operator, dag pat,
   4754                         DAGOperand operand>
   4755   : Pseudo<(outs GR32:$dst),
   4756            (ins bdaddr20only:$ptr, operand:$src2, ADDR32:$bitshift,
   4757                 ADDR32:$negbitshift, uimm32:$bitsize),
   4758            [(set GR32:$dst, (operator bdaddr20only:$ptr, pat, ADDR32:$bitshift,
   4759                                       ADDR32:$negbitshift, uimm32:$bitsize))]> {
   4760   let Defs = [CC];
   4761   let Has20BitOffset = 1;
   4762   let mayLoad = 1;
   4763   let mayStore = 1;
   4764   let usesCustomInserter = 1;
   4765   let hasNoSchedulingInfo = 1;
   4766 }
   4767 
   4768 // Specializations of AtomicLoadWBinary.
   4769 class AtomicLoadWBinaryReg<SDPatternOperator operator>
   4770   : AtomicLoadWBinary<operator, (i32 GR32:$src2), GR32>;
   4771 class AtomicLoadWBinaryImm<SDPatternOperator operator, Immediate imm>
   4772   : AtomicLoadWBinary<operator, (i32 imm:$src2), imm>;
   4773 
   4774 // Define an instruction that operates on two fixed-length blocks of memory,
   4775 // and associated pseudo instructions for operating on blocks of any size.
   4776 // The Sequence form uses a straight-line sequence of instructions and
   4777 // the Loop form uses a loop of length-256 instructions followed by
   4778 // another instruction to handle the excess.
   4779 multiclass MemorySS<string mnemonic, bits<8> opcode,
   4780                     SDPatternOperator sequence, SDPatternOperator loop> {
   4781   def "" : SideEffectBinarySSa<mnemonic, opcode>;
   4782   let usesCustomInserter = 1, hasNoSchedulingInfo = 1, Defs = [CC] in {
   4783     def Sequence : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src,
   4784                                        imm64:$length),
   4785                            [(sequence bdaddr12only:$dest, bdaddr12only:$src,
   4786                                       imm64:$length)]>;
   4787     def Loop : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src,
   4788                                    imm64:$length, GR64:$count256),
   4789                       [(loop bdaddr12only:$dest, bdaddr12only:$src,
   4790                              imm64:$length, GR64:$count256)]>;
   4791   }
   4792 }
   4793 
   4794 // The same, but setting a CC result as comparion operator.
   4795 multiclass CompareMemorySS<string mnemonic, bits<8> opcode,
   4796                           SDPatternOperator sequence, SDPatternOperator loop> {
   4797   def "" : SideEffectBinarySSa<mnemonic, opcode>;
   4798   let usesCustomInserter = 1, hasNoSchedulingInfo = 1 in {
   4799     def Sequence : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src,
   4800                                        imm64:$length),
   4801                            [(set CC, (sequence bdaddr12only:$dest, bdaddr12only:$src,
   4802                                                imm64:$length))]>;
   4803     def Loop : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src,
   4804                                    imm64:$length, GR64:$count256),
   4805                       [(set CC, (loop bdaddr12only:$dest, bdaddr12only:$src,
   4806                                       imm64:$length, GR64:$count256))]>;
   4807   }
   4808 }
   4809 
   4810 // Define an instruction that operates on two strings, both terminated
   4811 // by the character in R0.  The instruction processes a CPU-determinated
   4812 // number of bytes at a time and sets CC to 3 if the instruction needs
   4813 // to be repeated.  Also define a pseudo instruction that represents
   4814 // the full loop (the main instruction plus the branch on CC==3).
   4815 multiclass StringRRE<string mnemonic, bits<16> opcode,
   4816                      SDPatternOperator operator> {
   4817   let Uses = [R0L] in
   4818     def "" : SideEffectBinaryMemMemRRE<mnemonic, opcode, GR64, GR64>;
   4819   let usesCustomInserter = 1, hasNoSchedulingInfo = 1 in
   4820     def Loop : Pseudo<(outs GR64:$end),
   4821                       (ins GR64:$start1, GR64:$start2, GR32:$char),
   4822                       [(set GR64:$end, (operator GR64:$start1, GR64:$start2,
   4823                                                  GR32:$char))]>;
   4824 }
   4825 
   4826 // A pseudo instruction that is a direct alias of a real instruction.
   4827 // These aliases are used in cases where a particular register operand is
   4828 // fixed or where the same instruction is used with different register sizes.
   4829 // The size parameter is the size in bytes of the associated real instruction.
   4830 class Alias<int size, dag outs, dag ins, list<dag> pattern>
   4831   : InstSystemZ<size, outs, ins, "", pattern> {
   4832   let isPseudo = 1;
   4833   let isCodeGenOnly = 1;
   4834 }
   4835 
   4836 class UnaryAliasVRS<RegisterOperand cls1, RegisterOperand cls2>
   4837  : Alias<6, (outs cls1:$src1), (ins cls2:$src2), []>;
   4838 
   4839 // An alias of a UnaryVRR*, but with different register sizes.
   4840 class UnaryAliasVRR<SDPatternOperator operator, TypedReg tr1, TypedReg tr2>
   4841   : Alias<6, (outs tr1.op:$V1), (ins tr2.op:$V2),
   4842           [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2)))]>;
   4843 
   4844 // An alias of a UnaryVRX, but with different register sizes.
   4845 class UnaryAliasVRX<SDPatternOperator operator, TypedReg tr,
   4846                     AddressingMode mode = bdxaddr12only>
   4847   : Alias<6, (outs tr.op:$V1), (ins mode:$XBD2),
   4848           [(set (tr.vt tr.op:$V1), (operator mode:$XBD2))]>;
   4849 
   4850 // An alias of a StoreVRX, but with different register sizes.
   4851 class StoreAliasVRX<SDPatternOperator operator, TypedReg tr,
   4852                     AddressingMode mode = bdxaddr12only>
   4853   : Alias<6, (outs), (ins tr.op:$V1, mode:$XBD2),
   4854           [(operator (tr.vt tr.op:$V1), mode:$XBD2)]>;
   4855 
   4856 // An alias of a BinaryRI, but with different register sizes.
   4857 class BinaryAliasRI<SDPatternOperator operator, RegisterOperand cls,
   4858                     Immediate imm>
   4859   : Alias<4, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
   4860           [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
   4861   let Constraints = "$R1 = $R1src";
   4862 }
   4863 
   4864 // An alias of a BinaryRIL, but with different register sizes.
   4865 class BinaryAliasRIL<SDPatternOperator operator, RegisterOperand cls,
   4866                      Immediate imm>
   4867   : Alias<6, (outs cls:$R1), (ins cls:$R1src, imm:$I2),
   4868           [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> {
   4869   let Constraints = "$R1 = $R1src";
   4870 }
   4871 
   4872 // An alias of a BinaryVRRf, but with different register sizes.
   4873 class BinaryAliasVRRf<RegisterOperand cls>
   4874   : Alias<6, (outs VR128:$V1), (ins cls:$R2, cls:$R3), []>;
   4875 
   4876 // An alias of a CompareRI, but with different register sizes.
   4877 class CompareAliasRI<SDPatternOperator operator, RegisterOperand cls,
   4878                      Immediate imm>
   4879   : Alias<4, (outs), (ins cls:$R1, imm:$I2),
   4880           [(set CC, (operator cls:$R1, imm:$I2))]> {
   4881   let isCompare = 1;
   4882 }
   4883 
   4884 // An alias of a RotateSelectRIEf, but with different register sizes.
   4885 class RotateSelectAliasRIEf<RegisterOperand cls1, RegisterOperand cls2>
   4886   : Alias<6, (outs cls1:$R1),
   4887           (ins cls1:$R1src, cls2:$R2, imm32zx8:$I3, imm32zx8:$I4,
   4888                imm32zx6:$I5), []> {
   4889   let Constraints = "$R1 = $R1src";
   4890 }
   4891