1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=aarch64-- -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s 3 4--- | 5 target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" 6 7 define void @store_s64_gpr(i64* %addr) { ret void } 8 define void @store_s32_gpr(i32* %addr) { ret void } 9 define void @store_s16_gpr(i16* %addr) { ret void } 10 define void @store_s8_gpr(i8* %addr) { ret void } 11 12 define void @store_zero_s64_gpr(i64* %addr) { ret void } 13 define void @store_zero_s32_gpr(i32* %addr) { ret void } 14 define void @store_zero_s16(i32* %addr) { ret void } 15 define void @store_zero_s8(i32* %addr) { ret void } 16 define void @store_zero_look_through_cst(i32* %addr) { ret void } 17 18 define void @store_fi_s64_gpr() { 19 %ptr0 = alloca i64 20 ret void 21 } 22 23 define void @store_gep_128_s64_gpr(i64* %addr) { ret void } 24 define void @store_gep_512_s32_gpr(i32* %addr) { ret void } 25 define void @store_gep_64_s16_gpr(i16* %addr) { ret void } 26 define void @store_gep_1_s8_gpr(i8* %addr) { ret void } 27 28 define void @store_s64_fpr(i64* %addr) { ret void } 29 define void @store_s32_fpr(i32* %addr) { ret void } 30 31 define void @store_gep_8_s64_fpr(i64* %addr) { ret void } 32 define void @store_gep_8_s32_fpr(i32* %addr) { ret void } 33 34 define void @store_v2s32(i64 *%addr) { ret void } 35 define void @store_v2s64(i64 *%addr) { ret void } 36 37 define void @store_4xi16(<4 x i16> %v, <4 x i16>* %ptr) { ret void } 38 define void @store_4xi32(<4 x i32> %v, <4 x i32>* %ptr) { ret void } 39 define void @store_8xi16(<8 x i16> %v, <8 x i16>* %ptr) { ret void } 40 define void @store_16xi8(<16 x i8> %v, <16 x i8>* %ptr) { ret void } 41 42 @x = external hidden local_unnamed_addr global i32*, align 8 43 define void @store_adrp_add_low() { ret void } 44 45... 46 47--- 48name: store_s64_gpr 49legalized: true 50regBankSelected: true 51 52registers: 53 - { id: 0, class: gpr } 54 - { id: 1, class: gpr } 55 56body: | 57 bb.0: 58 liveins: $x0, $x1 59 60 ; CHECK-LABEL: name: store_s64_gpr 61 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 62 ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 63 ; CHECK: STRXui [[COPY1]], [[COPY]], 0 :: (store 8 into %ir.addr) 64 %0(p0) = COPY $x0 65 %1(s64) = COPY $x1 66 G_STORE %1, %0 :: (store 8 into %ir.addr) 67 68... 69 70--- 71name: store_s32_gpr 72legalized: true 73regBankSelected: true 74 75registers: 76 - { id: 0, class: gpr } 77 - { id: 1, class: gpr } 78 79body: | 80 bb.0: 81 liveins: $x0, $w1 82 83 ; CHECK-LABEL: name: store_s32_gpr 84 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 85 ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 86 ; CHECK: STRWui [[COPY1]], [[COPY]], 0 :: (store 4 into %ir.addr) 87 %0(p0) = COPY $x0 88 %1(s32) = COPY $w1 89 G_STORE %1, %0 :: (store 4 into %ir.addr) 90 91... 92 93--- 94name: store_s16_gpr 95legalized: true 96regBankSelected: true 97 98registers: 99 - { id: 0, class: gpr } 100 - { id: 1, class: gpr } 101 102body: | 103 bb.0: 104 liveins: $x0, $w1 105 106 ; CHECK-LABEL: name: store_s16_gpr 107 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 108 ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 109 ; CHECK: STRHHui [[COPY1]], [[COPY]], 0 :: (store 2 into %ir.addr) 110 %0(p0) = COPY $x0 111 %2:gpr(s32) = COPY $w1 112 %1(s16) = G_TRUNC %2 113 G_STORE %1, %0 :: (store 2 into %ir.addr) 114 115... 116 117--- 118name: store_s8_gpr 119legalized: true 120regBankSelected: true 121 122registers: 123 - { id: 0, class: gpr } 124 - { id: 1, class: gpr } 125 126body: | 127 bb.0: 128 liveins: $x0, $w1 129 130 ; CHECK-LABEL: name: store_s8_gpr 131 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 132 ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 133 ; CHECK: STRBBui [[COPY1]], [[COPY]], 0 :: (store 1 into %ir.addr) 134 %0(p0) = COPY $x0 135 %2:gpr(s32) = COPY $w1 136 %1(s8) = G_TRUNC %2 137 G_STORE %1, %0 :: (store 1 into %ir.addr) 138 139... 140 141--- 142name: store_zero_s64_gpr 143legalized: true 144regBankSelected: true 145 146registers: 147 - { id: 0, class: gpr } 148 - { id: 1, class: gpr } 149 150body: | 151 bb.0: 152 liveins: $x0, $x1 153 154 ; CHECK-LABEL: name: store_zero_s64_gpr 155 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 156 ; CHECK: STRXui $xzr, [[COPY]], 0 :: (store 8 into %ir.addr) 157 %0(p0) = COPY $x0 158 %1(s64) = G_CONSTANT i64 0 159 G_STORE %1, %0 :: (store 8 into %ir.addr) 160 161... 162 163--- 164name: store_zero_s32_gpr 165legalized: true 166regBankSelected: true 167 168registers: 169 - { id: 0, class: gpr } 170 - { id: 1, class: gpr } 171 172body: | 173 bb.0: 174 liveins: $x0 175 176 ; CHECK-LABEL: name: store_zero_s32_gpr 177 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 178 ; CHECK: STRWui $wzr, [[COPY]], 0 :: (store 4 into %ir.addr) 179 %0(p0) = COPY $x0 180 %1(s32) = G_CONSTANT i32 0 181 G_STORE %1, %0 :: (store 4 into %ir.addr) 182 183... 184 185--- 186name: store_zero_s16 187legalized: true 188regBankSelected: true 189body: | 190 bb.0: 191 liveins: $x0 192 ; CHECK-LABEL: name: store_zero_s16 193 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 194 ; CHECK: STRHHui $wzr, [[COPY]], 0 :: (store 2) 195 %0:gpr(p0) = COPY $x0 196 %1:gpr(s16) = G_CONSTANT i16 0 197 G_STORE %1(s16), %0(p0) :: (store 2) 198 199... 200 201--- 202name: store_zero_s8 203legalized: true 204regBankSelected: true 205body: | 206 bb.0: 207 liveins: $x0 208 ; CHECK-LABEL: name: store_zero_s8 209 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 210 ; CHECK: STRBBui $wzr, [[COPY]], 0 :: (store 1) 211 %0:gpr(p0) = COPY $x0 212 %1:gpr(s8) = G_CONSTANT i8 0 213 G_STORE %1(s8), %0(p0) :: (store 1) 214... 215 216--- 217name: store_zero_look_through_cst 218legalized: true 219regBankSelected: true 220body: | 221 bb.0: 222 liveins: $x0 223 ; CHECK-LABEL: name: store_zero_look_through_cst 224 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 225 ; CHECK: STRXui $xzr, [[COPY]], 0 :: (store 8 into %ir.addr) 226 %0:gpr(p0) = COPY $x0 227 %1:gpr(s32) = G_CONSTANT i32 0 228 %2:gpr(s64) = G_ZEXT %1 229 G_STORE %2, %0 :: (store 8 into %ir.addr) 230... 231 232--- 233name: store_fi_s64_gpr 234legalized: true 235regBankSelected: true 236 237registers: 238 - { id: 0, class: gpr } 239 - { id: 1, class: gpr } 240 241stack: 242 - { id: 0, name: ptr0, offset: 0, size: 8, alignment: 8 } 243 244body: | 245 bb.0: 246 liveins: $x0 247 248 ; CHECK-LABEL: name: store_fi_s64_gpr 249 ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 250 ; CHECK: STRXui [[COPY]], %stack.0.ptr0, 0 :: (store 8) 251 %0(p0) = COPY $x0 252 %1(p0) = G_FRAME_INDEX %stack.0.ptr0 253 G_STORE %0, %1 :: (store 8) 254... 255 256--- 257name: store_gep_128_s64_gpr 258legalized: true 259regBankSelected: true 260 261registers: 262 - { id: 0, class: gpr } 263 - { id: 1, class: gpr } 264 - { id: 2, class: gpr } 265 - { id: 3, class: gpr } 266 267body: | 268 bb.0: 269 liveins: $x0, $x1 270 271 ; CHECK-LABEL: name: store_gep_128_s64_gpr 272 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 273 ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 274 ; CHECK: STRXui [[COPY1]], [[COPY]], 16 :: (store 8 into %ir.addr) 275 %0(p0) = COPY $x0 276 %1(s64) = COPY $x1 277 %2(s64) = G_CONSTANT i64 128 278 %3(p0) = G_PTR_ADD %0, %2 279 G_STORE %1, %3 :: (store 8 into %ir.addr) 280... 281 282--- 283name: store_gep_512_s32_gpr 284legalized: true 285regBankSelected: true 286 287registers: 288 - { id: 0, class: gpr } 289 - { id: 1, class: gpr } 290 - { id: 2, class: gpr } 291 - { id: 3, class: gpr } 292 293body: | 294 bb.0: 295 liveins: $x0, $w1 296 297 ; CHECK-LABEL: name: store_gep_512_s32_gpr 298 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 299 ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 300 ; CHECK: STRWui [[COPY1]], [[COPY]], 128 :: (store 4 into %ir.addr) 301 %0(p0) = COPY $x0 302 %1(s32) = COPY $w1 303 %2(s64) = G_CONSTANT i64 512 304 %3(p0) = G_PTR_ADD %0, %2 305 G_STORE %1, %3 :: (store 4 into %ir.addr) 306... 307 308--- 309name: store_gep_64_s16_gpr 310legalized: true 311regBankSelected: true 312 313registers: 314 - { id: 0, class: gpr } 315 - { id: 1, class: gpr } 316 - { id: 2, class: gpr } 317 - { id: 3, class: gpr } 318 319body: | 320 bb.0: 321 liveins: $x0, $w1 322 323 ; CHECK-LABEL: name: store_gep_64_s16_gpr 324 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 325 ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 326 ; CHECK: STRHHui [[COPY1]], [[COPY]], 32 :: (store 2 into %ir.addr) 327 %0(p0) = COPY $x0 328 %4:gpr(s32) = COPY $w1 329 %1(s16) = G_TRUNC %4 330 %2(s64) = G_CONSTANT i64 64 331 %3(p0) = G_PTR_ADD %0, %2 332 G_STORE %1, %3 :: (store 2 into %ir.addr) 333... 334 335--- 336name: store_gep_1_s8_gpr 337legalized: true 338regBankSelected: true 339 340registers: 341 - { id: 0, class: gpr } 342 - { id: 1, class: gpr } 343 - { id: 2, class: gpr } 344 - { id: 3, class: gpr } 345 346body: | 347 bb.0: 348 liveins: $x0, $w1 349 350 ; CHECK-LABEL: name: store_gep_1_s8_gpr 351 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 352 ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 353 ; CHECK: STRBBui [[COPY1]], [[COPY]], 1 :: (store 1 into %ir.addr) 354 %0(p0) = COPY $x0 355 %4:gpr(s32) = COPY $w1 356 %1(s8) = G_TRUNC %4 357 %2(s64) = G_CONSTANT i64 1 358 %3(p0) = G_PTR_ADD %0, %2 359 G_STORE %1, %3 :: (store 1 into %ir.addr) 360... 361 362--- 363name: store_s64_fpr 364legalized: true 365regBankSelected: true 366 367registers: 368 - { id: 0, class: gpr } 369 - { id: 1, class: fpr } 370 371body: | 372 bb.0: 373 liveins: $x0, $d1 374 375 ; CHECK-LABEL: name: store_s64_fpr 376 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 377 ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 378 ; CHECK: STRDui [[COPY1]], [[COPY]], 0 :: (store 8 into %ir.addr) 379 %0(p0) = COPY $x0 380 %1(s64) = COPY $d1 381 G_STORE %1, %0 :: (store 8 into %ir.addr) 382 383... 384 385--- 386name: store_s32_fpr 387legalized: true 388regBankSelected: true 389 390registers: 391 - { id: 0, class: gpr } 392 - { id: 1, class: fpr } 393 394body: | 395 bb.0: 396 liveins: $x0, $s1 397 398 ; CHECK-LABEL: name: store_s32_fpr 399 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 400 ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1 401 ; CHECK: STRSui [[COPY1]], [[COPY]], 0 :: (store 4 into %ir.addr) 402 %0(p0) = COPY $x0 403 %1(s32) = COPY $s1 404 G_STORE %1, %0 :: (store 4 into %ir.addr) 405 406... 407 408--- 409name: store_gep_8_s64_fpr 410legalized: true 411regBankSelected: true 412 413registers: 414 - { id: 0, class: gpr } 415 - { id: 1, class: fpr } 416 - { id: 2, class: gpr } 417 - { id: 3, class: gpr } 418 419body: | 420 bb.0: 421 liveins: $x0, $d1 422 423 ; CHECK-LABEL: name: store_gep_8_s64_fpr 424 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 425 ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 426 ; CHECK: STRDui [[COPY1]], [[COPY]], 1 :: (store 8 into %ir.addr) 427 %0(p0) = COPY $x0 428 %1(s64) = COPY $d1 429 %2(s64) = G_CONSTANT i64 8 430 %3(p0) = G_PTR_ADD %0, %2 431 G_STORE %1, %3 :: (store 8 into %ir.addr) 432... 433 434--- 435name: store_gep_8_s32_fpr 436legalized: true 437regBankSelected: true 438 439registers: 440 - { id: 0, class: gpr } 441 - { id: 1, class: fpr } 442 - { id: 2, class: gpr } 443 - { id: 3, class: gpr } 444 445body: | 446 bb.0: 447 liveins: $x0, $s1 448 449 ; CHECK-LABEL: name: store_gep_8_s32_fpr 450 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 451 ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1 452 ; CHECK: STRSui [[COPY1]], [[COPY]], 2 :: (store 4 into %ir.addr) 453 %0(p0) = COPY $x0 454 %1(s32) = COPY $s1 455 %2(s64) = G_CONSTANT i64 8 456 %3(p0) = G_PTR_ADD %0, %2 457 G_STORE %1, %3 :: (store 4 into %ir.addr) 458... 459--- 460name: store_v2s32 461legalized: true 462regBankSelected: true 463 464registers: 465 - { id: 0, class: gpr } 466 - { id: 1, class: fpr } 467 468body: | 469 bb.0: 470 liveins: $x0, $d1 471 472 ; CHECK-LABEL: name: store_v2s32 473 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 474 ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 475 ; CHECK: STRDui [[COPY1]], [[COPY]], 0 :: (store 8 into %ir.addr) 476 %0(p0) = COPY $x0 477 %1(<2 x s32>) = COPY $d1 478 G_STORE %1, %0 :: (store 8 into %ir.addr) 479 480... 481--- 482name: store_v2s64 483legalized: true 484regBankSelected: true 485 486registers: 487 - { id: 0, class: gpr } 488 - { id: 1, class: fpr } 489 490body: | 491 bb.0: 492 liveins: $x0, $d1 493 ; CHECK-LABEL: name: store_v2s64 494 ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 495 ; CHECK: [[COPY1:%[0-9]+]]:fpr128 = COPY $q1 496 ; CHECK: STRQui [[COPY1]], [[COPY]], 0 :: (store 16 into %ir.addr, align 8) 497 %0(p0) = COPY $x0 498 %1(<2 x s64>) = COPY $q1 499 G_STORE %1, %0 :: (store 16 into %ir.addr, align 8) 500 501... 502--- 503name: store_4xi16 504alignment: 4 505legalized: true 506regBankSelected: true 507tracksRegLiveness: true 508registers: 509 - { id: 0, class: fpr } 510 - { id: 1, class: gpr } 511machineFunctionInfo: {} 512body: | 513 bb.1 (%ir-block.0): 514 liveins: $d0, $x0 515 516 ; CHECK-LABEL: name: store_4xi16 517 ; CHECK: liveins: $d0, $x0 518 ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0 519 ; CHECK: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0 520 ; CHECK: STRDui [[COPY]], [[COPY1]], 0 :: (store 8 into %ir.ptr) 521 ; CHECK: RET_ReallyLR 522 %0:fpr(<4 x s16>) = COPY $d0 523 %1:gpr(p0) = COPY $x0 524 G_STORE %0(<4 x s16>), %1(p0) :: (store 8 into %ir.ptr) 525 RET_ReallyLR 526 527... 528--- 529name: store_4xi32 530alignment: 4 531legalized: true 532regBankSelected: true 533tracksRegLiveness: true 534registers: 535 - { id: 0, class: fpr } 536 - { id: 1, class: gpr } 537machineFunctionInfo: {} 538body: | 539 bb.1 (%ir-block.0): 540 liveins: $q0, $x0 541 542 ; CHECK-LABEL: name: store_4xi32 543 ; CHECK: liveins: $q0, $x0 544 ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0 545 ; CHECK: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0 546 ; CHECK: STRQui [[COPY]], [[COPY1]], 0 :: (store 16 into %ir.ptr) 547 ; CHECK: RET_ReallyLR 548 %0:fpr(<4 x s32>) = COPY $q0 549 %1:gpr(p0) = COPY $x0 550 G_STORE %0(<4 x s32>), %1(p0) :: (store 16 into %ir.ptr) 551 RET_ReallyLR 552 553... 554--- 555name: store_8xi16 556alignment: 4 557legalized: true 558regBankSelected: true 559tracksRegLiveness: true 560registers: 561 - { id: 0, class: fpr } 562 - { id: 1, class: gpr } 563machineFunctionInfo: {} 564body: | 565 bb.1 (%ir-block.0): 566 liveins: $q0, $x0 567 568 ; CHECK-LABEL: name: store_8xi16 569 ; CHECK: liveins: $q0, $x0 570 ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0 571 ; CHECK: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0 572 ; CHECK: STRQui [[COPY]], [[COPY1]], 0 :: (store 16 into %ir.ptr) 573 ; CHECK: RET_ReallyLR 574 %0:fpr(<8 x s16>) = COPY $q0 575 %1:gpr(p0) = COPY $x0 576 G_STORE %0(<8 x s16>), %1(p0) :: (store 16 into %ir.ptr) 577 RET_ReallyLR 578 579... 580--- 581name: store_16xi8 582alignment: 4 583legalized: true 584regBankSelected: true 585tracksRegLiveness: true 586registers: 587 - { id: 0, class: fpr } 588 - { id: 1, class: gpr } 589machineFunctionInfo: {} 590body: | 591 bb.1 (%ir-block.0): 592 liveins: $q0, $x0 593 594 ; CHECK-LABEL: name: store_16xi8 595 ; CHECK: liveins: $q0, $x0 596 ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0 597 ; CHECK: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0 598 ; CHECK: STRQui [[COPY]], [[COPY1]], 0 :: (store 16 into %ir.ptr) 599 ; CHECK: RET_ReallyLR 600 %0:fpr(<16 x s8>) = COPY $q0 601 %1:gpr(p0) = COPY $x0 602 G_STORE %0(<16 x s8>), %1(p0) :: (store 16 into %ir.ptr) 603 RET_ReallyLR 604 605... 606--- 607name: store_adrp_add_low 608legalized: true 609regBankSelected: true 610tracksRegLiveness: true 611body: | 612 bb.0: 613 liveins: $x0 614 ; CHECK-LABEL: name: store_adrp_add_low 615 ; CHECK: liveins: $x0 616 ; CHECK: %copy:gpr64 = COPY $x0 617 ; CHECK: %adrp:gpr64common = ADRP target-flags(aarch64-page) @x 618 ; CHECK: STRXui %copy, %adrp, target-flags(aarch64-pageoff, aarch64-nc) @x :: (store 8 into @x) 619 %copy:gpr(p0) = COPY $x0 620 %adrp:gpr64(p0) = ADRP target-flags(aarch64-page) @x 621 %add_low:gpr(p0) = G_ADD_LOW %adrp(p0), target-flags(aarch64-pageoff, aarch64-nc) @x 622 G_STORE %copy(p0), %add_low(p0) :: (store 8 into @x) 623