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 class T_I_pat <InstHexagon MI, Intrinsic IntID>
     17   : Pat <(IntID imm:$Is),
     18          (MI imm:$Is)>;
     19 
     20 class T_R_pat <InstHexagon MI, Intrinsic IntID>
     21   : Pat <(IntID I32:$Rs),
     22          (MI I32:$Rs)>;
     23 
     24 class T_P_pat <InstHexagon MI, Intrinsic IntID>
     25   : Pat <(IntID I64:$Rs),
     26          (MI I64:$Rs)>;
     27 
     28 class T_II_pat <InstHexagon MI, Intrinsic IntID, PatFrag Imm1, PatFrag Imm2>
     29   : Pat<(IntID Imm1:$Is, Imm2:$It),
     30         (MI Imm1:$Is, Imm2:$It)>;
     31 
     32 class T_RI_pat <InstHexagon MI, Intrinsic IntID,
     33                 PatLeaf ImmPred = PatLeaf<(i32 imm)>>
     34   : Pat<(IntID I32:$Rs, ImmPred:$It),
     35         (MI I32:$Rs, ImmPred:$It)>;
     36 
     37 class T_IR_pat <InstHexagon MI, Intrinsic IntID,
     38                 PatFrag ImmPred = PatLeaf<(i32 imm)>>
     39   : Pat<(IntID ImmPred:$Is, I32:$Rt),
     40         (MI ImmPred:$Is, I32:$Rt)>;
     41 
     42 class T_PI_pat <InstHexagon MI, Intrinsic IntID>
     43   : Pat<(IntID I64:$Rs, imm:$It),
     44         (MI I64:$Rs, imm:$It)>;
     45 
     46 class T_RP_pat <InstHexagon MI, Intrinsic IntID>
     47   : Pat<(IntID I32:$Rs, I64:$Rt),
     48         (MI I32:$Rs, I64:$Rt)>;
     49 
     50 class T_RR_pat <InstHexagon MI, Intrinsic IntID>
     51   : Pat <(IntID I32:$Rs, I32:$Rt),
     52          (MI I32:$Rs, I32:$Rt)>;
     53 
     54 class T_PP_pat <InstHexagon MI, Intrinsic IntID>
     55   : Pat <(IntID I64:$Rs, I64:$Rt),
     56          (MI I64:$Rs, I64:$Rt)>;
     57 
     58 class T_QQ_pat <InstHexagon MI, Intrinsic IntID>
     59   : Pat <(IntID I32:$Rs, I32:$Rt),
     60          (MI (C2_tfrrp I32:$Rs), (C2_tfrrp I32:$Rt))>;
     61 
     62 class T_QII_pat <InstHexagon MI, Intrinsic IntID, PatFrag Imm1, PatFrag Imm2>
     63   : Pat <(IntID I32:$Rp, Imm1:$Is, Imm2:$It),
     64          (MI (C2_tfrrp I32:$Rp), Imm1:$Is, Imm2:$It)>;
     65 
     66 class T_QRR_pat <InstHexagon MI, Intrinsic IntID>
     67   : Pat <(IntID I32:$Rp, I32:$Rs, I32:$Rt),
     68          (MI (C2_tfrrp I32:$Rp), I32:$Rs, I32:$Rt)>;
     69 
     70 class T_QRI_pat <InstHexagon MI, Intrinsic IntID, PatFrag ImmPred>
     71   : Pat <(IntID I32:$Rp, I32:$Rs, ImmPred:$Is),
     72          (MI (C2_tfrrp I32:$Rp), I32:$Rs, ImmPred:$Is)>;
     73 
     74 class T_QIR_pat <InstHexagon MI, Intrinsic IntID, PatFrag ImmPred>
     75   : Pat <(IntID I32:$Rp, ImmPred:$Is, I32:$Rs),
     76          (MI (C2_tfrrp I32:$Rp), ImmPred:$Is, I32:$Rs)>;
     77 
     78 class T_QPP_pat <InstHexagon MI, Intrinsic IntID>
     79   : Pat <(IntID I32:$Rp, I64:$Rs, I64:$Rt),
     80          (MI (C2_tfrrp I32:$Rp), I64:$Rs, I64:$Rt)>;
     81 
     82 class T_RRI_pat <InstHexagon MI, Intrinsic IntID>
     83   : Pat <(IntID I32:$Rs, I32:$Rt, imm:$Iu),
     84          (MI I32:$Rs, I32:$Rt, imm:$Iu)>;
     85 
     86 class T_RII_pat <InstHexagon MI, Intrinsic IntID>
     87   : Pat <(IntID I32:$Rs, imm:$It, imm:$Iu),
     88          (MI I32:$Rs, imm:$It, imm:$Iu)>;
     89 
     90 class T_IRI_pat <InstHexagon MI, Intrinsic IntID>
     91   : Pat <(IntID imm:$It, I32:$Rs, imm:$Iu),
     92          (MI imm:$It, I32:$Rs, imm:$Iu)>;
     93 
     94 class T_IRR_pat <InstHexagon MI, Intrinsic IntID>
     95   : Pat <(IntID imm:$Is, I32:$Rs, I32:$Rt),
     96          (MI imm:$Is, I32:$Rs, I32:$Rt)>;
     97 
     98 class T_RIR_pat <InstHexagon MI, Intrinsic IntID>
     99   : Pat <(IntID I32:$Rs, imm:$Is, I32:$Rt),
    100          (MI I32:$Rs, imm:$Is, I32:$Rt)>;
    101 
    102 class T_RRR_pat <InstHexagon MI, Intrinsic IntID>
    103   : Pat <(IntID I32:$Rs, I32:$Rt, I32:$Ru),
    104          (MI I32:$Rs, I32:$Rt, I32:$Ru)>;
    105 
    106 class T_PPI_pat <InstHexagon MI, Intrinsic IntID>
    107   : Pat <(IntID I64:$Rs, I64:$Rt, imm:$Iu),
    108          (MI I64:$Rs, I64:$Rt, imm:$Iu)>;
    109 
    110 class T_PII_pat <InstHexagon MI, Intrinsic IntID>
    111   : Pat <(IntID I64:$Rs, imm:$It, imm:$Iu),
    112          (MI I64:$Rs, imm:$It, imm:$Iu)>;
    113 
    114 class T_PPP_pat <InstHexagon MI, Intrinsic IntID>
    115   : Pat <(IntID I64:$Rs, I64:$Rt, I64:$Ru),
    116          (MI I64:$Rs, I64:$Rt, I64:$Ru)>;
    117 
    118 class T_PPR_pat <InstHexagon MI, Intrinsic IntID>
    119   : Pat <(IntID I64:$Rs, I64:$Rt, I32:$Ru),
    120          (MI I64:$Rs, I64:$Rt, I32:$Ru)>;
    121 
    122 class T_PRR_pat <InstHexagon MI, Intrinsic IntID>
    123   : Pat <(IntID I64:$Rs, I32:$Rt, I32:$Ru),
    124          (MI I64:$Rs, I32:$Rt, I32:$Ru)>;
    125 
    126 class T_PPQ_pat <InstHexagon MI, Intrinsic IntID>
    127   : Pat <(IntID I64:$Rs, I64:$Rt, I32:$Rp),
    128          (MI I64:$Rs, I64:$Rt, (C2_tfrrp I32:$Rp))>;
    129 
    130 class T_PR_pat <InstHexagon MI, Intrinsic IntID>
    131   : Pat <(IntID I64:$Rs, I32:$Rt),
    132          (MI I64:$Rs, I32:$Rt)>;
    133 
    134 class T_D_pat <InstHexagon MI, Intrinsic IntID>
    135   : Pat<(IntID (F64:$Rs)),
    136         (MI (F64:$Rs))>;
    137 
    138 class T_DI_pat <InstHexagon MI, Intrinsic IntID,
    139                 PatLeaf ImmPred = PatLeaf<(i32 imm)>>
    140   : Pat<(IntID F64:$Rs, ImmPred:$It),
    141         (MI F64:$Rs, ImmPred:$It)>;
    142 
    143 class T_F_pat <InstHexagon MI, Intrinsic IntID>
    144   : Pat<(IntID F32:$Rs),
    145         (MI F32:$Rs)>;
    146 
    147 class T_FI_pat <InstHexagon MI, Intrinsic IntID,
    148                 PatLeaf ImmPred = PatLeaf<(i32 imm)>>
    149   : Pat<(IntID F32:$Rs, ImmPred:$It),
    150         (MI F32:$Rs, ImmPred:$It)>;
    151 
    152 class T_FF_pat <InstHexagon MI, Intrinsic IntID>
    153   : Pat<(IntID F32:$Rs, F32:$Rt),
    154         (MI F32:$Rs, F32:$Rt)>;
    155 
    156 class T_DD_pat <InstHexagon MI, Intrinsic IntID>
    157   : Pat<(IntID F64:$Rs, F64:$Rt),
    158         (MI F64:$Rs, F64:$Rt)>;
    159 
    160 class T_FFF_pat <InstHexagon MI, Intrinsic IntID>
    161   : Pat<(IntID F32:$Rs, F32:$Rt, F32:$Ru),
    162         (MI F32:$Rs, F32:$Rt, F32:$Ru)>;
    163 
    164 class T_FFFQ_pat <InstHexagon MI, Intrinsic IntID>
    165   : Pat <(IntID F32:$Rs, F32:$Rt, F32:$Ru, I32:$Rp),
    166          (MI F32:$Rs, F32:$Rt, F32:$Ru, (C2_tfrrp I32:$Rp))>;
    167 
    168 class T_Q_RI_pat <InstHexagon MI, Intrinsic IntID,
    169                   PatLeaf ImmPred = PatLeaf<(i32 imm)>>
    170   : Pat<(IntID I32:$Rs, ImmPred:$It),
    171         (C2_tfrpr (MI I32:$Rs, ImmPred:$It))>;
    172 
    173 class T_Q_RR_pat <InstHexagon MI, Intrinsic IntID>
    174   : Pat <(IntID I32:$Rs, I32:$Rt),
    175          (C2_tfrpr (MI I32:$Rs, I32:$Rt))>;
    176 
    177 class T_Q_RP_pat <InstHexagon MI, Intrinsic IntID>
    178   : Pat <(IntID I32:$Rs, I64:$Rt),
    179          (C2_tfrpr (MI I32:$Rs, I64:$Rt))>;
    180 
    181 class T_Q_PR_pat <InstHexagon MI, Intrinsic IntID>
    182   : Pat <(IntID I64:$Rs, I32:$Rt),
    183          (C2_tfrpr (MI I64:$Rs, I32:$Rt))>;
    184 
    185 class T_Q_PI_pat <InstHexagon MI, Intrinsic IntID>
    186   : Pat<(IntID I64:$Rs, imm:$It),
    187         (C2_tfrpr (MI I64:$Rs, imm:$It))>;
    188 
    189 class T_Q_PP_pat <InstHexagon MI, Intrinsic IntID>
    190   : Pat <(IntID I64:$Rs, I64:$Rt),
    191          (C2_tfrpr (MI I64:$Rs, I64:$Rt))>;
    192 
    193 class T_Q_Q_pat <InstHexagon MI, Intrinsic IntID>
    194   : Pat <(IntID I32:$Rp),
    195          (C2_tfrpr (MI (C2_tfrrp I32:$Rp)))>;
    196 
    197 class T_Q_QQ_pat <InstHexagon MI, Intrinsic IntID>
    198   : Pat <(IntID I32:$Rp, I32:$Rq),
    199          (C2_tfrpr (MI (C2_tfrrp I32:$Rp), (C2_tfrrp I32:$Rq)))>;
    200 
    201 class T_Q_FF_pat <InstHexagon MI, Intrinsic IntID>
    202   : Pat<(IntID F32:$Rs, F32:$Rt),
    203         (C2_tfrpr (MI F32:$Rs, F32:$Rt))>;
    204 
    205 class T_Q_DD_pat <InstHexagon MI, Intrinsic IntID>
    206   : Pat<(IntID F64:$Rs, F64:$Rt),
    207         (C2_tfrpr (MI F64:$Rs, F64:$Rt))>;
    208 
    209 class T_Q_FI_pat <InstHexagon MI, Intrinsic IntID>
    210   : Pat<(IntID F32:$Rs, imm:$It),
    211         (C2_tfrpr (MI F32:$Rs, imm:$It))>;
    212 
    213 class T_Q_DI_pat <InstHexagon MI, Intrinsic IntID>
    214   : Pat<(IntID F64:$Rs, imm:$It),
    215         (C2_tfrpr (MI F64:$Rs, imm:$It))>;
    216 
    217 class T_Q_QQQ_pat <InstHexagon MI, Intrinsic IntID>
    218   : Pat <(IntID I32:$Rp, I32:$Rq, I32:$Rs),
    219          (C2_tfrpr (MI (C2_tfrrp I32:$Rp), (C2_tfrrp I32:$Rq),
    220                        (C2_tfrrp I32:$Rs)))>;
    221 
    222 //===----------------------------------------------------------------------===//
    223 // MPYS / Multipy signed/unsigned halfwords
    224 //Rd=mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:rnd][:sat]
    225 //===----------------------------------------------------------------------===//
    226 
    227 def : T_RR_pat <M2_mpy_ll_s1, int_hexagon_M2_mpy_ll_s1>;
    228 def : T_RR_pat <M2_mpy_ll_s0, int_hexagon_M2_mpy_ll_s0>;
    229 def : T_RR_pat <M2_mpy_lh_s1, int_hexagon_M2_mpy_lh_s1>;
    230 def : T_RR_pat <M2_mpy_lh_s0, int_hexagon_M2_mpy_lh_s0>;
    231 def : T_RR_pat <M2_mpy_hl_s1, int_hexagon_M2_mpy_hl_s1>;
    232 def : T_RR_pat <M2_mpy_hl_s0, int_hexagon_M2_mpy_hl_s0>;
    233 def : T_RR_pat <M2_mpy_hh_s1, int_hexagon_M2_mpy_hh_s1>;
    234 def : T_RR_pat <M2_mpy_hh_s0, int_hexagon_M2_mpy_hh_s0>;
    235 
    236 def : T_RR_pat <M2_mpyu_ll_s1, int_hexagon_M2_mpyu_ll_s1>;
    237 def : T_RR_pat <M2_mpyu_ll_s0, int_hexagon_M2_mpyu_ll_s0>;
    238 def : T_RR_pat <M2_mpyu_lh_s1, int_hexagon_M2_mpyu_lh_s1>;
    239 def : T_RR_pat <M2_mpyu_lh_s0, int_hexagon_M2_mpyu_lh_s0>;
    240 def : T_RR_pat <M2_mpyu_hl_s1, int_hexagon_M2_mpyu_hl_s1>;
    241 def : T_RR_pat <M2_mpyu_hl_s0, int_hexagon_M2_mpyu_hl_s0>;
    242 def : T_RR_pat <M2_mpyu_hh_s1, int_hexagon_M2_mpyu_hh_s1>;
    243 def : T_RR_pat <M2_mpyu_hh_s0, int_hexagon_M2_mpyu_hh_s0>;
    244 
    245 def : T_RR_pat <M2_mpy_sat_ll_s1, int_hexagon_M2_mpy_sat_ll_s1>;
    246 def : T_RR_pat <M2_mpy_sat_ll_s0, int_hexagon_M2_mpy_sat_ll_s0>;
    247 def : T_RR_pat <M2_mpy_sat_lh_s1, int_hexagon_M2_mpy_sat_lh_s1>;
    248 def : T_RR_pat <M2_mpy_sat_lh_s0, int_hexagon_M2_mpy_sat_lh_s0>;
    249 def : T_RR_pat <M2_mpy_sat_hl_s1, int_hexagon_M2_mpy_sat_hl_s1>;
    250 def : T_RR_pat <M2_mpy_sat_hl_s0, int_hexagon_M2_mpy_sat_hl_s0>;
    251 def : T_RR_pat <M2_mpy_sat_hh_s1, int_hexagon_M2_mpy_sat_hh_s1>;
    252 def : T_RR_pat <M2_mpy_sat_hh_s0, int_hexagon_M2_mpy_sat_hh_s0>;
    253 
    254 def : T_RR_pat <M2_mpy_rnd_ll_s1, int_hexagon_M2_mpy_rnd_ll_s1>;
    255 def : T_RR_pat <M2_mpy_rnd_ll_s0, int_hexagon_M2_mpy_rnd_ll_s0>;
    256 def : T_RR_pat <M2_mpy_rnd_lh_s1, int_hexagon_M2_mpy_rnd_lh_s1>;
    257 def : T_RR_pat <M2_mpy_rnd_lh_s0, int_hexagon_M2_mpy_rnd_lh_s0>;
    258 def : T_RR_pat <M2_mpy_rnd_hl_s1, int_hexagon_M2_mpy_rnd_hl_s1>;
    259 def : T_RR_pat <M2_mpy_rnd_hl_s0, int_hexagon_M2_mpy_rnd_hl_s0>;
    260 def : T_RR_pat <M2_mpy_rnd_hh_s1, int_hexagon_M2_mpy_rnd_hh_s1>;
    261 def : T_RR_pat <M2_mpy_rnd_hh_s0, int_hexagon_M2_mpy_rnd_hh_s0>;
    262 
    263 def : T_RR_pat <M2_mpy_sat_rnd_ll_s1, int_hexagon_M2_mpy_sat_rnd_ll_s1>;
    264 def : T_RR_pat <M2_mpy_sat_rnd_ll_s0, int_hexagon_M2_mpy_sat_rnd_ll_s0>;
    265 def : T_RR_pat <M2_mpy_sat_rnd_lh_s1, int_hexagon_M2_mpy_sat_rnd_lh_s1>;
    266 def : T_RR_pat <M2_mpy_sat_rnd_lh_s0, int_hexagon_M2_mpy_sat_rnd_lh_s0>;
    267 def : T_RR_pat <M2_mpy_sat_rnd_hl_s1, int_hexagon_M2_mpy_sat_rnd_hl_s1>;
    268 def : T_RR_pat <M2_mpy_sat_rnd_hl_s0, int_hexagon_M2_mpy_sat_rnd_hl_s0>;
    269 def : T_RR_pat <M2_mpy_sat_rnd_hh_s1, int_hexagon_M2_mpy_sat_rnd_hh_s1>;
    270 def : T_RR_pat <M2_mpy_sat_rnd_hh_s0, int_hexagon_M2_mpy_sat_rnd_hh_s0>;
    271 
    272 
    273 //===----------------------------------------------------------------------===//
    274 // MPYS / Multipy signed/unsigned halfwords and add/subtract the
    275 // result from the accumulator.
    276 //Rx [-+]= mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:sat]
    277 //===----------------------------------------------------------------------===//
    278 
    279 def : T_RRR_pat <M2_mpy_acc_ll_s1, int_hexagon_M2_mpy_acc_ll_s1>;
    280 def : T_RRR_pat <M2_mpy_acc_ll_s0, int_hexagon_M2_mpy_acc_ll_s0>;
    281 def : T_RRR_pat <M2_mpy_acc_lh_s1, int_hexagon_M2_mpy_acc_lh_s1>;
    282 def : T_RRR_pat <M2_mpy_acc_lh_s0, int_hexagon_M2_mpy_acc_lh_s0>;
    283 def : T_RRR_pat <M2_mpy_acc_hl_s1, int_hexagon_M2_mpy_acc_hl_s1>;
    284 def : T_RRR_pat <M2_mpy_acc_hl_s0, int_hexagon_M2_mpy_acc_hl_s0>;
    285 def : T_RRR_pat <M2_mpy_acc_hh_s1, int_hexagon_M2_mpy_acc_hh_s1>;
    286 def : T_RRR_pat <M2_mpy_acc_hh_s0, int_hexagon_M2_mpy_acc_hh_s0>;
    287 
    288 def : T_RRR_pat <M2_mpyu_acc_ll_s1, int_hexagon_M2_mpyu_acc_ll_s1>;
    289 def : T_RRR_pat <M2_mpyu_acc_ll_s0, int_hexagon_M2_mpyu_acc_ll_s0>;
    290 def : T_RRR_pat <M2_mpyu_acc_lh_s1, int_hexagon_M2_mpyu_acc_lh_s1>;
    291 def : T_RRR_pat <M2_mpyu_acc_lh_s0, int_hexagon_M2_mpyu_acc_lh_s0>;
    292 def : T_RRR_pat <M2_mpyu_acc_hl_s1, int_hexagon_M2_mpyu_acc_hl_s1>;
    293 def : T_RRR_pat <M2_mpyu_acc_hl_s0, int_hexagon_M2_mpyu_acc_hl_s0>;
    294 def : T_RRR_pat <M2_mpyu_acc_hh_s1, int_hexagon_M2_mpyu_acc_hh_s1>;
    295 def : T_RRR_pat <M2_mpyu_acc_hh_s0, int_hexagon_M2_mpyu_acc_hh_s0>;
    296 
    297 def : T_RRR_pat <M2_mpy_nac_ll_s1, int_hexagon_M2_mpy_nac_ll_s1>;
    298 def : T_RRR_pat <M2_mpy_nac_ll_s0, int_hexagon_M2_mpy_nac_ll_s0>;
    299 def : T_RRR_pat <M2_mpy_nac_lh_s1, int_hexagon_M2_mpy_nac_lh_s1>;
    300 def : T_RRR_pat <M2_mpy_nac_lh_s0, int_hexagon_M2_mpy_nac_lh_s0>;
    301 def : T_RRR_pat <M2_mpy_nac_hl_s1, int_hexagon_M2_mpy_nac_hl_s1>;
    302 def : T_RRR_pat <M2_mpy_nac_hl_s0, int_hexagon_M2_mpy_nac_hl_s0>;
    303 def : T_RRR_pat <M2_mpy_nac_hh_s1, int_hexagon_M2_mpy_nac_hh_s1>;
    304 def : T_RRR_pat <M2_mpy_nac_hh_s0, int_hexagon_M2_mpy_nac_hh_s0>;
    305 
    306 def : T_RRR_pat <M2_mpyu_nac_ll_s1, int_hexagon_M2_mpyu_nac_ll_s1>;
    307 def : T_RRR_pat <M2_mpyu_nac_ll_s0, int_hexagon_M2_mpyu_nac_ll_s0>;
    308 def : T_RRR_pat <M2_mpyu_nac_lh_s1, int_hexagon_M2_mpyu_nac_lh_s1>;
    309 def : T_RRR_pat <M2_mpyu_nac_lh_s0, int_hexagon_M2_mpyu_nac_lh_s0>;
    310 def : T_RRR_pat <M2_mpyu_nac_hl_s1, int_hexagon_M2_mpyu_nac_hl_s1>;
    311 def : T_RRR_pat <M2_mpyu_nac_hl_s0, int_hexagon_M2_mpyu_nac_hl_s0>;
    312 def : T_RRR_pat <M2_mpyu_nac_hh_s1, int_hexagon_M2_mpyu_nac_hh_s1>;
    313 def : T_RRR_pat <M2_mpyu_nac_hh_s0, int_hexagon_M2_mpyu_nac_hh_s0>;
    314 
    315 def : T_RRR_pat <M2_mpy_acc_sat_ll_s1, int_hexagon_M2_mpy_acc_sat_ll_s1>;
    316 def : T_RRR_pat <M2_mpy_acc_sat_ll_s0, int_hexagon_M2_mpy_acc_sat_ll_s0>;
    317 def : T_RRR_pat <M2_mpy_acc_sat_lh_s1, int_hexagon_M2_mpy_acc_sat_lh_s1>;
    318 def : T_RRR_pat <M2_mpy_acc_sat_lh_s0, int_hexagon_M2_mpy_acc_sat_lh_s0>;
    319 def : T_RRR_pat <M2_mpy_acc_sat_hl_s1, int_hexagon_M2_mpy_acc_sat_hl_s1>;
    320 def : T_RRR_pat <M2_mpy_acc_sat_hl_s0, int_hexagon_M2_mpy_acc_sat_hl_s0>;
    321 def : T_RRR_pat <M2_mpy_acc_sat_hh_s1, int_hexagon_M2_mpy_acc_sat_hh_s1>;
    322 def : T_RRR_pat <M2_mpy_acc_sat_hh_s0, int_hexagon_M2_mpy_acc_sat_hh_s0>;
    323 
    324 def : T_RRR_pat <M2_mpy_nac_sat_ll_s1, int_hexagon_M2_mpy_nac_sat_ll_s1>;
    325 def : T_RRR_pat <M2_mpy_nac_sat_ll_s0, int_hexagon_M2_mpy_nac_sat_ll_s0>;
    326 def : T_RRR_pat <M2_mpy_nac_sat_lh_s1, int_hexagon_M2_mpy_nac_sat_lh_s1>;
    327 def : T_RRR_pat <M2_mpy_nac_sat_lh_s0, int_hexagon_M2_mpy_nac_sat_lh_s0>;
    328 def : T_RRR_pat <M2_mpy_nac_sat_hl_s1, int_hexagon_M2_mpy_nac_sat_hl_s1>;
    329 def : T_RRR_pat <M2_mpy_nac_sat_hl_s0, int_hexagon_M2_mpy_nac_sat_hl_s0>;
    330 def : T_RRR_pat <M2_mpy_nac_sat_hh_s1, int_hexagon_M2_mpy_nac_sat_hh_s1>;
    331 def : T_RRR_pat <M2_mpy_nac_sat_hh_s0, int_hexagon_M2_mpy_nac_sat_hh_s0>;
    332 
    333 
    334 //===----------------------------------------------------------------------===//
    335 // Multiply signed/unsigned halfwords with and without saturation and rounding
    336 // into a 64-bits destination register.
    337 //===----------------------------------------------------------------------===//
    338 
    339 def : T_RR_pat <M2_mpyd_hh_s0, int_hexagon_M2_mpyd_hh_s0>;
    340 def : T_RR_pat <M2_mpyd_hl_s0, int_hexagon_M2_mpyd_hl_s0>;
    341 def : T_RR_pat <M2_mpyd_lh_s0, int_hexagon_M2_mpyd_lh_s0>;
    342 def : T_RR_pat <M2_mpyd_ll_s0, int_hexagon_M2_mpyd_ll_s0>;
    343 def : T_RR_pat <M2_mpyd_hh_s1, int_hexagon_M2_mpyd_hh_s1>;
    344 def : T_RR_pat <M2_mpyd_hl_s1, int_hexagon_M2_mpyd_hl_s1>;
    345 def : T_RR_pat <M2_mpyd_lh_s1, int_hexagon_M2_mpyd_lh_s1>;
    346 def : T_RR_pat <M2_mpyd_ll_s1, int_hexagon_M2_mpyd_ll_s1>;
    347 
    348 def : T_RR_pat <M2_mpyd_rnd_hh_s0, int_hexagon_M2_mpyd_rnd_hh_s0>;
    349 def : T_RR_pat <M2_mpyd_rnd_hl_s0, int_hexagon_M2_mpyd_rnd_hl_s0>;
    350 def : T_RR_pat <M2_mpyd_rnd_lh_s0, int_hexagon_M2_mpyd_rnd_lh_s0>;
    351 def : T_RR_pat <M2_mpyd_rnd_ll_s0, int_hexagon_M2_mpyd_rnd_ll_s0>;
    352 def : T_RR_pat <M2_mpyd_rnd_hh_s1, int_hexagon_M2_mpyd_rnd_hh_s1>;
    353 def : T_RR_pat <M2_mpyd_rnd_hl_s1, int_hexagon_M2_mpyd_rnd_hl_s1>;
    354 def : T_RR_pat <M2_mpyd_rnd_lh_s1, int_hexagon_M2_mpyd_rnd_lh_s1>;
    355 def : T_RR_pat <M2_mpyd_rnd_ll_s1, int_hexagon_M2_mpyd_rnd_ll_s1>;
    356 
    357 def : T_RR_pat <M2_mpyud_hh_s0, int_hexagon_M2_mpyud_hh_s0>;
    358 def : T_RR_pat <M2_mpyud_hl_s0, int_hexagon_M2_mpyud_hl_s0>;
    359 def : T_RR_pat <M2_mpyud_lh_s0, int_hexagon_M2_mpyud_lh_s0>;
    360 def : T_RR_pat <M2_mpyud_ll_s0, int_hexagon_M2_mpyud_ll_s0>;
    361 def : T_RR_pat <M2_mpyud_hh_s1, int_hexagon_M2_mpyud_hh_s1>;
    362 def : T_RR_pat <M2_mpyud_hl_s1, int_hexagon_M2_mpyud_hl_s1>;
    363 def : T_RR_pat <M2_mpyud_lh_s1, int_hexagon_M2_mpyud_lh_s1>;
    364 def : T_RR_pat <M2_mpyud_ll_s1, int_hexagon_M2_mpyud_ll_s1>;
    365 
    366 //===----------------------------------------------------------------------===//
    367 // MPYS / Multipy signed/unsigned halfwords and add/subtract the
    368 // result from the 64-bit destination register.
    369 //Rxx [-+]= mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:sat]
    370 //===----------------------------------------------------------------------===//
    371 
    372 def : T_PRR_pat <M2_mpyd_acc_hh_s0, int_hexagon_M2_mpyd_acc_hh_s0>;
    373 def : T_PRR_pat <M2_mpyd_acc_hl_s0, int_hexagon_M2_mpyd_acc_hl_s0>;
    374 def : T_PRR_pat <M2_mpyd_acc_lh_s0, int_hexagon_M2_mpyd_acc_lh_s0>;
    375 def : T_PRR_pat <M2_mpyd_acc_ll_s0, int_hexagon_M2_mpyd_acc_ll_s0>;
    376 
    377 def : T_PRR_pat <M2_mpyd_acc_hh_s1, int_hexagon_M2_mpyd_acc_hh_s1>;
    378 def : T_PRR_pat <M2_mpyd_acc_hl_s1, int_hexagon_M2_mpyd_acc_hl_s1>;
    379 def : T_PRR_pat <M2_mpyd_acc_lh_s1, int_hexagon_M2_mpyd_acc_lh_s1>;
    380 def : T_PRR_pat <M2_mpyd_acc_ll_s1, int_hexagon_M2_mpyd_acc_ll_s1>;
    381 
    382 def : T_PRR_pat <M2_mpyd_nac_hh_s0, int_hexagon_M2_mpyd_nac_hh_s0>;
    383 def : T_PRR_pat <M2_mpyd_nac_hl_s0, int_hexagon_M2_mpyd_nac_hl_s0>;
    384 def : T_PRR_pat <M2_mpyd_nac_lh_s0, int_hexagon_M2_mpyd_nac_lh_s0>;
    385 def : T_PRR_pat <M2_mpyd_nac_ll_s0, int_hexagon_M2_mpyd_nac_ll_s0>;
    386 
    387 def : T_PRR_pat <M2_mpyd_nac_hh_s1, int_hexagon_M2_mpyd_nac_hh_s1>;
    388 def : T_PRR_pat <M2_mpyd_nac_hl_s1, int_hexagon_M2_mpyd_nac_hl_s1>;
    389 def : T_PRR_pat <M2_mpyd_nac_lh_s1, int_hexagon_M2_mpyd_nac_lh_s1>;
    390 def : T_PRR_pat <M2_mpyd_nac_ll_s1, int_hexagon_M2_mpyd_nac_ll_s1>;
    391 
    392 def : T_PRR_pat <M2_mpyud_acc_hh_s0, int_hexagon_M2_mpyud_acc_hh_s0>;
    393 def : T_PRR_pat <M2_mpyud_acc_hl_s0, int_hexagon_M2_mpyud_acc_hl_s0>;
    394 def : T_PRR_pat <M2_mpyud_acc_lh_s0, int_hexagon_M2_mpyud_acc_lh_s0>;
    395 def : T_PRR_pat <M2_mpyud_acc_ll_s0, int_hexagon_M2_mpyud_acc_ll_s0>;
    396 
    397 def : T_PRR_pat <M2_mpyud_acc_hh_s1, int_hexagon_M2_mpyud_acc_hh_s1>;
    398 def : T_PRR_pat <M2_mpyud_acc_hl_s1, int_hexagon_M2_mpyud_acc_hl_s1>;
    399 def : T_PRR_pat <M2_mpyud_acc_lh_s1, int_hexagon_M2_mpyud_acc_lh_s1>;
    400 def : T_PRR_pat <M2_mpyud_acc_ll_s1, int_hexagon_M2_mpyud_acc_ll_s1>;
    401 
    402 def : T_PRR_pat <M2_mpyud_nac_hh_s0, int_hexagon_M2_mpyud_nac_hh_s0>;
    403 def : T_PRR_pat <M2_mpyud_nac_hl_s0, int_hexagon_M2_mpyud_nac_hl_s0>;
    404 def : T_PRR_pat <M2_mpyud_nac_lh_s0, int_hexagon_M2_mpyud_nac_lh_s0>;
    405 def : T_PRR_pat <M2_mpyud_nac_ll_s0, int_hexagon_M2_mpyud_nac_ll_s0>;
    406 
    407 def : T_PRR_pat <M2_mpyud_nac_hh_s1, int_hexagon_M2_mpyud_nac_hh_s1>;
    408 def : T_PRR_pat <M2_mpyud_nac_hl_s1, int_hexagon_M2_mpyud_nac_hl_s1>;
    409 def : T_PRR_pat <M2_mpyud_nac_lh_s1, int_hexagon_M2_mpyud_nac_lh_s1>;
    410 def : T_PRR_pat <M2_mpyud_nac_ll_s1, int_hexagon_M2_mpyud_nac_ll_s1>;
    411 
    412 // Vector complex multiply imaginary: Rdd=vcmpyi(Rss,Rtt)[:<<1]:sat
    413 def : T_PP_pat <M2_vcmpy_s1_sat_i, int_hexagon_M2_vcmpy_s1_sat_i>;
    414 def : T_PP_pat <M2_vcmpy_s0_sat_i, int_hexagon_M2_vcmpy_s0_sat_i>;
    415 
    416 // Vector complex multiply real: Rdd=vcmpyr(Rss,Rtt)[:<<1]:sat
    417 def : T_PP_pat <M2_vcmpy_s1_sat_r, int_hexagon_M2_vcmpy_s1_sat_r>;
    418 def : T_PP_pat <M2_vcmpy_s0_sat_r, int_hexagon_M2_vcmpy_s0_sat_r>;
    419 
    420 // Vector dual multiply: Rdd=vdmpy(Rss,Rtt)[:<<1]:sat
    421 def : T_PP_pat <M2_vdmpys_s1, int_hexagon_M2_vdmpys_s1>;
    422 def : T_PP_pat <M2_vdmpys_s0, int_hexagon_M2_vdmpys_s0>;
    423 
    424 // Vector multiply even halfwords: Rdd=vmpyeh(Rss,Rtt)[:<<1]:sat
    425 def : T_PP_pat <M2_vmpy2es_s1, int_hexagon_M2_vmpy2es_s1>;
    426 def : T_PP_pat <M2_vmpy2es_s0, int_hexagon_M2_vmpy2es_s0>;
    427 
    428 //Rdd=vmpywoh(Rss,Rtt)[:<<1][:rnd]:sat
    429 def : T_PP_pat <M2_mmpyh_s0,  int_hexagon_M2_mmpyh_s0>;
    430 def : T_PP_pat <M2_mmpyh_s1,  int_hexagon_M2_mmpyh_s1>;
    431 def : T_PP_pat <M2_mmpyh_rs0, int_hexagon_M2_mmpyh_rs0>;
    432 def : T_PP_pat <M2_mmpyh_rs1, int_hexagon_M2_mmpyh_rs1>;
    433 
    434 //Rdd=vmpyweh(Rss,Rtt)[:<<1][:rnd]:sat
    435 def : T_PP_pat <M2_mmpyl_s0,  int_hexagon_M2_mmpyl_s0>;
    436 def : T_PP_pat <M2_mmpyl_s1,  int_hexagon_M2_mmpyl_s1>;
    437 def : T_PP_pat <M2_mmpyl_rs0, int_hexagon_M2_mmpyl_rs0>;
    438 def : T_PP_pat <M2_mmpyl_rs1, int_hexagon_M2_mmpyl_rs1>;
    439 
    440 //Rdd=vmpywouh(Rss,Rtt)[:<<1][:rnd]:sat
    441 def : T_PP_pat <M2_mmpyuh_s0,  int_hexagon_M2_mmpyuh_s0>;
    442 def : T_PP_pat <M2_mmpyuh_s1,  int_hexagon_M2_mmpyuh_s1>;
    443 def : T_PP_pat <M2_mmpyuh_rs0, int_hexagon_M2_mmpyuh_rs0>;
    444 def : T_PP_pat <M2_mmpyuh_rs1, int_hexagon_M2_mmpyuh_rs1>;
    445 
    446 //Rdd=vmpyweuh(Rss,Rtt)[:<<1][:rnd]:sat
    447 def : T_PP_pat <M2_mmpyul_s0,  int_hexagon_M2_mmpyul_s0>;
    448 def : T_PP_pat <M2_mmpyul_s1,  int_hexagon_M2_mmpyul_s1>;
    449 def : T_PP_pat <M2_mmpyul_rs0, int_hexagon_M2_mmpyul_rs0>;
    450 def : T_PP_pat <M2_mmpyul_rs1, int_hexagon_M2_mmpyul_rs1>;
    451 
    452 // Vector reduce add unsigned bytes: Rdd32[+]=vrmpybu(Rss32,Rtt32)
    453 def : T_PP_pat  <A2_vraddub,     int_hexagon_A2_vraddub>;
    454 def : T_PPP_pat <A2_vraddub_acc, int_hexagon_A2_vraddub_acc>;
    455 
    456 // Vector sum of absolute differences unsigned bytes: Rdd=vrsadub(Rss,Rtt)
    457 def : T_PP_pat  <A2_vrsadub,     int_hexagon_A2_vrsadub>;
    458 def : T_PPP_pat <A2_vrsadub_acc, int_hexagon_A2_vrsadub_acc>;
    459 
    460 // Vector absolute difference: Rdd=vabsdiffh(Rtt,Rss)
    461 def : T_PP_pat <M2_vabsdiffh, int_hexagon_M2_vabsdiffh>;
    462 
    463 // Vector absolute difference words: Rdd=vabsdiffw(Rtt,Rss)
    464 def : T_PP_pat <M2_vabsdiffw, int_hexagon_M2_vabsdiffw>;
    465 
    466 // Vector reduce complex multiply real or imaginary:
    467 // Rdd[+]=vrcmpy[ir](Rss,Rtt[*])
    468 def : T_PP_pat  <M2_vrcmpyi_s0,  int_hexagon_M2_vrcmpyi_s0>;
    469 def : T_PP_pat  <M2_vrcmpyi_s0c, int_hexagon_M2_vrcmpyi_s0c>;
    470 def : T_PPP_pat <M2_vrcmaci_s0,  int_hexagon_M2_vrcmaci_s0>;
    471 def : T_PPP_pat <M2_vrcmaci_s0c, int_hexagon_M2_vrcmaci_s0c>;
    472 
    473 def : T_PP_pat  <M2_vrcmpyr_s0,  int_hexagon_M2_vrcmpyr_s0>;
    474 def : T_PP_pat  <M2_vrcmpyr_s0c, int_hexagon_M2_vrcmpyr_s0c>;
    475 def : T_PPP_pat <M2_vrcmacr_s0,  int_hexagon_M2_vrcmacr_s0>;
    476 def : T_PPP_pat <M2_vrcmacr_s0c, int_hexagon_M2_vrcmacr_s0c>;
    477 
    478 // Vector reduce halfwords
    479 // Rdd[+]=vrmpyh(Rss,Rtt)
    480 def : T_PP_pat  <M2_vrmpy_s0, int_hexagon_M2_vrmpy_s0>;
    481 def : T_PPP_pat <M2_vrmac_s0, int_hexagon_M2_vrmac_s0>;
    482 
    483 //===----------------------------------------------------------------------===//
    484 // Vector Multipy with accumulation
    485 //===----------------------------------------------------------------------===//
    486 
    487 // Vector multiply word by signed half with accumulation
    488 // Rxx+=vmpyw[eo]h(Rss,Rtt)[:<<1][:rnd]:sat
    489 def : T_PPP_pat <M2_mmacls_s1, int_hexagon_M2_mmacls_s1>;
    490 def : T_PPP_pat <M2_mmacls_s0, int_hexagon_M2_mmacls_s0>;
    491 def : T_PPP_pat <M2_mmacls_rs1, int_hexagon_M2_mmacls_rs1>;
    492 def : T_PPP_pat <M2_mmacls_rs0, int_hexagon_M2_mmacls_rs0>;
    493 def : T_PPP_pat <M2_mmachs_s1, int_hexagon_M2_mmachs_s1>;
    494 def : T_PPP_pat <M2_mmachs_s0, int_hexagon_M2_mmachs_s0>;
    495 def : T_PPP_pat <M2_mmachs_rs1, int_hexagon_M2_mmachs_rs1>;
    496 def : T_PPP_pat <M2_mmachs_rs0, int_hexagon_M2_mmachs_rs0>;
    497 
    498 // Vector multiply word by unsigned half with accumulation
    499 // Rxx+=vmpyw[eo]uh(Rss,Rtt)[:<<1][:rnd]:sat
    500 def : T_PPP_pat <M2_mmaculs_s1, int_hexagon_M2_mmaculs_s1>;
    501 def : T_PPP_pat <M2_mmaculs_s0, int_hexagon_M2_mmaculs_s0>;
    502 def : T_PPP_pat <M2_mmaculs_rs1, int_hexagon_M2_mmaculs_rs1>;
    503 def : T_PPP_pat <M2_mmaculs_rs0, int_hexagon_M2_mmaculs_rs0>;
    504 def : T_PPP_pat <M2_mmacuhs_s1, int_hexagon_M2_mmacuhs_s1>;
    505 def : T_PPP_pat <M2_mmacuhs_s0, int_hexagon_M2_mmacuhs_s0>;
    506 def : T_PPP_pat <M2_mmacuhs_rs1, int_hexagon_M2_mmacuhs_rs1>;
    507 def : T_PPP_pat <M2_mmacuhs_rs0, int_hexagon_M2_mmacuhs_rs0>;
    508 
    509 // Vector multiply even halfwords with accumulation
    510 // Rxx+=vmpyeh(Rss,Rtt)[:<<1][:sat]
    511 def : T_PPP_pat <M2_vmac2es, int_hexagon_M2_vmac2es>;
    512 def : T_PPP_pat <M2_vmac2es_s1, int_hexagon_M2_vmac2es_s1>;
    513 def : T_PPP_pat <M2_vmac2es_s0, int_hexagon_M2_vmac2es_s0>;
    514 
    515 // Vector dual multiply with accumulation
    516 // Rxx+=vdmpy(Rss,Rtt)[:sat]
    517 def : T_PPP_pat <M2_vdmacs_s1, int_hexagon_M2_vdmacs_s1>;
    518 def : T_PPP_pat <M2_vdmacs_s0, int_hexagon_M2_vdmacs_s0>;
    519 
    520 // Vector complex multiply real or imaginary with accumulation
    521 // Rxx+=vcmpy[ir](Rss,Rtt):sat
    522 def : T_PPP_pat <M2_vcmac_s0_sat_r, int_hexagon_M2_vcmac_s0_sat_r>;
    523 def : T_PPP_pat <M2_vcmac_s0_sat_i, int_hexagon_M2_vcmac_s0_sat_i>;
    524 
    525 //===----------------------------------------------------------------------===//
    526 // Add/Subtract halfword
    527 // Rd=add(Rt.L,Rs.[HL])[:sat]
    528 // Rd=sub(Rt.L,Rs.[HL])[:sat]
    529 // Rd=add(Rt.[LH],Rs.[HL])[:sat][:<16]
    530 // Rd=sub(Rt.[LH],Rs.[HL])[:sat][:<16]
    531 //===----------------------------------------------------------------------===//
    532 
    533 //Rd=add(Rt.L,Rs.[LH])
    534 def : T_RR_pat <A2_addh_l16_ll,     int_hexagon_A2_addh_l16_ll>;
    535 def : T_RR_pat <A2_addh_l16_hl,     int_hexagon_A2_addh_l16_hl>;
    536 
    537 //Rd=add(Rt.L,Rs.[LH]):sat
    538 def : T_RR_pat <A2_addh_l16_sat_ll, int_hexagon_A2_addh_l16_sat_ll>;
    539 def : T_RR_pat <A2_addh_l16_sat_hl, int_hexagon_A2_addh_l16_sat_hl>;
    540 
    541 //Rd=sub(Rt.L,Rs.[LH])
    542 def : T_RR_pat <A2_subh_l16_ll,     int_hexagon_A2_subh_l16_ll>;
    543 def : T_RR_pat <A2_subh_l16_hl,     int_hexagon_A2_subh_l16_hl>;
    544 
    545 //Rd=sub(Rt.L,Rs.[LH]):sat
    546 def : T_RR_pat <A2_subh_l16_sat_ll, int_hexagon_A2_subh_l16_sat_ll>;
    547 def : T_RR_pat <A2_subh_l16_sat_hl, int_hexagon_A2_subh_l16_sat_hl>;
    548 
    549 //Rd=add(Rt.[LH],Rs.[LH]):<<16
    550 def : T_RR_pat <A2_addh_h16_ll,     int_hexagon_A2_addh_h16_ll>;
    551 def : T_RR_pat <A2_addh_h16_lh,     int_hexagon_A2_addh_h16_lh>;
    552 def : T_RR_pat <A2_addh_h16_hl,     int_hexagon_A2_addh_h16_hl>;
    553 def : T_RR_pat <A2_addh_h16_hh,     int_hexagon_A2_addh_h16_hh>;
    554 
    555 //Rd=sub(Rt.[LH],Rs.[LH]):<<16
    556 def : T_RR_pat <A2_subh_h16_ll,     int_hexagon_A2_subh_h16_ll>;
    557 def : T_RR_pat <A2_subh_h16_lh,     int_hexagon_A2_subh_h16_lh>;
    558 def : T_RR_pat <A2_subh_h16_hl,     int_hexagon_A2_subh_h16_hl>;
    559 def : T_RR_pat <A2_subh_h16_hh,     int_hexagon_A2_subh_h16_hh>;
    560 
    561 //Rd=add(Rt.[LH],Rs.[LH]):sat:<<16
    562 def : T_RR_pat <A2_addh_h16_sat_ll, int_hexagon_A2_addh_h16_sat_ll>;
    563 def : T_RR_pat <A2_addh_h16_sat_lh, int_hexagon_A2_addh_h16_sat_lh>;
    564 def : T_RR_pat <A2_addh_h16_sat_hl, int_hexagon_A2_addh_h16_sat_hl>;
    565 def : T_RR_pat <A2_addh_h16_sat_hh, int_hexagon_A2_addh_h16_sat_hh>;
    566 
    567 //Rd=sub(Rt.[LH],Rs.[LH]):sat:<<16
    568 def : T_RR_pat <A2_subh_h16_sat_ll, int_hexagon_A2_subh_h16_sat_ll>;
    569 def : T_RR_pat <A2_subh_h16_sat_lh, int_hexagon_A2_subh_h16_sat_lh>;
    570 def : T_RR_pat <A2_subh_h16_sat_hl, int_hexagon_A2_subh_h16_sat_hl>;
    571 def : T_RR_pat <A2_subh_h16_sat_hh, int_hexagon_A2_subh_h16_sat_hh>;
    572 
    573 // ALU64 / ALU / min max
    574 def : T_RR_pat<A2_max,  int_hexagon_A2_max>;
    575 def : T_RR_pat<A2_min,  int_hexagon_A2_min>;
    576 def : T_RR_pat<A2_maxu, int_hexagon_A2_maxu>;
    577 def : T_RR_pat<A2_minu, int_hexagon_A2_minu>;
    578 
    579 // Shift and accumulate
    580 def : T_RRI_pat <S2_asr_i_r_nac,  int_hexagon_S2_asr_i_r_nac>;
    581 def : T_RRI_pat <S2_lsr_i_r_nac,  int_hexagon_S2_lsr_i_r_nac>;
    582 def : T_RRI_pat <S2_asl_i_r_nac,  int_hexagon_S2_asl_i_r_nac>;
    583 def : T_RRI_pat <S2_asr_i_r_acc,  int_hexagon_S2_asr_i_r_acc>;
    584 def : T_RRI_pat <S2_lsr_i_r_acc,  int_hexagon_S2_lsr_i_r_acc>;
    585 def : T_RRI_pat <S2_asl_i_r_acc,  int_hexagon_S2_asl_i_r_acc>;
    586 
    587 def : T_RRI_pat <S2_asr_i_r_and,  int_hexagon_S2_asr_i_r_and>;
    588 def : T_RRI_pat <S2_lsr_i_r_and,  int_hexagon_S2_lsr_i_r_and>;
    589 def : T_RRI_pat <S2_asl_i_r_and,  int_hexagon_S2_asl_i_r_and>;
    590 def : T_RRI_pat <S2_asr_i_r_or,   int_hexagon_S2_asr_i_r_or>;
    591 def : T_RRI_pat <S2_lsr_i_r_or,   int_hexagon_S2_lsr_i_r_or>;
    592 def : T_RRI_pat <S2_asl_i_r_or,   int_hexagon_S2_asl_i_r_or>;
    593 def : T_RRI_pat <S2_lsr_i_r_xacc, int_hexagon_S2_lsr_i_r_xacc>;
    594 def : T_RRI_pat <S2_asl_i_r_xacc, int_hexagon_S2_asl_i_r_xacc>;
    595 
    596 def : T_PPI_pat <S2_asr_i_p_nac,  int_hexagon_S2_asr_i_p_nac>;
    597 def : T_PPI_pat <S2_lsr_i_p_nac,  int_hexagon_S2_lsr_i_p_nac>;
    598 def : T_PPI_pat <S2_asl_i_p_nac,  int_hexagon_S2_asl_i_p_nac>;
    599 def : T_PPI_pat <S2_asr_i_p_acc,  int_hexagon_S2_asr_i_p_acc>;
    600 def : T_PPI_pat <S2_lsr_i_p_acc,  int_hexagon_S2_lsr_i_p_acc>;
    601 def : T_PPI_pat <S2_asl_i_p_acc,  int_hexagon_S2_asl_i_p_acc>;
    602 
    603 def : T_PPI_pat <S2_asr_i_p_and,  int_hexagon_S2_asr_i_p_and>;
    604 def : T_PPI_pat <S2_lsr_i_p_and,  int_hexagon_S2_lsr_i_p_and>;
    605 def : T_PPI_pat <S2_asl_i_p_and,  int_hexagon_S2_asl_i_p_and>;
    606 def : T_PPI_pat <S2_asr_i_p_or,   int_hexagon_S2_asr_i_p_or>;
    607 def : T_PPI_pat <S2_lsr_i_p_or,   int_hexagon_S2_lsr_i_p_or>;
    608 def : T_PPI_pat <S2_asl_i_p_or,   int_hexagon_S2_asl_i_p_or>;
    609 def : T_PPI_pat <S2_lsr_i_p_xacc, int_hexagon_S2_lsr_i_p_xacc>;
    610 def : T_PPI_pat <S2_asl_i_p_xacc, int_hexagon_S2_asl_i_p_xacc>;
    611 
    612 def : T_RRR_pat <S2_asr_r_r_nac,  int_hexagon_S2_asr_r_r_nac>;
    613 def : T_RRR_pat <S2_lsr_r_r_nac,  int_hexagon_S2_lsr_r_r_nac>;
    614 def : T_RRR_pat <S2_asl_r_r_nac,  int_hexagon_S2_asl_r_r_nac>;
    615 def : T_RRR_pat <S2_lsl_r_r_nac,  int_hexagon_S2_lsl_r_r_nac>;
    616 def : T_RRR_pat <S2_asr_r_r_acc,  int_hexagon_S2_asr_r_r_acc>;
    617 def : T_RRR_pat <S2_lsr_r_r_acc,  int_hexagon_S2_lsr_r_r_acc>;
    618 def : T_RRR_pat <S2_asl_r_r_acc,  int_hexagon_S2_asl_r_r_acc>;
    619 def : T_RRR_pat <S2_lsl_r_r_acc,  int_hexagon_S2_lsl_r_r_acc>;
    620 
    621 def : T_RRR_pat <S2_asr_r_r_and,  int_hexagon_S2_asr_r_r_and>;
    622 def : T_RRR_pat <S2_lsr_r_r_and,  int_hexagon_S2_lsr_r_r_and>;
    623 def : T_RRR_pat <S2_asl_r_r_and,  int_hexagon_S2_asl_r_r_and>;
    624 def : T_RRR_pat <S2_lsl_r_r_and,  int_hexagon_S2_lsl_r_r_and>;
    625 def : T_RRR_pat <S2_asr_r_r_or,   int_hexagon_S2_asr_r_r_or>;
    626 def : T_RRR_pat <S2_lsr_r_r_or,   int_hexagon_S2_lsr_r_r_or>;
    627 def : T_RRR_pat <S2_asl_r_r_or,   int_hexagon_S2_asl_r_r_or>;
    628 def : T_RRR_pat <S2_lsl_r_r_or,   int_hexagon_S2_lsl_r_r_or>;
    629 
    630 def : T_PPR_pat <S2_asr_r_p_nac,  int_hexagon_S2_asr_r_p_nac>;
    631 def : T_PPR_pat <S2_lsr_r_p_nac,  int_hexagon_S2_lsr_r_p_nac>;
    632 def : T_PPR_pat <S2_asl_r_p_nac,  int_hexagon_S2_asl_r_p_nac>;
    633 def : T_PPR_pat <S2_lsl_r_p_nac,  int_hexagon_S2_lsl_r_p_nac>;
    634 def : T_PPR_pat <S2_asr_r_p_acc,  int_hexagon_S2_asr_r_p_acc>;
    635 def : T_PPR_pat <S2_lsr_r_p_acc,  int_hexagon_S2_lsr_r_p_acc>;
    636 def : T_PPR_pat <S2_asl_r_p_acc,  int_hexagon_S2_asl_r_p_acc>;
    637 def : T_PPR_pat <S2_lsl_r_p_acc,  int_hexagon_S2_lsl_r_p_acc>;
    638 
    639 def : T_PPR_pat <S2_asr_r_p_and,  int_hexagon_S2_asr_r_p_and>;
    640 def : T_PPR_pat <S2_lsr_r_p_and,  int_hexagon_S2_lsr_r_p_and>;
    641 def : T_PPR_pat <S2_asl_r_p_and,  int_hexagon_S2_asl_r_p_and>;
    642 def : T_PPR_pat <S2_lsl_r_p_and,  int_hexagon_S2_lsl_r_p_and>;
    643 def : T_PPR_pat <S2_asr_r_p_or,   int_hexagon_S2_asr_r_p_or>;
    644 def : T_PPR_pat <S2_lsr_r_p_or,   int_hexagon_S2_lsr_r_p_or>;
    645 def : T_PPR_pat <S2_asl_r_p_or,   int_hexagon_S2_asl_r_p_or>;
    646 def : T_PPR_pat <S2_lsl_r_p_or,   int_hexagon_S2_lsl_r_p_or>;
    647 
    648 def : T_RRI_pat <S2_asr_i_r_nac,  int_hexagon_S2_asr_i_r_nac>;
    649 def : T_RRI_pat <S2_lsr_i_r_nac,  int_hexagon_S2_lsr_i_r_nac>;
    650 def : T_RRI_pat <S2_asl_i_r_nac,  int_hexagon_S2_asl_i_r_nac>;
    651 def : T_RRI_pat <S2_asr_i_r_acc,  int_hexagon_S2_asr_i_r_acc>;
    652 def : T_RRI_pat <S2_lsr_i_r_acc,  int_hexagon_S2_lsr_i_r_acc>;
    653 def : T_RRI_pat <S2_asl_i_r_acc,  int_hexagon_S2_asl_i_r_acc>;
    654 
    655 def : T_RRI_pat <S2_asr_i_r_and,  int_hexagon_S2_asr_i_r_and>;
    656 def : T_RRI_pat <S2_lsr_i_r_and,  int_hexagon_S2_lsr_i_r_and>;
    657 def : T_RRI_pat <S2_asl_i_r_and,  int_hexagon_S2_asl_i_r_and>;
    658 def : T_RRI_pat <S2_asr_i_r_or,   int_hexagon_S2_asr_i_r_or>;
    659 def : T_RRI_pat <S2_lsr_i_r_or,   int_hexagon_S2_lsr_i_r_or>;
    660 def : T_RRI_pat <S2_asl_i_r_or,   int_hexagon_S2_asl_i_r_or>;
    661 def : T_RRI_pat <S2_lsr_i_r_xacc, int_hexagon_S2_lsr_i_r_xacc>;
    662 def : T_RRI_pat <S2_asl_i_r_xacc, int_hexagon_S2_asl_i_r_xacc>;
    663 
    664 def : T_PPI_pat <S2_asr_i_p_nac,  int_hexagon_S2_asr_i_p_nac>;
    665 def : T_PPI_pat <S2_lsr_i_p_nac,  int_hexagon_S2_lsr_i_p_nac>;
    666 def : T_PPI_pat <S2_asl_i_p_nac,  int_hexagon_S2_asl_i_p_nac>;
    667 def : T_PPI_pat <S2_asr_i_p_acc,  int_hexagon_S2_asr_i_p_acc>;
    668 def : T_PPI_pat <S2_lsr_i_p_acc,  int_hexagon_S2_lsr_i_p_acc>;
    669 def : T_PPI_pat <S2_asl_i_p_acc,  int_hexagon_S2_asl_i_p_acc>;
    670 
    671 def : T_PPI_pat <S2_asr_i_p_and,  int_hexagon_S2_asr_i_p_and>;
    672 def : T_PPI_pat <S2_lsr_i_p_and,  int_hexagon_S2_lsr_i_p_and>;
    673 def : T_PPI_pat <S2_asl_i_p_and,  int_hexagon_S2_asl_i_p_and>;
    674 def : T_PPI_pat <S2_asr_i_p_or,   int_hexagon_S2_asr_i_p_or>;
    675 def : T_PPI_pat <S2_lsr_i_p_or,   int_hexagon_S2_lsr_i_p_or>;
    676 def : T_PPI_pat <S2_asl_i_p_or,   int_hexagon_S2_asl_i_p_or>;
    677 def : T_PPI_pat <S2_lsr_i_p_xacc, int_hexagon_S2_lsr_i_p_xacc>;
    678 def : T_PPI_pat <S2_asl_i_p_xacc, int_hexagon_S2_asl_i_p_xacc>;
    679 
    680 def : T_RRR_pat <S2_asr_r_r_nac,  int_hexagon_S2_asr_r_r_nac>;
    681 def : T_RRR_pat <S2_lsr_r_r_nac,  int_hexagon_S2_lsr_r_r_nac>;
    682 def : T_RRR_pat <S2_asl_r_r_nac,  int_hexagon_S2_asl_r_r_nac>;
    683 def : T_RRR_pat <S2_lsl_r_r_nac,  int_hexagon_S2_lsl_r_r_nac>;
    684 def : T_RRR_pat <S2_asr_r_r_acc,  int_hexagon_S2_asr_r_r_acc>;
    685 def : T_RRR_pat <S2_lsr_r_r_acc,  int_hexagon_S2_lsr_r_r_acc>;
    686 def : T_RRR_pat <S2_asl_r_r_acc,  int_hexagon_S2_asl_r_r_acc>;
    687 def : T_RRR_pat <S2_lsl_r_r_acc,  int_hexagon_S2_lsl_r_r_acc>;
    688 
    689 def : T_RRR_pat <S2_asr_r_r_and,  int_hexagon_S2_asr_r_r_and>;
    690 def : T_RRR_pat <S2_lsr_r_r_and,  int_hexagon_S2_lsr_r_r_and>;
    691 def : T_RRR_pat <S2_asl_r_r_and,  int_hexagon_S2_asl_r_r_and>;
    692 def : T_RRR_pat <S2_lsl_r_r_and,  int_hexagon_S2_lsl_r_r_and>;
    693 def : T_RRR_pat <S2_asr_r_r_or,   int_hexagon_S2_asr_r_r_or>;
    694 def : T_RRR_pat <S2_lsr_r_r_or,   int_hexagon_S2_lsr_r_r_or>;
    695 def : T_RRR_pat <S2_asl_r_r_or,   int_hexagon_S2_asl_r_r_or>;
    696 def : T_RRR_pat <S2_lsl_r_r_or,   int_hexagon_S2_lsl_r_r_or>;
    697 
    698 def : T_PPR_pat <S2_asr_r_p_nac,  int_hexagon_S2_asr_r_p_nac>;
    699 def : T_PPR_pat <S2_lsr_r_p_nac,  int_hexagon_S2_lsr_r_p_nac>;
    700 def : T_PPR_pat <S2_asl_r_p_nac,  int_hexagon_S2_asl_r_p_nac>;
    701 def : T_PPR_pat <S2_lsl_r_p_nac,  int_hexagon_S2_lsl_r_p_nac>;
    702 def : T_PPR_pat <S2_asr_r_p_acc,  int_hexagon_S2_asr_r_p_acc>;
    703 def : T_PPR_pat <S2_lsr_r_p_acc,  int_hexagon_S2_lsr_r_p_acc>;
    704 def : T_PPR_pat <S2_asl_r_p_acc,  int_hexagon_S2_asl_r_p_acc>;
    705 def : T_PPR_pat <S2_lsl_r_p_acc,  int_hexagon_S2_lsl_r_p_acc>;
    706 
    707 def : T_PPR_pat <S2_asr_r_p_and,  int_hexagon_S2_asr_r_p_and>;
    708 def : T_PPR_pat <S2_lsr_r_p_and,  int_hexagon_S2_lsr_r_p_and>;
    709 def : T_PPR_pat <S2_asl_r_p_and,  int_hexagon_S2_asl_r_p_and>;
    710 def : T_PPR_pat <S2_lsl_r_p_and,  int_hexagon_S2_lsl_r_p_and>;
    711 def : T_PPR_pat <S2_asr_r_p_or,   int_hexagon_S2_asr_r_p_or>;
    712 def : T_PPR_pat <S2_lsr_r_p_or,   int_hexagon_S2_lsr_r_p_or>;
    713 def : T_PPR_pat <S2_asl_r_p_or,   int_hexagon_S2_asl_r_p_or>;
    714 def : T_PPR_pat <S2_lsl_r_p_or,   int_hexagon_S2_lsl_r_p_or>;
    715 
    716 //*******************************************************************
    717 //           ALU32/ALU
    718 //*******************************************************************
    719 def : T_RR_pat<A2_add,      int_hexagon_A2_add>;
    720 def : T_RI_pat<A2_addi,     int_hexagon_A2_addi>;
    721 def : T_RR_pat<A2_sub,      int_hexagon_A2_sub>;
    722 def : T_IR_pat<A2_subri,    int_hexagon_A2_subri>;
    723 def : T_RR_pat<A2_and,      int_hexagon_A2_and>;
    724 def : T_RI_pat<A2_andir,    int_hexagon_A2_andir>;
    725 def : T_RR_pat<A2_or,       int_hexagon_A2_or>;
    726 def : T_RI_pat<A2_orir,     int_hexagon_A2_orir>;
    727 def : T_RR_pat<A2_xor,      int_hexagon_A2_xor>;
    728 def : T_RR_pat<A2_combinew, int_hexagon_A2_combinew>;
    729 
    730 // Assembler mapped from Rd32=not(Rs32) to Rd32=sub(#-1,Rs32)
    731 def : Pat <(int_hexagon_A2_not I32:$Rs),
    732            (A2_subri -1, I32:$Rs)>;
    733 
    734 // Assembler mapped from Rd32=neg(Rs32) to Rd32=sub(#0,Rs32)
    735 def : Pat <(int_hexagon_A2_neg I32:$Rs),
    736            (A2_subri 0, I32:$Rs)>;
    737 
    738 // Transfer immediate
    739 def  : Pat <(int_hexagon_A2_tfril I32:$Rs, u16_0ImmPred:$Is),
    740             (A2_tfril I32:$Rs, u16_0ImmPred:$Is)>;
    741 def  : Pat <(int_hexagon_A2_tfrih I32:$Rs, u16_0ImmPred:$Is),
    742             (A2_tfrih I32:$Rs, u16_0ImmPred:$Is)>;
    743 
    744 //  Transfer Register/immediate.
    745 def : T_R_pat <A2_tfr, int_hexagon_A2_tfr>;
    746 def : T_I_pat <A2_tfrsi, int_hexagon_A2_tfrsi>;
    747 
    748 def ImmExt64: SDNodeXForm<imm, [{
    749   int64_t V = N->getSExtValue();
    750   return CurDAG->getTargetConstant(V, SDLoc(N), MVT::i64);
    751 }]>;
    752 
    753 // A2_tfrpi has an operand of type i64. This is necessary, since it is
    754 // generated from "(set I64:$Rd, imm)". That pattern would not appear
    755 // in the DAG, if the immediate was not a 64-bit value.
    756 // The builtin for A2_tfrpi, on the other hand, takes a 32-bit value,
    757 // which makes it impossible to simply replace it with the instruction.
    758 // To connect the builtin with the instruction, the builtin's operand
    759 // needs to be extended to the right type.
    760 
    761 def : Pat<(int_hexagon_A2_tfrpi imm:$Is),
    762           (A2_tfrpi (ImmExt64 $Is))>;
    763 
    764 // Assembler mapped from Rdd32=Rss32 to Rdd32=combine(Rss.H32,Rss.L32)
    765 def : Pat<(int_hexagon_A2_tfrp I64:$src),
    766           (A2_combinew (HiReg I64:$src), (LoReg I64:$src))>;
    767 
    768 //*******************************************************************
    769 //           ALU32/PERM
    770 //*******************************************************************
    771 // Combine
    772 def: T_RR_pat<A2_combine_hh, int_hexagon_A2_combine_hh>;
    773 def: T_RR_pat<A2_combine_hl, int_hexagon_A2_combine_hl>;
    774 def: T_RR_pat<A2_combine_lh, int_hexagon_A2_combine_lh>;
    775 def: T_RR_pat<A2_combine_ll, int_hexagon_A2_combine_ll>;
    776 
    777 def: T_II_pat<A2_combineii, int_hexagon_A2_combineii, s32ImmPred, s8ImmPred>;
    778 
    779 // Mux
    780 def : T_QRR_pat<C2_mux,   int_hexagon_C2_mux>;
    781 def : T_QRI_pat<C2_muxir, int_hexagon_C2_muxir, s32ImmPred>;
    782 def : T_QIR_pat<C2_muxri, int_hexagon_C2_muxri, s32ImmPred>;
    783 def : T_QII_pat<C2_muxii, int_hexagon_C2_muxii, s32ImmPred, s8ImmPred>;
    784 
    785 // Shift halfword
    786 def : T_R_pat<A2_aslh, int_hexagon_A2_aslh>;
    787 def : T_R_pat<A2_asrh, int_hexagon_A2_asrh>;
    788 def : T_R_pat<A2_asrh, int_hexagon_SI_to_SXTHI_asrh>;
    789 
    790 // Sign/zero extend
    791 def : T_R_pat<A2_sxth, int_hexagon_A2_sxth>;
    792 def : T_R_pat<A2_sxtb, int_hexagon_A2_sxtb>;
    793 def : T_R_pat<A2_zxth, int_hexagon_A2_zxth>;
    794 def : T_R_pat<A2_zxtb, int_hexagon_A2_zxtb>;
    795 
    796 //*******************************************************************
    797 //           ALU32/PRED
    798 //*******************************************************************
    799 // Compare
    800 def : T_Q_RR_pat<C2_cmpeq,  int_hexagon_C2_cmpeq>;
    801 def : T_Q_RR_pat<C2_cmpgt,  int_hexagon_C2_cmpgt>;
    802 def : T_Q_RR_pat<C2_cmpgtu, int_hexagon_C2_cmpgtu>;
    803 
    804 def : T_Q_RI_pat<C2_cmpeqi,  int_hexagon_C2_cmpeqi, s32ImmPred>;
    805 def : T_Q_RI_pat<C2_cmpgti,  int_hexagon_C2_cmpgti, s32ImmPred>;
    806 def : T_Q_RI_pat<C2_cmpgtui, int_hexagon_C2_cmpgtui, u32ImmPred>;
    807 
    808 def : Pat <(int_hexagon_C2_cmpgei I32:$src1, s32ImmPred:$src2),
    809            (C2_tfrpr (C2_cmpgti I32:$src1,
    810                                 (DEC_CONST_SIGNED s32ImmPred:$src2)))>;
    811 
    812 def : Pat <(int_hexagon_C2_cmpgeui I32:$src1, u32ImmPred:$src2),
    813            (C2_tfrpr (C2_cmpgtui I32:$src1,
    814                                  (DEC_CONST_UNSIGNED u32ImmPred:$src2)))>;
    815 
    816 def : Pat <(int_hexagon_C2_cmpgeui I32:$src, 0),
    817            (C2_tfrpr (C2_cmpeq I32:$src, I32:$src))>;
    818 def : Pat <(int_hexagon_C2_cmplt I32:$src1, I32:$src2),
    819            (C2_tfrpr (C2_cmpgt I32:$src2, I32:$src1))>;
    820 def : Pat <(int_hexagon_C2_cmpltu I32:$src1, I32:$src2),
    821            (C2_tfrpr (C2_cmpgtu I32:$src2, I32:$src1))>;
    822 
    823 //*******************************************************************
    824 //           ALU32/VH
    825 //*******************************************************************
    826 // Vector add, subtract, average halfwords
    827 def: T_RR_pat<A2_svaddh,   int_hexagon_A2_svaddh>;
    828 def: T_RR_pat<A2_svaddhs,  int_hexagon_A2_svaddhs>;
    829 def: T_RR_pat<A2_svadduhs, int_hexagon_A2_svadduhs>;
    830 
    831 def: T_RR_pat<A2_svsubh,   int_hexagon_A2_svsubh>;
    832 def: T_RR_pat<A2_svsubhs,  int_hexagon_A2_svsubhs>;
    833 def: T_RR_pat<A2_svsubuhs, int_hexagon_A2_svsubuhs>;
    834 
    835 def: T_RR_pat<A2_svavgh,   int_hexagon_A2_svavgh>;
    836 def: T_RR_pat<A2_svavghs,  int_hexagon_A2_svavghs>;
    837 def: T_RR_pat<A2_svnavgh,  int_hexagon_A2_svnavgh>;
    838 
    839 //*******************************************************************
    840 //           ALU64/ALU
    841 //*******************************************************************
    842 def: T_RR_pat<A2_addsat,     int_hexagon_A2_addsat>;
    843 def: T_RR_pat<A2_subsat,     int_hexagon_A2_subsat>;
    844 def: T_PP_pat<A2_addp,       int_hexagon_A2_addp>;
    845 def: T_PP_pat<A2_subp,       int_hexagon_A2_subp>;
    846 
    847 def: T_PP_pat<A2_andp,       int_hexagon_A2_andp>;
    848 def: T_PP_pat<A2_orp,        int_hexagon_A2_orp>;
    849 def: T_PP_pat<A2_xorp,       int_hexagon_A2_xorp>;
    850 
    851 def: T_Q_PP_pat<C2_cmpeqp,   int_hexagon_C2_cmpeqp>;
    852 def: T_Q_PP_pat<C2_cmpgtp,   int_hexagon_C2_cmpgtp>;
    853 def: T_Q_PP_pat<C2_cmpgtup,  int_hexagon_C2_cmpgtup>;
    854 
    855 def: T_PP_pat<S2_parityp,    int_hexagon_S2_parityp>;
    856 def: T_RR_pat<S2_packhl,     int_hexagon_S2_packhl>;
    857 
    858 //*******************************************************************
    859 //           ALU64/VB
    860 //*******************************************************************
    861 // ALU64 - Vector add
    862 def : T_PP_pat <A2_vaddub,   int_hexagon_A2_vaddub>;
    863 def : T_PP_pat <A2_vaddubs,  int_hexagon_A2_vaddubs>;
    864 def : T_PP_pat <A2_vaddh,    int_hexagon_A2_vaddh>;
    865 def : T_PP_pat <A2_vaddhs,   int_hexagon_A2_vaddhs>;
    866 def : T_PP_pat <A2_vadduhs,  int_hexagon_A2_vadduhs>;
    867 def : T_PP_pat <A2_vaddw,    int_hexagon_A2_vaddw>;
    868 def : T_PP_pat <A2_vaddws,   int_hexagon_A2_vaddws>;
    869 
    870 // ALU64 - Vector average
    871 def : T_PP_pat <A2_vavgub,   int_hexagon_A2_vavgub>;
    872 def : T_PP_pat <A2_vavgubr,  int_hexagon_A2_vavgubr>;
    873 def : T_PP_pat <A2_vavgh,    int_hexagon_A2_vavgh>;
    874 def : T_PP_pat <A2_vavghr,   int_hexagon_A2_vavghr>;
    875 def : T_PP_pat <A2_vavghcr,  int_hexagon_A2_vavghcr>;
    876 def : T_PP_pat <A2_vavguh,   int_hexagon_A2_vavguh>;
    877 def : T_PP_pat <A2_vavguhr,  int_hexagon_A2_vavguhr>;
    878 
    879 def : T_PP_pat <A2_vavgw,    int_hexagon_A2_vavgw>;
    880 def : T_PP_pat <A2_vavgwr,   int_hexagon_A2_vavgwr>;
    881 def : T_PP_pat <A2_vavgwcr,  int_hexagon_A2_vavgwcr>;
    882 def : T_PP_pat <A2_vavguw,   int_hexagon_A2_vavguw>;
    883 def : T_PP_pat <A2_vavguwr,  int_hexagon_A2_vavguwr>;
    884 
    885 // ALU64 - Vector negative average
    886 def : T_PP_pat <A2_vnavgh,   int_hexagon_A2_vnavgh>;
    887 def : T_PP_pat <A2_vnavghr,  int_hexagon_A2_vnavghr>;
    888 def : T_PP_pat <A2_vnavghcr, int_hexagon_A2_vnavghcr>;
    889 def : T_PP_pat <A2_vnavgw,   int_hexagon_A2_vnavgw>;
    890 def : T_PP_pat <A2_vnavgwr,  int_hexagon_A2_vnavgwr>;
    891 def : T_PP_pat <A2_vnavgwcr, int_hexagon_A2_vnavgwcr>;
    892 
    893 // ALU64 - Vector max
    894 def : T_PP_pat <A2_vmaxh,    int_hexagon_A2_vmaxh>;
    895 def : T_PP_pat <A2_vmaxw,    int_hexagon_A2_vmaxw>;
    896 def : T_PP_pat <A2_vmaxub,   int_hexagon_A2_vmaxub>;
    897 def : T_PP_pat <A2_vmaxuh,   int_hexagon_A2_vmaxuh>;
    898 def : T_PP_pat <A2_vmaxuw,   int_hexagon_A2_vmaxuw>;
    899 
    900 // ALU64 - Vector min
    901 def : T_PP_pat <A2_vminh,    int_hexagon_A2_vminh>;
    902 def : T_PP_pat <A2_vminw,    int_hexagon_A2_vminw>;
    903 def : T_PP_pat <A2_vminub,   int_hexagon_A2_vminub>;
    904 def : T_PP_pat <A2_vminuh,   int_hexagon_A2_vminuh>;
    905 def : T_PP_pat <A2_vminuw,   int_hexagon_A2_vminuw>;
    906 
    907 // ALU64 - Vector sub
    908 def : T_PP_pat <A2_vsubub,   int_hexagon_A2_vsubub>;
    909 def : T_PP_pat <A2_vsububs,  int_hexagon_A2_vsububs>;
    910 def : T_PP_pat <A2_vsubh,    int_hexagon_A2_vsubh>;
    911 def : T_PP_pat <A2_vsubhs,   int_hexagon_A2_vsubhs>;
    912 def : T_PP_pat <A2_vsubuhs,  int_hexagon_A2_vsubuhs>;
    913 def : T_PP_pat <A2_vsubw,    int_hexagon_A2_vsubw>;
    914 def : T_PP_pat <A2_vsubws,   int_hexagon_A2_vsubws>;
    915 
    916 // ALU64 - Vector compare bytes
    917 def : T_Q_PP_pat <A2_vcmpbeq,  int_hexagon_A2_vcmpbeq>;
    918 def : T_Q_PP_pat <A4_vcmpbgt,  int_hexagon_A4_vcmpbgt>;
    919 def : T_Q_PP_pat <A2_vcmpbgtu, int_hexagon_A2_vcmpbgtu>;
    920 
    921 // ALU64 - Vector compare halfwords
    922 def : T_Q_PP_pat <A2_vcmpheq,  int_hexagon_A2_vcmpheq>;
    923 def : T_Q_PP_pat <A2_vcmphgt,  int_hexagon_A2_vcmphgt>;
    924 def : T_Q_PP_pat <A2_vcmphgtu, int_hexagon_A2_vcmphgtu>;
    925 
    926 // ALU64 - Vector compare words
    927 def : T_Q_PP_pat <A2_vcmpweq,  int_hexagon_A2_vcmpweq>;
    928 def : T_Q_PP_pat <A2_vcmpwgt,  int_hexagon_A2_vcmpwgt>;
    929 def : T_Q_PP_pat <A2_vcmpwgtu, int_hexagon_A2_vcmpwgtu>;
    930 
    931 // ALU64 / VB / Vector mux.
    932 def : T_QPP_pat <C2_vmux,      int_hexagon_C2_vmux>;
    933 
    934 // MPY - Multiply and use full result
    935 // Rdd = mpy[u](Rs, Rt)
    936 def : T_RR_pat <M2_dpmpyss_s0, int_hexagon_M2_dpmpyss_s0>;
    937 def : T_RR_pat <M2_dpmpyuu_s0, int_hexagon_M2_dpmpyuu_s0>;
    938 
    939 // Complex multiply real or imaginary
    940 def : T_RR_pat <M2_cmpyi_s0,   int_hexagon_M2_cmpyi_s0>;
    941 def : T_RR_pat <M2_cmpyr_s0,   int_hexagon_M2_cmpyr_s0>;
    942 
    943 // Complex multiply
    944 def : T_RR_pat <M2_cmpys_s0,   int_hexagon_M2_cmpys_s0>;
    945 def : T_RR_pat <M2_cmpysc_s0,  int_hexagon_M2_cmpysc_s0>;
    946 def : T_RR_pat <M2_cmpys_s1,   int_hexagon_M2_cmpys_s1>;
    947 def : T_RR_pat <M2_cmpysc_s1,  int_hexagon_M2_cmpysc_s1>;
    948 
    949 // Vector multiply halfwords
    950 // Rdd=vmpyh(Rs,Rt)[:<<1]:sat
    951 def : T_RR_pat <M2_vmpy2s_s0,  int_hexagon_M2_vmpy2s_s0>;
    952 def : T_RR_pat <M2_vmpy2s_s1,  int_hexagon_M2_vmpy2s_s1>;
    953 
    954 // Rxx[+-]= mpy[u](Rs,Rt)
    955 def : T_PRR_pat <M2_dpmpyss_acc_s0, int_hexagon_M2_dpmpyss_acc_s0>;
    956 def : T_PRR_pat <M2_dpmpyss_nac_s0, int_hexagon_M2_dpmpyss_nac_s0>;
    957 def : T_PRR_pat <M2_dpmpyuu_acc_s0, int_hexagon_M2_dpmpyuu_acc_s0>;
    958 def : T_PRR_pat <M2_dpmpyuu_nac_s0, int_hexagon_M2_dpmpyuu_nac_s0>;
    959 
    960 // Rxx[-+]=cmpy(Rs,Rt)[:<<1]:sat
    961 def : T_PRR_pat <M2_cmacs_s0, int_hexagon_M2_cmacs_s0>;
    962 def : T_PRR_pat <M2_cnacs_s0, int_hexagon_M2_cnacs_s0>;
    963 def : T_PRR_pat <M2_cmacs_s1, int_hexagon_M2_cmacs_s1>;
    964 def : T_PRR_pat <M2_cnacs_s1, int_hexagon_M2_cnacs_s1>;
    965 
    966 // Rxx[-+]=cmpy(Rs,Rt*)[:<<1]:sat
    967 def : T_PRR_pat <M2_cmacsc_s0, int_hexagon_M2_cmacsc_s0>;
    968 def : T_PRR_pat <M2_cnacsc_s0, int_hexagon_M2_cnacsc_s0>;
    969 def : T_PRR_pat <M2_cmacsc_s1, int_hexagon_M2_cmacsc_s1>;
    970 def : T_PRR_pat <M2_cnacsc_s1, int_hexagon_M2_cnacsc_s1>;
    971 
    972 // Rxx+=cmpy[ir](Rs,Rt)
    973 def : T_PRR_pat <M2_cmaci_s0, int_hexagon_M2_cmaci_s0>;
    974 def : T_PRR_pat <M2_cmacr_s0, int_hexagon_M2_cmacr_s0>;
    975 
    976 // Rxx+=vmpyh(Rs,Rt)[:<<1][:sat]
    977 def : T_PRR_pat <M2_vmac2, int_hexagon_M2_vmac2>;
    978 def : T_PRR_pat <M2_vmac2s_s0, int_hexagon_M2_vmac2s_s0>;
    979 def : T_PRR_pat <M2_vmac2s_s1, int_hexagon_M2_vmac2s_s1>;
    980 
    981 //*******************************************************************
    982 //           CR
    983 //*******************************************************************
    984 def: T_Q_Q_pat<C2_not,       int_hexagon_C2_not>;
    985 def: T_Q_Q_pat<C2_all8,      int_hexagon_C2_all8>;
    986 def: T_Q_Q_pat<C2_any8,      int_hexagon_C2_any8>;
    987 def: T_Q_Q_pat<C2_pxfer_map, int_hexagon_C2_pxfer_map>;
    988 
    989 def: T_Q_QQ_pat<C2_and,      int_hexagon_C2_and>;
    990 def: T_Q_QQ_pat<C2_andn,     int_hexagon_C2_andn>;
    991 def: T_Q_QQ_pat<C2_or,       int_hexagon_C2_or>;
    992 def: T_Q_QQ_pat<C2_orn,      int_hexagon_C2_orn>;
    993 def: T_Q_QQ_pat<C2_xor,      int_hexagon_C2_xor>;
    994 
    995 // Multiply 32x32 and use lower result
    996 def : T_RRI_pat <M2_macsip, int_hexagon_M2_macsip>;
    997 def : T_RRI_pat <M2_macsin, int_hexagon_M2_macsin>;
    998 def : T_RRR_pat <M2_maci,   int_hexagon_M2_maci>;
    999 
   1000 // Subtract and accumulate
   1001 def : T_RRR_pat <M2_subacc, int_hexagon_M2_subacc>;
   1002 
   1003 // Add and accumulate
   1004 def : T_RRR_pat <M2_acci,   int_hexagon_M2_acci>;
   1005 def : T_RRR_pat <M2_nacci,  int_hexagon_M2_nacci>;
   1006 def : T_RRI_pat <M2_accii,  int_hexagon_M2_accii>;
   1007 def : T_RRI_pat <M2_naccii, int_hexagon_M2_naccii>;
   1008 
   1009 // XOR and XOR with destination
   1010 def : T_RRR_pat <M2_xor_xacc, int_hexagon_M2_xor_xacc>;
   1011 
   1012 // Vector dual multiply with round and pack
   1013 def : T_PP_pat <M2_vdmpyrs_s0, int_hexagon_M2_vdmpyrs_s0>;
   1014 def : T_PP_pat <M2_vdmpyrs_s1, int_hexagon_M2_vdmpyrs_s1>;
   1015 
   1016 // Vector multiply halfwords with round and pack
   1017 def : T_RR_pat <M2_vmpy2s_s0pack, int_hexagon_M2_vmpy2s_s0pack>;
   1018 def : T_RR_pat <M2_vmpy2s_s1pack, int_hexagon_M2_vmpy2s_s1pack>;
   1019 
   1020 // Multiply and use lower result
   1021 def : T_RR_pat <M2_mpyi, int_hexagon_M2_mpyi>;
   1022 def : T_RI_pat <M2_mpysmi, int_hexagon_M2_mpysmi>;
   1023 
   1024 // Assembler mapped from Rd32=mpyui(Rs32,Rt32) to Rd32=mpyi(Rs32,Rt32)
   1025 def : T_RR_pat <M2_mpyi, int_hexagon_M2_mpyui>;
   1026 
   1027 // Multiply and use upper result
   1028 def : T_RR_pat <M2_mpy_up, int_hexagon_M2_mpy_up>;
   1029 def : T_RR_pat <M2_mpyu_up, int_hexagon_M2_mpyu_up>;
   1030 def : T_RR_pat <M2_hmmpyh_rs1, int_hexagon_M2_hmmpyh_rs1>;
   1031 def : T_RR_pat <M2_hmmpyl_rs1, int_hexagon_M2_hmmpyl_rs1>;
   1032 def : T_RR_pat <M2_dpmpyss_rnd_s0, int_hexagon_M2_dpmpyss_rnd_s0>;
   1033 
   1034 // Complex multiply with round and pack
   1035 // Rxx32+=cmpy(Rs32,[*]Rt32:<<1]:rnd:sat
   1036 def : T_RR_pat <M2_cmpyrs_s0, int_hexagon_M2_cmpyrs_s0>;
   1037 def : T_RR_pat <M2_cmpyrs_s1, int_hexagon_M2_cmpyrs_s1>;
   1038 def : T_RR_pat <M2_cmpyrsc_s0, int_hexagon_M2_cmpyrsc_s0>;
   1039 def : T_RR_pat <M2_cmpyrsc_s1, int_hexagon_M2_cmpyrsc_s1>;
   1040 
   1041 //*******************************************************************
   1042 //           STYPE/ALU
   1043 //*******************************************************************
   1044 def : T_P_pat <A2_absp, int_hexagon_A2_absp>;
   1045 def : T_P_pat <A2_negp, int_hexagon_A2_negp>;
   1046 def : T_P_pat <A2_notp, int_hexagon_A2_notp>;
   1047 
   1048 //*******************************************************************
   1049 //           STYPE/BIT
   1050 //*******************************************************************
   1051 
   1052 // Count leading/trailing
   1053 def: T_R_pat<S2_cl0,     int_hexagon_S2_cl0>;
   1054 def: T_P_pat<S2_cl0p,    int_hexagon_S2_cl0p>;
   1055 def: T_R_pat<S2_cl1,     int_hexagon_S2_cl1>;
   1056 def: T_P_pat<S2_cl1p,    int_hexagon_S2_cl1p>;
   1057 def: T_R_pat<S2_clb,     int_hexagon_S2_clb>;
   1058 def: T_P_pat<S2_clbp,    int_hexagon_S2_clbp>;
   1059 def: T_R_pat<S2_clbnorm, int_hexagon_S2_clbnorm>;
   1060 def: T_R_pat<S2_ct0,     int_hexagon_S2_ct0>;
   1061 def: T_R_pat<S2_ct1,     int_hexagon_S2_ct1>;
   1062 
   1063 // Compare bit mask
   1064 def: T_RR_pat<C2_bitsclr,  int_hexagon_C2_bitsclr>;
   1065 def: T_RI_pat<C2_bitsclri, int_hexagon_C2_bitsclri>;
   1066 def: T_RR_pat<C2_bitsset,  int_hexagon_C2_bitsset>;
   1067 
   1068 // Vector shuffle
   1069 def : T_PP_pat <S2_shuffeb, int_hexagon_S2_shuffeb>;
   1070 def : T_PP_pat <S2_shuffob, int_hexagon_S2_shuffob>;
   1071 def : T_PP_pat <S2_shuffeh, int_hexagon_S2_shuffeh>;
   1072 def : T_PP_pat <S2_shuffoh, int_hexagon_S2_shuffoh>;
   1073 
   1074 // Vector truncate
   1075 def : T_PP_pat <S2_vtrunewh, int_hexagon_S2_vtrunewh>;
   1076 def : T_PP_pat <S2_vtrunowh, int_hexagon_S2_vtrunowh>;
   1077 
   1078 // Linear feedback-shift Iteration.
   1079 def : T_PP_pat <S2_lfsp, int_hexagon_S2_lfsp>;
   1080 
   1081 // Vector align
   1082 // Need custom lowering
   1083 def : T_PPQ_pat <S2_valignrb, int_hexagon_S2_valignrb>;
   1084 def : T_PPI_pat <S2_valignib, int_hexagon_S2_valignib>;
   1085 
   1086 // Vector splice
   1087 def : T_PPQ_pat <S2_vsplicerb, int_hexagon_S2_vsplicerb>;
   1088 def : T_PPI_pat <S2_vspliceib, int_hexagon_S2_vspliceib>;
   1089 
   1090 // Shift by immediate and add
   1091 def : T_RRI_pat<S2_addasl_rrri, int_hexagon_S2_addasl_rrri>;
   1092 
   1093 // Extract bitfield
   1094 def : T_PII_pat<S2_extractup,    int_hexagon_S2_extractup>;
   1095 def : T_RII_pat<S2_extractu,     int_hexagon_S2_extractu>;
   1096 def : T_RP_pat <S2_extractu_rp,  int_hexagon_S2_extractu_rp>;
   1097 def : T_PP_pat <S2_extractup_rp, int_hexagon_S2_extractup_rp>;
   1098 
   1099 // Insert bitfield
   1100 def : Pat <(int_hexagon_S2_insert_rp I32:$src1, I32:$src2, I64:$src3),
   1101            (S2_insert_rp I32:$src1, I32:$src2, I64:$src3)>;
   1102 
   1103 def : Pat<(i64 (int_hexagon_S2_insertp_rp I64:$src1, I64:$src2, I64:$src3)),
   1104           (i64 (S2_insertp_rp I64:$src1, I64:$src2, I64:$src3))>;
   1105 
   1106 def : Pat<(int_hexagon_S2_insert I32:$src1, I32:$src2,
   1107                                  u5ImmPred:$src3, u5ImmPred:$src4),
   1108           (S2_insert I32:$src1, I32:$src2,
   1109                      u5ImmPred:$src3, u5ImmPred:$src4)>;
   1110 
   1111 def : Pat<(i64 (int_hexagon_S2_insertp I64:$src1, I64:$src2,
   1112                                        u6ImmPred:$src3, u6ImmPred:$src4)),
   1113           (i64 (S2_insertp I64:$src1, I64:$src2,
   1114                            u6ImmPred:$src3, u6ImmPred:$src4))>;
   1115 
   1116 // Innterleave/deinterleave
   1117 def : T_P_pat <S2_interleave, int_hexagon_S2_interleave>;
   1118 def : T_P_pat <S2_deinterleave, int_hexagon_S2_deinterleave>;
   1119 
   1120 // Set/Clear/Toggle Bit
   1121 def: T_RI_pat<S2_setbit_i,    int_hexagon_S2_setbit_i>;
   1122 def: T_RI_pat<S2_clrbit_i,    int_hexagon_S2_clrbit_i>;
   1123 def: T_RI_pat<S2_togglebit_i, int_hexagon_S2_togglebit_i>;
   1124 
   1125 def: T_RR_pat<S2_setbit_r,    int_hexagon_S2_setbit_r>;
   1126 def: T_RR_pat<S2_clrbit_r,    int_hexagon_S2_clrbit_r>;
   1127 def: T_RR_pat<S2_togglebit_r, int_hexagon_S2_togglebit_r>;
   1128 
   1129 // Test Bit
   1130 def: T_Q_RI_pat<S2_tstbit_i,  int_hexagon_S2_tstbit_i>;
   1131 def: T_Q_RR_pat<S2_tstbit_r,  int_hexagon_S2_tstbit_r>;
   1132 
   1133 //*******************************************************************
   1134 //           STYPE/COMPLEX
   1135 //*******************************************************************
   1136 // Vector Complex conjugate
   1137 def : T_P_pat <A2_vconj, int_hexagon_A2_vconj>;
   1138 
   1139 // Vector Complex rotate
   1140 def : T_PR_pat <S2_vcrotate, int_hexagon_S2_vcrotate>;
   1141 
   1142 //*******************************************************************
   1143 //           STYPE/PERM
   1144 //*******************************************************************
   1145 
   1146 // Vector saturate without pack
   1147 def : T_P_pat <S2_vsathb_nopack, int_hexagon_S2_vsathb_nopack>;
   1148 def : T_P_pat <S2_vsathub_nopack, int_hexagon_S2_vsathub_nopack>;
   1149 def : T_P_pat <S2_vsatwh_nopack, int_hexagon_S2_vsatwh_nopack>;
   1150 def : T_P_pat <S2_vsatwuh_nopack, int_hexagon_S2_vsatwuh_nopack>;
   1151 
   1152 //*******************************************************************
   1153 //           STYPE/PRED
   1154 //*******************************************************************
   1155 
   1156 // Predicate transfer
   1157 def: Pat<(i32 (int_hexagon_C2_tfrpr I32:$Rs)),
   1158          (i32 (C2_tfrpr (C2_tfrrp I32:$Rs)))>;
   1159 def: Pat<(i32 (int_hexagon_C2_tfrrp I32:$Rs)),
   1160          (i32 (C2_tfrpr (C2_tfrrp I32:$Rs)))>;
   1161 
   1162 // Mask generate from predicate
   1163 def: Pat<(i64 (int_hexagon_C2_mask I32:$Rs)),
   1164          (i64 (C2_mask (C2_tfrrp I32:$Rs)))>;
   1165 
   1166 // Viterbi pack even and odd predicate bits
   1167 def: T_QQ_pat<C2_vitpack, int_hexagon_C2_vitpack>;
   1168 
   1169 //*******************************************************************
   1170 //           STYPE/SHIFT
   1171 //*******************************************************************
   1172 
   1173 def : T_PI_pat <S2_asr_i_p, int_hexagon_S2_asr_i_p>;
   1174 def : T_PI_pat <S2_lsr_i_p, int_hexagon_S2_lsr_i_p>;
   1175 def : T_PI_pat <S2_asl_i_p, int_hexagon_S2_asl_i_p>;
   1176 
   1177 def : T_PR_pat <S2_asr_r_p, int_hexagon_S2_asr_r_p>;
   1178 def : T_PR_pat <S2_lsr_r_p, int_hexagon_S2_lsr_r_p>;
   1179 def : T_PR_pat <S2_asl_r_p, int_hexagon_S2_asl_r_p>;
   1180 def : T_PR_pat <S2_lsl_r_p, int_hexagon_S2_lsl_r_p>;
   1181 
   1182 def : T_RR_pat <S2_asr_r_r, int_hexagon_S2_asr_r_r>;
   1183 def : T_RR_pat <S2_lsr_r_r, int_hexagon_S2_lsr_r_r>;
   1184 def : T_RR_pat <S2_asl_r_r, int_hexagon_S2_asl_r_r>;
   1185 def : T_RR_pat <S2_lsl_r_r, int_hexagon_S2_lsl_r_r>;
   1186 
   1187 def : T_RR_pat <S2_asr_r_r_sat, int_hexagon_S2_asr_r_r_sat>;
   1188 def : T_RR_pat <S2_asl_r_r_sat, int_hexagon_S2_asl_r_r_sat>;
   1189 
   1190 def : T_R_pat <S2_vsxtbh,   int_hexagon_S2_vsxtbh>;
   1191 def : T_R_pat <S2_vzxtbh,   int_hexagon_S2_vzxtbh>;
   1192 def : T_R_pat <S2_vsxthw,   int_hexagon_S2_vsxthw>;
   1193 def : T_R_pat <S2_vzxthw,   int_hexagon_S2_vzxthw>;
   1194 def : T_R_pat <S2_vsplatrh, int_hexagon_S2_vsplatrh>;
   1195 def : T_R_pat <A2_sxtw,     int_hexagon_A2_sxtw>;
   1196 
   1197 // Vector saturate and pack
   1198 def : T_R_pat <S2_svsathb,  int_hexagon_S2_svsathb>;
   1199 def : T_R_pat <S2_svsathub, int_hexagon_S2_svsathub>;
   1200 def : T_P_pat <S2_vsathub,  int_hexagon_S2_vsathub>;
   1201 def : T_P_pat <S2_vsatwh,   int_hexagon_S2_vsatwh>;
   1202 def : T_P_pat <S2_vsatwuh,  int_hexagon_S2_vsatwuh>;
   1203 def : T_P_pat <S2_vsathb,   int_hexagon_S2_vsathb>;
   1204 
   1205 def : T_P_pat <S2_vtrunohb,    int_hexagon_S2_vtrunohb>;
   1206 def : T_P_pat <S2_vtrunehb,    int_hexagon_S2_vtrunehb>;
   1207 def : T_P_pat <S2_vrndpackwh,  int_hexagon_S2_vrndpackwh>;
   1208 def : T_P_pat <S2_vrndpackwhs, int_hexagon_S2_vrndpackwhs>;
   1209 def : T_R_pat <S2_brev,        int_hexagon_S2_brev>;
   1210 def : T_R_pat <S2_vsplatrb,    int_hexagon_S2_vsplatrb>;
   1211 
   1212 def : T_R_pat <A2_abs,    int_hexagon_A2_abs>;
   1213 def : T_R_pat <A2_abssat, int_hexagon_A2_abssat>;
   1214 def : T_R_pat <A2_negsat, int_hexagon_A2_negsat>;
   1215 
   1216 def : T_R_pat <A2_swiz,   int_hexagon_A2_swiz>;
   1217 
   1218 def : T_P_pat <A2_sat,    int_hexagon_A2_sat>;
   1219 def : T_R_pat <A2_sath,   int_hexagon_A2_sath>;
   1220 def : T_R_pat <A2_satuh,  int_hexagon_A2_satuh>;
   1221 def : T_R_pat <A2_satub,  int_hexagon_A2_satub>;
   1222 def : T_R_pat <A2_satb,   int_hexagon_A2_satb>;
   1223 
   1224 // Vector arithmetic shift right by immediate with truncate and pack.
   1225 def : T_PI_pat<S2_asr_i_svw_trun, int_hexagon_S2_asr_i_svw_trun>;
   1226 
   1227 def : T_RI_pat <S2_asr_i_r,     int_hexagon_S2_asr_i_r>;
   1228 def : T_RI_pat <S2_lsr_i_r,     int_hexagon_S2_lsr_i_r>;
   1229 def : T_RI_pat <S2_asl_i_r,     int_hexagon_S2_asl_i_r>;
   1230 def : T_RI_pat <S2_asr_i_r_rnd, int_hexagon_S2_asr_i_r_rnd>;
   1231 def : T_RI_pat <S2_asr_i_r_rnd_goodsyntax,
   1232                 int_hexagon_S2_asr_i_r_rnd_goodsyntax>;
   1233 
   1234 // Shift left by immediate with saturation.
   1235 def : T_RI_pat <S2_asl_i_r_sat, int_hexagon_S2_asl_i_r_sat>;
   1236 
   1237 //===----------------------------------------------------------------------===//
   1238 // Template 'def pat' to map tableidx[bhwd] intrinsics to :raw instructions.
   1239 //===----------------------------------------------------------------------===//
   1240 class S2op_tableidx_pat <Intrinsic IntID, InstHexagon OutputInst,
   1241                          SDNodeXForm XformImm>
   1242   : Pat <(IntID I32:$src1, I32:$src2, u4ImmPred:$src3, u5ImmPred:$src4),
   1243          (OutputInst I32:$src1, I32:$src2, u4ImmPred:$src3,
   1244                      (XformImm u5ImmPred:$src4))>;
   1245 
   1246 
   1247 // Table Index : Extract and insert bits.
   1248 // Map to the real hardware instructions after subtracting appropriate
   1249 // values from the 4th input operand. Please note that subtraction is not
   1250 // needed for int_hexagon_S2_tableidxb_goodsyntax.
   1251 
   1252 def : Pat <(int_hexagon_S2_tableidxb_goodsyntax I32:$src1, I32:$src2,
   1253                                               u4ImmPred:$src3, u5ImmPred:$src4),
   1254            (S2_tableidxb I32:$src1, I32:$src2,
   1255                          u4ImmPred:$src3, u5ImmPred:$src4)>;
   1256 
   1257 def : S2op_tableidx_pat <int_hexagon_S2_tableidxh_goodsyntax, S2_tableidxh,
   1258                          DEC_CONST_SIGNED>;
   1259 def : S2op_tableidx_pat <int_hexagon_S2_tableidxw_goodsyntax, S2_tableidxw,
   1260                          DEC2_CONST_SIGNED>;
   1261 def : S2op_tableidx_pat <int_hexagon_S2_tableidxd_goodsyntax, S2_tableidxd,
   1262                          DEC3_CONST_SIGNED>;
   1263 
   1264 //*******************************************************************
   1265 //           STYPE/VH
   1266 //*******************************************************************
   1267 
   1268 // Vector absolute value halfwords with and without saturation
   1269 // Rdd64=vabsh(Rss64)[:sat]
   1270 def : T_P_pat <A2_vabsh, int_hexagon_A2_vabsh>;
   1271 def : T_P_pat <A2_vabshsat, int_hexagon_A2_vabshsat>;
   1272 
   1273 // Vector shift halfwords by immediate
   1274 // Rdd64=[vaslh/vasrh/vlsrh](Rss64,u4)
   1275 def : T_PI_pat <S2_asr_i_vh, int_hexagon_S2_asr_i_vh>;
   1276 def : T_PI_pat <S2_lsr_i_vh, int_hexagon_S2_lsr_i_vh>;
   1277 def : T_PI_pat <S2_asl_i_vh, int_hexagon_S2_asl_i_vh>;
   1278 
   1279 // Vector shift halfwords by register
   1280 // Rdd64=[vaslw/vasrw/vlslw/vlsrw](Rss64,Rt32)
   1281 def : T_PR_pat <S2_asr_r_vh, int_hexagon_S2_asr_r_vh>;
   1282 def : T_PR_pat <S2_lsr_r_vh, int_hexagon_S2_lsr_r_vh>;
   1283 def : T_PR_pat <S2_asl_r_vh, int_hexagon_S2_asl_r_vh>;
   1284 def : T_PR_pat <S2_lsl_r_vh, int_hexagon_S2_lsl_r_vh>;
   1285 
   1286 //*******************************************************************
   1287 //           STYPE/VW
   1288 //*******************************************************************
   1289 
   1290 // Vector absolute value words with and without saturation
   1291 def : T_P_pat <A2_vabsw, int_hexagon_A2_vabsw>;
   1292 def : T_P_pat <A2_vabswsat, int_hexagon_A2_vabswsat>;
   1293 
   1294 // Vector shift words by immediate.
   1295 // Rdd64=[vasrw/vlsrw|vaslw](Rss64,u5)
   1296 def : T_PI_pat <S2_asr_i_vw, int_hexagon_S2_asr_i_vw>;
   1297 def : T_PI_pat <S2_lsr_i_vw, int_hexagon_S2_lsr_i_vw>;
   1298 def : T_PI_pat <S2_asl_i_vw, int_hexagon_S2_asl_i_vw>;
   1299 
   1300 // Vector shift words by register.
   1301 // Rdd64=[vasrw/vlsrw|vaslw|vlslw](Rss64,Rt32)
   1302 def : T_PR_pat <S2_asr_r_vw, int_hexagon_S2_asr_r_vw>;
   1303 def : T_PR_pat <S2_lsr_r_vw, int_hexagon_S2_lsr_r_vw>;
   1304 def : T_PR_pat <S2_asl_r_vw, int_hexagon_S2_asl_r_vw>;
   1305 def : T_PR_pat <S2_lsl_r_vw, int_hexagon_S2_lsl_r_vw>;
   1306 
   1307 // Vector shift words with truncate and pack
   1308 def : T_PR_pat <S2_asr_r_svw_trun, int_hexagon_S2_asr_r_svw_trun>;
   1309 
   1310 // Load/store locked.
   1311 def : T_R_pat<L2_loadw_locked, int_hexagon_L2_loadw_locked>;
   1312 def : T_R_pat<L4_loadd_locked, int_hexagon_L4_loadd_locked>;
   1313 
   1314 def : Pat<(int_hexagon_S2_storew_locked I32:$Rs, I32:$Rt),
   1315           (C2_tfrpr (S2_storew_locked I32:$Rs, I32:$Rt))>;
   1316 def : Pat<(int_hexagon_S4_stored_locked I32:$Rs, I64:$Rt),
   1317           (C2_tfrpr (S4_stored_locked I32:$Rs, I64:$Rt))>;
   1318 
   1319 //*******************************************************************
   1320 //           ST
   1321 //*******************************************************************
   1322 
   1323 class T_stb_pat <InstHexagon MI, Intrinsic IntID, PatLeaf Val>
   1324   : Pat<(IntID I32:$Rs, Val:$Rt, I32:$Ru),
   1325         (MI I32:$Rs, I32:$Ru, Val:$Rt)>;
   1326 
   1327 def : T_stb_pat <S2_storerh_pbr, int_hexagon_brev_sth,   I32>;
   1328 def : T_stb_pat <S2_storerb_pbr, int_hexagon_brev_stb,   I32>;
   1329 def : T_stb_pat <S2_storeri_pbr, int_hexagon_brev_stw,   I32>;
   1330 def : T_stb_pat <S2_storerf_pbr, int_hexagon_brev_sthhi, I32>;
   1331 def : T_stb_pat <S2_storerd_pbr, int_hexagon_brev_std,   I64>;
   1332 
   1333 class T_stc_pat <InstHexagon MI, Intrinsic IntID, PatLeaf Imm, PatLeaf Val>
   1334   : Pat<(IntID I32:$Rs, Val:$Rt, I32:$Ru, Imm:$s),
   1335         (MI I32:$Rs, Imm:$s, I32:$Ru, Val:$Rt)>;
   1336 
   1337 def: T_stc_pat<S2_storerb_pci, int_hexagon_circ_stb,   s4_0ImmPred, I32>;
   1338 def: T_stc_pat<S2_storerh_pci, int_hexagon_circ_sth,   s4_1ImmPred, I32>;
   1339 def: T_stc_pat<S2_storeri_pci, int_hexagon_circ_stw,   s4_2ImmPred, I32>;
   1340 def: T_stc_pat<S2_storerd_pci, int_hexagon_circ_std,   s4_3ImmPred, I64>;
   1341 def: T_stc_pat<S2_storerf_pci, int_hexagon_circ_sthhi, s4_1ImmPred, I32>;
   1342 
   1343 include "HexagonIntrinsicsV3.td"
   1344 include "HexagonIntrinsicsV4.td"
   1345 include "HexagonIntrinsicsV5.td"
   1346 include "HexagonIntrinsicsV60.td"
   1347