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 // Make sure the patterns with zero immediate value has higher complexity 739 // otherwise, we need to updated the predicates for immediates to exclude zero 740 let AddedComplexity = 200 in { 741 def : Pat <(int_hexagon_S2_asr_i_r_rnd_goodsyntax I32:$Rs, (i32 0)), 742 (A2_tfr I32:$Rs)>; 743 def : Pat <(int_hexagon_S2_asr_i_p_rnd_goodsyntax I64:$Rs, (i32 0)), 744 (A2_combinew (HiReg I64:$Rs), (LoReg I64:$Rs))>; 745 def : Pat <(int_hexagon_S5_vasrhrnd_goodsyntax I64:$Rs, (i32 0)), 746 (A2_combinew (HiReg I64:$Rs), (LoReg I64:$Rs))>; 747 def : Pat <(int_hexagon_S5_asrhub_rnd_sat_goodsyntax I64:$Rs, (i32 0)), 748 (S2_vsathub I64:$Rs)>; 749 } 750 751 def : Pat <(int_hexagon_S2_asr_i_r_rnd_goodsyntax I32:$Rs, u5_0ImmPred:$imm), 752 (S2_asr_i_r_rnd I32:$Rs, (UDEC1 u5_0ImmPred:$imm))>; 753 def : Pat <(int_hexagon_S2_asr_i_p_rnd_goodsyntax I64:$Rs, u6_0ImmPred:$imm), 754 (S2_asr_i_p_rnd I64:$Rs, (UDEC1 u6_0ImmPred:$imm))>; 755 def : Pat <(int_hexagon_S5_vasrhrnd_goodsyntax I64:$Rs, u4_0ImmPred:$imm), 756 (S5_vasrhrnd I64:$Rs, (UDEC1 u4_0ImmPred:$imm))>; 757 def : Pat <(int_hexagon_S5_asrhub_rnd_sat_goodsyntax I64:$Rs, u4_0ImmPred:$imm), 758 (S5_asrhub_rnd_sat I64:$Rs, (UDEC1 u4_0ImmPred:$imm))>; 759 760 // Transfer immediate 761 def : Pat <(int_hexagon_A2_tfril I32:$Rs, u16_0ImmPred:$Is), 762 (A2_tfril I32:$Rs, u16_0ImmPred:$Is)>; 763 def : Pat <(int_hexagon_A2_tfrih I32:$Rs, u16_0ImmPred:$Is), 764 (A2_tfrih I32:$Rs, u16_0ImmPred:$Is)>; 765 766 // Transfer Register/immediate. 767 def : T_R_pat <A2_tfr, int_hexagon_A2_tfr>; 768 def : T_I_pat <A2_tfrsi, int_hexagon_A2_tfrsi>; 769 770 def ImmExt64: SDNodeXForm<imm, [{ 771 int64_t V = N->getSExtValue(); 772 return CurDAG->getTargetConstant(V, SDLoc(N), MVT::i64); 773 }]>; 774 775 // A2_tfrpi has an operand of type i64. This is necessary, since it is 776 // generated from "(set I64:$Rd, imm)". That pattern would not appear 777 // in the DAG, if the immediate was not a 64-bit value. 778 // The builtin for A2_tfrpi, on the other hand, takes a 32-bit value, 779 // which makes it impossible to simply replace it with the instruction. 780 // To connect the builtin with the instruction, the builtin's operand 781 // needs to be extended to the right type. 782 783 def : Pat<(int_hexagon_A2_tfrpi imm:$Is), 784 (A2_tfrpi (ImmExt64 $Is))>; 785 786 // Assembler mapped from Rdd32=Rss32 to Rdd32=combine(Rss.H32,Rss.L32) 787 def : Pat<(int_hexagon_A2_tfrp I64:$src), 788 (A2_combinew (HiReg I64:$src), (LoReg I64:$src))>; 789 790 //******************************************************************* 791 // ALU32/PERM 792 //******************************************************************* 793 // Combine 794 def: T_RR_pat<A2_combine_hh, int_hexagon_A2_combine_hh>; 795 def: T_RR_pat<A2_combine_hl, int_hexagon_A2_combine_hl>; 796 def: T_RR_pat<A2_combine_lh, int_hexagon_A2_combine_lh>; 797 def: T_RR_pat<A2_combine_ll, int_hexagon_A2_combine_ll>; 798 799 def: T_II_pat<A2_combineii, int_hexagon_A2_combineii, s32_0ImmPred, s8_0ImmPred>; 800 801 // Mux 802 def : T_QRR_pat<C2_mux, int_hexagon_C2_mux>; 803 def : T_QRI_pat<C2_muxir, int_hexagon_C2_muxir, s32_0ImmPred>; 804 def : T_QIR_pat<C2_muxri, int_hexagon_C2_muxri, s32_0ImmPred>; 805 def : T_QII_pat<C2_muxii, int_hexagon_C2_muxii, s32_0ImmPred, s8_0ImmPred>; 806 807 // Shift halfword 808 def : T_R_pat<A2_aslh, int_hexagon_A2_aslh>; 809 def : T_R_pat<A2_asrh, int_hexagon_A2_asrh>; 810 811 // Sign/zero extend 812 def : T_R_pat<A2_sxth, int_hexagon_A2_sxth>; 813 def : T_R_pat<A2_sxtb, int_hexagon_A2_sxtb>; 814 def : T_R_pat<A2_zxth, int_hexagon_A2_zxth>; 815 def : T_R_pat<A2_zxtb, int_hexagon_A2_zxtb>; 816 817 //******************************************************************* 818 // ALU32/PRED 819 //******************************************************************* 820 // Compare 821 def : T_Q_RR_pat<C2_cmpeq, int_hexagon_C2_cmpeq>; 822 def : T_Q_RR_pat<C2_cmpgt, int_hexagon_C2_cmpgt>; 823 def : T_Q_RR_pat<C2_cmpgtu, int_hexagon_C2_cmpgtu>; 824 825 def : T_Q_RI_pat<C2_cmpeqi, int_hexagon_C2_cmpeqi, s32_0ImmPred>; 826 def : T_Q_RI_pat<C2_cmpgti, int_hexagon_C2_cmpgti, s32_0ImmPred>; 827 def : T_Q_RI_pat<C2_cmpgtui, int_hexagon_C2_cmpgtui, u32_0ImmPred>; 828 829 def : Pat <(int_hexagon_C2_cmpgei I32:$src1, s32_0ImmPred:$src2), 830 (C2_tfrpr (C2_cmpgti I32:$src1, (SDEC1 s32_0ImmPred:$src2)))>; 831 832 def : Pat <(int_hexagon_C2_cmpgeui I32:$src1, u32_0ImmPred:$src2), 833 (C2_tfrpr (C2_cmpgtui I32:$src1, (UDEC1 u32_0ImmPred:$src2)))>; 834 835 def : Pat <(int_hexagon_C2_cmpgeui I32:$src, 0), 836 (C2_tfrpr (C2_cmpeq I32:$src, I32:$src))>; 837 def : Pat <(int_hexagon_C2_cmplt I32:$src1, I32:$src2), 838 (C2_tfrpr (C2_cmpgt I32:$src2, I32:$src1))>; 839 def : Pat <(int_hexagon_C2_cmpltu I32:$src1, I32:$src2), 840 (C2_tfrpr (C2_cmpgtu I32:$src2, I32:$src1))>; 841 842 //******************************************************************* 843 // ALU32/VH 844 //******************************************************************* 845 // Vector add, subtract, average halfwords 846 def: T_RR_pat<A2_svaddh, int_hexagon_A2_svaddh>; 847 def: T_RR_pat<A2_svaddhs, int_hexagon_A2_svaddhs>; 848 def: T_RR_pat<A2_svadduhs, int_hexagon_A2_svadduhs>; 849 850 def: T_RR_pat<A2_svsubh, int_hexagon_A2_svsubh>; 851 def: T_RR_pat<A2_svsubhs, int_hexagon_A2_svsubhs>; 852 def: T_RR_pat<A2_svsubuhs, int_hexagon_A2_svsubuhs>; 853 854 def: T_RR_pat<A2_svavgh, int_hexagon_A2_svavgh>; 855 def: T_RR_pat<A2_svavghs, int_hexagon_A2_svavghs>; 856 def: T_RR_pat<A2_svnavgh, int_hexagon_A2_svnavgh>; 857 858 //******************************************************************* 859 // ALU64/ALU 860 //******************************************************************* 861 def: T_RR_pat<A2_addsat, int_hexagon_A2_addsat>; 862 def: T_RR_pat<A2_subsat, int_hexagon_A2_subsat>; 863 def: T_PP_pat<A2_addp, int_hexagon_A2_addp>; 864 def: T_PP_pat<A2_subp, int_hexagon_A2_subp>; 865 866 def: T_PP_pat<A2_andp, int_hexagon_A2_andp>; 867 def: T_PP_pat<A2_orp, int_hexagon_A2_orp>; 868 def: T_PP_pat<A2_xorp, int_hexagon_A2_xorp>; 869 870 def: T_Q_PP_pat<C2_cmpeqp, int_hexagon_C2_cmpeqp>; 871 def: T_Q_PP_pat<C2_cmpgtp, int_hexagon_C2_cmpgtp>; 872 def: T_Q_PP_pat<C2_cmpgtup, int_hexagon_C2_cmpgtup>; 873 874 def: T_PP_pat<S2_parityp, int_hexagon_S2_parityp>; 875 def: T_RR_pat<S2_packhl, int_hexagon_S2_packhl>; 876 877 //******************************************************************* 878 // ALU64/VB 879 //******************************************************************* 880 // ALU64 - Vector add 881 def : T_PP_pat <A2_vaddub, int_hexagon_A2_vaddub>; 882 def : T_PP_pat <A2_vaddubs, int_hexagon_A2_vaddubs>; 883 def : T_PP_pat <A2_vaddh, int_hexagon_A2_vaddh>; 884 def : T_PP_pat <A2_vaddhs, int_hexagon_A2_vaddhs>; 885 def : T_PP_pat <A2_vadduhs, int_hexagon_A2_vadduhs>; 886 def : T_PP_pat <A2_vaddw, int_hexagon_A2_vaddw>; 887 def : T_PP_pat <A2_vaddws, int_hexagon_A2_vaddws>; 888 889 // ALU64 - Vector average 890 def : T_PP_pat <A2_vavgub, int_hexagon_A2_vavgub>; 891 def : T_PP_pat <A2_vavgubr, int_hexagon_A2_vavgubr>; 892 def : T_PP_pat <A2_vavgh, int_hexagon_A2_vavgh>; 893 def : T_PP_pat <A2_vavghr, int_hexagon_A2_vavghr>; 894 def : T_PP_pat <A2_vavghcr, int_hexagon_A2_vavghcr>; 895 def : T_PP_pat <A2_vavguh, int_hexagon_A2_vavguh>; 896 def : T_PP_pat <A2_vavguhr, int_hexagon_A2_vavguhr>; 897 898 def : T_PP_pat <A2_vavgw, int_hexagon_A2_vavgw>; 899 def : T_PP_pat <A2_vavgwr, int_hexagon_A2_vavgwr>; 900 def : T_PP_pat <A2_vavgwcr, int_hexagon_A2_vavgwcr>; 901 def : T_PP_pat <A2_vavguw, int_hexagon_A2_vavguw>; 902 def : T_PP_pat <A2_vavguwr, int_hexagon_A2_vavguwr>; 903 904 // ALU64 - Vector negative average 905 def : T_PP_pat <A2_vnavgh, int_hexagon_A2_vnavgh>; 906 def : T_PP_pat <A2_vnavghr, int_hexagon_A2_vnavghr>; 907 def : T_PP_pat <A2_vnavghcr, int_hexagon_A2_vnavghcr>; 908 def : T_PP_pat <A2_vnavgw, int_hexagon_A2_vnavgw>; 909 def : T_PP_pat <A2_vnavgwr, int_hexagon_A2_vnavgwr>; 910 def : T_PP_pat <A2_vnavgwcr, int_hexagon_A2_vnavgwcr>; 911 912 // ALU64 - Vector max 913 def : T_PP_pat <A2_vmaxh, int_hexagon_A2_vmaxh>; 914 def : T_PP_pat <A2_vmaxw, int_hexagon_A2_vmaxw>; 915 def : T_PP_pat <A2_vmaxub, int_hexagon_A2_vmaxub>; 916 def : T_PP_pat <A2_vmaxuh, int_hexagon_A2_vmaxuh>; 917 def : T_PP_pat <A2_vmaxuw, int_hexagon_A2_vmaxuw>; 918 919 // ALU64 - Vector min 920 def : T_PP_pat <A2_vminh, int_hexagon_A2_vminh>; 921 def : T_PP_pat <A2_vminw, int_hexagon_A2_vminw>; 922 def : T_PP_pat <A2_vminub, int_hexagon_A2_vminub>; 923 def : T_PP_pat <A2_vminuh, int_hexagon_A2_vminuh>; 924 def : T_PP_pat <A2_vminuw, int_hexagon_A2_vminuw>; 925 926 // ALU64 - Vector sub 927 def : T_PP_pat <A2_vsubub, int_hexagon_A2_vsubub>; 928 def : T_PP_pat <A2_vsububs, int_hexagon_A2_vsububs>; 929 def : T_PP_pat <A2_vsubh, int_hexagon_A2_vsubh>; 930 def : T_PP_pat <A2_vsubhs, int_hexagon_A2_vsubhs>; 931 def : T_PP_pat <A2_vsubuhs, int_hexagon_A2_vsubuhs>; 932 def : T_PP_pat <A2_vsubw, int_hexagon_A2_vsubw>; 933 def : T_PP_pat <A2_vsubws, int_hexagon_A2_vsubws>; 934 935 // ALU64 - Vector compare bytes 936 def : T_Q_PP_pat <A2_vcmpbeq, int_hexagon_A2_vcmpbeq>; 937 def : T_Q_PP_pat <A4_vcmpbgt, int_hexagon_A4_vcmpbgt>; 938 def : T_Q_PP_pat <A2_vcmpbgtu, int_hexagon_A2_vcmpbgtu>; 939 940 // ALU64 - Vector compare halfwords 941 def : T_Q_PP_pat <A2_vcmpheq, int_hexagon_A2_vcmpheq>; 942 def : T_Q_PP_pat <A2_vcmphgt, int_hexagon_A2_vcmphgt>; 943 def : T_Q_PP_pat <A2_vcmphgtu, int_hexagon_A2_vcmphgtu>; 944 945 // ALU64 - Vector compare words 946 def : T_Q_PP_pat <A2_vcmpweq, int_hexagon_A2_vcmpweq>; 947 def : T_Q_PP_pat <A2_vcmpwgt, int_hexagon_A2_vcmpwgt>; 948 def : T_Q_PP_pat <A2_vcmpwgtu, int_hexagon_A2_vcmpwgtu>; 949 950 // ALU64 / VB / Vector mux. 951 def : T_QPP_pat <C2_vmux, int_hexagon_C2_vmux>; 952 953 // MPY - Multiply and use full result 954 // Rdd = mpy[u](Rs, Rt) 955 def : T_RR_pat <M2_dpmpyss_s0, int_hexagon_M2_dpmpyss_s0>; 956 def : T_RR_pat <M2_dpmpyuu_s0, int_hexagon_M2_dpmpyuu_s0>; 957 958 // Complex multiply real or imaginary 959 def : T_RR_pat <M2_cmpyi_s0, int_hexagon_M2_cmpyi_s0>; 960 def : T_RR_pat <M2_cmpyr_s0, int_hexagon_M2_cmpyr_s0>; 961 962 // Complex multiply 963 def : T_RR_pat <M2_cmpys_s0, int_hexagon_M2_cmpys_s0>; 964 def : T_RR_pat <M2_cmpysc_s0, int_hexagon_M2_cmpysc_s0>; 965 def : T_RR_pat <M2_cmpys_s1, int_hexagon_M2_cmpys_s1>; 966 def : T_RR_pat <M2_cmpysc_s1, int_hexagon_M2_cmpysc_s1>; 967 968 // Vector multiply halfwords 969 // Rdd=vmpyh(Rs,Rt)[:<<1]:sat 970 def : T_RR_pat <M2_vmpy2s_s0, int_hexagon_M2_vmpy2s_s0>; 971 def : T_RR_pat <M2_vmpy2s_s1, int_hexagon_M2_vmpy2s_s1>; 972 973 // Rxx[+-]= mpy[u](Rs,Rt) 974 def : T_PRR_pat <M2_dpmpyss_acc_s0, int_hexagon_M2_dpmpyss_acc_s0>; 975 def : T_PRR_pat <M2_dpmpyss_nac_s0, int_hexagon_M2_dpmpyss_nac_s0>; 976 def : T_PRR_pat <M2_dpmpyuu_acc_s0, int_hexagon_M2_dpmpyuu_acc_s0>; 977 def : T_PRR_pat <M2_dpmpyuu_nac_s0, int_hexagon_M2_dpmpyuu_nac_s0>; 978 979 // Rxx[-+]=cmpy(Rs,Rt)[:<<1]:sat 980 def : T_PRR_pat <M2_cmacs_s0, int_hexagon_M2_cmacs_s0>; 981 def : T_PRR_pat <M2_cnacs_s0, int_hexagon_M2_cnacs_s0>; 982 def : T_PRR_pat <M2_cmacs_s1, int_hexagon_M2_cmacs_s1>; 983 def : T_PRR_pat <M2_cnacs_s1, int_hexagon_M2_cnacs_s1>; 984 985 // Rxx[-+]=cmpy(Rs,Rt*)[:<<1]:sat 986 def : T_PRR_pat <M2_cmacsc_s0, int_hexagon_M2_cmacsc_s0>; 987 def : T_PRR_pat <M2_cnacsc_s0, int_hexagon_M2_cnacsc_s0>; 988 def : T_PRR_pat <M2_cmacsc_s1, int_hexagon_M2_cmacsc_s1>; 989 def : T_PRR_pat <M2_cnacsc_s1, int_hexagon_M2_cnacsc_s1>; 990 991 // Rxx+=cmpy[ir](Rs,Rt) 992 def : T_PRR_pat <M2_cmaci_s0, int_hexagon_M2_cmaci_s0>; 993 def : T_PRR_pat <M2_cmacr_s0, int_hexagon_M2_cmacr_s0>; 994 995 // Rxx+=vmpyh(Rs,Rt)[:<<1][:sat] 996 def : T_PRR_pat <M2_vmac2, int_hexagon_M2_vmac2>; 997 def : T_PRR_pat <M2_vmac2s_s0, int_hexagon_M2_vmac2s_s0>; 998 def : T_PRR_pat <M2_vmac2s_s1, int_hexagon_M2_vmac2s_s1>; 999 1000 //******************************************************************* 1001 // CR 1002 //******************************************************************* 1003 def: T_Q_Q_pat<C2_not, int_hexagon_C2_not>; 1004 def: T_Q_Q_pat<C2_all8, int_hexagon_C2_all8>; 1005 def: T_Q_Q_pat<C2_any8, int_hexagon_C2_any8>; 1006 def: T_Q_Q_pat<C2_pxfer_map, int_hexagon_C2_pxfer_map>; 1007 1008 def: T_Q_QQ_pat<C2_and, int_hexagon_C2_and>; 1009 def: T_Q_QQ_pat<C2_andn, int_hexagon_C2_andn>; 1010 def: T_Q_QQ_pat<C2_or, int_hexagon_C2_or>; 1011 def: T_Q_QQ_pat<C2_orn, int_hexagon_C2_orn>; 1012 def: T_Q_QQ_pat<C2_xor, int_hexagon_C2_xor>; 1013 1014 // Multiply 32x32 and use lower result 1015 def : T_RRI_pat <M2_macsip, int_hexagon_M2_macsip>; 1016 def : T_RRI_pat <M2_macsin, int_hexagon_M2_macsin>; 1017 def : T_RRR_pat <M2_maci, int_hexagon_M2_maci>; 1018 1019 // Subtract and accumulate 1020 def : T_RRR_pat <M2_subacc, int_hexagon_M2_subacc>; 1021 1022 // Add and accumulate 1023 def : T_RRR_pat <M2_acci, int_hexagon_M2_acci>; 1024 def : T_RRR_pat <M2_nacci, int_hexagon_M2_nacci>; 1025 def : T_RRI_pat <M2_accii, int_hexagon_M2_accii>; 1026 def : T_RRI_pat <M2_naccii, int_hexagon_M2_naccii>; 1027 1028 // XOR and XOR with destination 1029 def : T_RRR_pat <M2_xor_xacc, int_hexagon_M2_xor_xacc>; 1030 1031 // Vector dual multiply with round and pack 1032 def : T_PP_pat <M2_vdmpyrs_s0, int_hexagon_M2_vdmpyrs_s0>; 1033 def : T_PP_pat <M2_vdmpyrs_s1, int_hexagon_M2_vdmpyrs_s1>; 1034 1035 // Vector multiply halfwords with round and pack 1036 def : T_RR_pat <M2_vmpy2s_s0pack, int_hexagon_M2_vmpy2s_s0pack>; 1037 def : T_RR_pat <M2_vmpy2s_s1pack, int_hexagon_M2_vmpy2s_s1pack>; 1038 1039 // Multiply and use lower result 1040 def : T_RR_pat <M2_mpyi, int_hexagon_M2_mpyi>; 1041 def : T_RI_pat <M2_mpysmi, int_hexagon_M2_mpysmi>; 1042 1043 // Assembler mapped from Rd32=mpyui(Rs32,Rt32) to Rd32=mpyi(Rs32,Rt32) 1044 def : T_RR_pat <M2_mpyi, int_hexagon_M2_mpyui>; 1045 1046 // Multiply and use upper result 1047 def : T_RR_pat <M2_mpy_up, int_hexagon_M2_mpy_up>; 1048 def : T_RR_pat <M2_mpyu_up, int_hexagon_M2_mpyu_up>; 1049 def : T_RR_pat <M2_hmmpyh_rs1, int_hexagon_M2_hmmpyh_rs1>; 1050 def : T_RR_pat <M2_hmmpyl_rs1, int_hexagon_M2_hmmpyl_rs1>; 1051 def : T_RR_pat <M2_dpmpyss_rnd_s0, int_hexagon_M2_dpmpyss_rnd_s0>; 1052 1053 // Complex multiply with round and pack 1054 // Rxx32+=cmpy(Rs32,[*]Rt32:<<1]:rnd:sat 1055 def : T_RR_pat <M2_cmpyrs_s0, int_hexagon_M2_cmpyrs_s0>; 1056 def : T_RR_pat <M2_cmpyrs_s1, int_hexagon_M2_cmpyrs_s1>; 1057 def : T_RR_pat <M2_cmpyrsc_s0, int_hexagon_M2_cmpyrsc_s0>; 1058 def : T_RR_pat <M2_cmpyrsc_s1, int_hexagon_M2_cmpyrsc_s1>; 1059 1060 //******************************************************************* 1061 // STYPE/ALU 1062 //******************************************************************* 1063 def : T_P_pat <A2_absp, int_hexagon_A2_absp>; 1064 def : T_P_pat <A2_negp, int_hexagon_A2_negp>; 1065 def : T_P_pat <A2_notp, int_hexagon_A2_notp>; 1066 1067 //******************************************************************* 1068 // STYPE/BIT 1069 //******************************************************************* 1070 1071 // Count leading/trailing 1072 def: T_R_pat<S2_cl0, int_hexagon_S2_cl0>; 1073 def: T_P_pat<S2_cl0p, int_hexagon_S2_cl0p>; 1074 def: T_R_pat<S2_cl1, int_hexagon_S2_cl1>; 1075 def: T_P_pat<S2_cl1p, int_hexagon_S2_cl1p>; 1076 def: T_R_pat<S2_clb, int_hexagon_S2_clb>; 1077 def: T_P_pat<S2_clbp, int_hexagon_S2_clbp>; 1078 def: T_R_pat<S2_clbnorm, int_hexagon_S2_clbnorm>; 1079 def: T_R_pat<S2_ct0, int_hexagon_S2_ct0>; 1080 def: T_R_pat<S2_ct1, int_hexagon_S2_ct1>; 1081 1082 // Compare bit mask 1083 def: T_RR_pat<C2_bitsclr, int_hexagon_C2_bitsclr>; 1084 def: T_RI_pat<C2_bitsclri, int_hexagon_C2_bitsclri>; 1085 def: T_RR_pat<C2_bitsset, int_hexagon_C2_bitsset>; 1086 1087 // Vector shuffle 1088 def : T_PP_pat <S2_shuffeb, int_hexagon_S2_shuffeb>; 1089 def : T_PP_pat <S2_shuffob, int_hexagon_S2_shuffob>; 1090 def : T_PP_pat <S2_shuffeh, int_hexagon_S2_shuffeh>; 1091 def : T_PP_pat <S2_shuffoh, int_hexagon_S2_shuffoh>; 1092 1093 // Vector truncate 1094 def : T_PP_pat <S2_vtrunewh, int_hexagon_S2_vtrunewh>; 1095 def : T_PP_pat <S2_vtrunowh, int_hexagon_S2_vtrunowh>; 1096 1097 // Linear feedback-shift Iteration. 1098 def : T_PP_pat <S2_lfsp, int_hexagon_S2_lfsp>; 1099 1100 // Vector align 1101 // Need custom lowering 1102 def : T_PPQ_pat <S2_valignrb, int_hexagon_S2_valignrb>; 1103 def : T_PPI_pat <S2_valignib, int_hexagon_S2_valignib>; 1104 1105 // Vector splice 1106 def : T_PPQ_pat <S2_vsplicerb, int_hexagon_S2_vsplicerb>; 1107 def : T_PPI_pat <S2_vspliceib, int_hexagon_S2_vspliceib>; 1108 1109 // Shift by immediate and add 1110 def : T_RRI_pat<S2_addasl_rrri, int_hexagon_S2_addasl_rrri>; 1111 1112 // Extract bitfield 1113 def : T_PII_pat<S2_extractup, int_hexagon_S2_extractup>; 1114 def : T_RII_pat<S2_extractu, int_hexagon_S2_extractu>; 1115 def : T_RP_pat <S2_extractu_rp, int_hexagon_S2_extractu_rp>; 1116 def : T_PP_pat <S2_extractup_rp, int_hexagon_S2_extractup_rp>; 1117 1118 // Insert bitfield 1119 def : Pat <(int_hexagon_S2_insert_rp I32:$src1, I32:$src2, I64:$src3), 1120 (S2_insert_rp I32:$src1, I32:$src2, I64:$src3)>; 1121 1122 def : Pat<(i64 (int_hexagon_S2_insertp_rp I64:$src1, I64:$src2, I64:$src3)), 1123 (i64 (S2_insertp_rp I64:$src1, I64:$src2, I64:$src3))>; 1124 1125 def : Pat<(int_hexagon_S2_insert I32:$src1, I32:$src2, 1126 u5_0ImmPred:$src3, u5_0ImmPred:$src4), 1127 (S2_insert I32:$src1, I32:$src2, 1128 u5_0ImmPred:$src3, u5_0ImmPred:$src4)>; 1129 1130 def : Pat<(i64 (int_hexagon_S2_insertp I64:$src1, I64:$src2, 1131 u6_0ImmPred:$src3, u6_0ImmPred:$src4)), 1132 (i64 (S2_insertp I64:$src1, I64:$src2, 1133 u6_0ImmPred:$src3, u6_0ImmPred:$src4))>; 1134 1135 // Innterleave/deinterleave 1136 def : T_P_pat <S2_interleave, int_hexagon_S2_interleave>; 1137 def : T_P_pat <S2_deinterleave, int_hexagon_S2_deinterleave>; 1138 1139 // Set/Clear/Toggle Bit 1140 def: T_RI_pat<S2_setbit_i, int_hexagon_S2_setbit_i>; 1141 def: T_RI_pat<S2_clrbit_i, int_hexagon_S2_clrbit_i>; 1142 def: T_RI_pat<S2_togglebit_i, int_hexagon_S2_togglebit_i>; 1143 1144 def: T_RR_pat<S2_setbit_r, int_hexagon_S2_setbit_r>; 1145 def: T_RR_pat<S2_clrbit_r, int_hexagon_S2_clrbit_r>; 1146 def: T_RR_pat<S2_togglebit_r, int_hexagon_S2_togglebit_r>; 1147 1148 // Test Bit 1149 def: T_Q_RI_pat<S2_tstbit_i, int_hexagon_S2_tstbit_i>; 1150 def: T_Q_RR_pat<S2_tstbit_r, int_hexagon_S2_tstbit_r>; 1151 1152 //******************************************************************* 1153 // STYPE/COMPLEX 1154 //******************************************************************* 1155 // Vector Complex conjugate 1156 def : T_P_pat <A2_vconj, int_hexagon_A2_vconj>; 1157 1158 // Vector Complex rotate 1159 def : T_PR_pat <S2_vcrotate, int_hexagon_S2_vcrotate>; 1160 1161 //******************************************************************* 1162 // STYPE/PERM 1163 //******************************************************************* 1164 1165 // Vector saturate without pack 1166 def : T_P_pat <S2_vsathb_nopack, int_hexagon_S2_vsathb_nopack>; 1167 def : T_P_pat <S2_vsathub_nopack, int_hexagon_S2_vsathub_nopack>; 1168 def : T_P_pat <S2_vsatwh_nopack, int_hexagon_S2_vsatwh_nopack>; 1169 def : T_P_pat <S2_vsatwuh_nopack, int_hexagon_S2_vsatwuh_nopack>; 1170 1171 //******************************************************************* 1172 // STYPE/PRED 1173 //******************************************************************* 1174 1175 // Predicate transfer 1176 def: Pat<(i32 (int_hexagon_C2_tfrpr I32:$Rs)), 1177 (i32 (C2_tfrpr (C2_tfrrp I32:$Rs)))>; 1178 def: Pat<(i32 (int_hexagon_C2_tfrrp I32:$Rs)), 1179 (i32 (C2_tfrpr (C2_tfrrp I32:$Rs)))>; 1180 1181 // Mask generate from predicate 1182 def: Pat<(i64 (int_hexagon_C2_mask I32:$Rs)), 1183 (i64 (C2_mask (C2_tfrrp I32:$Rs)))>; 1184 1185 // Viterbi pack even and odd predicate bits 1186 def: T_QQ_pat<C2_vitpack, int_hexagon_C2_vitpack>; 1187 1188 //******************************************************************* 1189 // STYPE/SHIFT 1190 //******************************************************************* 1191 1192 def : T_PI_pat <S2_asr_i_p, int_hexagon_S2_asr_i_p>; 1193 def : T_PI_pat <S2_lsr_i_p, int_hexagon_S2_lsr_i_p>; 1194 def : T_PI_pat <S2_asl_i_p, int_hexagon_S2_asl_i_p>; 1195 1196 def : T_PR_pat <S2_asr_r_p, int_hexagon_S2_asr_r_p>; 1197 def : T_PR_pat <S2_lsr_r_p, int_hexagon_S2_lsr_r_p>; 1198 def : T_PR_pat <S2_asl_r_p, int_hexagon_S2_asl_r_p>; 1199 def : T_PR_pat <S2_lsl_r_p, int_hexagon_S2_lsl_r_p>; 1200 1201 def : T_RR_pat <S2_asr_r_r, int_hexagon_S2_asr_r_r>; 1202 def : T_RR_pat <S2_lsr_r_r, int_hexagon_S2_lsr_r_r>; 1203 def : T_RR_pat <S2_asl_r_r, int_hexagon_S2_asl_r_r>; 1204 def : T_RR_pat <S2_lsl_r_r, int_hexagon_S2_lsl_r_r>; 1205 1206 def : T_RR_pat <S2_asr_r_r_sat, int_hexagon_S2_asr_r_r_sat>; 1207 def : T_RR_pat <S2_asl_r_r_sat, int_hexagon_S2_asl_r_r_sat>; 1208 1209 def : T_R_pat <S2_vsxtbh, int_hexagon_S2_vsxtbh>; 1210 def : T_R_pat <S2_vzxtbh, int_hexagon_S2_vzxtbh>; 1211 def : T_R_pat <S2_vsxthw, int_hexagon_S2_vsxthw>; 1212 def : T_R_pat <S2_vzxthw, int_hexagon_S2_vzxthw>; 1213 def : T_R_pat <S2_vsplatrh, int_hexagon_S2_vsplatrh>; 1214 def : T_R_pat <A2_sxtw, int_hexagon_A2_sxtw>; 1215 1216 // Vector saturate and pack 1217 def : T_R_pat <S2_svsathb, int_hexagon_S2_svsathb>; 1218 def : T_R_pat <S2_svsathub, int_hexagon_S2_svsathub>; 1219 def : T_P_pat <S2_vsathub, int_hexagon_S2_vsathub>; 1220 def : T_P_pat <S2_vsatwh, int_hexagon_S2_vsatwh>; 1221 def : T_P_pat <S2_vsatwuh, int_hexagon_S2_vsatwuh>; 1222 def : T_P_pat <S2_vsathb, int_hexagon_S2_vsathb>; 1223 1224 def : T_P_pat <S2_vtrunohb, int_hexagon_S2_vtrunohb>; 1225 def : T_P_pat <S2_vtrunehb, int_hexagon_S2_vtrunehb>; 1226 def : T_P_pat <S2_vrndpackwh, int_hexagon_S2_vrndpackwh>; 1227 def : T_P_pat <S2_vrndpackwhs, int_hexagon_S2_vrndpackwhs>; 1228 def : T_R_pat <S2_brev, int_hexagon_S2_brev>; 1229 def : T_R_pat <S2_vsplatrb, int_hexagon_S2_vsplatrb>; 1230 1231 def : T_R_pat <A2_abs, int_hexagon_A2_abs>; 1232 def : T_R_pat <A2_abssat, int_hexagon_A2_abssat>; 1233 def : T_R_pat <A2_negsat, int_hexagon_A2_negsat>; 1234 1235 def : T_R_pat <A2_swiz, int_hexagon_A2_swiz>; 1236 1237 def : T_P_pat <A2_sat, int_hexagon_A2_sat>; 1238 def : T_R_pat <A2_sath, int_hexagon_A2_sath>; 1239 def : T_R_pat <A2_satuh, int_hexagon_A2_satuh>; 1240 def : T_R_pat <A2_satub, int_hexagon_A2_satub>; 1241 def : T_R_pat <A2_satb, int_hexagon_A2_satb>; 1242 1243 // Vector arithmetic shift right by immediate with truncate and pack. 1244 def : T_PI_pat<S2_asr_i_svw_trun, int_hexagon_S2_asr_i_svw_trun>; 1245 1246 def : T_RI_pat <S2_asr_i_r, int_hexagon_S2_asr_i_r>; 1247 def : T_RI_pat <S2_lsr_i_r, int_hexagon_S2_lsr_i_r>; 1248 def : T_RI_pat <S2_asl_i_r, int_hexagon_S2_asl_i_r>; 1249 def : T_RI_pat <S2_asr_i_r_rnd, int_hexagon_S2_asr_i_r_rnd>; 1250 def : T_RI_pat <S2_asr_i_r_rnd_goodsyntax, 1251 int_hexagon_S2_asr_i_r_rnd_goodsyntax>; 1252 1253 // Shift left by immediate with saturation. 1254 def : T_RI_pat <S2_asl_i_r_sat, int_hexagon_S2_asl_i_r_sat>; 1255 1256 //===----------------------------------------------------------------------===// 1257 // Template 'def pat' to map tableidx[bhwd] intrinsics to :raw instructions. 1258 //===----------------------------------------------------------------------===// 1259 class S2op_tableidx_pat <Intrinsic IntID, InstHexagon OutputInst, 1260 SDNodeXForm XformImm> 1261 : Pat <(IntID I32:$src1, I32:$src2, u4_0ImmPred:$src3, u5_0ImmPred:$src4), 1262 (OutputInst I32:$src1, I32:$src2, u4_0ImmPred:$src3, 1263 (XformImm u5_0ImmPred:$src4))>; 1264 1265 def SDEC2 : SDNodeXForm<imm, [{ 1266 int32_t V = N->getSExtValue(); 1267 return CurDAG->getTargetConstant(V-2, SDLoc(N), MVT::i32); 1268 }]>; 1269 1270 def SDEC3 : SDNodeXForm<imm, [{ 1271 int32_t V = N->getSExtValue(); 1272 return CurDAG->getTargetConstant(V-3, SDLoc(N), MVT::i32); 1273 }]>; 1274 1275 // Table Index : Extract and insert bits. 1276 // Map to the real hardware instructions after subtracting appropriate 1277 // values from the 4th input operand. Please note that subtraction is not 1278 // needed for int_hexagon_S2_tableidxb_goodsyntax. 1279 1280 def : Pat <(int_hexagon_S2_tableidxb_goodsyntax I32:$src1, I32:$src2, 1281 u4_0ImmPred:$src3, u5_0ImmPred:$src4), 1282 (S2_tableidxb I32:$src1, I32:$src2, 1283 u4_0ImmPred:$src3, u5_0ImmPred:$src4)>; 1284 1285 def : S2op_tableidx_pat <int_hexagon_S2_tableidxh_goodsyntax, S2_tableidxh, 1286 SDEC1>; 1287 def : S2op_tableidx_pat <int_hexagon_S2_tableidxw_goodsyntax, S2_tableidxw, 1288 SDEC2>; 1289 def : S2op_tableidx_pat <int_hexagon_S2_tableidxd_goodsyntax, S2_tableidxd, 1290 SDEC3>; 1291 1292 //******************************************************************* 1293 // STYPE/VH 1294 //******************************************************************* 1295 1296 // Vector absolute value halfwords with and without saturation 1297 // Rdd64=vabsh(Rss64)[:sat] 1298 def : T_P_pat <A2_vabsh, int_hexagon_A2_vabsh>; 1299 def : T_P_pat <A2_vabshsat, int_hexagon_A2_vabshsat>; 1300 1301 // Vector shift halfwords by immediate 1302 // Rdd64=[vaslh/vasrh/vlsrh](Rss64,u4) 1303 def : T_PI_pat <S2_asr_i_vh, int_hexagon_S2_asr_i_vh>; 1304 def : T_PI_pat <S2_lsr_i_vh, int_hexagon_S2_lsr_i_vh>; 1305 def : T_PI_pat <S2_asl_i_vh, int_hexagon_S2_asl_i_vh>; 1306 1307 // Vector shift halfwords by register 1308 // Rdd64=[vaslw/vasrw/vlslw/vlsrw](Rss64,Rt32) 1309 def : T_PR_pat <S2_asr_r_vh, int_hexagon_S2_asr_r_vh>; 1310 def : T_PR_pat <S2_lsr_r_vh, int_hexagon_S2_lsr_r_vh>; 1311 def : T_PR_pat <S2_asl_r_vh, int_hexagon_S2_asl_r_vh>; 1312 def : T_PR_pat <S2_lsl_r_vh, int_hexagon_S2_lsl_r_vh>; 1313 1314 //******************************************************************* 1315 // STYPE/VW 1316 //******************************************************************* 1317 1318 // Vector absolute value words with and without saturation 1319 def : T_P_pat <A2_vabsw, int_hexagon_A2_vabsw>; 1320 def : T_P_pat <A2_vabswsat, int_hexagon_A2_vabswsat>; 1321 1322 // Vector shift words by immediate. 1323 // Rdd64=[vasrw/vlsrw|vaslw](Rss64,u5) 1324 def : T_PI_pat <S2_asr_i_vw, int_hexagon_S2_asr_i_vw>; 1325 def : T_PI_pat <S2_lsr_i_vw, int_hexagon_S2_lsr_i_vw>; 1326 def : T_PI_pat <S2_asl_i_vw, int_hexagon_S2_asl_i_vw>; 1327 1328 // Vector shift words by register. 1329 // Rdd64=[vasrw/vlsrw|vaslw|vlslw](Rss64,Rt32) 1330 def : T_PR_pat <S2_asr_r_vw, int_hexagon_S2_asr_r_vw>; 1331 def : T_PR_pat <S2_lsr_r_vw, int_hexagon_S2_lsr_r_vw>; 1332 def : T_PR_pat <S2_asl_r_vw, int_hexagon_S2_asl_r_vw>; 1333 def : T_PR_pat <S2_lsl_r_vw, int_hexagon_S2_lsl_r_vw>; 1334 1335 // Vector shift words with truncate and pack 1336 def : T_PR_pat <S2_asr_r_svw_trun, int_hexagon_S2_asr_r_svw_trun>; 1337 1338 // Load/store locked. 1339 def : T_R_pat<L2_loadw_locked, int_hexagon_L2_loadw_locked>; 1340 def : T_R_pat<L4_loadd_locked, int_hexagon_L4_loadd_locked>; 1341 1342 def : Pat<(int_hexagon_S2_storew_locked I32:$Rs, I32:$Rt), 1343 (C2_tfrpr (S2_storew_locked I32:$Rs, I32:$Rt))>; 1344 def : Pat<(int_hexagon_S4_stored_locked I32:$Rs, I64:$Rt), 1345 (C2_tfrpr (S4_stored_locked I32:$Rs, I64:$Rt))>; 1346 1347 //******************************************************************* 1348 // ST 1349 //******************************************************************* 1350 1351 class T_stb_pat <InstHexagon MI, Intrinsic IntID, PatLeaf Val> 1352 : Pat<(IntID I32:$Rs, Val:$Rt, I32:$Ru), 1353 (MI I32:$Rs, I32:$Ru, Val:$Rt)>; 1354 1355 def : T_stb_pat <S2_storerh_pbr, int_hexagon_S2_storerh_pbr, I32>; 1356 def : T_stb_pat <S2_storerb_pbr, int_hexagon_S2_storerb_pbr, I32>; 1357 def : T_stb_pat <S2_storeri_pbr, int_hexagon_S2_storeri_pbr, I32>; 1358 def : T_stb_pat <S2_storerf_pbr, int_hexagon_S2_storerf_pbr, I32>; 1359 def : T_stb_pat <S2_storerd_pbr, int_hexagon_S2_storerd_pbr, I64>; 1360 1361 class T_stc_pat <InstHexagon MI, Intrinsic IntID, PatLeaf Imm, PatLeaf Val> 1362 : Pat<(IntID I32:$Rs, Val:$Rt, I32:$Ru, Imm:$s), 1363 (MI I32:$Rs, Imm:$s, I32:$Ru, Val:$Rt)>; 1364 1365 def: T_stc_pat<S2_storerb_pci, int_hexagon_circ_stb, s4_0ImmPred, I32>; 1366 def: T_stc_pat<S2_storerh_pci, int_hexagon_circ_sth, s4_1ImmPred, I32>; 1367 def: T_stc_pat<S2_storeri_pci, int_hexagon_circ_stw, s4_2ImmPred, I32>; 1368 def: T_stc_pat<S2_storerd_pci, int_hexagon_circ_std, s4_3ImmPred, I64>; 1369 def: T_stc_pat<S2_storerf_pci, int_hexagon_circ_sthhi, s4_1ImmPred, I32>; 1370 1371 multiclass MaskedStore <InstHexagon MI, Intrinsic IntID> { 1372 def : Pat<(IntID HvxQR:$src1, IntRegs:$src2, HvxVR:$src3), 1373 (MI HvxQR:$src1, IntRegs:$src2, #0, HvxVR:$src3)>; 1374 def : Pat<(!cast<Intrinsic>(IntID#"_128B") HvxQR:$src1, IntRegs:$src2, 1375 HvxVR:$src3), 1376 (MI HvxQR:$src1, IntRegs:$src2, #0, HvxVR:$src3)>; 1377 } 1378 1379 defm : MaskedStore <V6_vS32b_qpred_ai, int_hexagon_V6_vmaskedstoreq>; 1380 defm : MaskedStore <V6_vS32b_nqpred_ai, int_hexagon_V6_vmaskedstorenq>; 1381 defm : MaskedStore <V6_vS32b_nt_qpred_ai, int_hexagon_V6_vmaskedstorentq>; 1382 defm : MaskedStore <V6_vS32b_nt_nqpred_ai, int_hexagon_V6_vmaskedstorentnq>; 1383 1384 defm : MaskedStore <V6_vS32b_qpred_ai, int_hexagon_V6_vS32b_qpred_ai>; 1385 defm : MaskedStore <V6_vS32b_nqpred_ai, int_hexagon_V6_vS32b_nqpred_ai>; 1386 defm : MaskedStore <V6_vS32b_nt_qpred_ai, int_hexagon_V6_vS32b_nt_qpred_ai>; 1387 defm : MaskedStore <V6_vS32b_nt_nqpred_ai, int_hexagon_V6_vS32b_nt_nqpred_ai>; 1388 1389 //******************************************************************* 1390 // SYSTEM 1391 //******************************************************************* 1392 1393 def: T_R_pat<Y2_dccleana, int_hexagon_Y2_dccleana>; 1394 def: T_R_pat<Y2_dccleaninva, int_hexagon_Y2_dccleaninva>; 1395 def: T_R_pat<Y2_dcinva, int_hexagon_Y2_dcinva>; 1396 def: T_R_pat<Y2_dczeroa, int_hexagon_Y2_dczeroa>; 1397 1398 def: T_RR_pat<Y4_l2fetch, int_hexagon_Y4_l2fetch>; 1399 def: T_RP_pat<Y5_l2fetch, int_hexagon_Y5_l2fetch>; 1400 1401 include "HexagonIntrinsicsV3.td" 1402 include "HexagonIntrinsicsV4.td" 1403 include "HexagonIntrinsicsV5.td" 1404 include "HexagonIntrinsicsV60.td" 1405