1 //=- HexagonInstrInfoV4.td - Target Desc. for Hexagon Target -*- tablegen -*-=// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file describes the Hexagon V4 instructions in TableGen format. 11 // 12 //===----------------------------------------------------------------------===// 13 14 let neverHasSideEffects = 1 in 15 def IMMEXT : Immext<(outs), (ins), 16 "/* immext #... */", 17 []>, 18 Requires<[HasV4T]>; 19 20 // Hexagon V4 Architecture spec defines 8 instruction classes: 21 // LD ST ALU32 XTYPE J JR MEMOP NV CR SYSTEM(system is not implemented in the 22 // compiler) 23 24 // LD Instructions: 25 // ======================================== 26 // Loads (8/16/32/64 bit) 27 // Deallocframe 28 29 // ST Instructions: 30 // ======================================== 31 // Stores (8/16/32/64 bit) 32 // Allocframe 33 34 // ALU32 Instructions: 35 // ======================================== 36 // Arithmetic / Logical (32 bit) 37 // Vector Halfword 38 39 // XTYPE Instructions (32/64 bit): 40 // ======================================== 41 // Arithmetic, Logical, Bit Manipulation 42 // Multiply (Integer, Fractional, Complex) 43 // Permute / Vector Permute Operations 44 // Predicate Operations 45 // Shift / Shift with Add/Sub/Logical 46 // Vector Byte ALU 47 // Vector Halfword (ALU, Shift, Multiply) 48 // Vector Word (ALU, Shift) 49 50 // J Instructions: 51 // ======================================== 52 // Jump/Call PC-relative 53 54 // JR Instructions: 55 // ======================================== 56 // Jump/Call Register 57 58 // MEMOP Instructions: 59 // ======================================== 60 // Operation on memory (8/16/32 bit) 61 62 // NV Instructions: 63 // ======================================== 64 // New-value Jumps 65 // New-value Stores 66 67 // CR Instructions: 68 // ======================================== 69 // Control-Register Transfers 70 // Hardware Loop Setup 71 // Predicate Logicals & Reductions 72 73 // SYSTEM Instructions (not implemented in the compiler): 74 // ======================================== 75 // Prefetch 76 // Cache Maintenance 77 // Bus Operations 78 79 80 //===----------------------------------------------------------------------===// 81 // ALU32 + 82 //===----------------------------------------------------------------------===// 83 84 // Shift halfword. 85 86 let isPredicated = 1 in 87 def ASLH_cPt_V4 : ALU32_rr<(outs IntRegs:$dst), 88 (ins PredRegs:$src1, IntRegs:$src2), 89 "if ($src1) $dst = aslh($src2)", 90 []>, 91 Requires<[HasV4T]>; 92 93 let isPredicated = 1 in 94 def ASLH_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 95 (ins PredRegs:$src1, IntRegs:$src2), 96 "if (!$src1) $dst = aslh($src2)", 97 []>, 98 Requires<[HasV4T]>; 99 100 let isPredicated = 1 in 101 def ASLH_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst), 102 (ins PredRegs:$src1, IntRegs:$src2), 103 "if ($src1.new) $dst = aslh($src2)", 104 []>, 105 Requires<[HasV4T]>; 106 107 let isPredicated = 1 in 108 def ASLH_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 109 (ins PredRegs:$src1, IntRegs:$src2), 110 "if (!$src1.new) $dst = aslh($src2)", 111 []>, 112 Requires<[HasV4T]>; 113 114 let isPredicated = 1 in 115 def ASRH_cPt_V4 : ALU32_rr<(outs IntRegs:$dst), 116 (ins PredRegs:$src1, IntRegs:$src2), 117 "if ($src1) $dst = asrh($src2)", 118 []>, 119 Requires<[HasV4T]>; 120 121 let isPredicated = 1 in 122 def ASRH_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 123 (ins PredRegs:$src1, IntRegs:$src2), 124 "if (!$src1) $dst = asrh($src2)", 125 []>, 126 Requires<[HasV4T]>; 127 128 let isPredicated = 1 in 129 def ASRH_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst), 130 (ins PredRegs:$src1, IntRegs:$src2), 131 "if ($src1.new) $dst = asrh($src2)", 132 []>, 133 Requires<[HasV4T]>; 134 135 let isPredicated = 1 in 136 def ASRH_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 137 (ins PredRegs:$src1, IntRegs:$src2), 138 "if (!$src1.new) $dst = asrh($src2)", 139 []>, 140 Requires<[HasV4T]>; 141 142 // Sign extend. 143 144 let isPredicated = 1 in 145 def SXTB_cPt_V4 : ALU32_rr<(outs IntRegs:$dst), 146 (ins PredRegs:$src1, IntRegs:$src2), 147 "if ($src1) $dst = sxtb($src2)", 148 []>, 149 Requires<[HasV4T]>; 150 151 let isPredicated = 1 in 152 def SXTB_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 153 (ins PredRegs:$src1, IntRegs:$src2), 154 "if (!$src1) $dst = sxtb($src2)", 155 []>, 156 Requires<[HasV4T]>; 157 158 let isPredicated = 1 in 159 def SXTB_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst), 160 (ins PredRegs:$src1, IntRegs:$src2), 161 "if ($src1.new) $dst = sxtb($src2)", 162 []>, 163 Requires<[HasV4T]>; 164 165 let isPredicated = 1 in 166 def SXTB_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 167 (ins PredRegs:$src1, IntRegs:$src2), 168 "if (!$src1.new) $dst = sxtb($src2)", 169 []>, 170 Requires<[HasV4T]>; 171 172 173 let isPredicated = 1 in 174 def SXTH_cPt_V4 : ALU32_rr<(outs IntRegs:$dst), 175 (ins PredRegs:$src1, IntRegs:$src2), 176 "if ($src1) $dst = sxth($src2)", 177 []>, 178 Requires<[HasV4T]>; 179 180 let isPredicated = 1 in 181 def SXTH_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 182 (ins PredRegs:$src1, IntRegs:$src2), 183 "if (!$src1) $dst = sxth($src2)", 184 []>, 185 Requires<[HasV4T]>; 186 187 let isPredicated = 1 in 188 def SXTH_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst), 189 (ins PredRegs:$src1, IntRegs:$src2), 190 "if ($src1.new) $dst = sxth($src2)", 191 []>, 192 Requires<[HasV4T]>; 193 194 let isPredicated = 1 in 195 def SXTH_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 196 (ins PredRegs:$src1, IntRegs:$src2), 197 "if (!$src1.new) $dst = sxth($src2)", 198 []>, 199 Requires<[HasV4T]>; 200 201 // Zero exten. 202 203 let neverHasSideEffects = 1, isPredicated = 1 in 204 def ZXTB_cPt_V4 : ALU32_rr<(outs IntRegs:$dst), 205 (ins PredRegs:$src1, IntRegs:$src2), 206 "if ($src1) $dst = zxtb($src2)", 207 []>, 208 Requires<[HasV4T]>; 209 210 let neverHasSideEffects = 1, isPredicated = 1 in 211 def ZXTB_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 212 (ins PredRegs:$src1, IntRegs:$src2), 213 "if (!$src1) $dst = zxtb($src2)", 214 []>, 215 Requires<[HasV4T]>; 216 217 let neverHasSideEffects = 1, isPredicated = 1 in 218 def ZXTB_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst), 219 (ins PredRegs:$src1, IntRegs:$src2), 220 "if ($src1.new) $dst = zxtb($src2)", 221 []>, 222 Requires<[HasV4T]>; 223 224 let neverHasSideEffects = 1, isPredicated = 1 in 225 def ZXTB_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 226 (ins PredRegs:$src1, IntRegs:$src2), 227 "if (!$src1.new) $dst = zxtb($src2)", 228 []>, 229 Requires<[HasV4T]>; 230 231 let neverHasSideEffects = 1, isPredicated = 1 in 232 def ZXTH_cPt_V4 : ALU32_rr<(outs IntRegs:$dst), 233 (ins PredRegs:$src1, IntRegs:$src2), 234 "if ($src1) $dst = zxth($src2)", 235 []>, 236 Requires<[HasV4T]>; 237 238 let neverHasSideEffects = 1, isPredicated = 1 in 239 def ZXTH_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 240 (ins PredRegs:$src1, IntRegs:$src2), 241 "if (!$src1) $dst = zxth($src2)", 242 []>, 243 Requires<[HasV4T]>; 244 245 let neverHasSideEffects = 1, isPredicated = 1 in 246 def ZXTH_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst), 247 (ins PredRegs:$src1, IntRegs:$src2), 248 "if ($src1.new) $dst = zxth($src2)", 249 []>, 250 Requires<[HasV4T]>; 251 252 let neverHasSideEffects = 1, isPredicated = 1 in 253 def ZXTH_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), 254 (ins PredRegs:$src1, IntRegs:$src2), 255 "if (!$src1.new) $dst = zxth($src2)", 256 []>, 257 Requires<[HasV4T]>; 258 259 // Generate frame index addresses. 260 let neverHasSideEffects = 1, isReMaterializable = 1 in 261 def TFR_FI_immext_V4 : ALU32_ri<(outs IntRegs:$dst), 262 (ins IntRegs:$src1, s32Imm:$offset), 263 "$dst = add($src1, ##$offset)", 264 []>, 265 Requires<[HasV4T]>; 266 267 268 //===----------------------------------------------------------------------===// 269 // ALU32 - 270 //===----------------------------------------------------------------------===// 271 272 273 //===----------------------------------------------------------------------===// 274 // ALU32/PERM + 275 //===----------------------------------------------------------------------===// 276 277 // Combine 278 // Rdd=combine(Rs, #s8) 279 let neverHasSideEffects = 1 in 280 def COMBINE_ri_V4 : ALU32_ri<(outs DoubleRegs:$dst), 281 (ins IntRegs:$src1, s8Imm:$src2), 282 "$dst = combine($src1, #$src2)", 283 []>, 284 Requires<[HasV4T]>; 285 // Rdd=combine(#s8, Rs) 286 let neverHasSideEffects = 1 in 287 def COMBINE_ir_V4 : ALU32_ir<(outs DoubleRegs:$dst), 288 (ins s8Imm:$src1, IntRegs:$src2), 289 "$dst = combine(#$src1, $src2)", 290 []>, 291 Requires<[HasV4T]>; 292 //===----------------------------------------------------------------------===// 293 // ALU32/PERM + 294 //===----------------------------------------------------------------------===// 295 296 //===----------------------------------------------------------------------===// 297 // LD + 298 //===----------------------------------------------------------------------===// 299 // 300 // These absolute set addressing mode instructions accept immediate as 301 // an operand. We have duplicated these patterns to take global address. 302 303 let neverHasSideEffects = 1 in 304 def LDrid_abs_setimm_V4 : LDInst2<(outs DoubleRegs:$dst1, IntRegs:$dst2), 305 (ins u6Imm:$addr), 306 "$dst1 = memd($dst2=#$addr)", 307 []>, 308 Requires<[HasV4T]>; 309 310 // Rd=memb(Re=#U6) 311 let neverHasSideEffects = 1 in 312 def LDrib_abs_setimm_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2), 313 (ins u6Imm:$addr), 314 "$dst1 = memb($dst2=#$addr)", 315 []>, 316 Requires<[HasV4T]>; 317 318 // Rd=memh(Re=#U6) 319 let neverHasSideEffects = 1 in 320 def LDrih_abs_setimm_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2), 321 (ins u6Imm:$addr), 322 "$dst1 = memh($dst2=#$addr)", 323 []>, 324 Requires<[HasV4T]>; 325 326 // Rd=memub(Re=#U6) 327 let neverHasSideEffects = 1 in 328 def LDriub_abs_setimm_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2), 329 (ins u6Imm:$addr), 330 "$dst1 = memub($dst2=#$addr)", 331 []>, 332 Requires<[HasV4T]>; 333 334 // Rd=memuh(Re=#U6) 335 let neverHasSideEffects = 1 in 336 def LDriuh_abs_setimm_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2), 337 (ins u6Imm:$addr), 338 "$dst1 = memuh($dst2=#$addr)", 339 []>, 340 Requires<[HasV4T]>; 341 342 // Rd=memw(Re=#U6) 343 let neverHasSideEffects = 1 in 344 def LDriw_abs_setimm_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2), 345 (ins u6Imm:$addr), 346 "$dst1 = memw($dst2=#$addr)", 347 []>, 348 Requires<[HasV4T]>; 349 350 // Following patterns are defined for absolute set addressing mode 351 // instruction which take global address as operand. 352 let neverHasSideEffects = 1 in 353 def LDrid_abs_set_V4 : LDInst2<(outs DoubleRegs:$dst1, IntRegs:$dst2), 354 (ins globaladdress:$addr), 355 "$dst1 = memd($dst2=##$addr)", 356 []>, 357 Requires<[HasV4T]>; 358 359 // Rd=memb(Re=#U6) 360 let neverHasSideEffects = 1 in 361 def LDrib_abs_set_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2), 362 (ins globaladdress:$addr), 363 "$dst1 = memb($dst2=##$addr)", 364 []>, 365 Requires<[HasV4T]>; 366 367 // Rd=memh(Re=#U6) 368 let neverHasSideEffects = 1 in 369 def LDrih_abs_set_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2), 370 (ins globaladdress:$addr), 371 "$dst1 = memh($dst2=##$addr)", 372 []>, 373 Requires<[HasV4T]>; 374 375 // Rd=memub(Re=#U6) 376 let neverHasSideEffects = 1 in 377 def LDriub_abs_set_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2), 378 (ins globaladdress:$addr), 379 "$dst1 = memub($dst2=##$addr)", 380 []>, 381 Requires<[HasV4T]>; 382 383 // Rd=memuh(Re=#U6) 384 let neverHasSideEffects = 1 in 385 def LDriuh_abs_set_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2), 386 (ins globaladdress:$addr), 387 "$dst1 = memuh($dst2=##$addr)", 388 []>, 389 Requires<[HasV4T]>; 390 391 // Rd=memw(Re=#U6) 392 let neverHasSideEffects = 1 in 393 def LDriw_abs_set_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2), 394 (ins globaladdress:$addr), 395 "$dst1 = memw($dst2=##$addr)", 396 []>, 397 Requires<[HasV4T]>; 398 399 // Load doubleword. 400 // 401 // Make sure that in post increment load, the first operand is always the post 402 // increment operand. 403 // 404 // Rdd=memd(Rs+Rt<<#u2) 405 // Special case pattern for indexed load without offset which is easier to 406 // match. AddedComplexity of this pattern should be lower than base+offset load 407 // and lower yet than the more generic version with offset/shift below 408 // Similar approach is taken for all other base+index loads. 409 let AddedComplexity = 10, isPredicable = 1 in 410 def LDrid_indexed_V4 : LDInst<(outs DoubleRegs:$dst), 411 (ins IntRegs:$src1, IntRegs:$src2), 412 "$dst=memd($src1+$src2<<#0)", 413 [(set (i64 DoubleRegs:$dst), 414 (i64 (load (add (i32 IntRegs:$src1), 415 (i32 IntRegs:$src2)))))]>, 416 Requires<[HasV4T]>; 417 418 let AddedComplexity = 40, isPredicable = 1 in 419 def LDrid_indexed_shl_V4 : LDInst<(outs DoubleRegs:$dst), 420 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), 421 "$dst=memd($src1+$src2<<#$offset)", 422 [(set (i64 DoubleRegs:$dst), 423 (i64 (load (add (i32 IntRegs:$src1), 424 (shl (i32 IntRegs:$src2), 425 u2ImmPred:$offset)))))]>, 426 Requires<[HasV4T]>; 427 428 //// Load doubleword conditionally. 429 // if ([!]Pv[.new]) Rd=memd(Rs+Rt<<#u2) 430 // if (Pv) Rd=memd(Rs+Rt<<#u2) 431 let AddedComplexity = 15, isPredicated = 1 in 432 def LDrid_indexed_cPt_V4 : LDInst2<(outs DoubleRegs:$dst), 433 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 434 "if ($src1) $dst=memd($src2+$src3<<#0)", 435 []>, 436 Requires<[HasV4T]>; 437 438 // if (Pv.new) Rd=memd(Rs+Rt<<#u2) 439 let AddedComplexity = 15, isPredicated = 1 in 440 def LDrid_indexed_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst), 441 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 442 "if ($src1.new) $dst=memd($src2+$src3<<#0)", 443 []>, 444 Requires<[HasV4T]>; 445 446 // if (!Pv) Rd=memd(Rs+Rt<<#u2) 447 let AddedComplexity = 15, isPredicated = 1 in 448 def LDrid_indexed_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst), 449 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 450 "if (!$src1) $dst=memd($src2+$src3<<#0)", 451 []>, 452 Requires<[HasV4T]>; 453 454 // if (!Pv.new) Rd=memd(Rs+Rt<<#u2) 455 let AddedComplexity = 15, isPredicated = 1 in 456 def LDrid_indexed_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst), 457 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 458 "if (!$src1.new) $dst=memd($src2+$src3<<#0)", 459 []>, 460 Requires<[HasV4T]>; 461 462 // if (Pv) Rd=memd(Rs+Rt<<#u2) 463 let AddedComplexity = 45, isPredicated = 1 in 464 def LDrid_indexed_shl_cPt_V4 : LDInst2<(outs DoubleRegs:$dst), 465 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 466 u2Imm:$offset), 467 "if ($src1) $dst=memd($src2+$src3<<#$offset)", 468 []>, 469 Requires<[HasV4T]>; 470 471 // if (Pv.new) Rd=memd(Rs+Rt<<#u2) 472 let AddedComplexity = 45, isPredicated = 1 in 473 def LDrid_indexed_shl_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst), 474 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 475 u2Imm:$offset), 476 "if ($src1.new) $dst=memd($src2+$src3<<#$offset)", 477 []>, 478 Requires<[HasV4T]>; 479 480 // if (!Pv) Rd=memd(Rs+Rt<<#u2) 481 let AddedComplexity = 45, isPredicated = 1 in 482 def LDrid_indexed_shl_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst), 483 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 484 u2Imm:$offset), 485 "if (!$src1) $dst=memd($src2+$src3<<#$offset)", 486 []>, 487 Requires<[HasV4T]>; 488 489 // if (!Pv.new) Rd=memd(Rs+Rt<<#u2) 490 let AddedComplexity = 45, isPredicated = 1 in 491 def LDrid_indexed_shl_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst), 492 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 493 u2Imm:$offset), 494 "if (!$src1.new) $dst=memd($src2+$src3<<#$offset)", 495 []>, 496 Requires<[HasV4T]>; 497 498 // Rdd=memd(Rt<<#u2+#U6) 499 500 //// Load byte. 501 // Rd=memb(Rs+Rt<<#u2) 502 let AddedComplexity = 10, isPredicable = 1 in 503 def LDrib_indexed_V4 : LDInst<(outs IntRegs:$dst), 504 (ins IntRegs:$src1, IntRegs:$src2), 505 "$dst=memb($src1+$src2<<#0)", 506 [(set (i32 IntRegs:$dst), 507 (i32 (sextloadi8 (add (i32 IntRegs:$src1), 508 (i32 IntRegs:$src2)))))]>, 509 Requires<[HasV4T]>; 510 511 let AddedComplexity = 10, isPredicable = 1 in 512 def LDriub_indexed_V4 : LDInst<(outs IntRegs:$dst), 513 (ins IntRegs:$src1, IntRegs:$src2), 514 "$dst=memub($src1+$src2<<#0)", 515 [(set (i32 IntRegs:$dst), 516 (i32 (zextloadi8 (add (i32 IntRegs:$src1), 517 (i32 IntRegs:$src2)))))]>, 518 Requires<[HasV4T]>; 519 520 let AddedComplexity = 10, isPredicable = 1 in 521 def LDriub_ae_indexed_V4 : LDInst<(outs IntRegs:$dst), 522 (ins IntRegs:$src1, IntRegs:$src2), 523 "$dst=memub($src1+$src2<<#0)", 524 [(set (i32 IntRegs:$dst), 525 (i32 (extloadi8 (add (i32 IntRegs:$src1), 526 (i32 IntRegs:$src2)))))]>, 527 Requires<[HasV4T]>; 528 529 let AddedComplexity = 40, isPredicable = 1 in 530 def LDrib_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), 531 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), 532 "$dst=memb($src1+$src2<<#$offset)", 533 [(set (i32 IntRegs:$dst), 534 (i32 (sextloadi8 (add (i32 IntRegs:$src1), 535 (shl (i32 IntRegs:$src2), 536 u2ImmPred:$offset)))))]>, 537 Requires<[HasV4T]>; 538 539 let AddedComplexity = 40, isPredicable = 1 in 540 def LDriub_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), 541 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), 542 "$dst=memub($src1+$src2<<#$offset)", 543 [(set (i32 IntRegs:$dst), 544 (i32 (zextloadi8 (add (i32 IntRegs:$src1), 545 (shl (i32 IntRegs:$src2), 546 u2ImmPred:$offset)))))]>, 547 Requires<[HasV4T]>; 548 549 let AddedComplexity = 40, isPredicable = 1 in 550 def LDriub_ae_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), 551 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), 552 "$dst=memub($src1+$src2<<#$offset)", 553 [(set (i32 IntRegs:$dst), 554 (i32 (extloadi8 (add (i32 IntRegs:$src1), 555 (shl (i32 IntRegs:$src2), 556 u2ImmPred:$offset)))))]>, 557 Requires<[HasV4T]>; 558 559 //// Load byte conditionally. 560 // if ([!]Pv[.new]) Rd=memb(Rs+Rt<<#u2) 561 // if (Pv) Rd=memb(Rs+Rt<<#u2) 562 let AddedComplexity = 15, isPredicated = 1 in 563 def LDrib_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst), 564 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 565 "if ($src1) $dst=memb($src2+$src3<<#0)", 566 []>, 567 Requires<[HasV4T]>; 568 569 // if (Pv.new) Rd=memb(Rs+Rt<<#u2) 570 let AddedComplexity = 15, isPredicated = 1 in 571 def LDrib_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 572 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 573 "if ($src1.new) $dst=memb($src2+$src3<<#0)", 574 []>, 575 Requires<[HasV4T]>; 576 577 // if (!Pv) Rd=memb(Rs+Rt<<#u2) 578 let AddedComplexity = 15, isPredicated = 1 in 579 def LDrib_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 580 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 581 "if (!$src1) $dst=memb($src2+$src3<<#0)", 582 []>, 583 Requires<[HasV4T]>; 584 585 // if (!Pv.new) Rd=memb(Rs+Rt<<#u2) 586 let AddedComplexity = 15, isPredicated = 1 in 587 def LDrib_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 588 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 589 "if (!$src1.new) $dst=memb($src2+$src3<<#0)", 590 []>, 591 Requires<[HasV4T]>; 592 593 // if (Pv) Rd=memb(Rs+Rt<<#u2) 594 let AddedComplexity = 45, isPredicated = 1 in 595 def LDrib_indexed_shl_cPt_V4 : LDInst2<(outs IntRegs:$dst), 596 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 597 u2Imm:$offset), 598 "if ($src1) $dst=memb($src2+$src3<<#$offset)", 599 []>, 600 Requires<[HasV4T]>; 601 602 // if (Pv.new) Rd=memb(Rs+Rt<<#u2) 603 let AddedComplexity = 45, isPredicated = 1 in 604 def LDrib_indexed_shl_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 605 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 606 u2Imm:$offset), 607 "if ($src1.new) $dst=memb($src2+$src3<<#$offset)", 608 []>, 609 Requires<[HasV4T]>; 610 611 // if (!Pv) Rd=memb(Rs+Rt<<#u2) 612 let AddedComplexity = 45, isPredicated = 1 in 613 def LDrib_indexed_shl_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 614 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 615 u2Imm:$offset), 616 "if (!$src1) $dst=memb($src2+$src3<<#$offset)", 617 []>, 618 Requires<[HasV4T]>; 619 620 // if (!Pv.new) Rd=memb(Rs+Rt<<#u2) 621 let AddedComplexity = 45, isPredicated = 1 in 622 def LDrib_indexed_shl_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 623 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 624 u2Imm:$offset), 625 "if (!$src1.new) $dst=memb($src2+$src3<<#$offset)", 626 []>, 627 Requires<[HasV4T]>; 628 629 //// Load unsigned byte conditionally. 630 // if ([!]Pv[.new]) Rd=memub(Rs+Rt<<#u2) 631 // if (Pv) Rd=memub(Rs+Rt<<#u2) 632 let AddedComplexity = 15, isPredicated = 1 in 633 def LDriub_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst), 634 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 635 "if ($src1) $dst=memub($src2+$src3<<#0)", 636 []>, 637 Requires<[HasV4T]>; 638 639 // if (Pv.new) Rd=memub(Rs+Rt<<#u2) 640 let AddedComplexity = 15, isPredicated = 1 in 641 def LDriub_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 642 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 643 "if ($src1.new) $dst=memub($src2+$src3<<#0)", 644 []>, 645 Requires<[HasV4T]>; 646 647 // if (!Pv) Rd=memub(Rs+Rt<<#u2) 648 let AddedComplexity = 15, isPredicated = 1 in 649 def LDriub_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 650 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 651 "if (!$src1) $dst=memub($src2+$src3<<#0)", 652 []>, 653 Requires<[HasV4T]>; 654 655 // if (!Pv.new) Rd=memub(Rs+Rt<<#u2) 656 let AddedComplexity = 15, isPredicated = 1 in 657 def LDriub_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 658 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 659 "if (!$src1.new) $dst=memub($src2+$src3<<#0)", 660 []>, 661 Requires<[HasV4T]>; 662 663 // if (Pv) Rd=memub(Rs+Rt<<#u2) 664 let AddedComplexity = 45, isPredicated = 1 in 665 def LDriub_indexed_shl_cPt_V4 : LDInst2<(outs IntRegs:$dst), 666 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 667 u2Imm:$offset), 668 "if ($src1) $dst=memub($src2+$src3<<#$offset)", 669 []>, 670 Requires<[HasV4T]>; 671 672 // if (Pv.new) Rd=memub(Rs+Rt<<#u2) 673 let AddedComplexity = 45, isPredicated = 1 in 674 def LDriub_indexed_shl_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 675 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 676 u2Imm:$offset), 677 "if ($src1.new) $dst=memub($src2+$src3<<#$offset)", 678 []>, 679 Requires<[HasV4T]>; 680 681 // if (!Pv) Rd=memub(Rs+Rt<<#u2) 682 let AddedComplexity = 45, isPredicated = 1 in 683 def LDriub_indexed_shl_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 684 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 685 u2Imm:$offset), 686 "if (!$src1) $dst=memub($src2+$src3<<#$offset)", 687 []>, 688 Requires<[HasV4T]>; 689 690 // if (!Pv.new) Rd=memub(Rs+Rt<<#u2) 691 let AddedComplexity = 45, isPredicated = 1 in 692 def LDriub_indexed_shl_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 693 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 694 u2Imm:$offset), 695 "if (!$src1.new) $dst=memub($src2+$src3<<#$offset)", 696 []>, 697 Requires<[HasV4T]>; 698 699 // Rd=memb(Rt<<#u2+#U6) 700 701 //// Load halfword 702 // Rd=memh(Rs+Rt<<#u2) 703 let AddedComplexity = 10, isPredicable = 1 in 704 def LDrih_indexed_V4 : LDInst<(outs IntRegs:$dst), 705 (ins IntRegs:$src1, IntRegs:$src2), 706 "$dst=memh($src1+$src2<<#0)", 707 [(set (i32 IntRegs:$dst), 708 (i32 (sextloadi16 (add (i32 IntRegs:$src1), 709 (i32 IntRegs:$src2)))))]>, 710 Requires<[HasV4T]>; 711 712 let AddedComplexity = 10, isPredicable = 1 in 713 def LDriuh_indexed_V4 : LDInst<(outs IntRegs:$dst), 714 (ins IntRegs:$src1, IntRegs:$src2), 715 "$dst=memuh($src1+$src2<<#0)", 716 [(set (i32 IntRegs:$dst), 717 (i32 (zextloadi16 (add (i32 IntRegs:$src1), 718 (i32 IntRegs:$src2)))))]>, 719 Requires<[HasV4T]>; 720 721 let AddedComplexity = 10, isPredicable = 1 in 722 def LDriuh_ae_indexed_V4 : LDInst<(outs IntRegs:$dst), 723 (ins IntRegs:$src1, IntRegs:$src2), 724 "$dst=memuh($src1+$src2<<#0)", 725 [(set (i32 IntRegs:$dst), 726 (i32 (extloadi16 (add (i32 IntRegs:$src1), 727 (i32 IntRegs:$src2)))))]>, 728 Requires<[HasV4T]>; 729 730 // Rd=memh(Rs+Rt<<#u2) 731 let AddedComplexity = 40, isPredicable = 1 in 732 def LDrih_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), 733 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), 734 "$dst=memh($src1+$src2<<#$offset)", 735 [(set (i32 IntRegs:$dst), 736 (i32 (sextloadi16 (add (i32 IntRegs:$src1), 737 (shl (i32 IntRegs:$src2), 738 u2ImmPred:$offset)))))]>, 739 Requires<[HasV4T]>; 740 741 let AddedComplexity = 40, isPredicable = 1 in 742 def LDriuh_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), 743 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), 744 "$dst=memuh($src1+$src2<<#$offset)", 745 [(set (i32 IntRegs:$dst), 746 (i32 (zextloadi16 (add (i32 IntRegs:$src1), 747 (shl (i32 IntRegs:$src2), 748 u2ImmPred:$offset)))))]>, 749 Requires<[HasV4T]>; 750 751 let AddedComplexity = 40, isPredicable = 1 in 752 def LDriuh_ae_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), 753 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), 754 "$dst=memuh($src1+$src2<<#$offset)", 755 [(set (i32 IntRegs:$dst), 756 (i32 (extloadi16 (add (i32 IntRegs:$src1), 757 (shl (i32 IntRegs:$src2), 758 u2ImmPred:$offset)))))]>, 759 Requires<[HasV4T]>; 760 761 //// Load halfword conditionally. 762 // if ([!]Pv[.new]) Rd=memh(Rs+Rt<<#u2) 763 // if (Pv) Rd=memh(Rs+Rt<<#u2) 764 let AddedComplexity = 15, isPredicated = 1 in 765 def LDrih_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst), 766 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 767 "if ($src1) $dst=memh($src2+$src3<<#0)", 768 []>, 769 Requires<[HasV4T]>; 770 771 // if (Pv.new) Rd=memh(Rs+Rt<<#u2) 772 let AddedComplexity = 15, isPredicated = 1 in 773 def LDrih_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 774 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 775 "if ($src1.new) $dst=memh($src2+$src3<<#0)", 776 []>, 777 Requires<[HasV4T]>; 778 779 // if (!Pv) Rd=memh(Rs+Rt<<#u2) 780 let AddedComplexity = 15, isPredicated = 1 in 781 def LDrih_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 782 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 783 "if (!$src1) $dst=memh($src2+$src3<<#0)", 784 []>, 785 Requires<[HasV4T]>; 786 787 // if (!Pv.new) Rd=memh(Rs+Rt<<#u2) 788 let AddedComplexity = 15, isPredicated = 1 in 789 def LDrih_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 790 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 791 "if (!$src1.new) $dst=memh($src2+$src3<<#0)", 792 []>, 793 Requires<[HasV4T]>; 794 795 // if (Pv) Rd=memh(Rs+Rt<<#u2) 796 let AddedComplexity = 45, isPredicated = 1 in 797 def LDrih_indexed_shl_cPt_V4 : LDInst2<(outs IntRegs:$dst), 798 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 799 u2Imm:$offset), 800 "if ($src1) $dst=memh($src2+$src3<<#$offset)", 801 []>, 802 Requires<[HasV4T]>; 803 804 // if (Pv.new) Rd=memh(Rs+Rt<<#u2) 805 let AddedComplexity = 45, isPredicated = 1 in 806 def LDrih_indexed_shl_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 807 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 808 u2Imm:$offset), 809 "if ($src1.new) $dst=memh($src2+$src3<<#$offset)", 810 []>, 811 Requires<[HasV4T]>; 812 813 // if (!Pv) Rd=memh(Rs+Rt<<#u2) 814 let AddedComplexity = 45, isPredicated = 1 in 815 def LDrih_indexed_shl_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 816 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 817 u2Imm:$offset), 818 "if (!$src1) $dst=memh($src2+$src3<<#$offset)", 819 []>, 820 Requires<[HasV4T]>; 821 822 // if (!Pv.new) Rd=memh(Rs+Rt<<#u2) 823 let AddedComplexity = 45, isPredicated = 1 in 824 def LDrih_indexed_shl_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 825 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 826 u2Imm:$offset), 827 "if (!$src1.new) $dst=memh($src2+$src3<<#$offset)", 828 []>, 829 Requires<[HasV4T]>; 830 831 //// Load unsigned halfword conditionally. 832 // if ([!]Pv[.new]) Rd=memuh(Rs+Rt<<#u2) 833 // if (Pv) Rd=memuh(Rs+Rt<<#u2) 834 let AddedComplexity = 15, isPredicated = 1 in 835 def LDriuh_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst), 836 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 837 "if ($src1) $dst=memuh($src2+$src3<<#0)", 838 []>, 839 Requires<[HasV4T]>; 840 841 // if (Pv.new) Rd=memuh(Rs+Rt<<#u2) 842 let AddedComplexity = 15, isPredicated = 1 in 843 def LDriuh_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 844 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 845 "if ($src1.new) $dst=memuh($src2+$src3<<#0)", 846 []>, 847 Requires<[HasV4T]>; 848 849 // if (!Pv) Rd=memuh(Rs+Rt<<#u2) 850 let AddedComplexity = 15, isPredicated = 1 in 851 def LDriuh_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 852 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 853 "if (!$src1) $dst=memuh($src2+$src3<<#0)", 854 []>, 855 Requires<[HasV4T]>; 856 857 // if (!Pv.new) Rd=memuh(Rs+Rt<<#u2) 858 let AddedComplexity = 15, isPredicated = 1 in 859 def LDriuh_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 860 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 861 "if (!$src1.new) $dst=memuh($src2+$src3<<#0)", 862 []>, 863 Requires<[HasV4T]>; 864 865 // if (Pv) Rd=memuh(Rs+Rt<<#u2) 866 let AddedComplexity = 45, isPredicated = 1 in 867 def LDriuh_indexed_shl_cPt_V4 : LDInst2<(outs IntRegs:$dst), 868 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 869 u2Imm:$offset), 870 "if ($src1) $dst=memuh($src2+$src3<<#$offset)", 871 []>, 872 Requires<[HasV4T]>; 873 874 // if (Pv.new) Rd=memuh(Rs+Rt<<#u2) 875 let AddedComplexity = 45, isPredicated = 1 in 876 def LDriuh_indexed_shl_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 877 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 878 u2Imm:$offset), 879 "if ($src1.new) $dst=memuh($src2+$src3<<#$offset)", 880 []>, 881 Requires<[HasV4T]>; 882 883 // if (!Pv) Rd=memuh(Rs+Rt<<#u2) 884 let AddedComplexity = 45, isPredicated = 1 in 885 def LDriuh_indexed_shl_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 886 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 887 u2Imm:$offset), 888 "if (!$src1) $dst=memuh($src2+$src3<<#$offset)", 889 []>, 890 Requires<[HasV4T]>; 891 892 // if (!Pv.new) Rd=memuh(Rs+Rt<<#u2) 893 let AddedComplexity = 45, isPredicated = 1 in 894 def LDriuh_indexed_shl_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 895 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 896 u2Imm:$offset), 897 "if (!$src1.new) $dst=memuh($src2+$src3<<#$offset)", 898 []>, 899 Requires<[HasV4T]>; 900 901 // Rd=memh(Rt<<#u2+#U6) 902 903 //// Load word. 904 // Load predicate: Fix for bug 5279. 905 let neverHasSideEffects = 1 in 906 def LDriw_pred_V4 : LDInst2<(outs PredRegs:$dst), 907 (ins MEMri:$addr), 908 "Error; should not emit", 909 []>, 910 Requires<[HasV4T]>; 911 912 // Rd=memw(Re=#U6) 913 914 // Rd=memw(Rs+Rt<<#u2) 915 let AddedComplexity = 10, isPredicable = 1 in 916 def LDriw_indexed_V4 : LDInst<(outs IntRegs:$dst), 917 (ins IntRegs:$src1, IntRegs:$src2), 918 "$dst=memw($src1+$src2<<#0)", 919 [(set (i32 IntRegs:$dst), 920 (i32 (load (add (i32 IntRegs:$src1), 921 (i32 IntRegs:$src2)))))]>, 922 Requires<[HasV4T]>; 923 924 // Rd=memw(Rs+Rt<<#u2) 925 let AddedComplexity = 40, isPredicable = 1 in 926 def LDriw_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), 927 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), 928 "$dst=memw($src1+$src2<<#$offset)", 929 [(set (i32 IntRegs:$dst), 930 (i32 (load (add (i32 IntRegs:$src1), 931 (shl (i32 IntRegs:$src2), 932 u2ImmPred:$offset)))))]>, 933 Requires<[HasV4T]>; 934 935 //// Load word conditionally. 936 // if ([!]Pv[.new]) Rd=memw(Rs+Rt<<#u2) 937 // if (Pv) Rd=memw(Rs+Rt<<#u2) 938 let AddedComplexity = 15, isPredicated = 1 in 939 def LDriw_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst), 940 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 941 "if ($src1) $dst=memw($src2+$src3<<#0)", 942 []>, 943 Requires<[HasV4T]>; 944 945 // if (Pv.new) Rd=memh(Rs+Rt<<#u2) 946 let AddedComplexity = 15, isPredicated = 1 in 947 def LDriw_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 948 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 949 "if ($src1.new) $dst=memw($src2+$src3<<#0)", 950 []>, 951 Requires<[HasV4T]>; 952 953 // if (!Pv) Rd=memh(Rs+Rt<<#u2) 954 let AddedComplexity = 15, isPredicated = 1 in 955 def LDriw_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 956 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 957 "if (!$src1) $dst=memw($src2+$src3<<#0)", 958 []>, 959 Requires<[HasV4T]>; 960 961 // if (!Pv.new) Rd=memh(Rs+Rt<<#u2) 962 let AddedComplexity = 15, isPredicated = 1 in 963 def LDriw_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 964 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3), 965 "if (!$src1.new) $dst=memw($src2+$src3<<#0)", 966 []>, 967 Requires<[HasV4T]>; 968 969 // if (Pv) Rd=memh(Rs+Rt<<#u2) 970 let AddedComplexity = 45, isPredicated = 1 in 971 def LDriw_indexed_shl_cPt_V4 : LDInst2<(outs IntRegs:$dst), 972 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 973 u2Imm:$offset), 974 "if ($src1) $dst=memw($src2+$src3<<#$offset)", 975 []>, 976 Requires<[HasV4T]>; 977 978 // if (Pv.new) Rd=memh(Rs+Rt<<#u2) 979 let AddedComplexity = 45, isPredicated = 1 in 980 def LDriw_indexed_shl_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 981 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 982 u2Imm:$offset), 983 "if ($src1.new) $dst=memw($src2+$src3<<#$offset)", 984 []>, 985 Requires<[HasV4T]>; 986 987 // if (!Pv) Rd=memh(Rs+Rt<<#u2) 988 let AddedComplexity = 45, isPredicated = 1 in 989 def LDriw_indexed_shl_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 990 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 991 u2Imm:$offset), 992 "if (!$src1) $dst=memw($src2+$src3<<#$offset)", 993 []>, 994 Requires<[HasV4T]>; 995 996 // if (!Pv.new) Rd=memh(Rs+Rt<<#u2) 997 let AddedComplexity = 45, isPredicated = 1 in 998 def LDriw_indexed_shl_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 999 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, 1000 u2Imm:$offset), 1001 "if (!$src1.new) $dst=memw($src2+$src3<<#$offset)", 1002 []>, 1003 Requires<[HasV4T]>; 1004 1005 // Rd=memw(Rt<<#u2+#U6) 1006 1007 1008 // Post-inc Load, Predicated, Dot new 1009 1010 1011 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1012 def POST_LDrid_cdnPt_V4 : LDInst2PI<(outs DoubleRegs:$dst1, IntRegs:$dst2), 1013 (ins PredRegs:$src1, IntRegs:$src2, s4_3Imm:$src3), 1014 "if ($src1.new) $dst1 = memd($src2++#$src3)", 1015 [], 1016 "$src2 = $dst2">, 1017 Requires<[HasV4T]>; 1018 1019 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1020 def POST_LDrid_cdnNotPt_V4 : LDInst2PI<(outs DoubleRegs:$dst1, IntRegs:$dst2), 1021 (ins PredRegs:$src1, IntRegs:$src2, s4_3Imm:$src3), 1022 "if (!$src1.new) $dst1 = memd($src2++#$src3)", 1023 [], 1024 "$src2 = $dst2">, 1025 Requires<[HasV4T]>; 1026 1027 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1028 def POST_LDrib_cdnPt_V4 : LDInst2PI<(outs IntRegs:$dst1, IntRegs:$dst2), 1029 (ins PredRegs:$src1, IntRegs:$src2, s4_0Imm:$src3), 1030 "if ($src1.new) $dst1 = memb($src2++#$src3)", 1031 [], 1032 "$src2 = $dst2">, 1033 Requires<[HasV4T]>; 1034 1035 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1036 def POST_LDrib_cdnNotPt_V4 : LDInst2PI<(outs IntRegs:$dst1, IntRegs:$dst2), 1037 (ins PredRegs:$src1, IntRegs:$src2, s4_0Imm:$src3), 1038 "if (!$src1.new) $dst1 = memb($src2++#$src3)", 1039 [], 1040 "$src2 = $dst2">, 1041 Requires<[HasV4T]>; 1042 1043 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1044 def POST_LDrih_cdnPt_V4 : LDInst2PI<(outs IntRegs:$dst1, IntRegs:$dst2), 1045 (ins PredRegs:$src1, IntRegs:$src2, s4_1Imm:$src3), 1046 "if ($src1.new) $dst1 = memh($src2++#$src3)", 1047 [], 1048 "$src2 = $dst2">, 1049 Requires<[HasV4T]>; 1050 1051 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1052 def POST_LDrih_cdnNotPt_V4 : LDInst2PI<(outs IntRegs:$dst1, IntRegs:$dst2), 1053 (ins PredRegs:$src1, IntRegs:$src2, s4_1Imm:$src3), 1054 "if (!$src1.new) $dst1 = memh($src2++#$src3)", 1055 [], 1056 "$src2 = $dst2">, 1057 Requires<[HasV4T]>; 1058 1059 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1060 def POST_LDriub_cdnPt_V4 : LDInst2PI<(outs IntRegs:$dst1, IntRegs:$dst2), 1061 (ins PredRegs:$src1, IntRegs:$src2, s4_0Imm:$src3), 1062 "if ($src1.new) $dst1 = memub($src2++#$src3)", 1063 [], 1064 "$src2 = $dst2">, 1065 Requires<[HasV4T]>; 1066 1067 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1068 def POST_LDriub_cdnNotPt_V4 : LDInst2PI<(outs IntRegs:$dst1, IntRegs:$dst2), 1069 (ins PredRegs:$src1, IntRegs:$src2, s4_0Imm:$src3), 1070 "if (!$src1.new) $dst1 = memub($src2++#$src3)", 1071 [], 1072 "$src2 = $dst2">, 1073 Requires<[HasV4T]>; 1074 1075 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1076 def POST_LDriuh_cdnPt_V4 : LDInst2PI<(outs IntRegs:$dst1, IntRegs:$dst2), 1077 (ins PredRegs:$src1, IntRegs:$src2, s4_1Imm:$src3), 1078 "if ($src1.new) $dst1 = memuh($src2++#$src3)", 1079 [], 1080 "$src2 = $dst2">, 1081 Requires<[HasV4T]>; 1082 1083 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1084 def POST_LDriuh_cdnNotPt_V4 : LDInst2PI<(outs IntRegs:$dst1, IntRegs:$dst2), 1085 (ins PredRegs:$src1, IntRegs:$src2, s4_1Imm:$src3), 1086 "if (!$src1.new) $dst1 = memuh($src2++#$src3)", 1087 [], 1088 "$src2 = $dst2">, 1089 Requires<[HasV4T]>; 1090 1091 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1092 def POST_LDriw_cdnPt_V4 : LDInst2PI<(outs IntRegs:$dst1, IntRegs:$dst2), 1093 (ins PredRegs:$src1, IntRegs:$src2, s4_2Imm:$src3), 1094 "if ($src1.new) $dst1 = memw($src2++#$src3)", 1095 [], 1096 "$src2 = $dst2">, 1097 Requires<[HasV4T]>; 1098 1099 let hasCtrlDep = 1, neverHasSideEffects = 1, isPredicated = 1 in 1100 def POST_LDriw_cdnNotPt_V4 : LDInst2PI<(outs IntRegs:$dst1, IntRegs:$dst2), 1101 (ins PredRegs:$src1, IntRegs:$src2, s4_2Imm:$src3), 1102 "if (!$src1.new) $dst1 = memw($src2++#$src3)", 1103 [], 1104 "$src2 = $dst2">, 1105 Requires<[HasV4T]>; 1106 1107 /// Load from global offset 1108 1109 let isPredicable = 1, neverHasSideEffects = 1 in 1110 def LDrid_GP_V4 : LDInst2<(outs DoubleRegs:$dst), 1111 (ins globaladdress:$global, u16Imm:$offset), 1112 "$dst=memd(#$global+$offset)", 1113 []>, 1114 Requires<[HasV4T]>; 1115 1116 let neverHasSideEffects = 1, isPredicated = 1 in 1117 def LDrid_GP_cPt_V4 : LDInst2<(outs DoubleRegs:$dst), 1118 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1119 "if ($src1) $dst=memd(##$global+$offset)", 1120 []>, 1121 Requires<[HasV4T]>; 1122 1123 let neverHasSideEffects = 1, isPredicated = 1 in 1124 def LDrid_GP_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst), 1125 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1126 "if (!$src1) $dst=memd(##$global+$offset)", 1127 []>, 1128 Requires<[HasV4T]>; 1129 1130 let neverHasSideEffects = 1, isPredicated = 1 in 1131 def LDrid_GP_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst), 1132 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1133 "if ($src1.new) $dst=memd(##$global+$offset)", 1134 []>, 1135 Requires<[HasV4T]>; 1136 1137 let neverHasSideEffects = 1, isPredicated = 1 in 1138 def LDrid_GP_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst), 1139 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1140 "if (!$src1.new) $dst=memd(##$global+$offset)", 1141 []>, 1142 Requires<[HasV4T]>; 1143 1144 let isPredicable = 1, neverHasSideEffects = 1 in 1145 def LDrib_GP_V4 : LDInst2<(outs IntRegs:$dst), 1146 (ins globaladdress:$global, u16Imm:$offset), 1147 "$dst=memb(#$global+$offset)", 1148 []>, 1149 Requires<[HasV4T]>; 1150 1151 let neverHasSideEffects = 1, isPredicated = 1 in 1152 def LDrib_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst), 1153 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1154 "if ($src1) $dst=memb(##$global+$offset)", 1155 []>, 1156 Requires<[HasV4T]>; 1157 1158 let neverHasSideEffects = 1, isPredicated = 1 in 1159 def LDrib_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1160 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1161 "if (!$src1) $dst=memb(##$global+$offset)", 1162 []>, 1163 Requires<[HasV4T]>; 1164 1165 let neverHasSideEffects = 1, isPredicated = 1 in 1166 def LDrib_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 1167 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1168 "if ($src1.new) $dst=memb(##$global+$offset)", 1169 []>, 1170 Requires<[HasV4T]>; 1171 1172 let neverHasSideEffects = 1, isPredicated = 1 in 1173 def LDrib_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1174 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1175 "if (!$src1.new) $dst=memb(##$global+$offset)", 1176 []>, 1177 Requires<[HasV4T]>; 1178 1179 1180 let isPredicable = 1, neverHasSideEffects = 1 in 1181 def LDriub_GP_V4 : LDInst2<(outs IntRegs:$dst), 1182 (ins globaladdress:$global, u16Imm:$offset), 1183 "$dst=memub(#$global+$offset)", 1184 []>, 1185 Requires<[HasV4T]>; 1186 1187 1188 let neverHasSideEffects = 1, isPredicated = 1 in 1189 def LDriub_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst), 1190 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1191 "if ($src1) $dst=memub(##$global+$offset)", 1192 []>, 1193 Requires<[HasV4T]>; 1194 1195 let neverHasSideEffects = 1, isPredicated = 1 in 1196 def LDriub_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1197 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1198 "if (!$src1) $dst=memub(##$global+$offset)", 1199 []>, 1200 Requires<[HasV4T]>; 1201 1202 let neverHasSideEffects = 1, isPredicated = 1 in 1203 def LDriub_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 1204 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1205 "if ($src1.new) $dst=memub(##$global+$offset)", 1206 []>, 1207 Requires<[HasV4T]>; 1208 1209 let neverHasSideEffects = 1, isPredicated = 1 in 1210 def LDriub_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1211 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1212 "if (!$src1.new) $dst=memub(##$global+$offset)", 1213 []>, 1214 Requires<[HasV4T]>; 1215 1216 1217 let isPredicable = 1, neverHasSideEffects = 1 in 1218 def LDrih_GP_V4 : LDInst2<(outs IntRegs:$dst), 1219 (ins globaladdress:$global, u16Imm:$offset), 1220 "$dst=memh(#$global+$offset)", 1221 []>, 1222 Requires<[HasV4T]>; 1223 1224 1225 let neverHasSideEffects = 1, isPredicated = 1 in 1226 def LDrih_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst), 1227 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1228 "if ($src1) $dst=memh(##$global+$offset)", 1229 []>, 1230 Requires<[HasV4T]>; 1231 1232 let neverHasSideEffects = 1, isPredicated = 1 in 1233 def LDrih_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1234 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1235 "if (!$src1) $dst=memh(##$global+$offset)", 1236 []>, 1237 Requires<[HasV4T]>; 1238 1239 let neverHasSideEffects = 1, isPredicated = 1 in 1240 def LDrih_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 1241 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1242 "if ($src1.new) $dst=memh(##$global+$offset)", 1243 []>, 1244 Requires<[HasV4T]>; 1245 1246 let neverHasSideEffects = 1, isPredicated = 1 in 1247 def LDrih_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1248 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1249 "if (!$src1.new) $dst=memh(##$global+$offset)", 1250 []>, 1251 Requires<[HasV4T]>; 1252 1253 1254 let isPredicable = 1, neverHasSideEffects = 1 in 1255 def LDriuh_GP_V4 : LDInst2<(outs IntRegs:$dst), 1256 (ins globaladdress:$global, u16Imm:$offset), 1257 "$dst=memuh(#$global+$offset)", 1258 []>, 1259 Requires<[HasV4T]>; 1260 1261 let neverHasSideEffects = 1, isPredicated = 1 in 1262 def LDriuh_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst), 1263 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1264 "if ($src1) $dst=memuh(##$global+$offset)", 1265 []>, 1266 Requires<[HasV4T]>; 1267 1268 let neverHasSideEffects = 1, isPredicated = 1 in 1269 def LDriuh_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1270 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1271 "if (!$src1) $dst=memuh(##$global+$offset)", 1272 []>, 1273 Requires<[HasV4T]>; 1274 1275 let neverHasSideEffects = 1, isPredicated = 1 in 1276 def LDriuh_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 1277 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1278 "if ($src1.new) $dst=memuh(##$global+$offset)", 1279 []>, 1280 Requires<[HasV4T]>; 1281 1282 let neverHasSideEffects = 1, isPredicated = 1 in 1283 def LDriuh_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1284 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1285 "if (!$src1.new) $dst=memuh(##$global+$offset)", 1286 []>, 1287 Requires<[HasV4T]>; 1288 1289 let isPredicable = 1, neverHasSideEffects = 1 in 1290 def LDriw_GP_V4 : LDInst2<(outs IntRegs:$dst), 1291 (ins globaladdress:$global, u16Imm:$offset), 1292 "$dst=memw(#$global+$offset)", 1293 []>, 1294 Requires<[HasV4T]>; 1295 1296 1297 let neverHasSideEffects = 1, isPredicated = 1 in 1298 def LDriw_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst), 1299 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1300 "if ($src1) $dst=memw(##$global+$offset)", 1301 []>, 1302 Requires<[HasV4T]>; 1303 1304 let neverHasSideEffects = 1, isPredicated = 1 in 1305 def LDriw_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1306 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1307 "if (!$src1) $dst=memw(##$global+$offset)", 1308 []>, 1309 Requires<[HasV4T]>; 1310 1311 1312 let neverHasSideEffects = 1, isPredicated = 1 in 1313 def LDriw_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 1314 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1315 "if ($src1.new) $dst=memw(##$global+$offset)", 1316 []>, 1317 Requires<[HasV4T]>; 1318 1319 let neverHasSideEffects = 1, isPredicated = 1 in 1320 def LDriw_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1321 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), 1322 "if (!$src1.new) $dst=memw(##$global+$offset)", 1323 []>, 1324 Requires<[HasV4T]>; 1325 1326 1327 let isPredicable = 1, neverHasSideEffects = 1 in 1328 def LDd_GP_V4 : LDInst2<(outs DoubleRegs:$dst), 1329 (ins globaladdress:$global), 1330 "$dst=memd(#$global)", 1331 []>, 1332 Requires<[HasV4T]>; 1333 1334 // if (Pv) Rtt=memd(##global) 1335 let neverHasSideEffects = 1, isPredicated = 1 in 1336 def LDd_GP_cPt_V4 : LDInst2<(outs DoubleRegs:$dst), 1337 (ins PredRegs:$src1, globaladdress:$global), 1338 "if ($src1) $dst=memd(##$global)", 1339 []>, 1340 Requires<[HasV4T]>; 1341 1342 1343 // if (!Pv) Rtt=memd(##global) 1344 let neverHasSideEffects = 1, isPredicated = 1 in 1345 def LDd_GP_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst), 1346 (ins PredRegs:$src1, globaladdress:$global), 1347 "if (!$src1) $dst=memd(##$global)", 1348 []>, 1349 Requires<[HasV4T]>; 1350 1351 // if (Pv) Rtt=memd(##global) 1352 let neverHasSideEffects = 1, isPredicated = 1 in 1353 def LDd_GP_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst), 1354 (ins PredRegs:$src1, globaladdress:$global), 1355 "if ($src1.new) $dst=memd(##$global)", 1356 []>, 1357 Requires<[HasV4T]>; 1358 1359 1360 // if (!Pv) Rtt=memd(##global) 1361 let neverHasSideEffects = 1, isPredicated = 1 in 1362 def LDd_GP_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst), 1363 (ins PredRegs:$src1, globaladdress:$global), 1364 "if (!$src1.new) $dst=memd(##$global)", 1365 []>, 1366 Requires<[HasV4T]>; 1367 1368 let isPredicable = 1, neverHasSideEffects = 1 in 1369 def LDb_GP_V4 : LDInst2<(outs IntRegs:$dst), 1370 (ins globaladdress:$global), 1371 "$dst=memb(#$global)", 1372 []>, 1373 Requires<[HasV4T]>; 1374 1375 // if (Pv) Rt=memb(##global) 1376 let neverHasSideEffects = 1, isPredicated = 1 in 1377 def LDb_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst), 1378 (ins PredRegs:$src1, globaladdress:$global), 1379 "if ($src1) $dst=memb(##$global)", 1380 []>, 1381 Requires<[HasV4T]>; 1382 1383 // if (!Pv) Rt=memb(##global) 1384 let neverHasSideEffects = 1, isPredicated = 1 in 1385 def LDb_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1386 (ins PredRegs:$src1, globaladdress:$global), 1387 "if (!$src1) $dst=memb(##$global)", 1388 []>, 1389 Requires<[HasV4T]>; 1390 1391 // if (Pv) Rt=memb(##global) 1392 let neverHasSideEffects = 1, isPredicated = 1 in 1393 def LDb_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 1394 (ins PredRegs:$src1, globaladdress:$global), 1395 "if ($src1.new) $dst=memb(##$global)", 1396 []>, 1397 Requires<[HasV4T]>; 1398 1399 // if (!Pv) Rt=memb(##global) 1400 let neverHasSideEffects = 1, isPredicated = 1 in 1401 def LDb_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1402 (ins PredRegs:$src1, globaladdress:$global), 1403 "if (!$src1.new) $dst=memb(##$global)", 1404 []>, 1405 Requires<[HasV4T]>; 1406 1407 let isPredicable = 1, neverHasSideEffects = 1 in 1408 def LDub_GP_V4 : LDInst2<(outs IntRegs:$dst), 1409 (ins globaladdress:$global), 1410 "$dst=memub(#$global)", 1411 []>, 1412 Requires<[HasV4T]>; 1413 1414 // if (Pv) Rt=memub(##global) 1415 let neverHasSideEffects = 1, isPredicated = 1 in 1416 def LDub_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst), 1417 (ins PredRegs:$src1, globaladdress:$global), 1418 "if ($src1) $dst=memub(##$global)", 1419 []>, 1420 Requires<[HasV4T]>; 1421 1422 1423 // if (!Pv) Rt=memub(##global) 1424 let neverHasSideEffects = 1, isPredicated = 1 in 1425 def LDub_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1426 (ins PredRegs:$src1, globaladdress:$global), 1427 "if (!$src1) $dst=memub(##$global)", 1428 []>, 1429 Requires<[HasV4T]>; 1430 1431 // if (Pv) Rt=memub(##global) 1432 let neverHasSideEffects = 1, isPredicated = 1 in 1433 def LDub_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 1434 (ins PredRegs:$src1, globaladdress:$global), 1435 "if ($src1.new) $dst=memub(##$global)", 1436 []>, 1437 Requires<[HasV4T]>; 1438 1439 1440 // if (!Pv) Rt=memub(##global) 1441 let neverHasSideEffects = 1, isPredicated = 1 in 1442 def LDub_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1443 (ins PredRegs:$src1, globaladdress:$global), 1444 "if (!$src1.new) $dst=memub(##$global)", 1445 []>, 1446 Requires<[HasV4T]>; 1447 1448 let isPredicable = 1, neverHasSideEffects = 1 in 1449 def LDh_GP_V4 : LDInst2<(outs IntRegs:$dst), 1450 (ins globaladdress:$global), 1451 "$dst=memh(#$global)", 1452 []>, 1453 Requires<[HasV4T]>; 1454 1455 // if (Pv) Rt=memh(##global) 1456 let neverHasSideEffects = 1, isPredicated = 1 in 1457 def LDh_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst), 1458 (ins PredRegs:$src1, globaladdress:$global), 1459 "if ($src1) $dst=memh(##$global)", 1460 []>, 1461 Requires<[HasV4T]>; 1462 1463 // if (!Pv) Rt=memh(##global) 1464 let neverHasSideEffects = 1, isPredicated = 1 in 1465 def LDh_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1466 (ins PredRegs:$src1, globaladdress:$global), 1467 "if (!$src1) $dst=memh(##$global)", 1468 []>, 1469 Requires<[HasV4T]>; 1470 1471 // if (Pv) Rt=memh(##global) 1472 let neverHasSideEffects = 1, isPredicated = 1 in 1473 def LDh_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 1474 (ins PredRegs:$src1, globaladdress:$global), 1475 "if ($src1.new) $dst=memh(##$global)", 1476 []>, 1477 Requires<[HasV4T]>; 1478 1479 // if (!Pv) Rt=memh(##global) 1480 let neverHasSideEffects = 1, isPredicated = 1 in 1481 def LDh_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1482 (ins PredRegs:$src1, globaladdress:$global), 1483 "if (!$src1.new) $dst=memh(##$global)", 1484 []>, 1485 Requires<[HasV4T]>; 1486 1487 let isPredicable = 1, neverHasSideEffects = 1 in 1488 def LDuh_GP_V4 : LDInst2<(outs IntRegs:$dst), 1489 (ins globaladdress:$global), 1490 "$dst=memuh(#$global)", 1491 []>, 1492 Requires<[HasV4T]>; 1493 1494 // if (Pv) Rt=memuh(##global) 1495 let neverHasSideEffects = 1, isPredicated = 1 in 1496 def LDuh_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst), 1497 (ins PredRegs:$src1, globaladdress:$global), 1498 "if ($src1) $dst=memuh(##$global)", 1499 []>, 1500 Requires<[HasV4T]>; 1501 1502 // if (!Pv) Rt=memuh(##global) 1503 let neverHasSideEffects = 1, isPredicated = 1 in 1504 def LDuh_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1505 (ins PredRegs:$src1, globaladdress:$global), 1506 "if (!$src1) $dst=memuh(##$global)", 1507 []>, 1508 Requires<[HasV4T]>; 1509 1510 // if (Pv) Rt=memuh(##global) 1511 let neverHasSideEffects = 1, isPredicated = 1 in 1512 def LDuh_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 1513 (ins PredRegs:$src1, globaladdress:$global), 1514 "if ($src1.new) $dst=memuh(##$global)", 1515 []>, 1516 Requires<[HasV4T]>; 1517 1518 // if (!Pv) Rt=memuh(##global) 1519 let neverHasSideEffects = 1, isPredicated = 1 in 1520 def LDuh_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1521 (ins PredRegs:$src1, globaladdress:$global), 1522 "if (!$src1.new) $dst=memuh(##$global)", 1523 []>, 1524 Requires<[HasV4T]>; 1525 1526 let isPredicable = 1, neverHasSideEffects = 1 in 1527 def LDw_GP_V4 : LDInst2<(outs IntRegs:$dst), 1528 (ins globaladdress:$global), 1529 "$dst=memw(#$global)", 1530 []>, 1531 Requires<[HasV4T]>; 1532 1533 // if (Pv) Rt=memw(##global) 1534 let neverHasSideEffects = 1, isPredicated = 1 in 1535 def LDw_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst), 1536 (ins PredRegs:$src1, globaladdress:$global), 1537 "if ($src1) $dst=memw(##$global)", 1538 []>, 1539 Requires<[HasV4T]>; 1540 1541 1542 // if (!Pv) Rt=memw(##global) 1543 let neverHasSideEffects = 1, isPredicated = 1 in 1544 def LDw_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1545 (ins PredRegs:$src1, globaladdress:$global), 1546 "if (!$src1) $dst=memw(##$global)", 1547 []>, 1548 Requires<[HasV4T]>; 1549 1550 // if (Pv) Rt=memw(##global) 1551 let neverHasSideEffects = 1, isPredicated = 1 in 1552 def LDw_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 1553 (ins PredRegs:$src1, globaladdress:$global), 1554 "if ($src1.new) $dst=memw(##$global)", 1555 []>, 1556 Requires<[HasV4T]>; 1557 1558 1559 // if (!Pv) Rt=memw(##global) 1560 let neverHasSideEffects = 1, isPredicated = 1 in 1561 def LDw_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 1562 (ins PredRegs:$src1, globaladdress:$global), 1563 "if (!$src1.new) $dst=memw(##$global)", 1564 []>, 1565 Requires<[HasV4T]>; 1566 1567 1568 1569 def : Pat <(atomic_load_64 (HexagonCONST32_GP tglobaladdr:$global)), 1570 (i64 (LDd_GP_V4 tglobaladdr:$global))>, 1571 Requires<[HasV4T]>; 1572 1573 def : Pat <(atomic_load_32 (HexagonCONST32_GP tglobaladdr:$global)), 1574 (i32 (LDw_GP_V4 tglobaladdr:$global))>, 1575 Requires<[HasV4T]>; 1576 1577 def : Pat <(atomic_load_16 (HexagonCONST32_GP tglobaladdr:$global)), 1578 (i32 (LDuh_GP_V4 tglobaladdr:$global))>, 1579 Requires<[HasV4T]>; 1580 1581 def : Pat <(atomic_load_8 (HexagonCONST32_GP tglobaladdr:$global)), 1582 (i32 (LDub_GP_V4 tglobaladdr:$global))>, 1583 Requires<[HasV4T]>; 1584 1585 // Map from load(globaladdress) -> memw(#foo + 0) 1586 let AddedComplexity = 100 in 1587 def : Pat <(i64 (load (HexagonCONST32_GP tglobaladdr:$global))), 1588 (i64 (LDd_GP_V4 tglobaladdr:$global))>, 1589 Requires<[HasV4T]>; 1590 1591 // Map from Pd = load(globaladdress) -> Rd = memb(globaladdress), Pd = Rd 1592 let AddedComplexity = 100 in 1593 def : Pat <(i1 (load (HexagonCONST32_GP tglobaladdr:$global))), 1594 (i1 (TFR_PdRs (i32 (LDb_GP_V4 tglobaladdr:$global))))>, 1595 Requires<[HasV4T]>; 1596 1597 // When the Interprocedural Global Variable optimizer realizes that a certain 1598 // global variable takes only two constant values, it shrinks the global to 1599 // a boolean. Catch those loads here in the following 3 patterns. 1600 let AddedComplexity = 100 in 1601 def : Pat <(i32 (extloadi1 (HexagonCONST32_GP tglobaladdr:$global))), 1602 (i32 (LDb_GP_V4 tglobaladdr:$global))>, 1603 Requires<[HasV4T]>; 1604 1605 let AddedComplexity = 100 in 1606 def : Pat <(i32 (sextloadi1 (HexagonCONST32_GP tglobaladdr:$global))), 1607 (i32 (LDb_GP_V4 tglobaladdr:$global))>, 1608 Requires<[HasV4T]>; 1609 1610 // Map from load(globaladdress) -> memb(#foo) 1611 let AddedComplexity = 100 in 1612 def : Pat <(i32 (extloadi8 (HexagonCONST32_GP tglobaladdr:$global))), 1613 (i32 (LDb_GP_V4 tglobaladdr:$global))>, 1614 Requires<[HasV4T]>; 1615 1616 // Map from load(globaladdress) -> memb(#foo) 1617 let AddedComplexity = 100 in 1618 def : Pat <(i32 (sextloadi8 (HexagonCONST32_GP tglobaladdr:$global))), 1619 (i32 (LDb_GP_V4 tglobaladdr:$global))>, 1620 Requires<[HasV4T]>; 1621 1622 let AddedComplexity = 100 in 1623 def : Pat <(i32 (zextloadi1 (HexagonCONST32_GP tglobaladdr:$global))), 1624 (i32 (LDub_GP_V4 tglobaladdr:$global))>, 1625 Requires<[HasV4T]>; 1626 1627 // Map from load(globaladdress) -> memub(#foo) 1628 let AddedComplexity = 100 in 1629 def : Pat <(i32 (zextloadi8 (HexagonCONST32_GP tglobaladdr:$global))), 1630 (i32 (LDub_GP_V4 tglobaladdr:$global))>, 1631 Requires<[HasV4T]>; 1632 1633 // Map from load(globaladdress) -> memh(#foo) 1634 let AddedComplexity = 100 in 1635 def : Pat <(i32 (extloadi16 (HexagonCONST32_GP tglobaladdr:$global))), 1636 (i32 (LDh_GP_V4 tglobaladdr:$global))>, 1637 Requires<[HasV4T]>; 1638 1639 // Map from load(globaladdress) -> memh(#foo) 1640 let AddedComplexity = 100 in 1641 def : Pat <(i32 (sextloadi16 (HexagonCONST32_GP tglobaladdr:$global))), 1642 (i32 (LDh_GP_V4 tglobaladdr:$global))>, 1643 Requires<[HasV4T]>; 1644 1645 // Map from load(globaladdress) -> memuh(#foo) 1646 let AddedComplexity = 100 in 1647 def : Pat <(i32 (zextloadi16 (HexagonCONST32_GP tglobaladdr:$global))), 1648 (i32 (LDuh_GP_V4 tglobaladdr:$global))>, 1649 Requires<[HasV4T]>; 1650 1651 // Map from load(globaladdress) -> memw(#foo) 1652 let AddedComplexity = 100 in 1653 def : Pat <(i32 (load (HexagonCONST32_GP tglobaladdr:$global))), 1654 (i32 (LDw_GP_V4 tglobaladdr:$global))>, 1655 Requires<[HasV4T]>; 1656 1657 def : Pat <(atomic_load_64 (add (HexagonCONST32_GP tglobaladdr:$global), 1658 u16ImmPred:$offset)), 1659 (i64 (LDrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1660 Requires<[HasV4T]>; 1661 1662 def : Pat <(atomic_load_32 (add (HexagonCONST32_GP tglobaladdr:$global), 1663 u16ImmPred:$offset)), 1664 (i32 (LDriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1665 Requires<[HasV4T]>; 1666 1667 def : Pat <(atomic_load_16 (add (HexagonCONST32_GP tglobaladdr:$global), 1668 u16ImmPred:$offset)), 1669 (i32 (LDriuh_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1670 Requires<[HasV4T]>; 1671 1672 def : Pat <(atomic_load_8 (add (HexagonCONST32_GP tglobaladdr:$global), 1673 u16ImmPred:$offset)), 1674 (i32 (LDriub_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1675 Requires<[HasV4T]>; 1676 1677 // Map from load(globaladdress + x) -> memd(#foo + x) 1678 let AddedComplexity = 100 in 1679 def : Pat <(i64 (load (add (HexagonCONST32_GP tglobaladdr:$global), 1680 u16ImmPred:$offset))), 1681 (i64 (LDrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1682 Requires<[HasV4T]>; 1683 1684 // Map from load(globaladdress + x) -> memb(#foo + x) 1685 let AddedComplexity = 100 in 1686 def : Pat <(i32 (extloadi8 (add (HexagonCONST32_GP tglobaladdr:$global), 1687 u16ImmPred:$offset))), 1688 (i32 (LDrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1689 Requires<[HasV4T]>; 1690 1691 // Map from load(globaladdress + x) -> memb(#foo + x) 1692 let AddedComplexity = 100 in 1693 def : Pat <(i32 (sextloadi8 (add (HexagonCONST32_GP tglobaladdr:$global), 1694 u16ImmPred:$offset))), 1695 (i32 (LDrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1696 Requires<[HasV4T]>; 1697 1698 // Map from load(globaladdress + x) -> memub(#foo + x) 1699 let AddedComplexity = 100 in 1700 def : Pat <(i32 (zextloadi8 (add (HexagonCONST32_GP tglobaladdr:$global), 1701 u16ImmPred:$offset))), 1702 (i32 (LDriub_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1703 Requires<[HasV4T]>; 1704 1705 // Map from load(globaladdress + x) -> memuh(#foo + x) 1706 let AddedComplexity = 100 in 1707 def : Pat <(i32 (extloadi16 (add (HexagonCONST32_GP tglobaladdr:$global), 1708 u16ImmPred:$offset))), 1709 (i32 (LDrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1710 Requires<[HasV4T]>; 1711 1712 // Map from load(globaladdress + x) -> memh(#foo + x) 1713 let AddedComplexity = 100 in 1714 def : Pat <(i32 (sextloadi16 (add (HexagonCONST32_GP tglobaladdr:$global), 1715 u16ImmPred:$offset))), 1716 (i32 (LDrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1717 Requires<[HasV4T]>; 1718 1719 1720 // Map from load(globaladdress + x) -> memuh(#foo + x) 1721 let AddedComplexity = 100 in 1722 def : Pat <(i32 (zextloadi16 (add (HexagonCONST32_GP tglobaladdr:$global), 1723 u16ImmPred:$offset))), 1724 (i32 (LDriuh_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1725 Requires<[HasV4T]>; 1726 1727 // Map from load(globaladdress + x) -> memw(#foo + x) 1728 let AddedComplexity = 100 in 1729 def : Pat <(i32 (load (add (HexagonCONST32_GP tglobaladdr:$global), 1730 u16ImmPred:$offset))), 1731 (i32 (LDriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, 1732 Requires<[HasV4T]>; 1733 1734 1735 //===----------------------------------------------------------------------===// 1736 // LD - 1737 //===----------------------------------------------------------------------===// 1738 1739 //===----------------------------------------------------------------------===// 1740 // ST + 1741 //===----------------------------------------------------------------------===// 1742 /// 1743 /// Assumptions::: ****** DO NOT IGNORE ******** 1744 /// 1. Make sure that in post increment store, the zero'th operand is always the 1745 /// post increment operand. 1746 /// 2. Make sure that the store value operand(Rt/Rtt) in a store is always the 1747 /// last operand. 1748 /// 1749 1750 // memd(Re=#U6)=Rtt 1751 def STrid_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1), 1752 (ins DoubleRegs:$src1, u6Imm:$src2), 1753 "memd($dst1=#$src2) = $src1", 1754 []>, 1755 Requires<[HasV4T]>; 1756 1757 // memb(Re=#U6)=Rs 1758 def STrib_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1), 1759 (ins IntRegs:$src1, u6Imm:$src2), 1760 "memb($dst1=#$src2) = $src1", 1761 []>, 1762 Requires<[HasV4T]>; 1763 1764 // memh(Re=#U6)=Rs 1765 def STrih_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1), 1766 (ins IntRegs:$src1, u6Imm:$src2), 1767 "memh($dst1=#$src2) = $src1", 1768 []>, 1769 Requires<[HasV4T]>; 1770 1771 // memw(Re=#U6)=Rs 1772 def STriw_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1), 1773 (ins IntRegs:$src1, u6Imm:$src2), 1774 "memw($dst1=#$src2) = $src1", 1775 []>, 1776 Requires<[HasV4T]>; 1777 1778 // memd(Re=#U6)=Rtt 1779 def STrid_abs_set_V4 : STInst2<(outs IntRegs:$dst1), 1780 (ins DoubleRegs:$src1, globaladdress:$src2), 1781 "memd($dst1=##$src2) = $src1", 1782 []>, 1783 Requires<[HasV4T]>; 1784 1785 // memb(Re=#U6)=Rs 1786 def STrib_abs_set_V4 : STInst2<(outs IntRegs:$dst1), 1787 (ins IntRegs:$src1, globaladdress:$src2), 1788 "memb($dst1=##$src2) = $src1", 1789 []>, 1790 Requires<[HasV4T]>; 1791 1792 // memh(Re=#U6)=Rs 1793 def STrih_abs_set_V4 : STInst2<(outs IntRegs:$dst1), 1794 (ins IntRegs:$src1, globaladdress:$src2), 1795 "memh($dst1=##$src2) = $src1", 1796 []>, 1797 Requires<[HasV4T]>; 1798 1799 // memw(Re=#U6)=Rs 1800 def STriw_abs_set_V4 : STInst2<(outs IntRegs:$dst1), 1801 (ins IntRegs:$src1, globaladdress:$src2), 1802 "memw($dst1=##$src2) = $src1", 1803 []>, 1804 Requires<[HasV4T]>; 1805 1806 // memd(Rs+Ru<<#u2)=Rtt 1807 let AddedComplexity = 10, isPredicable = 1 in 1808 def STrid_indexed_shl_V4 : STInst<(outs), 1809 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, DoubleRegs:$src4), 1810 "memd($src1+$src2<<#$src3) = $src4", 1811 [(store (i64 DoubleRegs:$src4), 1812 (add (i32 IntRegs:$src1), 1813 (shl (i32 IntRegs:$src2), u2ImmPred:$src3)))]>, 1814 Requires<[HasV4T]>; 1815 1816 // memd(Ru<<#u2+#U6)=Rtt 1817 let AddedComplexity = 10 in 1818 def STrid_shl_V4 : STInst<(outs), 1819 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, DoubleRegs:$src4), 1820 "memd($src1<<#$src2+#$src3) = $src4", 1821 [(store (i64 DoubleRegs:$src4), 1822 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2), 1823 u6ImmPred:$src3))]>, 1824 Requires<[HasV4T]>; 1825 1826 // memd(Rx++#s4:3)=Rtt 1827 // memd(Rx++#s4:3:circ(Mu))=Rtt 1828 // memd(Rx++I:circ(Mu))=Rtt 1829 // memd(Rx++Mu)=Rtt 1830 // memd(Rx++Mu:brev)=Rtt 1831 // memd(gp+#u16:3)=Rtt 1832 1833 // Store doubleword conditionally. 1834 // if ([!]Pv[.new]) memd(#u6)=Rtt 1835 // TODO: needs to be implemented. 1836 1837 // if ([!]Pv[.new]) memd(Rs+#u6:3)=Rtt 1838 // if (Pv) memd(Rs+#u6:3)=Rtt 1839 // if (Pv.new) memd(Rs+#u6:3)=Rtt 1840 let AddedComplexity = 10, neverHasSideEffects = 1, 1841 isPredicated = 1 in 1842 def STrid_cdnPt_V4 : STInst2<(outs), 1843 (ins PredRegs:$src1, MEMri:$addr, DoubleRegs:$src2), 1844 "if ($src1.new) memd($addr) = $src2", 1845 []>, 1846 Requires<[HasV4T]>; 1847 1848 // if (!Pv) memd(Rs+#u6:3)=Rtt 1849 // if (!Pv.new) memd(Rs+#u6:3)=Rtt 1850 let AddedComplexity = 10, neverHasSideEffects = 1, 1851 isPredicated = 1 in 1852 def STrid_cdnNotPt_V4 : STInst2<(outs), 1853 (ins PredRegs:$src1, MEMri:$addr, DoubleRegs:$src2), 1854 "if (!$src1.new) memd($addr) = $src2", 1855 []>, 1856 Requires<[HasV4T]>; 1857 1858 // if (Pv) memd(Rs+#u6:3)=Rtt 1859 // if (Pv.new) memd(Rs+#u6:3)=Rtt 1860 let AddedComplexity = 10, neverHasSideEffects = 1, 1861 isPredicated = 1 in 1862 def STrid_indexed_cdnPt_V4 : STInst2<(outs), 1863 (ins PredRegs:$src1, IntRegs:$src2, u6_3Imm:$src3, 1864 DoubleRegs:$src4), 1865 "if ($src1.new) memd($src2+#$src3) = $src4", 1866 []>, 1867 Requires<[HasV4T]>; 1868 1869 // if (!Pv) memd(Rs+#u6:3)=Rtt 1870 // if (!Pv.new) memd(Rs+#u6:3)=Rtt 1871 let AddedComplexity = 10, neverHasSideEffects = 1, 1872 isPredicated = 1 in 1873 def STrid_indexed_cdnNotPt_V4 : STInst2<(outs), 1874 (ins PredRegs:$src1, IntRegs:$src2, u6_3Imm:$src3, 1875 DoubleRegs:$src4), 1876 "if (!$src1.new) memd($src2+#$src3) = $src4", 1877 []>, 1878 Requires<[HasV4T]>; 1879 1880 // if ([!]Pv[.new]) memd(Rs+Ru<<#u2)=Rtt 1881 // if (Pv) memd(Rs+Ru<<#u2)=Rtt 1882 let AddedComplexity = 10, neverHasSideEffects = 1, 1883 isPredicated = 1 in 1884 def STrid_indexed_shl_cPt_V4 : STInst2<(outs), 1885 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 1886 DoubleRegs:$src5), 1887 "if ($src1) memd($src2+$src3<<#$src4) = $src5", 1888 []>, 1889 Requires<[HasV4T]>; 1890 1891 // if (Pv.new) memd(Rs+Ru<<#u2)=Rtt 1892 let AddedComplexity = 10, neverHasSideEffects = 1, 1893 isPredicated = 1 in 1894 def STrid_indexed_shl_cdnPt_V4 : STInst2<(outs), 1895 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 1896 DoubleRegs:$src5), 1897 "if ($src1.new) memd($src2+$src3<<#$src4) = $src5", 1898 []>, 1899 Requires<[HasV4T]>; 1900 // if (!Pv) memd(Rs+Ru<<#u2)=Rtt 1901 let AddedComplexity = 10, neverHasSideEffects = 1, 1902 isPredicated = 1 in 1903 def STrid_indexed_shl_cNotPt_V4 : STInst2<(outs), 1904 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 1905 DoubleRegs:$src5), 1906 "if (!$src1) memd($src2+$src3<<#$src4) = $src5", 1907 []>, 1908 Requires<[HasV4T]>; 1909 // if (!Pv.new) memd(Rs+Ru<<#u2)=Rtt 1910 let AddedComplexity = 10, neverHasSideEffects = 1, 1911 isPredicated = 1 in 1912 def STrid_indexed_shl_cdnNotPt_V4 : STInst2<(outs), 1913 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 1914 DoubleRegs:$src5), 1915 "if (!$src1.new) memd($src2+$src3<<#$src4) = $src5", 1916 []>, 1917 Requires<[HasV4T]>; 1918 1919 // if ([!]Pv[.new]) memd(Rx++#s4:3)=Rtt 1920 // if (Pv) memd(Rx++#s4:3)=Rtt 1921 // if (Pv.new) memd(Rx++#s4:3)=Rtt 1922 let AddedComplexity = 10, neverHasSideEffects = 1, 1923 isPredicated = 1 in 1924 def POST_STdri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst), 1925 (ins PredRegs:$src1, DoubleRegs:$src2, IntRegs:$src3, 1926 s4_3Imm:$offset), 1927 "if ($src1.new) memd($src3++#$offset) = $src2", 1928 [], 1929 "$src3 = $dst">, 1930 Requires<[HasV4T]>; 1931 1932 // if (!Pv) memd(Rx++#s4:3)=Rtt 1933 // if (!Pv.new) memd(Rx++#s4:3)=Rtt 1934 let AddedComplexity = 10, neverHasSideEffects = 1, 1935 isPredicated = 1 in 1936 def POST_STdri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst), 1937 (ins PredRegs:$src1, DoubleRegs:$src2, IntRegs:$src3, 1938 s4_3Imm:$offset), 1939 "if (!$src1.new) memd($src3++#$offset) = $src2", 1940 [], 1941 "$src3 = $dst">, 1942 Requires<[HasV4T]>; 1943 1944 1945 // Store byte. 1946 // memb(Rs+#u6:0)=#S8 1947 let AddedComplexity = 10, isPredicable = 1 in 1948 def STrib_imm_V4 : STInst<(outs), 1949 (ins IntRegs:$src1, u6_0Imm:$src2, s8Imm:$src3), 1950 "memb($src1+#$src2) = #$src3", 1951 [(truncstorei8 s8ImmPred:$src3, (add (i32 IntRegs:$src1), 1952 u6_0ImmPred:$src2))]>, 1953 Requires<[HasV4T]>; 1954 1955 // memb(Rs+Ru<<#u2)=Rt 1956 let AddedComplexity = 10, isPredicable = 1 in 1957 def STrib_indexed_shl_V4 : STInst<(outs), 1958 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4), 1959 "memb($src1+$src2<<#$src3) = $src4", 1960 [(truncstorei8 (i32 IntRegs:$src4), 1961 (add (i32 IntRegs:$src1), 1962 (shl (i32 IntRegs:$src2), 1963 u2ImmPred:$src3)))]>, 1964 Requires<[HasV4T]>; 1965 1966 // memb(Ru<<#u2+#U6)=Rt 1967 let AddedComplexity = 10 in 1968 def STrib_shl_V4 : STInst<(outs), 1969 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4), 1970 "memb($src1<<#$src2+#$src3) = $src4", 1971 [(truncstorei8 (i32 IntRegs:$src4), 1972 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2), 1973 u6ImmPred:$src3))]>, 1974 Requires<[HasV4T]>; 1975 1976 // memb(Rx++#s4:0:circ(Mu))=Rt 1977 // memb(Rx++I:circ(Mu))=Rt 1978 // memb(Rx++Mu)=Rt 1979 // memb(Rx++Mu:brev)=Rt 1980 // memb(gp+#u16:0)=Rt 1981 1982 1983 // Store byte conditionally. 1984 // if ([!]Pv[.new]) memb(#u6)=Rt 1985 // if ([!]Pv[.new]) memb(Rs+#u6:0)=#S6 1986 // if (Pv) memb(Rs+#u6:0)=#S6 1987 let neverHasSideEffects = 1, 1988 isPredicated = 1 in 1989 def STrib_imm_cPt_V4 : STInst2<(outs), 1990 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4), 1991 "if ($src1) memb($src2+#$src3) = #$src4", 1992 []>, 1993 Requires<[HasV4T]>; 1994 1995 // if (Pv.new) memb(Rs+#u6:0)=#S6 1996 let neverHasSideEffects = 1, 1997 isPredicated = 1 in 1998 def STrib_imm_cdnPt_V4 : STInst2<(outs), 1999 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4), 2000 "if ($src1.new) memb($src2+#$src3) = #$src4", 2001 []>, 2002 Requires<[HasV4T]>; 2003 2004 // if (!Pv) memb(Rs+#u6:0)=#S6 2005 let neverHasSideEffects = 1, 2006 isPredicated = 1 in 2007 def STrib_imm_cNotPt_V4 : STInst2<(outs), 2008 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4), 2009 "if (!$src1) memb($src2+#$src3) = #$src4", 2010 []>, 2011 Requires<[HasV4T]>; 2012 2013 // if (!Pv.new) memb(Rs+#u6:0)=#S6 2014 let neverHasSideEffects = 1, 2015 isPredicated = 1 in 2016 def STrib_imm_cdnNotPt_V4 : STInst2<(outs), 2017 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4), 2018 "if (!$src1.new) memb($src2+#$src3) = #$src4", 2019 []>, 2020 Requires<[HasV4T]>; 2021 2022 // if ([!]Pv[.new]) memb(Rs+#u6:0)=Rt 2023 // if (Pv) memb(Rs+#u6:0)=Rt 2024 // if (Pv.new) memb(Rs+#u6:0)=Rt 2025 let neverHasSideEffects = 1, 2026 isPredicated = 1 in 2027 def STrib_cdnPt_V4 : STInst2<(outs), 2028 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 2029 "if ($src1.new) memb($addr) = $src2", 2030 []>, 2031 Requires<[HasV4T]>; 2032 2033 // if (!Pv) memb(Rs+#u6:0)=Rt 2034 // if (!Pv.new) memb(Rs+#u6:0)=Rt 2035 let neverHasSideEffects = 1, 2036 isPredicated = 1 in 2037 def STrib_cdnNotPt_V4 : STInst2<(outs), 2038 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 2039 "if (!$src1.new) memb($addr) = $src2", 2040 []>, 2041 Requires<[HasV4T]>; 2042 2043 // if (Pv) memb(Rs+#u6:0)=Rt 2044 // if (!Pv) memb(Rs+#u6:0)=Rt 2045 // if (Pv.new) memb(Rs+#u6:0)=Rt 2046 let neverHasSideEffects = 1, 2047 isPredicated = 1 in 2048 def STrib_indexed_cdnPt_V4 : STInst2<(outs), 2049 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), 2050 "if ($src1.new) memb($src2+#$src3) = $src4", 2051 []>, 2052 Requires<[HasV4T]>; 2053 2054 // if (!Pv.new) memb(Rs+#u6:0)=Rt 2055 let neverHasSideEffects = 1, 2056 isPredicated = 1 in 2057 def STrib_indexed_cdnNotPt_V4 : STInst2<(outs), 2058 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), 2059 "if (!$src1.new) memb($src2+#$src3) = $src4", 2060 []>, 2061 Requires<[HasV4T]>; 2062 2063 // if ([!]Pv[.new]) memb(Rs+Ru<<#u2)=Rt 2064 // if (Pv) memb(Rs+Ru<<#u2)=Rt 2065 let AddedComplexity = 10, 2066 isPredicated = 1 in 2067 def STrib_indexed_shl_cPt_V4 : STInst2<(outs), 2068 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2069 IntRegs:$src5), 2070 "if ($src1) memb($src2+$src3<<#$src4) = $src5", 2071 []>, 2072 Requires<[HasV4T]>; 2073 2074 // if (Pv.new) memb(Rs+Ru<<#u2)=Rt 2075 let AddedComplexity = 10, 2076 isPredicated = 1 in 2077 def STrib_indexed_shl_cdnPt_V4 : STInst2<(outs), 2078 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2079 IntRegs:$src5), 2080 "if ($src1.new) memb($src2+$src3<<#$src4) = $src5", 2081 []>, 2082 Requires<[HasV4T]>; 2083 2084 // if (!Pv) memb(Rs+Ru<<#u2)=Rt 2085 let AddedComplexity = 10, 2086 isPredicated = 1 in 2087 def STrib_indexed_shl_cNotPt_V4 : STInst2<(outs), 2088 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2089 IntRegs:$src5), 2090 "if (!$src1) memb($src2+$src3<<#$src4) = $src5", 2091 []>, 2092 Requires<[HasV4T]>; 2093 2094 // if (!Pv.new) memb(Rs+Ru<<#u2)=Rt 2095 let AddedComplexity = 10, 2096 isPredicated = 1 in 2097 def STrib_indexed_shl_cdnNotPt_V4 : STInst2<(outs), 2098 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2099 IntRegs:$src5), 2100 "if (!$src1.new) memb($src2+$src3<<#$src4) = $src5", 2101 []>, 2102 Requires<[HasV4T]>; 2103 2104 // if ([!]Pv[.new]) memb(Rx++#s4:0)=Rt 2105 // if (Pv) memb(Rx++#s4:0)=Rt 2106 // if (Pv.new) memb(Rx++#s4:0)=Rt 2107 let hasCtrlDep = 1, 2108 isPredicated = 1 in 2109 def POST_STbri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst), 2110 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), 2111 "if ($src1.new) memb($src3++#$offset) = $src2", 2112 [],"$src3 = $dst">, 2113 Requires<[HasV4T]>; 2114 2115 // if (!Pv) memb(Rx++#s4:0)=Rt 2116 // if (!Pv.new) memb(Rx++#s4:0)=Rt 2117 let hasCtrlDep = 1, 2118 isPredicated = 1 in 2119 def POST_STbri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst), 2120 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), 2121 "if (!$src1.new) memb($src3++#$offset) = $src2", 2122 [],"$src3 = $dst">, 2123 Requires<[HasV4T]>; 2124 2125 2126 // Store halfword. 2127 // TODO: needs to be implemented 2128 // memh(Re=#U6)=Rt.H 2129 // memh(Rs+#s11:1)=Rt.H 2130 // memh(Rs+#u6:1)=#S8 2131 let AddedComplexity = 10, isPredicable = 1 in 2132 def STrih_imm_V4 : STInst<(outs), 2133 (ins IntRegs:$src1, u6_1Imm:$src2, s8Imm:$src3), 2134 "memh($src1+#$src2) = #$src3", 2135 [(truncstorei16 s8ImmPred:$src3, (add (i32 IntRegs:$src1), 2136 u6_1ImmPred:$src2))]>, 2137 Requires<[HasV4T]>; 2138 2139 // memh(Rs+Ru<<#u2)=Rt.H 2140 // TODO: needs to be implemented. 2141 2142 // memh(Rs+Ru<<#u2)=Rt 2143 let AddedComplexity = 10, isPredicable = 1 in 2144 def STrih_indexed_shl_V4 : STInst<(outs), 2145 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4), 2146 "memh($src1+$src2<<#$src3) = $src4", 2147 [(truncstorei16 (i32 IntRegs:$src4), 2148 (add (i32 IntRegs:$src1), 2149 (shl (i32 IntRegs:$src2), 2150 u2ImmPred:$src3)))]>, 2151 Requires<[HasV4T]>; 2152 2153 // memh(Ru<<#u2+#U6)=Rt.H 2154 // memh(Ru<<#u2+#U6)=Rt 2155 let AddedComplexity = 10 in 2156 def STrih_shl_V4 : STInst<(outs), 2157 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4), 2158 "memh($src1<<#$src2+#$src3) = $src4", 2159 [(truncstorei16 (i32 IntRegs:$src4), 2160 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2), 2161 u6ImmPred:$src3))]>, 2162 Requires<[HasV4T]>; 2163 2164 // memh(Rx++#s4:1:circ(Mu))=Rt.H 2165 // memh(Rx++#s4:1:circ(Mu))=Rt 2166 // memh(Rx++I:circ(Mu))=Rt.H 2167 // memh(Rx++I:circ(Mu))=Rt 2168 // memh(Rx++Mu)=Rt.H 2169 // memh(Rx++Mu)=Rt 2170 // memh(Rx++Mu:brev)=Rt.H 2171 // memh(Rx++Mu:brev)=Rt 2172 // memh(gp+#u16:1)=Rt 2173 // if ([!]Pv[.new]) memh(#u6)=Rt.H 2174 // if ([!]Pv[.new]) memh(#u6)=Rt 2175 2176 // if ([!]Pv[.new]) memh(Rs+#u6:1)=#S6 2177 // if (Pv) memh(Rs+#u6:1)=#S6 2178 let neverHasSideEffects = 1, 2179 isPredicated = 1 in 2180 def STrih_imm_cPt_V4 : STInst2<(outs), 2181 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4), 2182 "if ($src1) memh($src2+#$src3) = #$src4", 2183 []>, 2184 Requires<[HasV4T]>; 2185 2186 // if (Pv.new) memh(Rs+#u6:1)=#S6 2187 let neverHasSideEffects = 1, 2188 isPredicated = 1 in 2189 def STrih_imm_cdnPt_V4 : STInst2<(outs), 2190 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4), 2191 "if ($src1.new) memh($src2+#$src3) = #$src4", 2192 []>, 2193 Requires<[HasV4T]>; 2194 2195 // if (!Pv) memh(Rs+#u6:1)=#S6 2196 let neverHasSideEffects = 1, 2197 isPredicated = 1 in 2198 def STrih_imm_cNotPt_V4 : STInst2<(outs), 2199 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4), 2200 "if (!$src1) memh($src2+#$src3) = #$src4", 2201 []>, 2202 Requires<[HasV4T]>; 2203 2204 // if (!Pv.new) memh(Rs+#u6:1)=#S6 2205 let neverHasSideEffects = 1, 2206 isPredicated = 1 in 2207 def STrih_imm_cdnNotPt_V4 : STInst2<(outs), 2208 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4), 2209 "if (!$src1.new) memh($src2+#$src3) = #$src4", 2210 []>, 2211 Requires<[HasV4T]>; 2212 2213 // if ([!]Pv[.new]) memh(Rs+#u6:1)=Rt.H 2214 // TODO: needs to be implemented. 2215 2216 // if ([!]Pv[.new]) memh(Rs+#u6:1)=Rt 2217 // if (Pv) memh(Rs+#u6:1)=Rt 2218 // if (Pv.new) memh(Rs+#u6:1)=Rt 2219 let neverHasSideEffects = 1, 2220 isPredicated = 1 in 2221 def STrih_cdnPt_V4 : STInst2<(outs), 2222 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 2223 "if ($src1.new) memh($addr) = $src2", 2224 []>, 2225 Requires<[HasV4T]>; 2226 2227 // if (!Pv) memh(Rs+#u6:1)=Rt 2228 // if (!Pv.new) memh(Rs+#u6:1)=Rt 2229 let neverHasSideEffects = 1, 2230 isPredicated = 1 in 2231 def STrih_cdnNotPt_V4 : STInst2<(outs), 2232 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 2233 "if (!$src1.new) memh($addr) = $src2", 2234 []>, 2235 Requires<[HasV4T]>; 2236 2237 // if (Pv.new) memh(Rs+#u6:1)=Rt 2238 let neverHasSideEffects = 1, 2239 isPredicated = 1 in 2240 def STrih_indexed_cdnPt_V4 : STInst2<(outs), 2241 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), 2242 "if ($src1.new) memh($src2+#$src3) = $src4", 2243 []>, 2244 Requires<[HasV4T]>; 2245 2246 // if (!Pv.new) memh(Rs+#u6:1)=Rt 2247 let neverHasSideEffects = 1, 2248 isPredicated = 1 in 2249 def STrih_indexed_cdnNotPt_V4 : STInst2<(outs), 2250 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), 2251 "if (!$src1.new) memh($src2+#$src3) = $src4", 2252 []>, 2253 Requires<[HasV4T]>; 2254 2255 // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Rt.H 2256 // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Rt 2257 // if (Pv) memh(Rs+Ru<<#u2)=Rt 2258 let AddedComplexity = 10, 2259 isPredicated = 1 in 2260 def STrih_indexed_shl_cPt_V4 : STInst2<(outs), 2261 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2262 IntRegs:$src5), 2263 "if ($src1) memh($src2+$src3<<#$src4) = $src5", 2264 []>, 2265 Requires<[HasV4T]>; 2266 2267 // if (Pv.new) memh(Rs+Ru<<#u2)=Rt 2268 let AddedComplexity = 10, 2269 isPredicated = 1 in 2270 def STrih_indexed_shl_cdnPt_V4 : STInst2<(outs), 2271 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2272 IntRegs:$src5), 2273 "if ($src1.new) memh($src2+$src3<<#$src4) = $src5", 2274 []>, 2275 Requires<[HasV4T]>; 2276 2277 // if (!Pv) memh(Rs+Ru<<#u2)=Rt 2278 let AddedComplexity = 10, 2279 isPredicated = 1 in 2280 def STrih_indexed_shl_cNotPt_V4 : STInst2<(outs), 2281 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2282 IntRegs:$src5), 2283 "if (!$src1) memh($src2+$src3<<#$src4) = $src5", 2284 []>, 2285 Requires<[HasV4T]>; 2286 2287 // if (!Pv.new) memh(Rs+Ru<<#u2)=Rt 2288 let AddedComplexity = 10, 2289 isPredicated = 1 in 2290 def STrih_indexed_shl_cdnNotPt_V4 : STInst2<(outs), 2291 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2292 IntRegs:$src5), 2293 "if (!$src1.new) memh($src2+$src3<<#$src4) = $src5", 2294 []>, 2295 Requires<[HasV4T]>; 2296 2297 // if ([!]Pv[.new]) memh(Rx++#s4:1)=Rt.H 2298 // TODO: Needs to be implemented. 2299 2300 // if ([!]Pv[.new]) memh(Rx++#s4:1)=Rt 2301 // if (Pv) memh(Rx++#s4:1)=Rt 2302 // if (Pv.new) memh(Rx++#s4:1)=Rt 2303 let hasCtrlDep = 1, 2304 isPredicated = 1 in 2305 def POST_SThri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst), 2306 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), 2307 "if ($src1.new) memh($src3++#$offset) = $src2", 2308 [],"$src3 = $dst">, 2309 Requires<[HasV4T]>; 2310 2311 // if (!Pv) memh(Rx++#s4:1)=Rt 2312 // if (!Pv.new) memh(Rx++#s4:1)=Rt 2313 let hasCtrlDep = 1, 2314 isPredicated = 1 in 2315 def POST_SThri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst), 2316 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), 2317 "if (!$src1.new) memh($src3++#$offset) = $src2", 2318 [],"$src3 = $dst">, 2319 Requires<[HasV4T]>; 2320 2321 2322 // Store word. 2323 // memw(Re=#U6)=Rt 2324 // TODO: Needs to be implemented. 2325 2326 // Store predicate: 2327 let neverHasSideEffects = 1 in 2328 def STriw_pred_V4 : STInst2<(outs), 2329 (ins MEMri:$addr, PredRegs:$src1), 2330 "Error; should not emit", 2331 []>, 2332 Requires<[HasV4T]>; 2333 2334 2335 // memw(Rs+#u6:2)=#S8 2336 let AddedComplexity = 10, isPredicable = 1 in 2337 def STriw_imm_V4 : STInst<(outs), 2338 (ins IntRegs:$src1, u6_2Imm:$src2, s8Imm:$src3), 2339 "memw($src1+#$src2) = #$src3", 2340 [(store s8ImmPred:$src3, (add (i32 IntRegs:$src1), 2341 u6_2ImmPred:$src2))]>, 2342 Requires<[HasV4T]>; 2343 2344 // memw(Rs+Ru<<#u2)=Rt 2345 let AddedComplexity = 10, isPredicable = 1 in 2346 def STriw_indexed_shl_V4 : STInst<(outs), 2347 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4), 2348 "memw($src1+$src2<<#$src3) = $src4", 2349 [(store (i32 IntRegs:$src4), (add (i32 IntRegs:$src1), 2350 (shl (i32 IntRegs:$src2), 2351 u2ImmPred:$src3)))]>, 2352 Requires<[HasV4T]>; 2353 2354 // memw(Ru<<#u2+#U6)=Rt 2355 let AddedComplexity = 10 in 2356 def STriw_shl_V4 : STInst<(outs), 2357 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4), 2358 "memw($src1<<#$src2+#$src3) = $src4", 2359 [(store (i32 IntRegs:$src4), 2360 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2), 2361 u6ImmPred:$src3))]>, 2362 Requires<[HasV4T]>; 2363 2364 // memw(Rx++#s4:2)=Rt 2365 // memw(Rx++#s4:2:circ(Mu))=Rt 2366 // memw(Rx++I:circ(Mu))=Rt 2367 // memw(Rx++Mu)=Rt 2368 // memw(Rx++Mu:brev)=Rt 2369 // memw(gp+#u16:2)=Rt 2370 2371 2372 // Store word conditionally. 2373 2374 // if ([!]Pv[.new]) memw(Rs+#u6:2)=#S6 2375 // if (Pv) memw(Rs+#u6:2)=#S6 2376 let neverHasSideEffects = 1, 2377 isPredicated = 1 in 2378 def STriw_imm_cPt_V4 : STInst2<(outs), 2379 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4), 2380 "if ($src1) memw($src2+#$src3) = #$src4", 2381 []>, 2382 Requires<[HasV4T]>; 2383 2384 // if (Pv.new) memw(Rs+#u6:2)=#S6 2385 let neverHasSideEffects = 1, 2386 isPredicated = 1 in 2387 def STriw_imm_cdnPt_V4 : STInst2<(outs), 2388 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4), 2389 "if ($src1.new) memw($src2+#$src3) = #$src4", 2390 []>, 2391 Requires<[HasV4T]>; 2392 2393 // if (!Pv) memw(Rs+#u6:2)=#S6 2394 let neverHasSideEffects = 1, 2395 isPredicated = 1 in 2396 def STriw_imm_cNotPt_V4 : STInst2<(outs), 2397 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4), 2398 "if (!$src1) memw($src2+#$src3) = #$src4", 2399 []>, 2400 Requires<[HasV4T]>; 2401 2402 // if (!Pv.new) memw(Rs+#u6:2)=#S6 2403 let neverHasSideEffects = 1, 2404 isPredicated = 1 in 2405 def STriw_imm_cdnNotPt_V4 : STInst2<(outs), 2406 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4), 2407 "if (!$src1.new) memw($src2+#$src3) = #$src4", 2408 []>, 2409 Requires<[HasV4T]>; 2410 2411 // if ([!]Pv[.new]) memw(Rs+#u6:2)=Rt 2412 // if (Pv) memw(Rs+#u6:2)=Rt 2413 // if (Pv.new) memw(Rs+#u6:2)=Rt 2414 let neverHasSideEffects = 1, 2415 isPredicated = 1 in 2416 def STriw_cdnPt_V4 : STInst2<(outs), 2417 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 2418 "if ($src1.new) memw($addr) = $src2", 2419 []>, 2420 Requires<[HasV4T]>; 2421 2422 // if (!Pv) memw(Rs+#u6:2)=Rt 2423 // if (!Pv.new) memw(Rs+#u6:2)=Rt 2424 let neverHasSideEffects = 1, 2425 isPredicated = 1 in 2426 def STriw_cdnNotPt_V4 : STInst2<(outs), 2427 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 2428 "if (!$src1.new) memw($addr) = $src2", 2429 []>, 2430 Requires<[HasV4T]>; 2431 2432 // if (Pv) memw(Rs+#u6:2)=Rt 2433 // if (!Pv) memw(Rs+#u6:2)=Rt 2434 // if (Pv.new) memw(Rs+#u6:2)=Rt 2435 let neverHasSideEffects = 1, 2436 isPredicated = 1 in 2437 def STriw_indexed_cdnPt_V4 : STInst2<(outs), 2438 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), 2439 "if ($src1.new) memw($src2+#$src3) = $src4", 2440 []>, 2441 Requires<[HasV4T]>; 2442 2443 // if (!Pv.new) memw(Rs+#u6:2)=Rt 2444 let neverHasSideEffects = 1, 2445 isPredicated = 1 in 2446 def STriw_indexed_cdnNotPt_V4 : STInst2<(outs), 2447 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), 2448 "if (!$src1.new) memw($src2+#$src3) = $src4", 2449 []>, 2450 Requires<[HasV4T]>; 2451 2452 // if ([!]Pv[.new]) memw(Rs+Ru<<#u2)=Rt 2453 // if (Pv) memw(Rs+Ru<<#u2)=Rt 2454 let AddedComplexity = 10, 2455 isPredicated = 1 in 2456 def STriw_indexed_shl_cPt_V4 : STInst2<(outs), 2457 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2458 IntRegs:$src5), 2459 "if ($src1) memw($src2+$src3<<#$src4) = $src5", 2460 []>, 2461 Requires<[HasV4T]>; 2462 2463 // if (Pv.new) memw(Rs+Ru<<#u2)=Rt 2464 let AddedComplexity = 10, 2465 isPredicated = 1 in 2466 def STriw_indexed_shl_cdnPt_V4 : STInst2<(outs), 2467 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2468 IntRegs:$src5), 2469 "if ($src1.new) memw($src2+$src3<<#$src4) = $src5", 2470 []>, 2471 Requires<[HasV4T]>; 2472 2473 // if (!Pv) memw(Rs+Ru<<#u2)=Rt 2474 let AddedComplexity = 10, 2475 isPredicated = 1 in 2476 def STriw_indexed_shl_cNotPt_V4 : STInst2<(outs), 2477 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2478 IntRegs:$src5), 2479 "if (!$src1) memw($src2+$src3<<#$src4) = $src5", 2480 []>, 2481 Requires<[HasV4T]>; 2482 2483 // if (!Pv.new) memw(Rs+Ru<<#u2)=Rt 2484 let AddedComplexity = 10, 2485 isPredicated = 1 in 2486 def STriw_indexed_shl_cdnNotPt_V4 : STInst2<(outs), 2487 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 2488 IntRegs:$src5), 2489 "if (!$src1.new) memw($src2+$src3<<#$src4) = $src5", 2490 []>, 2491 Requires<[HasV4T]>; 2492 2493 // if ([!]Pv[.new]) memw(Rx++#s4:2)=Rt 2494 // if (Pv) memw(Rx++#s4:2)=Rt 2495 // if (Pv.new) memw(Rx++#s4:2)=Rt 2496 let hasCtrlDep = 1, 2497 isPredicated = 1 in 2498 def POST_STwri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst), 2499 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), 2500 "if ($src1.new) memw($src3++#$offset) = $src2", 2501 [],"$src3 = $dst">, 2502 Requires<[HasV4T]>; 2503 2504 // if (!Pv) memw(Rx++#s4:2)=Rt 2505 // if (!Pv.new) memw(Rx++#s4:2)=Rt 2506 let hasCtrlDep = 1, 2507 isPredicated = 1 in 2508 def POST_STwri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst), 2509 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), 2510 "if (!$src1.new) memw($src3++#$offset) = $src2", 2511 [],"$src3 = $dst">, 2512 Requires<[HasV4T]>; 2513 2514 2515 /// store to global address 2516 2517 let isPredicable = 1, neverHasSideEffects = 1 in 2518 def STrid_GP_V4 : STInst2<(outs), 2519 (ins globaladdress:$global, u16Imm:$offset, DoubleRegs:$src), 2520 "memd(#$global+$offset) = $src", 2521 []>, 2522 Requires<[HasV4T]>; 2523 2524 let neverHasSideEffects = 1, isPredicated = 1 in 2525 def STrid_GP_cPt_V4 : STInst2<(outs), 2526 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2527 DoubleRegs:$src2), 2528 "if ($src1) memd(##$global+$offset) = $src2", 2529 []>, 2530 Requires<[HasV4T]>; 2531 2532 let neverHasSideEffects = 1, isPredicated = 1 in 2533 def STrid_GP_cNotPt_V4 : STInst2<(outs), 2534 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2535 DoubleRegs:$src2), 2536 "if (!$src1) memd(##$global+$offset) = $src2", 2537 []>, 2538 Requires<[HasV4T]>; 2539 2540 let neverHasSideEffects = 1, isPredicated = 1 in 2541 def STrid_GP_cdnPt_V4 : STInst2<(outs), 2542 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2543 DoubleRegs:$src2), 2544 "if ($src1.new) memd(##$global+$offset) = $src2", 2545 []>, 2546 Requires<[HasV4T]>; 2547 2548 let neverHasSideEffects = 1, isPredicated = 1 in 2549 def STrid_GP_cdnNotPt_V4 : STInst2<(outs), 2550 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2551 DoubleRegs:$src2), 2552 "if (!$src1.new) memd(##$global+$offset) = $src2", 2553 []>, 2554 Requires<[HasV4T]>; 2555 2556 let isPredicable = 1, neverHasSideEffects = 1 in 2557 def STrib_GP_V4 : STInst2<(outs), 2558 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src), 2559 "memb(#$global+$offset) = $src", 2560 []>, 2561 Requires<[HasV4T]>; 2562 2563 let neverHasSideEffects = 1, isPredicated = 1 in 2564 def STrib_GP_cPt_V4 : STInst2<(outs), 2565 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2566 IntRegs:$src2), 2567 "if ($src1) memb(##$global+$offset) = $src2", 2568 []>, 2569 Requires<[HasV4T]>; 2570 2571 let neverHasSideEffects = 1, isPredicated = 1 in 2572 def STrib_GP_cNotPt_V4 : STInst2<(outs), 2573 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2574 IntRegs:$src2), 2575 "if (!$src1) memb(##$global+$offset) = $src2", 2576 []>, 2577 Requires<[HasV4T]>; 2578 2579 let neverHasSideEffects = 1, isPredicated = 1 in 2580 def STrib_GP_cdnPt_V4 : STInst2<(outs), 2581 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2582 IntRegs:$src2), 2583 "if ($src1.new) memb(##$global+$offset) = $src2", 2584 []>, 2585 Requires<[HasV4T]>; 2586 2587 let neverHasSideEffects = 1, isPredicated = 1 in 2588 def STrib_GP_cdnNotPt_V4 : STInst2<(outs), 2589 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2590 IntRegs:$src2), 2591 "if (!$src1.new) memb(##$global+$offset) = $src2", 2592 []>, 2593 Requires<[HasV4T]>; 2594 2595 let isPredicable = 1, neverHasSideEffects = 1 in 2596 def STrih_GP_V4 : STInst2<(outs), 2597 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src), 2598 "memh(#$global+$offset) = $src", 2599 []>, 2600 Requires<[HasV4T]>; 2601 2602 let neverHasSideEffects = 1, isPredicated = 1 in 2603 def STrih_GP_cPt_V4 : STInst2<(outs), 2604 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2605 IntRegs:$src2), 2606 "if ($src1) memh(##$global+$offset) = $src2", 2607 []>, 2608 Requires<[HasV4T]>; 2609 2610 let neverHasSideEffects = 1, isPredicated = 1 in 2611 def STrih_GP_cNotPt_V4 : STInst2<(outs), 2612 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2613 IntRegs:$src2), 2614 "if (!$src1) memh(##$global+$offset) = $src2", 2615 []>, 2616 Requires<[HasV4T]>; 2617 2618 let neverHasSideEffects = 1, isPredicated = 1 in 2619 def STrih_GP_cdnPt_V4 : STInst2<(outs), 2620 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2621 IntRegs:$src2), 2622 "if ($src1.new) memh(##$global+$offset) = $src2", 2623 []>, 2624 Requires<[HasV4T]>; 2625 2626 let neverHasSideEffects = 1, isPredicated = 1 in 2627 def STrih_GP_cdnNotPt_V4 : STInst2<(outs), 2628 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2629 IntRegs:$src2), 2630 "if (!$src1.new) memh(##$global+$offset) = $src2", 2631 []>, 2632 Requires<[HasV4T]>; 2633 2634 let isPredicable = 1, neverHasSideEffects = 1 in 2635 def STriw_GP_V4 : STInst2<(outs), 2636 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src), 2637 "memw(#$global+$offset) = $src", 2638 []>, 2639 Requires<[HasV4T]>; 2640 2641 let neverHasSideEffects = 1, isPredicated = 1 in 2642 def STriw_GP_cPt_V4 : STInst2<(outs), 2643 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2644 IntRegs:$src2), 2645 "if ($src1) memw(##$global+$offset) = $src2", 2646 []>, 2647 Requires<[HasV4T]>; 2648 2649 let neverHasSideEffects = 1, isPredicated = 1 in 2650 def STriw_GP_cNotPt_V4 : STInst2<(outs), 2651 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2652 IntRegs:$src2), 2653 "if (!$src1) memw(##$global+$offset) = $src2", 2654 []>, 2655 Requires<[HasV4T]>; 2656 2657 let neverHasSideEffects = 1, isPredicated = 1 in 2658 def STriw_GP_cdnPt_V4 : STInst2<(outs), 2659 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2660 IntRegs:$src2), 2661 "if ($src1.new) memw(##$global+$offset) = $src2", 2662 []>, 2663 Requires<[HasV4T]>; 2664 2665 let neverHasSideEffects = 1, isPredicated = 1 in 2666 def STriw_GP_cdnNotPt_V4 : STInst2<(outs), 2667 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 2668 IntRegs:$src2), 2669 "if (!$src1.new) memw(##$global+$offset) = $src2", 2670 []>, 2671 Requires<[HasV4T]>; 2672 2673 // memd(#global)=Rtt 2674 let isPredicable = 1, neverHasSideEffects = 1 in 2675 def STd_GP_V4 : STInst2<(outs), 2676 (ins globaladdress:$global, DoubleRegs:$src), 2677 "memd(#$global) = $src", 2678 []>, 2679 Requires<[HasV4T]>; 2680 2681 // if (Pv) memd(##global) = Rtt 2682 let neverHasSideEffects = 1, isPredicated = 1 in 2683 def STd_GP_cPt_V4 : STInst2<(outs), 2684 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2), 2685 "if ($src1) memd(##$global) = $src2", 2686 []>, 2687 Requires<[HasV4T]>; 2688 2689 // if (!Pv) memd(##global) = Rtt 2690 let neverHasSideEffects = 1, isPredicated = 1 in 2691 def STd_GP_cNotPt_V4 : STInst2<(outs), 2692 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2), 2693 "if (!$src1) memd(##$global) = $src2", 2694 []>, 2695 Requires<[HasV4T]>; 2696 2697 // if (Pv) memd(##global) = Rtt 2698 let neverHasSideEffects = 1, isPredicated = 1 in 2699 def STd_GP_cdnPt_V4 : STInst2<(outs), 2700 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2), 2701 "if ($src1.new) memd(##$global) = $src2", 2702 []>, 2703 Requires<[HasV4T]>; 2704 2705 // if (!Pv) memd(##global) = Rtt 2706 let neverHasSideEffects = 1, isPredicated = 1 in 2707 def STd_GP_cdnNotPt_V4 : STInst2<(outs), 2708 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2), 2709 "if (!$src1.new) memd(##$global) = $src2", 2710 []>, 2711 Requires<[HasV4T]>; 2712 2713 // memb(#global)=Rt 2714 let isPredicable = 1, neverHasSideEffects = 1 in 2715 def STb_GP_V4 : STInst2<(outs), 2716 (ins globaladdress:$global, IntRegs:$src), 2717 "memb(#$global) = $src", 2718 []>, 2719 Requires<[HasV4T]>; 2720 2721 // if (Pv) memb(##global) = Rt 2722 let neverHasSideEffects = 1, isPredicated = 1 in 2723 def STb_GP_cPt_V4 : STInst2<(outs), 2724 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2725 "if ($src1) memb(##$global) = $src2", 2726 []>, 2727 Requires<[HasV4T]>; 2728 2729 // if (!Pv) memb(##global) = Rt 2730 let neverHasSideEffects = 1, isPredicated = 1 in 2731 def STb_GP_cNotPt_V4 : STInst2<(outs), 2732 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2733 "if (!$src1) memb(##$global) = $src2", 2734 []>, 2735 Requires<[HasV4T]>; 2736 2737 // if (Pv) memb(##global) = Rt 2738 let neverHasSideEffects = 1, isPredicated = 1 in 2739 def STb_GP_cdnPt_V4 : STInst2<(outs), 2740 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2741 "if ($src1.new) memb(##$global) = $src2", 2742 []>, 2743 Requires<[HasV4T]>; 2744 2745 // if (!Pv) memb(##global) = Rt 2746 let neverHasSideEffects = 1, isPredicated = 1 in 2747 def STb_GP_cdnNotPt_V4 : STInst2<(outs), 2748 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2749 "if (!$src1.new) memb(##$global) = $src2", 2750 []>, 2751 Requires<[HasV4T]>; 2752 2753 // memh(#global)=Rt 2754 let isPredicable = 1, neverHasSideEffects = 1 in 2755 def STh_GP_V4 : STInst2<(outs), 2756 (ins globaladdress:$global, IntRegs:$src), 2757 "memh(#$global) = $src", 2758 []>, 2759 Requires<[HasV4T]>; 2760 2761 // if (Pv) memh(##global) = Rt 2762 let neverHasSideEffects = 1, isPredicated = 1 in 2763 def STh_GP_cPt_V4 : STInst2<(outs), 2764 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2765 "if ($src1) memh(##$global) = $src2", 2766 []>, 2767 Requires<[HasV4T]>; 2768 2769 // if (!Pv) memh(##global) = Rt 2770 let neverHasSideEffects = 1, isPredicated = 1 in 2771 def STh_GP_cNotPt_V4 : STInst2<(outs), 2772 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2773 "if (!$src1) memh(##$global) = $src2", 2774 []>, 2775 Requires<[HasV4T]>; 2776 2777 // if (Pv) memh(##global) = Rt 2778 let neverHasSideEffects = 1, isPredicated = 1 in 2779 def STh_GP_cdnPt_V4 : STInst2<(outs), 2780 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2781 "if ($src1.new) memh(##$global) = $src2", 2782 []>, 2783 Requires<[HasV4T]>; 2784 2785 // if (!Pv) memh(##global) = Rt 2786 let neverHasSideEffects = 1, isPredicated = 1 in 2787 def STh_GP_cdnNotPt_V4 : STInst2<(outs), 2788 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2789 "if (!$src1.new) memh(##$global) = $src2", 2790 []>, 2791 Requires<[HasV4T]>; 2792 2793 // memw(#global)=Rt 2794 let isPredicable = 1, neverHasSideEffects = 1 in 2795 def STw_GP_V4 : STInst2<(outs), 2796 (ins globaladdress:$global, IntRegs:$src), 2797 "memw(#$global) = $src", 2798 []>, 2799 Requires<[HasV4T]>; 2800 2801 // if (Pv) memw(##global) = Rt 2802 let neverHasSideEffects = 1, isPredicated = 1 in 2803 def STw_GP_cPt_V4 : STInst2<(outs), 2804 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2805 "if ($src1) memw(##$global) = $src2", 2806 []>, 2807 Requires<[HasV4T]>; 2808 2809 // if (!Pv) memw(##global) = Rt 2810 let neverHasSideEffects = 1, isPredicated = 1 in 2811 def STw_GP_cNotPt_V4 : STInst2<(outs), 2812 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2813 "if (!$src1) memw(##$global) = $src2", 2814 []>, 2815 Requires<[HasV4T]>; 2816 2817 // if (Pv) memw(##global) = Rt 2818 let neverHasSideEffects = 1, isPredicated = 1 in 2819 def STw_GP_cdnPt_V4 : STInst2<(outs), 2820 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2821 "if ($src1.new) memw(##$global) = $src2", 2822 []>, 2823 Requires<[HasV4T]>; 2824 2825 // if (!Pv) memw(##global) = Rt 2826 let neverHasSideEffects = 1, isPredicated = 1 in 2827 def STw_GP_cdnNotPt_V4 : STInst2<(outs), 2828 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 2829 "if (!$src1.new) memw(##$global) = $src2", 2830 []>, 2831 Requires<[HasV4T]>; 2832 2833 // 64 bit atomic store 2834 def : Pat <(atomic_store_64 (HexagonCONST32_GP tglobaladdr:$global), 2835 (i64 DoubleRegs:$src1)), 2836 (STd_GP_V4 tglobaladdr:$global, (i64 DoubleRegs:$src1))>, 2837 Requires<[HasV4T]>; 2838 2839 // Map from store(globaladdress) -> memd(#foo) 2840 let AddedComplexity = 100 in 2841 def : Pat <(store (i64 DoubleRegs:$src1), 2842 (HexagonCONST32_GP tglobaladdr:$global)), 2843 (STd_GP_V4 tglobaladdr:$global, (i64 DoubleRegs:$src1))>, 2844 Requires<[HasV4T]>; 2845 2846 // 8 bit atomic store 2847 def : Pat < (atomic_store_8 (HexagonCONST32_GP tglobaladdr:$global), 2848 (i32 IntRegs:$src1)), 2849 (STb_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, 2850 Requires<[HasV4T]>; 2851 2852 // Map from store(globaladdress) -> memb(#foo) 2853 let AddedComplexity = 100 in 2854 def : Pat<(truncstorei8 (i32 IntRegs:$src1), 2855 (HexagonCONST32_GP tglobaladdr:$global)), 2856 (STb_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, 2857 Requires<[HasV4T]>; 2858 2859 // Map from "i1 = constant<-1>; memw(CONST32(#foo)) = i1" 2860 // to "r0 = 1; memw(#foo) = r0" 2861 let AddedComplexity = 100 in 2862 def : Pat<(store (i1 -1), (HexagonCONST32_GP tglobaladdr:$global)), 2863 (STb_GP_V4 tglobaladdr:$global, (TFRI 1))>, 2864 Requires<[HasV4T]>; 2865 2866 def : Pat<(atomic_store_16 (HexagonCONST32_GP tglobaladdr:$global), 2867 (i32 IntRegs:$src1)), 2868 (STh_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, 2869 Requires<[HasV4T]>; 2870 2871 // Map from store(globaladdress) -> memh(#foo) 2872 let AddedComplexity = 100 in 2873 def : Pat<(truncstorei16 (i32 IntRegs:$src1), 2874 (HexagonCONST32_GP tglobaladdr:$global)), 2875 (STh_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, 2876 Requires<[HasV4T]>; 2877 2878 // 32 bit atomic store 2879 def : Pat<(atomic_store_32 (HexagonCONST32_GP tglobaladdr:$global), 2880 (i32 IntRegs:$src1)), 2881 (STw_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, 2882 Requires<[HasV4T]>; 2883 2884 // Map from store(globaladdress) -> memw(#foo) 2885 let AddedComplexity = 100 in 2886 def : Pat<(store (i32 IntRegs:$src1), (HexagonCONST32_GP tglobaladdr:$global)), 2887 (STw_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, 2888 Requires<[HasV4T]>; 2889 2890 def : Pat<(atomic_store_64 (add (HexagonCONST32_GP tglobaladdr:$global), 2891 u16ImmPred:$offset), 2892 (i64 DoubleRegs:$src1)), 2893 (STrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, 2894 (i64 DoubleRegs:$src1))>, 2895 Requires<[HasV4T]>; 2896 2897 def : Pat<(atomic_store_32 (add (HexagonCONST32_GP tglobaladdr:$global), 2898 u16ImmPred:$offset), 2899 (i32 IntRegs:$src1)), 2900 (STriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, 2901 (i32 IntRegs:$src1))>, 2902 Requires<[HasV4T]>; 2903 2904 def : Pat<(atomic_store_16 (add (HexagonCONST32_GP tglobaladdr:$global), 2905 u16ImmPred:$offset), 2906 (i32 IntRegs:$src1)), 2907 (STrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, 2908 (i32 IntRegs:$src1))>, 2909 Requires<[HasV4T]>; 2910 2911 def : Pat<(atomic_store_8 (add (HexagonCONST32_GP tglobaladdr:$global), 2912 u16ImmPred:$offset), 2913 (i32 IntRegs:$src1)), 2914 (STrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, 2915 (i32 IntRegs:$src1))>, 2916 Requires<[HasV4T]>; 2917 2918 // Map from store(globaladdress + x) -> memd(#foo + x) 2919 let AddedComplexity = 100 in 2920 def : Pat<(store (i64 DoubleRegs:$src1), 2921 (add (HexagonCONST32_GP tglobaladdr:$global), 2922 u16ImmPred:$offset)), 2923 (STrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, 2924 (i64 DoubleRegs:$src1))>, 2925 Requires<[HasV4T]>; 2926 2927 // Map from store(globaladdress + x) -> memb(#foo + x) 2928 let AddedComplexity = 100 in 2929 def : Pat<(truncstorei8 (i32 IntRegs:$src1), 2930 (add (HexagonCONST32_GP tglobaladdr:$global), 2931 u16ImmPred:$offset)), 2932 (STrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, 2933 (i32 IntRegs:$src1))>, 2934 Requires<[HasV4T]>; 2935 2936 // Map from store(globaladdress + x) -> memh(#foo + x) 2937 let AddedComplexity = 100 in 2938 def : Pat<(truncstorei16 (i32 IntRegs:$src1), 2939 (add (HexagonCONST32_GP tglobaladdr:$global), 2940 u16ImmPred:$offset)), 2941 (STrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, 2942 (i32 IntRegs:$src1))>, 2943 Requires<[HasV4T]>; 2944 2945 // Map from store(globaladdress + x) -> memw(#foo + x) 2946 let AddedComplexity = 100 in 2947 def : Pat<(store (i32 IntRegs:$src1), 2948 (add (HexagonCONST32_GP tglobaladdr:$global), 2949 u16ImmPred:$offset)), 2950 (STriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, 2951 (i32 IntRegs:$src1))>, 2952 Requires<[HasV4T]>; 2953 2954 2955 2956 //===----------------------------------------------------------------------=== 2957 // ST - 2958 //===----------------------------------------------------------------------=== 2959 2960 2961 //===----------------------------------------------------------------------===// 2962 // NV/ST + 2963 //===----------------------------------------------------------------------===// 2964 2965 // Store new-value byte. 2966 2967 // memb(Re=#U6)=Nt.new 2968 // memb(Rs+#s11:0)=Nt.new 2969 let mayStore = 1, isPredicable = 1 in 2970 def STrib_nv_V4 : NVInst_V4<(outs), (ins MEMri:$addr, IntRegs:$src1), 2971 "memb($addr) = $src1.new", 2972 []>, 2973 Requires<[HasV4T]>; 2974 2975 let mayStore = 1, isPredicable = 1 in 2976 def STrib_indexed_nv_V4 : NVInst_V4<(outs), 2977 (ins IntRegs:$src1, s11_0Imm:$src2, IntRegs:$src3), 2978 "memb($src1+#$src2) = $src3.new", 2979 []>, 2980 Requires<[HasV4T]>; 2981 2982 // memb(Rs+Ru<<#u2)=Nt.new 2983 let mayStore = 1, AddedComplexity = 10, isPredicable = 1 in 2984 def STrib_indexed_shl_nv_V4 : NVInst_V4<(outs), 2985 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4), 2986 "memb($src1+$src2<<#$src3) = $src4.new", 2987 []>, 2988 Requires<[HasV4T]>; 2989 2990 // memb(Ru<<#u2+#U6)=Nt.new 2991 let mayStore = 1, AddedComplexity = 10 in 2992 def STrib_shl_nv_V4 : NVInst_V4<(outs), 2993 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4), 2994 "memb($src1<<#$src2+#$src3) = $src4.new", 2995 []>, 2996 Requires<[HasV4T]>; 2997 2998 // memb(Rx++#s4:0)=Nt.new 2999 let mayStore = 1, hasCtrlDep = 1, isPredicable = 1 in 3000 def POST_STbri_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3001 (ins IntRegs:$src1, IntRegs:$src2, s4_0Imm:$offset), 3002 "memb($src2++#$offset) = $src1.new", 3003 [], 3004 "$src2 = $dst">, 3005 Requires<[HasV4T]>; 3006 3007 // memb(Rx++#s4:0:circ(Mu))=Nt.new 3008 // memb(Rx++I:circ(Mu))=Nt.new 3009 // memb(Rx++Mu)=Nt.new 3010 // memb(Rx++Mu:brev)=Nt.new 3011 3012 // memb(gp+#u16:0)=Nt.new 3013 let mayStore = 1, neverHasSideEffects = 1 in 3014 def STrib_GP_nv_V4 : NVInst_V4<(outs), 3015 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src), 3016 "memb(#$global+$offset) = $src.new", 3017 []>, 3018 Requires<[HasV4T]>; 3019 3020 // memb(#global)=Nt.new 3021 let mayStore = 1, neverHasSideEffects = 1 in 3022 def STb_GP_nv_V4 : NVInst_V4<(outs), 3023 (ins globaladdress:$global, IntRegs:$src), 3024 "memb(#$global) = $src.new", 3025 []>, 3026 Requires<[HasV4T]>; 3027 3028 // Store new-value byte conditionally. 3029 // if ([!]Pv[.new]) memb(#u6)=Nt.new 3030 // if (Pv) memb(Rs+#u6:0)=Nt.new 3031 let mayStore = 1, neverHasSideEffects = 1, 3032 isPredicated = 1 in 3033 def STrib_cPt_nv_V4 : NVInst_V4<(outs), 3034 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3035 "if ($src1) memb($addr) = $src2.new", 3036 []>, 3037 Requires<[HasV4T]>; 3038 3039 // if (Pv.new) memb(Rs+#u6:0)=Nt.new 3040 let mayStore = 1, neverHasSideEffects = 1, 3041 isPredicated = 1 in 3042 def STrib_cdnPt_nv_V4 : NVInst_V4<(outs), 3043 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3044 "if ($src1.new) memb($addr) = $src2.new", 3045 []>, 3046 Requires<[HasV4T]>; 3047 3048 // if (!Pv) memb(Rs+#u6:0)=Nt.new 3049 let mayStore = 1, neverHasSideEffects = 1, 3050 isPredicated = 1 in 3051 def STrib_cNotPt_nv_V4 : NVInst_V4<(outs), 3052 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3053 "if (!$src1) memb($addr) = $src2.new", 3054 []>, 3055 Requires<[HasV4T]>; 3056 3057 // if (!Pv.new) memb(Rs+#u6:0)=Nt.new 3058 let mayStore = 1, neverHasSideEffects = 1, 3059 isPredicated = 1 in 3060 def STrib_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3061 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3062 "if (!$src1.new) memb($addr) = $src2.new", 3063 []>, 3064 Requires<[HasV4T]>; 3065 3066 // if (Pv) memb(Rs+#u6:0)=Nt.new 3067 let mayStore = 1, neverHasSideEffects = 1, 3068 isPredicated = 1 in 3069 def STrib_indexed_cPt_nv_V4 : NVInst_V4<(outs), 3070 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), 3071 "if ($src1) memb($src2+#$src3) = $src4.new", 3072 []>, 3073 Requires<[HasV4T]>; 3074 3075 // if (Pv.new) memb(Rs+#u6:0)=Nt.new 3076 let mayStore = 1, neverHasSideEffects = 1, 3077 isPredicated = 1 in 3078 def STrib_indexed_cdnPt_nv_V4 : NVInst_V4<(outs), 3079 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), 3080 "if ($src1.new) memb($src2+#$src3) = $src4.new", 3081 []>, 3082 Requires<[HasV4T]>; 3083 3084 // if (!Pv) memb(Rs+#u6:0)=Nt.new 3085 let mayStore = 1, neverHasSideEffects = 1, 3086 isPredicated = 1 in 3087 def STrib_indexed_cNotPt_nv_V4 : NVInst_V4<(outs), 3088 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), 3089 "if (!$src1) memb($src2+#$src3) = $src4.new", 3090 []>, 3091 Requires<[HasV4T]>; 3092 3093 // if (!Pv.new) memb(Rs+#u6:0)=Nt.new 3094 let mayStore = 1, neverHasSideEffects = 1, 3095 isPredicated = 1 in 3096 def STrib_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3097 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), 3098 "if (!$src1.new) memb($src2+#$src3) = $src4.new", 3099 []>, 3100 Requires<[HasV4T]>; 3101 3102 3103 // if ([!]Pv[.new]) memb(Rs+Ru<<#u2)=Nt.new 3104 // if (Pv) memb(Rs+Ru<<#u2)=Nt.new 3105 let mayStore = 1, AddedComplexity = 10, 3106 isPredicated = 1 in 3107 def STrib_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs), 3108 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3109 IntRegs:$src5), 3110 "if ($src1) memb($src2+$src3<<#$src4) = $src5.new", 3111 []>, 3112 Requires<[HasV4T]>; 3113 3114 // if (Pv.new) memb(Rs+Ru<<#u2)=Nt.new 3115 let mayStore = 1, AddedComplexity = 10, 3116 isPredicated = 1 in 3117 def STrib_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs), 3118 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3119 IntRegs:$src5), 3120 "if ($src1.new) memb($src2+$src3<<#$src4) = $src5.new", 3121 []>, 3122 Requires<[HasV4T]>; 3123 3124 // if (!Pv) memb(Rs+Ru<<#u2)=Nt.new 3125 let mayStore = 1, AddedComplexity = 10, 3126 isPredicated = 1 in 3127 def STrib_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs), 3128 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3129 IntRegs:$src5), 3130 "if (!$src1) memb($src2+$src3<<#$src4) = $src5.new", 3131 []>, 3132 Requires<[HasV4T]>; 3133 3134 // if (!Pv.new) memb(Rs+Ru<<#u2)=Nt.new 3135 let mayStore = 1, AddedComplexity = 10, 3136 isPredicated = 1 in 3137 def STrib_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3138 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3139 IntRegs:$src5), 3140 "if (!$src1.new) memb($src2+$src3<<#$src4) = $src5.new", 3141 []>, 3142 Requires<[HasV4T]>; 3143 3144 // if ([!]Pv[.new]) memb(Rx++#s4:0)=Nt.new 3145 // if (Pv) memb(Rx++#s4:0)=Nt.new 3146 let mayStore = 1, hasCtrlDep = 1, 3147 isPredicated = 1 in 3148 def POST_STbri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3149 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), 3150 "if ($src1) memb($src3++#$offset) = $src2.new", 3151 [],"$src3 = $dst">, 3152 Requires<[HasV4T]>; 3153 3154 // if (Pv.new) memb(Rx++#s4:0)=Nt.new 3155 let mayStore = 1, hasCtrlDep = 1, 3156 isPredicated = 1 in 3157 def POST_STbri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3158 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), 3159 "if ($src1.new) memb($src3++#$offset) = $src2.new", 3160 [],"$src3 = $dst">, 3161 Requires<[HasV4T]>; 3162 3163 // if (!Pv) memb(Rx++#s4:0)=Nt.new 3164 let mayStore = 1, hasCtrlDep = 1, 3165 isPredicated = 1 in 3166 def POST_STbri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3167 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), 3168 "if (!$src1) memb($src3++#$offset) = $src2.new", 3169 [],"$src3 = $dst">, 3170 Requires<[HasV4T]>; 3171 3172 // if (!Pv.new) memb(Rx++#s4:0)=Nt.new 3173 let mayStore = 1, hasCtrlDep = 1, 3174 isPredicated = 1 in 3175 def POST_STbri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3176 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), 3177 "if (!$src1.new) memb($src3++#$offset) = $src2.new", 3178 [],"$src3 = $dst">, 3179 Requires<[HasV4T]>; 3180 3181 3182 // Store new-value halfword. 3183 // memh(Re=#U6)=Nt.new 3184 // memh(Rs+#s11:1)=Nt.new 3185 let mayStore = 1, isPredicable = 1 in 3186 def STrih_nv_V4 : NVInst_V4<(outs), (ins MEMri:$addr, IntRegs:$src1), 3187 "memh($addr) = $src1.new", 3188 []>, 3189 Requires<[HasV4T]>; 3190 3191 let mayStore = 1, isPredicable = 1 in 3192 def STrih_indexed_nv_V4 : NVInst_V4<(outs), 3193 (ins IntRegs:$src1, s11_1Imm:$src2, IntRegs:$src3), 3194 "memh($src1+#$src2) = $src3.new", 3195 []>, 3196 Requires<[HasV4T]>; 3197 3198 // memh(Rs+Ru<<#u2)=Nt.new 3199 let mayStore = 1, AddedComplexity = 10, isPredicable = 1 in 3200 def STrih_indexed_shl_nv_V4 : NVInst_V4<(outs), 3201 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4), 3202 "memh($src1+$src2<<#$src3) = $src4.new", 3203 []>, 3204 Requires<[HasV4T]>; 3205 3206 // memh(Ru<<#u2+#U6)=Nt.new 3207 let mayStore = 1, AddedComplexity = 10 in 3208 def STrih_shl_nv_V4 : NVInst_V4<(outs), 3209 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4), 3210 "memh($src1<<#$src2+#$src3) = $src4.new", 3211 []>, 3212 Requires<[HasV4T]>; 3213 3214 // memh(Rx++#s4:1)=Nt.new 3215 let mayStore = 1, hasCtrlDep = 1, isPredicable = 1 in 3216 def POST_SThri_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3217 (ins IntRegs:$src1, IntRegs:$src2, s4_1Imm:$offset), 3218 "memh($src2++#$offset) = $src1.new", 3219 [], 3220 "$src2 = $dst">, 3221 Requires<[HasV4T]>; 3222 3223 // memh(Rx++#s4:1:circ(Mu))=Nt.new 3224 // memh(Rx++I:circ(Mu))=Nt.new 3225 // memh(Rx++Mu)=Nt.new 3226 // memh(Rx++Mu:brev)=Nt.new 3227 3228 // memh(gp+#u16:1)=Nt.new 3229 let mayStore = 1, neverHasSideEffects = 1 in 3230 def STrih_GP_nv_V4 : NVInst_V4<(outs), 3231 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src), 3232 "memh(#$global+$offset) = $src.new", 3233 []>, 3234 Requires<[HasV4T]>; 3235 3236 // memh(#global)=Nt.new 3237 let mayStore = 1, neverHasSideEffects = 1 in 3238 def STh_GP_nv_V4 : NVInst_V4<(outs), 3239 (ins globaladdress:$global, IntRegs:$src), 3240 "memh(#$global) = $src.new", 3241 []>, 3242 Requires<[HasV4T]>; 3243 3244 3245 // Store new-value halfword conditionally. 3246 3247 // if ([!]Pv[.new]) memh(#u6)=Nt.new 3248 3249 // if ([!]Pv[.new]) memh(Rs+#u6:1)=Nt.new 3250 // if (Pv) memh(Rs+#u6:1)=Nt.new 3251 let mayStore = 1, neverHasSideEffects = 1, 3252 isPredicated = 1 in 3253 def STrih_cPt_nv_V4 : NVInst_V4<(outs), 3254 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3255 "if ($src1) memh($addr) = $src2.new", 3256 []>, 3257 Requires<[HasV4T]>; 3258 3259 // if (Pv.new) memh(Rs+#u6:1)=Nt.new 3260 let mayStore = 1, neverHasSideEffects = 1, 3261 isPredicated = 1 in 3262 def STrih_cdnPt_nv_V4 : NVInst_V4<(outs), 3263 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3264 "if ($src1.new) memh($addr) = $src2.new", 3265 []>, 3266 Requires<[HasV4T]>; 3267 3268 // if (!Pv) memh(Rs+#u6:1)=Nt.new 3269 let mayStore = 1, neverHasSideEffects = 1, 3270 isPredicated = 1 in 3271 def STrih_cNotPt_nv_V4 : NVInst_V4<(outs), 3272 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3273 "if (!$src1) memh($addr) = $src2.new", 3274 []>, 3275 Requires<[HasV4T]>; 3276 3277 // if (!Pv.new) memh(Rs+#u6:1)=Nt.new 3278 let mayStore = 1, neverHasSideEffects = 1, 3279 isPredicated = 1 in 3280 def STrih_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3281 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3282 "if (!$src1.new) memh($addr) = $src2.new", 3283 []>, 3284 Requires<[HasV4T]>; 3285 3286 // if (Pv) memh(Rs+#u6:1)=Nt.new 3287 let mayStore = 1, neverHasSideEffects = 1, 3288 isPredicated = 1 in 3289 def STrih_indexed_cPt_nv_V4 : NVInst_V4<(outs), 3290 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), 3291 "if ($src1) memh($src2+#$src3) = $src4.new", 3292 []>, 3293 Requires<[HasV4T]>; 3294 3295 // if (Pv.new) memh(Rs+#u6:1)=Nt.new 3296 let mayStore = 1, neverHasSideEffects = 1, 3297 isPredicated = 1 in 3298 def STrih_indexed_cdnPt_nv_V4 : NVInst_V4<(outs), 3299 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), 3300 "if ($src1.new) memh($src2+#$src3) = $src4.new", 3301 []>, 3302 Requires<[HasV4T]>; 3303 3304 // if (!Pv) memh(Rs+#u6:1)=Nt.new 3305 let mayStore = 1, neverHasSideEffects = 1, 3306 isPredicated = 1 in 3307 def STrih_indexed_cNotPt_nv_V4 : NVInst_V4<(outs), 3308 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), 3309 "if (!$src1) memh($src2+#$src3) = $src4.new", 3310 []>, 3311 Requires<[HasV4T]>; 3312 3313 // if (!Pv.new) memh(Rs+#u6:1)=Nt.new 3314 let mayStore = 1, neverHasSideEffects = 1, 3315 isPredicated = 1 in 3316 def STrih_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3317 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), 3318 "if (!$src1.new) memh($src2+#$src3) = $src4.new", 3319 []>, 3320 Requires<[HasV4T]>; 3321 3322 // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Nt.new 3323 // if (Pv) memh(Rs+Ru<<#u2)=Nt.new 3324 let mayStore = 1, AddedComplexity = 10, 3325 isPredicated = 1 in 3326 def STrih_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs), 3327 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3328 IntRegs:$src5), 3329 "if ($src1) memh($src2+$src3<<#$src4) = $src5.new", 3330 []>, 3331 Requires<[HasV4T]>; 3332 3333 // if (Pv.new) memh(Rs+Ru<<#u2)=Nt.new 3334 let mayStore = 1, AddedComplexity = 10, 3335 isPredicated = 1 in 3336 def STrih_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs), 3337 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3338 IntRegs:$src5), 3339 "if ($src1.new) memh($src2+$src3<<#$src4) = $src5.new", 3340 []>, 3341 Requires<[HasV4T]>; 3342 3343 // if (!Pv) memh(Rs+Ru<<#u2)=Nt.new 3344 let mayStore = 1, AddedComplexity = 10, 3345 isPredicated = 1 in 3346 def STrih_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs), 3347 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3348 IntRegs:$src5), 3349 "if (!$src1) memh($src2+$src3<<#$src4) = $src5.new", 3350 []>, 3351 Requires<[HasV4T]>; 3352 3353 // if (!Pv.new) memh(Rs+Ru<<#u2)=Nt.new 3354 let mayStore = 1, AddedComplexity = 10, 3355 isPredicated = 1 in 3356 def STrih_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3357 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3358 IntRegs:$src5), 3359 "if (!$src1.new) memh($src2+$src3<<#$src4) = $src5.new", 3360 []>, 3361 Requires<[HasV4T]>; 3362 3363 // if ([!]Pv[]) memh(Rx++#s4:1)=Nt.new 3364 // if (Pv) memh(Rx++#s4:1)=Nt.new 3365 let mayStore = 1, hasCtrlDep = 1, 3366 isPredicated = 1 in 3367 def POST_SThri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3368 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), 3369 "if ($src1) memh($src3++#$offset) = $src2.new", 3370 [],"$src3 = $dst">, 3371 Requires<[HasV4T]>; 3372 3373 // if (Pv.new) memh(Rx++#s4:1)=Nt.new 3374 let mayStore = 1, hasCtrlDep = 1, 3375 isPredicated = 1 in 3376 def POST_SThri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3377 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), 3378 "if ($src1.new) memh($src3++#$offset) = $src2.new", 3379 [],"$src3 = $dst">, 3380 Requires<[HasV4T]>; 3381 3382 // if (!Pv) memh(Rx++#s4:1)=Nt.new 3383 let mayStore = 1, hasCtrlDep = 1, 3384 isPredicated = 1 in 3385 def POST_SThri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3386 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), 3387 "if (!$src1) memh($src3++#$offset) = $src2.new", 3388 [],"$src3 = $dst">, 3389 Requires<[HasV4T]>; 3390 3391 // if (!Pv.new) memh(Rx++#s4:1)=Nt.new 3392 let mayStore = 1, hasCtrlDep = 1, 3393 isPredicated = 1 in 3394 def POST_SThri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3395 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), 3396 "if (!$src1.new) memh($src3++#$offset) = $src2.new", 3397 [],"$src3 = $dst">, 3398 Requires<[HasV4T]>; 3399 3400 3401 // Store new-value word. 3402 3403 // memw(Re=#U6)=Nt.new 3404 // memw(Rs+#s11:2)=Nt.new 3405 let mayStore = 1, isPredicable = 1 in 3406 def STriw_nv_V4 : NVInst_V4<(outs), 3407 (ins MEMri:$addr, IntRegs:$src1), 3408 "memw($addr) = $src1.new", 3409 []>, 3410 Requires<[HasV4T]>; 3411 3412 let mayStore = 1, isPredicable = 1 in 3413 def STriw_indexed_nv_V4 : NVInst_V4<(outs), 3414 (ins IntRegs:$src1, s11_2Imm:$src2, IntRegs:$src3), 3415 "memw($src1+#$src2) = $src3.new", 3416 []>, 3417 Requires<[HasV4T]>; 3418 3419 // memw(Rs+Ru<<#u2)=Nt.new 3420 let mayStore = 1, AddedComplexity = 10, isPredicable = 1 in 3421 def STriw_indexed_shl_nv_V4 : NVInst_V4<(outs), 3422 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4), 3423 "memw($src1+$src2<<#$src3) = $src4.new", 3424 []>, 3425 Requires<[HasV4T]>; 3426 3427 // memw(Ru<<#u2+#U6)=Nt.new 3428 let mayStore = 1, AddedComplexity = 10 in 3429 def STriw_shl_nv_V4 : NVInst_V4<(outs), 3430 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4), 3431 "memw($src1<<#$src2+#$src3) = $src4.new", 3432 []>, 3433 Requires<[HasV4T]>; 3434 3435 // memw(Rx++#s4:2)=Nt.new 3436 let mayStore = 1, hasCtrlDep = 1, isPredicable = 1 in 3437 def POST_STwri_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3438 (ins IntRegs:$src1, IntRegs:$src2, s4_2Imm:$offset), 3439 "memw($src2++#$offset) = $src1.new", 3440 [], 3441 "$src2 = $dst">, 3442 Requires<[HasV4T]>; 3443 3444 // memw(Rx++#s4:2:circ(Mu))=Nt.new 3445 // memw(Rx++I:circ(Mu))=Nt.new 3446 // memw(Rx++Mu)=Nt.new 3447 // memw(Rx++Mu:brev)=Nt.new 3448 // memw(gp+#u16:2)=Nt.new 3449 let mayStore = 1, neverHasSideEffects = 1 in 3450 def STriw_GP_nv_V4 : NVInst_V4<(outs), 3451 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src), 3452 "memw(#$global+$offset) = $src.new", 3453 []>, 3454 Requires<[HasV4T]>; 3455 3456 let mayStore = 1, neverHasSideEffects = 1 in 3457 def STw_GP_nv_V4 : NVInst_V4<(outs), 3458 (ins globaladdress:$global, IntRegs:$src), 3459 "memw(#$global) = $src.new", 3460 []>, 3461 Requires<[HasV4T]>; 3462 3463 // Store new-value word conditionally. 3464 3465 // if ([!]Pv[.new]) memw(#u6)=Nt.new 3466 3467 // if ([!]Pv[.new]) memw(Rs+#u6:2)=Nt.new 3468 // if (Pv) memw(Rs+#u6:2)=Nt.new 3469 let mayStore = 1, neverHasSideEffects = 1, 3470 isPredicated = 1 in 3471 def STriw_cPt_nv_V4 : NVInst_V4<(outs), 3472 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3473 "if ($src1) memw($addr) = $src2.new", 3474 []>, 3475 Requires<[HasV4T]>; 3476 3477 // if (Pv.new) memw(Rs+#u6:2)=Nt.new 3478 let mayStore = 1, neverHasSideEffects = 1, 3479 isPredicated = 1 in 3480 def STriw_cdnPt_nv_V4 : NVInst_V4<(outs), 3481 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3482 "if ($src1.new) memw($addr) = $src2.new", 3483 []>, 3484 Requires<[HasV4T]>; 3485 3486 // if (!Pv) memw(Rs+#u6:2)=Nt.new 3487 let mayStore = 1, neverHasSideEffects = 1, 3488 isPredicated = 1 in 3489 def STriw_cNotPt_nv_V4 : NVInst_V4<(outs), 3490 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3491 "if (!$src1) memw($addr) = $src2.new", 3492 []>, 3493 Requires<[HasV4T]>; 3494 3495 // if (!Pv.new) memw(Rs+#u6:2)=Nt.new 3496 let mayStore = 1, neverHasSideEffects = 1, 3497 isPredicated = 1 in 3498 def STriw_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3499 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), 3500 "if (!$src1.new) memw($addr) = $src2.new", 3501 []>, 3502 Requires<[HasV4T]>; 3503 3504 // if (Pv) memw(Rs+#u6:2)=Nt.new 3505 let mayStore = 1, neverHasSideEffects = 1, 3506 isPredicated = 1 in 3507 def STriw_indexed_cPt_nv_V4 : NVInst_V4<(outs), 3508 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), 3509 "if ($src1) memw($src2+#$src3) = $src4.new", 3510 []>, 3511 Requires<[HasV4T]>; 3512 3513 // if (Pv.new) memw(Rs+#u6:2)=Nt.new 3514 let mayStore = 1, neverHasSideEffects = 1, 3515 isPredicated = 1 in 3516 def STriw_indexed_cdnPt_nv_V4 : NVInst_V4<(outs), 3517 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), 3518 "if ($src1.new) memw($src2+#$src3) = $src4.new", 3519 []>, 3520 Requires<[HasV4T]>; 3521 3522 // if (!Pv) memw(Rs+#u6:2)=Nt.new 3523 let mayStore = 1, neverHasSideEffects = 1, 3524 isPredicated = 1 in 3525 def STriw_indexed_cNotPt_nv_V4 : NVInst_V4<(outs), 3526 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), 3527 "if (!$src1) memw($src2+#$src3) = $src4.new", 3528 []>, 3529 Requires<[HasV4T]>; 3530 3531 // if (!Pv.new) memw(Rs+#u6:2)=Nt.new 3532 let mayStore = 1, neverHasSideEffects = 1, 3533 isPredicated = 1 in 3534 def STriw_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3535 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), 3536 "if (!$src1.new) memw($src2+#$src3) = $src4.new", 3537 []>, 3538 Requires<[HasV4T]>; 3539 3540 3541 // if ([!]Pv[.new]) memw(Rs+Ru<<#u2)=Nt.new 3542 // if (Pv) memw(Rs+Ru<<#u2)=Nt.new 3543 let mayStore = 1, AddedComplexity = 10, 3544 isPredicated = 1 in 3545 def STriw_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs), 3546 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3547 IntRegs:$src5), 3548 "if ($src1) memw($src2+$src3<<#$src4) = $src5.new", 3549 []>, 3550 Requires<[HasV4T]>; 3551 3552 // if (Pv.new) memw(Rs+Ru<<#u2)=Nt.new 3553 let mayStore = 1, AddedComplexity = 10, 3554 isPredicated = 1 in 3555 def STriw_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs), 3556 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3557 IntRegs:$src5), 3558 "if ($src1.new) memw($src2+$src3<<#$src4) = $src5.new", 3559 []>, 3560 Requires<[HasV4T]>; 3561 3562 // if (!Pv) memw(Rs+Ru<<#u2)=Nt.new 3563 let mayStore = 1, AddedComplexity = 10, 3564 isPredicated = 1 in 3565 def STriw_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs), 3566 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3567 IntRegs:$src5), 3568 "if (!$src1) memw($src2+$src3<<#$src4) = $src5.new", 3569 []>, 3570 Requires<[HasV4T]>; 3571 3572 // if (!Pv.new) memw(Rs+Ru<<#u2)=Nt.new 3573 let mayStore = 1, AddedComplexity = 10, 3574 isPredicated = 1 in 3575 def STriw_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3576 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, 3577 IntRegs:$src5), 3578 "if (!$src1.new) memw($src2+$src3<<#$src4) = $src5.new", 3579 []>, 3580 Requires<[HasV4T]>; 3581 3582 // if ([!]Pv[.new]) memw(Rx++#s4:2)=Nt.new 3583 // if (Pv) memw(Rx++#s4:2)=Nt.new 3584 let mayStore = 1, hasCtrlDep = 1, 3585 isPredicated = 1 in 3586 def POST_STwri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3587 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), 3588 "if ($src1) memw($src3++#$offset) = $src2.new", 3589 [],"$src3 = $dst">, 3590 Requires<[HasV4T]>; 3591 3592 // if (Pv.new) memw(Rx++#s4:2)=Nt.new 3593 let mayStore = 1, hasCtrlDep = 1, 3594 isPredicated = 1 in 3595 def POST_STwri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3596 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), 3597 "if ($src1.new) memw($src3++#$offset) = $src2.new", 3598 [],"$src3 = $dst">, 3599 Requires<[HasV4T]>; 3600 3601 // if (!Pv) memw(Rx++#s4:2)=Nt.new 3602 let mayStore = 1, hasCtrlDep = 1, 3603 isPredicated = 1 in 3604 def POST_STwri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3605 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), 3606 "if (!$src1) memw($src3++#$offset) = $src2.new", 3607 [],"$src3 = $dst">, 3608 Requires<[HasV4T]>; 3609 3610 // if (!Pv.new) memw(Rx++#s4:2)=Nt.new 3611 let mayStore = 1, hasCtrlDep = 1, 3612 isPredicated = 1 in 3613 def POST_STwri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), 3614 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), 3615 "if (!$src1.new) memw($src3++#$offset) = $src2.new", 3616 [],"$src3 = $dst">, 3617 Requires<[HasV4T]>; 3618 3619 3620 3621 // if (Pv) memb(##global) = Rt 3622 let mayStore = 1, neverHasSideEffects = 1 in 3623 def STb_GP_cPt_nv_V4 : NVInst_V4<(outs), 3624 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3625 "if ($src1) memb(##$global) = $src2.new", 3626 []>, 3627 Requires<[HasV4T]>; 3628 3629 // if (!Pv) memb(##global) = Rt 3630 let mayStore = 1, neverHasSideEffects = 1 in 3631 def STb_GP_cNotPt_nv_V4 : NVInst_V4<(outs), 3632 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3633 "if (!$src1) memb(##$global) = $src2.new", 3634 []>, 3635 Requires<[HasV4T]>; 3636 3637 // if (Pv) memb(##global) = Rt 3638 let mayStore = 1, neverHasSideEffects = 1 in 3639 def STb_GP_cdnPt_nv_V4 : NVInst_V4<(outs), 3640 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3641 "if ($src1.new) memb(##$global) = $src2.new", 3642 []>, 3643 Requires<[HasV4T]>; 3644 3645 // if (!Pv) memb(##global) = Rt 3646 let mayStore = 1, neverHasSideEffects = 1 in 3647 def STb_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3648 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3649 "if (!$src1.new) memb(##$global) = $src2.new", 3650 []>, 3651 Requires<[HasV4T]>; 3652 3653 // if (Pv) memh(##global) = Rt 3654 let mayStore = 1, neverHasSideEffects = 1 in 3655 def STh_GP_cPt_nv_V4 : NVInst_V4<(outs), 3656 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3657 "if ($src1) memh(##$global) = $src2.new", 3658 []>, 3659 Requires<[HasV4T]>; 3660 3661 // if (!Pv) memh(##global) = Rt 3662 let mayStore = 1, neverHasSideEffects = 1 in 3663 def STh_GP_cNotPt_nv_V4 : NVInst_V4<(outs), 3664 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3665 "if (!$src1) memh(##$global) = $src2.new", 3666 []>, 3667 Requires<[HasV4T]>; 3668 3669 // if (Pv) memh(##global) = Rt 3670 let mayStore = 1, neverHasSideEffects = 1 in 3671 def STh_GP_cdnPt_nv_V4 : NVInst_V4<(outs), 3672 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3673 "if ($src1.new) memh(##$global) = $src2.new", 3674 []>, 3675 Requires<[HasV4T]>; 3676 3677 // if (!Pv) memh(##global) = Rt 3678 let mayStore = 1, neverHasSideEffects = 1 in 3679 def STh_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3680 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3681 "if (!$src1.new) memh(##$global) = $src2.new", 3682 []>, 3683 Requires<[HasV4T]>; 3684 3685 // if (Pv) memw(##global) = Rt 3686 let mayStore = 1, neverHasSideEffects = 1 in 3687 def STw_GP_cPt_nv_V4 : NVInst_V4<(outs), 3688 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3689 "if ($src1) memw(##$global) = $src2.new", 3690 []>, 3691 Requires<[HasV4T]>; 3692 3693 // if (!Pv) memw(##global) = Rt 3694 let mayStore = 1, neverHasSideEffects = 1 in 3695 def STw_GP_cNotPt_nv_V4 : NVInst_V4<(outs), 3696 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3697 "if (!$src1) memw(##$global) = $src2.new", 3698 []>, 3699 Requires<[HasV4T]>; 3700 3701 // if (Pv) memw(##global) = Rt 3702 let mayStore = 1, neverHasSideEffects = 1 in 3703 def STw_GP_cdnPt_nv_V4 : NVInst_V4<(outs), 3704 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3705 "if ($src1.new) memw(##$global) = $src2.new", 3706 []>, 3707 Requires<[HasV4T]>; 3708 3709 // if (!Pv) memw(##global) = Rt 3710 let mayStore = 1, neverHasSideEffects = 1 in 3711 def STw_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3712 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), 3713 "if (!$src1.new) memw(##$global) = $src2.new", 3714 []>, 3715 Requires<[HasV4T]>; 3716 3717 let mayStore = 1, neverHasSideEffects = 1 in 3718 def STrib_GP_cPt_nv_V4 : NVInst_V4<(outs), 3719 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3720 IntRegs:$src2), 3721 "if ($src1) memb(##$global+$offset) = $src2.new", 3722 []>, 3723 Requires<[HasV4T]>; 3724 3725 let mayStore = 1, neverHasSideEffects = 1 in 3726 def STrib_GP_cNotPt_nv_V4 : NVInst_V4<(outs), 3727 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3728 IntRegs:$src2), 3729 "if (!$src1) memb(##$global+$offset) = $src2.new", 3730 []>, 3731 Requires<[HasV4T]>; 3732 3733 let mayStore = 1, neverHasSideEffects = 1 in 3734 def STrib_GP_cdnPt_nv_V4 : NVInst_V4<(outs), 3735 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3736 IntRegs:$src2), 3737 "if ($src1.new) memb(##$global+$offset) = $src2.new", 3738 []>, 3739 Requires<[HasV4T]>; 3740 3741 let mayStore = 1, neverHasSideEffects = 1 in 3742 def STrib_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3743 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3744 IntRegs:$src2), 3745 "if (!$src1.new) memb(##$global+$offset) = $src2.new", 3746 []>, 3747 Requires<[HasV4T]>; 3748 3749 let mayStore = 1, neverHasSideEffects = 1 in 3750 def STrih_GP_cPt_nv_V4 : NVInst_V4<(outs), 3751 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3752 IntRegs:$src2), 3753 "if ($src1) memh(##$global+$offset) = $src2.new", 3754 []>, 3755 Requires<[HasV4T]>; 3756 3757 let mayStore = 1, neverHasSideEffects = 1 in 3758 def STrih_GP_cNotPt_nv_V4 : NVInst_V4<(outs), 3759 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3760 IntRegs:$src2), 3761 "if (!$src1) memh(##$global+$offset) = $src2.new", 3762 []>, 3763 Requires<[HasV4T]>; 3764 3765 let mayStore = 1, neverHasSideEffects = 1 in 3766 def STrih_GP_cdnPt_nv_V4 : NVInst_V4<(outs), 3767 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3768 IntRegs:$src2), 3769 "if ($src1.new) memh(##$global+$offset) = $src2.new", 3770 []>, 3771 Requires<[HasV4T]>; 3772 3773 let mayStore = 1, neverHasSideEffects = 1 in 3774 def STrih_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3775 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3776 IntRegs:$src2), 3777 "if (!$src1.new) memh(##$global+$offset) = $src2.new", 3778 []>, 3779 Requires<[HasV4T]>; 3780 3781 let mayStore = 1, neverHasSideEffects = 1 in 3782 def STriw_GP_cPt_nv_V4 : NVInst_V4<(outs), 3783 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3784 IntRegs:$src2), 3785 "if ($src1) memw(##$global+$offset) = $src2.new", 3786 []>, 3787 Requires<[HasV4T]>; 3788 3789 let mayStore = 1, neverHasSideEffects = 1 in 3790 def STriw_GP_cNotPt_nv_V4 : NVInst_V4<(outs), 3791 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3792 IntRegs:$src2), 3793 "if (!$src1) memw(##$global+$offset) = $src2.new", 3794 []>, 3795 Requires<[HasV4T]>; 3796 3797 let mayStore = 1, neverHasSideEffects = 1 in 3798 def STriw_GP_cdnPt_nv_V4 : NVInst_V4<(outs), 3799 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3800 IntRegs:$src2), 3801 "if ($src1.new) memw(##$global+$offset) = $src2.new", 3802 []>, 3803 Requires<[HasV4T]>; 3804 3805 let mayStore = 1, neverHasSideEffects = 1 in 3806 def STriw_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), 3807 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, 3808 IntRegs:$src2), 3809 "if (!$src1.new) memw(##$global+$offset) = $src2.new", 3810 []>, 3811 Requires<[HasV4T]>; 3812 3813 //===----------------------------------------------------------------------===// 3814 // NV/ST - 3815 //===----------------------------------------------------------------------===// 3816 3817 //===----------------------------------------------------------------------===// 3818 // NV/J + 3819 //===----------------------------------------------------------------------===// 3820 3821 multiclass NVJ_type_basic_reg<string NotStr, string OpcStr, string TakenStr> { 3822 def _ie_nv_V4 : NVInst_V4<(outs), 3823 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset), 3824 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr, 3825 !strconcat("($src1.new, $src2)) jump:", 3826 !strconcat(TakenStr, " $offset"))))), 3827 []>, 3828 Requires<[HasV4T]>; 3829 3830 def _nv_V4 : NVInst_V4<(outs), 3831 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset), 3832 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr, 3833 !strconcat("($src1.new, $src2)) jump:", 3834 !strconcat(TakenStr, " $offset"))))), 3835 []>, 3836 Requires<[HasV4T]>; 3837 } 3838 3839 multiclass NVJ_type_basic_2ndDotNew<string NotStr, string OpcStr, 3840 string TakenStr> { 3841 def _ie_nv_V4 : NVInst_V4<(outs), 3842 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset), 3843 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr, 3844 !strconcat("($src1, $src2.new)) jump:", 3845 !strconcat(TakenStr, " $offset"))))), 3846 []>, 3847 Requires<[HasV4T]>; 3848 3849 def _nv_V4 : NVInst_V4<(outs), 3850 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset), 3851 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr, 3852 !strconcat("($src1, $src2.new)) jump:", 3853 !strconcat(TakenStr, " $offset"))))), 3854 []>, 3855 Requires<[HasV4T]>; 3856 } 3857 3858 multiclass NVJ_type_basic_imm<string NotStr, string OpcStr, string TakenStr> { 3859 def _ie_nv_V4 : NVInst_V4<(outs), 3860 (ins IntRegs:$src1, u5Imm:$src2, brtarget:$offset), 3861 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr, 3862 !strconcat("($src1.new, #$src2)) jump:", 3863 !strconcat(TakenStr, " $offset"))))), 3864 []>, 3865 Requires<[HasV4T]>; 3866 3867 def _nv_V4 : NVInst_V4<(outs), 3868 (ins IntRegs:$src1, u5Imm:$src2, brtarget:$offset), 3869 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr, 3870 !strconcat("($src1.new, #$src2)) jump:", 3871 !strconcat(TakenStr, " $offset"))))), 3872 []>, 3873 Requires<[HasV4T]>; 3874 } 3875 3876 multiclass NVJ_type_basic_neg<string NotStr, string OpcStr, string TakenStr> { 3877 def _ie_nv_V4 : NVInst_V4<(outs), 3878 (ins IntRegs:$src1, nOneImm:$src2, brtarget:$offset), 3879 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr, 3880 !strconcat("($src1.new, #$src2)) jump:", 3881 !strconcat(TakenStr, " $offset"))))), 3882 []>, 3883 Requires<[HasV4T]>; 3884 3885 def _nv_V4 : NVInst_V4<(outs), 3886 (ins IntRegs:$src1, nOneImm:$src2, brtarget:$offset), 3887 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr, 3888 !strconcat("($src1.new, #$src2)) jump:", 3889 !strconcat(TakenStr, " $offset"))))), 3890 []>, 3891 Requires<[HasV4T]>; 3892 } 3893 3894 multiclass NVJ_type_basic_tstbit<string NotStr, string OpcStr, 3895 string TakenStr> { 3896 def _ie_nv_V4 : NVInst_V4<(outs), 3897 (ins IntRegs:$src1, u1Imm:$src2, brtarget:$offset), 3898 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr, 3899 !strconcat("($src1.new, #$src2)) jump:", 3900 !strconcat(TakenStr, " $offset"))))), 3901 []>, 3902 Requires<[HasV4T]>; 3903 3904 def _nv_V4 : NVInst_V4<(outs), 3905 (ins IntRegs:$src1, u1Imm:$src2, brtarget:$offset), 3906 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr, 3907 !strconcat("($src1.new, #$src2)) jump:", 3908 !strconcat(TakenStr, " $offset"))))), 3909 []>, 3910 Requires<[HasV4T]>; 3911 } 3912 3913 // Multiclass for regular dot new of Ist operand register. 3914 multiclass NVJ_type_br_pred_reg<string NotStr, string OpcStr> { 3915 defm Pt : NVJ_type_basic_reg<NotStr, OpcStr, "t">; 3916 defm Pnt : NVJ_type_basic_reg<NotStr, OpcStr, "nt">; 3917 } 3918 3919 // Multiclass for dot new of 2nd operand register. 3920 multiclass NVJ_type_br_pred_2ndDotNew<string NotStr, string OpcStr> { 3921 defm Pt : NVJ_type_basic_2ndDotNew<NotStr, OpcStr, "t">; 3922 defm Pnt : NVJ_type_basic_2ndDotNew<NotStr, OpcStr, "nt">; 3923 } 3924 3925 // Multiclass for 2nd operand immediate, including -1. 3926 multiclass NVJ_type_br_pred_imm<string NotStr, string OpcStr> { 3927 defm Pt : NVJ_type_basic_imm<NotStr, OpcStr, "t">; 3928 defm Pnt : NVJ_type_basic_imm<NotStr, OpcStr, "nt">; 3929 defm Ptneg : NVJ_type_basic_neg<NotStr, OpcStr, "t">; 3930 defm Pntneg : NVJ_type_basic_neg<NotStr, OpcStr, "nt">; 3931 } 3932 3933 // Multiclass for 2nd operand immediate, excluding -1. 3934 multiclass NVJ_type_br_pred_imm_only<string NotStr, string OpcStr> { 3935 defm Pt : NVJ_type_basic_imm<NotStr, OpcStr, "t">; 3936 defm Pnt : NVJ_type_basic_imm<NotStr, OpcStr, "nt">; 3937 } 3938 3939 // Multiclass for tstbit, where 2nd operand is always #0. 3940 multiclass NVJ_type_br_pred_tstbit<string NotStr, string OpcStr> { 3941 defm Pt : NVJ_type_basic_tstbit<NotStr, OpcStr, "t">; 3942 defm Pnt : NVJ_type_basic_tstbit<NotStr, OpcStr, "nt">; 3943 } 3944 3945 // Multiclass for GT. 3946 multiclass NVJ_type_rr_ri<string OpcStr> { 3947 defm rrNot : NVJ_type_br_pred_reg<"!", OpcStr>; 3948 defm rr : NVJ_type_br_pred_reg<"", OpcStr>; 3949 defm rrdnNot : NVJ_type_br_pred_2ndDotNew<"!", OpcStr>; 3950 defm rrdn : NVJ_type_br_pred_2ndDotNew<"", OpcStr>; 3951 defm riNot : NVJ_type_br_pred_imm<"!", OpcStr>; 3952 defm ri : NVJ_type_br_pred_imm<"", OpcStr>; 3953 } 3954 3955 // Multiclass for EQ. 3956 multiclass NVJ_type_rr_ri_no_2ndDotNew<string OpcStr> { 3957 defm rrNot : NVJ_type_br_pred_reg<"!", OpcStr>; 3958 defm rr : NVJ_type_br_pred_reg<"", OpcStr>; 3959 defm riNot : NVJ_type_br_pred_imm<"!", OpcStr>; 3960 defm ri : NVJ_type_br_pred_imm<"", OpcStr>; 3961 } 3962 3963 // Multiclass for GTU. 3964 multiclass NVJ_type_rr_ri_no_nOne<string OpcStr> { 3965 defm rrNot : NVJ_type_br_pred_reg<"!", OpcStr>; 3966 defm rr : NVJ_type_br_pred_reg<"", OpcStr>; 3967 defm rrdnNot : NVJ_type_br_pred_2ndDotNew<"!", OpcStr>; 3968 defm rrdn : NVJ_type_br_pred_2ndDotNew<"", OpcStr>; 3969 defm riNot : NVJ_type_br_pred_imm_only<"!", OpcStr>; 3970 defm ri : NVJ_type_br_pred_imm_only<"", OpcStr>; 3971 } 3972 3973 // Multiclass for tstbit. 3974 multiclass NVJ_type_r0<string OpcStr> { 3975 defm r0Not : NVJ_type_br_pred_tstbit<"!", OpcStr>; 3976 defm r0 : NVJ_type_br_pred_tstbit<"", OpcStr>; 3977 } 3978 3979 // Base Multiclass for New Value Jump. 3980 multiclass NVJ_type { 3981 defm GT : NVJ_type_rr_ri<"cmp.gt">; 3982 defm EQ : NVJ_type_rr_ri_no_2ndDotNew<"cmp.eq">; 3983 defm GTU : NVJ_type_rr_ri_no_nOne<"cmp.gtu">; 3984 defm TSTBIT : NVJ_type_r0<"tstbit">; 3985 } 3986 3987 let isBranch = 1, isTerminator=1, neverHasSideEffects = 1, Defs = [PC] in { 3988 defm JMP_ : NVJ_type; 3989 } 3990 3991 //===----------------------------------------------------------------------===// 3992 // NV/J - 3993 //===----------------------------------------------------------------------===// 3994 3995 //===----------------------------------------------------------------------===// 3996 // XTYPE/ALU + 3997 //===----------------------------------------------------------------------===// 3998 3999 // Add and accumulate. 4000 // Rd=add(Rs,add(Ru,#s6)) 4001 def ADDr_ADDri_V4 : MInst<(outs IntRegs:$dst), 4002 (ins IntRegs:$src1, IntRegs:$src2, s6Imm:$src3), 4003 "$dst = add($src1, add($src2, #$src3))", 4004 [(set (i32 IntRegs:$dst), 4005 (add (i32 IntRegs:$src1), (add (i32 IntRegs:$src2), 4006 s6ImmPred:$src3)))]>, 4007 Requires<[HasV4T]>; 4008 4009 // Rd=add(Rs,sub(#s6,Ru)) 4010 def ADDr_SUBri_V4 : MInst<(outs IntRegs:$dst), 4011 (ins IntRegs:$src1, s6Imm:$src2, IntRegs:$src3), 4012 "$dst = add($src1, sub(#$src2, $src3))", 4013 [(set (i32 IntRegs:$dst), 4014 (add (i32 IntRegs:$src1), (sub s6ImmPred:$src2, 4015 (i32 IntRegs:$src3))))]>, 4016 Requires<[HasV4T]>; 4017 4018 // Generates the same instruction as ADDr_SUBri_V4 but matches different 4019 // pattern. 4020 // Rd=add(Rs,sub(#s6,Ru)) 4021 def ADDri_SUBr_V4 : MInst<(outs IntRegs:$dst), 4022 (ins IntRegs:$src1, s6Imm:$src2, IntRegs:$src3), 4023 "$dst = add($src1, sub(#$src2, $src3))", 4024 [(set (i32 IntRegs:$dst), 4025 (sub (add (i32 IntRegs:$src1), s6ImmPred:$src2), 4026 (i32 IntRegs:$src3)))]>, 4027 Requires<[HasV4T]>; 4028 4029 4030 // Add or subtract doublewords with carry. 4031 //TODO: 4032 // Rdd=add(Rss,Rtt,Px):carry 4033 //TODO: 4034 // Rdd=sub(Rss,Rtt,Px):carry 4035 4036 4037 // Logical doublewords. 4038 // Rdd=and(Rtt,~Rss) 4039 def ANDd_NOTd_V4 : MInst<(outs DoubleRegs:$dst), 4040 (ins DoubleRegs:$src1, DoubleRegs:$src2), 4041 "$dst = and($src1, ~$src2)", 4042 [(set (i64 DoubleRegs:$dst), (and (i64 DoubleRegs:$src1), 4043 (not (i64 DoubleRegs:$src2))))]>, 4044 Requires<[HasV4T]>; 4045 4046 // Rdd=or(Rtt,~Rss) 4047 def ORd_NOTd_V4 : MInst<(outs DoubleRegs:$dst), 4048 (ins DoubleRegs:$src1, DoubleRegs:$src2), 4049 "$dst = or($src1, ~$src2)", 4050 [(set (i64 DoubleRegs:$dst), 4051 (or (i64 DoubleRegs:$src1), (not (i64 DoubleRegs:$src2))))]>, 4052 Requires<[HasV4T]>; 4053 4054 4055 // Logical-logical doublewords. 4056 // Rxx^=xor(Rss,Rtt) 4057 def XORd_XORdd: MInst_acc<(outs DoubleRegs:$dst), 4058 (ins DoubleRegs:$src1, DoubleRegs:$src2, DoubleRegs:$src3), 4059 "$dst ^= xor($src2, $src3)", 4060 [(set (i64 DoubleRegs:$dst), 4061 (xor (i64 DoubleRegs:$src1), (xor (i64 DoubleRegs:$src2), 4062 (i64 DoubleRegs:$src3))))], 4063 "$src1 = $dst">, 4064 Requires<[HasV4T]>; 4065 4066 4067 // Logical-logical words. 4068 // Rx=or(Ru,and(Rx,#s10)) 4069 def ORr_ANDri_V4 : MInst_acc<(outs IntRegs:$dst), 4070 (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3), 4071 "$dst = or($src1, and($src2, #$src3))", 4072 [(set (i32 IntRegs:$dst), 4073 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), 4074 s10ImmPred:$src3)))], 4075 "$src2 = $dst">, 4076 Requires<[HasV4T]>; 4077 4078 // Rx[&|^]=and(Rs,Rt) 4079 // Rx&=and(Rs,Rt) 4080 def ANDr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst), 4081 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4082 "$dst &= and($src2, $src3)", 4083 [(set (i32 IntRegs:$dst), 4084 (and (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), 4085 (i32 IntRegs:$src3))))], 4086 "$src1 = $dst">, 4087 Requires<[HasV4T]>; 4088 4089 // Rx|=and(Rs,Rt) 4090 def ORr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst), 4091 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4092 "$dst |= and($src2, $src3)", 4093 [(set (i32 IntRegs:$dst), 4094 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), 4095 (i32 IntRegs:$src3))))], 4096 "$src1 = $dst">, 4097 Requires<[HasV4T]>; 4098 4099 // Rx^=and(Rs,Rt) 4100 def XORr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst), 4101 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4102 "$dst ^= and($src2, $src3)", 4103 [(set (i32 IntRegs:$dst), 4104 (xor (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), 4105 (i32 IntRegs:$src3))))], 4106 "$src1 = $dst">, 4107 Requires<[HasV4T]>; 4108 4109 // Rx[&|^]=and(Rs,~Rt) 4110 // Rx&=and(Rs,~Rt) 4111 def ANDr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst), 4112 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4113 "$dst &= and($src2, ~$src3)", 4114 [(set (i32 IntRegs:$dst), 4115 (and (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), 4116 (not (i32 IntRegs:$src3)))))], 4117 "$src1 = $dst">, 4118 Requires<[HasV4T]>; 4119 4120 // Rx|=and(Rs,~Rt) 4121 def ORr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst), 4122 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4123 "$dst |= and($src2, ~$src3)", 4124 [(set (i32 IntRegs:$dst), 4125 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), 4126 (not (i32 IntRegs:$src3)))))], 4127 "$src1 = $dst">, 4128 Requires<[HasV4T]>; 4129 4130 // Rx^=and(Rs,~Rt) 4131 def XORr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst), 4132 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4133 "$dst ^= and($src2, ~$src3)", 4134 [(set (i32 IntRegs:$dst), 4135 (xor (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), 4136 (not (i32 IntRegs:$src3)))))], 4137 "$src1 = $dst">, 4138 Requires<[HasV4T]>; 4139 4140 // Rx[&|^]=or(Rs,Rt) 4141 // Rx&=or(Rs,Rt) 4142 def ANDr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst), 4143 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4144 "$dst &= or($src2, $src3)", 4145 [(set (i32 IntRegs:$dst), 4146 (and (i32 IntRegs:$src1), (or (i32 IntRegs:$src2), 4147 (i32 IntRegs:$src3))))], 4148 "$src1 = $dst">, 4149 Requires<[HasV4T]>; 4150 4151 // Rx|=or(Rs,Rt) 4152 def ORr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst), 4153 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4154 "$dst |= or($src2, $src3)", 4155 [(set (i32 IntRegs:$dst), 4156 (or (i32 IntRegs:$src1), (or (i32 IntRegs:$src2), 4157 (i32 IntRegs:$src3))))], 4158 "$src1 = $dst">, 4159 Requires<[HasV4T]>; 4160 4161 // Rx^=or(Rs,Rt) 4162 def XORr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst), 4163 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4164 "$dst ^= or($src2, $src3)", 4165 [(set (i32 IntRegs:$dst), 4166 (xor (i32 IntRegs:$src1), (or (i32 IntRegs:$src2), 4167 (i32 IntRegs:$src3))))], 4168 "$src1 = $dst">, 4169 Requires<[HasV4T]>; 4170 4171 // Rx[&|^]=xor(Rs,Rt) 4172 // Rx&=xor(Rs,Rt) 4173 def ANDr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst), 4174 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4175 "$dst &= xor($src2, $src3)", 4176 [(set (i32 IntRegs:$dst), 4177 (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2), 4178 (i32 IntRegs:$src3))))], 4179 "$src1 = $dst">, 4180 Requires<[HasV4T]>; 4181 4182 // Rx|=xor(Rs,Rt) 4183 def ORr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst), 4184 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4185 "$dst |= xor($src2, $src3)", 4186 [(set (i32 IntRegs:$dst), 4187 (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2), 4188 (i32 IntRegs:$src3))))], 4189 "$src1 = $dst">, 4190 Requires<[HasV4T]>; 4191 4192 // Rx^=xor(Rs,Rt) 4193 def XORr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst), 4194 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), 4195 "$dst ^= xor($src2, $src3)", 4196 [(set (i32 IntRegs:$dst), 4197 (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2), 4198 (i32 IntRegs:$src3))))], 4199 "$src1 = $dst">, 4200 Requires<[HasV4T]>; 4201 4202 // Rx|=and(Rs,#s10) 4203 def ORr_ANDri2_V4 : MInst_acc<(outs IntRegs:$dst), 4204 (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3), 4205 "$dst |= and($src2, #$src3)", 4206 [(set (i32 IntRegs:$dst), 4207 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), 4208 s10ImmPred:$src3)))], 4209 "$src1 = $dst">, 4210 Requires<[HasV4T]>; 4211 4212 // Rx|=or(Rs,#s10) 4213 def ORr_ORri_V4 : MInst_acc<(outs IntRegs:$dst), 4214 (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3), 4215 "$dst |= or($src2, #$src3)", 4216 [(set (i32 IntRegs:$dst), 4217 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), 4218 s10ImmPred:$src3)))], 4219 "$src1 = $dst">, 4220 Requires<[HasV4T]>; 4221 4222 4223 // Modulo wrap 4224 // Rd=modwrap(Rs,Rt) 4225 // Round 4226 // Rd=cround(Rs,#u5) 4227 // Rd=cround(Rs,Rt) 4228 // Rd=round(Rs,#u5)[:sat] 4229 // Rd=round(Rs,Rt)[:sat] 4230 // Vector reduce add unsigned halfwords 4231 // Rd=vraddh(Rss,Rtt) 4232 // Vector add bytes 4233 // Rdd=vaddb(Rss,Rtt) 4234 // Vector conditional negate 4235 // Rdd=vcnegh(Rss,Rt) 4236 // Rxx+=vrcnegh(Rss,Rt) 4237 // Vector maximum bytes 4238 // Rdd=vmaxb(Rtt,Rss) 4239 // Vector reduce maximum halfwords 4240 // Rxx=vrmaxh(Rss,Ru) 4241 // Rxx=vrmaxuh(Rss,Ru) 4242 // Vector reduce maximum words 4243 // Rxx=vrmaxuw(Rss,Ru) 4244 // Rxx=vrmaxw(Rss,Ru) 4245 // Vector minimum bytes 4246 // Rdd=vminb(Rtt,Rss) 4247 // Vector reduce minimum halfwords 4248 // Rxx=vrminh(Rss,Ru) 4249 // Rxx=vrminuh(Rss,Ru) 4250 // Vector reduce minimum words 4251 // Rxx=vrminuw(Rss,Ru) 4252 // Rxx=vrminw(Rss,Ru) 4253 // Vector subtract bytes 4254 // Rdd=vsubb(Rss,Rtt) 4255 4256 //===----------------------------------------------------------------------===// 4257 // XTYPE/ALU - 4258 //===----------------------------------------------------------------------===// 4259 4260 4261 //===----------------------------------------------------------------------===// 4262 // XTYPE/MPY + 4263 //===----------------------------------------------------------------------===// 4264 4265 // Multiply and user lower result. 4266 // Rd=add(#u6,mpyi(Rs,#U6)) 4267 def ADDi_MPYri_V4 : MInst<(outs IntRegs:$dst), 4268 (ins u6Imm:$src1, IntRegs:$src2, u6Imm:$src3), 4269 "$dst = add(#$src1, mpyi($src2, #$src3))", 4270 [(set (i32 IntRegs:$dst), 4271 (add (mul (i32 IntRegs:$src2), u6ImmPred:$src3), 4272 u6ImmPred:$src1))]>, 4273 Requires<[HasV4T]>; 4274 4275 // Rd=add(#u6,mpyi(Rs,Rt)) 4276 4277 def ADDi_MPYrr_V4 : MInst<(outs IntRegs:$dst), 4278 (ins u6Imm:$src1, IntRegs:$src2, IntRegs:$src3), 4279 "$dst = add(#$src1, mpyi($src2, $src3))", 4280 [(set (i32 IntRegs:$dst), 4281 (add (mul (i32 IntRegs:$src2), (i32 IntRegs:$src3)), 4282 u6ImmPred:$src1))]>, 4283 Requires<[HasV4T]>; 4284 4285 // Rd=add(Ru,mpyi(#u6:2,Rs)) 4286 def ADDr_MPYir_V4 : MInst<(outs IntRegs:$dst), 4287 (ins IntRegs:$src1, u6Imm:$src2, IntRegs:$src3), 4288 "$dst = add($src1, mpyi(#$src2, $src3))", 4289 [(set (i32 IntRegs:$dst), 4290 (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src3), 4291 u6_2ImmPred:$src2)))]>, 4292 Requires<[HasV4T]>; 4293 4294 // Rd=add(Ru,mpyi(Rs,#u6)) 4295 def ADDr_MPYri_V4 : MInst<(outs IntRegs:$dst), 4296 (ins IntRegs:$src1, IntRegs:$src2, u6Imm:$src3), 4297 "$dst = add($src1, mpyi($src2, #$src3))", 4298 [(set (i32 IntRegs:$dst), 4299 (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src2), 4300 u6ImmPred:$src3)))]>, 4301 Requires<[HasV4T]>; 4302 4303 // Rx=add(Ru,mpyi(Rx,Rs)) 4304 def ADDr_MPYrr_V4 : MInst_acc<(outs IntRegs:$dst), 4305 (ins IntRegs:$src1, IntRegs:$src2, IntRegs:$src3), 4306 "$dst = add($src1, mpyi($src2, $src3))", 4307 [(set (i32 IntRegs:$dst), 4308 (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src2), 4309 (i32 IntRegs:$src3))))], 4310 "$src2 = $dst">, 4311 Requires<[HasV4T]>; 4312 4313 4314 // Polynomial multiply words 4315 // Rdd=pmpyw(Rs,Rt) 4316 // Rxx^=pmpyw(Rs,Rt) 4317 4318 // Vector reduce multiply word by signed half (32x16) 4319 // Rdd=vrmpyweh(Rss,Rtt)[:<<1] 4320 // Rdd=vrmpywoh(Rss,Rtt)[:<<1] 4321 // Rxx+=vrmpyweh(Rss,Rtt)[:<<1] 4322 // Rxx+=vrmpywoh(Rss,Rtt)[:<<1] 4323 4324 // Multiply and use upper result 4325 // Rd=mpy(Rs,Rt.H):<<1:sat 4326 // Rd=mpy(Rs,Rt.L):<<1:sat 4327 // Rd=mpy(Rs,Rt):<<1 4328 // Rd=mpy(Rs,Rt):<<1:sat 4329 // Rd=mpysu(Rs,Rt) 4330 // Rx+=mpy(Rs,Rt):<<1:sat 4331 // Rx-=mpy(Rs,Rt):<<1:sat 4332 4333 // Vector multiply bytes 4334 // Rdd=vmpybsu(Rs,Rt) 4335 // Rdd=vmpybu(Rs,Rt) 4336 // Rxx+=vmpybsu(Rs,Rt) 4337 // Rxx+=vmpybu(Rs,Rt) 4338 4339 // Vector polynomial multiply halfwords 4340 // Rdd=vpmpyh(Rs,Rt) 4341 // Rxx^=vpmpyh(Rs,Rt) 4342 4343 //===----------------------------------------------------------------------===// 4344 // XTYPE/MPY - 4345 //===----------------------------------------------------------------------===// 4346 4347 4348 //===----------------------------------------------------------------------===// 4349 // XTYPE/SHIFT + 4350 //===----------------------------------------------------------------------===// 4351 4352 // Shift by immediate and accumulate. 4353 // Rx=add(#u8,asl(Rx,#U5)) 4354 def ADDi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), 4355 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), 4356 "$dst = add(#$src1, asl($src2, #$src3))", 4357 [(set (i32 IntRegs:$dst), 4358 (add (shl (i32 IntRegs:$src2), u5ImmPred:$src3), 4359 u8ImmPred:$src1))], 4360 "$src2 = $dst">, 4361 Requires<[HasV4T]>; 4362 4363 // Rx=add(#u8,lsr(Rx,#U5)) 4364 def ADDi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), 4365 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), 4366 "$dst = add(#$src1, lsr($src2, #$src3))", 4367 [(set (i32 IntRegs:$dst), 4368 (add (srl (i32 IntRegs:$src2), u5ImmPred:$src3), 4369 u8ImmPred:$src1))], 4370 "$src2 = $dst">, 4371 Requires<[HasV4T]>; 4372 4373 // Rx=sub(#u8,asl(Rx,#U5)) 4374 def SUBi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), 4375 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), 4376 "$dst = sub(#$src1, asl($src2, #$src3))", 4377 [(set (i32 IntRegs:$dst), 4378 (sub (shl (i32 IntRegs:$src2), u5ImmPred:$src3), 4379 u8ImmPred:$src1))], 4380 "$src2 = $dst">, 4381 Requires<[HasV4T]>; 4382 4383 // Rx=sub(#u8,lsr(Rx,#U5)) 4384 def SUBi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), 4385 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), 4386 "$dst = sub(#$src1, lsr($src2, #$src3))", 4387 [(set (i32 IntRegs:$dst), 4388 (sub (srl (i32 IntRegs:$src2), u5ImmPred:$src3), 4389 u8ImmPred:$src1))], 4390 "$src2 = $dst">, 4391 Requires<[HasV4T]>; 4392 4393 4394 //Shift by immediate and logical. 4395 //Rx=and(#u8,asl(Rx,#U5)) 4396 def ANDi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), 4397 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), 4398 "$dst = and(#$src1, asl($src2, #$src3))", 4399 [(set (i32 IntRegs:$dst), 4400 (and (shl (i32 IntRegs:$src2), u5ImmPred:$src3), 4401 u8ImmPred:$src1))], 4402 "$src2 = $dst">, 4403 Requires<[HasV4T]>; 4404 4405 //Rx=and(#u8,lsr(Rx,#U5)) 4406 def ANDi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), 4407 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), 4408 "$dst = and(#$src1, lsr($src2, #$src3))", 4409 [(set (i32 IntRegs:$dst), 4410 (and (srl (i32 IntRegs:$src2), u5ImmPred:$src3), 4411 u8ImmPred:$src1))], 4412 "$src2 = $dst">, 4413 Requires<[HasV4T]>; 4414 4415 //Rx=or(#u8,asl(Rx,#U5)) 4416 let AddedComplexity = 30 in 4417 def ORi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), 4418 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), 4419 "$dst = or(#$src1, asl($src2, #$src3))", 4420 [(set (i32 IntRegs:$dst), 4421 (or (shl (i32 IntRegs:$src2), u5ImmPred:$src3), 4422 u8ImmPred:$src1))], 4423 "$src2 = $dst">, 4424 Requires<[HasV4T]>; 4425 4426 //Rx=or(#u8,lsr(Rx,#U5)) 4427 let AddedComplexity = 30 in 4428 def ORi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), 4429 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), 4430 "$dst = or(#$src1, lsr($src2, #$src3))", 4431 [(set (i32 IntRegs:$dst), 4432 (or (srl (i32 IntRegs:$src2), u5ImmPred:$src3), 4433 u8ImmPred:$src1))], 4434 "$src2 = $dst">, 4435 Requires<[HasV4T]>; 4436 4437 4438 //Shift by register. 4439 //Rd=lsl(#s6,Rt) 4440 def LSLi_V4 : MInst<(outs IntRegs:$dst), (ins s6Imm:$src1, IntRegs:$src2), 4441 "$dst = lsl(#$src1, $src2)", 4442 [(set (i32 IntRegs:$dst), (shl s6ImmPred:$src1, 4443 (i32 IntRegs:$src2)))]>, 4444 Requires<[HasV4T]>; 4445 4446 4447 //Shift by register and logical. 4448 //Rxx^=asl(Rss,Rt) 4449 def ASLd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), 4450 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3), 4451 "$dst ^= asl($src2, $src3)", 4452 [(set (i64 DoubleRegs:$dst), 4453 (xor (i64 DoubleRegs:$src1), (shl (i64 DoubleRegs:$src2), 4454 (i32 IntRegs:$src3))))], 4455 "$src1 = $dst">, 4456 Requires<[HasV4T]>; 4457 4458 //Rxx^=asr(Rss,Rt) 4459 def ASRd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), 4460 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3), 4461 "$dst ^= asr($src2, $src3)", 4462 [(set (i64 DoubleRegs:$dst), 4463 (xor (i64 DoubleRegs:$src1), (sra (i64 DoubleRegs:$src2), 4464 (i32 IntRegs:$src3))))], 4465 "$src1 = $dst">, 4466 Requires<[HasV4T]>; 4467 4468 //Rxx^=lsl(Rss,Rt) 4469 def LSLd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), 4470 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3), 4471 "$dst ^= lsl($src2, $src3)", 4472 [(set (i64 DoubleRegs:$dst), (xor (i64 DoubleRegs:$src1), 4473 (shl (i64 DoubleRegs:$src2), 4474 (i32 IntRegs:$src3))))], 4475 "$src1 = $dst">, 4476 Requires<[HasV4T]>; 4477 4478 //Rxx^=lsr(Rss,Rt) 4479 def LSRd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), 4480 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3), 4481 "$dst ^= lsr($src2, $src3)", 4482 [(set (i64 DoubleRegs:$dst), 4483 (xor (i64 DoubleRegs:$src1), (srl (i64 DoubleRegs:$src2), 4484 (i32 IntRegs:$src3))))], 4485 "$src1 = $dst">, 4486 Requires<[HasV4T]>; 4487 4488 4489 //===----------------------------------------------------------------------===// 4490 // XTYPE/SHIFT - 4491 //===----------------------------------------------------------------------===// 4492 4493 //===----------------------------------------------------------------------===// 4494 // MEMOP: Word, Half, Byte 4495 //===----------------------------------------------------------------------===// 4496 4497 //===----------------------------------------------------------------------===// 4498 // MEMOP: Word 4499 // 4500 // Implemented: 4501 // MEMw_ADDi_indexed_V4 : memw(Rs+#u6:2)+=#U5 4502 // MEMw_SUBi_indexed_V4 : memw(Rs+#u6:2)-=#U5 4503 // MEMw_ADDr_indexed_V4 : memw(Rs+#u6:2)+=Rt 4504 // MEMw_SUBr_indexed_V4 : memw(Rs+#u6:2)-=Rt 4505 // MEMw_CLRr_indexed_V4 : memw(Rs+#u6:2)&=Rt 4506 // MEMw_SETr_indexed_V4 : memw(Rs+#u6:2)|=Rt 4507 // MEMw_ADDi_V4 : memw(Rs+#u6:2)+=#U5 4508 // MEMw_SUBi_V4 : memw(Rs+#u6:2)-=#U5 4509 // MEMw_ADDr_V4 : memw(Rs+#u6:2)+=Rt 4510 // MEMw_SUBr_V4 : memw(Rs+#u6:2)-=Rt 4511 // MEMw_CLRr_V4 : memw(Rs+#u6:2)&=Rt 4512 // MEMw_SETr_V4 : memw(Rs+#u6:2)|=Rt 4513 // 4514 // Not implemented: 4515 // MEMw_CLRi_indexed_V4 : memw(Rs+#u6:2)=clrbit(#U5) 4516 // MEMw_SETi_indexed_V4 : memw(Rs+#u6:2)=setbit(#U5) 4517 // MEMw_CLRi_V4 : memw(Rs+#u6:2)=clrbit(#U5) 4518 // MEMw_SETi_V4 : memw(Rs+#u6:2)=setbit(#U5) 4519 //===----------------------------------------------------------------------===// 4520 4521 4522 // MEMw_ADDSUBi_indexed_V4: 4523 // pseudo operation for MEMw_ADDi_indexed_V4 and 4524 // MEMw_SUBi_indexed_V4 a later pass will change it 4525 // to the corresponding pattern. 4526 let AddedComplexity = 30 in 4527 def MEMw_ADDSUBi_indexed_MEM_V4 : MEMInst_V4<(outs), 4528 (ins IntRegs:$base, u6_2Imm:$offset, m6Imm:$addend), 4529 "Error; should not emit", 4530 [(store (add (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)), 4531 m6ImmPred:$addend), 4532 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>, 4533 Requires<[HasV4T, UseMEMOP]>; 4534 4535 // memw(Rs+#u6:2) += #U5 4536 let AddedComplexity = 30 in 4537 def MEMw_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs), 4538 (ins IntRegs:$base, u6_2Imm:$offset, u5Imm:$addend), 4539 "memw($base+#$offset) += #$addend", 4540 []>, 4541 Requires<[HasV4T, UseMEMOP]>; 4542 4543 // memw(Rs+#u6:2) -= #U5 4544 let AddedComplexity = 30 in 4545 def MEMw_SUBi_indexed_MEM_V4 : MEMInst_V4<(outs), 4546 (ins IntRegs:$base, u6_2Imm:$offset, u5Imm:$subend), 4547 "memw($base+#$offset) -= #$subend", 4548 []>, 4549 Requires<[HasV4T, UseMEMOP]>; 4550 4551 // memw(Rs+#u6:2) += Rt 4552 let AddedComplexity = 30 in 4553 def MEMw_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs), 4554 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$addend), 4555 "memw($base+#$offset) += $addend", 4556 [(store (add (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)), 4557 (i32 IntRegs:$addend)), 4558 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>, 4559 Requires<[HasV4T, UseMEMOP]>; 4560 4561 // memw(Rs+#u6:2) -= Rt 4562 let AddedComplexity = 30 in 4563 def MEMw_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs), 4564 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$subend), 4565 "memw($base+#$offset) -= $subend", 4566 [(store (sub (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)), 4567 (i32 IntRegs:$subend)), 4568 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>, 4569 Requires<[HasV4T, UseMEMOP]>; 4570 4571 // memw(Rs+#u6:2) &= Rt 4572 let AddedComplexity = 30 in 4573 def MEMw_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs), 4574 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$andend), 4575 "memw($base+#$offset) &= $andend", 4576 [(store (and (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)), 4577 (i32 IntRegs:$andend)), 4578 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>, 4579 Requires<[HasV4T, UseMEMOP]>; 4580 4581 // memw(Rs+#u6:2) |= Rt 4582 let AddedComplexity = 30 in 4583 def MEMw_ORr_indexed_MEM_V4 : MEMInst_V4<(outs), 4584 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$orend), 4585 "memw($base+#$offset) |= $orend", 4586 [(store (or (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)), 4587 (i32 IntRegs:$orend)), 4588 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>, 4589 Requires<[HasV4T, UseMEMOP]>; 4590 4591 // MEMw_ADDSUBi_V4: 4592 // Pseudo operation for MEMw_ADDi_V4 and MEMw_SUBi_V4 4593 // a later pass will change it to the right pattern. 4594 let AddedComplexity = 30 in 4595 def MEMw_ADDSUBi_MEM_V4 : MEMInst_V4<(outs), 4596 (ins MEMri:$addr, m6Imm:$addend), 4597 "Error; should not emit", 4598 [(store (add (load ADDRriU6_2:$addr), m6ImmPred:$addend), 4599 ADDRriU6_2:$addr)]>, 4600 Requires<[HasV4T, UseMEMOP]>; 4601 4602 // memw(Rs+#u6:2) += #U5 4603 let AddedComplexity = 30 in 4604 def MEMw_ADDi_MEM_V4 : MEMInst_V4<(outs), 4605 (ins MEMri:$addr, u5Imm:$addend), 4606 "memw($addr) += $addend", 4607 []>, 4608 Requires<[HasV4T, UseMEMOP]>; 4609 4610 // memw(Rs+#u6:2) -= #U5 4611 let AddedComplexity = 30 in 4612 def MEMw_SUBi_MEM_V4 : MEMInst_V4<(outs), 4613 (ins MEMri:$addr, u5Imm:$subend), 4614 "memw($addr) -= $subend", 4615 []>, 4616 Requires<[HasV4T, UseMEMOP]>; 4617 4618 // memw(Rs+#u6:2) += Rt 4619 let AddedComplexity = 30 in 4620 def MEMw_ADDr_MEM_V4 : MEMInst_V4<(outs), 4621 (ins MEMri:$addr, IntRegs:$addend), 4622 "memw($addr) += $addend", 4623 [(store (add (load ADDRriU6_2:$addr), (i32 IntRegs:$addend)), 4624 ADDRriU6_2:$addr)]>, 4625 Requires<[HasV4T, UseMEMOP]>; 4626 4627 // memw(Rs+#u6:2) -= Rt 4628 let AddedComplexity = 30 in 4629 def MEMw_SUBr_MEM_V4 : MEMInst_V4<(outs), 4630 (ins MEMri:$addr, IntRegs:$subend), 4631 "memw($addr) -= $subend", 4632 [(store (sub (load ADDRriU6_2:$addr), (i32 IntRegs:$subend)), 4633 ADDRriU6_2:$addr)]>, 4634 Requires<[HasV4T, UseMEMOP]>; 4635 4636 // memw(Rs+#u6:2) &= Rt 4637 let AddedComplexity = 30 in 4638 def MEMw_ANDr_MEM_V4 : MEMInst_V4<(outs), 4639 (ins MEMri:$addr, IntRegs:$andend), 4640 "memw($addr) &= $andend", 4641 [(store (and (load ADDRriU6_2:$addr), (i32 IntRegs:$andend)), 4642 ADDRriU6_2:$addr)]>, 4643 Requires<[HasV4T, UseMEMOP]>; 4644 4645 // memw(Rs+#u6:2) |= Rt 4646 let AddedComplexity = 30 in 4647 def MEMw_ORr_MEM_V4 : MEMInst_V4<(outs), 4648 (ins MEMri:$addr, IntRegs:$orend), 4649 "memw($addr) |= $orend", 4650 [(store (or (load ADDRriU6_2:$addr), (i32 IntRegs:$orend)), 4651 ADDRriU6_2:$addr)]>, 4652 Requires<[HasV4T, UseMEMOP]>; 4653 4654 //===----------------------------------------------------------------------===// 4655 // MEMOP: Halfword 4656 // 4657 // Implemented: 4658 // MEMh_ADDi_indexed_V4 : memw(Rs+#u6:2)+=#U5 4659 // MEMh_SUBi_indexed_V4 : memw(Rs+#u6:2)-=#U5 4660 // MEMh_ADDr_indexed_V4 : memw(Rs+#u6:2)+=Rt 4661 // MEMh_SUBr_indexed_V4 : memw(Rs+#u6:2)-=Rt 4662 // MEMh_CLRr_indexed_V4 : memw(Rs+#u6:2)&=Rt 4663 // MEMh_SETr_indexed_V4 : memw(Rs+#u6:2)|=Rt 4664 // MEMh_ADDi_V4 : memw(Rs+#u6:2)+=#U5 4665 // MEMh_SUBi_V4 : memw(Rs+#u6:2)-=#U5 4666 // MEMh_ADDr_V4 : memw(Rs+#u6:2)+=Rt 4667 // MEMh_SUBr_V4 : memw(Rs+#u6:2)-=Rt 4668 // MEMh_CLRr_V4 : memw(Rs+#u6:2)&=Rt 4669 // MEMh_SETr_V4 : memw(Rs+#u6:2)|=Rt 4670 // 4671 // Not implemented: 4672 // MEMh_CLRi_indexed_V4 : memw(Rs+#u6:2)=clrbit(#U5) 4673 // MEMh_SETi_indexed_V4 : memw(Rs+#u6:2)=setbit(#U5) 4674 // MEMh_CLRi_V4 : memw(Rs+#u6:2)=clrbit(#U5) 4675 // MEMh_SETi_V4 : memw(Rs+#u6:2)=setbit(#U5) 4676 //===----------------------------------------------------------------------===// 4677 4678 4679 // MEMh_ADDSUBi_indexed_V4: 4680 // Pseudo operation for MEMh_ADDi_indexed_V4 and 4681 // MEMh_SUBi_indexed_V4 a later pass will change it 4682 // to the corresponding pattern. 4683 let AddedComplexity = 30 in 4684 def MEMh_ADDSUBi_indexed_MEM_V4 : MEMInst_V4<(outs), 4685 (ins IntRegs:$base, u6_1Imm:$offset, m6Imm:$addend), 4686 "Error; should not emit", 4687 [(truncstorei16 (add (sextloadi16 (add (i32 IntRegs:$base), 4688 u6_1ImmPred:$offset)), 4689 m6ImmPred:$addend), 4690 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>, 4691 Requires<[HasV4T, UseMEMOP]>; 4692 4693 // memh(Rs+#u6:1) += #U5 4694 let AddedComplexity = 30 in 4695 def MEMh_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs), 4696 (ins IntRegs:$base, u6_1Imm:$offset, u5Imm:$addend), 4697 "memh($base+#$offset) += $addend", 4698 []>, 4699 Requires<[HasV4T, UseMEMOP]>; 4700 4701 // memh(Rs+#u6:1) -= #U5 4702 let AddedComplexity = 30 in 4703 def MEMh_SUBi_indexed_MEM_V4 : MEMInst_V4<(outs), 4704 (ins IntRegs:$base, u6_1Imm:$offset, u5Imm:$subend), 4705 "memh($base+#$offset) -= $subend", 4706 []>, 4707 Requires<[HasV4T, UseMEMOP]>; 4708 4709 // memh(Rs+#u6:1) += Rt 4710 let AddedComplexity = 30 in 4711 def MEMh_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs), 4712 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$addend), 4713 "memh($base+#$offset) += $addend", 4714 [(truncstorei16 (add (sextloadi16 (add (i32 IntRegs:$base), 4715 u6_1ImmPred:$offset)), 4716 (i32 IntRegs:$addend)), 4717 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>, 4718 Requires<[HasV4T, UseMEMOP]>; 4719 4720 // memh(Rs+#u6:1) -= Rt 4721 let AddedComplexity = 30 in 4722 def MEMh_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs), 4723 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$subend), 4724 "memh($base+#$offset) -= $subend", 4725 [(truncstorei16 (sub (sextloadi16 (add (i32 IntRegs:$base), 4726 u6_1ImmPred:$offset)), 4727 (i32 IntRegs:$subend)), 4728 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>, 4729 Requires<[HasV4T, UseMEMOP]>; 4730 4731 // memh(Rs+#u6:1) &= Rt 4732 let AddedComplexity = 30 in 4733 def MEMh_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs), 4734 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$andend), 4735 "memh($base+#$offset) += $andend", 4736 [(truncstorei16 (and (sextloadi16 (add (i32 IntRegs:$base), 4737 u6_1ImmPred:$offset)), 4738 (i32 IntRegs:$andend)), 4739 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>, 4740 Requires<[HasV4T, UseMEMOP]>; 4741 4742 // memh(Rs+#u6:1) |= Rt 4743 let AddedComplexity = 30 in 4744 def MEMh_ORr_indexed_MEM_V4 : MEMInst_V4<(outs), 4745 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$orend), 4746 "memh($base+#$offset) |= $orend", 4747 [(truncstorei16 (or (sextloadi16 (add (i32 IntRegs:$base), 4748 u6_1ImmPred:$offset)), 4749 (i32 IntRegs:$orend)), 4750 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>, 4751 Requires<[HasV4T, UseMEMOP]>; 4752 4753 // MEMh_ADDSUBi_V4: 4754 // Pseudo operation for MEMh_ADDi_V4 and MEMh_SUBi_V4 4755 // a later pass will change it to the right pattern. 4756 let AddedComplexity = 30 in 4757 def MEMh_ADDSUBi_MEM_V4 : MEMInst_V4<(outs), 4758 (ins MEMri:$addr, m6Imm:$addend), 4759 "Error; should not emit", 4760 [(truncstorei16 (add (sextloadi16 ADDRriU6_1:$addr), 4761 m6ImmPred:$addend), ADDRriU6_1:$addr)]>, 4762 Requires<[HasV4T, UseMEMOP]>; 4763 4764 // memh(Rs+#u6:1) += #U5 4765 let AddedComplexity = 30 in 4766 def MEMh_ADDi_MEM_V4 : MEMInst_V4<(outs), 4767 (ins MEMri:$addr, u5Imm:$addend), 4768 "memh($addr) += $addend", 4769 []>, 4770 Requires<[HasV4T, UseMEMOP]>; 4771 4772 // memh(Rs+#u6:1) -= #U5 4773 let AddedComplexity = 30 in 4774 def MEMh_SUBi_MEM_V4 : MEMInst_V4<(outs), 4775 (ins MEMri:$addr, u5Imm:$subend), 4776 "memh($addr) -= $subend", 4777 []>, 4778 Requires<[HasV4T, UseMEMOP]>; 4779 4780 // memh(Rs+#u6:1) += Rt 4781 let AddedComplexity = 30 in 4782 def MEMh_ADDr_MEM_V4 : MEMInst_V4<(outs), 4783 (ins MEMri:$addr, IntRegs:$addend), 4784 "memh($addr) += $addend", 4785 [(truncstorei16 (add (sextloadi16 ADDRriU6_1:$addr), 4786 (i32 IntRegs:$addend)), ADDRriU6_1:$addr)]>, 4787 Requires<[HasV4T, UseMEMOP]>; 4788 4789 // memh(Rs+#u6:1) -= Rt 4790 let AddedComplexity = 30 in 4791 def MEMh_SUBr_MEM_V4 : MEMInst_V4<(outs), 4792 (ins MEMri:$addr, IntRegs:$subend), 4793 "memh($addr) -= $subend", 4794 [(truncstorei16 (sub (sextloadi16 ADDRriU6_1:$addr), 4795 (i32 IntRegs:$subend)), ADDRriU6_1:$addr)]>, 4796 Requires<[HasV4T, UseMEMOP]>; 4797 4798 // memh(Rs+#u6:1) &= Rt 4799 let AddedComplexity = 30 in 4800 def MEMh_ANDr_MEM_V4 : MEMInst_V4<(outs), 4801 (ins MEMri:$addr, IntRegs:$andend), 4802 "memh($addr) &= $andend", 4803 [(truncstorei16 (and (sextloadi16 ADDRriU6_1:$addr), 4804 (i32 IntRegs:$andend)), ADDRriU6_1:$addr)]>, 4805 Requires<[HasV4T, UseMEMOP]>; 4806 4807 // memh(Rs+#u6:1) |= Rt 4808 let AddedComplexity = 30 in 4809 def MEMh_ORr_MEM_V4 : MEMInst_V4<(outs), 4810 (ins MEMri:$addr, IntRegs:$orend), 4811 "memh($addr) |= $orend", 4812 [(truncstorei16 (or (sextloadi16 ADDRriU6_1:$addr), 4813 (i32 IntRegs:$orend)), ADDRriU6_1:$addr)]>, 4814 Requires<[HasV4T, UseMEMOP]>; 4815 4816 4817 //===----------------------------------------------------------------------===// 4818 // MEMOP: Byte 4819 // 4820 // Implemented: 4821 // MEMb_ADDi_indexed_V4 : memb(Rs+#u6:0)+=#U5 4822 // MEMb_SUBi_indexed_V4 : memb(Rs+#u6:0)-=#U5 4823 // MEMb_ADDr_indexed_V4 : memb(Rs+#u6:0)+=Rt 4824 // MEMb_SUBr_indexed_V4 : memb(Rs+#u6:0)-=Rt 4825 // MEMb_CLRr_indexed_V4 : memb(Rs+#u6:0)&=Rt 4826 // MEMb_SETr_indexed_V4 : memb(Rs+#u6:0)|=Rt 4827 // MEMb_ADDi_V4 : memb(Rs+#u6:0)+=#U5 4828 // MEMb_SUBi_V4 : memb(Rs+#u6:0)-=#U5 4829 // MEMb_ADDr_V4 : memb(Rs+#u6:0)+=Rt 4830 // MEMb_SUBr_V4 : memb(Rs+#u6:0)-=Rt 4831 // MEMb_CLRr_V4 : memb(Rs+#u6:0)&=Rt 4832 // MEMb_SETr_V4 : memb(Rs+#u6:0)|=Rt 4833 // 4834 // Not implemented: 4835 // MEMb_CLRi_indexed_V4 : memb(Rs+#u6:0)=clrbit(#U5) 4836 // MEMb_SETi_indexed_V4 : memb(Rs+#u6:0)=setbit(#U5) 4837 // MEMb_CLRi_V4 : memb(Rs+#u6:0)=clrbit(#U5) 4838 // MEMb_SETi_V4 : memb(Rs+#u6:0)=setbit(#U5) 4839 //===----------------------------------------------------------------------===// 4840 4841 4842 // MEMb_ADDSUBi_indexed_V4: 4843 // Pseudo operation for MEMb_ADDi_indexed_V4 and 4844 // MEMb_SUBi_indexed_V4 a later pass will change it 4845 // to the corresponding pattern. 4846 let AddedComplexity = 30 in 4847 def MEMb_ADDSUBi_indexed_MEM_V4 : MEMInst_V4<(outs), 4848 (ins IntRegs:$base, u6_0Imm:$offset, m6Imm:$addend), 4849 "Error; should not emit", 4850 [(truncstorei8 (add (sextloadi8 (add (i32 IntRegs:$base), 4851 u6_0ImmPred:$offset)), 4852 m6ImmPred:$addend), 4853 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>, 4854 Requires<[HasV4T, UseMEMOP]>; 4855 4856 // memb(Rs+#u6:0) += #U5 4857 let AddedComplexity = 30 in 4858 def MEMb_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs), 4859 (ins IntRegs:$base, u6_0Imm:$offset, u5Imm:$addend), 4860 "memb($base+#$offset) += $addend", 4861 []>, 4862 Requires<[HasV4T, UseMEMOP]>; 4863 4864 // memb(Rs+#u6:0) -= #U5 4865 let AddedComplexity = 30 in 4866 def MEMb_SUBi_indexed_MEM_V4 : MEMInst_V4<(outs), 4867 (ins IntRegs:$base, u6_0Imm:$offset, u5Imm:$subend), 4868 "memb($base+#$offset) -= $subend", 4869 []>, 4870 Requires<[HasV4T, UseMEMOP]>; 4871 4872 // memb(Rs+#u6:0) += Rt 4873 let AddedComplexity = 30 in 4874 def MEMb_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs), 4875 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$addend), 4876 "memb($base+#$offset) += $addend", 4877 [(truncstorei8 (add (sextloadi8 (add (i32 IntRegs:$base), 4878 u6_0ImmPred:$offset)), 4879 (i32 IntRegs:$addend)), 4880 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>, 4881 Requires<[HasV4T, UseMEMOP]>; 4882 4883 // memb(Rs+#u6:0) -= Rt 4884 let AddedComplexity = 30 in 4885 def MEMb_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs), 4886 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$subend), 4887 "memb($base+#$offset) -= $subend", 4888 [(truncstorei8 (sub (sextloadi8 (add (i32 IntRegs:$base), 4889 u6_0ImmPred:$offset)), 4890 (i32 IntRegs:$subend)), 4891 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>, 4892 Requires<[HasV4T, UseMEMOP]>; 4893 4894 // memb(Rs+#u6:0) &= Rt 4895 let AddedComplexity = 30 in 4896 def MEMb_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs), 4897 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$andend), 4898 "memb($base+#$offset) += $andend", 4899 [(truncstorei8 (and (sextloadi8 (add (i32 IntRegs:$base), 4900 u6_0ImmPred:$offset)), 4901 (i32 IntRegs:$andend)), 4902 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>, 4903 Requires<[HasV4T, UseMEMOP]>; 4904 4905 // memb(Rs+#u6:0) |= Rt 4906 let AddedComplexity = 30 in 4907 def MEMb_ORr_indexed_MEM_V4 : MEMInst_V4<(outs), 4908 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$orend), 4909 "memb($base+#$offset) |= $orend", 4910 [(truncstorei8 (or (sextloadi8 (add (i32 IntRegs:$base), 4911 u6_0ImmPred:$offset)), 4912 (i32 IntRegs:$orend)), 4913 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>, 4914 Requires<[HasV4T, UseMEMOP]>; 4915 4916 // MEMb_ADDSUBi_V4: 4917 // Pseudo operation for MEMb_ADDi_V4 and MEMb_SUBi_V4 4918 // a later pass will change it to the right pattern. 4919 let AddedComplexity = 30 in 4920 def MEMb_ADDSUBi_MEM_V4 : MEMInst_V4<(outs), 4921 (ins MEMri:$addr, m6Imm:$addend), 4922 "Error; should not emit", 4923 [(truncstorei8 (add (sextloadi8 ADDRriU6_0:$addr), 4924 m6ImmPred:$addend), ADDRriU6_0:$addr)]>, 4925 Requires<[HasV4T, UseMEMOP]>; 4926 4927 // memb(Rs+#u6:0) += #U5 4928 let AddedComplexity = 30 in 4929 def MEMb_ADDi_MEM_V4 : MEMInst_V4<(outs), 4930 (ins MEMri:$addr, u5Imm:$addend), 4931 "memb($addr) += $addend", 4932 []>, 4933 Requires<[HasV4T, UseMEMOP]>; 4934 4935 // memb(Rs+#u6:0) -= #U5 4936 let AddedComplexity = 30 in 4937 def MEMb_SUBi_MEM_V4 : MEMInst_V4<(outs), 4938 (ins MEMri:$addr, u5Imm:$subend), 4939 "memb($addr) -= $subend", 4940 []>, 4941 Requires<[HasV4T, UseMEMOP]>; 4942 4943 // memb(Rs+#u6:0) += Rt 4944 let AddedComplexity = 30 in 4945 def MEMb_ADDr_MEM_V4 : MEMInst_V4<(outs), 4946 (ins MEMri:$addr, IntRegs:$addend), 4947 "memb($addr) += $addend", 4948 [(truncstorei8 (add (sextloadi8 ADDRriU6_0:$addr), 4949 (i32 IntRegs:$addend)), ADDRriU6_0:$addr)]>, 4950 Requires<[HasV4T, UseMEMOP]>; 4951 4952 // memb(Rs+#u6:0) -= Rt 4953 let AddedComplexity = 30 in 4954 def MEMb_SUBr_MEM_V4 : MEMInst_V4<(outs), 4955 (ins MEMri:$addr, IntRegs:$subend), 4956 "memb($addr) -= $subend", 4957 [(truncstorei8 (sub (sextloadi8 ADDRriU6_0:$addr), 4958 (i32 IntRegs:$subend)), ADDRriU6_0:$addr)]>, 4959 Requires<[HasV4T, UseMEMOP]>; 4960 4961 // memb(Rs+#u6:0) &= Rt 4962 let AddedComplexity = 30 in 4963 def MEMb_ANDr_MEM_V4 : MEMInst_V4<(outs), 4964 (ins MEMri:$addr, IntRegs:$andend), 4965 "memb($addr) &= $andend", 4966 [(truncstorei8 (and (sextloadi8 ADDRriU6_0:$addr), 4967 (i32 IntRegs:$andend)), ADDRriU6_0:$addr)]>, 4968 Requires<[HasV4T, UseMEMOP]>; 4969 4970 // memb(Rs+#u6:0) |= Rt 4971 let AddedComplexity = 30 in 4972 def MEMb_ORr_MEM_V4 : MEMInst_V4<(outs), 4973 (ins MEMri:$addr, IntRegs:$orend), 4974 "memb($addr) |= $orend", 4975 [(truncstorei8 (or (sextloadi8 ADDRriU6_0:$addr), 4976 (i32 IntRegs:$orend)), ADDRriU6_0:$addr)]>, 4977 Requires<[HasV4T, UseMEMOP]>; 4978 4979 4980 //===----------------------------------------------------------------------===// 4981 // XTYPE/PRED + 4982 //===----------------------------------------------------------------------===// 4983 4984 // Hexagon V4 only supports these flavors of byte/half compare instructions: 4985 // EQ/GT/GTU. Other flavors like GE/GEU/LT/LTU/LE/LEU are not supported by 4986 // hardware. However, compiler can still implement these patterns through 4987 // appropriate patterns combinations based on current implemented patterns. 4988 // The implemented patterns are: EQ/GT/GTU. 4989 // Missing patterns are: GE/GEU/LT/LTU/LE/LEU. 4990 4991 // Following instruction is not being extended as it results into the 4992 // incorrect code for negative numbers. 4993 // Pd=cmpb.eq(Rs,#u8) 4994 4995 let isCompare = 1 in 4996 def CMPbEQri_V4 : MInst<(outs PredRegs:$dst), 4997 (ins IntRegs:$src1, u8Imm:$src2), 4998 "$dst = cmpb.eq($src1, #$src2)", 4999 [(set (i1 PredRegs:$dst), 5000 (seteq (and (i32 IntRegs:$src1), 255), u8ImmPred:$src2))]>, 5001 Requires<[HasV4T]>; 5002 5003 // Pd=cmpb.eq(Rs,Rt) 5004 let isCompare = 1 in 5005 def CMPbEQrr_ubub_V4 : MInst<(outs PredRegs:$dst), 5006 (ins IntRegs:$src1, IntRegs:$src2), 5007 "$dst = cmpb.eq($src1, $src2)", 5008 [(set (i1 PredRegs:$dst), 5009 (seteq (and (xor (i32 IntRegs:$src1), 5010 (i32 IntRegs:$src2)), 255), 0))]>, 5011 Requires<[HasV4T]>; 5012 5013 // Pd=cmpb.eq(Rs,Rt) 5014 let isCompare = 1 in 5015 def CMPbEQrr_sbsb_V4 : MInst<(outs PredRegs:$dst), 5016 (ins IntRegs:$src1, IntRegs:$src2), 5017 "$dst = cmpb.eq($src1, $src2)", 5018 [(set (i1 PredRegs:$dst), 5019 (seteq (shl (i32 IntRegs:$src1), (i32 24)), 5020 (shl (i32 IntRegs:$src2), (i32 24))))]>, 5021 Requires<[HasV4T]>; 5022 5023 // Pd=cmpb.gt(Rs,Rt) 5024 let isCompare = 1 in 5025 def CMPbGTrr_V4 : MInst<(outs PredRegs:$dst), 5026 (ins IntRegs:$src1, IntRegs:$src2), 5027 "$dst = cmpb.gt($src1, $src2)", 5028 [(set (i1 PredRegs:$dst), 5029 (setgt (shl (i32 IntRegs:$src1), (i32 24)), 5030 (shl (i32 IntRegs:$src2), (i32 24))))]>, 5031 Requires<[HasV4T]>; 5032 5033 // Pd=cmpb.gtu(Rs,#u7) 5034 let isCompare = 1 in 5035 def CMPbGTUri_V4 : MInst<(outs PredRegs:$dst), 5036 (ins IntRegs:$src1, u7Imm:$src2), 5037 "$dst = cmpb.gtu($src1, #$src2)", 5038 [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 255), 5039 u7ImmPred:$src2))]>, 5040 Requires<[HasV4T]>; 5041 5042 // Pd=cmpb.gtu(Rs,Rt) 5043 let isCompare = 1 in 5044 def CMPbGTUrr_V4 : MInst<(outs PredRegs:$dst), 5045 (ins IntRegs:$src1, IntRegs:$src2), 5046 "$dst = cmpb.gtu($src1, $src2)", 5047 [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 255), 5048 (and (i32 IntRegs:$src2), 255)))]>, 5049 Requires<[HasV4T]>; 5050 5051 // Following instruction is not being extended as it results into the incorrect 5052 // code for negative numbers. 5053 5054 // Signed half compare(.eq) ri. 5055 // Pd=cmph.eq(Rs,#s8) 5056 let isCompare = 1 in 5057 def CMPhEQri_V4 : MInst<(outs PredRegs:$dst), 5058 (ins IntRegs:$src1, s8Imm:$src2), 5059 "$dst = cmph.eq($src1, #$src2)", 5060 [(set (i1 PredRegs:$dst), (seteq (and (i32 IntRegs:$src1), 65535), 5061 s8ImmPred:$src2))]>, 5062 Requires<[HasV4T]>; 5063 5064 // Signed half compare(.eq) rr. 5065 // Case 1: xor + and, then compare: 5066 // r0=xor(r0,r1) 5067 // r0=and(r0,#0xffff) 5068 // p0=cmp.eq(r0,#0) 5069 // Pd=cmph.eq(Rs,Rt) 5070 let isCompare = 1 in 5071 def CMPhEQrr_xor_V4 : MInst<(outs PredRegs:$dst), 5072 (ins IntRegs:$src1, IntRegs:$src2), 5073 "$dst = cmph.eq($src1, $src2)", 5074 [(set (i1 PredRegs:$dst), (seteq (and (xor (i32 IntRegs:$src1), 5075 (i32 IntRegs:$src2)), 5076 65535), 0))]>, 5077 Requires<[HasV4T]>; 5078 5079 // Signed half compare(.eq) rr. 5080 // Case 2: shift left 16 bits then compare: 5081 // r0=asl(r0,16) 5082 // r1=asl(r1,16) 5083 // p0=cmp.eq(r0,r1) 5084 // Pd=cmph.eq(Rs,Rt) 5085 let isCompare = 1 in 5086 def CMPhEQrr_shl_V4 : MInst<(outs PredRegs:$dst), 5087 (ins IntRegs:$src1, IntRegs:$src2), 5088 "$dst = cmph.eq($src1, $src2)", 5089 [(set (i1 PredRegs:$dst), 5090 (seteq (shl (i32 IntRegs:$src1), (i32 16)), 5091 (shl (i32 IntRegs:$src2), (i32 16))))]>, 5092 Requires<[HasV4T]>; 5093 5094 /* Incorrect Pattern -- immediate should be right shifted before being 5095 used in the cmph.gt instruction. 5096 // Signed half compare(.gt) ri. 5097 // Pd=cmph.gt(Rs,#s8) 5098 5099 let isCompare = 1 in 5100 def CMPhGTri_V4 : MInst<(outs PredRegs:$dst), 5101 (ins IntRegs:$src1, s8Imm:$src2), 5102 "$dst = cmph.gt($src1, #$src2)", 5103 [(set (i1 PredRegs:$dst), 5104 (setgt (shl (i32 IntRegs:$src1), (i32 16)), 5105 s8ImmPred:$src2))]>, 5106 Requires<[HasV4T]>; 5107 */ 5108 5109 // Signed half compare(.gt) rr. 5110 // Pd=cmph.gt(Rs,Rt) 5111 let isCompare = 1 in 5112 def CMPhGTrr_shl_V4 : MInst<(outs PredRegs:$dst), 5113 (ins IntRegs:$src1, IntRegs:$src2), 5114 "$dst = cmph.gt($src1, $src2)", 5115 [(set (i1 PredRegs:$dst), 5116 (setgt (shl (i32 IntRegs:$src1), (i32 16)), 5117 (shl (i32 IntRegs:$src2), (i32 16))))]>, 5118 Requires<[HasV4T]>; 5119 5120 // Unsigned half compare rr (.gtu). 5121 // Pd=cmph.gtu(Rs,Rt) 5122 let isCompare = 1 in 5123 def CMPhGTUrr_V4 : MInst<(outs PredRegs:$dst), 5124 (ins IntRegs:$src1, IntRegs:$src2), 5125 "$dst = cmph.gtu($src1, $src2)", 5126 [(set (i1 PredRegs:$dst), 5127 (setugt (and (i32 IntRegs:$src1), 65535), 5128 (and (i32 IntRegs:$src2), 65535)))]>, 5129 Requires<[HasV4T]>; 5130 5131 // Unsigned half compare ri (.gtu). 5132 // Pd=cmph.gtu(Rs,#u7) 5133 let isCompare = 1 in 5134 def CMPhGTUri_V4 : MInst<(outs PredRegs:$dst), 5135 (ins IntRegs:$src1, u7Imm:$src2), 5136 "$dst = cmph.gtu($src1, #$src2)", 5137 [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 65535), 5138 u7ImmPred:$src2))]>, 5139 Requires<[HasV4T]>; 5140 5141 //===----------------------------------------------------------------------===// 5142 // XTYPE/PRED - 5143 //===----------------------------------------------------------------------===// 5144 5145 //Deallocate frame and return. 5146 // dealloc_return 5147 let isReturn = 1, isTerminator = 1, isBarrier = 1, isPredicable = 1, 5148 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1 in { 5149 def DEALLOC_RET_V4 : NVInst_V4<(outs), (ins i32imm:$amt1), 5150 "dealloc_return", 5151 []>, 5152 Requires<[HasV4T]>; 5153 } 5154 5155 // Restore registers and dealloc return function call. 5156 let isCall = 1, isBarrier = 1, isReturn = 1, isTerminator = 1, 5157 Defs = [R29, R30, R31, PC] in { 5158 def RESTORE_DEALLOC_RET_JMP_V4 : JInst<(outs), 5159 (ins calltarget:$dst), 5160 "jump $dst // Restore_and_dealloc_return", 5161 []>, 5162 Requires<[HasV4T]>; 5163 } 5164 5165 // Restore registers and dealloc frame before a tail call. 5166 let isCall = 1, isBarrier = 1, 5167 Defs = [R29, R30, R31, PC] in { 5168 def RESTORE_DEALLOC_BEFORE_TAILCALL_V4 : JInst<(outs), 5169 (ins calltarget:$dst), 5170 "call $dst // Restore_and_dealloc_before_tailcall", 5171 []>, 5172 Requires<[HasV4T]>; 5173 } 5174 5175 // Save registers function call. 5176 let isCall = 1, isBarrier = 1, 5177 Uses = [R29, R31] in { 5178 def SAVE_REGISTERS_CALL_V4 : JInst<(outs), 5179 (ins calltarget:$dst), 5180 "call $dst // Save_calle_saved_registers", 5181 []>, 5182 Requires<[HasV4T]>; 5183 } 5184 5185 // if (Ps) dealloc_return 5186 let isReturn = 1, isTerminator = 1, 5187 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, 5188 isPredicated = 1 in { 5189 def DEALLOC_RET_cPt_V4 : NVInst_V4<(outs), 5190 (ins PredRegs:$src1, i32imm:$amt1), 5191 "if ($src1) dealloc_return", 5192 []>, 5193 Requires<[HasV4T]>; 5194 } 5195 5196 // if (!Ps) dealloc_return 5197 let isReturn = 1, isTerminator = 1, 5198 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, 5199 isPredicated = 1 in { 5200 def DEALLOC_RET_cNotPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, 5201 i32imm:$amt1), 5202 "if (!$src1) dealloc_return", 5203 []>, 5204 Requires<[HasV4T]>; 5205 } 5206 5207 // if (Ps.new) dealloc_return:nt 5208 let isReturn = 1, isTerminator = 1, 5209 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, 5210 isPredicated = 1 in { 5211 def DEALLOC_RET_cdnPnt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, 5212 i32imm:$amt1), 5213 "if ($src1.new) dealloc_return:nt", 5214 []>, 5215 Requires<[HasV4T]>; 5216 } 5217 5218 // if (!Ps.new) dealloc_return:nt 5219 let isReturn = 1, isTerminator = 1, 5220 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, 5221 isPredicated = 1 in { 5222 def DEALLOC_RET_cNotdnPnt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, 5223 i32imm:$amt1), 5224 "if (!$src1.new) dealloc_return:nt", 5225 []>, 5226 Requires<[HasV4T]>; 5227 } 5228 5229 // if (Ps.new) dealloc_return:t 5230 let isReturn = 1, isTerminator = 1, 5231 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, 5232 isPredicated = 1 in { 5233 def DEALLOC_RET_cdnPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, 5234 i32imm:$amt1), 5235 "if ($src1.new) dealloc_return:t", 5236 []>, 5237 Requires<[HasV4T]>; 5238 } 5239 5240 // if (!Ps.new) dealloc_return:nt 5241 let isReturn = 1, isTerminator = 1, 5242 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, 5243 isPredicated = 1 in { 5244 def DEALLOC_RET_cNotdnPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, 5245 i32imm:$amt1), 5246 "if (!$src1.new) dealloc_return:t", 5247 []>, 5248 Requires<[HasV4T]>; 5249 } 5250 5251 5252 // Load/Store with absolute addressing mode 5253 // memw(#u6)=Rt 5254 5255 multiclass ST_abs<string OpcStr> { 5256 let isPredicable = 1 in 5257 def _abs_V4 : STInst2<(outs), 5258 (ins globaladdress:$absaddr, IntRegs:$src), 5259 !strconcat(OpcStr, "(##$absaddr) = $src"), 5260 []>, 5261 Requires<[HasV4T]>; 5262 5263 let isPredicated = 1 in 5264 def _abs_cPt_V4 : STInst2<(outs), 5265 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), 5266 !strconcat("if ($src1)", 5267 !strconcat(OpcStr, "(##$absaddr) = $src2")), 5268 []>, 5269 Requires<[HasV4T]>; 5270 5271 let isPredicated = 1 in 5272 def _abs_cNotPt_V4 : STInst2<(outs), 5273 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), 5274 !strconcat("if (!$src1)", 5275 !strconcat(OpcStr, "(##$absaddr) = $src2")), 5276 []>, 5277 Requires<[HasV4T]>; 5278 5279 let isPredicated = 1 in 5280 def _abs_cdnPt_V4 : STInst2<(outs), 5281 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), 5282 !strconcat("if ($src1.new)", 5283 !strconcat(OpcStr, "(##$absaddr) = $src2")), 5284 []>, 5285 Requires<[HasV4T]>; 5286 5287 let isPredicated = 1 in 5288 def _abs_cdnNotPt_V4 : STInst2<(outs), 5289 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), 5290 !strconcat("if (!$src1.new)", 5291 !strconcat(OpcStr, "(##$absaddr) = $src2")), 5292 []>, 5293 Requires<[HasV4T]>; 5294 5295 def _abs_nv_V4 : STInst2<(outs), 5296 (ins globaladdress:$absaddr, IntRegs:$src), 5297 !strconcat(OpcStr, "(##$absaddr) = $src.new"), 5298 []>, 5299 Requires<[HasV4T]>; 5300 5301 let isPredicated = 1 in 5302 def _abs_cPt_nv_V4 : STInst2<(outs), 5303 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), 5304 !strconcat("if ($src1)", 5305 !strconcat(OpcStr, "(##$absaddr) = $src2.new")), 5306 []>, 5307 Requires<[HasV4T]>; 5308 5309 let isPredicated = 1 in 5310 def _abs_cNotPt_nv_V4 : STInst2<(outs), 5311 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), 5312 !strconcat("if (!$src1)", 5313 !strconcat(OpcStr, "(##$absaddr) = $src2.new")), 5314 []>, 5315 Requires<[HasV4T]>; 5316 5317 let isPredicated = 1 in 5318 def _abs_cdnPt_nv_V4 : STInst2<(outs), 5319 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), 5320 !strconcat("if ($src1.new)", 5321 !strconcat(OpcStr, "(##$absaddr) = $src2.new")), 5322 []>, 5323 Requires<[HasV4T]>; 5324 5325 let isPredicated = 1 in 5326 def _abs_cdnNotPt_nv_V4 : STInst2<(outs), 5327 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), 5328 !strconcat("if (!$src1.new)", 5329 !strconcat(OpcStr, "(##$absaddr) = $src2.new")), 5330 []>, 5331 Requires<[HasV4T]>; 5332 } 5333 5334 let AddedComplexity = 30, isPredicable = 1 in 5335 def STrid_abs_V4 : STInst<(outs), 5336 (ins globaladdress:$absaddr, DoubleRegs:$src), 5337 "memd(##$absaddr) = $src", 5338 [(store (i64 DoubleRegs:$src), 5339 (HexagonCONST32 tglobaladdr:$absaddr))]>, 5340 Requires<[HasV4T]>; 5341 5342 let AddedComplexity = 30, isPredicated = 1 in 5343 def STrid_abs_cPt_V4 : STInst2<(outs), 5344 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2), 5345 "if ($src1) memd(##$absaddr) = $src2", 5346 []>, 5347 Requires<[HasV4T]>; 5348 5349 let AddedComplexity = 30, isPredicated = 1 in 5350 def STrid_abs_cNotPt_V4 : STInst2<(outs), 5351 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2), 5352 "if (!$src1) memd(##$absaddr) = $src2", 5353 []>, 5354 Requires<[HasV4T]>; 5355 5356 let AddedComplexity = 30, isPredicated = 1 in 5357 def STrid_abs_cdnPt_V4 : STInst2<(outs), 5358 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2), 5359 "if ($src1.new) memd(##$absaddr) = $src2", 5360 []>, 5361 Requires<[HasV4T]>; 5362 5363 let AddedComplexity = 30, isPredicated = 1 in 5364 def STrid_abs_cdnNotPt_V4 : STInst2<(outs), 5365 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2), 5366 "if (!$src1.new) memd(##$absaddr) = $src2", 5367 []>, 5368 Requires<[HasV4T]>; 5369 5370 defm STrib : ST_abs<"memb">; 5371 defm STrih : ST_abs<"memh">; 5372 defm STriw : ST_abs<"memw">; 5373 5374 let Predicates = [HasV4T], AddedComplexity = 30 in 5375 def : Pat<(truncstorei8 (i32 IntRegs:$src1), 5376 (HexagonCONST32 tglobaladdr:$absaddr)), 5377 (STrib_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>; 5378 5379 let Predicates = [HasV4T], AddedComplexity = 30 in 5380 def : Pat<(truncstorei16 (i32 IntRegs:$src1), 5381 (HexagonCONST32 tglobaladdr:$absaddr)), 5382 (STrih_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>; 5383 5384 let Predicates = [HasV4T], AddedComplexity = 30 in 5385 def : Pat<(store (i32 IntRegs:$src1), (HexagonCONST32 tglobaladdr:$absaddr)), 5386 (STriw_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>; 5387 5388 5389 multiclass LD_abs<string OpcStr> { 5390 let isPredicable = 1 in 5391 def _abs_V4 : LDInst2<(outs IntRegs:$dst), 5392 (ins globaladdress:$absaddr), 5393 !strconcat("$dst = ", !strconcat(OpcStr, "(##$absaddr)")), 5394 []>, 5395 Requires<[HasV4T]>; 5396 5397 let isPredicated = 1 in 5398 def _abs_cPt_V4 : LDInst2<(outs IntRegs:$dst), 5399 (ins PredRegs:$src1, globaladdress:$absaddr), 5400 !strconcat("if ($src1) $dst = ", 5401 !strconcat(OpcStr, "(##$absaddr)")), 5402 []>, 5403 Requires<[HasV4T]>; 5404 5405 let isPredicated = 1 in 5406 def _abs_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 5407 (ins PredRegs:$src1, globaladdress:$absaddr), 5408 !strconcat("if (!$src1) $dst = ", 5409 !strconcat(OpcStr, "(##$absaddr)")), 5410 []>, 5411 Requires<[HasV4T]>; 5412 5413 let isPredicated = 1 in 5414 def _abs_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 5415 (ins PredRegs:$src1, globaladdress:$absaddr), 5416 !strconcat("if ($src1.new) $dst = ", 5417 !strconcat(OpcStr, "(##$absaddr)")), 5418 []>, 5419 Requires<[HasV4T]>; 5420 5421 let isPredicated = 1 in 5422 def _abs_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 5423 (ins PredRegs:$src1, globaladdress:$absaddr), 5424 !strconcat("if (!$src1.new) $dst = ", 5425 !strconcat(OpcStr, "(##$absaddr)")), 5426 []>, 5427 Requires<[HasV4T]>; 5428 } 5429 5430 let AddedComplexity = 30 in 5431 def LDrid_abs_V4 : LDInst<(outs DoubleRegs:$dst), 5432 (ins globaladdress:$absaddr), 5433 "$dst = memd(##$absaddr)", 5434 [(set (i64 DoubleRegs:$dst), 5435 (load (HexagonCONST32 tglobaladdr:$absaddr)))]>, 5436 Requires<[HasV4T]>; 5437 5438 let AddedComplexity = 30, isPredicated = 1 in 5439 def LDrid_abs_cPt_V4 : LDInst2<(outs DoubleRegs:$dst), 5440 (ins PredRegs:$src1, globaladdress:$absaddr), 5441 "if ($src1) $dst = memd(##$absaddr)", 5442 []>, 5443 Requires<[HasV4T]>; 5444 5445 let AddedComplexity = 30, isPredicated = 1 in 5446 def LDrid_abs_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst), 5447 (ins PredRegs:$src1, globaladdress:$absaddr), 5448 "if (!$src1) $dst = memd(##$absaddr)", 5449 []>, 5450 Requires<[HasV4T]>; 5451 5452 let AddedComplexity = 30, isPredicated = 1 in 5453 def LDrid_abs_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst), 5454 (ins PredRegs:$src1, globaladdress:$absaddr), 5455 "if ($src1.new) $dst = memd(##$absaddr)", 5456 []>, 5457 Requires<[HasV4T]>; 5458 5459 let AddedComplexity = 30, isPredicated = 1 in 5460 def LDrid_abs_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst), 5461 (ins PredRegs:$src1, globaladdress:$absaddr), 5462 "if (!$src1.new) $dst = memd(##$absaddr)", 5463 []>, 5464 Requires<[HasV4T]>; 5465 5466 defm LDrib : LD_abs<"memb">; 5467 defm LDriub : LD_abs<"memub">; 5468 defm LDrih : LD_abs<"memh">; 5469 defm LDriuh : LD_abs<"memuh">; 5470 defm LDriw : LD_abs<"memw">; 5471 5472 5473 let Predicates = [HasV4T], AddedComplexity = 30 in 5474 def : Pat<(i32 (load (HexagonCONST32 tglobaladdr:$absaddr))), 5475 (LDriw_abs_V4 tglobaladdr: $absaddr)>; 5476 5477 let Predicates = [HasV4T], AddedComplexity=30 in 5478 def : Pat<(i32 (sextloadi8 (HexagonCONST32 tglobaladdr:$absaddr))), 5479 (LDrib_abs_V4 tglobaladdr:$absaddr)>; 5480 5481 let Predicates = [HasV4T], AddedComplexity=30 in 5482 def : Pat<(i32 (zextloadi8 (HexagonCONST32 tglobaladdr:$absaddr))), 5483 (LDriub_abs_V4 tglobaladdr:$absaddr)>; 5484 5485 let Predicates = [HasV4T], AddedComplexity=30 in 5486 def : Pat<(i32 (sextloadi16 (HexagonCONST32 tglobaladdr:$absaddr))), 5487 (LDrih_abs_V4 tglobaladdr:$absaddr)>; 5488 5489 let Predicates = [HasV4T], AddedComplexity=30 in 5490 def : Pat<(i32 (zextloadi16 (HexagonCONST32 tglobaladdr:$absaddr))), 5491 (LDriuh_abs_V4 tglobaladdr:$absaddr)>; 5492 5493 // Transfer global address into a register 5494 let AddedComplexity=50, isMoveImm = 1, isReMaterializable = 1 in 5495 def TFRI_V4 : ALU32_ri<(outs IntRegs:$dst), (ins globaladdress:$src1), 5496 "$dst = ##$src1", 5497 [(set IntRegs:$dst, (HexagonCONST32 tglobaladdr:$src1))]>, 5498 Requires<[HasV4T]>; 5499 5500 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in 5501 def TFRI_cPt_V4 : ALU32_ri<(outs IntRegs:$dst), 5502 (ins PredRegs:$src1, globaladdress:$src2), 5503 "if($src1) $dst = ##$src2", 5504 []>, 5505 Requires<[HasV4T]>; 5506 5507 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in 5508 def TFRI_cNotPt_V4 : ALU32_ri<(outs IntRegs:$dst), 5509 (ins PredRegs:$src1, globaladdress:$src2), 5510 "if(!$src1) $dst = ##$src2", 5511 []>, 5512 Requires<[HasV4T]>; 5513 5514 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in 5515 def TFRI_cdnPt_V4 : ALU32_ri<(outs IntRegs:$dst), 5516 (ins PredRegs:$src1, globaladdress:$src2), 5517 "if($src1.new) $dst = ##$src2", 5518 []>, 5519 Requires<[HasV4T]>; 5520 5521 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in 5522 def TFRI_cdnNotPt_V4 : ALU32_ri<(outs IntRegs:$dst), 5523 (ins PredRegs:$src1, globaladdress:$src2), 5524 "if(!$src1.new) $dst = ##$src2", 5525 []>, 5526 Requires<[HasV4T]>; 5527 5528 let AddedComplexity = 50, Predicates = [HasV4T] in 5529 def : Pat<(HexagonCONST32_GP tglobaladdr:$src1), 5530 (TFRI_V4 tglobaladdr:$src1)>; 5531 5532 5533 // Load - Indirect with long offset: These instructions take global address 5534 // as an operand 5535 let AddedComplexity = 10 in 5536 def LDrid_ind_lo_V4 : LDInst<(outs DoubleRegs:$dst), 5537 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$offset), 5538 "$dst=memd($src1<<#$src2+##$offset)", 5539 [(set (i64 DoubleRegs:$dst), 5540 (load (add (shl IntRegs:$src1, u2ImmPred:$src2), 5541 (HexagonCONST32 tglobaladdr:$offset))))]>, 5542 Requires<[HasV4T]>; 5543 5544 let AddedComplexity = 10 in 5545 multiclass LD_indirect_lo<string OpcStr, PatFrag OpNode> { 5546 def _lo_V4 : LDInst<(outs IntRegs:$dst), 5547 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$offset), 5548 !strconcat("$dst = ", 5549 !strconcat(OpcStr, "($src1<<#$src2+##$offset)")), 5550 [(set IntRegs:$dst, 5551 (i32 (OpNode (add (shl IntRegs:$src1, u2ImmPred:$src2), 5552 (HexagonCONST32 tglobaladdr:$offset)))))]>, 5553 Requires<[HasV4T]>; 5554 } 5555 5556 defm LDrib_ind : LD_indirect_lo<"memb", sextloadi8>; 5557 defm LDriub_ind : LD_indirect_lo<"memub", zextloadi8>; 5558 defm LDrih_ind : LD_indirect_lo<"memh", sextloadi16>; 5559 defm LDriuh_ind : LD_indirect_lo<"memuh", zextloadi16>; 5560 defm LDriw_ind : LD_indirect_lo<"memw", load>; 5561 5562 // Store - Indirect with long offset: These instructions take global address 5563 // as an operand 5564 let AddedComplexity = 10 in 5565 def STrid_ind_lo_V4 : STInst<(outs), 5566 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$src3, 5567 DoubleRegs:$src4), 5568 "memd($src1<<#$src2+#$src3) = $src4", 5569 [(store (i64 DoubleRegs:$src4), 5570 (add (shl IntRegs:$src1, u2ImmPred:$src2), 5571 (HexagonCONST32 tglobaladdr:$src3)))]>, 5572 Requires<[HasV4T]>; 5573 5574 let AddedComplexity = 10 in 5575 multiclass ST_indirect_lo<string OpcStr, PatFrag OpNode> { 5576 def _lo_V4 : STInst<(outs), 5577 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$src3, 5578 IntRegs:$src4), 5579 !strconcat(OpcStr, "($src1<<#$src2+##$src3) = $src4"), 5580 [(OpNode (i32 IntRegs:$src4), 5581 (add (shl IntRegs:$src1, u2ImmPred:$src2), 5582 (HexagonCONST32 tglobaladdr:$src3)))]>, 5583 Requires<[HasV4T]>; 5584 } 5585 5586 defm STrib_ind : ST_indirect_lo<"memb", truncstorei8>; 5587 defm STrih_ind : ST_indirect_lo<"memh", truncstorei16>; 5588 defm STriw_ind : ST_indirect_lo<"memw", store>; 5589 5590 // Store - absolute addressing mode: These instruction take constant 5591 // value as the extended operand 5592 multiclass ST_absimm<string OpcStr> { 5593 let isPredicable = 1 in 5594 def _abs_V4 : STInst2<(outs), 5595 (ins u6Imm:$src1, IntRegs:$src2), 5596 !strconcat(OpcStr, "(#$src1) = $src2"), 5597 []>, 5598 Requires<[HasV4T]>; 5599 5600 let isPredicated = 1 in 5601 def _abs_cPt_V4 : STInst2<(outs), 5602 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), 5603 !strconcat("if ($src1)", !strconcat(OpcStr, "(#$src2) = $src3")), 5604 []>, 5605 Requires<[HasV4T]>; 5606 5607 let isPredicated = 1 in 5608 def _abs_cNotPt_V4 : STInst2<(outs), 5609 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), 5610 !strconcat("if (!$src1)", !strconcat(OpcStr, "(#$src2) = $src3")), 5611 []>, 5612 Requires<[HasV4T]>; 5613 5614 let isPredicated = 1 in 5615 def _abs_cdnPt_V4 : STInst2<(outs), 5616 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), 5617 !strconcat("if ($src1.new)", 5618 !strconcat(OpcStr, "(#$src2) = $src3")), 5619 []>, 5620 Requires<[HasV4T]>; 5621 5622 let isPredicated = 1 in 5623 def _abs_cdnNotPt_V4 : STInst2<(outs), 5624 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), 5625 !strconcat("if (!$src1.new)", 5626 !strconcat(OpcStr, "(#$src2) = $src3")), 5627 []>, 5628 Requires<[HasV4T]>; 5629 5630 def _abs_nv_V4 : STInst2<(outs), 5631 (ins u6Imm:$src1, IntRegs:$src2), 5632 !strconcat(OpcStr, "(#$src1) = $src2.new"), 5633 []>, 5634 Requires<[HasV4T]>; 5635 5636 let isPredicated = 1 in 5637 def _abs_cPt_nv_V4 : STInst2<(outs), 5638 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), 5639 !strconcat("if ($src1)", 5640 !strconcat(OpcStr, "(#$src2) = $src3.new")), 5641 []>, 5642 Requires<[HasV4T]>; 5643 5644 let isPredicated = 1 in 5645 def _abs_cNotPt_nv_V4 : STInst2<(outs), 5646 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), 5647 !strconcat("if (!$src1)", 5648 !strconcat(OpcStr, "(#$src2) = $src3.new")), 5649 []>, 5650 Requires<[HasV4T]>; 5651 5652 let isPredicated = 1 in 5653 def _abs_cdnPt_nv_V4 : STInst2<(outs), 5654 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), 5655 !strconcat("if ($src1.new)", 5656 !strconcat(OpcStr, "(#$src2) = $src3.new")), 5657 []>, 5658 Requires<[HasV4T]>; 5659 5660 let isPredicated = 1 in 5661 def _abs_cdnNotPt_nv_V4 : STInst2<(outs), 5662 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), 5663 !strconcat("if (!$src1.new)", 5664 !strconcat(OpcStr, "(#$src2) = $src3.new")), 5665 []>, 5666 Requires<[HasV4T]>; 5667 } 5668 5669 defm STrib_imm : ST_absimm<"memb">; 5670 defm STrih_imm : ST_absimm<"memh">; 5671 defm STriw_imm : ST_absimm<"memw">; 5672 5673 let Predicates = [HasV4T], AddedComplexity = 30 in 5674 def : Pat<(truncstorei8 (i32 IntRegs:$src1), u6ImmPred:$src2), 5675 (STrib_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>; 5676 5677 let Predicates = [HasV4T], AddedComplexity = 30 in 5678 def : Pat<(truncstorei16 (i32 IntRegs:$src1), u6ImmPred:$src2), 5679 (STrih_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>; 5680 5681 let Predicates = [HasV4T], AddedComplexity = 30 in 5682 def : Pat<(store (i32 IntRegs:$src1), u6ImmPred:$src2), 5683 (STriw_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>; 5684 5685 5686 // Load - absolute addressing mode: These instruction take constant 5687 // value as the extended operand 5688 5689 multiclass LD_absimm<string OpcStr> { 5690 let isPredicable = 1 in 5691 def _abs_V4 : LDInst2<(outs IntRegs:$dst), 5692 (ins u6Imm:$src), 5693 !strconcat("$dst = ", 5694 !strconcat(OpcStr, "(#$src)")), 5695 []>, 5696 Requires<[HasV4T]>; 5697 5698 let isPredicated = 1 in 5699 def _abs_cPt_V4 : LDInst2<(outs IntRegs:$dst), 5700 (ins PredRegs:$src1, u6Imm:$src2), 5701 !strconcat("if ($src1) $dst = ", 5702 !strconcat(OpcStr, "(#$src2)")), 5703 []>, 5704 Requires<[HasV4T]>; 5705 5706 let isPredicated = 1 in 5707 def _abs_cNotPt_V4 : LDInst2<(outs IntRegs:$dst), 5708 (ins PredRegs:$src1, u6Imm:$src2), 5709 !strconcat("if (!$src1) $dst = ", 5710 !strconcat(OpcStr, "(#$src2)")), 5711 []>, 5712 Requires<[HasV4T]>; 5713 5714 let isPredicated = 1 in 5715 def _abs_cdnPt_V4 : LDInst2<(outs IntRegs:$dst), 5716 (ins PredRegs:$src1, u6Imm:$src2), 5717 !strconcat("if ($src1.new) $dst = ", 5718 !strconcat(OpcStr, "(#$src2)")), 5719 []>, 5720 Requires<[HasV4T]>; 5721 5722 let isPredicated = 1 in 5723 def _abs_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst), 5724 (ins PredRegs:$src1, u6Imm:$src2), 5725 !strconcat("if (!$src1.new) $dst = ", 5726 !strconcat(OpcStr, "(#$src2)")), 5727 []>, 5728 Requires<[HasV4T]>; 5729 } 5730 5731 defm LDrib_imm : LD_absimm<"memb">; 5732 defm LDriub_imm : LD_absimm<"memub">; 5733 defm LDrih_imm : LD_absimm<"memh">; 5734 defm LDriuh_imm : LD_absimm<"memuh">; 5735 defm LDriw_imm : LD_absimm<"memw">; 5736 5737 let Predicates = [HasV4T], AddedComplexity = 30 in 5738 def : Pat<(i32 (load u6ImmPred:$src)), 5739 (LDriw_imm_abs_V4 u6ImmPred:$src)>; 5740 5741 let Predicates = [HasV4T], AddedComplexity=30 in 5742 def : Pat<(i32 (sextloadi8 u6ImmPred:$src)), 5743 (LDrib_imm_abs_V4 u6ImmPred:$src)>; 5744 5745 let Predicates = [HasV4T], AddedComplexity=30 in 5746 def : Pat<(i32 (zextloadi8 u6ImmPred:$src)), 5747 (LDriub_imm_abs_V4 u6ImmPred:$src)>; 5748 5749 let Predicates = [HasV4T], AddedComplexity=30 in 5750 def : Pat<(i32 (sextloadi16 u6ImmPred:$src)), 5751 (LDrih_imm_abs_V4 u6ImmPred:$src)>; 5752 5753 let Predicates = [HasV4T], AddedComplexity=30 in 5754 def : Pat<(i32 (zextloadi16 u6ImmPred:$src)), 5755 (LDriuh_imm_abs_V4 u6ImmPred:$src)>; 5756 5757 5758 // Indexed store double word - global address. 5759 // memw(Rs+#u6:2)=#S8 5760 let AddedComplexity = 10 in 5761 def STriw_offset_ext_V4 : STInst<(outs), 5762 (ins IntRegs:$src1, u6_2Imm:$src2, globaladdress:$src3), 5763 "memw($src1+#$src2) = ##$src3", 5764 [(store (HexagonCONST32 tglobaladdr:$src3), 5765 (add IntRegs:$src1, u6_2ImmPred:$src2))]>, 5766 Requires<[HasV4T]>; 5767 5768 5769 // Indexed store double word - global address. 5770 // memw(Rs+#u6:2)=#S8 5771 let AddedComplexity = 10 in 5772 def STrih_offset_ext_V4 : STInst<(outs), 5773 (ins IntRegs:$src1, u6_1Imm:$src2, globaladdress:$src3), 5774 "memh($src1+#$src2) = ##$src3", 5775 [(truncstorei16 (HexagonCONST32 tglobaladdr:$src3), 5776 (add IntRegs:$src1, u6_1ImmPred:$src2))]>, 5777 Requires<[HasV4T]>; 5778