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