Home | History | Annotate | Download | only in Hexagon
      1 //===-- HexagonIntrinsics.td - Instruction intrinsics ------*- 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 // This is populated based on the following specs:
     10 // Hexagon V2 Architecture
     11 // Application-Level Specification
     12 // 80-V9418-8 Rev. B
     13 // March 4, 2008
     14 //===----------------------------------------------------------------------===//
     15 
     16 //
     17 // ALU 32 types.
     18 //
     19 
     20 class qi_ALU32_sisi<string opc, Intrinsic IntID>
     21   : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
     22              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
     23              [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
     24 
     25 class qi_ALU32_sis10<string opc, Intrinsic IntID>
     26   : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, s10Imm:$src2),
     27              !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
     28              [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
     29 
     30 class qi_ALU32_sis8<string opc, Intrinsic IntID>
     31   : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2),
     32              !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
     33              [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
     34 
     35 class qi_ALU32_siu8<string opc, Intrinsic IntID>
     36   : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, u8Imm:$src2),
     37              !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
     38              [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
     39 
     40 class qi_ALU32_siu9<string opc, Intrinsic IntID>
     41   : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, u9Imm:$src2),
     42              !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
     43              [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
     44 
     45 class si_ALU32_qisisi<string opc, Intrinsic IntID>
     46   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2,
     47                                       IntRegs:$src3),
     48              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
     49              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
     50                                         IntRegs:$src3))]>;
     51 
     52 class si_ALU32_qis8si<string opc, Intrinsic IntID>
     53   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2,
     54                                        IntRegs:$src3),
     55              !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, $src3)")),
     56              [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2,
     57                                         IntRegs:$src3))]>;
     58 
     59 class si_ALU32_qisis8<string opc, Intrinsic IntID>
     60   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2,
     61                                        s8Imm:$src3),
     62              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
     63              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
     64                                         imm:$src3))]>;
     65 
     66 class si_ALU32_qis8s8<string opc, Intrinsic IntID>
     67   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2, s8Imm:$src3),
     68              !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
     69              [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2, imm:$src3))]>;
     70 
     71 class si_ALU32_sisi<string opc, Intrinsic IntID>
     72   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
     73              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
     74              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
     75 
     76 class si_ALU32_sisi_sat<string opc, Intrinsic IntID>
     77   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
     78              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
     79              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
     80 
     81 class si_ALU32_sisi_rnd<string opc, Intrinsic IntID>
     82   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
     83              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
     84              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
     85 
     86 class si_ALU32_sis16<string opc, Intrinsic IntID>
     87   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s16Imm:$src2),
     88              !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
     89              [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
     90 
     91 class si_ALU32_sis10<string opc, Intrinsic IntID>
     92   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s10Imm:$src2),
     93              !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
     94              [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
     95 
     96 class si_ALU32_s10si<string opc, Intrinsic IntID>
     97   : ALU32_rr<(outs IntRegs:$dst), (ins s10Imm:$src1, IntRegs:$src2),
     98              !strconcat("$dst = ", !strconcat(opc , "(#$src1, $src2)")),
     99              [(set IntRegs:$dst, (IntID imm:$src1, IntRegs:$src2))]>;
    100 
    101 class si_lo_ALU32_siu16<string opc, Intrinsic IntID>
    102   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, u16Imm:$src2),
    103              !strconcat("$dst.l = ", !strconcat(opc , "#$src2")),
    104              [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
    105 
    106 class si_hi_ALU32_siu16<string opc, Intrinsic IntID>
    107   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, u16Imm:$src2),
    108              !strconcat("$dst.h = ", !strconcat(opc , "#$src2")),
    109              [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
    110 
    111 class si_ALU32_s16<string opc, Intrinsic IntID>
    112   : ALU32_rr<(outs IntRegs:$dst), (ins s16Imm:$src1),
    113              !strconcat("$dst = ", !strconcat(opc , "#$src1")),
    114              [(set IntRegs:$dst, (IntID imm:$src1))]>;
    115 
    116 class di_ALU32_s8<string opc, Intrinsic IntID>
    117   : ALU32_rr<(outs DoubleRegs:$dst), (ins s8Imm:$src1),
    118              !strconcat("$dst = ", !strconcat(opc , "#$src1")),
    119              [(set DoubleRegs:$dst, (IntID imm:$src1))]>;
    120 
    121 class di_ALU64_di<string opc, Intrinsic IntID>
    122   : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
    123              !strconcat("$dst = ", !strconcat(opc , "$src")),
    124              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;
    125 
    126 class si_ALU32_si<string opc, Intrinsic IntID>
    127   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
    128              !strconcat("$dst = ", !strconcat(opc , "($src)")),
    129              [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
    130 
    131 class si_ALU32_si_tfr<string opc, Intrinsic IntID>
    132   : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
    133              !strconcat("$dst = ", !strconcat(opc , "$src")),
    134              [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
    135 
    136 //
    137 // ALU 64 types.
    138 //
    139 
    140 class si_ALU64_si_sat<string opc, Intrinsic IntID>
    141   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
    142              !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
    143              [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
    144 
    145 class si_ALU64_didi<string opc, Intrinsic IntID>
    146   : ALU64_rr<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    147              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    148              [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
    149 
    150 class di_ALU64_sidi<string opc, Intrinsic IntID>
    151   : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2),
    152              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    153              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2))]>;
    154 
    155 class di_ALU64_didi<string opc, Intrinsic IntID>
    156   : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    157              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    158              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    159                                            DoubleRegs:$src2))]>;
    160 
    161 class di_ALU64_qididi<string opc, Intrinsic IntID>
    162   : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2,
    163                                           DoubleRegs:$src3),
    164              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
    165              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2,
    166                                            DoubleRegs:$src3))]>;
    167 
    168 class di_ALU64_sisi<string opc, Intrinsic IntID>
    169   : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    170              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    171              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    172 
    173 class di_ALU64_didi_sat<string opc, Intrinsic IntID>
    174   : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    175              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
    176              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    177                                            DoubleRegs:$src2))]>;
    178 
    179 class di_ALU64_didi_rnd<string opc, Intrinsic IntID>
    180   : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    181              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
    182              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    183                                            DoubleRegs:$src2))]>;
    184 
    185 class di_ALU64_didi_crnd<string opc, Intrinsic IntID>
    186   : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    187              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):crnd")),
    188              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    189                                            DoubleRegs:$src2))]>;
    190 
    191 class di_ALU64_didi_rnd_sat<string opc, Intrinsic IntID>
    192   : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    193              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd:sat")),
    194              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    195                                            DoubleRegs:$src2))]>;
    196 
    197 class di_ALU64_didi_crnd_sat<string opc, Intrinsic IntID>
    198   : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    199              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):crnd:sat")),
    200              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    201                                            DoubleRegs:$src2))]>;
    202 
    203 class qi_ALU64_didi<string opc, Intrinsic IntID>
    204   : ALU64_rr<(outs PredRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    205              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    206              [(set PredRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
    207 
    208 class si_ALU64_sisi<string opc, Intrinsic IntID>
    209   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    210              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    211              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    212 
    213 class si_ALU64_sisi_sat_lh<string opc, Intrinsic IntID>
    214   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    215              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
    216              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    217 
    218 class si_ALU64_sisi_l16_sat_hh<string opc, Intrinsic IntID>
    219   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    220              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):sat")),
    221              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    222 
    223 class si_ALU64_sisi_l16_sat_lh<string opc, Intrinsic IntID>
    224   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    225              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
    226              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    227 
    228 class si_ALU64_sisi_l16_sat_hl<string opc, Intrinsic IntID>
    229   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    230              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):sat")),
    231              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    232 
    233 class si_ALU64_sisi_l16_sat_ll<string opc, Intrinsic IntID>
    234   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    235              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):sat")),
    236              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    237 
    238 class si_ALU64_sisi_l16_hh<string opc, Intrinsic IntID>
    239   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    240              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
    241              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    242 
    243 class si_ALU64_sisi_l16_hl<string opc, Intrinsic IntID>
    244   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    245              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
    246              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    247 
    248 class si_ALU64_sisi_l16_lh<string opc, Intrinsic IntID>
    249   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    250              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
    251              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    252 
    253 class si_ALU64_sisi_l16_ll<string opc, Intrinsic IntID>
    254   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    255              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
    256              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    257 
    258 class si_ALU64_sisi_h16_sat_hh<string opc, Intrinsic IntID>
    259   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    260              !strconcat("$dst = ", !strconcat(opc ,
    261                                               "($src1.H, $src2.H):sat:<<16")),
    262              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    263 
    264 class si_ALU64_sisi_h16_sat_lh<string opc, Intrinsic IntID>
    265   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    266              !strconcat("$dst = ", !strconcat(opc ,
    267                                               "($src1.L, $src2.H):sat:<<16")),
    268              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    269 
    270 class si_ALU64_sisi_h16_sat_hl<string opc, Intrinsic IntID>
    271   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    272              !strconcat("$dst = ", !strconcat(opc ,
    273                                               "($src1.H, $src2.L):sat:<<16")),
    274              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    275 
    276 class si_ALU64_sisi_h16_sat_ll<string opc, Intrinsic IntID>
    277   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    278              !strconcat("$dst = ", !strconcat(opc ,
    279                                               "($src1.L, $src2.L):sat:<<16")),
    280              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    281 
    282 class si_ALU64_sisi_h16_hh<string opc, Intrinsic IntID>
    283   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    284              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<16")),
    285              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    286 
    287 class si_ALU64_sisi_h16_hl<string opc, Intrinsic IntID>
    288   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    289              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<16")),
    290              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    291 
    292 class si_ALU64_sisi_h16_lh<string opc, Intrinsic IntID>
    293   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    294              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<16")),
    295              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    296 
    297 class si_ALU64_sisi_h16_ll<string opc, Intrinsic IntID>
    298   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    299              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<16")),
    300              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    301 
    302 class si_ALU64_sisi_lh<string opc, Intrinsic IntID>
    303   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    304              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
    305              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    306 
    307 class si_ALU64_sisi_ll<string opc, Intrinsic IntID>
    308   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    309              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
    310              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    311 
    312 class si_ALU64_sisi_sat<string opc, Intrinsic IntID>
    313   : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    314              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
    315              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    316 
    317 //
    318 // SInst classes.
    319 //
    320 
    321 class qi_SInst_qi<string opc, Intrinsic IntID>
    322   : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
    323              !strconcat("$dst = ", !strconcat(opc , "($src)")),
    324              [(set PredRegs:$dst, (IntID IntRegs:$src))]>;
    325 
    326 class qi_SInst_qi_pxfer<string opc, Intrinsic IntID>
    327   : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
    328              !strconcat("$dst = ", !strconcat(opc , "$src")),
    329              [(set PredRegs:$dst, (IntID IntRegs:$src))]>;
    330 
    331 class qi_SInst_qiqi<string opc, Intrinsic IntID>
    332   : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    333              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    334              [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    335 
    336 class qi_SInst_qiqi_neg<string opc, Intrinsic IntID>
    337   : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    338              !strconcat("$dst = ", !strconcat(opc , "($src1, !$src2)")),
    339              [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    340 
    341 class di_SInst_di<string opc, Intrinsic IntID>
    342   : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
    343              !strconcat("$dst = ", !strconcat(opc , "($src)")),
    344              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;
    345 
    346 class di_SInst_di_sat<string opc, Intrinsic IntID>
    347   : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
    348              !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
    349              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;
    350 
    351 class si_SInst_di<string opc, Intrinsic IntID>
    352   : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src),
    353           !strconcat("$dst = ", !strconcat(opc , "($src)")),
    354           [(set IntRegs:$dst, (IntID DoubleRegs:$src))]>;
    355 
    356 class si_SInst_di_sat<string opc, Intrinsic IntID>
    357   : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src),
    358           !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
    359           [(set IntRegs:$dst, (IntID DoubleRegs:$src))]>;
    360 
    361 class di_SInst_disi<string opc, Intrinsic IntID>
    362   : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
    363           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    364           [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
    365 
    366 class di_SInst_didi<string opc, Intrinsic IntID>
    367   : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    368           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    369           [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
    370 
    371 class di_SInst_si<string opc, Intrinsic IntID>
    372   : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1),
    373           !strconcat("$dst = ", !strconcat(opc , "($src1)")),
    374           [(set DoubleRegs:$dst, (IntID IntRegs:$src1))]>;
    375 
    376 class si_SInst_sisiu3<string opc, Intrinsic IntID>
    377   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u3Imm:$src3),
    378           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
    379           [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
    380                                      imm:$src3))]>;
    381 
    382 class si_SInst_diu5<string opc, Intrinsic IntID>
    383   : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, u5Imm:$src2),
    384           !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
    385           [(set IntRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2))]>;
    386 
    387 class si_SInst_disi<string opc, Intrinsic IntID>
    388   : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
    389           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    390           [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
    391 
    392 class si_SInst_sidi<string opc, Intrinsic IntID>
    393   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2),
    394           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    395           [(set IntRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2))]>;
    396 
    397 class di_SInst_disisi<string opc, Intrinsic IntID>
    398   : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2,
    399                                        IntRegs:$src3),
    400           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
    401           [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2,
    402                                         IntRegs:$src3))]>;
    403 
    404 class di_SInst_sisi<string opc, Intrinsic IntID>
    405   : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    406           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    407           [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    408 
    409 class qi_SInst_siu5<string opc, Intrinsic IntID>
    410   : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
    411           !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
    412           [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
    413 
    414 class qi_SInst_siu6<string opc, Intrinsic IntID>
    415   : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u6Imm:$src2),
    416           !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
    417           [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
    418 
    419 class qi_SInst_sisi<string opc, Intrinsic IntID>
    420   : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    421           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    422           [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    423 
    424 class si_SInst_si<string opc, Intrinsic IntID>
    425   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
    426           !strconcat("$dst = ", !strconcat(opc , "($src)")),
    427           [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
    428 
    429 class si_SInst_si_sat<string opc, Intrinsic IntID>
    430   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
    431           !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
    432           [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
    433 
    434 class di_SInst_qi<string opc, Intrinsic IntID>
    435   : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src),
    436           !strconcat("$dst = ", !strconcat(opc , "($src)")),
    437           [(set DoubleRegs:$dst, (IntID IntRegs:$src))]>;
    438 
    439 class si_SInst_qi<string opc, Intrinsic IntID>
    440   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
    441           !strconcat("$dst = ", !strconcat(opc , "$src")),
    442           [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
    443 
    444 class si_SInst_qiqi<string opc, Intrinsic IntID>
    445   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    446           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    447           [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    448 
    449 class qi_SInst_si<string opc, Intrinsic IntID>
    450   : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
    451           !strconcat("$dst = ", !strconcat(opc , "$src")),
    452           [(set PredRegs:$dst, (IntID IntRegs:$src))]>;
    453 
    454 class si_SInst_sisi<string opc, Intrinsic IntID>
    455   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    456           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    457           [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    458 
    459 class di_SInst_diu6<string opc, Intrinsic IntID>
    460   : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, u6Imm:$src2),
    461           !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
    462           [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2))]>;
    463 
    464 class si_SInst_siu5<string opc, Intrinsic IntID>
    465   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
    466           !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
    467           [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
    468 
    469 class si_SInst_siu5_rnd<string opc, Intrinsic IntID>
    470   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
    471           !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2):rnd")),
    472           [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
    473 
    474 class si_SInst_siu5u5<string opc, Intrinsic IntID>
    475   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2, u5Imm:$src3),
    476           !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
    477           [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2, imm:$src3))]>;
    478 
    479 class si_SInst_sisisi_acc<string opc, Intrinsic IntID>
    480   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    481                                         IntRegs:$src2),
    482               !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
    483               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    484                                          IntRegs:$src2))],
    485               "$dst2 = $dst">;
    486 
    487 class si_SInst_sisisi_nac<string opc, Intrinsic IntID>
    488   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    489                                         IntRegs:$src2),
    490               !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
    491               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    492                                          IntRegs:$src2))],
    493               "$dst2 = $dst">;
    494 
    495 class di_SInst_didisi_acc<string opc, Intrinsic IntID>
    496   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    497                                            IntRegs:$src2),
    498                !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
    499                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
    500                                              DoubleRegs:$src1,
    501                                              IntRegs:$src2))],
    502                "$dst2 = $dst">;
    503 
    504 class di_SInst_didisi_nac<string opc, Intrinsic IntID>
    505   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    506                                            IntRegs:$src2),
    507           !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
    508           [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
    509                                         DoubleRegs:$src1, IntRegs:$src2))],
    510           "$dst2 = $dst">;
    511 
    512 class si_SInst_sisiu5u5<string opc, Intrinsic IntID>
    513   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    514                                         u5Imm:$src2, u5Imm:$src3),
    515               !strconcat("$dst = ", !strconcat(opc ,
    516                                                "($src1, #$src2, #$src3)")),
    517               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    518                                          imm:$src2, imm:$src3))],
    519               "$dst2 = $dst">;
    520 
    521 class si_SInst_sisidi<string opc, Intrinsic IntID>
    522   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    523                                         DoubleRegs:$src2),
    524               !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    525               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    526                                          DoubleRegs:$src2))],
    527               "$dst2 = $dst">;
    528 
    529 class di_SInst_didiu6u6<string opc, Intrinsic IntID>
    530   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    531                                            u6Imm:$src2, u6Imm:$src3),
    532               !strconcat("$dst = ", !strconcat(opc ,
    533                                                "($src1, #$src2, #$src3)")),
    534               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
    535                                             imm:$src2, imm:$src3))],
    536               "$dst2 = $dst">;
    537 
    538 class di_SInst_dididi<string opc, Intrinsic IntID>
    539   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    540                                            DoubleRegs:$src2),
    541               !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    542               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
    543                                             DoubleRegs:$src1,
    544                                             DoubleRegs:$src2))],
    545               "$dst2 = $dst">;
    546 
    547 class di_SInst_diu6u6<string opc, Intrinsic IntID>
    548   : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, u6Imm:$src2,
    549                                        u6Imm:$src3),
    550           !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
    551           [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2,
    552                                         imm:$src3))]>;
    553 
    554 class di_SInst_didiqi<string opc, Intrinsic IntID>
    555   : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2,
    556                                        IntRegs:$src3),
    557           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
    558           [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2,
    559                                         IntRegs:$src3))]>;
    560 
    561 class di_SInst_didiu3<string opc, Intrinsic IntID>
    562   : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2,
    563                                        u3Imm:$src3),
    564           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
    565           [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2,
    566                                         imm:$src3))]>;
    567 
    568 class di_SInst_didisi_or<string opc, Intrinsic IntID>
    569   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    570                                            IntRegs:$src2),
    571           !strconcat("$dst |= ", !strconcat(opc , "($src1, $src2)")),
    572           [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
    573                                         IntRegs:$src2))],
    574           "$dst2 = $dst">;
    575 
    576 class di_SInst_didisi_and<string opc, Intrinsic IntID>
    577   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    578                                            IntRegs:$src2),
    579           !strconcat("$dst &= ", !strconcat(opc , "($src1, $src2)")),
    580           [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
    581                                         IntRegs:$src2))],
    582           "$dst2 = $dst">;
    583 
    584 class di_SInst_didiu6_and<string opc, Intrinsic IntID>
    585   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    586                                            u6Imm:$src2),
    587           !strconcat("$dst &= ", !strconcat(opc , "($src1, #$src2)")),
    588           [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
    589                                         imm:$src2))],
    590           "$dst2 = $dst">;
    591 
    592 class di_SInst_didiu6_or<string opc, Intrinsic IntID>
    593   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    594                                            u6Imm:$src2),
    595           !strconcat("$dst |= ", !strconcat(opc , "($src1, #$src2)")),
    596           [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
    597                                         imm:$src2))],
    598           "$dst2 = $dst">;
    599 
    600 class di_SInst_didiu6_xor<string opc, Intrinsic IntID>
    601   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    602                                            u6Imm:$src2),
    603           !strconcat("$dst ^= ", !strconcat(opc , "($src1, #$src2)")),
    604           [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
    605                                         imm:$src2))],
    606           "$dst2 = $dst">;
    607 
    608 class si_SInst_sisisi_and<string opc, Intrinsic IntID>
    609   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    610                                         IntRegs:$src2),
    611               !strconcat("$dst &= ", !strconcat(opc , "($src1, $src2)")),
    612               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    613                                          IntRegs:$src2))],
    614               "$dst2 = $dst">;
    615 
    616 class si_SInst_sisisi_or<string opc, Intrinsic IntID>
    617   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    618                                         IntRegs:$src2),
    619               !strconcat("$dst |= ", !strconcat(opc , "($src1, $src2)")),
    620               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    621                                          IntRegs:$src2))],
    622               "$dst2 = $dst">;
    623 
    624 
    625 class si_SInst_sisiu5_and<string opc, Intrinsic IntID>
    626   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    627                                         u5Imm:$src2),
    628               !strconcat("$dst &= ", !strconcat(opc , "($src1, #$src2)")),
    629               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    630                                          imm:$src2))],
    631               "$dst2 = $dst">;
    632 
    633 class si_SInst_sisiu5_or<string opc, Intrinsic IntID>
    634   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    635                                         u5Imm:$src2),
    636               !strconcat("$dst |= ", !strconcat(opc , "($src1, #$src2)")),
    637               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    638                                          imm:$src2))],
    639               "$dst2 = $dst">;
    640 
    641 class si_SInst_sisiu5_xor<string opc, Intrinsic IntID>
    642   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    643                                         u5Imm:$src2),
    644               !strconcat("$dst ^= ", !strconcat(opc , "($src1, #$src2)")),
    645               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    646                                          imm:$src2))],
    647               "$dst2 = $dst">;
    648 
    649 class si_SInst_sisiu5_acc<string opc, Intrinsic IntID>
    650   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    651                                         u5Imm:$src2),
    652               !strconcat("$dst += ", !strconcat(opc , "($src1, #$src2)")),
    653               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    654                                          imm:$src2))],
    655               "$dst2 = $dst">;
    656 
    657 class si_SInst_sisiu5_nac<string opc, Intrinsic IntID>
    658   : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
    659                                         u5Imm:$src2),
    660               !strconcat("$dst -= ", !strconcat(opc , "($src1, #$src2)")),
    661               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
    662                                          imm:$src2))],
    663               "$dst2 = $dst">;
    664 
    665 class di_SInst_didiu6_acc<string opc, Intrinsic IntID>
    666   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    667                                            u5Imm:$src2),
    668               !strconcat("$dst += ", !strconcat(opc , "($src1, #$src2)")),
    669               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
    670                                             DoubleRegs:$src1, imm:$src2))],
    671               "$dst2 = $dst">;
    672 
    673 class di_SInst_didiu6_nac<string opc, Intrinsic IntID>
    674   : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
    675                                            u5Imm:$src2),
    676               !strconcat("$dst -= ", !strconcat(opc , "($src1, #$src2)")),
    677               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
    678                                             imm:$src2))],
    679               "$dst2 = $dst">;
    680 
    681 
    682 //
    683 // MInst classes.
    684 //
    685 
    686 class di_MInst_sisi_rnd_hh_s1<string opc, Intrinsic IntID>
    687   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    688                !strconcat("$dst = ", !strconcat(opc ,
    689                                                 "($src1.H, $src2.H):<<1:rnd")),
    690                [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    691 
    692 class di_MInst_sisi_rnd_hh<string opc, Intrinsic IntID>
    693   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    694                !strconcat("$dst = ", !strconcat(opc ,
    695                                                 "($src1.H, $src2.H):rnd")),
    696                [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    697 
    698 class di_MInst_sisi_rnd_hl_s1<string opc, Intrinsic IntID>
    699   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    700                !strconcat("$dst = ", !strconcat(opc ,
    701                                                 "($src1.H, $src2.L):<<1:rnd")),
    702                [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    703 
    704 class di_MInst_sisi_rnd_hl<string opc, Intrinsic IntID>
    705   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    706                !strconcat("$dst = ", !strconcat(opc ,
    707                                                 "($src1.H, $src2.L):rnd")),
    708                [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    709 
    710 class di_MInst_sisi_rnd_lh_s1<string opc, Intrinsic IntID>
    711   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    712                !strconcat("$dst = ", !strconcat(opc ,
    713                                                 "($src1.L, $src2.H):<<1:rnd")),
    714                [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    715 
    716 class di_MInst_sisi_rnd_lh<string opc, Intrinsic IntID>
    717   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    718                !strconcat("$dst = ", !strconcat(opc ,
    719                                                 "($src1.L, $src2.H):rnd")),
    720                [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    721 
    722 class di_MInst_sisi_rnd_ll_s1<string opc, Intrinsic IntID>
    723   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    724                !strconcat("$dst = ", !strconcat(opc ,
    725                                                 "($src1.L, $src2.L):<<1:rnd")),
    726                [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    727 
    728 class di_MInst_sisi_rnd_ll<string opc, Intrinsic IntID>
    729   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    730                !strconcat("$dst = ", !strconcat(opc ,
    731                                                 "($src1.L, $src2.L):rnd")),
    732                [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    733 
    734 class di_MInst_disisi_acc<string opc, Intrinsic IntID>
    735   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
    736                                            IntRegs:$src2),
    737              !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
    738              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
    739                                            IntRegs:$src2))],
    740              "$dst2 = $dst">;
    741 
    742 class di_MInst_disisi_nac<string opc, Intrinsic IntID>
    743   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
    744                                            IntRegs:$src2),
    745              !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
    746              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
    747                                            IntRegs:$src2))],
    748              "$dst2 = $dst">;
    749 
    750 class di_MInst_disisi_acc_sat<string opc, Intrinsic IntID>
    751   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
    752                                            IntRegs:$src2),
    753              !strconcat("$dst += ", !strconcat(opc , "($src1, $src2):sat")),
    754              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
    755                                            IntRegs:$src2))],
    756              "$dst2 = $dst">;
    757 
    758 class di_MInst_disisi_nac_sat<string opc, Intrinsic IntID>
    759   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
    760                                            IntRegs:$src2),
    761              !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2):sat")),
    762              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
    763                                            IntRegs:$src2))],
    764              "$dst2 = $dst">;
    765 
    766 class di_MInst_disisi_acc_sat_conj<string opc, Intrinsic IntID>
    767   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
    768                                            IntRegs:$src2),
    769              !strconcat("$dst += ", !strconcat(opc , "($src1, $src2*):sat")),
    770              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
    771                                            IntRegs:$src2))],
    772              "$dst2 = $dst">;
    773 
    774 class di_MInst_disisi_nac_sat_conj<string opc, Intrinsic IntID>
    775   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
    776                                            IntRegs:$src2),
    777              !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2*):sat")),
    778              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
    779                                            IntRegs:$src2))],
    780              "$dst2 = $dst">;
    781 
    782 class di_MInst_disisi_nac_s1_sat<string opc, Intrinsic IntID>
    783   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
    784                                            IntRegs:$src2),
    785              !strconcat("$dst -= ", !strconcat(opc ,
    786                                                "($src1, $src2):<<1:sat")),
    787              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
    788                                            IntRegs:$src2))],
    789              "$dst2 = $dst">;
    790 
    791 class di_MInst_disisi_acc_s1_sat_conj<string opc, Intrinsic IntID>
    792   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
    793                                            IntRegs:$src2),
    794              !strconcat("$dst += ", !strconcat(opc ,
    795                                                "($src1, $src2*):<<1:sat")),
    796              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
    797                                            IntRegs:$src2))],
    798              "$dst2 = $dst">;
    799 
    800 class di_MInst_disisi_nac_s1_sat_conj<string opc, Intrinsic IntID>
    801   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
    802                                            IntRegs:$src2),
    803              !strconcat("$dst -= ", !strconcat(opc ,
    804                                                "($src1, $src2*):<<1:sat")),
    805              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
    806                                            IntRegs:$src2))],
    807              "$dst2 = $dst">;
    808 
    809 class di_MInst_s8s8<string opc, Intrinsic IntID>
    810   : MInst<(outs DoubleRegs:$dst), (ins s8Imm:$src1, s8Imm:$src2),
    811              !strconcat("$dst = ", !strconcat(opc , "(#$src1, #$src2)")),
    812              [(set DoubleRegs:$dst, (IntID imm:$src1, imm:$src2))]>;
    813 
    814 class si_MInst_sis9<string opc, Intrinsic IntID>
    815   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, s9Imm:$src2),
    816              !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
    817              [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
    818 
    819 class si_MInst_sisi<string opc, Intrinsic IntID>
    820   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    821              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    822              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    823 
    824 class di_MInst_sisi_hh<string opc, Intrinsic IntID>
    825   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    826              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
    827              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    828 
    829 class di_MInst_sisi_hh_s1<string opc, Intrinsic IntID>
    830   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    831              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<1")),
    832              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    833 
    834 class di_MInst_sisi_lh<string opc, Intrinsic IntID>
    835   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    836              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
    837              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    838 
    839 class di_MInst_sisi_lh_s1<string opc, Intrinsic IntID>
    840   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    841              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<1")),
    842              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    843 
    844 class di_MInst_sisi_hl<string opc, Intrinsic IntID>
    845   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    846              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
    847              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    848 
    849 class di_MInst_sisi_hl_s1<string opc, Intrinsic IntID>
    850   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    851              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<1")),
    852              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    853 
    854 class di_MInst_sisi_ll<string opc, Intrinsic IntID>
    855   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    856              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
    857              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    858 
    859 class di_MInst_sisi_ll_s1<string opc, Intrinsic IntID>
    860   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    861              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<1")),
    862              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    863 
    864 
    865 class si_MInst_sisi_hh<string opc, Intrinsic IntID>
    866   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    867              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
    868              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    869 
    870 class si_MInst_sisi_hh_s1<string opc, Intrinsic IntID>
    871   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    872              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<1")),
    873              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    874 
    875 class si_MInst_sisi_lh<string opc, Intrinsic IntID>
    876   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    877              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
    878              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    879 
    880 class si_MInst_sisi_lh_s1<string opc, Intrinsic IntID>
    881   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    882              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<1")),
    883              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    884 
    885 class si_MInst_sisi_hl<string opc, Intrinsic IntID>
    886   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    887              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
    888              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    889 
    890 class si_MInst_sisi_hl_s1<string opc, Intrinsic IntID>
    891   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    892              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<1")),
    893              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    894 
    895 class si_MInst_sisi_ll<string opc, Intrinsic IntID>
    896   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    897              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
    898              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    899 
    900 class si_MInst_sisi_ll_s1<string opc, Intrinsic IntID>
    901   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    902              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<1")),
    903              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    904 
    905 class si_MInst_sisi_up<string opc, Intrinsic IntID>
    906   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    907              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    908              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    909 
    910 class di_MInst_didi<string opc, Intrinsic IntID>
    911   : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    912              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
    913              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    914                                            DoubleRegs:$src2))]>;
    915 
    916 class di_MInst_didi_conj<string opc, Intrinsic IntID>
    917   : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    918              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2*)")),
    919              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    920                                            DoubleRegs:$src2))]>;
    921 
    922 class di_MInst_sisi_s1_sat_conj<string opc, Intrinsic IntID>
    923   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    924              !strconcat("$dst = ", !strconcat(opc ,
    925                                               "($src1, $src2*):<<1:sat")),
    926              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    927 
    928 class di_MInst_didi_s1_rnd_sat<string opc, Intrinsic IntID>
    929   : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    930              !strconcat("$dst = ", !strconcat(opc ,
    931                                               "($src1, $src2):<<1:rnd:sat")),
    932              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    933                                            DoubleRegs:$src2))]>;
    934 
    935 class di_MInst_didi_sat<string opc, Intrinsic IntID>
    936   : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    937              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
    938              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    939                                            DoubleRegs:$src2))]>;
    940 
    941 class di_MInst_didi_rnd_sat<string opc, Intrinsic IntID>
    942   : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    943              !strconcat("$dst = ", !strconcat(opc ,
    944                                               "($src1, $src2):rnd:sat")),
    945              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
    946                                            DoubleRegs:$src2))]>;
    947 
    948 class si_SInst_sisi_sat<string opc, Intrinsic IntID>
    949   : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    950           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
    951           [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    952 
    953 class si_SInst_didi_sat<string opc, Intrinsic IntID>
    954   : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
    955           !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
    956           [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
    957 
    958 class si_SInst_disi_s1_rnd_sat<string opc, Intrinsic IntID>
    959   : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
    960              !strconcat("$dst = ", !strconcat(opc ,
    961                                               "($src1, $src2):<<1:rnd:sat")),
    962              [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
    963 
    964 class si_MInst_sisi_s1_rnd_sat<string opc, Intrinsic IntID>
    965   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    966              !strconcat("$dst = ", !strconcat(opc ,
    967                                               "($src1, $src2):<<1:rnd:sat")),
    968              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    969 
    970 class si_MInst_sisi_l_s1_rnd_sat<string opc, Intrinsic IntID>
    971   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    972              !strconcat("$dst = ", !strconcat(opc ,
    973                                               "($src1, $src2.L):<<1:rnd:sat")),
    974              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    975 
    976 class si_MInst_sisi_h_s1_rnd_sat<string opc, Intrinsic IntID>
    977   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    978              !strconcat("$dst = ", !strconcat(opc ,
    979                                               "($src1, $src2.H):<<1:rnd:sat")),
    980              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    981 
    982 class si_MInst_sisi_rnd_sat_conj<string opc, Intrinsic IntID>
    983   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    984              !strconcat("$dst = ", !strconcat(opc ,
    985                                               "($src1, $src2*):rnd:sat")),
    986              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    987 
    988 class si_MInst_sisi_s1_rnd_sat_conj<string opc, Intrinsic IntID>
    989   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    990              !strconcat("$dst = ", !strconcat(opc ,
    991                                               "($src1, $src2*):<<1:rnd:sat")),
    992              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    993 
    994 class si_MInst_sisi_rnd_sat<string opc, Intrinsic IntID>
    995   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
    996              !strconcat("$dst = ", !strconcat(opc ,
    997                                               "($src1, $src2):rnd:sat")),
    998              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
    999 
   1000 class si_MInst_sisi_rnd<string opc, Intrinsic IntID>
   1001   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1002              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
   1003              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1004 
   1005 class si_MInst_sisisi_xacc<string opc, Intrinsic IntID>
   1006   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
   1007                                         IntRegs:$src3),
   1008              !strconcat("$dst ^= ", !strconcat(opc , "($src2, $src3)")),
   1009              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
   1010                                         IntRegs:$src3))],
   1011              "$dst2 = $dst">;
   1012 
   1013 class si_MInst_sisisi_acc<string opc, Intrinsic IntID>
   1014   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
   1015                                         IntRegs:$src3),
   1016              !strconcat("$dst += ", !strconcat(opc , "($src2, $src3)")),
   1017              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
   1018                                         IntRegs:$src3))],
   1019              "$dst2 = $dst">;
   1020 
   1021 class si_MInst_sisisi_nac<string opc, Intrinsic IntID>
   1022   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
   1023                                         IntRegs:$src3),
   1024              !strconcat("$dst -= ", !strconcat(opc , "($src2, $src3)")),
   1025              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
   1026                                         IntRegs:$src3))],
   1027              "$dst2 = $dst">;
   1028 
   1029 class si_MInst_sisis8_acc<string opc, Intrinsic IntID>
   1030   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
   1031                                         s8Imm:$src3),
   1032              !strconcat("$dst += ", !strconcat(opc , "($src2, #$src3)")),
   1033              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
   1034                                         imm:$src3))],
   1035              "$dst2 = $dst">;
   1036 
   1037 class si_MInst_sisis8_nac<string opc, Intrinsic IntID>
   1038   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
   1039                                         s8Imm:$src3),
   1040              !strconcat("$dst -= ", !strconcat(opc , "($src2, #$src3)")),
   1041              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
   1042                                         imm:$src3))],
   1043              "$dst2 = $dst">;
   1044 
   1045 class si_MInst_sisiu4u5<string opc, Intrinsic IntID>
   1046   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1047                                         u4Imm:$src2, u5Imm:$src3),
   1048                !strconcat("$dst = ", !strconcat(opc ,
   1049                                                 "($src1, #$src2, #$src3)")),
   1050                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1051                                           imm:$src2, imm:$src3))],
   1052                "$dst2 = $dst">;
   1053 
   1054 class si_MInst_sisiu8_acc<string opc, Intrinsic IntID>
   1055   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
   1056                                         u8Imm:$src3),
   1057                !strconcat("$dst += ", !strconcat(opc , "($src2, #$src3)")),
   1058                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
   1059                                           imm:$src3))],
   1060                "$dst2 = $dst">;
   1061 
   1062 class si_MInst_sisiu8_nac<string opc, Intrinsic IntID>
   1063   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
   1064                                         u8Imm:$src3),
   1065                !strconcat("$dst -= ", !strconcat(opc , "($src2, #$src3)")),
   1066                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
   1067                                           imm:$src3))],
   1068                "$dst2 = $dst">;
   1069 
   1070 class si_MInst_sisisi_acc_hh<string opc, Intrinsic IntID>
   1071   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1072                                         IntRegs:$src2),
   1073                !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.H)")),
   1074                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1075                                           IntRegs:$src2))],
   1076                "$dst2 = $dst">;
   1077 
   1078 class si_MInst_sisisi_acc_sat_lh<string opc, Intrinsic IntID>
   1079   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1080                                         IntRegs:$src2),
   1081                !strconcat("$dst += ", !strconcat(opc ,
   1082                                                  "($src1.L, $src2.H):sat")),
   1083                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1084                                           IntRegs:$src2))],
   1085                "$dst2 = $dst">;
   1086 
   1087 class si_MInst_sisisi_acc_sat_lh_s1<string opc, Intrinsic IntID>
   1088   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1089                                         IntRegs:$src2),
   1090                !strconcat("$dst += ", !strconcat(opc ,
   1091                                                  "($src1.L, $src2.H):<<1:sat")),
   1092                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1093                                           IntRegs:$src2))],
   1094                "$dst2 = $dst">;
   1095 
   1096 class si_MInst_sisisi_acc_sat_hh<string opc, Intrinsic IntID>
   1097   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1098                                         IntRegs:$src2),
   1099                !strconcat("$dst += ", !strconcat(opc ,
   1100                                                  "($src1.H, $src2.H):sat")),
   1101                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1102                                           IntRegs:$src2))],
   1103                "$dst2 = $dst">;
   1104 
   1105 class si_MInst_sisisi_acc_sat_hh_s1<string opc, Intrinsic IntID>
   1106   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1107                                         IntRegs:$src2),
   1108                !strconcat("$dst += ", !strconcat(opc ,
   1109                                                  "($src1.H, $src2.H):<<1:sat")),
   1110                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1111                                           IntRegs:$src2))],
   1112                "$dst2 = $dst">;
   1113 
   1114 class si_MInst_sisisi_acc_hh_s1<string opc, Intrinsic IntID>
   1115   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1116                                         IntRegs:$src2),
   1117                !strconcat("$dst += ", !strconcat(opc ,
   1118                                                  "($src1.H, $src2.H):<<1")),
   1119                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1120                                           IntRegs:$src2))],
   1121                "$dst2 = $dst">;
   1122 
   1123 class si_MInst_sisisi_nac_hh<string opc, Intrinsic IntID>
   1124   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1125                                         IntRegs:$src2),
   1126                !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.H)")),
   1127                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1128                                           IntRegs:$src2))],
   1129                "$dst2 = $dst">;
   1130 
   1131 class si_MInst_sisisi_nac_sat_hh_s1<string opc, Intrinsic IntID>
   1132   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1133                                         IntRegs:$src2),
   1134                !strconcat("$dst -= ", !strconcat(opc ,
   1135                                                  "($src1.H, $src2.H):<<1:sat")),
   1136                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1137                                           IntRegs:$src2))],
   1138                "$dst2 = $dst">;
   1139 
   1140 class si_MInst_sisisi_nac_sat_hh<string opc, Intrinsic IntID>
   1141   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1142                                         IntRegs:$src2),
   1143                !strconcat("$dst -= ", !strconcat(opc ,
   1144                                                  "($src1.H, $src2.H):sat")),
   1145                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1146                                           IntRegs:$src2))],
   1147                "$dst2 = $dst">;
   1148 
   1149 class si_MInst_sisisi_nac_sat_hl_s1<string opc, Intrinsic IntID>
   1150   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1151                                         IntRegs:$src2),
   1152                !strconcat("$dst -= ", !strconcat(opc ,
   1153                                                  "($src1.H, $src2.L):<<1:sat")),
   1154                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1155                                           IntRegs:$src2))],
   1156                "$dst2 = $dst">;
   1157 
   1158 class si_MInst_sisisi_nac_sat_hl<string opc, Intrinsic IntID>
   1159   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1160                                         IntRegs:$src2),
   1161                !strconcat("$dst -= ", !strconcat(opc ,
   1162                                                  "($src1.H, $src2.L):sat")),
   1163                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1164                                           IntRegs:$src2))],
   1165                "$dst2 = $dst">;
   1166 
   1167 class si_MInst_sisisi_nac_sat_lh_s1<string opc, Intrinsic IntID>
   1168   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1169                                         IntRegs:$src2),
   1170                !strconcat("$dst -= ", !strconcat(opc ,
   1171                                                  "($src1.L, $src2.H):<<1:sat")),
   1172                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1173                                           IntRegs:$src2))],
   1174                "$dst2 = $dst">;
   1175 
   1176 class si_MInst_sisisi_nac_sat_lh<string opc, Intrinsic IntID>
   1177   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1178                                         IntRegs:$src2),
   1179                !strconcat("$dst -= ", !strconcat(opc ,
   1180                                                  "($src1.L, $src2.H):sat")),
   1181                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1182                                           IntRegs:$src2))],
   1183                "$dst2 = $dst">;
   1184 
   1185 class si_MInst_sisisi_nac_sat_ll_s1<string opc, Intrinsic IntID>
   1186   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1187                                         IntRegs:$src2),
   1188                !strconcat("$dst -= ", !strconcat(opc ,
   1189                                                  "($src1.L, $src2.L):<<1:sat")),
   1190                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1191                                           IntRegs:$src2))],
   1192                "$dst2 = $dst">;
   1193 
   1194 class si_MInst_sisisi_nac_sat_ll<string opc, Intrinsic IntID>
   1195   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1196                                         IntRegs:$src2),
   1197                !strconcat("$dst -= ", !strconcat(opc ,
   1198                                                  "($src1.L, $src2.L):sat")),
   1199                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1200                                           IntRegs:$src2))],
   1201                "$dst2 = $dst">;
   1202 
   1203 class si_MInst_sisisi_nac_hh_s1<string opc, Intrinsic IntID>
   1204   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1205                                         IntRegs:$src2),
   1206                !strconcat("$dst -= ", !strconcat(opc ,
   1207                                                  "($src1.H, $src2.H):<<1")),
   1208                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1209                                           IntRegs:$src2))],
   1210                "$dst2 = $dst">;
   1211 
   1212 class si_MInst_sisisi_acc_hl<string opc, Intrinsic IntID>
   1213   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1214                                         IntRegs:$src2),
   1215                !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.L)")),
   1216                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1217                                           IntRegs:$src2))],
   1218                "$dst2 = $dst">;
   1219 
   1220 class si_MInst_sisisi_acc_hl_s1<string opc, Intrinsic IntID>
   1221   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1222                                         IntRegs:$src2),
   1223                !strconcat("$dst += ", !strconcat(opc ,
   1224                                                  "($src1.H, $src2.L):<<1")),
   1225                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1226                                           IntRegs:$src2))],
   1227                "$dst2 = $dst">;
   1228 
   1229 class si_MInst_sisisi_nac_hl<string opc, Intrinsic IntID>
   1230   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1231                                         IntRegs:$src2),
   1232                !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.L)")),
   1233                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1234                                           IntRegs:$src2))],
   1235                "$dst2 = $dst">;
   1236 
   1237 class si_MInst_sisisi_nac_hl_s1<string opc, Intrinsic IntID>
   1238   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1239                                         IntRegs:$src2),
   1240                !strconcat("$dst -= ", !strconcat(opc ,
   1241                                                  "($src1.H, $src2.L):<<1")),
   1242                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1243                                           IntRegs:$src2))],
   1244                "$dst2 = $dst">;
   1245 
   1246 class si_MInst_sisisi_acc_lh<string opc, Intrinsic IntID>
   1247   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1248                                         IntRegs:$src2),
   1249                !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.H)")),
   1250                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1251                                           IntRegs:$src2))],
   1252                "$dst2 = $dst">;
   1253 
   1254 class si_MInst_sisisi_acc_lh_s1<string opc, Intrinsic IntID>
   1255   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1256                                         IntRegs:$src2),
   1257                !strconcat("$dst += ", !strconcat(opc ,
   1258                                                  "($src1.L, $src2.H):<<1")),
   1259                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1260                                           IntRegs:$src2))],
   1261                "$dst2 = $dst">;
   1262 
   1263 class si_MInst_sisisi_nac_lh<string opc, Intrinsic IntID>
   1264   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1265                                         IntRegs:$src2),
   1266                !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.H)")),
   1267                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1268                                           IntRegs:$src2))],
   1269                "$dst2 = $dst">;
   1270 
   1271 class si_MInst_sisisi_nac_lh_s1<string opc, Intrinsic IntID>
   1272   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1273                                         IntRegs:$src2),
   1274                !strconcat("$dst -= ", !strconcat(opc ,
   1275                                                  "($src1.L, $src2.H):<<1")),
   1276                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1277                                           IntRegs:$src2))],
   1278                "$dst2 = $dst">;
   1279 
   1280 class si_MInst_sisisi_acc_ll<string opc, Intrinsic IntID>
   1281   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1282                                         IntRegs:$src2),
   1283                !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.L)")),
   1284                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1285                                           IntRegs:$src2))],
   1286                "$dst2 = $dst">;
   1287 
   1288 class si_MInst_sisisi_acc_ll_s1<string opc, Intrinsic IntID>
   1289   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1290                                         IntRegs:$src2),
   1291                !strconcat("$dst += ", !strconcat(opc ,
   1292                                                  "($src1.L, $src2.L):<<1")),
   1293                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1294                                           IntRegs:$src2))],
   1295                "$dst2 = $dst">;
   1296 
   1297 class si_MInst_sisisi_acc_sat_ll_s1<string opc, Intrinsic IntID>
   1298   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1299                                         IntRegs:$src2),
   1300                !strconcat("$dst += ", !strconcat(opc ,
   1301                                                  "($src1.L, $src2.L):<<1:sat")),
   1302                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1303                                           IntRegs:$src2))],
   1304                "$dst2 = $dst">;
   1305 
   1306 class si_MInst_sisisi_acc_sat_hl_s1<string opc, Intrinsic IntID>
   1307   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1308                                         IntRegs:$src2),
   1309                !strconcat("$dst += ", !strconcat(opc ,
   1310                                                  "($src1.H, $src2.L):<<1:sat")),
   1311                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1312                                           IntRegs:$src2))],
   1313                "$dst2 = $dst">;
   1314 
   1315 class si_MInst_sisisi_acc_sat_ll<string opc, Intrinsic IntID>
   1316   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1317                                         IntRegs:$src2),
   1318                !strconcat("$dst += ", !strconcat(opc ,
   1319                                                  "($src1.L, $src2.L):sat")),
   1320                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1321                                           IntRegs:$src2))],
   1322                "$dst2 = $dst">;
   1323 
   1324 class si_MInst_sisisi_acc_sat_hl<string opc, Intrinsic IntID>
   1325   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1326                                         IntRegs:$src2),
   1327                !strconcat("$dst += ", !strconcat(opc ,
   1328                                                  "($src1.H, $src2.L):sat")),
   1329                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1330                                           IntRegs:$src2))],
   1331                "$dst2 = $dst">;
   1332 
   1333 class si_MInst_sisisi_nac_ll<string opc, Intrinsic IntID>
   1334   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1335                                         IntRegs:$src2),
   1336                !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.L)")),
   1337                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1338                                           IntRegs:$src2))],
   1339                "$dst2 = $dst">;
   1340 
   1341 class si_MInst_sisisi_nac_ll_s1<string opc, Intrinsic IntID>
   1342   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1343                                         IntRegs:$src2),
   1344                !strconcat("$dst -= ", !strconcat(opc ,
   1345                                                  "($src1.L, $src2.L):<<1")),
   1346                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1347                                           IntRegs:$src2))],
   1348                "$dst2 = $dst">;
   1349 
   1350 class si_MInst_sisisi_nac_hh_sat<string opc, Intrinsic IntID>
   1351   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1352                                         IntRegs:$src2),
   1353                !strconcat("$dst -= ", !strconcat(opc ,
   1354                                                  "($src1.H, $src2.H):sat")),
   1355                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1356                                           IntRegs:$src2))],
   1357                "$dst2 = $dst">;
   1358 
   1359 class si_MInst_sisisi_nac_hh_s1_sat<string opc, Intrinsic IntID>
   1360   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1361                                         IntRegs:$src2),
   1362                !strconcat("$dst -= ", !strconcat(opc ,
   1363                                                  "($src1.H, $src2.H):<<1:sat")),
   1364                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1365                                           IntRegs:$src2))],
   1366                "$dst2 = $dst">;
   1367 
   1368 class si_MInst_sisisi_nac_hl_sat<string opc, Intrinsic IntID>
   1369   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1370                                         IntRegs:$src2),
   1371                !strconcat("$dst -= ", !strconcat(opc ,
   1372                                                  "($src1.H, $src2.L):sat")),
   1373                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1374                                           IntRegs:$src2))],
   1375                "$dst2 = $dst">;
   1376 
   1377 class si_MInst_sisisi_nac_hl_s1_sat<string opc, Intrinsic IntID>
   1378   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1379                                         IntRegs:$src2),
   1380                !strconcat("$dst -= ", !strconcat(opc ,
   1381                                                  "($src1.H, $src2.L):<<1:sat")),
   1382                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1383                                           IntRegs:$src2))],
   1384                "$dst2 = $dst">;
   1385 
   1386 class si_MInst_sisisi_nac_lh_sat<string opc, Intrinsic IntID>
   1387   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1388                                         IntRegs:$src2),
   1389                !strconcat("$dst -= ", !strconcat(opc ,
   1390                                                  "($src1.L, $src2.H):sat")),
   1391                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1392                                           IntRegs:$src2))],
   1393                "$dst2 = $dst">;
   1394 
   1395 class si_MInst_sisisi_nac_lh_s1_sat<string opc, Intrinsic IntID>
   1396   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1397                                         IntRegs:$src2),
   1398                !strconcat("$dst -= ", !strconcat(opc ,
   1399                                                  "($src1.L, $src2.H):<<1:sat")),
   1400                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1401                                           IntRegs:$src2))],
   1402                "$dst2 = $dst">;
   1403 
   1404 class si_MInst_sisisi_nac_ll_sat<string opc, Intrinsic IntID>
   1405   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1406                                         IntRegs:$src2),
   1407                !strconcat("$dst -= ", !strconcat(opc ,
   1408                                                  "($src1.L, $src2.L):sat")),
   1409                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1410                                           IntRegs:$src2))],
   1411                "$dst2 = $dst">;
   1412 
   1413 class si_MInst_sisisi_nac_ll_s1_sat<string opc, Intrinsic IntID>
   1414   : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
   1415                                         IntRegs:$src2),
   1416                !strconcat("$dst -= ", !strconcat(opc ,
   1417                                                  "($src1.L, $src2.L):<<1:sat")),
   1418                [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
   1419                                           IntRegs:$src2))],
   1420                "$dst2 = $dst">;
   1421 
   1422 class di_ALU32_sisi<string opc, Intrinsic IntID>
   1423   : ALU32_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1424              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
   1425              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1426 
   1427 class di_MInst_sisi<string opc, Intrinsic IntID>
   1428   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1429              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
   1430              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1431 
   1432 class di_MInst_sisi_sat<string opc, Intrinsic IntID>
   1433   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1434              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
   1435              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1436 
   1437 class di_MInst_sisi_sat_conj<string opc, Intrinsic IntID>
   1438   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1439              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2*):sat")),
   1440              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1441 
   1442 class di_MInst_sisi_s1_sat<string opc, Intrinsic IntID>
   1443   : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1444              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
   1445              [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1446 
   1447 class di_MInst_didi_s1_sat<string opc, Intrinsic IntID>
   1448   : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
   1449              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
   1450              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
   1451                                            DoubleRegs:$src2))]>;
   1452 
   1453 class si_MInst_didi_s1_rnd_sat<string opc, Intrinsic IntID>
   1454   : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
   1455              !strconcat("$dst = ", !strconcat(opc ,
   1456                                               "($src1, $src2):<<1:rnd:sat")),
   1457              [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
   1458 
   1459 class si_MInst_didi_rnd_sat<string opc, Intrinsic IntID>
   1460   : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
   1461              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd:sat")),
   1462              [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
   1463 
   1464 class si_MInst_sisi_sat_hh<string opc, Intrinsic IntID>
   1465   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1466              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):sat")),
   1467              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1468 
   1469 class si_MInst_sisi_sat_hh_s1<string opc, Intrinsic IntID>
   1470   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1471                !strconcat("$dst = ", !strconcat(opc ,
   1472                                                 "($src1.H, $src2.H):<<1:sat")),
   1473                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1474 
   1475 class si_MInst_sisi_sat_hl<string opc, Intrinsic IntID>
   1476   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1477              !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):sat")),
   1478              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1479 
   1480 class si_MInst_sisi_sat_hl_s1<string opc, Intrinsic IntID>
   1481   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1482                !strconcat("$dst = ", !strconcat(opc ,
   1483                                                 "($src1.H, $src2.L):<<1:sat")),
   1484                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1485 
   1486 class si_MInst_sisi_sat_lh<string opc, Intrinsic IntID>
   1487   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1488              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
   1489              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1490 
   1491 class si_MInst_sisi_sat_lh_s1<string opc, Intrinsic IntID>
   1492   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1493                !strconcat("$dst = ", !strconcat(opc ,
   1494                                                 "($src1.L, $src2.H):<<1:sat")),
   1495                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1496 
   1497 class si_MInst_sisi_sat_ll<string opc, Intrinsic IntID>
   1498   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1499              !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):sat")),
   1500              [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1501 
   1502 class si_MInst_sisi_sat_ll_s1<string opc, Intrinsic IntID>
   1503   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1504                !strconcat("$dst = ", !strconcat(opc ,
   1505                                                 "($src1.L, $src2.L):<<1:sat")),
   1506                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1507 
   1508 class si_MInst_sisi_sat_rnd_hh<string opc, Intrinsic IntID>
   1509   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1510                !strconcat("$dst = ", !strconcat(opc ,
   1511                                                 "($src1.H, $src2.H):rnd:sat")),
   1512                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1513 
   1514 class si_MInst_sisi_rnd_hh<string opc, Intrinsic IntID>
   1515   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1516                !strconcat("$dst = ", !strconcat(opc ,
   1517                                                 "($src1.H, $src2.H):rnd")),
   1518                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1519 
   1520 class si_MInst_sisi_rnd_hh_s1<string opc, Intrinsic IntID>
   1521   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1522                !strconcat("$dst = ", !strconcat(opc ,
   1523                                                 "($src1.H, $src2.H):<<1:rnd")),
   1524                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1525 
   1526 class si_MInst_sisi_sat_rnd_hh_s1<string opc, Intrinsic IntID>
   1527   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1528                !strconcat("$dst = ",
   1529                           !strconcat(opc ,
   1530                                      "($src1.H, $src2.H):<<1:rnd:sat")),
   1531                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1532 
   1533 class si_MInst_sisi_rnd_hl<string opc, Intrinsic IntID>
   1534   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1535                !strconcat("$dst = ",
   1536                           !strconcat(opc , "($src1.H, $src2.L):rnd")),
   1537                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1538 
   1539 class si_MInst_sisi_rnd_hl_s1<string opc, Intrinsic IntID>
   1540   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1541                !strconcat("$dst = ",
   1542                           !strconcat(opc , "($src1.H, $src2.L):<<1:rnd")),
   1543                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1544 
   1545 class si_MInst_sisi_sat_rnd_hl<string opc, Intrinsic IntID>
   1546   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1547                !strconcat("$dst = ",
   1548                           !strconcat(opc , "($src1.H, $src2.L):rnd:sat")),
   1549                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1550 
   1551 class si_MInst_sisi_sat_rnd_hl_s1<string opc, Intrinsic IntID>
   1552   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1553                !strconcat("$dst = ",
   1554                           !strconcat(opc , "($src1.H, $src2.L):<<1:rnd:sat")),
   1555                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1556 
   1557 class si_MInst_sisi_rnd_lh<string opc, Intrinsic IntID>
   1558   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1559                !strconcat("$dst = ",
   1560                           !strconcat(opc , "($src1.L, $src2.H):rnd")),
   1561                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1562 
   1563 class si_MInst_sisi_sat_rnd_lh<string opc, Intrinsic IntID>
   1564   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1565                !strconcat("$dst = ",
   1566                           !strconcat(opc , "($src1.L, $src2.H):rnd:sat")),
   1567                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1568 
   1569 class si_MInst_sisi_sat_rnd_lh_s1<string opc, Intrinsic IntID>
   1570   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1571                !strconcat("$dst = ",
   1572                           !strconcat(opc , "($src1.L, $src2.H):<<1:rnd:sat")),
   1573                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1574 
   1575 class si_MInst_sisi_rnd_lh_s1<string opc, Intrinsic IntID>
   1576   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1577                !strconcat("$dst = ",
   1578                           !strconcat(opc , "($src1.L, $src2.H):<<1:rnd")),
   1579                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1580 
   1581 class si_MInst_sisi_sat_rnd_ll<string opc, Intrinsic IntID>
   1582   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1583                !strconcat("$dst = ",
   1584                           !strconcat(opc , "($src1.L, $src2.L):rnd:sat")),
   1585                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1586 
   1587 class si_MInst_sisi_sat_rnd_ll_s1<string opc, Intrinsic IntID>
   1588   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1589                !strconcat("$dst = ",
   1590                           !strconcat(opc , "($src1.L, $src2.L):<<1:rnd:sat")),
   1591                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1592 
   1593 class si_MInst_sisi_rnd_ll<string opc, Intrinsic IntID>
   1594   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1595                !strconcat("$dst = ",
   1596                           !strconcat(opc , "($src1.L, $src2.L):rnd")),
   1597                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1598 
   1599 class si_MInst_sisi_rnd_ll_s1<string opc, Intrinsic IntID>
   1600   : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
   1601                !strconcat("$dst = ",
   1602                           !strconcat(opc , "($src1.L, $src2.L):<<1:rnd")),
   1603                [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
   1604 
   1605 class di_MInst_dididi_acc_sat<string opc, Intrinsic IntID>
   1606   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
   1607                                            DoubleRegs:$src1, DoubleRegs:$src2),
   1608                !strconcat("$dst += ", !strconcat(opc , "($src1, $src2):sat")),
   1609                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
   1610                                              DoubleRegs:$src1,
   1611                                              DoubleRegs:$src2))],
   1612                "$dst2 = $dst">;
   1613 
   1614 class di_MInst_dididi_acc_rnd_sat<string opc, Intrinsic IntID>
   1615   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
   1616                                            DoubleRegs:$src2),
   1617                !strconcat("$dst += ",
   1618                           !strconcat(opc , "($src1, $src2):rnd:sat")),
   1619                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
   1620                                              DoubleRegs:$src1,
   1621                                              DoubleRegs:$src2))],
   1622                "$dst2 = $dst">;
   1623 
   1624 class di_MInst_dididi_acc_s1<string opc, Intrinsic IntID>
   1625   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
   1626                                            DoubleRegs:$src1,
   1627                                            DoubleRegs:$src2),
   1628                !strconcat("$dst += ",
   1629                           !strconcat(opc , "($src1, $src2):<<1")),
   1630                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
   1631                                              DoubleRegs:$src1,
   1632                                              DoubleRegs:$src2))],
   1633                "$dst2 = $dst">;
   1634 
   1635 
   1636 class di_MInst_dididi_acc_s1_sat<string opc, Intrinsic IntID>
   1637   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
   1638                                            DoubleRegs:$src1,
   1639                                            DoubleRegs:$src2),
   1640                !strconcat("$dst += ",
   1641                           !strconcat(opc , "($src1, $src2):<<1:sat")),
   1642                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
   1643                                              DoubleRegs:$src1,
   1644                                              DoubleRegs:$src2))],
   1645                "$dst2 = $dst">;
   1646 
   1647 class di_MInst_dididi_acc_s1_rnd_sat<string opc, Intrinsic IntID>
   1648   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
   1649                                            DoubleRegs:$src2),
   1650                !strconcat("$dst += ",
   1651                           !strconcat(opc , "($src1, $src2):<<1:rnd:sat")),
   1652                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
   1653                                              DoubleRegs:$src1,
   1654                                              DoubleRegs:$src2))],
   1655                "$dst2 = $dst">;
   1656 
   1657 class di_MInst_dididi_acc<string opc, Intrinsic IntID>
   1658   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
   1659                                            DoubleRegs:$src2),
   1660                !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
   1661                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
   1662                                              DoubleRegs:$src1,
   1663                                              DoubleRegs:$src2))],
   1664                "$dst2 = $dst">;
   1665 
   1666 class di_MInst_dididi_acc_conj<string opc, Intrinsic IntID>
   1667   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
   1668                                            DoubleRegs:$src2),
   1669                !strconcat("$dst += ", !strconcat(opc , "($src1, $src2*)")),
   1670                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
   1671                                              DoubleRegs:$src1,
   1672                                              DoubleRegs:$src2))],
   1673                "$dst2 = $dst">;
   1674 
   1675 class di_MInst_disisi_acc_hh<string opc, Intrinsic IntID>
   1676   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1677                                            IntRegs:$src2),
   1678                !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.H)")),
   1679                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1680                                              IntRegs:$src2))],
   1681                "$dst2 = $dst">;
   1682 
   1683 class di_MInst_disisi_acc_hl<string opc, Intrinsic IntID>
   1684   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1685                                            IntRegs:$src2),
   1686                !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.L)")),
   1687                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1688                                              IntRegs:$src2))],
   1689                "$dst2 = $dst">;
   1690 
   1691 class di_MInst_disisi_acc_lh<string opc, Intrinsic IntID>
   1692   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1693                                            IntRegs:$src2),
   1694                !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.H)")),
   1695                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1696                                              IntRegs:$src2))],
   1697                "$dst2 = $dst">;
   1698 
   1699 class di_MInst_disisi_acc_ll<string opc, Intrinsic IntID>
   1700   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1701                                            IntRegs:$src2),
   1702                !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.L)")),
   1703                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1704                                              IntRegs:$src2))],
   1705                "$dst2 = $dst">;
   1706 
   1707 class di_MInst_disisi_acc_hh_s1<string opc, Intrinsic IntID>
   1708   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1709                                            IntRegs:$src2),
   1710                !strconcat("$dst += ",
   1711                           !strconcat(opc , "($src1.H, $src2.H):<<1")),
   1712                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1713                                              IntRegs:$src2))],
   1714                "$dst2 = $dst">;
   1715 
   1716 class di_MInst_disisi_acc_hl_s1<string opc, Intrinsic IntID>
   1717   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1718                                            IntRegs:$src2),
   1719                !strconcat("$dst += ",
   1720                           !strconcat(opc , "($src1.H, $src2.L):<<1")),
   1721                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1722                                              IntRegs:$src2))],
   1723                "$dst2 = $dst">;
   1724 
   1725 class di_MInst_disisi_acc_lh_s1<string opc, Intrinsic IntID>
   1726   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1727                                            IntRegs:$src2),
   1728                !strconcat("$dst += ",
   1729                           !strconcat(opc , "($src1.L, $src2.H):<<1")),
   1730                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1731                                              IntRegs:$src2))],
   1732                "$dst2 = $dst">;
   1733 
   1734 class di_MInst_disisi_acc_ll_s1<string opc, Intrinsic IntID>
   1735   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1736                                            IntRegs:$src2),
   1737                !strconcat("$dst += ",
   1738                           !strconcat(opc , "($src1.L, $src2.L):<<1")),
   1739                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1740                                              IntRegs:$src2))],
   1741                "$dst2 = $dst">;
   1742 
   1743 class di_MInst_disisi_nac_hh<string opc, Intrinsic IntID>
   1744   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1745                                            IntRegs:$src2),
   1746                !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.H)")),
   1747                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1748                                              IntRegs:$src2))],
   1749                "$dst2 = $dst">;
   1750 
   1751 class di_MInst_disisi_nac_hl<string opc, Intrinsic IntID>
   1752   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1753                                            IntRegs:$src2),
   1754                !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.L)")),
   1755                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1756                                              IntRegs:$src2))],
   1757                "$dst2 = $dst">;
   1758 
   1759 class di_MInst_disisi_nac_lh<string opc, Intrinsic IntID>
   1760   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1761                                            IntRegs:$src2),
   1762                !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.H)")),
   1763                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1764                                              IntRegs:$src2))],
   1765                "$dst2 = $dst">;
   1766 
   1767 class di_MInst_disisi_nac_ll<string opc, Intrinsic IntID>
   1768   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1769                                            IntRegs:$src2),
   1770                !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.L)")),
   1771                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1772                                              IntRegs:$src2))],
   1773                "$dst2 = $dst">;
   1774 
   1775 class di_MInst_disisi_nac_hh_s1<string opc, Intrinsic IntID>
   1776   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1777                                            IntRegs:$src2),
   1778                !strconcat("$dst -= ",
   1779                           !strconcat(opc , "($src1.H, $src2.H):<<1")),
   1780                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1781                                              IntRegs:$src2))],
   1782                "$dst2 = $dst">;
   1783 
   1784 class di_MInst_disisi_nac_hl_s1<string opc, Intrinsic IntID>
   1785   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1786                                            IntRegs:$src2),
   1787                !strconcat("$dst -= ",
   1788                           !strconcat(opc , "($src1.H, $src2.L):<<1")),
   1789                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1790                                              IntRegs:$src2))],
   1791                "$dst2 = $dst">;
   1792 
   1793 class di_MInst_disisi_nac_lh_s1<string opc, Intrinsic IntID>
   1794   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1795                                            IntRegs:$src2),
   1796                !strconcat("$dst -= ",
   1797                           !strconcat(opc , "($src1.L, $src2.H):<<1")),
   1798                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1799                                              IntRegs:$src2))],
   1800                "$dst2 = $dst">;
   1801 
   1802 class di_MInst_disisi_nac_ll_s1<string opc, Intrinsic IntID>
   1803   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1804                                            IntRegs:$src2),
   1805                !strconcat("$dst -= ",
   1806                           !strconcat(opc , "($src1.L, $src2.L):<<1")),
   1807                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1808                                              IntRegs:$src2))],
   1809                "$dst2 = $dst">;
   1810 
   1811 class di_MInst_disisi_acc_s1_sat<string opc, Intrinsic IntID>
   1812   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
   1813                                            IntRegs:$src2),
   1814                !strconcat("$dst += ",
   1815                           !strconcat(opc , "($src1, $src2):<<1:sat")),
   1816                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
   1817                                              IntRegs:$src2))],
   1818                "$dst2 = $dst">;
   1819 
   1820 class di_MInst_disi_s1_sat<string opc, Intrinsic IntID>
   1821   : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
   1822              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
   1823              [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
   1824 
   1825 class di_MInst_didisi_acc_s1_sat<string opc, Intrinsic IntID>
   1826   : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
   1827                                            IntRegs:$src2),
   1828                !strconcat("$dst += ",
   1829                           !strconcat(opc , "($src1, $src2):<<1:sat")),
   1830                [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
   1831                                              DoubleRegs:$src1,
   1832                                              IntRegs:$src2))],
   1833                "$dst2 = $dst">;
   1834 
   1835 class si_MInst_disi_s1_rnd_sat<string opc, Intrinsic IntID>
   1836   : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
   1837              !strconcat("$dst = ",
   1838                         !strconcat(opc , "($src1, $src2):<<1:rnd:sat")),
   1839              [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
   1840 
   1841 class si_MInst_didi<string opc, Intrinsic IntID>
   1842   : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
   1843              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
   1844              [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
   1845 
   1846 //
   1847 // LDInst classes.
   1848 //
   1849 let mayLoad = 1, neverHasSideEffects = 1 in
   1850 class di_LDInstPI_diu4<string opc, Intrinsic IntID>
   1851   : LDInstPI<(outs IntRegs:$dst, DoubleRegs:$dst2),
   1852            (ins IntRegs:$src1, IntRegs:$src2, CRRegs:$src3, s4Imm:$offset),
   1853            "$dst2 = memd($src1++#$offset:circ($src3))",
   1854            [],
   1855            "$src1 = $dst">;
   1856 
   1857 /********************************************************************
   1858 *            ALU32/ALU                                              *
   1859 *********************************************************************/
   1860 
   1861 // ALU32 / ALU / Add.
   1862 def HEXAGON_A2_add:
   1863   si_ALU32_sisi                   <"add",      int_hexagon_A2_add>;
   1864 def HEXAGON_A2_addi:
   1865   si_ALU32_sis16                  <"add",      int_hexagon_A2_addi>;
   1866 
   1867 // ALU32 / ALU / Logical operations.
   1868 def HEXAGON_A2_and:
   1869   si_ALU32_sisi                   <"and",      int_hexagon_A2_and>;
   1870 def HEXAGON_A2_andir:
   1871   si_ALU32_sis10                  <"and",      int_hexagon_A2_andir>;
   1872 def HEXAGON_A2_not:
   1873   si_ALU32_si                     <"not",      int_hexagon_A2_not>;
   1874 def HEXAGON_A2_or:
   1875   si_ALU32_sisi                   <"or",       int_hexagon_A2_or>;
   1876 def HEXAGON_A2_orir:
   1877   si_ALU32_sis10                  <"or",       int_hexagon_A2_orir>;
   1878 def HEXAGON_A2_xor:
   1879   si_ALU32_sisi                   <"xor",      int_hexagon_A2_xor>;
   1880 
   1881 // ALU32 / ALU / Negate.
   1882 def HEXAGON_A2_neg:
   1883   si_ALU32_si                     <"neg",      int_hexagon_A2_neg>;
   1884 
   1885 // ALU32 / ALU / Subtract.
   1886 def HEXAGON_A2_sub:
   1887   si_ALU32_sisi                   <"sub",      int_hexagon_A2_sub>;
   1888 def HEXAGON_A2_subri:
   1889   si_ALU32_s10si                  <"sub",      int_hexagon_A2_subri>;
   1890 
   1891 // ALU32 / ALU / Transfer Immediate.
   1892 def HEXAGON_A2_tfril:
   1893   si_lo_ALU32_siu16               <"",         int_hexagon_A2_tfril>;
   1894 def HEXAGON_A2_tfrih:
   1895   si_hi_ALU32_siu16               <"",         int_hexagon_A2_tfrih>;
   1896 def HEXAGON_A2_tfrsi:
   1897   si_ALU32_s16                    <"",         int_hexagon_A2_tfrsi>;
   1898 def HEXAGON_A2_tfrpi:
   1899   di_ALU32_s8                     <"",         int_hexagon_A2_tfrpi>;
   1900 
   1901 // ALU32 / ALU / Transfer Register.
   1902 def HEXAGON_A2_tfr:
   1903   si_ALU32_si_tfr                  <"",        int_hexagon_A2_tfr>;
   1904 
   1905 /********************************************************************
   1906 *            ALU32/PERM                                             *
   1907 *********************************************************************/
   1908 
   1909 // ALU32 / PERM / Combine.
   1910 def HEXAGON_A2_combinew:
   1911   di_ALU32_sisi                   <"combine",  int_hexagon_A2_combinew>;
   1912 def HEXAGON_A2_combine_hh:
   1913   si_MInst_sisi_hh                <"combine",  int_hexagon_A2_combine_hh>;
   1914 def HEXAGON_A2_combine_lh:
   1915   si_MInst_sisi_lh                <"combine",  int_hexagon_A2_combine_lh>;
   1916 def HEXAGON_A2_combine_hl:
   1917   si_MInst_sisi_hl                <"combine",  int_hexagon_A2_combine_hl>;
   1918 def HEXAGON_A2_combine_ll:
   1919   si_MInst_sisi_ll                <"combine",  int_hexagon_A2_combine_ll>;
   1920 def HEXAGON_A2_combineii:
   1921   di_MInst_s8s8                   <"combine",  int_hexagon_A2_combineii>;
   1922 
   1923 // ALU32 / PERM / Mux.
   1924 def HEXAGON_C2_mux:
   1925   si_ALU32_qisisi                 <"mux",      int_hexagon_C2_mux>;
   1926 def HEXAGON_C2_muxri:
   1927   si_ALU32_qis8si                 <"mux",      int_hexagon_C2_muxri>;
   1928 def HEXAGON_C2_muxir:
   1929   si_ALU32_qisis8                 <"mux",      int_hexagon_C2_muxir>;
   1930 def HEXAGON_C2_muxii:
   1931   si_ALU32_qis8s8                 <"mux",      int_hexagon_C2_muxii>;
   1932 
   1933 // ALU32 / PERM / Shift halfword.
   1934 def HEXAGON_A2_aslh:
   1935   si_ALU32_si                     <"aslh",     int_hexagon_A2_aslh>;
   1936 def HEXAGON_A2_asrh:
   1937   si_ALU32_si                     <"asrh",     int_hexagon_A2_asrh>;
   1938 def SI_to_SXTHI_asrh:
   1939   si_ALU32_si                     <"asrh",     int_hexagon_SI_to_SXTHI_asrh>;
   1940 
   1941 // ALU32 / PERM / Sign/zero extend.
   1942 def HEXAGON_A2_sxth:
   1943   si_ALU32_si                     <"sxth",     int_hexagon_A2_sxth>;
   1944 def HEXAGON_A2_sxtb:
   1945   si_ALU32_si                     <"sxtb",     int_hexagon_A2_sxtb>;
   1946 def HEXAGON_A2_zxth:
   1947   si_ALU32_si                     <"zxth",     int_hexagon_A2_zxth>;
   1948 def HEXAGON_A2_zxtb:
   1949   si_ALU32_si                     <"zxtb",     int_hexagon_A2_zxtb>;
   1950 
   1951 /********************************************************************
   1952 *            ALU32/PRED                                             *
   1953 *********************************************************************/
   1954 
   1955 // ALU32 / PRED / Compare.
   1956 def HEXAGON_C2_cmpeq:
   1957   qi_ALU32_sisi                   <"cmp.eq",   int_hexagon_C2_cmpeq>;
   1958 def HEXAGON_C2_cmpeqi:
   1959   qi_ALU32_sis10                  <"cmp.eq",   int_hexagon_C2_cmpeqi>;
   1960 def HEXAGON_C2_cmpgei:
   1961   qi_ALU32_sis8                   <"cmp.ge",   int_hexagon_C2_cmpgei>;
   1962 def HEXAGON_C2_cmpgeui:
   1963   qi_ALU32_siu8                   <"cmp.geu",  int_hexagon_C2_cmpgeui>;
   1964 def HEXAGON_C2_cmpgt:
   1965   qi_ALU32_sisi                   <"cmp.gt",   int_hexagon_C2_cmpgt>;
   1966 def HEXAGON_C2_cmpgti:
   1967   qi_ALU32_sis10                  <"cmp.gt",   int_hexagon_C2_cmpgti>;
   1968 def HEXAGON_C2_cmpgtu:
   1969   qi_ALU32_sisi                   <"cmp.gtu",  int_hexagon_C2_cmpgtu>;
   1970 def HEXAGON_C2_cmpgtui:
   1971   qi_ALU32_siu9                   <"cmp.gtu",  int_hexagon_C2_cmpgtui>;
   1972 def HEXAGON_C2_cmplt:
   1973   qi_ALU32_sisi                   <"cmp.lt",   int_hexagon_C2_cmplt>;
   1974 def HEXAGON_C2_cmpltu:
   1975   qi_ALU32_sisi                   <"cmp.ltu",  int_hexagon_C2_cmpltu>;
   1976 
   1977 /********************************************************************
   1978 *            ALU32/VH                                               *
   1979 *********************************************************************/
   1980 
   1981 // ALU32 / VH / Vector add halfwords.
   1982 // Rd32=vadd[u]h(Rs32,Rt32:sat]
   1983 def HEXAGON_A2_svaddh:
   1984   si_ALU32_sisi                   <"vaddh",    int_hexagon_A2_svaddh>;
   1985 def HEXAGON_A2_svaddhs:
   1986   si_ALU32_sisi_sat               <"vaddh",    int_hexagon_A2_svaddhs>;
   1987 def HEXAGON_A2_svadduhs:
   1988   si_ALU32_sisi_sat               <"vadduh",   int_hexagon_A2_svadduhs>;
   1989 
   1990 // ALU32 / VH / Vector average halfwords.
   1991 def HEXAGON_A2_svavgh:
   1992   si_ALU32_sisi                   <"vavgh",    int_hexagon_A2_svavgh>;
   1993 def HEXAGON_A2_svavghs:
   1994   si_ALU32_sisi_rnd               <"vavgh",    int_hexagon_A2_svavghs>;
   1995 def HEXAGON_A2_svnavgh:
   1996   si_ALU32_sisi                   <"vnavgh",   int_hexagon_A2_svnavgh>;
   1997 
   1998 // ALU32 / VH / Vector subtract halfwords.
   1999 def HEXAGON_A2_svsubh:
   2000   si_ALU32_sisi                   <"vsubh",    int_hexagon_A2_svsubh>;
   2001 def HEXAGON_A2_svsubhs:
   2002   si_ALU32_sisi_sat               <"vsubh",    int_hexagon_A2_svsubhs>;
   2003 def HEXAGON_A2_svsubuhs:
   2004   si_ALU32_sisi_sat               <"vsubuh",   int_hexagon_A2_svsubuhs>;
   2005 
   2006 /********************************************************************
   2007 *            ALU64/ALU                                              *
   2008 *********************************************************************/
   2009 
   2010 // ALU64 / ALU / Add.
   2011 def HEXAGON_A2_addp:
   2012   di_ALU64_didi                   <"add",      int_hexagon_A2_addp>;
   2013 def HEXAGON_A2_addsat:
   2014   si_ALU64_sisi_sat               <"add",      int_hexagon_A2_addsat>;
   2015 
   2016 // ALU64 / ALU / Add halfword.
   2017 // Even though the definition says hl, it should be lh -
   2018 //so DON'T change the class " si_ALU64_sisi_l16_lh " it inherits.
   2019 def HEXAGON_A2_addh_l16_hl:
   2020   si_ALU64_sisi_l16_lh            <"add",      int_hexagon_A2_addh_l16_hl>;
   2021 def HEXAGON_A2_addh_l16_ll:
   2022   si_ALU64_sisi_l16_ll            <"add",      int_hexagon_A2_addh_l16_ll>;
   2023 
   2024 def HEXAGON_A2_addh_l16_sat_hl:
   2025   si_ALU64_sisi_l16_sat_lh        <"add",      int_hexagon_A2_addh_l16_sat_hl>;
   2026 def HEXAGON_A2_addh_l16_sat_ll:
   2027   si_ALU64_sisi_l16_sat_ll        <"add",      int_hexagon_A2_addh_l16_sat_ll>;
   2028 
   2029 def HEXAGON_A2_addh_h16_hh:
   2030   si_ALU64_sisi_h16_hh            <"add",      int_hexagon_A2_addh_h16_hh>;
   2031 def HEXAGON_A2_addh_h16_hl:
   2032   si_ALU64_sisi_h16_hl            <"add",      int_hexagon_A2_addh_h16_hl>;
   2033 def HEXAGON_A2_addh_h16_lh:
   2034   si_ALU64_sisi_h16_lh            <"add",      int_hexagon_A2_addh_h16_lh>;
   2035 def HEXAGON_A2_addh_h16_ll:
   2036   si_ALU64_sisi_h16_ll            <"add",      int_hexagon_A2_addh_h16_ll>;
   2037 
   2038 def HEXAGON_A2_addh_h16_sat_hh:
   2039   si_ALU64_sisi_h16_sat_hh        <"add",      int_hexagon_A2_addh_h16_sat_hh>;
   2040 def HEXAGON_A2_addh_h16_sat_hl:
   2041   si_ALU64_sisi_h16_sat_hl        <"add",      int_hexagon_A2_addh_h16_sat_hl>;
   2042 def HEXAGON_A2_addh_h16_sat_lh:
   2043   si_ALU64_sisi_h16_sat_lh        <"add",      int_hexagon_A2_addh_h16_sat_lh>;
   2044 def HEXAGON_A2_addh_h16_sat_ll:
   2045   si_ALU64_sisi_h16_sat_ll        <"add",      int_hexagon_A2_addh_h16_sat_ll>;
   2046 
   2047 // ALU64 / ALU / Compare.
   2048 def HEXAGON_C2_cmpeqp:
   2049   qi_ALU64_didi                   <"cmp.eq",   int_hexagon_C2_cmpeqp>;
   2050 def HEXAGON_C2_cmpgtp:
   2051   qi_ALU64_didi                   <"cmp.gt",   int_hexagon_C2_cmpgtp>;
   2052 def HEXAGON_C2_cmpgtup:
   2053   qi_ALU64_didi                   <"cmp.gtu",  int_hexagon_C2_cmpgtup>;
   2054 
   2055 // ALU64 / ALU / Logical operations.
   2056 def HEXAGON_A2_andp:
   2057   di_ALU64_didi                   <"and",      int_hexagon_A2_andp>;
   2058 def HEXAGON_A2_orp:
   2059   di_ALU64_didi                   <"or",       int_hexagon_A2_orp>;
   2060 def HEXAGON_A2_xorp:
   2061   di_ALU64_didi                   <"xor",      int_hexagon_A2_xorp>;
   2062 
   2063 // ALU64 / ALU / Maximum.
   2064 def HEXAGON_A2_max:
   2065   si_ALU64_sisi                   <"max",      int_hexagon_A2_max>;
   2066 def HEXAGON_A2_maxu:
   2067   si_ALU64_sisi                   <"maxu",     int_hexagon_A2_maxu>;
   2068 
   2069 // ALU64 / ALU / Minimum.
   2070 def HEXAGON_A2_min:
   2071   si_ALU64_sisi                   <"min",      int_hexagon_A2_min>;
   2072 def HEXAGON_A2_minu:
   2073   si_ALU64_sisi                   <"minu",     int_hexagon_A2_minu>;
   2074 
   2075 // ALU64 / ALU / Subtract.
   2076 def HEXAGON_A2_subp:
   2077   di_ALU64_didi                   <"sub",      int_hexagon_A2_subp>;
   2078 def HEXAGON_A2_subsat:
   2079   si_ALU64_sisi_sat               <"sub",      int_hexagon_A2_subsat>;
   2080 
   2081 // ALU64 / ALU / Subtract halfword.
   2082 // Even though the definition says hl, it should be lh -
   2083 //so DON'T change the class " si_ALU64_sisi_l16_lh " it inherits.
   2084 def HEXAGON_A2_subh_l16_hl:
   2085   si_ALU64_sisi_l16_lh            <"sub",      int_hexagon_A2_subh_l16_hl>;
   2086 def HEXAGON_A2_subh_l16_ll:
   2087   si_ALU64_sisi_l16_ll            <"sub",      int_hexagon_A2_subh_l16_ll>;
   2088 
   2089 def HEXAGON_A2_subh_l16_sat_hl:
   2090   si_ALU64_sisi_l16_sat_lh        <"sub",      int_hexagon_A2_subh_l16_sat_hl>;
   2091 def HEXAGON_A2_subh_l16_sat_ll:
   2092   si_ALU64_sisi_l16_sat_ll        <"sub",      int_hexagon_A2_subh_l16_sat_ll>;
   2093 
   2094 def HEXAGON_A2_subh_h16_hh:
   2095   si_ALU64_sisi_h16_hh            <"sub",      int_hexagon_A2_subh_h16_hh>;
   2096 def HEXAGON_A2_subh_h16_hl:
   2097   si_ALU64_sisi_h16_hl            <"sub",      int_hexagon_A2_subh_h16_hl>;
   2098 def HEXAGON_A2_subh_h16_lh:
   2099   si_ALU64_sisi_h16_lh            <"sub",      int_hexagon_A2_subh_h16_lh>;
   2100 def HEXAGON_A2_subh_h16_ll:
   2101   si_ALU64_sisi_h16_ll            <"sub",      int_hexagon_A2_subh_h16_ll>;
   2102 
   2103 def HEXAGON_A2_subh_h16_sat_hh:
   2104   si_ALU64_sisi_h16_sat_hh        <"sub",      int_hexagon_A2_subh_h16_sat_hh>;
   2105 def HEXAGON_A2_subh_h16_sat_hl:
   2106   si_ALU64_sisi_h16_sat_hl        <"sub",      int_hexagon_A2_subh_h16_sat_hl>;
   2107 def HEXAGON_A2_subh_h16_sat_lh:
   2108   si_ALU64_sisi_h16_sat_lh        <"sub",      int_hexagon_A2_subh_h16_sat_lh>;
   2109 def HEXAGON_A2_subh_h16_sat_ll:
   2110   si_ALU64_sisi_h16_sat_ll        <"sub",      int_hexagon_A2_subh_h16_sat_ll>;
   2111 
   2112 // ALU64 / ALU / Transfer register.
   2113 def HEXAGON_A2_tfrp:
   2114   di_ALU64_di                     <"",         int_hexagon_A2_tfrp>;
   2115 
   2116 /********************************************************************
   2117 *            ALU64/BIT                                              *
   2118 *********************************************************************/
   2119 
   2120 // ALU64 / BIT / Masked parity.
   2121 def HEXAGON_S2_parityp:
   2122   si_ALU64_didi                   <"parity",   int_hexagon_S2_parityp>;
   2123 
   2124 /********************************************************************
   2125 *            ALU64/PERM                                             *
   2126 *********************************************************************/
   2127 
   2128 // ALU64 / PERM / Vector pack high and low halfwords.
   2129 def HEXAGON_S2_packhl:
   2130   di_ALU64_sisi                   <"packhl",   int_hexagon_S2_packhl>;
   2131 
   2132 /********************************************************************
   2133 *            ALU64/VB                                               *
   2134 *********************************************************************/
   2135 
   2136 // ALU64 / VB / Vector add unsigned bytes.
   2137 def HEXAGON_A2_vaddub:
   2138   di_ALU64_didi                   <"vaddub",   int_hexagon_A2_vaddub>;
   2139 def HEXAGON_A2_vaddubs:
   2140   di_ALU64_didi_sat               <"vaddub",   int_hexagon_A2_vaddubs>;
   2141 
   2142 // ALU64 / VB / Vector average unsigned bytes.
   2143 def HEXAGON_A2_vavgub:
   2144   di_ALU64_didi                   <"vavgub",   int_hexagon_A2_vavgub>;
   2145 def HEXAGON_A2_vavgubr:
   2146   di_ALU64_didi_rnd               <"vavgub",   int_hexagon_A2_vavgubr>;
   2147 
   2148 // ALU64 / VB / Vector compare unsigned bytes.
   2149 def HEXAGON_A2_vcmpbeq:
   2150   qi_ALU64_didi                   <"vcmpb.eq", int_hexagon_A2_vcmpbeq>;
   2151 def HEXAGON_A2_vcmpbgtu:
   2152   qi_ALU64_didi                   <"vcmpb.gtu",int_hexagon_A2_vcmpbgtu>;
   2153 
   2154 // ALU64 / VB / Vector maximum/minimum unsigned bytes.
   2155 def HEXAGON_A2_vmaxub:
   2156   di_ALU64_didi                   <"vmaxub",   int_hexagon_A2_vmaxub>;
   2157 def HEXAGON_A2_vminub:
   2158   di_ALU64_didi                   <"vminub",   int_hexagon_A2_vminub>;
   2159 
   2160 // ALU64 / VB / Vector subtract unsigned bytes.
   2161 def HEXAGON_A2_vsubub:
   2162   di_ALU64_didi                   <"vsubub",   int_hexagon_A2_vsubub>;
   2163 def HEXAGON_A2_vsububs:
   2164   di_ALU64_didi_sat               <"vsubub",   int_hexagon_A2_vsububs>;
   2165 
   2166 // ALU64 / VB / Vector mux.
   2167 def HEXAGON_C2_vmux:
   2168   di_ALU64_qididi                 <"vmux",     int_hexagon_C2_vmux>;
   2169 
   2170 
   2171 /********************************************************************
   2172 *            ALU64/VH                                               *
   2173 *********************************************************************/
   2174 
   2175 // ALU64 / VH / Vector add halfwords.
   2176 // Rdd64=vadd[u]h(Rss64,Rtt64:sat]
   2177 def HEXAGON_A2_vaddh:
   2178   di_ALU64_didi                   <"vaddh",    int_hexagon_A2_vaddh>;
   2179 def HEXAGON_A2_vaddhs:
   2180   di_ALU64_didi_sat               <"vaddh",    int_hexagon_A2_vaddhs>;
   2181 def HEXAGON_A2_vadduhs:
   2182   di_ALU64_didi_sat               <"vadduh",   int_hexagon_A2_vadduhs>;
   2183 
   2184 // ALU64 / VH / Vector average halfwords.
   2185 // Rdd64=v[n]avg[u]h(Rss64,Rtt64:rnd/:crnd][:sat]
   2186 def HEXAGON_A2_vavgh:
   2187   di_ALU64_didi                   <"vavgh",    int_hexagon_A2_vavgh>;
   2188 def HEXAGON_A2_vavghcr:
   2189   di_ALU64_didi_crnd              <"vavgh",    int_hexagon_A2_vavghcr>;
   2190 def HEXAGON_A2_vavghr:
   2191   di_ALU64_didi_rnd               <"vavgh",    int_hexagon_A2_vavghr>;
   2192 def HEXAGON_A2_vavguh:
   2193   di_ALU64_didi                   <"vavguh",   int_hexagon_A2_vavguh>;
   2194 def HEXAGON_A2_vavguhr:
   2195   di_ALU64_didi_rnd               <"vavguh",   int_hexagon_A2_vavguhr>;
   2196 def HEXAGON_A2_vnavgh:
   2197   di_ALU64_didi                   <"vnavgh",   int_hexagon_A2_vnavgh>;
   2198 def HEXAGON_A2_vnavghcr:
   2199   di_ALU64_didi_crnd_sat          <"vnavgh",   int_hexagon_A2_vnavghcr>;
   2200 def HEXAGON_A2_vnavghr:
   2201   di_ALU64_didi_rnd_sat           <"vnavgh",   int_hexagon_A2_vnavghr>;
   2202 
   2203 // ALU64 / VH / Vector compare halfwords.
   2204 def HEXAGON_A2_vcmpheq:
   2205   qi_ALU64_didi                   <"vcmph.eq", int_hexagon_A2_vcmpheq>;
   2206 def HEXAGON_A2_vcmphgt:
   2207   qi_ALU64_didi                   <"vcmph.gt", int_hexagon_A2_vcmphgt>;
   2208 def HEXAGON_A2_vcmphgtu:
   2209   qi_ALU64_didi                   <"vcmph.gtu",int_hexagon_A2_vcmphgtu>;
   2210 
   2211 // ALU64 / VH / Vector maximum halfwords.
   2212 def HEXAGON_A2_vmaxh:
   2213   di_ALU64_didi                   <"vmaxh",    int_hexagon_A2_vmaxh>;
   2214 def HEXAGON_A2_vmaxuh:
   2215   di_ALU64_didi                   <"vmaxuh",   int_hexagon_A2_vmaxuh>;
   2216 
   2217 // ALU64 / VH / Vector minimum halfwords.
   2218 def HEXAGON_A2_vminh:
   2219   di_ALU64_didi                   <"vminh",    int_hexagon_A2_vminh>;
   2220 def HEXAGON_A2_vminuh:
   2221   di_ALU64_didi                   <"vminuh",   int_hexagon_A2_vminuh>;
   2222 
   2223 // ALU64 / VH / Vector subtract halfwords.
   2224 def HEXAGON_A2_vsubh:
   2225   di_ALU64_didi                   <"vsubh",    int_hexagon_A2_vsubh>;
   2226 def HEXAGON_A2_vsubhs:
   2227   di_ALU64_didi_sat               <"vsubh",    int_hexagon_A2_vsubhs>;
   2228 def HEXAGON_A2_vsubuhs:
   2229   di_ALU64_didi_sat               <"vsubuh",   int_hexagon_A2_vsubuhs>;
   2230 
   2231 
   2232 /********************************************************************
   2233 *            ALU64/VW                                               *
   2234 *********************************************************************/
   2235 
   2236 // ALU64 / VW / Vector add words.
   2237 // Rdd32=vaddw(Rss32,Rtt32)[:sat]
   2238 def HEXAGON_A2_vaddw:
   2239   di_ALU64_didi                   <"vaddw",    int_hexagon_A2_vaddw>;
   2240 def HEXAGON_A2_vaddws:
   2241   di_ALU64_didi_sat               <"vaddw",   int_hexagon_A2_vaddws>;
   2242 
   2243 // ALU64 / VW / Vector average words.
   2244 def HEXAGON_A2_vavguw:
   2245   di_ALU64_didi                   <"vavguw",   int_hexagon_A2_vavguw>;
   2246 def HEXAGON_A2_vavguwr:
   2247   di_ALU64_didi_rnd               <"vavguw",   int_hexagon_A2_vavguwr>;
   2248 def HEXAGON_A2_vavgw:
   2249   di_ALU64_didi                   <"vavgw",    int_hexagon_A2_vavgw>;
   2250 def HEXAGON_A2_vavgwcr:
   2251   di_ALU64_didi_crnd              <"vavgw",    int_hexagon_A2_vavgwcr>;
   2252 def HEXAGON_A2_vavgwr:
   2253   di_ALU64_didi_rnd               <"vavgw",    int_hexagon_A2_vavgwr>;
   2254 def HEXAGON_A2_vnavgw:
   2255   di_ALU64_didi                   <"vnavgw",   int_hexagon_A2_vnavgw>;
   2256 def HEXAGON_A2_vnavgwcr:
   2257   di_ALU64_didi_crnd_sat          <"vnavgw",   int_hexagon_A2_vnavgwcr>;
   2258 def HEXAGON_A2_vnavgwr:
   2259   di_ALU64_didi_rnd_sat           <"vnavgw",   int_hexagon_A2_vnavgwr>;
   2260 
   2261 // ALU64 / VW / Vector compare words.
   2262 def HEXAGON_A2_vcmpweq:
   2263   qi_ALU64_didi                   <"vcmpw.eq", int_hexagon_A2_vcmpweq>;
   2264 def HEXAGON_A2_vcmpwgt:
   2265   qi_ALU64_didi                   <"vcmpw.gt", int_hexagon_A2_vcmpwgt>;
   2266 def HEXAGON_A2_vcmpwgtu:
   2267   qi_ALU64_didi                   <"vcmpw.gtu",int_hexagon_A2_vcmpwgtu>;
   2268 
   2269 // ALU64 / VW / Vector maximum words.
   2270 def HEXAGON_A2_vmaxw:
   2271   di_ALU64_didi                   <"vmaxw",    int_hexagon_A2_vmaxw>;
   2272 def HEXAGON_A2_vmaxuw:
   2273   di_ALU64_didi                   <"vmaxuw",   int_hexagon_A2_vmaxuw>;
   2274 
   2275 // ALU64 / VW / Vector minimum words.
   2276 def HEXAGON_A2_vminw:
   2277   di_ALU64_didi                   <"vminw",    int_hexagon_A2_vminw>;
   2278 def HEXAGON_A2_vminuw:
   2279   di_ALU64_didi                   <"vminuw",   int_hexagon_A2_vminuw>;
   2280 
   2281 // ALU64 / VW / Vector subtract words.
   2282 def HEXAGON_A2_vsubw:
   2283   di_ALU64_didi                   <"vsubw",    int_hexagon_A2_vsubw>;
   2284 def HEXAGON_A2_vsubws:
   2285   di_ALU64_didi_sat               <"vsubw",    int_hexagon_A2_vsubws>;
   2286 
   2287 
   2288 /********************************************************************
   2289 *            CR                                                     *
   2290 *********************************************************************/
   2291 
   2292 // CR / Logical reductions on predicates.
   2293 def HEXAGON_C2_all8:
   2294   qi_SInst_qi                     <"all8",     int_hexagon_C2_all8>;
   2295 def HEXAGON_C2_any8:
   2296   qi_SInst_qi                     <"any8",     int_hexagon_C2_any8>;
   2297 
   2298 // CR / Logical operations on predicates.
   2299 def HEXAGON_C2_pxfer_map:
   2300   qi_SInst_qi_pxfer               <"",         int_hexagon_C2_pxfer_map>;
   2301 def HEXAGON_C2_and:
   2302   qi_SInst_qiqi                   <"and",      int_hexagon_C2_and>;
   2303 def HEXAGON_C2_andn:
   2304   qi_SInst_qiqi_neg               <"and",      int_hexagon_C2_andn>;
   2305 def HEXAGON_C2_not:
   2306   qi_SInst_qi                     <"not",      int_hexagon_C2_not>;
   2307 def HEXAGON_C2_or:
   2308   qi_SInst_qiqi                   <"or",       int_hexagon_C2_or>;
   2309 def HEXAGON_C2_orn:
   2310   qi_SInst_qiqi_neg               <"or",       int_hexagon_C2_orn>;
   2311 def HEXAGON_C2_xor:
   2312   qi_SInst_qiqi                   <"xor",      int_hexagon_C2_xor>;
   2313 
   2314 
   2315 /********************************************************************
   2316 *            MTYPE/ALU                                              *
   2317 *********************************************************************/
   2318 
   2319 // MTYPE / ALU / Add and accumulate.
   2320 def HEXAGON_M2_acci:
   2321   si_MInst_sisisi_acc             <"add",      int_hexagon_M2_acci>;
   2322 def HEXAGON_M2_accii:
   2323   si_MInst_sisis8_acc             <"add",      int_hexagon_M2_accii>;
   2324 def HEXAGON_M2_nacci:
   2325   si_MInst_sisisi_nac             <"add",      int_hexagon_M2_nacci>;
   2326 def HEXAGON_M2_naccii:
   2327   si_MInst_sisis8_nac             <"add",      int_hexagon_M2_naccii>;
   2328 
   2329 // MTYPE / ALU / Subtract and accumulate.
   2330 def HEXAGON_M2_subacc:
   2331   si_MInst_sisisi_acc             <"sub",      int_hexagon_M2_subacc>;
   2332 
   2333 // MTYPE / ALU / Vector absolute difference.
   2334 def HEXAGON_M2_vabsdiffh:
   2335   di_MInst_didi                   <"vabsdiffh",int_hexagon_M2_vabsdiffh>;
   2336 def HEXAGON_M2_vabsdiffw:
   2337   di_MInst_didi                   <"vabsdiffw",int_hexagon_M2_vabsdiffw>;
   2338 
   2339 // MTYPE / ALU / XOR and xor with destination.
   2340 def HEXAGON_M2_xor_xacc:
   2341   si_MInst_sisisi_xacc            <"xor",      int_hexagon_M2_xor_xacc>;
   2342 
   2343 
   2344 /********************************************************************
   2345 *            MTYPE/COMPLEX                                          *
   2346 *********************************************************************/
   2347 
   2348 // MTYPE / COMPLEX / Complex multiply.
   2349 // Rdd[-+]=cmpy(Rs, Rt:<<1]:sat
   2350 def HEXAGON_M2_cmpys_s1:
   2351   di_MInst_sisi_s1_sat            <"cmpy",     int_hexagon_M2_cmpys_s1>;
   2352 def HEXAGON_M2_cmpys_s0:
   2353   di_MInst_sisi_sat               <"cmpy",     int_hexagon_M2_cmpys_s0>;
   2354 def HEXAGON_M2_cmpysc_s1:
   2355   di_MInst_sisi_s1_sat_conj       <"cmpy",     int_hexagon_M2_cmpysc_s1>;
   2356 def HEXAGON_M2_cmpysc_s0:
   2357   di_MInst_sisi_sat_conj          <"cmpy",     int_hexagon_M2_cmpysc_s0>;
   2358 
   2359 def HEXAGON_M2_cmacs_s1:
   2360   di_MInst_disisi_acc_s1_sat      <"cmpy",     int_hexagon_M2_cmacs_s1>;
   2361 def HEXAGON_M2_cmacs_s0:
   2362   di_MInst_disisi_acc_sat         <"cmpy",     int_hexagon_M2_cmacs_s0>;
   2363 def HEXAGON_M2_cmacsc_s1:
   2364   di_MInst_disisi_acc_s1_sat_conj <"cmpy",     int_hexagon_M2_cmacsc_s1>;
   2365 def HEXAGON_M2_cmacsc_s0:
   2366   di_MInst_disisi_acc_sat_conj    <"cmpy",     int_hexagon_M2_cmacsc_s0>;
   2367 
   2368 def HEXAGON_M2_cnacs_s1:
   2369   di_MInst_disisi_nac_s1_sat      <"cmpy",     int_hexagon_M2_cnacs_s1>;
   2370 def HEXAGON_M2_cnacs_s0:
   2371   di_MInst_disisi_nac_sat         <"cmpy",     int_hexagon_M2_cnacs_s0>;
   2372 def HEXAGON_M2_cnacsc_s1:
   2373   di_MInst_disisi_nac_s1_sat_conj <"cmpy",     int_hexagon_M2_cnacsc_s1>;
   2374 def HEXAGON_M2_cnacsc_s0:
   2375   di_MInst_disisi_nac_sat_conj    <"cmpy",     int_hexagon_M2_cnacsc_s0>;
   2376 
   2377 // MTYPE / COMPLEX / Complex multiply real or imaginary.
   2378 def HEXAGON_M2_cmpyr_s0:
   2379   di_MInst_sisi                   <"cmpyr",    int_hexagon_M2_cmpyr_s0>;
   2380 def HEXAGON_M2_cmacr_s0:
   2381   di_MInst_disisi_acc             <"cmpyr",    int_hexagon_M2_cmacr_s0>;
   2382 
   2383 def HEXAGON_M2_cmpyi_s0:
   2384   di_MInst_sisi                   <"cmpyi",    int_hexagon_M2_cmpyi_s0>;
   2385 def HEXAGON_M2_cmaci_s0:
   2386   di_MInst_disisi_acc             <"cmpyi",    int_hexagon_M2_cmaci_s0>;
   2387 
   2388 // MTYPE / COMPLEX / Complex multiply with round and pack.
   2389 // Rxx32+=cmpy(Rs32,[*]Rt32:<<1]:rnd:sat
   2390 def HEXAGON_M2_cmpyrs_s0:
   2391   si_MInst_sisi_rnd_sat           <"cmpy",     int_hexagon_M2_cmpyrs_s0>;
   2392 def HEXAGON_M2_cmpyrs_s1:
   2393   si_MInst_sisi_s1_rnd_sat        <"cmpy",     int_hexagon_M2_cmpyrs_s1>;
   2394 
   2395 def HEXAGON_M2_cmpyrsc_s0:
   2396   si_MInst_sisi_rnd_sat_conj      <"cmpy",     int_hexagon_M2_cmpyrsc_s0>;
   2397 def HEXAGON_M2_cmpyrsc_s1:
   2398   si_MInst_sisi_s1_rnd_sat_conj   <"cmpy",     int_hexagon_M2_cmpyrsc_s1>;
   2399 
   2400 //MTYPE / COMPLEX / Vector complex multiply real or imaginary.
   2401 def HEXAGON_M2_vcmpy_s0_sat_i:
   2402   di_MInst_didi_sat               <"vcmpyi",   int_hexagon_M2_vcmpy_s0_sat_i>;
   2403 def HEXAGON_M2_vcmpy_s1_sat_i:
   2404   di_MInst_didi_s1_sat            <"vcmpyi",   int_hexagon_M2_vcmpy_s1_sat_i>;
   2405 
   2406 def HEXAGON_M2_vcmpy_s0_sat_r:
   2407   di_MInst_didi_sat               <"vcmpyr",   int_hexagon_M2_vcmpy_s0_sat_r>;
   2408 def HEXAGON_M2_vcmpy_s1_sat_r:
   2409   di_MInst_didi_s1_sat            <"vcmpyr",   int_hexagon_M2_vcmpy_s1_sat_r>;
   2410 
   2411 def HEXAGON_M2_vcmac_s0_sat_i:
   2412   di_MInst_dididi_acc_sat         <"vcmpyi",   int_hexagon_M2_vcmac_s0_sat_i>;
   2413 def HEXAGON_M2_vcmac_s0_sat_r:
   2414   di_MInst_dididi_acc_sat         <"vcmpyr",   int_hexagon_M2_vcmac_s0_sat_r>;
   2415 
   2416 //MTYPE / COMPLEX / Vector reduce complex multiply real or imaginary.
   2417 def HEXAGON_M2_vrcmpyi_s0:
   2418   di_MInst_didi                   <"vrcmpyi",  int_hexagon_M2_vrcmpyi_s0>;
   2419 def HEXAGON_M2_vrcmpyr_s0:
   2420   di_MInst_didi                   <"vrcmpyr",  int_hexagon_M2_vrcmpyr_s0>;
   2421 
   2422 def HEXAGON_M2_vrcmpyi_s0c:
   2423   di_MInst_didi_conj              <"vrcmpyi",  int_hexagon_M2_vrcmpyi_s0c>;
   2424 def HEXAGON_M2_vrcmpyr_s0c:
   2425   di_MInst_didi_conj              <"vrcmpyr",  int_hexagon_M2_vrcmpyr_s0c>;
   2426 
   2427 def HEXAGON_M2_vrcmaci_s0:
   2428   di_MInst_dididi_acc             <"vrcmpyi",  int_hexagon_M2_vrcmaci_s0>;
   2429 def HEXAGON_M2_vrcmacr_s0:
   2430   di_MInst_dididi_acc             <"vrcmpyr",  int_hexagon_M2_vrcmacr_s0>;
   2431 
   2432 def HEXAGON_M2_vrcmaci_s0c:
   2433   di_MInst_dididi_acc_conj        <"vrcmpyi",  int_hexagon_M2_vrcmaci_s0c>;
   2434 def HEXAGON_M2_vrcmacr_s0c:
   2435   di_MInst_dididi_acc_conj        <"vrcmpyr",  int_hexagon_M2_vrcmacr_s0c>;
   2436 
   2437 
   2438 /********************************************************************
   2439 *            MTYPE/MPYH                                             *
   2440 *********************************************************************/
   2441 
   2442 // MTYPE / MPYH / Multiply and use lower result.
   2443 //def HEXAGON_M2_mpysmi:
   2444 //FIXME: Hexagon_M2_mpysmi should really by of the type si_MInst_sim9,
   2445 // not si_MInst_sis9 - but for now, we will use s9.
   2446 // def Hexagon_M2_mpysmi:
   2447 //  si_MInst_sim9                   <"mpyi",     int_hexagon_M2_mpysmi>;
   2448 def Hexagon_M2_mpysmi:
   2449   si_MInst_sis9                   <"mpyi",     int_hexagon_M2_mpysmi>;
   2450 def HEXAGON_M2_mpyi:
   2451   si_MInst_sisi                   <"mpyi",     int_hexagon_M2_mpyi>;
   2452 def HEXAGON_M2_mpyui:
   2453   si_MInst_sisi                   <"mpyui",    int_hexagon_M2_mpyui>;
   2454 def HEXAGON_M2_macsip:
   2455   si_MInst_sisiu8_acc             <"mpyi",     int_hexagon_M2_macsip>;
   2456 def HEXAGON_M2_maci:
   2457   si_MInst_sisisi_acc             <"mpyi",     int_hexagon_M2_maci>;
   2458 def HEXAGON_M2_macsin:
   2459   si_MInst_sisiu8_nac             <"mpyi",     int_hexagon_M2_macsin>;
   2460 
   2461 // MTYPE / MPYH / Multiply word by half (32x16).
   2462 //Rdd[+]=vmpywoh(Rss,Rtt)[:<<1][:rnd][:sat]
   2463 //Rdd[+]=vmpyweh(Rss,Rtt)[:<<1][:rnd][:sat]
   2464 def HEXAGON_M2_mmpyl_rs1:
   2465   di_MInst_didi_s1_rnd_sat        <"vmpyweh",  int_hexagon_M2_mmpyl_rs1>;
   2466 def HEXAGON_M2_mmpyl_s1:
   2467   di_MInst_didi_s1_sat            <"vmpyweh",  int_hexagon_M2_mmpyl_s1>;
   2468 def HEXAGON_M2_mmpyl_rs0:
   2469   di_MInst_didi_rnd_sat           <"vmpyweh",  int_hexagon_M2_mmpyl_rs0>;
   2470 def HEXAGON_M2_mmpyl_s0:
   2471   di_MInst_didi_sat               <"vmpyweh",  int_hexagon_M2_mmpyl_s0>;
   2472 def HEXAGON_M2_mmpyh_rs1:
   2473   di_MInst_didi_s1_rnd_sat        <"vmpywoh",  int_hexagon_M2_mmpyh_rs1>;
   2474 def HEXAGON_M2_mmpyh_s1:
   2475   di_MInst_didi_s1_sat            <"vmpywoh",  int_hexagon_M2_mmpyh_s1>;
   2476 def HEXAGON_M2_mmpyh_rs0:
   2477   di_MInst_didi_rnd_sat           <"vmpywoh",  int_hexagon_M2_mmpyh_rs0>;
   2478 def HEXAGON_M2_mmpyh_s0:
   2479   di_MInst_didi_sat               <"vmpywoh",  int_hexagon_M2_mmpyh_s0>;
   2480 def HEXAGON_M2_mmacls_rs1:
   2481   di_MInst_dididi_acc_s1_rnd_sat  <"vmpyweh",  int_hexagon_M2_mmacls_rs1>;
   2482 def HEXAGON_M2_mmacls_s1:
   2483   di_MInst_dididi_acc_s1_sat      <"vmpyweh",  int_hexagon_M2_mmacls_s1>;
   2484 def HEXAGON_M2_mmacls_rs0:
   2485   di_MInst_dididi_acc_rnd_sat     <"vmpyweh",  int_hexagon_M2_mmacls_rs0>;
   2486 def HEXAGON_M2_mmacls_s0:
   2487   di_MInst_dididi_acc_sat         <"vmpyweh",  int_hexagon_M2_mmacls_s0>;
   2488 def HEXAGON_M2_mmachs_rs1:
   2489   di_MInst_dididi_acc_s1_rnd_sat  <"vmpywoh",  int_hexagon_M2_mmachs_rs1>;
   2490 def HEXAGON_M2_mmachs_s1:
   2491   di_MInst_dididi_acc_s1_sat      <"vmpywoh",  int_hexagon_M2_mmachs_s1>;
   2492 def HEXAGON_M2_mmachs_rs0:
   2493   di_MInst_dididi_acc_rnd_sat     <"vmpywoh",  int_hexagon_M2_mmachs_rs0>;
   2494 def HEXAGON_M2_mmachs_s0:
   2495   di_MInst_dididi_acc_sat         <"vmpywoh",  int_hexagon_M2_mmachs_s0>;
   2496 
   2497 // MTYPE / MPYH / Multiply word by unsigned half (32x16).
   2498 //Rdd[+]=vmpywouh(Rss,Rtt)[:<<1][:rnd][:sat]
   2499 //Rdd[+]=vmpyweuh(Rss,Rtt)[:<<1][:rnd][:sat]
   2500 def HEXAGON_M2_mmpyul_rs1:
   2501   di_MInst_didi_s1_rnd_sat        <"vmpyweuh", int_hexagon_M2_mmpyul_rs1>;
   2502 def HEXAGON_M2_mmpyul_s1:
   2503   di_MInst_didi_s1_sat            <"vmpyweuh", int_hexagon_M2_mmpyul_s1>;
   2504 def HEXAGON_M2_mmpyul_rs0:
   2505   di_MInst_didi_rnd_sat           <"vmpyweuh", int_hexagon_M2_mmpyul_rs0>;
   2506 def HEXAGON_M2_mmpyul_s0:
   2507   di_MInst_didi_sat               <"vmpyweuh", int_hexagon_M2_mmpyul_s0>;
   2508 def HEXAGON_M2_mmpyuh_rs1:
   2509   di_MInst_didi_s1_rnd_sat        <"vmpywouh", int_hexagon_M2_mmpyuh_rs1>;
   2510 def HEXAGON_M2_mmpyuh_s1:
   2511   di_MInst_didi_s1_sat            <"vmpywouh", int_hexagon_M2_mmpyuh_s1>;
   2512 def HEXAGON_M2_mmpyuh_rs0:
   2513   di_MInst_didi_rnd_sat           <"vmpywouh", int_hexagon_M2_mmpyuh_rs0>;
   2514 def HEXAGON_M2_mmpyuh_s0:
   2515   di_MInst_didi_sat               <"vmpywouh", int_hexagon_M2_mmpyuh_s0>;
   2516 def HEXAGON_M2_mmaculs_rs1:
   2517   di_MInst_dididi_acc_s1_rnd_sat  <"vmpyweuh", int_hexagon_M2_mmaculs_rs1>;
   2518 def HEXAGON_M2_mmaculs_s1:
   2519   di_MInst_dididi_acc_s1_sat      <"vmpyweuh", int_hexagon_M2_mmaculs_s1>;
   2520 def HEXAGON_M2_mmaculs_rs0:
   2521   di_MInst_dididi_acc_rnd_sat     <"vmpyweuh", int_hexagon_M2_mmaculs_rs0>;
   2522 def HEXAGON_M2_mmaculs_s0:
   2523   di_MInst_dididi_acc_sat         <"vmpyweuh", int_hexagon_M2_mmaculs_s0>;
   2524 def HEXAGON_M2_mmacuhs_rs1:
   2525   di_MInst_dididi_acc_s1_rnd_sat  <"vmpywouh", int_hexagon_M2_mmacuhs_rs1>;
   2526 def HEXAGON_M2_mmacuhs_s1:
   2527   di_MInst_dididi_acc_s1_sat      <"vmpywouh", int_hexagon_M2_mmacuhs_s1>;
   2528 def HEXAGON_M2_mmacuhs_rs0:
   2529   di_MInst_dididi_acc_rnd_sat     <"vmpywouh", int_hexagon_M2_mmacuhs_rs0>;
   2530 def HEXAGON_M2_mmacuhs_s0:
   2531   di_MInst_dididi_acc_sat         <"vmpywouh", int_hexagon_M2_mmacuhs_s0>;
   2532 
   2533 // MTYPE / MPYH / Multiply and use upper result.
   2534 def HEXAGON_M2_hmmpyh_rs1:
   2535   si_MInst_sisi_h_s1_rnd_sat      <"mpy",      int_hexagon_M2_hmmpyh_rs1>;
   2536 def HEXAGON_M2_hmmpyl_rs1:
   2537   si_MInst_sisi_l_s1_rnd_sat      <"mpy",      int_hexagon_M2_hmmpyl_rs1>;
   2538 def HEXAGON_M2_mpy_up:
   2539   si_MInst_sisi                   <"mpy",      int_hexagon_M2_mpy_up>;
   2540 def HEXAGON_M2_dpmpyss_rnd_s0:
   2541   si_MInst_sisi_rnd               <"mpy",      int_hexagon_M2_dpmpyss_rnd_s0>;
   2542 def HEXAGON_M2_mpyu_up:
   2543   si_MInst_sisi                   <"mpyu",     int_hexagon_M2_mpyu_up>;
   2544 
   2545 // MTYPE / MPYH / Multiply and use full result.
   2546 def HEXAGON_M2_dpmpyuu_s0:
   2547   di_MInst_sisi                   <"mpyu",     int_hexagon_M2_dpmpyuu_s0>;
   2548 def HEXAGON_M2_dpmpyuu_acc_s0:
   2549   di_MInst_disisi_acc             <"mpyu",     int_hexagon_M2_dpmpyuu_acc_s0>;
   2550 def HEXAGON_M2_dpmpyuu_nac_s0:
   2551   di_MInst_disisi_nac             <"mpyu",     int_hexagon_M2_dpmpyuu_nac_s0>;
   2552 def HEXAGON_M2_dpmpyss_s0:
   2553   di_MInst_sisi                   <"mpy",      int_hexagon_M2_dpmpyss_s0>;
   2554 def HEXAGON_M2_dpmpyss_acc_s0:
   2555   di_MInst_disisi_acc             <"mpy",      int_hexagon_M2_dpmpyss_acc_s0>;
   2556 def HEXAGON_M2_dpmpyss_nac_s0:
   2557   di_MInst_disisi_nac             <"mpy",      int_hexagon_M2_dpmpyss_nac_s0>;
   2558 
   2559 
   2560 /********************************************************************
   2561 *            MTYPE/MPYS                                             *
   2562 *********************************************************************/
   2563 
   2564 // MTYPE / MPYS / Scalar 16x16 multiply signed.
   2565 //Rd=mpy(Rs.[H|L],Rt.[H|L:<<0|:<<1]|
   2566 //          [:<<0[:rnd|:sat|:rnd:sat]|:<<1[:rnd|:sat|:rnd:sat]]]
   2567 def HEXAGON_M2_mpy_hh_s0:
   2568   si_MInst_sisi_hh                <"mpy",     int_hexagon_M2_mpy_hh_s0>;
   2569 def HEXAGON_M2_mpy_hh_s1:
   2570   si_MInst_sisi_hh_s1             <"mpy",     int_hexagon_M2_mpy_hh_s1>;
   2571 def HEXAGON_M2_mpy_rnd_hh_s1:
   2572   si_MInst_sisi_rnd_hh_s1         <"mpy",     int_hexagon_M2_mpy_rnd_hh_s1>;
   2573 def HEXAGON_M2_mpy_sat_rnd_hh_s1:
   2574   si_MInst_sisi_sat_rnd_hh_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_hh_s1>;
   2575 def HEXAGON_M2_mpy_sat_hh_s1:
   2576   si_MInst_sisi_sat_hh_s1         <"mpy",     int_hexagon_M2_mpy_sat_hh_s1>;
   2577 def HEXAGON_M2_mpy_rnd_hh_s0:
   2578   si_MInst_sisi_rnd_hh            <"mpy",     int_hexagon_M2_mpy_rnd_hh_s0>;
   2579 def HEXAGON_M2_mpy_sat_rnd_hh_s0:
   2580   si_MInst_sisi_sat_rnd_hh        <"mpy",     int_hexagon_M2_mpy_sat_rnd_hh_s0>;
   2581 def HEXAGON_M2_mpy_sat_hh_s0:
   2582   si_MInst_sisi_sat_hh            <"mpy",     int_hexagon_M2_mpy_sat_hh_s0>;
   2583 
   2584 def HEXAGON_M2_mpy_hl_s0:
   2585   si_MInst_sisi_hl                <"mpy",     int_hexagon_M2_mpy_hl_s0>;
   2586 def HEXAGON_M2_mpy_hl_s1:
   2587   si_MInst_sisi_hl_s1             <"mpy",     int_hexagon_M2_mpy_hl_s1>;
   2588 def HEXAGON_M2_mpy_rnd_hl_s1:
   2589   si_MInst_sisi_rnd_hl_s1         <"mpy",     int_hexagon_M2_mpy_rnd_hl_s1>;
   2590 def HEXAGON_M2_mpy_sat_rnd_hl_s1:
   2591   si_MInst_sisi_sat_rnd_hl_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_hl_s1>;
   2592 def HEXAGON_M2_mpy_sat_hl_s1:
   2593   si_MInst_sisi_sat_hl_s1         <"mpy",     int_hexagon_M2_mpy_sat_hl_s1>;
   2594 def HEXAGON_M2_mpy_rnd_hl_s0:
   2595   si_MInst_sisi_rnd_hl            <"mpy",     int_hexagon_M2_mpy_rnd_hl_s0>;
   2596 def HEXAGON_M2_mpy_sat_rnd_hl_s0:
   2597   si_MInst_sisi_sat_rnd_hl        <"mpy",     int_hexagon_M2_mpy_sat_rnd_hl_s0>;
   2598 def HEXAGON_M2_mpy_sat_hl_s0:
   2599   si_MInst_sisi_sat_hl            <"mpy",     int_hexagon_M2_mpy_sat_hl_s0>;
   2600 
   2601 def HEXAGON_M2_mpy_lh_s0:
   2602   si_MInst_sisi_lh                <"mpy",     int_hexagon_M2_mpy_lh_s0>;
   2603 def HEXAGON_M2_mpy_lh_s1:
   2604   si_MInst_sisi_lh_s1             <"mpy",     int_hexagon_M2_mpy_lh_s1>;
   2605 def HEXAGON_M2_mpy_rnd_lh_s1:
   2606   si_MInst_sisi_rnd_lh_s1         <"mpy",     int_hexagon_M2_mpy_rnd_lh_s1>;
   2607 def HEXAGON_M2_mpy_sat_rnd_lh_s1:
   2608   si_MInst_sisi_sat_rnd_lh_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_lh_s1>;
   2609 def HEXAGON_M2_mpy_sat_lh_s1:
   2610   si_MInst_sisi_sat_lh_s1         <"mpy",     int_hexagon_M2_mpy_sat_lh_s1>;
   2611 def HEXAGON_M2_mpy_rnd_lh_s0:
   2612   si_MInst_sisi_rnd_lh            <"mpy",     int_hexagon_M2_mpy_rnd_lh_s0>;
   2613 def HEXAGON_M2_mpy_sat_rnd_lh_s0:
   2614   si_MInst_sisi_sat_rnd_lh        <"mpy",     int_hexagon_M2_mpy_sat_rnd_lh_s0>;
   2615 def HEXAGON_M2_mpy_sat_lh_s0:
   2616   si_MInst_sisi_sat_lh            <"mpy",     int_hexagon_M2_mpy_sat_lh_s0>;
   2617 
   2618 def HEXAGON_M2_mpy_ll_s0:
   2619   si_MInst_sisi_ll                <"mpy",     int_hexagon_M2_mpy_ll_s0>;
   2620 def HEXAGON_M2_mpy_ll_s1:
   2621   si_MInst_sisi_ll_s1             <"mpy",     int_hexagon_M2_mpy_ll_s1>;
   2622 def HEXAGON_M2_mpy_rnd_ll_s1:
   2623   si_MInst_sisi_rnd_ll_s1         <"mpy",     int_hexagon_M2_mpy_rnd_ll_s1>;
   2624 def HEXAGON_M2_mpy_sat_rnd_ll_s1:
   2625   si_MInst_sisi_sat_rnd_ll_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_ll_s1>;
   2626 def HEXAGON_M2_mpy_sat_ll_s1:
   2627   si_MInst_sisi_sat_ll_s1         <"mpy",     int_hexagon_M2_mpy_sat_ll_s1>;
   2628 def HEXAGON_M2_mpy_rnd_ll_s0:
   2629   si_MInst_sisi_rnd_ll            <"mpy",     int_hexagon_M2_mpy_rnd_ll_s0>;
   2630 def HEXAGON_M2_mpy_sat_rnd_ll_s0:
   2631   si_MInst_sisi_sat_rnd_ll        <"mpy",     int_hexagon_M2_mpy_sat_rnd_ll_s0>;
   2632 def HEXAGON_M2_mpy_sat_ll_s0:
   2633   si_MInst_sisi_sat_ll            <"mpy",     int_hexagon_M2_mpy_sat_ll_s0>;
   2634 
   2635 //Rdd=mpy(Rs.[H|L],Rt.[H|L])[[:<<0|:<<1]|[:<<0:rnd|:<<1:rnd]]
   2636 def HEXAGON_M2_mpyd_hh_s0:
   2637   di_MInst_sisi_hh                <"mpy",     int_hexagon_M2_mpyd_hh_s0>;
   2638 def HEXAGON_M2_mpyd_hh_s1:
   2639   di_MInst_sisi_hh_s1             <"mpy",     int_hexagon_M2_mpyd_hh_s1>;
   2640 def HEXAGON_M2_mpyd_rnd_hh_s1:
   2641   di_MInst_sisi_rnd_hh_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_hh_s1>;
   2642 def HEXAGON_M2_mpyd_rnd_hh_s0:
   2643   di_MInst_sisi_rnd_hh            <"mpy",     int_hexagon_M2_mpyd_rnd_hh_s0>;
   2644 
   2645 def HEXAGON_M2_mpyd_hl_s0:
   2646   di_MInst_sisi_hl                <"mpy",     int_hexagon_M2_mpyd_hl_s0>;
   2647 def HEXAGON_M2_mpyd_hl_s1:
   2648   di_MInst_sisi_hl_s1             <"mpy",     int_hexagon_M2_mpyd_hl_s1>;
   2649 def HEXAGON_M2_mpyd_rnd_hl_s1:
   2650   di_MInst_sisi_rnd_hl_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_hl_s1>;
   2651 def HEXAGON_M2_mpyd_rnd_hl_s0:
   2652   di_MInst_sisi_rnd_hl            <"mpy",     int_hexagon_M2_mpyd_rnd_hl_s0>;
   2653 
   2654 def HEXAGON_M2_mpyd_lh_s0:
   2655   di_MInst_sisi_lh                <"mpy",     int_hexagon_M2_mpyd_lh_s0>;
   2656 def HEXAGON_M2_mpyd_lh_s1:
   2657   di_MInst_sisi_lh_s1             <"mpy",     int_hexagon_M2_mpyd_lh_s1>;
   2658 def HEXAGON_M2_mpyd_rnd_lh_s1:
   2659   di_MInst_sisi_rnd_lh_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_lh_s1>;
   2660 def HEXAGON_M2_mpyd_rnd_lh_s0:
   2661   di_MInst_sisi_rnd_lh            <"mpy",     int_hexagon_M2_mpyd_rnd_lh_s0>;
   2662 
   2663 def HEXAGON_M2_mpyd_ll_s0:
   2664   di_MInst_sisi_ll                <"mpy",     int_hexagon_M2_mpyd_ll_s0>;
   2665 def HEXAGON_M2_mpyd_ll_s1:
   2666   di_MInst_sisi_ll_s1             <"mpy",     int_hexagon_M2_mpyd_ll_s1>;
   2667 def HEXAGON_M2_mpyd_rnd_ll_s1:
   2668   di_MInst_sisi_rnd_ll_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_ll_s1>;
   2669 def HEXAGON_M2_mpyd_rnd_ll_s0:
   2670   di_MInst_sisi_rnd_ll            <"mpy",     int_hexagon_M2_mpyd_rnd_ll_s0>;
   2671 
   2672 //Rx+=mpy(Rs.[H|L],Rt.[H|L])[[[:<<0|:<<1]|[:<<0:sat|:<<1:sat]]
   2673 def HEXAGON_M2_mpy_acc_hh_s0:
   2674   si_MInst_sisisi_acc_hh            <"mpy",  int_hexagon_M2_mpy_acc_hh_s0>;
   2675 def HEXAGON_M2_mpy_acc_hh_s1:
   2676   si_MInst_sisisi_acc_hh_s1         <"mpy",  int_hexagon_M2_mpy_acc_hh_s1>;
   2677 def HEXAGON_M2_mpy_acc_sat_hh_s1:
   2678   si_MInst_sisisi_acc_sat_hh_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_hh_s1>;
   2679 def HEXAGON_M2_mpy_acc_sat_hh_s0:
   2680   si_MInst_sisisi_acc_sat_hh        <"mpy",  int_hexagon_M2_mpy_acc_sat_hh_s0>;
   2681 
   2682 def HEXAGON_M2_mpy_acc_hl_s0:
   2683   si_MInst_sisisi_acc_hl            <"mpy",  int_hexagon_M2_mpy_acc_hl_s0>;
   2684 def HEXAGON_M2_mpy_acc_hl_s1:
   2685   si_MInst_sisisi_acc_hl_s1         <"mpy",  int_hexagon_M2_mpy_acc_hl_s1>;
   2686 def HEXAGON_M2_mpy_acc_sat_hl_s1:
   2687   si_MInst_sisisi_acc_sat_hl_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_hl_s1>;
   2688 def HEXAGON_M2_mpy_acc_sat_hl_s0:
   2689   si_MInst_sisisi_acc_sat_hl        <"mpy",  int_hexagon_M2_mpy_acc_sat_hl_s0>;
   2690 
   2691 def HEXAGON_M2_mpy_acc_lh_s0:
   2692   si_MInst_sisisi_acc_lh            <"mpy",  int_hexagon_M2_mpy_acc_lh_s0>;
   2693 def HEXAGON_M2_mpy_acc_lh_s1:
   2694   si_MInst_sisisi_acc_lh_s1         <"mpy",  int_hexagon_M2_mpy_acc_lh_s1>;
   2695 def HEXAGON_M2_mpy_acc_sat_lh_s1:
   2696   si_MInst_sisisi_acc_sat_lh_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_lh_s1>;
   2697 def HEXAGON_M2_mpy_acc_sat_lh_s0:
   2698   si_MInst_sisisi_acc_sat_lh        <"mpy",  int_hexagon_M2_mpy_acc_sat_lh_s0>;
   2699 
   2700 def HEXAGON_M2_mpy_acc_ll_s0:
   2701   si_MInst_sisisi_acc_ll            <"mpy",  int_hexagon_M2_mpy_acc_ll_s0>;
   2702 def HEXAGON_M2_mpy_acc_ll_s1:
   2703   si_MInst_sisisi_acc_ll_s1         <"mpy",  int_hexagon_M2_mpy_acc_ll_s1>;
   2704 def HEXAGON_M2_mpy_acc_sat_ll_s1:
   2705   si_MInst_sisisi_acc_sat_ll_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_ll_s1>;
   2706 def HEXAGON_M2_mpy_acc_sat_ll_s0:
   2707   si_MInst_sisisi_acc_sat_ll        <"mpy",  int_hexagon_M2_mpy_acc_sat_ll_s0>;
   2708 
   2709 //Rx-=mpy(Rs.[H|L],Rt.[H|L])[[[:<<0|:<<1]|[:<<0:sat|:<<1:sat]]
   2710 def HEXAGON_M2_mpy_nac_hh_s0:
   2711   si_MInst_sisisi_nac_hh            <"mpy",  int_hexagon_M2_mpy_nac_hh_s0>;
   2712 def HEXAGON_M2_mpy_nac_hh_s1:
   2713   si_MInst_sisisi_nac_hh_s1         <"mpy",  int_hexagon_M2_mpy_nac_hh_s1>;
   2714 def HEXAGON_M2_mpy_nac_sat_hh_s1:
   2715   si_MInst_sisisi_nac_sat_hh_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_hh_s1>;
   2716 def HEXAGON_M2_mpy_nac_sat_hh_s0:
   2717   si_MInst_sisisi_nac_sat_hh        <"mpy",  int_hexagon_M2_mpy_nac_sat_hh_s0>;
   2718 
   2719 def HEXAGON_M2_mpy_nac_hl_s0:
   2720   si_MInst_sisisi_nac_hl            <"mpy",  int_hexagon_M2_mpy_nac_hl_s0>;
   2721 def HEXAGON_M2_mpy_nac_hl_s1:
   2722   si_MInst_sisisi_nac_hl_s1         <"mpy",  int_hexagon_M2_mpy_nac_hl_s1>;
   2723 def HEXAGON_M2_mpy_nac_sat_hl_s1:
   2724   si_MInst_sisisi_nac_sat_hl_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_hl_s1>;
   2725 def HEXAGON_M2_mpy_nac_sat_hl_s0:
   2726   si_MInst_sisisi_nac_sat_hl        <"mpy",  int_hexagon_M2_mpy_nac_sat_hl_s0>;
   2727 
   2728 def HEXAGON_M2_mpy_nac_lh_s0:
   2729   si_MInst_sisisi_nac_lh            <"mpy",  int_hexagon_M2_mpy_nac_lh_s0>;
   2730 def HEXAGON_M2_mpy_nac_lh_s1:
   2731   si_MInst_sisisi_nac_lh_s1         <"mpy",  int_hexagon_M2_mpy_nac_lh_s1>;
   2732 def HEXAGON_M2_mpy_nac_sat_lh_s1:
   2733   si_MInst_sisisi_nac_sat_lh_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_lh_s1>;
   2734 def HEXAGON_M2_mpy_nac_sat_lh_s0:
   2735   si_MInst_sisisi_nac_sat_lh        <"mpy",  int_hexagon_M2_mpy_nac_sat_lh_s0>;
   2736 
   2737 def HEXAGON_M2_mpy_nac_ll_s0:
   2738   si_MInst_sisisi_nac_ll            <"mpy",  int_hexagon_M2_mpy_nac_ll_s0>;
   2739 def HEXAGON_M2_mpy_nac_ll_s1:
   2740   si_MInst_sisisi_nac_ll_s1         <"mpy",  int_hexagon_M2_mpy_nac_ll_s1>;
   2741 def HEXAGON_M2_mpy_nac_sat_ll_s1:
   2742   si_MInst_sisisi_nac_sat_ll_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_ll_s1>;
   2743 def HEXAGON_M2_mpy_nac_sat_ll_s0:
   2744   si_MInst_sisisi_nac_sat_ll        <"mpy",  int_hexagon_M2_mpy_nac_sat_ll_s0>;
   2745 
   2746 //Rx+=mpy(Rs.[H|L],Rt.[H|L:<<0|:<<1]
   2747 def HEXAGON_M2_mpyd_acc_hh_s0:
   2748   di_MInst_disisi_acc_hh          <"mpy",    int_hexagon_M2_mpyd_acc_hh_s0>;
   2749 def HEXAGON_M2_mpyd_acc_hh_s1:
   2750   di_MInst_disisi_acc_hh_s1       <"mpy",    int_hexagon_M2_mpyd_acc_hh_s1>;
   2751 
   2752 def HEXAGON_M2_mpyd_acc_hl_s0:
   2753   di_MInst_disisi_acc_hl          <"mpy",    int_hexagon_M2_mpyd_acc_hl_s0>;
   2754 def HEXAGON_M2_mpyd_acc_hl_s1:
   2755   di_MInst_disisi_acc_hl_s1       <"mpy",    int_hexagon_M2_mpyd_acc_hl_s1>;
   2756 
   2757 def HEXAGON_M2_mpyd_acc_lh_s0:
   2758   di_MInst_disisi_acc_lh          <"mpy",    int_hexagon_M2_mpyd_acc_lh_s0>;
   2759 def HEXAGON_M2_mpyd_acc_lh_s1:
   2760   di_MInst_disisi_acc_lh_s1       <"mpy",    int_hexagon_M2_mpyd_acc_lh_s1>;
   2761 
   2762 def HEXAGON_M2_mpyd_acc_ll_s0:
   2763   di_MInst_disisi_acc_ll          <"mpy",    int_hexagon_M2_mpyd_acc_ll_s0>;
   2764 def HEXAGON_M2_mpyd_acc_ll_s1:
   2765   di_MInst_disisi_acc_ll_s1       <"mpy",    int_hexagon_M2_mpyd_acc_ll_s1>;
   2766 
   2767 //Rx-=mpy(Rs.[H|L],Rt.[H|L:<<0|:<<1]
   2768 def HEXAGON_M2_mpyd_nac_hh_s0:
   2769   di_MInst_disisi_nac_hh          <"mpy",    int_hexagon_M2_mpyd_nac_hh_s0>;
   2770 def HEXAGON_M2_mpyd_nac_hh_s1:
   2771   di_MInst_disisi_nac_hh_s1       <"mpy",    int_hexagon_M2_mpyd_nac_hh_s1>;
   2772 
   2773 def HEXAGON_M2_mpyd_nac_hl_s0:
   2774   di_MInst_disisi_nac_hl          <"mpy",    int_hexagon_M2_mpyd_nac_hl_s0>;
   2775 def HEXAGON_M2_mpyd_nac_hl_s1:
   2776   di_MInst_disisi_nac_hl_s1       <"mpy",    int_hexagon_M2_mpyd_nac_hl_s1>;
   2777 
   2778 def HEXAGON_M2_mpyd_nac_lh_s0:
   2779   di_MInst_disisi_nac_lh          <"mpy",    int_hexagon_M2_mpyd_nac_lh_s0>;
   2780 def HEXAGON_M2_mpyd_nac_lh_s1:
   2781   di_MInst_disisi_nac_lh_s1       <"mpy",    int_hexagon_M2_mpyd_nac_lh_s1>;
   2782 
   2783 def HEXAGON_M2_mpyd_nac_ll_s0:
   2784   di_MInst_disisi_nac_ll          <"mpy",    int_hexagon_M2_mpyd_nac_ll_s0>;
   2785 def HEXAGON_M2_mpyd_nac_ll_s1:
   2786   di_MInst_disisi_nac_ll_s1       <"mpy",    int_hexagon_M2_mpyd_nac_ll_s1>;
   2787 
   2788 // MTYPE / MPYS / Scalar 16x16 multiply unsigned.
   2789 //Rd=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
   2790 def HEXAGON_M2_mpyu_hh_s0:
   2791   si_MInst_sisi_hh                <"mpyu",    int_hexagon_M2_mpyu_hh_s0>;
   2792 def HEXAGON_M2_mpyu_hh_s1:
   2793   si_MInst_sisi_hh_s1             <"mpyu",    int_hexagon_M2_mpyu_hh_s1>;
   2794 def HEXAGON_M2_mpyu_hl_s0:
   2795   si_MInst_sisi_hl                <"mpyu",    int_hexagon_M2_mpyu_hl_s0>;
   2796 def HEXAGON_M2_mpyu_hl_s1:
   2797   si_MInst_sisi_hl_s1             <"mpyu",    int_hexagon_M2_mpyu_hl_s1>;
   2798 def HEXAGON_M2_mpyu_lh_s0:
   2799   si_MInst_sisi_lh                <"mpyu",    int_hexagon_M2_mpyu_lh_s0>;
   2800 def HEXAGON_M2_mpyu_lh_s1:
   2801   si_MInst_sisi_lh_s1             <"mpyu",    int_hexagon_M2_mpyu_lh_s1>;
   2802 def HEXAGON_M2_mpyu_ll_s0:
   2803   si_MInst_sisi_ll                <"mpyu",    int_hexagon_M2_mpyu_ll_s0>;
   2804 def HEXAGON_M2_mpyu_ll_s1:
   2805   si_MInst_sisi_ll_s1             <"mpyu",    int_hexagon_M2_mpyu_ll_s1>;
   2806 
   2807 //Rdd=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
   2808 def HEXAGON_M2_mpyud_hh_s0:
   2809   di_MInst_sisi_hh                <"mpyu",    int_hexagon_M2_mpyud_hh_s0>;
   2810 def HEXAGON_M2_mpyud_hh_s1:
   2811   di_MInst_sisi_hh_s1             <"mpyu",    int_hexagon_M2_mpyud_hh_s1>;
   2812 def HEXAGON_M2_mpyud_hl_s0:
   2813   di_MInst_sisi_hl                <"mpyu",    int_hexagon_M2_mpyud_hl_s0>;
   2814 def HEXAGON_M2_mpyud_hl_s1:
   2815   di_MInst_sisi_hl_s1             <"mpyu",    int_hexagon_M2_mpyud_hl_s1>;
   2816 def HEXAGON_M2_mpyud_lh_s0:
   2817   di_MInst_sisi_lh                <"mpyu",    int_hexagon_M2_mpyud_lh_s0>;
   2818 def HEXAGON_M2_mpyud_lh_s1:
   2819   di_MInst_sisi_lh_s1             <"mpyu",    int_hexagon_M2_mpyud_lh_s1>;
   2820 def HEXAGON_M2_mpyud_ll_s0:
   2821   di_MInst_sisi_ll                <"mpyu",    int_hexagon_M2_mpyud_ll_s0>;
   2822 def HEXAGON_M2_mpyud_ll_s1:
   2823   di_MInst_sisi_ll_s1             <"mpyu",    int_hexagon_M2_mpyud_ll_s1>;
   2824 
   2825 //Rd+=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
   2826 def HEXAGON_M2_mpyu_acc_hh_s0:
   2827   si_MInst_sisisi_acc_hh            <"mpyu",    int_hexagon_M2_mpyu_acc_hh_s0>;
   2828 def HEXAGON_M2_mpyu_acc_hh_s1:
   2829   si_MInst_sisisi_acc_hh_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_hh_s1>;
   2830 def HEXAGON_M2_mpyu_acc_hl_s0:
   2831   si_MInst_sisisi_acc_hl            <"mpyu",    int_hexagon_M2_mpyu_acc_hl_s0>;
   2832 def HEXAGON_M2_mpyu_acc_hl_s1:
   2833   si_MInst_sisisi_acc_hl_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_hl_s1>;
   2834 def HEXAGON_M2_mpyu_acc_lh_s0:
   2835   si_MInst_sisisi_acc_lh            <"mpyu",    int_hexagon_M2_mpyu_acc_lh_s0>;
   2836 def HEXAGON_M2_mpyu_acc_lh_s1:
   2837   si_MInst_sisisi_acc_lh_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_lh_s1>;
   2838 def HEXAGON_M2_mpyu_acc_ll_s0:
   2839   si_MInst_sisisi_acc_ll            <"mpyu",    int_hexagon_M2_mpyu_acc_ll_s0>;
   2840 def HEXAGON_M2_mpyu_acc_ll_s1:
   2841   si_MInst_sisisi_acc_ll_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_ll_s1>;
   2842 
   2843 //Rd+=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
   2844 def HEXAGON_M2_mpyu_nac_hh_s0:
   2845   si_MInst_sisisi_nac_hh            <"mpyu",    int_hexagon_M2_mpyu_nac_hh_s0>;
   2846 def HEXAGON_M2_mpyu_nac_hh_s1:
   2847   si_MInst_sisisi_nac_hh_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_hh_s1>;
   2848 def HEXAGON_M2_mpyu_nac_hl_s0:
   2849   si_MInst_sisisi_nac_hl            <"mpyu",    int_hexagon_M2_mpyu_nac_hl_s0>;
   2850 def HEXAGON_M2_mpyu_nac_hl_s1:
   2851   si_MInst_sisisi_nac_hl_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_hl_s1>;
   2852 def HEXAGON_M2_mpyu_nac_lh_s0:
   2853   si_MInst_sisisi_nac_lh            <"mpyu",    int_hexagon_M2_mpyu_nac_lh_s0>;
   2854 def HEXAGON_M2_mpyu_nac_lh_s1:
   2855   si_MInst_sisisi_nac_lh_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_lh_s1>;
   2856 def HEXAGON_M2_mpyu_nac_ll_s0:
   2857   si_MInst_sisisi_nac_ll            <"mpyu",    int_hexagon_M2_mpyu_nac_ll_s0>;
   2858 def HEXAGON_M2_mpyu_nac_ll_s1:
   2859   si_MInst_sisisi_nac_ll_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_ll_s1>;
   2860 
   2861 //Rdd+=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
   2862 def HEXAGON_M2_mpyud_acc_hh_s0:
   2863   di_MInst_disisi_acc_hh            <"mpyu", int_hexagon_M2_mpyud_acc_hh_s0>;
   2864 def HEXAGON_M2_mpyud_acc_hh_s1:
   2865   di_MInst_disisi_acc_hh_s1         <"mpyu", int_hexagon_M2_mpyud_acc_hh_s1>;
   2866 def HEXAGON_M2_mpyud_acc_hl_s0:
   2867   di_MInst_disisi_acc_hl            <"mpyu", int_hexagon_M2_mpyud_acc_hl_s0>;
   2868 def HEXAGON_M2_mpyud_acc_hl_s1:
   2869   di_MInst_disisi_acc_hl_s1         <"mpyu", int_hexagon_M2_mpyud_acc_hl_s1>;
   2870 def HEXAGON_M2_mpyud_acc_lh_s0:
   2871   di_MInst_disisi_acc_lh            <"mpyu", int_hexagon_M2_mpyud_acc_lh_s0>;
   2872 def HEXAGON_M2_mpyud_acc_lh_s1:
   2873   di_MInst_disisi_acc_lh_s1         <"mpyu", int_hexagon_M2_mpyud_acc_lh_s1>;
   2874 def HEXAGON_M2_mpyud_acc_ll_s0:
   2875   di_MInst_disisi_acc_ll            <"mpyu", int_hexagon_M2_mpyud_acc_ll_s0>;
   2876 def HEXAGON_M2_mpyud_acc_ll_s1:
   2877   di_MInst_disisi_acc_ll_s1         <"mpyu", int_hexagon_M2_mpyud_acc_ll_s1>;
   2878 
   2879 //Rdd-=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
   2880 def HEXAGON_M2_mpyud_nac_hh_s0:
   2881   di_MInst_disisi_nac_hh            <"mpyu", int_hexagon_M2_mpyud_nac_hh_s0>;
   2882 def HEXAGON_M2_mpyud_nac_hh_s1:
   2883   di_MInst_disisi_nac_hh_s1         <"mpyu", int_hexagon_M2_mpyud_nac_hh_s1>;
   2884 def HEXAGON_M2_mpyud_nac_hl_s0:
   2885   di_MInst_disisi_nac_hl            <"mpyu", int_hexagon_M2_mpyud_nac_hl_s0>;
   2886 def HEXAGON_M2_mpyud_nac_hl_s1:
   2887   di_MInst_disisi_nac_hl_s1         <"mpyu", int_hexagon_M2_mpyud_nac_hl_s1>;
   2888 def HEXAGON_M2_mpyud_nac_lh_s0:
   2889   di_MInst_disisi_nac_lh            <"mpyu", int_hexagon_M2_mpyud_nac_lh_s0>;
   2890 def HEXAGON_M2_mpyud_nac_lh_s1:
   2891   di_MInst_disisi_nac_lh_s1         <"mpyu", int_hexagon_M2_mpyud_nac_lh_s1>;
   2892 def HEXAGON_M2_mpyud_nac_ll_s0:
   2893   di_MInst_disisi_nac_ll            <"mpyu", int_hexagon_M2_mpyud_nac_ll_s0>;
   2894 def HEXAGON_M2_mpyud_nac_ll_s1:
   2895   di_MInst_disisi_nac_ll_s1         <"mpyu", int_hexagon_M2_mpyud_nac_ll_s1>;
   2896 
   2897 
   2898 /********************************************************************
   2899 *            MTYPE/VB                                               *
   2900 *********************************************************************/
   2901 
   2902 // MTYPE / VB / Vector reduce add unsigned bytes.
   2903 def HEXAGON_A2_vraddub:
   2904   di_MInst_didi                   <"vraddub", int_hexagon_A2_vraddub>;
   2905 def HEXAGON_A2_vraddub_acc:
   2906   di_MInst_dididi_acc             <"vraddub", int_hexagon_A2_vraddub_acc>;
   2907 
   2908 // MTYPE / VB / Vector sum of absolute differences unsigned bytes.
   2909 def HEXAGON_A2_vrsadub:
   2910   di_MInst_didi                   <"vrsadub", int_hexagon_A2_vrsadub>;
   2911 def HEXAGON_A2_vrsadub_acc:
   2912   di_MInst_dididi_acc             <"vrsadub", int_hexagon_A2_vrsadub_acc>;
   2913 
   2914 /********************************************************************
   2915 *            MTYPE/VH                                               *
   2916 *********************************************************************/
   2917 
   2918 // MTYPE / VH / Vector dual multiply.
   2919 def HEXAGON_M2_vdmpys_s1:
   2920   di_MInst_didi_s1_sat            <"vdmpy",   int_hexagon_M2_vdmpys_s1>;
   2921 def HEXAGON_M2_vdmpys_s0:
   2922   di_MInst_didi_sat               <"vdmpy",   int_hexagon_M2_vdmpys_s0>;
   2923 def HEXAGON_M2_vdmacs_s1:
   2924   di_MInst_dididi_acc_s1_sat      <"vdmpy",   int_hexagon_M2_vdmacs_s1>;
   2925 def HEXAGON_M2_vdmacs_s0:
   2926   di_MInst_dididi_acc_sat         <"vdmpy",   int_hexagon_M2_vdmacs_s0>;
   2927 
   2928 // MTYPE / VH / Vector dual multiply with round and pack.
   2929 def HEXAGON_M2_vdmpyrs_s0:
   2930   si_MInst_didi_rnd_sat           <"vdmpy",   int_hexagon_M2_vdmpyrs_s0>;
   2931 def HEXAGON_M2_vdmpyrs_s1:
   2932   si_MInst_didi_s1_rnd_sat        <"vdmpy",   int_hexagon_M2_vdmpyrs_s1>;
   2933 
   2934 // MTYPE / VH / Vector multiply even halfwords.
   2935 def HEXAGON_M2_vmpy2es_s1:
   2936   di_MInst_didi_s1_sat            <"vmpyeh",  int_hexagon_M2_vmpy2es_s1>;
   2937 def HEXAGON_M2_vmpy2es_s0:
   2938   di_MInst_didi_sat               <"vmpyeh",  int_hexagon_M2_vmpy2es_s0>;
   2939 def HEXAGON_M2_vmac2es:
   2940   di_MInst_dididi_acc             <"vmpyeh",  int_hexagon_M2_vmac2es>;
   2941 def HEXAGON_M2_vmac2es_s1:
   2942   di_MInst_dididi_acc_s1_sat      <"vmpyeh",  int_hexagon_M2_vmac2es_s1>;
   2943 def HEXAGON_M2_vmac2es_s0:
   2944   di_MInst_dididi_acc_sat         <"vmpyeh",  int_hexagon_M2_vmac2es_s0>;
   2945 
   2946 // MTYPE / VH / Vector multiply halfwords.
   2947 def HEXAGON_M2_vmpy2s_s0:
   2948   di_MInst_sisi_sat               <"vmpyh",   int_hexagon_M2_vmpy2s_s0>;
   2949 def HEXAGON_M2_vmpy2s_s1:
   2950   di_MInst_sisi_s1_sat            <"vmpyh",   int_hexagon_M2_vmpy2s_s1>;
   2951 def HEXAGON_M2_vmac2:
   2952   di_MInst_disisi_acc             <"vmpyh",   int_hexagon_M2_vmac2>;
   2953 def HEXAGON_M2_vmac2s_s0:
   2954   di_MInst_disisi_acc_sat         <"vmpyh",   int_hexagon_M2_vmac2s_s0>;
   2955 def HEXAGON_M2_vmac2s_s1:
   2956   di_MInst_disisi_acc_s1_sat      <"vmpyh",   int_hexagon_M2_vmac2s_s1>;
   2957 
   2958 // MTYPE / VH / Vector multiply halfwords with round and pack.
   2959 def HEXAGON_M2_vmpy2s_s0pack:
   2960   si_MInst_sisi_rnd_sat           <"vmpyh",   int_hexagon_M2_vmpy2s_s0pack>;
   2961 def HEXAGON_M2_vmpy2s_s1pack:
   2962   si_MInst_sisi_s1_rnd_sat        <"vmpyh",   int_hexagon_M2_vmpy2s_s1pack>;
   2963 
   2964 // MTYPE / VH / Vector reduce multiply halfwords.
   2965 // Rxx32+=vrmpyh(Rss32,Rtt32)
   2966 def HEXAGON_M2_vrmpy_s0:
   2967   di_MInst_didi                   <"vrmpyh",  int_hexagon_M2_vrmpy_s0>;
   2968 def HEXAGON_M2_vrmac_s0:
   2969   di_MInst_dididi_acc             <"vrmpyh",  int_hexagon_M2_vrmac_s0>;
   2970 
   2971 
   2972 /********************************************************************
   2973 *            STYPE/ALU                                              *
   2974 *********************************************************************/
   2975 
   2976 // STYPE / ALU / Absolute value.
   2977 def HEXAGON_A2_abs:
   2978   si_SInst_si                     <"abs",     int_hexagon_A2_abs>;
   2979 def HEXAGON_A2_absp:
   2980   di_SInst_di                     <"abs",     int_hexagon_A2_absp>;
   2981 def HEXAGON_A2_abssat:
   2982   si_SInst_si_sat                 <"abs",     int_hexagon_A2_abssat>;
   2983 
   2984 // STYPE / ALU / Negate.
   2985 def HEXAGON_A2_negp:
   2986   di_SInst_di                     <"neg",     int_hexagon_A2_negp>;
   2987 def HEXAGON_A2_negsat:
   2988   si_SInst_si_sat                 <"neg",     int_hexagon_A2_negsat>;
   2989 
   2990 // STYPE / ALU / Logical Not.
   2991 def HEXAGON_A2_notp:
   2992   di_SInst_di                     <"not",     int_hexagon_A2_notp>;
   2993 
   2994 // STYPE / ALU / Sign extend word to doubleword.
   2995 def HEXAGON_A2_sxtw:
   2996   di_SInst_si                     <"sxtw",     int_hexagon_A2_sxtw>;
   2997 
   2998 
   2999 /********************************************************************
   3000 *            STYPE/BIT                                              *
   3001 *********************************************************************/
   3002 
   3003 // STYPE / BIT / Count leading.
   3004 def HEXAGON_S2_cl0:
   3005   si_SInst_si                     <"cl0",     int_hexagon_S2_cl0>;
   3006 def HEXAGON_S2_cl0p:
   3007   si_SInst_di                     <"cl0",     int_hexagon_S2_cl0p>;
   3008 def HEXAGON_S2_cl1:
   3009   si_SInst_si                     <"cl1",     int_hexagon_S2_cl1>;
   3010 def HEXAGON_S2_cl1p:
   3011   si_SInst_di                     <"cl1",     int_hexagon_S2_cl1p>;
   3012 def HEXAGON_S2_clb:
   3013   si_SInst_si                     <"clb",     int_hexagon_S2_clb>;
   3014 def HEXAGON_S2_clbp:
   3015   si_SInst_di                     <"clb",     int_hexagon_S2_clbp>;
   3016 def HEXAGON_S2_clbnorm:
   3017   si_SInst_si                     <"normamt", int_hexagon_S2_clbnorm>;
   3018 
   3019 // STYPE / BIT / Count trailing.
   3020 def HEXAGON_S2_ct0:
   3021   si_SInst_si                     <"ct0",     int_hexagon_S2_ct0>;
   3022 def HEXAGON_S2_ct1:
   3023   si_SInst_si                     <"ct1",     int_hexagon_S2_ct1>;
   3024 
   3025 // STYPE / BIT / Compare bit mask.
   3026 def Hexagon_C2_bitsclr:
   3027   qi_SInst_sisi                   <"bitsclr", int_hexagon_C2_bitsclr>;
   3028 def Hexagon_C2_bitsclri:
   3029   qi_SInst_siu6                   <"bitsclr", int_hexagon_C2_bitsclri>;
   3030 def Hexagon_C2_bitsset:
   3031   qi_SInst_sisi                   <"bitsset", int_hexagon_C2_bitsset>;
   3032 
   3033 // STYPE / BIT / Extract unsigned.
   3034 // Rd[d][32/64]=extractu(Rs[s],Rt[t],[imm])
   3035 def HEXAGON_S2_extractu:
   3036   si_SInst_siu5u5                 <"extractu",int_hexagon_S2_extractu>;
   3037 def HEXAGON_S2_extractu_rp:
   3038   si_SInst_sidi                   <"extractu",int_hexagon_S2_extractu_rp>;
   3039 def HEXAGON_S2_extractup:
   3040   di_SInst_diu6u6                 <"extractu",int_hexagon_S2_extractup>;
   3041 def HEXAGON_S2_extractup_rp:
   3042   di_SInst_didi                   <"extractu",int_hexagon_S2_extractup_rp>;
   3043 
   3044 // STYPE / BIT / Insert bitfield.
   3045 def Hexagon_S2_insert:
   3046   si_SInst_sisiu5u5               <"insert",  int_hexagon_S2_insert>;
   3047 def Hexagon_S2_insert_rp:
   3048   si_SInst_sisidi                 <"insert",  int_hexagon_S2_insert_rp>;
   3049 def Hexagon_S2_insertp:
   3050   di_SInst_didiu6u6               <"insert",  int_hexagon_S2_insertp>;
   3051 def Hexagon_S2_insertp_rp:
   3052   di_SInst_dididi                 <"insert",  int_hexagon_S2_insertp_rp>;
   3053 
   3054 // STYPE / BIT / Innterleave/deinterleave.
   3055 def Hexagon_S2_interleave:
   3056   di_SInst_di                     <"interleave", int_hexagon_S2_interleave>;
   3057 def Hexagon_S2_deinterleave:
   3058   di_SInst_di                     <"deinterleave", int_hexagon_S2_deinterleave>;
   3059 
   3060 // STYPE / BIT / Linear feedback-shift Iteration.
   3061 def Hexagon_S2_lfsp:
   3062   di_SInst_didi                   <"lfs",     int_hexagon_S2_lfsp>;
   3063 
   3064 // STYPE / BIT / Bit reverse.
   3065 def Hexagon_S2_brev:
   3066   si_SInst_si                     <"brev",    int_hexagon_S2_brev>;
   3067 
   3068 // STYPE / BIT / Set/Clear/Toggle Bit.
   3069 def HEXAGON_S2_setbit_i:
   3070   si_SInst_siu5                   <"setbit",  int_hexagon_S2_setbit_i>;
   3071 def HEXAGON_S2_togglebit_i:
   3072   si_SInst_siu5                   <"togglebit", int_hexagon_S2_togglebit_i>;
   3073 def HEXAGON_S2_clrbit_i:
   3074   si_SInst_siu5                   <"clrbit",  int_hexagon_S2_clrbit_i>;
   3075 def HEXAGON_S2_setbit_r:
   3076   si_SInst_sisi                   <"setbit",  int_hexagon_S2_setbit_r>;
   3077 def HEXAGON_S2_togglebit_r:
   3078   si_SInst_sisi                   <"togglebit", int_hexagon_S2_togglebit_r>;
   3079 def HEXAGON_S2_clrbit_r:
   3080   si_SInst_sisi                   <"clrbit",  int_hexagon_S2_clrbit_r>;
   3081 
   3082 // STYPE / BIT / Test Bit.
   3083 def HEXAGON_S2_tstbit_i:
   3084   qi_SInst_siu5                   <"tstbit",  int_hexagon_S2_tstbit_i>;
   3085 def HEXAGON_S2_tstbit_r:
   3086   qi_SInst_sisi                   <"tstbit",  int_hexagon_S2_tstbit_r>;
   3087 
   3088 
   3089 /********************************************************************
   3090 *            STYPE/COMPLEX                                          *
   3091 *********************************************************************/
   3092 
   3093 // STYPE / COMPLEX / Vector Complex conjugate.
   3094 def HEXAGON_A2_vconj:
   3095   di_SInst_di_sat                 <"vconj",   int_hexagon_A2_vconj>;
   3096 
   3097 // STYPE / COMPLEX / Vector Complex rotate.
   3098 def HEXAGON_S2_vcrotate:
   3099   di_SInst_disi                   <"vcrotate",int_hexagon_S2_vcrotate>;
   3100 
   3101 
   3102 /********************************************************************
   3103 *            STYPE/PERM                                             *
   3104 *********************************************************************/
   3105 
   3106 // STYPE / PERM / Saturate.
   3107 def HEXAGON_A2_sat:
   3108   si_SInst_di                     <"sat",     int_hexagon_A2_sat>;
   3109 def HEXAGON_A2_satb:
   3110   si_SInst_si                     <"satb",    int_hexagon_A2_satb>;
   3111 def HEXAGON_A2_sath:
   3112   si_SInst_si                     <"sath",    int_hexagon_A2_sath>;
   3113 def HEXAGON_A2_satub:
   3114   si_SInst_si                     <"satub",   int_hexagon_A2_satub>;
   3115 def HEXAGON_A2_satuh:
   3116   si_SInst_si                     <"satuh",   int_hexagon_A2_satuh>;
   3117 
   3118 // STYPE / PERM / Swizzle bytes.
   3119 def HEXAGON_A2_swiz:
   3120   si_SInst_si                     <"swiz",    int_hexagon_A2_swiz>;
   3121 
   3122 // STYPE / PERM / Vector align.
   3123 // Need custom lowering
   3124 def HEXAGON_S2_valignib:
   3125   di_SInst_didiu3                 <"valignb", int_hexagon_S2_valignib>;
   3126 def HEXAGON_S2_valignrb:
   3127   di_SInst_didiqi                 <"valignb", int_hexagon_S2_valignrb>;
   3128 
   3129 // STYPE / PERM / Vector round and pack.
   3130 def HEXAGON_S2_vrndpackwh:
   3131   si_SInst_di                     <"vrndwh",  int_hexagon_S2_vrndpackwh>;
   3132 def HEXAGON_S2_vrndpackwhs:
   3133   si_SInst_di_sat                 <"vrndwh",  int_hexagon_S2_vrndpackwhs>;
   3134 
   3135 // STYPE / PERM / Vector saturate and pack.
   3136 def HEXAGON_S2_svsathb:
   3137   si_SInst_si                     <"vsathb",  int_hexagon_S2_svsathb>;
   3138 def HEXAGON_S2_vsathb:
   3139   si_SInst_di                     <"vsathb",  int_hexagon_S2_vsathb>;
   3140 def HEXAGON_S2_svsathub:
   3141   si_SInst_si                     <"vsathub", int_hexagon_S2_svsathub>;
   3142 def HEXAGON_S2_vsathub:
   3143   si_SInst_di                     <"vsathub", int_hexagon_S2_vsathub>;
   3144 def HEXAGON_S2_vsatwh:
   3145   si_SInst_di                     <"vsatwh",  int_hexagon_S2_vsatwh>;
   3146 def HEXAGON_S2_vsatwuh:
   3147   si_SInst_di                     <"vsatwuh", int_hexagon_S2_vsatwuh>;
   3148 
   3149 // STYPE / PERM / Vector saturate without pack.
   3150 def HEXAGON_S2_vsathb_nopack:
   3151   di_SInst_di                     <"vsathb",  int_hexagon_S2_vsathb_nopack>;
   3152 def HEXAGON_S2_vsathub_nopack:
   3153   di_SInst_di                     <"vsathub", int_hexagon_S2_vsathub_nopack>;
   3154 def HEXAGON_S2_vsatwh_nopack:
   3155   di_SInst_di                     <"vsatwh",  int_hexagon_S2_vsatwh_nopack>;
   3156 def HEXAGON_S2_vsatwuh_nopack:
   3157   di_SInst_di                     <"vsatwuh", int_hexagon_S2_vsatwuh_nopack>;
   3158 
   3159 // STYPE / PERM / Vector shuffle.
   3160 def HEXAGON_S2_shuffeb:
   3161   di_SInst_didi                   <"shuffeb", int_hexagon_S2_shuffeb>;
   3162 def HEXAGON_S2_shuffeh:
   3163   di_SInst_didi                   <"shuffeh", int_hexagon_S2_shuffeh>;
   3164 def HEXAGON_S2_shuffob:
   3165   di_SInst_didi                   <"shuffob", int_hexagon_S2_shuffob>;
   3166 def HEXAGON_S2_shuffoh:
   3167   di_SInst_didi                   <"shuffoh", int_hexagon_S2_shuffoh>;
   3168 
   3169 // STYPE / PERM / Vector splat bytes.
   3170 def HEXAGON_S2_vsplatrb:
   3171   si_SInst_si                     <"vsplatb", int_hexagon_S2_vsplatrb>;
   3172 
   3173 // STYPE / PERM / Vector splat halfwords.
   3174 def HEXAGON_S2_vsplatrh:
   3175   di_SInst_si                     <"vsplath", int_hexagon_S2_vsplatrh>;
   3176 
   3177 // STYPE / PERM / Vector splice.
   3178 def Hexagon_S2_vsplicerb:
   3179   di_SInst_didiqi                 <"vspliceb",int_hexagon_S2_vsplicerb>;
   3180 def Hexagon_S2_vspliceib:
   3181   di_SInst_didiu3                 <"vspliceb",int_hexagon_S2_vspliceib>;
   3182 
   3183 // STYPE / PERM / Sign extend.
   3184 def HEXAGON_S2_vsxtbh:
   3185   di_SInst_si                     <"vsxtbh",  int_hexagon_S2_vsxtbh>;
   3186 def HEXAGON_S2_vsxthw:
   3187   di_SInst_si                     <"vsxthw",  int_hexagon_S2_vsxthw>;
   3188 
   3189 // STYPE / PERM / Truncate.
   3190 def HEXAGON_S2_vtrunehb:
   3191   si_SInst_di                     <"vtrunehb",int_hexagon_S2_vtrunehb>;
   3192 def HEXAGON_S2_vtrunohb:
   3193   si_SInst_di                     <"vtrunohb",int_hexagon_S2_vtrunohb>;
   3194 def HEXAGON_S2_vtrunewh:
   3195   di_SInst_didi                   <"vtrunewh",int_hexagon_S2_vtrunewh>;
   3196 def HEXAGON_S2_vtrunowh:
   3197   di_SInst_didi                   <"vtrunowh",int_hexagon_S2_vtrunowh>;
   3198 
   3199 // STYPE / PERM / Zero extend.
   3200 def HEXAGON_S2_vzxtbh:
   3201   di_SInst_si                     <"vzxtbh",  int_hexagon_S2_vzxtbh>;
   3202 def HEXAGON_S2_vzxthw:
   3203   di_SInst_si                     <"vzxthw",  int_hexagon_S2_vzxthw>;
   3204 
   3205 
   3206 /********************************************************************
   3207 *            STYPE/PRED                                             *
   3208 *********************************************************************/
   3209 
   3210 // STYPE / PRED / Mask generate from predicate.
   3211 def HEXAGON_C2_mask:
   3212   di_SInst_qi                     <"mask",   int_hexagon_C2_mask>;
   3213 
   3214 // STYPE / PRED / Predicate transfer.
   3215 def HEXAGON_C2_tfrpr:
   3216   si_SInst_qi                     <"",       int_hexagon_C2_tfrpr>;
   3217 def HEXAGON_C2_tfrrp:
   3218   qi_SInst_si                     <"",       int_hexagon_C2_tfrrp>;
   3219 
   3220 // STYPE / PRED / Viterbi pack even and odd predicate bits.
   3221 def HEXAGON_C2_vitpack:
   3222   si_SInst_qiqi                   <"vitpack",int_hexagon_C2_vitpack>;
   3223 
   3224 
   3225 /********************************************************************
   3226 *            STYPE/SHIFT                                            *
   3227 *********************************************************************/
   3228 
   3229 // STYPE / SHIFT / Shift by immediate.
   3230 def HEXAGON_S2_asl_i_r:
   3231   si_SInst_siu5                   <"asl",     int_hexagon_S2_asl_i_r>;
   3232 def HEXAGON_S2_asr_i_r:
   3233   si_SInst_siu5                   <"asr",     int_hexagon_S2_asr_i_r>;
   3234 def HEXAGON_S2_lsr_i_r:
   3235   si_SInst_siu5                   <"lsr",     int_hexagon_S2_lsr_i_r>;
   3236 def HEXAGON_S2_asl_i_p:
   3237   di_SInst_diu6                   <"asl",     int_hexagon_S2_asl_i_p>;
   3238 def HEXAGON_S2_asr_i_p:
   3239   di_SInst_diu6                   <"asr",     int_hexagon_S2_asr_i_p>;
   3240 def HEXAGON_S2_lsr_i_p:
   3241   di_SInst_diu6                   <"lsr",     int_hexagon_S2_lsr_i_p>;
   3242 
   3243 // STYPE / SHIFT / Shift by immediate and accumulate.
   3244 def HEXAGON_S2_asl_i_r_acc:
   3245   si_SInst_sisiu5_acc             <"asl",     int_hexagon_S2_asl_i_r_acc>;
   3246 def HEXAGON_S2_asr_i_r_acc:
   3247   si_SInst_sisiu5_acc             <"asr",     int_hexagon_S2_asr_i_r_acc>;
   3248 def HEXAGON_S2_lsr_i_r_acc:
   3249   si_SInst_sisiu5_acc             <"lsr",     int_hexagon_S2_lsr_i_r_acc>;
   3250 def HEXAGON_S2_asl_i_r_nac:
   3251   si_SInst_sisiu5_nac             <"asl",     int_hexagon_S2_asl_i_r_nac>;
   3252 def HEXAGON_S2_asr_i_r_nac:
   3253   si_SInst_sisiu5_nac             <"asr",     int_hexagon_S2_asr_i_r_nac>;
   3254 def HEXAGON_S2_lsr_i_r_nac:
   3255   si_SInst_sisiu5_nac             <"lsr",     int_hexagon_S2_lsr_i_r_nac>;
   3256 def HEXAGON_S2_asl_i_p_acc:
   3257   di_SInst_didiu6_acc             <"asl",     int_hexagon_S2_asl_i_p_acc>;
   3258 def HEXAGON_S2_asr_i_p_acc:
   3259   di_SInst_didiu6_acc             <"asr",     int_hexagon_S2_asr_i_p_acc>;
   3260 def HEXAGON_S2_lsr_i_p_acc:
   3261   di_SInst_didiu6_acc             <"lsr",     int_hexagon_S2_lsr_i_p_acc>;
   3262 def HEXAGON_S2_asl_i_p_nac:
   3263   di_SInst_didiu6_nac             <"asl",     int_hexagon_S2_asl_i_p_nac>;
   3264 def HEXAGON_S2_asr_i_p_nac:
   3265   di_SInst_didiu6_nac             <"asr",     int_hexagon_S2_asr_i_p_nac>;
   3266 def HEXAGON_S2_lsr_i_p_nac:
   3267   di_SInst_didiu6_nac             <"lsr",     int_hexagon_S2_lsr_i_p_nac>;
   3268 
   3269 // STYPE / SHIFT / Shift by immediate and add.
   3270 def HEXAGON_S2_addasl_rrri:
   3271   si_SInst_sisiu3                 <"addasl",  int_hexagon_S2_addasl_rrri>;
   3272 
   3273 // STYPE / SHIFT / Shift by immediate and logical.
   3274 def HEXAGON_S2_asl_i_r_and:
   3275   si_SInst_sisiu5_and             <"asl",     int_hexagon_S2_asl_i_r_and>;
   3276 def HEXAGON_S2_asr_i_r_and:
   3277   si_SInst_sisiu5_and             <"asr",     int_hexagon_S2_asr_i_r_and>;
   3278 def HEXAGON_S2_lsr_i_r_and:
   3279   si_SInst_sisiu5_and             <"lsr",     int_hexagon_S2_lsr_i_r_and>;
   3280 
   3281 def HEXAGON_S2_asl_i_r_xacc:
   3282   si_SInst_sisiu5_xor             <"asl",     int_hexagon_S2_asl_i_r_xacc>;
   3283 def HEXAGON_S2_lsr_i_r_xacc:
   3284   si_SInst_sisiu5_xor             <"lsr",     int_hexagon_S2_lsr_i_r_xacc>;
   3285 
   3286 def HEXAGON_S2_asl_i_r_or:
   3287   si_SInst_sisiu5_or              <"asl",     int_hexagon_S2_asl_i_r_or>;
   3288 def HEXAGON_S2_asr_i_r_or:
   3289   si_SInst_sisiu5_or              <"asr",     int_hexagon_S2_asr_i_r_or>;
   3290 def HEXAGON_S2_lsr_i_r_or:
   3291   si_SInst_sisiu5_or              <"lsr",     int_hexagon_S2_lsr_i_r_or>;
   3292 
   3293 def HEXAGON_S2_asl_i_p_and:
   3294   di_SInst_didiu6_and             <"asl",     int_hexagon_S2_asl_i_p_and>;
   3295 def HEXAGON_S2_asr_i_p_and:
   3296   di_SInst_didiu6_and             <"asr",     int_hexagon_S2_asr_i_p_and>;
   3297 def HEXAGON_S2_lsr_i_p_and:
   3298   di_SInst_didiu6_and             <"lsr",     int_hexagon_S2_lsr_i_p_and>;
   3299 
   3300 def HEXAGON_S2_asl_i_p_xacc:
   3301   di_SInst_didiu6_xor             <"asl",     int_hexagon_S2_asl_i_p_xacc>;
   3302 def HEXAGON_S2_lsr_i_p_xacc:
   3303   di_SInst_didiu6_xor             <"lsr",     int_hexagon_S2_lsr_i_p_xacc>;
   3304 
   3305 def HEXAGON_S2_asl_i_p_or:
   3306   di_SInst_didiu6_or              <"asl",     int_hexagon_S2_asl_i_p_or>;
   3307 def HEXAGON_S2_asr_i_p_or:
   3308   di_SInst_didiu6_or              <"asr",     int_hexagon_S2_asr_i_p_or>;
   3309 def HEXAGON_S2_lsr_i_p_or:
   3310   di_SInst_didiu6_or              <"lsr",     int_hexagon_S2_lsr_i_p_or>;
   3311 
   3312 // STYPE / SHIFT / Shift right by immediate with rounding.
   3313 def HEXAGON_S2_asr_i_r_rnd:
   3314   si_SInst_siu5_rnd               <"asr",     int_hexagon_S2_asr_i_r_rnd>;
   3315 def HEXAGON_S2_asr_i_r_rnd_goodsyntax:
   3316   si_SInst_siu5              <"asrrnd",  int_hexagon_S2_asr_i_r_rnd_goodsyntax>;
   3317 
   3318 // STYPE / SHIFT / Shift left by immediate with saturation.
   3319 def HEXAGON_S2_asl_i_r_sat:
   3320   si_SInst_sisi_sat               <"asl",     int_hexagon_S2_asl_i_r_sat>;
   3321 
   3322 // STYPE / SHIFT / Shift by register.
   3323 def HEXAGON_S2_asl_r_r:
   3324   si_SInst_sisi                   <"asl",     int_hexagon_S2_asl_r_r>;
   3325 def HEXAGON_S2_asr_r_r:
   3326   si_SInst_sisi                   <"asr",     int_hexagon_S2_asr_r_r>;
   3327 def HEXAGON_S2_lsl_r_r:
   3328   si_SInst_sisi                   <"lsl",     int_hexagon_S2_lsl_r_r>;
   3329 def HEXAGON_S2_lsr_r_r:
   3330   si_SInst_sisi                   <"lsr",     int_hexagon_S2_lsr_r_r>;
   3331 def HEXAGON_S2_asl_r_p:
   3332   di_SInst_disi                   <"asl",     int_hexagon_S2_asl_r_p>;
   3333 def HEXAGON_S2_asr_r_p:
   3334   di_SInst_disi                   <"asr",     int_hexagon_S2_asr_r_p>;
   3335 def HEXAGON_S2_lsl_r_p:
   3336   di_SInst_disi                   <"lsl",     int_hexagon_S2_lsl_r_p>;
   3337 def HEXAGON_S2_lsr_r_p:
   3338   di_SInst_disi                   <"lsr",     int_hexagon_S2_lsr_r_p>;
   3339 
   3340 // STYPE / SHIFT / Shift by register and accumulate.
   3341 def HEXAGON_S2_asl_r_r_acc:
   3342   si_SInst_sisisi_acc             <"asl",     int_hexagon_S2_asl_r_r_acc>;
   3343 def HEXAGON_S2_asr_r_r_acc:
   3344   si_SInst_sisisi_acc             <"asr",     int_hexagon_S2_asr_r_r_acc>;
   3345 def HEXAGON_S2_lsl_r_r_acc:
   3346   si_SInst_sisisi_acc             <"lsl",     int_hexagon_S2_lsl_r_r_acc>;
   3347 def HEXAGON_S2_lsr_r_r_acc:
   3348   si_SInst_sisisi_acc             <"lsr",     int_hexagon_S2_lsr_r_r_acc>;
   3349 def HEXAGON_S2_asl_r_p_acc:
   3350   di_SInst_didisi_acc             <"asl",     int_hexagon_S2_asl_r_p_acc>;
   3351 def HEXAGON_S2_asr_r_p_acc:
   3352   di_SInst_didisi_acc             <"asr",     int_hexagon_S2_asr_r_p_acc>;
   3353 def HEXAGON_S2_lsl_r_p_acc:
   3354   di_SInst_didisi_acc             <"lsl",     int_hexagon_S2_lsl_r_p_acc>;
   3355 def HEXAGON_S2_lsr_r_p_acc:
   3356   di_SInst_didisi_acc             <"lsr",     int_hexagon_S2_lsr_r_p_acc>;
   3357 
   3358 def HEXAGON_S2_asl_r_r_nac:
   3359   si_SInst_sisisi_nac             <"asl",     int_hexagon_S2_asl_r_r_nac>;
   3360 def HEXAGON_S2_asr_r_r_nac:
   3361   si_SInst_sisisi_nac             <"asr",     int_hexagon_S2_asr_r_r_nac>;
   3362 def HEXAGON_S2_lsl_r_r_nac:
   3363   si_SInst_sisisi_nac             <"lsl",     int_hexagon_S2_lsl_r_r_nac>;
   3364 def HEXAGON_S2_lsr_r_r_nac:
   3365   si_SInst_sisisi_nac             <"lsr",     int_hexagon_S2_lsr_r_r_nac>;
   3366 def HEXAGON_S2_asl_r_p_nac:
   3367   di_SInst_didisi_nac             <"asl",     int_hexagon_S2_asl_r_p_nac>;
   3368 def HEXAGON_S2_asr_r_p_nac:
   3369   di_SInst_didisi_nac             <"asr",     int_hexagon_S2_asr_r_p_nac>;
   3370 def HEXAGON_S2_lsl_r_p_nac:
   3371   di_SInst_didisi_nac             <"lsl",     int_hexagon_S2_lsl_r_p_nac>;
   3372 def HEXAGON_S2_lsr_r_p_nac:
   3373   di_SInst_didisi_nac             <"lsr",     int_hexagon_S2_lsr_r_p_nac>;
   3374 
   3375 // STYPE / SHIFT / Shift by register and logical.
   3376 def HEXAGON_S2_asl_r_r_and:
   3377   si_SInst_sisisi_and             <"asl",     int_hexagon_S2_asl_r_r_and>;
   3378 def HEXAGON_S2_asr_r_r_and:
   3379   si_SInst_sisisi_and             <"asr",     int_hexagon_S2_asr_r_r_and>;
   3380 def HEXAGON_S2_lsl_r_r_and:
   3381   si_SInst_sisisi_and             <"lsl",     int_hexagon_S2_lsl_r_r_and>;
   3382 def HEXAGON_S2_lsr_r_r_and:
   3383   si_SInst_sisisi_and             <"lsr",     int_hexagon_S2_lsr_r_r_and>;
   3384 
   3385 def HEXAGON_S2_asl_r_r_or:
   3386   si_SInst_sisisi_or              <"asl",     int_hexagon_S2_asl_r_r_or>;
   3387 def HEXAGON_S2_asr_r_r_or:
   3388   si_SInst_sisisi_or              <"asr",     int_hexagon_S2_asr_r_r_or>;
   3389 def HEXAGON_S2_lsl_r_r_or:
   3390   si_SInst_sisisi_or              <"lsl",     int_hexagon_S2_lsl_r_r_or>;
   3391 def HEXAGON_S2_lsr_r_r_or:
   3392   si_SInst_sisisi_or              <"lsr",     int_hexagon_S2_lsr_r_r_or>;
   3393 
   3394 def HEXAGON_S2_asl_r_p_and:
   3395   di_SInst_didisi_and             <"asl",     int_hexagon_S2_asl_r_p_and>;
   3396 def HEXAGON_S2_asr_r_p_and:
   3397   di_SInst_didisi_and             <"asr",     int_hexagon_S2_asr_r_p_and>;
   3398 def HEXAGON_S2_lsl_r_p_and:
   3399   di_SInst_didisi_and             <"lsl",     int_hexagon_S2_lsl_r_p_and>;
   3400 def HEXAGON_S2_lsr_r_p_and:
   3401   di_SInst_didisi_and             <"lsr",     int_hexagon_S2_lsr_r_p_and>;
   3402 
   3403 def HEXAGON_S2_asl_r_p_or:
   3404   di_SInst_didisi_or              <"asl",     int_hexagon_S2_asl_r_p_or>;
   3405 def HEXAGON_S2_asr_r_p_or:
   3406   di_SInst_didisi_or              <"asr",     int_hexagon_S2_asr_r_p_or>;
   3407 def HEXAGON_S2_lsl_r_p_or:
   3408   di_SInst_didisi_or              <"lsl",     int_hexagon_S2_lsl_r_p_or>;
   3409 def HEXAGON_S2_lsr_r_p_or:
   3410   di_SInst_didisi_or              <"lsr",     int_hexagon_S2_lsr_r_p_or>;
   3411 
   3412 // STYPE / SHIFT / Shift by register with saturation.
   3413 def HEXAGON_S2_asl_r_r_sat:
   3414   si_SInst_sisi_sat               <"asl",     int_hexagon_S2_asl_r_r_sat>;
   3415 def HEXAGON_S2_asr_r_r_sat:
   3416   si_SInst_sisi_sat               <"asr",     int_hexagon_S2_asr_r_r_sat>;
   3417 
   3418 // STYPE / SHIFT / Table Index.
   3419 def Hexagon_S2_tableidxb_goodsyntax:
   3420   si_MInst_sisiu4u5          <"tableidxb",int_hexagon_S2_tableidxb_goodsyntax>;
   3421 def Hexagon_S2_tableidxd_goodsyntax:
   3422   si_MInst_sisiu4u5          <"tableidxd",int_hexagon_S2_tableidxd_goodsyntax>;
   3423 def Hexagon_S2_tableidxh_goodsyntax:
   3424   si_MInst_sisiu4u5          <"tableidxh",int_hexagon_S2_tableidxh_goodsyntax>;
   3425 def Hexagon_S2_tableidxw_goodsyntax:
   3426   si_MInst_sisiu4u5          <"tableidxw",int_hexagon_S2_tableidxw_goodsyntax>;
   3427 
   3428 
   3429 /********************************************************************
   3430 *            STYPE/VH                                               *
   3431 *********************************************************************/
   3432 
   3433 // STYPE / VH / Vector absolute value halfwords.
   3434 // Rdd64=vabsh(Rss64)
   3435 def HEXAGON_A2_vabsh:
   3436   di_SInst_di                     <"vabsh",   int_hexagon_A2_vabsh>;
   3437 def HEXAGON_A2_vabshsat:
   3438   di_SInst_di_sat                 <"vabsh",   int_hexagon_A2_vabshsat>;
   3439 
   3440 // STYPE / VH / Vector shift halfwords by immediate.
   3441 // Rdd64=v[asl/asr/lsr]h(Rss64,Rt32)
   3442 def HEXAGON_S2_asl_i_vh:
   3443   di_SInst_disi                   <"vaslh",   int_hexagon_S2_asl_i_vh>;
   3444 def HEXAGON_S2_asr_i_vh:
   3445   di_SInst_disi                   <"vasrh",   int_hexagon_S2_asr_i_vh>;
   3446 def HEXAGON_S2_lsr_i_vh:
   3447   di_SInst_disi                   <"vlsrh",   int_hexagon_S2_lsr_i_vh>;
   3448 
   3449 // STYPE / VH / Vector shift halfwords by register.
   3450 // Rdd64=v[asl/asr/lsl/lsr]w(Rss64,Rt32)
   3451 def HEXAGON_S2_asl_r_vh:
   3452   di_SInst_disi                   <"vaslh",   int_hexagon_S2_asl_r_vh>;
   3453 def HEXAGON_S2_asr_r_vh:
   3454   di_SInst_disi                   <"vasrh",   int_hexagon_S2_asr_r_vh>;
   3455 def HEXAGON_S2_lsl_r_vh:
   3456   di_SInst_disi                   <"vlslh",   int_hexagon_S2_lsl_r_vh>;
   3457 def HEXAGON_S2_lsr_r_vh:
   3458   di_SInst_disi                   <"vlsrh",   int_hexagon_S2_lsr_r_vh>;
   3459 
   3460 
   3461 /********************************************************************
   3462 *            STYPE/VW                                               *
   3463 *********************************************************************/
   3464 
   3465 // STYPE / VW / Vector absolute value words.
   3466 def HEXAGON_A2_vabsw:
   3467   di_SInst_di                     <"vabsw",   int_hexagon_A2_vabsw>;
   3468 def HEXAGON_A2_vabswsat:
   3469   di_SInst_di_sat                 <"vabsw",   int_hexagon_A2_vabswsat>;
   3470 
   3471 // STYPE / VW / Vector shift words by immediate.
   3472 // Rdd64=v[asl/vsl]w(Rss64,Rt32)
   3473 def HEXAGON_S2_asl_i_vw:
   3474   di_SInst_disi                   <"vaslw",   int_hexagon_S2_asl_i_vw>;
   3475 def HEXAGON_S2_asr_i_vw:
   3476   di_SInst_disi                   <"vasrw",   int_hexagon_S2_asr_i_vw>;
   3477 def HEXAGON_S2_lsr_i_vw:
   3478   di_SInst_disi                   <"vlsrw",   int_hexagon_S2_lsr_i_vw>;
   3479 
   3480 // STYPE / VW / Vector shift words by register.
   3481 // Rdd64=v[asl/vsl]w(Rss64,Rt32)
   3482 def HEXAGON_S2_asl_r_vw:
   3483   di_SInst_disi                   <"vaslw",   int_hexagon_S2_asl_r_vw>;
   3484 def HEXAGON_S2_asr_r_vw:
   3485   di_SInst_disi                   <"vasrw",   int_hexagon_S2_asr_r_vw>;
   3486 def HEXAGON_S2_lsl_r_vw:
   3487   di_SInst_disi                   <"vlslw",   int_hexagon_S2_lsl_r_vw>;
   3488 def HEXAGON_S2_lsr_r_vw:
   3489   di_SInst_disi                   <"vlsrw",   int_hexagon_S2_lsr_r_vw>;
   3490 
   3491 // STYPE / VW / Vector shift words with truncate and pack.
   3492 def HEXAGON_S2_asr_r_svw_trun:
   3493   si_SInst_disi                   <"vasrw",   int_hexagon_S2_asr_r_svw_trun>;
   3494 def HEXAGON_S2_asr_i_svw_trun:
   3495   si_SInst_diu5                   <"vasrw",   int_hexagon_S2_asr_i_svw_trun>;
   3496 
   3497 // LD / Circular loads.
   3498 def HEXAGON_circ_ldd:
   3499   di_LDInstPI_diu4                <"circ_ldd", int_hexagon_circ_ldd>;
   3500 
   3501 include "HexagonIntrinsicsV3.td"
   3502 include "HexagonIntrinsicsV4.td"
   3503 include "HexagonIntrinsicsV5.td"
   3504