1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LE 3; RUN: llc -mtriple=thumbebv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BE 4 5define ptr @ldrwu32_4(ptr %x, ptr %y) { 6; CHECK-LABEL: ldrwu32_4: 7; CHECK: @ %bb.0: @ %entry 8; CHECK-NEXT: vldrw.u32 q0, [r0, #4]! 9; CHECK-NEXT: vstrw.32 q0, [r1] 10; CHECK-NEXT: bx lr 11entry: 12 %z = getelementptr inbounds i8, ptr %x, i32 4 13 %0 = load <4 x i32>, ptr %z, align 4 14 store <4 x i32> %0, ptr %y, align 4 15 ret ptr %z 16} 17 18define ptr @ldrwu32_3(ptr %x, ptr %y) { 19; CHECK-LE-LABEL: ldrwu32_3: 20; CHECK-LE: @ %bb.0: @ %entry 21; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]! 22; CHECK-LE-NEXT: vstrw.32 q0, [r1] 23; CHECK-LE-NEXT: bx lr 24; 25; CHECK-BE-LABEL: ldrwu32_3: 26; CHECK-BE: @ %bb.0: @ %entry 27; CHECK-BE-NEXT: adds r0, #3 28; CHECK-BE-NEXT: vldrw.u32 q0, [r0] 29; CHECK-BE-NEXT: vstrw.32 q0, [r1] 30; CHECK-BE-NEXT: bx lr 31entry: 32 %z = getelementptr inbounds i8, ptr %x, i32 3 33 %0 = load <4 x i32>, ptr %z, align 4 34 store <4 x i32> %0, ptr %y, align 4 35 ret ptr %z 36} 37 38define ptr @ldrwu32_m4(ptr %x, ptr %y) { 39; CHECK-LABEL: ldrwu32_m4: 40; CHECK: @ %bb.0: @ %entry 41; CHECK-NEXT: vldrw.u32 q0, [r0, #-4]! 42; CHECK-NEXT: vstrw.32 q0, [r1] 43; CHECK-NEXT: bx lr 44entry: 45 %z = getelementptr inbounds i8, ptr %x, i32 -4 46 %0 = load <4 x i32>, ptr %z, align 4 47 store <4 x i32> %0, ptr %y, align 4 48 ret ptr %z 49} 50 51define ptr @ldrwu32_508(ptr %x, ptr %y) { 52; CHECK-LABEL: ldrwu32_508: 53; CHECK: @ %bb.0: @ %entry 54; CHECK-NEXT: vldrw.u32 q0, [r0, #508]! 55; CHECK-NEXT: vstrw.32 q0, [r1] 56; CHECK-NEXT: bx lr 57entry: 58 %z = getelementptr inbounds i8, ptr %x, i32 508 59 %0 = load <4 x i32>, ptr %z, align 4 60 store <4 x i32> %0, ptr %y, align 4 61 ret ptr %z 62} 63 64define ptr @ldrwu32_512(ptr %x, ptr %y) { 65; CHECK-LABEL: ldrwu32_512: 66; CHECK: @ %bb.0: @ %entry 67; CHECK-NEXT: add.w r0, r0, #512 68; CHECK-NEXT: vldrw.u32 q0, [r0] 69; CHECK-NEXT: vstrw.32 q0, [r1] 70; CHECK-NEXT: bx lr 71entry: 72 %z = getelementptr inbounds i8, ptr %x, i32 512 73 %0 = load <4 x i32>, ptr %z, align 4 74 store <4 x i32> %0, ptr %y, align 4 75 ret ptr %z 76} 77 78define ptr @ldrwu32_m508(ptr %x, ptr %y) { 79; CHECK-LABEL: ldrwu32_m508: 80; CHECK: @ %bb.0: @ %entry 81; CHECK-NEXT: vldrw.u32 q0, [r0, #-508]! 82; CHECK-NEXT: vstrw.32 q0, [r1] 83; CHECK-NEXT: bx lr 84entry: 85 %z = getelementptr inbounds i8, ptr %x, i32 -508 86 %0 = load <4 x i32>, ptr %z, align 4 87 store <4 x i32> %0, ptr %y, align 4 88 ret ptr %z 89} 90 91define ptr @ldrwu32_m512(ptr %x, ptr %y) { 92; CHECK-LABEL: ldrwu32_m512: 93; CHECK: @ %bb.0: @ %entry 94; CHECK-NEXT: sub.w r0, r0, #512 95; CHECK-NEXT: vldrw.u32 q0, [r0] 96; CHECK-NEXT: vstrw.32 q0, [r1] 97; CHECK-NEXT: bx lr 98entry: 99 %z = getelementptr inbounds i8, ptr %x, i32 -512 100 %0 = load <4 x i32>, ptr %z, align 4 101 store <4 x i32> %0, ptr %y, align 4 102 ret ptr %z 103} 104 105 106define ptr @ldrhu32_4(ptr %x, ptr %y) { 107; CHECK-LABEL: ldrhu32_4: 108; CHECK: @ %bb.0: @ %entry 109; CHECK-NEXT: vldrh.u32 q0, [r0, #4]! 110; CHECK-NEXT: vstrw.32 q0, [r1] 111; CHECK-NEXT: bx lr 112entry: 113 %z = getelementptr inbounds i8, ptr %x, i32 4 114 %0 = load <4 x i16>, ptr %z, align 2 115 %1 = zext <4 x i16> %0 to <4 x i32> 116 store <4 x i32> %1, ptr %y, align 4 117 ret ptr %z 118} 119 120define ptr @ldrhu32_3(ptr %x, ptr %y) { 121; CHECK-LABEL: ldrhu32_3: 122; CHECK: @ %bb.0: @ %entry 123; CHECK-NEXT: adds r0, #3 124; CHECK-NEXT: vldrh.u32 q0, [r0] 125; CHECK-NEXT: vstrw.32 q0, [r1] 126; CHECK-NEXT: bx lr 127entry: 128 %z = getelementptr inbounds i8, ptr %x, i32 3 129 %0 = load <4 x i16>, ptr %z, align 2 130 %1 = zext <4 x i16> %0 to <4 x i32> 131 store <4 x i32> %1, ptr %y, align 4 132 ret ptr %z 133} 134 135define ptr @ldrhu32_2(ptr %x, ptr %y) { 136; CHECK-LABEL: ldrhu32_2: 137; CHECK: @ %bb.0: @ %entry 138; CHECK-NEXT: vldrh.u32 q0, [r0, #2]! 139; CHECK-NEXT: vstrw.32 q0, [r1] 140; CHECK-NEXT: bx lr 141entry: 142 %z = getelementptr inbounds i8, ptr %x, i32 2 143 %0 = load <4 x i16>, ptr %z, align 2 144 %1 = zext <4 x i16> %0 to <4 x i32> 145 store <4 x i32> %1, ptr %y, align 4 146 ret ptr %z 147} 148 149define ptr @ldrhu32_254(ptr %x, ptr %y) { 150; CHECK-LABEL: ldrhu32_254: 151; CHECK: @ %bb.0: @ %entry 152; CHECK-NEXT: vldrh.u32 q0, [r0, #254]! 153; CHECK-NEXT: vstrw.32 q0, [r1] 154; CHECK-NEXT: bx lr 155entry: 156 %z = getelementptr inbounds i8, ptr %x, i32 254 157 %0 = load <4 x i16>, ptr %z, align 2 158 %1 = zext <4 x i16> %0 to <4 x i32> 159 store <4 x i32> %1, ptr %y, align 4 160 ret ptr %z 161} 162 163define ptr @ldrhu32_256(ptr %x, ptr %y) { 164; CHECK-LABEL: ldrhu32_256: 165; CHECK: @ %bb.0: @ %entry 166; CHECK-NEXT: add.w r0, r0, #256 167; CHECK-NEXT: vldrh.u32 q0, [r0] 168; CHECK-NEXT: vstrw.32 q0, [r1] 169; CHECK-NEXT: bx lr 170entry: 171 %z = getelementptr inbounds i8, ptr %x, i32 256 172 %0 = load <4 x i16>, ptr %z, align 2 173 %1 = zext <4 x i16> %0 to <4 x i32> 174 store <4 x i32> %1, ptr %y, align 4 175 ret ptr %z 176} 177 178define ptr @ldrhu32_m254(ptr %x, ptr %y) { 179; CHECK-LABEL: ldrhu32_m254: 180; CHECK: @ %bb.0: @ %entry 181; CHECK-NEXT: vldrh.u32 q0, [r0, #-254]! 182; CHECK-NEXT: vstrw.32 q0, [r1] 183; CHECK-NEXT: bx lr 184entry: 185 %z = getelementptr inbounds i8, ptr %x, i32 -254 186 %0 = load <4 x i16>, ptr %z, align 2 187 %1 = zext <4 x i16> %0 to <4 x i32> 188 store <4 x i32> %1, ptr %y, align 4 189 ret ptr %z 190} 191 192define ptr @ldrhu32_m256(ptr %x, ptr %y) { 193; CHECK-LABEL: ldrhu32_m256: 194; CHECK: @ %bb.0: @ %entry 195; CHECK-NEXT: sub.w r0, r0, #256 196; CHECK-NEXT: vldrh.u32 q0, [r0] 197; CHECK-NEXT: vstrw.32 q0, [r1] 198; CHECK-NEXT: bx lr 199entry: 200 %z = getelementptr inbounds i8, ptr %x, i32 -256 201 %0 = load <4 x i16>, ptr %z, align 2 202 %1 = zext <4 x i16> %0 to <4 x i32> 203 store <4 x i32> %1, ptr %y, align 4 204 ret ptr %z 205} 206 207 208define ptr @ldrhs32_4(ptr %x, ptr %y) { 209; CHECK-LABEL: ldrhs32_4: 210; CHECK: @ %bb.0: @ %entry 211; CHECK-NEXT: vldrh.s32 q0, [r0, #4]! 212; CHECK-NEXT: vstrw.32 q0, [r1] 213; CHECK-NEXT: bx lr 214entry: 215 %z = getelementptr inbounds i8, ptr %x, i32 4 216 %0 = load <4 x i16>, ptr %z, align 2 217 %1 = sext <4 x i16> %0 to <4 x i32> 218 store <4 x i32> %1, ptr %y, align 4 219 ret ptr %z 220} 221 222define ptr @ldrhs32_3(ptr %x, ptr %y) { 223; CHECK-LABEL: ldrhs32_3: 224; CHECK: @ %bb.0: @ %entry 225; CHECK-NEXT: adds r0, #3 226; CHECK-NEXT: vldrh.s32 q0, [r0] 227; CHECK-NEXT: vstrw.32 q0, [r1] 228; CHECK-NEXT: bx lr 229entry: 230 %z = getelementptr inbounds i8, ptr %x, i32 3 231 %0 = load <4 x i16>, ptr %z, align 2 232 %1 = sext <4 x i16> %0 to <4 x i32> 233 store <4 x i32> %1, ptr %y, align 4 234 ret ptr %z 235} 236 237define ptr @ldrhs32_2(ptr %x, ptr %y) { 238; CHECK-LABEL: ldrhs32_2: 239; CHECK: @ %bb.0: @ %entry 240; CHECK-NEXT: vldrh.s32 q0, [r0, #2]! 241; CHECK-NEXT: vstrw.32 q0, [r1] 242; CHECK-NEXT: bx lr 243entry: 244 %z = getelementptr inbounds i8, ptr %x, i32 2 245 %0 = load <4 x i16>, ptr %z, align 2 246 %1 = sext <4 x i16> %0 to <4 x i32> 247 store <4 x i32> %1, ptr %y, align 4 248 ret ptr %z 249} 250 251define ptr @ldrhs32_254(ptr %x, ptr %y) { 252; CHECK-LABEL: ldrhs32_254: 253; CHECK: @ %bb.0: @ %entry 254; CHECK-NEXT: vldrh.s32 q0, [r0, #254]! 255; CHECK-NEXT: vstrw.32 q0, [r1] 256; CHECK-NEXT: bx lr 257entry: 258 %z = getelementptr inbounds i8, ptr %x, i32 254 259 %0 = load <4 x i16>, ptr %z, align 2 260 %1 = sext <4 x i16> %0 to <4 x i32> 261 store <4 x i32> %1, ptr %y, align 4 262 ret ptr %z 263} 264 265define ptr @ldrhs32_256(ptr %x, ptr %y) { 266; CHECK-LABEL: ldrhs32_256: 267; CHECK: @ %bb.0: @ %entry 268; CHECK-NEXT: add.w r0, r0, #256 269; CHECK-NEXT: vldrh.s32 q0, [r0] 270; CHECK-NEXT: vstrw.32 q0, [r1] 271; CHECK-NEXT: bx lr 272entry: 273 %z = getelementptr inbounds i8, ptr %x, i32 256 274 %0 = load <4 x i16>, ptr %z, align 2 275 %1 = sext <4 x i16> %0 to <4 x i32> 276 store <4 x i32> %1, ptr %y, align 4 277 ret ptr %z 278} 279 280define ptr @ldrhs32_m254(ptr %x, ptr %y) { 281; CHECK-LABEL: ldrhs32_m254: 282; CHECK: @ %bb.0: @ %entry 283; CHECK-NEXT: vldrh.s32 q0, [r0, #-254]! 284; CHECK-NEXT: vstrw.32 q0, [r1] 285; CHECK-NEXT: bx lr 286entry: 287 %z = getelementptr inbounds i8, ptr %x, i32 -254 288 %0 = load <4 x i16>, ptr %z, align 2 289 %1 = sext <4 x i16> %0 to <4 x i32> 290 store <4 x i32> %1, ptr %y, align 4 291 ret ptr %z 292} 293 294define ptr @ldrhs32_m256(ptr %x, ptr %y) { 295; CHECK-LABEL: ldrhs32_m256: 296; CHECK: @ %bb.0: @ %entry 297; CHECK-NEXT: sub.w r0, r0, #256 298; CHECK-NEXT: vldrh.s32 q0, [r0] 299; CHECK-NEXT: vstrw.32 q0, [r1] 300; CHECK-NEXT: bx lr 301entry: 302 %z = getelementptr inbounds i8, ptr %x, i32 -256 303 %0 = load <4 x i16>, ptr %z, align 2 304 %1 = sext <4 x i16> %0 to <4 x i32> 305 store <4 x i32> %1, ptr %y, align 4 306 ret ptr %z 307} 308 309 310define ptr @ldrhu16_4(ptr %x, ptr %y) { 311; CHECK-LABEL: ldrhu16_4: 312; CHECK: @ %bb.0: @ %entry 313; CHECK-NEXT: vldrh.u16 q0, [r0, #4]! 314; CHECK-NEXT: vstrh.16 q0, [r1] 315; CHECK-NEXT: bx lr 316entry: 317 %z = getelementptr inbounds i8, ptr %x, i32 4 318 %0 = load <8 x i16>, ptr %z, align 2 319 store <8 x i16> %0, ptr %y, align 2 320 ret ptr %z 321} 322 323define ptr @ldrhu16_3(ptr %x, ptr %y) { 324; CHECK-LE-LABEL: ldrhu16_3: 325; CHECK-LE: @ %bb.0: @ %entry 326; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]! 327; CHECK-LE-NEXT: vstrh.16 q0, [r1] 328; CHECK-LE-NEXT: bx lr 329; 330; CHECK-BE-LABEL: ldrhu16_3: 331; CHECK-BE: @ %bb.0: @ %entry 332; CHECK-BE-NEXT: adds r0, #3 333; CHECK-BE-NEXT: vldrh.u16 q0, [r0] 334; CHECK-BE-NEXT: vstrh.16 q0, [r1] 335; CHECK-BE-NEXT: bx lr 336entry: 337 %z = getelementptr inbounds i8, ptr %x, i32 3 338 %0 = load <8 x i16>, ptr %z, align 2 339 store <8 x i16> %0, ptr %y, align 2 340 ret ptr %z 341} 342 343define ptr @ldrhu16_2(ptr %x, ptr %y) { 344; CHECK-LABEL: ldrhu16_2: 345; CHECK: @ %bb.0: @ %entry 346; CHECK-NEXT: vldrh.u16 q0, [r0, #2]! 347; CHECK-NEXT: vstrh.16 q0, [r1] 348; CHECK-NEXT: bx lr 349entry: 350 %z = getelementptr inbounds i8, ptr %x, i32 2 351 %0 = load <8 x i16>, ptr %z, align 2 352 store <8 x i16> %0, ptr %y, align 2 353 ret ptr %z 354} 355 356define ptr @ldrhu16_254(ptr %x, ptr %y) { 357; CHECK-LABEL: ldrhu16_254: 358; CHECK: @ %bb.0: @ %entry 359; CHECK-NEXT: vldrh.u16 q0, [r0, #254]! 360; CHECK-NEXT: vstrh.16 q0, [r1] 361; CHECK-NEXT: bx lr 362entry: 363 %z = getelementptr inbounds i8, ptr %x, i32 254 364 %0 = load <8 x i16>, ptr %z, align 2 365 store <8 x i16> %0, ptr %y, align 2 366 ret ptr %z 367} 368 369define ptr @ldrhu16_256(ptr %x, ptr %y) { 370; CHECK-LABEL: ldrhu16_256: 371; CHECK: @ %bb.0: @ %entry 372; CHECK-NEXT: add.w r0, r0, #256 373; CHECK-NEXT: vldrh.u16 q0, [r0] 374; CHECK-NEXT: vstrh.16 q0, [r1] 375; CHECK-NEXT: bx lr 376entry: 377 %z = getelementptr inbounds i8, ptr %x, i32 256 378 %0 = load <8 x i16>, ptr %z, align 2 379 store <8 x i16> %0, ptr %y, align 2 380 ret ptr %z 381} 382 383define ptr @ldrhu16_m254(ptr %x, ptr %y) { 384; CHECK-LABEL: ldrhu16_m254: 385; CHECK: @ %bb.0: @ %entry 386; CHECK-NEXT: vldrh.u16 q0, [r0, #-254]! 387; CHECK-NEXT: vstrh.16 q0, [r1] 388; CHECK-NEXT: bx lr 389entry: 390 %z = getelementptr inbounds i8, ptr %x, i32 -254 391 %0 = load <8 x i16>, ptr %z, align 2 392 store <8 x i16> %0, ptr %y, align 2 393 ret ptr %z 394} 395 396define ptr @ldrhu16_m256(ptr %x, ptr %y) { 397; CHECK-LABEL: ldrhu16_m256: 398; CHECK: @ %bb.0: @ %entry 399; CHECK-NEXT: sub.w r0, r0, #256 400; CHECK-NEXT: vldrh.u16 q0, [r0] 401; CHECK-NEXT: vstrh.16 q0, [r1] 402; CHECK-NEXT: bx lr 403entry: 404 %z = getelementptr inbounds i8, ptr %x, i32 -256 405 %0 = load <8 x i16>, ptr %z, align 2 406 store <8 x i16> %0, ptr %y, align 2 407 ret ptr %z 408} 409 410 411define ptr @ldrbu32_4(ptr %x, ptr %y) { 412; CHECK-LABEL: ldrbu32_4: 413; CHECK: @ %bb.0: @ %entry 414; CHECK-NEXT: vldrb.u32 q0, [r0, #4]! 415; CHECK-NEXT: vstrw.32 q0, [r1] 416; CHECK-NEXT: bx lr 417entry: 418 %z = getelementptr inbounds i8, ptr %x, i32 4 419 %0 = load <4 x i8>, ptr %z, align 1 420 %1 = zext <4 x i8> %0 to <4 x i32> 421 store <4 x i32> %1, ptr %y, align 4 422 ret ptr %z 423} 424 425define ptr @ldrbu32_3(ptr %x, ptr %y) { 426; CHECK-LABEL: ldrbu32_3: 427; CHECK: @ %bb.0: @ %entry 428; CHECK-NEXT: vldrb.u32 q0, [r0, #3]! 429; CHECK-NEXT: vstrw.32 q0, [r1] 430; CHECK-NEXT: bx lr 431entry: 432 %z = getelementptr inbounds i8, ptr %x, i32 3 433 %0 = load <4 x i8>, ptr %z, align 1 434 %1 = zext <4 x i8> %0 to <4 x i32> 435 store <4 x i32> %1, ptr %y, align 4 436 ret ptr %z 437} 438 439define ptr @ldrbu32_127(ptr %x, ptr %y) { 440; CHECK-LABEL: ldrbu32_127: 441; CHECK: @ %bb.0: @ %entry 442; CHECK-NEXT: vldrb.u32 q0, [r0, #127]! 443; CHECK-NEXT: vstrw.32 q0, [r1] 444; CHECK-NEXT: bx lr 445entry: 446 %z = getelementptr inbounds i8, ptr %x, i32 127 447 %0 = load <4 x i8>, ptr %z, align 1 448 %1 = zext <4 x i8> %0 to <4 x i32> 449 store <4 x i32> %1, ptr %y, align 4 450 ret ptr %z 451} 452 453define ptr @ldrbu32_128(ptr %x, ptr %y) { 454; CHECK-LABEL: ldrbu32_128: 455; CHECK: @ %bb.0: @ %entry 456; CHECK-NEXT: adds r0, #128 457; CHECK-NEXT: vldrb.u32 q0, [r0] 458; CHECK-NEXT: vstrw.32 q0, [r1] 459; CHECK-NEXT: bx lr 460entry: 461 %z = getelementptr inbounds i8, ptr %x, i32 128 462 %0 = load <4 x i8>, ptr %z, align 1 463 %1 = zext <4 x i8> %0 to <4 x i32> 464 store <4 x i32> %1, ptr %y, align 4 465 ret ptr %z 466} 467 468define ptr @ldrbu32_m127(ptr %x, ptr %y) { 469; CHECK-LABEL: ldrbu32_m127: 470; CHECK: @ %bb.0: @ %entry 471; CHECK-NEXT: vldrb.u32 q0, [r0, #-127]! 472; CHECK-NEXT: vstrw.32 q0, [r1] 473; CHECK-NEXT: bx lr 474entry: 475 %z = getelementptr inbounds i8, ptr %x, i32 -127 476 %0 = load <4 x i8>, ptr %z, align 1 477 %1 = zext <4 x i8> %0 to <4 x i32> 478 store <4 x i32> %1, ptr %y, align 4 479 ret ptr %z 480} 481 482define ptr @ldrbu32_m128(ptr %x, ptr %y) { 483; CHECK-LABEL: ldrbu32_m128: 484; CHECK: @ %bb.0: @ %entry 485; CHECK-NEXT: subs r0, #128 486; CHECK-NEXT: vldrb.u32 q0, [r0] 487; CHECK-NEXT: vstrw.32 q0, [r1] 488; CHECK-NEXT: bx lr 489entry: 490 %z = getelementptr inbounds i8, ptr %x, i32 -128 491 %0 = load <4 x i8>, ptr %z, align 1 492 %1 = zext <4 x i8> %0 to <4 x i32> 493 store <4 x i32> %1, ptr %y, align 4 494 ret ptr %z 495} 496 497 498define ptr @ldrbs32_4(ptr %x, ptr %y) { 499; CHECK-LABEL: ldrbs32_4: 500; CHECK: @ %bb.0: @ %entry 501; CHECK-NEXT: vldrb.s32 q0, [r0, #4]! 502; CHECK-NEXT: vstrw.32 q0, [r1] 503; CHECK-NEXT: bx lr 504entry: 505 %z = getelementptr inbounds i8, ptr %x, i32 4 506 %0 = load <4 x i8>, ptr %z, align 1 507 %1 = sext <4 x i8> %0 to <4 x i32> 508 store <4 x i32> %1, ptr %y, align 4 509 ret ptr %z 510} 511 512define ptr @ldrbs32_3(ptr %x, ptr %y) { 513; CHECK-LABEL: ldrbs32_3: 514; CHECK: @ %bb.0: @ %entry 515; CHECK-NEXT: vldrb.s32 q0, [r0, #3]! 516; CHECK-NEXT: vstrw.32 q0, [r1] 517; CHECK-NEXT: bx lr 518entry: 519 %z = getelementptr inbounds i8, ptr %x, i32 3 520 %0 = load <4 x i8>, ptr %z, align 1 521 %1 = sext <4 x i8> %0 to <4 x i32> 522 store <4 x i32> %1, ptr %y, align 4 523 ret ptr %z 524} 525 526define ptr @ldrbs32_127(ptr %x, ptr %y) { 527; CHECK-LABEL: ldrbs32_127: 528; CHECK: @ %bb.0: @ %entry 529; CHECK-NEXT: vldrb.s32 q0, [r0, #127]! 530; CHECK-NEXT: vstrw.32 q0, [r1] 531; CHECK-NEXT: bx lr 532entry: 533 %z = getelementptr inbounds i8, ptr %x, i32 127 534 %0 = load <4 x i8>, ptr %z, align 1 535 %1 = sext <4 x i8> %0 to <4 x i32> 536 store <4 x i32> %1, ptr %y, align 4 537 ret ptr %z 538} 539 540define ptr @ldrbs32_128(ptr %x, ptr %y) { 541; CHECK-LABEL: ldrbs32_128: 542; CHECK: @ %bb.0: @ %entry 543; CHECK-NEXT: adds r0, #128 544; CHECK-NEXT: vldrb.s32 q0, [r0] 545; CHECK-NEXT: vstrw.32 q0, [r1] 546; CHECK-NEXT: bx lr 547entry: 548 %z = getelementptr inbounds i8, ptr %x, i32 128 549 %0 = load <4 x i8>, ptr %z, align 1 550 %1 = sext <4 x i8> %0 to <4 x i32> 551 store <4 x i32> %1, ptr %y, align 4 552 ret ptr %z 553} 554 555define ptr @ldrbs32_m127(ptr %x, ptr %y) { 556; CHECK-LABEL: ldrbs32_m127: 557; CHECK: @ %bb.0: @ %entry 558; CHECK-NEXT: vldrb.s32 q0, [r0, #-127]! 559; CHECK-NEXT: vstrw.32 q0, [r1] 560; CHECK-NEXT: bx lr 561entry: 562 %z = getelementptr inbounds i8, ptr %x, i32 -127 563 %0 = load <4 x i8>, ptr %z, align 1 564 %1 = sext <4 x i8> %0 to <4 x i32> 565 store <4 x i32> %1, ptr %y, align 4 566 ret ptr %z 567} 568 569define ptr @ldrbs32_m128(ptr %x, ptr %y) { 570; CHECK-LABEL: ldrbs32_m128: 571; CHECK: @ %bb.0: @ %entry 572; CHECK-NEXT: subs r0, #128 573; CHECK-NEXT: vldrb.s32 q0, [r0] 574; CHECK-NEXT: vstrw.32 q0, [r1] 575; CHECK-NEXT: bx lr 576entry: 577 %z = getelementptr inbounds i8, ptr %x, i32 -128 578 %0 = load <4 x i8>, ptr %z, align 1 579 %1 = sext <4 x i8> %0 to <4 x i32> 580 store <4 x i32> %1, ptr %y, align 4 581 ret ptr %z 582} 583 584 585define ptr @ldrbu16_4(ptr %x, ptr %y) { 586; CHECK-LABEL: ldrbu16_4: 587; CHECK: @ %bb.0: @ %entry 588; CHECK-NEXT: vldrb.u16 q0, [r0, #4]! 589; CHECK-NEXT: vstrh.16 q0, [r1] 590; CHECK-NEXT: bx lr 591entry: 592 %z = getelementptr inbounds i8, ptr %x, i32 4 593 %0 = load <8 x i8>, ptr %z, align 1 594 %1 = zext <8 x i8> %0 to <8 x i16> 595 store <8 x i16> %1, ptr %y, align 2 596 ret ptr %z 597} 598 599define ptr @ldrbu16_3(ptr %x, ptr %y) { 600; CHECK-LABEL: ldrbu16_3: 601; CHECK: @ %bb.0: @ %entry 602; CHECK-NEXT: vldrb.u16 q0, [r0, #3]! 603; CHECK-NEXT: vstrh.16 q0, [r1] 604; CHECK-NEXT: bx lr 605entry: 606 %z = getelementptr inbounds i8, ptr %x, i32 3 607 %0 = load <8 x i8>, ptr %z, align 1 608 %1 = zext <8 x i8> %0 to <8 x i16> 609 store <8 x i16> %1, ptr %y, align 2 610 ret ptr %z 611} 612 613define ptr @ldrbu16_127(ptr %x, ptr %y) { 614; CHECK-LABEL: ldrbu16_127: 615; CHECK: @ %bb.0: @ %entry 616; CHECK-NEXT: vldrb.u16 q0, [r0, #127]! 617; CHECK-NEXT: vstrh.16 q0, [r1] 618; CHECK-NEXT: bx lr 619entry: 620 %z = getelementptr inbounds i8, ptr %x, i32 127 621 %0 = load <8 x i8>, ptr %z, align 1 622 %1 = zext <8 x i8> %0 to <8 x i16> 623 store <8 x i16> %1, ptr %y, align 2 624 ret ptr %z 625} 626 627define ptr @ldrbu16_128(ptr %x, ptr %y) { 628; CHECK-LABEL: ldrbu16_128: 629; CHECK: @ %bb.0: @ %entry 630; CHECK-NEXT: adds r0, #128 631; CHECK-NEXT: vldrb.u16 q0, [r0] 632; CHECK-NEXT: vstrh.16 q0, [r1] 633; CHECK-NEXT: bx lr 634entry: 635 %z = getelementptr inbounds i8, ptr %x, i32 128 636 %0 = load <8 x i8>, ptr %z, align 1 637 %1 = zext <8 x i8> %0 to <8 x i16> 638 store <8 x i16> %1, ptr %y, align 2 639 ret ptr %z 640} 641 642define ptr @ldrbu16_m127(ptr %x, ptr %y) { 643; CHECK-LABEL: ldrbu16_m127: 644; CHECK: @ %bb.0: @ %entry 645; CHECK-NEXT: vldrb.u16 q0, [r0, #-127]! 646; CHECK-NEXT: vstrh.16 q0, [r1] 647; CHECK-NEXT: bx lr 648entry: 649 %z = getelementptr inbounds i8, ptr %x, i32 -127 650 %0 = load <8 x i8>, ptr %z, align 1 651 %1 = zext <8 x i8> %0 to <8 x i16> 652 store <8 x i16> %1, ptr %y, align 2 653 ret ptr %z 654} 655 656define ptr @ldrbu16_m128(ptr %x, ptr %y) { 657; CHECK-LABEL: ldrbu16_m128: 658; CHECK: @ %bb.0: @ %entry 659; CHECK-NEXT: subs r0, #128 660; CHECK-NEXT: vldrb.u16 q0, [r0] 661; CHECK-NEXT: vstrh.16 q0, [r1] 662; CHECK-NEXT: bx lr 663entry: 664 %z = getelementptr inbounds i8, ptr %x, i32 -128 665 %0 = load <8 x i8>, ptr %z, align 1 666 %1 = zext <8 x i8> %0 to <8 x i16> 667 store <8 x i16> %1, ptr %y, align 2 668 ret ptr %z 669} 670 671 672define ptr @ldrbs16_4(ptr %x, ptr %y) { 673; CHECK-LABEL: ldrbs16_4: 674; CHECK: @ %bb.0: @ %entry 675; CHECK-NEXT: vldrb.s16 q0, [r0, #4]! 676; CHECK-NEXT: vstrh.16 q0, [r1] 677; CHECK-NEXT: bx lr 678entry: 679 %z = getelementptr inbounds i8, ptr %x, i32 4 680 %0 = load <8 x i8>, ptr %z, align 1 681 %1 = sext <8 x i8> %0 to <8 x i16> 682 store <8 x i16> %1, ptr %y, align 2 683 ret ptr %z 684} 685 686define ptr @ldrbs16_3(ptr %x, ptr %y) { 687; CHECK-LABEL: ldrbs16_3: 688; CHECK: @ %bb.0: @ %entry 689; CHECK-NEXT: vldrb.s16 q0, [r0, #3]! 690; CHECK-NEXT: vstrh.16 q0, [r1] 691; CHECK-NEXT: bx lr 692entry: 693 %z = getelementptr inbounds i8, ptr %x, i32 3 694 %0 = load <8 x i8>, ptr %z, align 1 695 %1 = sext <8 x i8> %0 to <8 x i16> 696 store <8 x i16> %1, ptr %y, align 2 697 ret ptr %z 698} 699 700define ptr @ldrbs16_127(ptr %x, ptr %y) { 701; CHECK-LABEL: ldrbs16_127: 702; CHECK: @ %bb.0: @ %entry 703; CHECK-NEXT: vldrb.s16 q0, [r0, #127]! 704; CHECK-NEXT: vstrh.16 q0, [r1] 705; CHECK-NEXT: bx lr 706entry: 707 %z = getelementptr inbounds i8, ptr %x, i32 127 708 %0 = load <8 x i8>, ptr %z, align 1 709 %1 = sext <8 x i8> %0 to <8 x i16> 710 store <8 x i16> %1, ptr %y, align 2 711 ret ptr %z 712} 713 714define ptr @ldrbs16_128(ptr %x, ptr %y) { 715; CHECK-LABEL: ldrbs16_128: 716; CHECK: @ %bb.0: @ %entry 717; CHECK-NEXT: adds r0, #128 718; CHECK-NEXT: vldrb.s16 q0, [r0] 719; CHECK-NEXT: vstrh.16 q0, [r1] 720; CHECK-NEXT: bx lr 721entry: 722 %z = getelementptr inbounds i8, ptr %x, i32 128 723 %0 = load <8 x i8>, ptr %z, align 1 724 %1 = sext <8 x i8> %0 to <8 x i16> 725 store <8 x i16> %1, ptr %y, align 2 726 ret ptr %z 727} 728 729define ptr @ldrbs16_m127(ptr %x, ptr %y) { 730; CHECK-LABEL: ldrbs16_m127: 731; CHECK: @ %bb.0: @ %entry 732; CHECK-NEXT: vldrb.s16 q0, [r0, #-127]! 733; CHECK-NEXT: vstrh.16 q0, [r1] 734; CHECK-NEXT: bx lr 735entry: 736 %z = getelementptr inbounds i8, ptr %x, i32 -127 737 %0 = load <8 x i8>, ptr %z, align 1 738 %1 = sext <8 x i8> %0 to <8 x i16> 739 store <8 x i16> %1, ptr %y, align 2 740 ret ptr %z 741} 742 743define ptr @ldrbs16_m128(ptr %x, ptr %y) { 744; CHECK-LABEL: ldrbs16_m128: 745; CHECK: @ %bb.0: @ %entry 746; CHECK-NEXT: subs r0, #128 747; CHECK-NEXT: vldrb.s16 q0, [r0] 748; CHECK-NEXT: vstrh.16 q0, [r1] 749; CHECK-NEXT: bx lr 750entry: 751 %z = getelementptr inbounds i8, ptr %x, i32 -128 752 %0 = load <8 x i8>, ptr %z, align 1 753 %1 = sext <8 x i8> %0 to <8 x i16> 754 store <8 x i16> %1, ptr %y, align 2 755 ret ptr %z 756} 757 758 759define ptr @ldrbu8_4(ptr %x, ptr %y) { 760; CHECK-LABEL: ldrbu8_4: 761; CHECK: @ %bb.0: @ %entry 762; CHECK-NEXT: vldrb.u8 q0, [r0, #4]! 763; CHECK-NEXT: vstrb.8 q0, [r1] 764; CHECK-NEXT: bx lr 765entry: 766 %z = getelementptr inbounds i8, ptr %x, i32 4 767 %0 = load <16 x i8>, ptr %z, align 1 768 store <16 x i8> %0, ptr %y, align 1 769 ret ptr %z 770} 771 772define ptr @ldrbu8_3(ptr %x, ptr %y) { 773; CHECK-LABEL: ldrbu8_3: 774; CHECK: @ %bb.0: @ %entry 775; CHECK-NEXT: vldrb.u8 q0, [r0, #3]! 776; CHECK-NEXT: vstrb.8 q0, [r1] 777; CHECK-NEXT: bx lr 778entry: 779 %z = getelementptr inbounds i8, ptr %x, i32 3 780 %0 = load <16 x i8>, ptr %z, align 1 781 store <16 x i8> %0, ptr %y, align 1 782 ret ptr %z 783} 784 785define ptr @ldrbu8_127(ptr %x, ptr %y) { 786; CHECK-LABEL: ldrbu8_127: 787; CHECK: @ %bb.0: @ %entry 788; CHECK-NEXT: vldrb.u8 q0, [r0, #127]! 789; CHECK-NEXT: vstrb.8 q0, [r1] 790; CHECK-NEXT: bx lr 791entry: 792 %z = getelementptr inbounds i8, ptr %x, i32 127 793 %0 = load <16 x i8>, ptr %z, align 1 794 store <16 x i8> %0, ptr %y, align 1 795 ret ptr %z 796} 797 798define ptr @ldrbu8_128(ptr %x, ptr %y) { 799; CHECK-LABEL: ldrbu8_128: 800; CHECK: @ %bb.0: @ %entry 801; CHECK-NEXT: adds r0, #128 802; CHECK-NEXT: vldrb.u8 q0, [r0] 803; CHECK-NEXT: vstrb.8 q0, [r1] 804; CHECK-NEXT: bx lr 805entry: 806 %z = getelementptr inbounds i8, ptr %x, i32 128 807 %0 = load <16 x i8>, ptr %z, align 1 808 store <16 x i8> %0, ptr %y, align 1 809 ret ptr %z 810} 811 812define ptr @ldrbu8_m127(ptr %x, ptr %y) { 813; CHECK-LABEL: ldrbu8_m127: 814; CHECK: @ %bb.0: @ %entry 815; CHECK-NEXT: vldrb.u8 q0, [r0, #-127]! 816; CHECK-NEXT: vstrb.8 q0, [r1] 817; CHECK-NEXT: bx lr 818entry: 819 %z = getelementptr inbounds i8, ptr %x, i32 -127 820 %0 = load <16 x i8>, ptr %z, align 1 821 store <16 x i8> %0, ptr %y, align 1 822 ret ptr %z 823} 824 825define ptr @ldrbu8_m128(ptr %x, ptr %y) { 826; CHECK-LABEL: ldrbu8_m128: 827; CHECK: @ %bb.0: @ %entry 828; CHECK-NEXT: subs r0, #128 829; CHECK-NEXT: vldrb.u8 q0, [r0] 830; CHECK-NEXT: vstrb.8 q0, [r1] 831; CHECK-NEXT: bx lr 832entry: 833 %z = getelementptr inbounds i8, ptr %x, i32 -128 834 %0 = load <16 x i8>, ptr %z, align 1 835 store <16 x i8> %0, ptr %y, align 1 836 ret ptr %z 837} 838 839 840define ptr @ldrwf32_4(ptr %x, ptr %y) { 841; CHECK-LABEL: ldrwf32_4: 842; CHECK: @ %bb.0: @ %entry 843; CHECK-NEXT: vldrw.u32 q0, [r0, #4]! 844; CHECK-NEXT: vstrw.32 q0, [r1] 845; CHECK-NEXT: bx lr 846entry: 847 %z = getelementptr inbounds i8, ptr %x, i32 4 848 %0 = load <4 x float>, ptr %z, align 4 849 store <4 x float> %0, ptr %y, align 4 850 ret ptr %z 851} 852 853define ptr @ldrwf16_4(ptr %x, ptr %y) { 854; CHECK-LABEL: ldrwf16_4: 855; CHECK: @ %bb.0: @ %entry 856; CHECK-NEXT: vldrh.u16 q0, [r0, #4]! 857; CHECK-NEXT: vstrh.16 q0, [r1] 858; CHECK-NEXT: bx lr 859entry: 860 %z = getelementptr inbounds i8, ptr %x, i32 4 861 %0 = load <8 x half>, ptr %z, align 2 862 store <8 x half> %0, ptr %y, align 2 863 ret ptr %z 864} 865 866define ptr @ldrwi32_align1(ptr %x, ptr %y) { 867; CHECK-LE-LABEL: ldrwi32_align1: 868; CHECK-LE: @ %bb.0: @ %entry 869; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]! 870; CHECK-LE-NEXT: vstrw.32 q0, [r1] 871; CHECK-LE-NEXT: bx lr 872; 873; CHECK-BE-LABEL: ldrwi32_align1: 874; CHECK-BE: @ %bb.0: @ %entry 875; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3] 876; CHECK-BE-NEXT: adds r0, #3 877; CHECK-BE-NEXT: vrev32.8 q0, q0 878; CHECK-BE-NEXT: vstrw.32 q0, [r1] 879; CHECK-BE-NEXT: bx lr 880entry: 881 %z = getelementptr inbounds i8, ptr %x, i32 3 882 %0 = load <4 x i32>, ptr %z, align 1 883 store <4 x i32> %0, ptr %y, align 4 884 ret ptr %z 885} 886 887define ptr @ldrhi16_align1(ptr %x, ptr %y) { 888; CHECK-LE-LABEL: ldrhi16_align1: 889; CHECK-LE: @ %bb.0: @ %entry 890; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]! 891; CHECK-LE-NEXT: vstrh.16 q0, [r1] 892; CHECK-LE-NEXT: bx lr 893; 894; CHECK-BE-LABEL: ldrhi16_align1: 895; CHECK-BE: @ %bb.0: @ %entry 896; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3] 897; CHECK-BE-NEXT: adds r0, #3 898; CHECK-BE-NEXT: vrev16.8 q0, q0 899; CHECK-BE-NEXT: vstrh.16 q0, [r1] 900; CHECK-BE-NEXT: bx lr 901entry: 902 %z = getelementptr inbounds i8, ptr %x, i32 3 903 %0 = load <8 x i16>, ptr %z, align 1 904 store <8 x i16> %0, ptr %y, align 2 905 ret ptr %z 906} 907 908define ptr @ldrhi32_align1(ptr %x, ptr %y) { 909; CHECK-LABEL: ldrhi32_align1: 910; CHECK: @ %bb.0: @ %entry 911; CHECK-NEXT: .pad #8 912; CHECK-NEXT: sub sp, #8 913; CHECK-NEXT: ldr r2, [r0, #3]! 914; CHECK-NEXT: str r2, [sp] 915; CHECK-NEXT: ldr r2, [r0, #4] 916; CHECK-NEXT: str r2, [sp, #4] 917; CHECK-NEXT: mov r2, sp 918; CHECK-NEXT: vldrh.s32 q0, [r2] 919; CHECK-NEXT: vstrw.32 q0, [r1] 920; CHECK-NEXT: add sp, #8 921; CHECK-NEXT: bx lr 922entry: 923 %z = getelementptr inbounds i8, ptr %x, i32 3 924 %0 = load <4 x i16>, ptr %z, align 1 925 %1 = sext <4 x i16> %0 to <4 x i32> 926 store <4 x i32> %1, ptr %y, align 4 927 ret ptr %z 928} 929 930define ptr @ldrf32_align1(ptr %x, ptr %y) { 931; CHECK-LE-LABEL: ldrf32_align1: 932; CHECK-LE: @ %bb.0: @ %entry 933; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]! 934; CHECK-LE-NEXT: vstrw.32 q0, [r1] 935; CHECK-LE-NEXT: bx lr 936; 937; CHECK-BE-LABEL: ldrf32_align1: 938; CHECK-BE: @ %bb.0: @ %entry 939; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3] 940; CHECK-BE-NEXT: adds r0, #3 941; CHECK-BE-NEXT: vrev32.8 q0, q0 942; CHECK-BE-NEXT: vstrw.32 q0, [r1] 943; CHECK-BE-NEXT: bx lr 944entry: 945 %z = getelementptr inbounds i8, ptr %x, i32 3 946 %0 = load <4 x float>, ptr %z, align 1 947 store <4 x float> %0, ptr %y, align 4 948 ret ptr %z 949} 950 951define ptr @ldrf16_align1(ptr %x, ptr %y) { 952; CHECK-LE-LABEL: ldrf16_align1: 953; CHECK-LE: @ %bb.0: @ %entry 954; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]! 955; CHECK-LE-NEXT: vstrh.16 q0, [r1] 956; CHECK-LE-NEXT: bx lr 957; 958; CHECK-BE-LABEL: ldrf16_align1: 959; CHECK-BE: @ %bb.0: @ %entry 960; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3] 961; CHECK-BE-NEXT: adds r0, #3 962; CHECK-BE-NEXT: vrev16.8 q0, q0 963; CHECK-BE-NEXT: vstrh.16 q0, [r1] 964; CHECK-BE-NEXT: bx lr 965entry: 966 %z = getelementptr inbounds i8, ptr %x, i32 3 967 %0 = load <8 x half>, ptr %z, align 1 968 store <8 x half> %0, ptr %y, align 2 969 ret ptr %z 970} 971 972define ptr @ldrh16_align8(ptr %x, ptr %y) { 973; CHECK-LE-LABEL: ldrh16_align8: 974; CHECK-LE: @ %bb.0: @ %entry 975; CHECK-LE-NEXT: vldrw.u32 q0, [r0, #4]! 976; CHECK-LE-NEXT: vstrh.16 q0, [r1] 977; CHECK-LE-NEXT: bx lr 978; 979; CHECK-BE-LABEL: ldrh16_align8: 980; CHECK-BE: @ %bb.0: @ %entry 981; CHECK-BE-NEXT: vldrh.u16 q0, [r0, #4]! 982; CHECK-BE-NEXT: vstrh.16 q0, [r1] 983; CHECK-BE-NEXT: bx lr 984entry: 985 %z = getelementptr inbounds i8, ptr %x, i32 4 986 %0 = load <8 x i16>, ptr %z, align 8 987 store <8 x i16> %0, ptr %y, align 2 988 ret ptr %z 989} 990 991 992 993 994 995define ptr @strw32_4(ptr %y, ptr %x) { 996; CHECK-LE-LABEL: strw32_4: 997; CHECK-LE: @ %bb.0: @ %entry 998; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 999; CHECK-LE-NEXT: vstrb.8 q0, [r0, #4]! 1000; CHECK-LE-NEXT: bx lr 1001; 1002; CHECK-BE-LABEL: strw32_4: 1003; CHECK-BE: @ %bb.0: @ %entry 1004; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1005; CHECK-BE-NEXT: vstrw.32 q0, [r0, #4]! 1006; CHECK-BE-NEXT: bx lr 1007entry: 1008 %z = getelementptr inbounds i8, ptr %y, i32 4 1009 %0 = load <4 x i32>, ptr %x, align 4 1010 store <4 x i32> %0, ptr %z, align 4 1011 ret ptr %z 1012} 1013 1014define ptr @strw32_3(ptr %y, ptr %x) { 1015; CHECK-LE-LABEL: strw32_3: 1016; CHECK-LE: @ %bb.0: @ %entry 1017; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 1018; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]! 1019; CHECK-LE-NEXT: bx lr 1020; 1021; CHECK-BE-LABEL: strw32_3: 1022; CHECK-BE: @ %bb.0: @ %entry 1023; CHECK-BE-NEXT: adds r0, #3 1024; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1025; CHECK-BE-NEXT: vstrw.32 q0, [r0] 1026; CHECK-BE-NEXT: bx lr 1027entry: 1028 %z = getelementptr inbounds i8, ptr %y, i32 3 1029 %0 = load <4 x i32>, ptr %x, align 4 1030 store <4 x i32> %0, ptr %z, align 4 1031 ret ptr %z 1032} 1033 1034define ptr @strw32_m4(ptr %y, ptr %x) { 1035; CHECK-LE-LABEL: strw32_m4: 1036; CHECK-LE: @ %bb.0: @ %entry 1037; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 1038; CHECK-LE-NEXT: vstrb.8 q0, [r0, #-4]! 1039; CHECK-LE-NEXT: bx lr 1040; 1041; CHECK-BE-LABEL: strw32_m4: 1042; CHECK-BE: @ %bb.0: @ %entry 1043; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1044; CHECK-BE-NEXT: vstrw.32 q0, [r0, #-4]! 1045; CHECK-BE-NEXT: bx lr 1046entry: 1047 %z = getelementptr inbounds i8, ptr %y, i32 -4 1048 %0 = load <4 x i32>, ptr %x, align 4 1049 store <4 x i32> %0, ptr %z, align 4 1050 ret ptr %z 1051} 1052 1053define ptr @strw32_508(ptr %y, ptr %x) { 1054; CHECK-LABEL: strw32_508: 1055; CHECK: @ %bb.0: @ %entry 1056; CHECK-NEXT: vldrw.u32 q0, [r1] 1057; CHECK-NEXT: vstrw.32 q0, [r0, #508]! 1058; CHECK-NEXT: bx lr 1059entry: 1060 %z = getelementptr inbounds i8, ptr %y, i32 508 1061 %0 = load <4 x i32>, ptr %x, align 4 1062 store <4 x i32> %0, ptr %z, align 4 1063 ret ptr %z 1064} 1065 1066define ptr @strw32_512(ptr %y, ptr %x) { 1067; CHECK-LABEL: strw32_512: 1068; CHECK: @ %bb.0: @ %entry 1069; CHECK-NEXT: add.w r0, r0, #512 1070; CHECK-NEXT: vldrw.u32 q0, [r1] 1071; CHECK-NEXT: vstrw.32 q0, [r0] 1072; CHECK-NEXT: bx lr 1073entry: 1074 %z = getelementptr inbounds i8, ptr %y, i32 512 1075 %0 = load <4 x i32>, ptr %x, align 4 1076 store <4 x i32> %0, ptr %z, align 4 1077 ret ptr %z 1078} 1079 1080define ptr @strw32_m508(ptr %y, ptr %x) { 1081; CHECK-LABEL: strw32_m508: 1082; CHECK: @ %bb.0: @ %entry 1083; CHECK-NEXT: vldrw.u32 q0, [r1] 1084; CHECK-NEXT: vstrw.32 q0, [r0, #-508]! 1085; CHECK-NEXT: bx lr 1086entry: 1087 %z = getelementptr inbounds i8, ptr %y, i32 -508 1088 %0 = load <4 x i32>, ptr %x, align 4 1089 store <4 x i32> %0, ptr %z, align 4 1090 ret ptr %z 1091} 1092 1093define ptr @strw32_m512(ptr %y, ptr %x) { 1094; CHECK-LABEL: strw32_m512: 1095; CHECK: @ %bb.0: @ %entry 1096; CHECK-NEXT: sub.w r0, r0, #512 1097; CHECK-NEXT: vldrw.u32 q0, [r1] 1098; CHECK-NEXT: vstrw.32 q0, [r0] 1099; CHECK-NEXT: bx lr 1100entry: 1101 %z = getelementptr inbounds i8, ptr %y, i32 -512 1102 %0 = load <4 x i32>, ptr %x, align 4 1103 store <4 x i32> %0, ptr %z, align 4 1104 ret ptr %z 1105} 1106 1107 1108define ptr @strh32_4(ptr %y, ptr %x) { 1109; CHECK-LABEL: strh32_4: 1110; CHECK: @ %bb.0: @ %entry 1111; CHECK-NEXT: vldrh.u32 q0, [r1] 1112; CHECK-NEXT: vstrh.32 q0, [r0, #4]! 1113; CHECK-NEXT: bx lr 1114entry: 1115 %z = getelementptr inbounds i8, ptr %y, i32 4 1116 %0 = load <4 x i16>, ptr %x, align 2 1117 store <4 x i16> %0, ptr %z, align 2 1118 ret ptr %z 1119} 1120 1121define ptr @strh32_3(ptr %y, ptr %x) { 1122; CHECK-LABEL: strh32_3: 1123; CHECK: @ %bb.0: @ %entry 1124; CHECK-NEXT: adds r0, #3 1125; CHECK-NEXT: vldrh.u32 q0, [r1] 1126; CHECK-NEXT: vstrh.32 q0, [r0] 1127; CHECK-NEXT: bx lr 1128entry: 1129 %z = getelementptr inbounds i8, ptr %y, i32 3 1130 %0 = load <4 x i16>, ptr %x, align 2 1131 store <4 x i16> %0, ptr %z, align 2 1132 ret ptr %z 1133} 1134 1135define ptr @strh32_2(ptr %y, ptr %x) { 1136; CHECK-LABEL: strh32_2: 1137; CHECK: @ %bb.0: @ %entry 1138; CHECK-NEXT: vldrh.u32 q0, [r1] 1139; CHECK-NEXT: vstrh.32 q0, [r0, #2]! 1140; CHECK-NEXT: bx lr 1141entry: 1142 %z = getelementptr inbounds i8, ptr %y, i32 2 1143 %0 = load <4 x i16>, ptr %x, align 2 1144 store <4 x i16> %0, ptr %z, align 2 1145 ret ptr %z 1146} 1147 1148define ptr @strh32_254(ptr %y, ptr %x) { 1149; CHECK-LABEL: strh32_254: 1150; CHECK: @ %bb.0: @ %entry 1151; CHECK-NEXT: vldrh.u32 q0, [r1] 1152; CHECK-NEXT: vstrh.32 q0, [r0, #254]! 1153; CHECK-NEXT: bx lr 1154entry: 1155 %z = getelementptr inbounds i8, ptr %y, i32 254 1156 %0 = load <4 x i16>, ptr %x, align 2 1157 store <4 x i16> %0, ptr %z, align 2 1158 ret ptr %z 1159} 1160 1161define ptr @strh32_256(ptr %y, ptr %x) { 1162; CHECK-LABEL: strh32_256: 1163; CHECK: @ %bb.0: @ %entry 1164; CHECK-NEXT: add.w r0, r0, #256 1165; CHECK-NEXT: vldrh.u32 q0, [r1] 1166; CHECK-NEXT: vstrh.32 q0, [r0] 1167; CHECK-NEXT: bx lr 1168entry: 1169 %z = getelementptr inbounds i8, ptr %y, i32 256 1170 %0 = load <4 x i16>, ptr %x, align 2 1171 store <4 x i16> %0, ptr %z, align 2 1172 ret ptr %z 1173} 1174 1175define ptr @strh32_m254(ptr %y, ptr %x) { 1176; CHECK-LABEL: strh32_m254: 1177; CHECK: @ %bb.0: @ %entry 1178; CHECK-NEXT: vldrh.u32 q0, [r1] 1179; CHECK-NEXT: vstrh.32 q0, [r0, #-254]! 1180; CHECK-NEXT: bx lr 1181entry: 1182 %z = getelementptr inbounds i8, ptr %y, i32 -254 1183 %0 = load <4 x i16>, ptr %x, align 2 1184 store <4 x i16> %0, ptr %z, align 2 1185 ret ptr %z 1186} 1187 1188define ptr @strh32_m256(ptr %y, ptr %x) { 1189; CHECK-LABEL: strh32_m256: 1190; CHECK: @ %bb.0: @ %entry 1191; CHECK-NEXT: sub.w r0, r0, #256 1192; CHECK-NEXT: vldrh.u32 q0, [r1] 1193; CHECK-NEXT: vstrh.32 q0, [r0] 1194; CHECK-NEXT: bx lr 1195entry: 1196 %z = getelementptr inbounds i8, ptr %y, i32 -256 1197 %0 = load <4 x i16>, ptr %x, align 2 1198 store <4 x i16> %0, ptr %z, align 2 1199 ret ptr %z 1200} 1201 1202 1203define ptr @strh16_4(ptr %y, ptr %x) { 1204; CHECK-LE-LABEL: strh16_4: 1205; CHECK-LE: @ %bb.0: @ %entry 1206; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1207; CHECK-LE-NEXT: vstrb.8 q0, [r0, #4]! 1208; CHECK-LE-NEXT: bx lr 1209; 1210; CHECK-BE-LABEL: strh16_4: 1211; CHECK-BE: @ %bb.0: @ %entry 1212; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1213; CHECK-BE-NEXT: vstrh.16 q0, [r0, #4]! 1214; CHECK-BE-NEXT: bx lr 1215entry: 1216 %z = getelementptr inbounds i8, ptr %y, i32 4 1217 %0 = load <8 x i16>, ptr %x, align 2 1218 store <8 x i16> %0, ptr %z, align 2 1219 ret ptr %z 1220} 1221 1222define ptr @strh16_3(ptr %y, ptr %x) { 1223; CHECK-LE-LABEL: strh16_3: 1224; CHECK-LE: @ %bb.0: @ %entry 1225; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1226; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]! 1227; CHECK-LE-NEXT: bx lr 1228; 1229; CHECK-BE-LABEL: strh16_3: 1230; CHECK-BE: @ %bb.0: @ %entry 1231; CHECK-BE-NEXT: adds r0, #3 1232; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1233; CHECK-BE-NEXT: vstrh.16 q0, [r0] 1234; CHECK-BE-NEXT: bx lr 1235entry: 1236 %z = getelementptr inbounds i8, ptr %y, i32 3 1237 %0 = load <8 x i16>, ptr %x, align 2 1238 store <8 x i16> %0, ptr %z, align 2 1239 ret ptr %z 1240} 1241 1242define ptr @strh16_2(ptr %y, ptr %x) { 1243; CHECK-LE-LABEL: strh16_2: 1244; CHECK-LE: @ %bb.0: @ %entry 1245; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1246; CHECK-LE-NEXT: vstrb.8 q0, [r0, #2]! 1247; CHECK-LE-NEXT: bx lr 1248; 1249; CHECK-BE-LABEL: strh16_2: 1250; CHECK-BE: @ %bb.0: @ %entry 1251; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1252; CHECK-BE-NEXT: vstrh.16 q0, [r0, #2]! 1253; CHECK-BE-NEXT: bx lr 1254entry: 1255 %z = getelementptr inbounds i8, ptr %y, i32 2 1256 %0 = load <8 x i16>, ptr %x, align 2 1257 store <8 x i16> %0, ptr %z, align 2 1258 ret ptr %z 1259} 1260 1261define ptr @strh16_254(ptr %y, ptr %x) { 1262; CHECK-LABEL: strh16_254: 1263; CHECK: @ %bb.0: @ %entry 1264; CHECK-NEXT: vldrh.u16 q0, [r1] 1265; CHECK-NEXT: vstrh.16 q0, [r0, #254]! 1266; CHECK-NEXT: bx lr 1267entry: 1268 %z = getelementptr inbounds i8, ptr %y, i32 254 1269 %0 = load <8 x i16>, ptr %x, align 2 1270 store <8 x i16> %0, ptr %z, align 2 1271 ret ptr %z 1272} 1273 1274define ptr @strh16_256(ptr %y, ptr %x) { 1275; CHECK-LABEL: strh16_256: 1276; CHECK: @ %bb.0: @ %entry 1277; CHECK-NEXT: add.w r0, r0, #256 1278; CHECK-NEXT: vldrh.u16 q0, [r1] 1279; CHECK-NEXT: vstrh.16 q0, [r0] 1280; CHECK-NEXT: bx lr 1281entry: 1282 %z = getelementptr inbounds i8, ptr %y, i32 256 1283 %0 = load <8 x i16>, ptr %x, align 2 1284 store <8 x i16> %0, ptr %z, align 2 1285 ret ptr %z 1286} 1287 1288define ptr @strh16_m254(ptr %y, ptr %x) { 1289; CHECK-LABEL: strh16_m254: 1290; CHECK: @ %bb.0: @ %entry 1291; CHECK-NEXT: vldrh.u16 q0, [r1] 1292; CHECK-NEXT: vstrh.16 q0, [r0, #-254]! 1293; CHECK-NEXT: bx lr 1294entry: 1295 %z = getelementptr inbounds i8, ptr %y, i32 -254 1296 %0 = load <8 x i16>, ptr %x, align 2 1297 store <8 x i16> %0, ptr %z, align 2 1298 ret ptr %z 1299} 1300 1301define ptr @strh16_m256(ptr %y, ptr %x) { 1302; CHECK-LABEL: strh16_m256: 1303; CHECK: @ %bb.0: @ %entry 1304; CHECK-NEXT: sub.w r0, r0, #256 1305; CHECK-NEXT: vldrh.u16 q0, [r1] 1306; CHECK-NEXT: vstrh.16 q0, [r0] 1307; CHECK-NEXT: bx lr 1308entry: 1309 %z = getelementptr inbounds i8, ptr %y, i32 -256 1310 %0 = load <8 x i16>, ptr %x, align 2 1311 store <8 x i16> %0, ptr %z, align 2 1312 ret ptr %z 1313} 1314 1315 1316define ptr @strb32_4(ptr %y, ptr %x) { 1317; CHECK-LABEL: strb32_4: 1318; CHECK: @ %bb.0: @ %entry 1319; CHECK-NEXT: vldrb.u32 q0, [r1] 1320; CHECK-NEXT: vstrb.32 q0, [r0, #4]! 1321; CHECK-NEXT: bx lr 1322entry: 1323 %z = getelementptr inbounds i8, ptr %y, i32 4 1324 %0 = load <4 x i8>, ptr %x, align 1 1325 store <4 x i8> %0, ptr %z, align 1 1326 ret ptr %z 1327} 1328 1329define ptr @strb32_3(ptr %y, ptr %x) { 1330; CHECK-LABEL: strb32_3: 1331; CHECK: @ %bb.0: @ %entry 1332; CHECK-NEXT: vldrb.u32 q0, [r1] 1333; CHECK-NEXT: vstrb.32 q0, [r0, #3]! 1334; CHECK-NEXT: bx lr 1335entry: 1336 %z = getelementptr inbounds i8, ptr %y, i32 3 1337 %0 = load <4 x i8>, ptr %x, align 1 1338 store <4 x i8> %0, ptr %z, align 1 1339 ret ptr %z 1340} 1341 1342define ptr @strb32_127(ptr %y, ptr %x) { 1343; CHECK-LABEL: strb32_127: 1344; CHECK: @ %bb.0: @ %entry 1345; CHECK-NEXT: vldrb.u32 q0, [r1] 1346; CHECK-NEXT: vstrb.32 q0, [r0, #127]! 1347; CHECK-NEXT: bx lr 1348entry: 1349 %z = getelementptr inbounds i8, ptr %y, i32 127 1350 %0 = load <4 x i8>, ptr %x, align 1 1351 store <4 x i8> %0, ptr %z, align 1 1352 ret ptr %z 1353} 1354 1355define ptr @strb32_128(ptr %y, ptr %x) { 1356; CHECK-LABEL: strb32_128: 1357; CHECK: @ %bb.0: @ %entry 1358; CHECK-NEXT: adds r0, #128 1359; CHECK-NEXT: vldrb.u32 q0, [r1] 1360; CHECK-NEXT: vstrb.32 q0, [r0] 1361; CHECK-NEXT: bx lr 1362entry: 1363 %z = getelementptr inbounds i8, ptr %y, i32 128 1364 %0 = load <4 x i8>, ptr %x, align 1 1365 store <4 x i8> %0, ptr %z, align 1 1366 ret ptr %z 1367} 1368 1369define ptr @strb32_m127(ptr %y, ptr %x) { 1370; CHECK-LABEL: strb32_m127: 1371; CHECK: @ %bb.0: @ %entry 1372; CHECK-NEXT: vldrb.u32 q0, [r1] 1373; CHECK-NEXT: vstrb.32 q0, [r0, #-127]! 1374; CHECK-NEXT: bx lr 1375entry: 1376 %z = getelementptr inbounds i8, ptr %y, i32 -127 1377 %0 = load <4 x i8>, ptr %x, align 1 1378 store <4 x i8> %0, ptr %z, align 1 1379 ret ptr %z 1380} 1381 1382define ptr @strb32_m128(ptr %y, ptr %x) { 1383; CHECK-LABEL: strb32_m128: 1384; CHECK: @ %bb.0: @ %entry 1385; CHECK-NEXT: subs r0, #128 1386; CHECK-NEXT: vldrb.u32 q0, [r1] 1387; CHECK-NEXT: vstrb.32 q0, [r0] 1388; CHECK-NEXT: bx lr 1389entry: 1390 %z = getelementptr inbounds i8, ptr %y, i32 -128 1391 %0 = load <4 x i8>, ptr %x, align 1 1392 store <4 x i8> %0, ptr %z, align 1 1393 ret ptr %z 1394} 1395 1396 1397define ptr @strb16_4(ptr %y, ptr %x) { 1398; CHECK-LABEL: strb16_4: 1399; CHECK: @ %bb.0: @ %entry 1400; CHECK-NEXT: vldrb.u16 q0, [r1] 1401; CHECK-NEXT: vstrb.16 q0, [r0, #4]! 1402; CHECK-NEXT: bx lr 1403entry: 1404 %z = getelementptr inbounds i8, ptr %y, i32 4 1405 %0 = load <8 x i8>, ptr %x, align 1 1406 store <8 x i8> %0, ptr %z, align 1 1407 ret ptr %z 1408} 1409 1410define ptr @strb16_3(ptr %y, ptr %x) { 1411; CHECK-LABEL: strb16_3: 1412; CHECK: @ %bb.0: @ %entry 1413; CHECK-NEXT: vldrb.u16 q0, [r1] 1414; CHECK-NEXT: vstrb.16 q0, [r0, #3]! 1415; CHECK-NEXT: bx lr 1416entry: 1417 %z = getelementptr inbounds i8, ptr %y, i32 3 1418 %0 = load <8 x i8>, ptr %x, align 1 1419 store <8 x i8> %0, ptr %z, align 1 1420 ret ptr %z 1421} 1422 1423define ptr @strb16_127(ptr %y, ptr %x) { 1424; CHECK-LABEL: strb16_127: 1425; CHECK: @ %bb.0: @ %entry 1426; CHECK-NEXT: vldrb.u16 q0, [r1] 1427; CHECK-NEXT: vstrb.16 q0, [r0, #127]! 1428; CHECK-NEXT: bx lr 1429entry: 1430 %z = getelementptr inbounds i8, ptr %y, i32 127 1431 %0 = load <8 x i8>, ptr %x, align 1 1432 store <8 x i8> %0, ptr %z, align 1 1433 ret ptr %z 1434} 1435 1436define ptr @strb16_128(ptr %y, ptr %x) { 1437; CHECK-LABEL: strb16_128: 1438; CHECK: @ %bb.0: @ %entry 1439; CHECK-NEXT: adds r0, #128 1440; CHECK-NEXT: vldrb.u16 q0, [r1] 1441; CHECK-NEXT: vstrb.16 q0, [r0] 1442; CHECK-NEXT: bx lr 1443entry: 1444 %z = getelementptr inbounds i8, ptr %y, i32 128 1445 %0 = load <8 x i8>, ptr %x, align 1 1446 store <8 x i8> %0, ptr %z, align 1 1447 ret ptr %z 1448} 1449 1450define ptr @strb16_m127(ptr %y, ptr %x) { 1451; CHECK-LABEL: strb16_m127: 1452; CHECK: @ %bb.0: @ %entry 1453; CHECK-NEXT: vldrb.u16 q0, [r1] 1454; CHECK-NEXT: vstrb.16 q0, [r0, #-127]! 1455; CHECK-NEXT: bx lr 1456entry: 1457 %z = getelementptr inbounds i8, ptr %y, i32 -127 1458 %0 = load <8 x i8>, ptr %x, align 1 1459 store <8 x i8> %0, ptr %z, align 1 1460 ret ptr %z 1461} 1462 1463define ptr @strb16_m128(ptr %y, ptr %x) { 1464; CHECK-LABEL: strb16_m128: 1465; CHECK: @ %bb.0: @ %entry 1466; CHECK-NEXT: subs r0, #128 1467; CHECK-NEXT: vldrb.u16 q0, [r1] 1468; CHECK-NEXT: vstrb.16 q0, [r0] 1469; CHECK-NEXT: bx lr 1470entry: 1471 %z = getelementptr inbounds i8, ptr %y, i32 -128 1472 %0 = load <8 x i8>, ptr %x, align 1 1473 store <8 x i8> %0, ptr %z, align 1 1474 ret ptr %z 1475} 1476 1477 1478define ptr @strb8_4(ptr %y, ptr %x) { 1479; CHECK-LABEL: strb8_4: 1480; CHECK: @ %bb.0: @ %entry 1481; CHECK-NEXT: vldrb.u8 q0, [r1] 1482; CHECK-NEXT: vstrb.8 q0, [r0, #4]! 1483; CHECK-NEXT: bx lr 1484entry: 1485 %z = getelementptr inbounds i8, ptr %y, i32 4 1486 %0 = load <16 x i8>, ptr %x, align 1 1487 store <16 x i8> %0, ptr %z, align 1 1488 ret ptr %z 1489} 1490 1491define ptr @strb8_3(ptr %y, ptr %x) { 1492; CHECK-LABEL: strb8_3: 1493; CHECK: @ %bb.0: @ %entry 1494; CHECK-NEXT: vldrb.u8 q0, [r1] 1495; CHECK-NEXT: vstrb.8 q0, [r0, #3]! 1496; CHECK-NEXT: bx lr 1497entry: 1498 %z = getelementptr inbounds i8, ptr %y, i32 3 1499 %0 = load <16 x i8>, ptr %x, align 1 1500 store <16 x i8> %0, ptr %z, align 1 1501 ret ptr %z 1502} 1503 1504define ptr @strb8_127(ptr %y, ptr %x) { 1505; CHECK-LABEL: strb8_127: 1506; CHECK: @ %bb.0: @ %entry 1507; CHECK-NEXT: vldrb.u8 q0, [r1] 1508; CHECK-NEXT: vstrb.8 q0, [r0, #127]! 1509; CHECK-NEXT: bx lr 1510entry: 1511 %z = getelementptr inbounds i8, ptr %y, i32 127 1512 %0 = load <16 x i8>, ptr %x, align 1 1513 store <16 x i8> %0, ptr %z, align 1 1514 ret ptr %z 1515} 1516 1517define ptr @strb8_128(ptr %y, ptr %x) { 1518; CHECK-LABEL: strb8_128: 1519; CHECK: @ %bb.0: @ %entry 1520; CHECK-NEXT: adds r0, #128 1521; CHECK-NEXT: vldrb.u8 q0, [r1] 1522; CHECK-NEXT: vstrb.8 q0, [r0] 1523; CHECK-NEXT: bx lr 1524entry: 1525 %z = getelementptr inbounds i8, ptr %y, i32 128 1526 %0 = load <16 x i8>, ptr %x, align 1 1527 store <16 x i8> %0, ptr %z, align 1 1528 ret ptr %z 1529} 1530 1531define ptr @strb8_m127(ptr %y, ptr %x) { 1532; CHECK-LABEL: strb8_m127: 1533; CHECK: @ %bb.0: @ %entry 1534; CHECK-NEXT: vldrb.u8 q0, [r1] 1535; CHECK-NEXT: vstrb.8 q0, [r0, #-127]! 1536; CHECK-NEXT: bx lr 1537entry: 1538 %z = getelementptr inbounds i8, ptr %y, i32 -127 1539 %0 = load <16 x i8>, ptr %x, align 1 1540 store <16 x i8> %0, ptr %z, align 1 1541 ret ptr %z 1542} 1543 1544define ptr @strb8_m128(ptr %y, ptr %x) { 1545; CHECK-LABEL: strb8_m128: 1546; CHECK: @ %bb.0: @ %entry 1547; CHECK-NEXT: subs r0, #128 1548; CHECK-NEXT: vldrb.u8 q0, [r1] 1549; CHECK-NEXT: vstrb.8 q0, [r0] 1550; CHECK-NEXT: bx lr 1551entry: 1552 %z = getelementptr inbounds i8, ptr %y, i32 -128 1553 %0 = load <16 x i8>, ptr %x, align 1 1554 store <16 x i8> %0, ptr %z, align 1 1555 ret ptr %z 1556} 1557 1558 1559define ptr @strf32_4(ptr %y, ptr %x) { 1560; CHECK-LE-LABEL: strf32_4: 1561; CHECK-LE: @ %bb.0: @ %entry 1562; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 1563; CHECK-LE-NEXT: vstrb.8 q0, [r0, #4]! 1564; CHECK-LE-NEXT: bx lr 1565; 1566; CHECK-BE-LABEL: strf32_4: 1567; CHECK-BE: @ %bb.0: @ %entry 1568; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1569; CHECK-BE-NEXT: vstrw.32 q0, [r0, #4]! 1570; CHECK-BE-NEXT: bx lr 1571entry: 1572 %z = getelementptr inbounds i8, ptr %y, i32 4 1573 %0 = load <4 x float>, ptr %x, align 4 1574 store <4 x float> %0, ptr %z, align 4 1575 ret ptr %z 1576} 1577 1578define ptr @strf16_4(ptr %y, ptr %x) { 1579; CHECK-LE-LABEL: strf16_4: 1580; CHECK-LE: @ %bb.0: @ %entry 1581; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1582; CHECK-LE-NEXT: vstrb.8 q0, [r0, #4]! 1583; CHECK-LE-NEXT: bx lr 1584; 1585; CHECK-BE-LABEL: strf16_4: 1586; CHECK-BE: @ %bb.0: @ %entry 1587; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1588; CHECK-BE-NEXT: vstrh.16 q0, [r0, #4]! 1589; CHECK-BE-NEXT: bx lr 1590entry: 1591 %z = getelementptr inbounds i8, ptr %y, i32 4 1592 %0 = load <8 x half>, ptr %x, align 2 1593 store <8 x half> %0, ptr %z, align 2 1594 ret ptr %z 1595} 1596 1597define ptr @strwi32_align1(ptr %y, ptr %x) { 1598; CHECK-LE-LABEL: strwi32_align1: 1599; CHECK-LE: @ %bb.0: @ %entry 1600; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 1601; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]! 1602; CHECK-LE-NEXT: bx lr 1603; 1604; CHECK-BE-LABEL: strwi32_align1: 1605; CHECK-BE: @ %bb.0: @ %entry 1606; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1607; CHECK-BE-NEXT: vrev32.8 q0, q0 1608; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3] 1609; CHECK-BE-NEXT: adds r0, #3 1610; CHECK-BE-NEXT: bx lr 1611entry: 1612 %z = getelementptr inbounds i8, ptr %y, i32 3 1613 %0 = load <4 x i32>, ptr %x, align 4 1614 store <4 x i32> %0, ptr %z, align 1 1615 ret ptr %z 1616} 1617 1618define ptr @strhi16_align1(ptr %y, ptr %x) { 1619; CHECK-LE-LABEL: strhi16_align1: 1620; CHECK-LE: @ %bb.0: @ %entry 1621; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1622; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]! 1623; CHECK-LE-NEXT: bx lr 1624; 1625; CHECK-BE-LABEL: strhi16_align1: 1626; CHECK-BE: @ %bb.0: @ %entry 1627; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1628; CHECK-BE-NEXT: vrev16.8 q0, q0 1629; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3] 1630; CHECK-BE-NEXT: adds r0, #3 1631; CHECK-BE-NEXT: bx lr 1632entry: 1633 %z = getelementptr inbounds i8, ptr %y, i32 3 1634 %0 = load <8 x i16>, ptr %x, align 2 1635 store <8 x i16> %0, ptr %z, align 1 1636 ret ptr %z 1637} 1638 1639define ptr @strhi32_align1(ptr %y, ptr %x) { 1640; CHECK-LABEL: strhi32_align1: 1641; CHECK: @ %bb.0: @ %entry 1642; CHECK-NEXT: .pad #8 1643; CHECK-NEXT: sub sp, #8 1644; CHECK-NEXT: vldrw.u32 q0, [r1] 1645; CHECK-NEXT: mov r1, sp 1646; CHECK-NEXT: vstrh.32 q0, [r1] 1647; CHECK-NEXT: ldrd r1, r2, [sp] 1648; CHECK-NEXT: str r1, [r0, #3]! 1649; CHECK-NEXT: str r2, [r0, #4] 1650; CHECK-NEXT: add sp, #8 1651; CHECK-NEXT: bx lr 1652entry: 1653 %z = getelementptr inbounds i8, ptr %y, i32 3 1654 %0 = load <4 x i32>, ptr %x, align 4 1655 %1 = trunc <4 x i32> %0 to <4 x i16> 1656 store <4 x i16> %1, ptr %z, align 1 1657 ret ptr %z 1658} 1659 1660define ptr @strf32_align1(ptr %y, ptr %x) { 1661; CHECK-LE-LABEL: strf32_align1: 1662; CHECK-LE: @ %bb.0: @ %entry 1663; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 1664; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]! 1665; CHECK-LE-NEXT: bx lr 1666; 1667; CHECK-BE-LABEL: strf32_align1: 1668; CHECK-BE: @ %bb.0: @ %entry 1669; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1670; CHECK-BE-NEXT: vrev32.8 q0, q0 1671; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3] 1672; CHECK-BE-NEXT: adds r0, #3 1673; CHECK-BE-NEXT: bx lr 1674entry: 1675 %z = getelementptr inbounds i8, ptr %y, i32 3 1676 %0 = load <4 x float>, ptr %x, align 4 1677 store <4 x float> %0, ptr %z, align 1 1678 ret ptr %z 1679} 1680 1681define ptr @strf16_align1(ptr %y, ptr %x) { 1682; CHECK-LE-LABEL: strf16_align1: 1683; CHECK-LE: @ %bb.0: @ %entry 1684; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1685; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]! 1686; CHECK-LE-NEXT: bx lr 1687; 1688; CHECK-BE-LABEL: strf16_align1: 1689; CHECK-BE: @ %bb.0: @ %entry 1690; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1691; CHECK-BE-NEXT: vrev16.8 q0, q0 1692; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3] 1693; CHECK-BE-NEXT: adds r0, #3 1694; CHECK-BE-NEXT: bx lr 1695entry: 1696 %z = getelementptr inbounds i8, ptr %y, i32 3 1697 %0 = load <8 x half>, ptr %x, align 2 1698 store <8 x half> %0, ptr %z, align 1 1699 ret ptr %z 1700} 1701 1702define ptr @strf16_align8(ptr %y, ptr %x) { 1703; CHECK-LE-LABEL: strf16_align8: 1704; CHECK-LE: @ %bb.0: @ %entry 1705; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1706; CHECK-LE-NEXT: vstrb.8 q0, [r0, #16]! 1707; CHECK-LE-NEXT: bx lr 1708; 1709; CHECK-BE-LABEL: strf16_align8: 1710; CHECK-BE: @ %bb.0: @ %entry 1711; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1712; CHECK-BE-NEXT: vstrh.16 q0, [r0, #16]! 1713; CHECK-BE-NEXT: bx lr 1714entry: 1715 %z = getelementptr inbounds i8, ptr %y, i32 16 1716 %0 = load <8 x i16>, ptr %x, align 2 1717 store <8 x i16> %0, ptr %z, align 8 1718 ret ptr %z 1719} 1720