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 %x, 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: vldrw.u32 q0, [r0] 28; CHECK-BE-NEXT: adds r0, #3 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 %x, 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 %x, 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 %x, 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: vldrw.u32 q0, [r0] 68; CHECK-NEXT: add.w r0, r0, #512 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 %x, 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 %x, 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: vldrw.u32 q0, [r0] 95; CHECK-NEXT: sub.w r0, r0, #512 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 %x, 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 %x, 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: vldrh.u32 q0, [r0] 124; CHECK-NEXT: adds r0, #3 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 %x, 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 %x, 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 %x, 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: vldrh.u32 q0, [r0] 167; CHECK-NEXT: add.w r0, r0, #256 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 %x, 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 %x, 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: vldrh.u32 q0, [r0] 196; CHECK-NEXT: sub.w r0, r0, #256 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 %x, 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 %x, 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: vldrh.s32 q0, [r0] 226; CHECK-NEXT: adds r0, #3 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 %x, 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 %x, 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 %x, 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: vldrh.s32 q0, [r0] 269; CHECK-NEXT: add.w r0, r0, #256 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 %x, 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 %x, 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: vldrh.s32 q0, [r0] 298; CHECK-NEXT: sub.w r0, r0, #256 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 %x, 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 %x, 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: vldrh.u16 q0, [r0] 333; CHECK-BE-NEXT: adds r0, #3 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 %x, 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 %x, 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 %x, 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: vldrh.u16 q0, [r0] 373; CHECK-NEXT: add.w r0, r0, #256 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 %x, 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 %x, 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: vldrh.u16 q0, [r0] 400; CHECK-NEXT: sub.w r0, r0, #256 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 %x, 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 %x, 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 %x, 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 %x, 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: vldrb.u32 q0, [r0] 457; CHECK-NEXT: adds r0, #128 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 %x, 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 %x, 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: vldrb.u32 q0, [r0] 486; CHECK-NEXT: subs r0, #128 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 %x, 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 %x, 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 %x, 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 %x, 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: vldrb.s32 q0, [r0] 544; CHECK-NEXT: adds r0, #128 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 %x, 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 %x, 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: vldrb.s32 q0, [r0] 573; CHECK-NEXT: subs r0, #128 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 %x, 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 %x, 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 %x, 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 %x, 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: vldrb.u16 q0, [r0] 631; CHECK-NEXT: adds r0, #128 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 %x, 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 %x, 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: vldrb.u16 q0, [r0] 660; CHECK-NEXT: subs r0, #128 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 %x, 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 %x, 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 %x, 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 %x, 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: vldrb.s16 q0, [r0] 718; CHECK-NEXT: adds r0, #128 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 %x, 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 %x, 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: vldrb.s16 q0, [r0] 747; CHECK-NEXT: subs r0, #128 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 %x, 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 %x, 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 %x, 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 %x, 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: vldrb.u8 q0, [r0] 802; CHECK-NEXT: adds r0, #128 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 %x, 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 %x, 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: vldrb.u8 q0, [r0] 829; CHECK-NEXT: subs r0, #128 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 %x, 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 %x, 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 %x, 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: vrev32.8 q0, q0 877; CHECK-BE-NEXT: vstrw.32 q0, [r1] 878; CHECK-BE-NEXT: bx lr 879entry: 880 %z = getelementptr inbounds i8, ptr %x, i32 3 881 %0 = load <4 x i32>, ptr %x, align 1 882 store <4 x i32> %0, ptr %y, align 4 883 ret ptr %z 884} 885 886define ptr @ldrhi16_align1(ptr %x, ptr %y) { 887; CHECK-LE-LABEL: ldrhi16_align1: 888; CHECK-LE: @ %bb.0: @ %entry 889; CHECK-LE-NEXT: vldrb.u8 q0, [r0], #3 890; CHECK-LE-NEXT: vstrh.16 q0, [r1] 891; CHECK-LE-NEXT: bx lr 892; 893; CHECK-BE-LABEL: ldrhi16_align1: 894; CHECK-BE: @ %bb.0: @ %entry 895; CHECK-BE-NEXT: vldrb.u8 q0, [r0], #3 896; CHECK-BE-NEXT: vrev16.8 q0, q0 897; CHECK-BE-NEXT: vstrh.16 q0, [r1] 898; CHECK-BE-NEXT: bx lr 899entry: 900 %z = getelementptr inbounds i8, ptr %x, i32 3 901 %0 = load <8 x i16>, ptr %x, align 1 902 store <8 x i16> %0, ptr %y, align 2 903 ret ptr %z 904} 905 906define ptr @ldrhi32_align1(ptr %x, ptr %y) { 907; CHECK-LABEL: ldrhi32_align1: 908; CHECK: @ %bb.0: @ %entry 909; CHECK-NEXT: .pad #8 910; CHECK-NEXT: sub sp, #8 911; CHECK-NEXT: ldr r3, [r0, #4] 912; CHECK-NEXT: ldr r2, [r0] 913; CHECK-NEXT: adds r0, #3 914; CHECK-NEXT: strd r2, r3, [sp] 915; CHECK-NEXT: mov r2, sp 916; CHECK-NEXT: vldrh.s32 q0, [r2] 917; CHECK-NEXT: vstrw.32 q0, [r1] 918; CHECK-NEXT: add sp, #8 919; CHECK-NEXT: bx lr 920entry: 921 %z = getelementptr inbounds i8, ptr %x, i32 3 922 %0 = load <4 x i16>, ptr %x, align 1 923 %1 = sext <4 x i16> %0 to <4 x i32> 924 store <4 x i32> %1, ptr %y, align 4 925 ret ptr %z 926} 927 928define ptr @ldrf32_align1(ptr %x, ptr %y) { 929; CHECK-LE-LABEL: ldrf32_align1: 930; CHECK-LE: @ %bb.0: @ %entry 931; CHECK-LE-NEXT: vldrb.u8 q0, [r0], #3 932; CHECK-LE-NEXT: vstrw.32 q0, [r1] 933; CHECK-LE-NEXT: bx lr 934; 935; CHECK-BE-LABEL: ldrf32_align1: 936; CHECK-BE: @ %bb.0: @ %entry 937; CHECK-BE-NEXT: vldrb.u8 q0, [r0], #3 938; CHECK-BE-NEXT: vrev32.8 q0, q0 939; CHECK-BE-NEXT: vstrw.32 q0, [r1] 940; CHECK-BE-NEXT: bx lr 941entry: 942 %z = getelementptr inbounds i8, ptr %x, i32 3 943 %0 = load <4 x float>, ptr %x, align 1 944 store <4 x float> %0, ptr %y, align 4 945 ret ptr %z 946} 947 948define ptr @ldrf16_align1(ptr %x, ptr %y) { 949; CHECK-LE-LABEL: ldrf16_align1: 950; CHECK-LE: @ %bb.0: @ %entry 951; CHECK-LE-NEXT: vldrb.u8 q0, [r0], #3 952; CHECK-LE-NEXT: vstrh.16 q0, [r1] 953; CHECK-LE-NEXT: bx lr 954; 955; CHECK-BE-LABEL: ldrf16_align1: 956; CHECK-BE: @ %bb.0: @ %entry 957; CHECK-BE-NEXT: vldrb.u8 q0, [r0], #3 958; CHECK-BE-NEXT: vrev16.8 q0, q0 959; CHECK-BE-NEXT: vstrh.16 q0, [r1] 960; CHECK-BE-NEXT: bx lr 961entry: 962 %z = getelementptr inbounds i8, ptr %x, i32 3 963 %0 = load <8 x half>, ptr %x, align 1 964 store <8 x half> %0, ptr %y, align 2 965 ret ptr %z 966} 967 968define ptr @ldrh16_align8(ptr %x, ptr %y) { 969; CHECK-LE-LABEL: ldrh16_align8: 970; CHECK-LE: @ %bb.0: @ %entry 971; CHECK-LE-NEXT: vldrw.u32 q0, [r0], #4 972; CHECK-LE-NEXT: vstrh.16 q0, [r1] 973; CHECK-LE-NEXT: bx lr 974; 975; CHECK-BE-LABEL: ldrh16_align8: 976; CHECK-BE: @ %bb.0: @ %entry 977; CHECK-BE-NEXT: vldrh.u16 q0, [r0], #4 978; CHECK-BE-NEXT: vstrh.16 q0, [r1] 979; CHECK-BE-NEXT: bx lr 980entry: 981 %z = getelementptr inbounds i8, ptr %x, i32 4 982 %0 = load <8 x i16>, ptr %x, align 8 983 store <8 x i16> %0, ptr %y, align 2 984 ret ptr %z 985} 986 987 988 989 990 991define ptr @strw32_4(ptr %y, ptr %x) { 992; CHECK-LE-LABEL: strw32_4: 993; CHECK-LE: @ %bb.0: @ %entry 994; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 995; CHECK-LE-NEXT: vstrb.8 q0, [r0], #4 996; CHECK-LE-NEXT: bx lr 997; 998; CHECK-BE-LABEL: strw32_4: 999; CHECK-BE: @ %bb.0: @ %entry 1000; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1001; CHECK-BE-NEXT: vstrw.32 q0, [r0], #4 1002; CHECK-BE-NEXT: bx lr 1003entry: 1004 %z = getelementptr inbounds i8, ptr %y, i32 4 1005 %0 = load <4 x i32>, ptr %x, align 4 1006 store <4 x i32> %0, ptr %y, align 4 1007 ret ptr %z 1008} 1009 1010define ptr @strw32_3(ptr %y, ptr %x) { 1011; CHECK-LE-LABEL: strw32_3: 1012; CHECK-LE: @ %bb.0: @ %entry 1013; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 1014; CHECK-LE-NEXT: vstrb.8 q0, [r0], #3 1015; CHECK-LE-NEXT: bx lr 1016; 1017; CHECK-BE-LABEL: strw32_3: 1018; CHECK-BE: @ %bb.0: @ %entry 1019; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1020; CHECK-BE-NEXT: vstrw.32 q0, [r0] 1021; CHECK-BE-NEXT: adds r0, #3 1022; CHECK-BE-NEXT: bx lr 1023entry: 1024 %z = getelementptr inbounds i8, ptr %y, i32 3 1025 %0 = load <4 x i32>, ptr %x, align 4 1026 store <4 x i32> %0, ptr %y, align 4 1027 ret ptr %z 1028} 1029 1030define ptr @strw32_m4(ptr %y, ptr %x) { 1031; CHECK-LE-LABEL: strw32_m4: 1032; CHECK-LE: @ %bb.0: @ %entry 1033; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 1034; CHECK-LE-NEXT: vstrb.8 q0, [r0], #-4 1035; CHECK-LE-NEXT: bx lr 1036; 1037; CHECK-BE-LABEL: strw32_m4: 1038; CHECK-BE: @ %bb.0: @ %entry 1039; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1040; CHECK-BE-NEXT: vstrw.32 q0, [r0], #-4 1041; CHECK-BE-NEXT: bx lr 1042entry: 1043 %z = getelementptr inbounds i8, ptr %y, i32 -4 1044 %0 = load <4 x i32>, ptr %x, align 4 1045 store <4 x i32> %0, ptr %y, align 4 1046 ret ptr %z 1047} 1048 1049define ptr @strw32_508(ptr %y, ptr %x) { 1050; CHECK-LABEL: strw32_508: 1051; CHECK: @ %bb.0: @ %entry 1052; CHECK-NEXT: vldrw.u32 q0, [r1] 1053; CHECK-NEXT: vstrw.32 q0, [r0], #508 1054; CHECK-NEXT: bx lr 1055entry: 1056 %z = getelementptr inbounds i8, ptr %y, i32 508 1057 %0 = load <4 x i32>, ptr %x, align 4 1058 store <4 x i32> %0, ptr %y, align 4 1059 ret ptr %z 1060} 1061 1062define ptr @strw32_512(ptr %y, ptr %x) { 1063; CHECK-LABEL: strw32_512: 1064; CHECK: @ %bb.0: @ %entry 1065; CHECK-NEXT: vldrw.u32 q0, [r1] 1066; CHECK-NEXT: vstrw.32 q0, [r0] 1067; CHECK-NEXT: add.w r0, r0, #512 1068; CHECK-NEXT: bx lr 1069entry: 1070 %z = getelementptr inbounds i8, ptr %y, i32 512 1071 %0 = load <4 x i32>, ptr %x, align 4 1072 store <4 x i32> %0, ptr %y, align 4 1073 ret ptr %z 1074} 1075 1076define ptr @strw32_m508(ptr %y, ptr %x) { 1077; CHECK-LABEL: strw32_m508: 1078; CHECK: @ %bb.0: @ %entry 1079; CHECK-NEXT: vldrw.u32 q0, [r1] 1080; CHECK-NEXT: vstrw.32 q0, [r0], #-508 1081; CHECK-NEXT: bx lr 1082entry: 1083 %z = getelementptr inbounds i8, ptr %y, i32 -508 1084 %0 = load <4 x i32>, ptr %x, align 4 1085 store <4 x i32> %0, ptr %y, align 4 1086 ret ptr %z 1087} 1088 1089define ptr @strw32_m512(ptr %y, ptr %x) { 1090; CHECK-LABEL: strw32_m512: 1091; CHECK: @ %bb.0: @ %entry 1092; CHECK-NEXT: vldrw.u32 q0, [r1] 1093; CHECK-NEXT: vstrw.32 q0, [r0] 1094; CHECK-NEXT: sub.w r0, r0, #512 1095; CHECK-NEXT: bx lr 1096entry: 1097 %z = getelementptr inbounds i8, ptr %y, i32 -512 1098 %0 = load <4 x i32>, ptr %x, align 4 1099 store <4 x i32> %0, ptr %y, align 4 1100 ret ptr %z 1101} 1102 1103 1104define ptr @strh32_4(ptr %y, ptr %x) { 1105; CHECK-LABEL: strh32_4: 1106; CHECK: @ %bb.0: @ %entry 1107; CHECK-NEXT: vldrh.u32 q0, [r1] 1108; CHECK-NEXT: vstrh.32 q0, [r0], #4 1109; CHECK-NEXT: bx lr 1110entry: 1111 %z = getelementptr inbounds i8, ptr %y, i32 4 1112 %0 = load <4 x i16>, ptr %x, align 2 1113 store <4 x i16> %0, ptr %y, align 2 1114 ret ptr %z 1115} 1116 1117define ptr @strh32_3(ptr %y, ptr %x) { 1118; CHECK-LABEL: strh32_3: 1119; CHECK: @ %bb.0: @ %entry 1120; CHECK-NEXT: vldrh.u32 q0, [r1] 1121; CHECK-NEXT: vstrh.32 q0, [r0] 1122; CHECK-NEXT: adds r0, #3 1123; CHECK-NEXT: bx lr 1124entry: 1125 %z = getelementptr inbounds i8, ptr %y, i32 3 1126 %0 = load <4 x i16>, ptr %x, align 2 1127 store <4 x i16> %0, ptr %y, align 2 1128 ret ptr %z 1129} 1130 1131define ptr @strh32_2(ptr %y, ptr %x) { 1132; CHECK-LABEL: strh32_2: 1133; CHECK: @ %bb.0: @ %entry 1134; CHECK-NEXT: vldrh.u32 q0, [r1] 1135; CHECK-NEXT: vstrh.32 q0, [r0], #2 1136; CHECK-NEXT: bx lr 1137entry: 1138 %z = getelementptr inbounds i8, ptr %y, i32 2 1139 %0 = load <4 x i16>, ptr %x, align 2 1140 store <4 x i16> %0, ptr %y, align 2 1141 ret ptr %z 1142} 1143 1144define ptr @strh32_254(ptr %y, ptr %x) { 1145; CHECK-LABEL: strh32_254: 1146; CHECK: @ %bb.0: @ %entry 1147; CHECK-NEXT: vldrh.u32 q0, [r1] 1148; CHECK-NEXT: vstrh.32 q0, [r0], #254 1149; CHECK-NEXT: bx lr 1150entry: 1151 %z = getelementptr inbounds i8, ptr %y, i32 254 1152 %0 = load <4 x i16>, ptr %x, align 2 1153 store <4 x i16> %0, ptr %y, align 2 1154 ret ptr %z 1155} 1156 1157define ptr @strh32_256(ptr %y, ptr %x) { 1158; CHECK-LABEL: strh32_256: 1159; CHECK: @ %bb.0: @ %entry 1160; CHECK-NEXT: vldrh.u32 q0, [r1] 1161; CHECK-NEXT: vstrh.32 q0, [r0] 1162; CHECK-NEXT: add.w r0, r0, #256 1163; CHECK-NEXT: bx lr 1164entry: 1165 %z = getelementptr inbounds i8, ptr %y, i32 256 1166 %0 = load <4 x i16>, ptr %x, align 2 1167 store <4 x i16> %0, ptr %y, align 2 1168 ret ptr %z 1169} 1170 1171define ptr @strh32_m254(ptr %y, ptr %x) { 1172; CHECK-LABEL: strh32_m254: 1173; CHECK: @ %bb.0: @ %entry 1174; CHECK-NEXT: vldrh.u32 q0, [r1] 1175; CHECK-NEXT: vstrh.32 q0, [r0], #-254 1176; CHECK-NEXT: bx lr 1177entry: 1178 %z = getelementptr inbounds i8, ptr %y, i32 -254 1179 %0 = load <4 x i16>, ptr %x, align 2 1180 store <4 x i16> %0, ptr %y, align 2 1181 ret ptr %z 1182} 1183 1184define ptr @strh32_m256(ptr %y, ptr %x) { 1185; CHECK-LABEL: strh32_m256: 1186; CHECK: @ %bb.0: @ %entry 1187; CHECK-NEXT: vldrh.u32 q0, [r1] 1188; CHECK-NEXT: vstrh.32 q0, [r0] 1189; CHECK-NEXT: sub.w r0, r0, #256 1190; CHECK-NEXT: bx lr 1191entry: 1192 %z = getelementptr inbounds i8, ptr %y, i32 -256 1193 %0 = load <4 x i16>, ptr %x, align 2 1194 store <4 x i16> %0, ptr %y, align 2 1195 ret ptr %z 1196} 1197 1198 1199define ptr @strh16_4(ptr %y, ptr %x) { 1200; CHECK-LE-LABEL: strh16_4: 1201; CHECK-LE: @ %bb.0: @ %entry 1202; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1203; CHECK-LE-NEXT: vstrb.8 q0, [r0], #4 1204; CHECK-LE-NEXT: bx lr 1205; 1206; CHECK-BE-LABEL: strh16_4: 1207; CHECK-BE: @ %bb.0: @ %entry 1208; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1209; CHECK-BE-NEXT: vstrh.16 q0, [r0], #4 1210; CHECK-BE-NEXT: bx lr 1211entry: 1212 %z = getelementptr inbounds i8, ptr %y, i32 4 1213 %0 = load <8 x i16>, ptr %x, align 2 1214 store <8 x i16> %0, ptr %y, align 2 1215 ret ptr %z 1216} 1217 1218define ptr @strh16_3(ptr %y, ptr %x) { 1219; CHECK-LE-LABEL: strh16_3: 1220; CHECK-LE: @ %bb.0: @ %entry 1221; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1222; CHECK-LE-NEXT: vstrb.8 q0, [r0], #3 1223; CHECK-LE-NEXT: bx lr 1224; 1225; CHECK-BE-LABEL: strh16_3: 1226; CHECK-BE: @ %bb.0: @ %entry 1227; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1228; CHECK-BE-NEXT: vstrh.16 q0, [r0] 1229; CHECK-BE-NEXT: adds r0, #3 1230; CHECK-BE-NEXT: bx lr 1231entry: 1232 %z = getelementptr inbounds i8, ptr %y, i32 3 1233 %0 = load <8 x i16>, ptr %x, align 2 1234 store <8 x i16> %0, ptr %y, align 2 1235 ret ptr %z 1236} 1237 1238define ptr @strh16_2(ptr %y, ptr %x) { 1239; CHECK-LE-LABEL: strh16_2: 1240; CHECK-LE: @ %bb.0: @ %entry 1241; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1242; CHECK-LE-NEXT: vstrb.8 q0, [r0], #2 1243; CHECK-LE-NEXT: bx lr 1244; 1245; CHECK-BE-LABEL: strh16_2: 1246; CHECK-BE: @ %bb.0: @ %entry 1247; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1248; CHECK-BE-NEXT: vstrh.16 q0, [r0], #2 1249; CHECK-BE-NEXT: bx lr 1250entry: 1251 %z = getelementptr inbounds i8, ptr %y, i32 2 1252 %0 = load <8 x i16>, ptr %x, align 2 1253 store <8 x i16> %0, ptr %y, align 2 1254 ret ptr %z 1255} 1256 1257define ptr @strh16_254(ptr %y, ptr %x) { 1258; CHECK-LABEL: strh16_254: 1259; CHECK: @ %bb.0: @ %entry 1260; CHECK-NEXT: vldrh.u16 q0, [r1] 1261; CHECK-NEXT: vstrh.16 q0, [r0], #254 1262; CHECK-NEXT: bx lr 1263entry: 1264 %z = getelementptr inbounds i8, ptr %y, i32 254 1265 %0 = load <8 x i16>, ptr %x, align 2 1266 store <8 x i16> %0, ptr %y, align 2 1267 ret ptr %z 1268} 1269 1270define ptr @strh16_256(ptr %y, ptr %x) { 1271; CHECK-LABEL: strh16_256: 1272; CHECK: @ %bb.0: @ %entry 1273; CHECK-NEXT: vldrh.u16 q0, [r1] 1274; CHECK-NEXT: vstrh.16 q0, [r0] 1275; CHECK-NEXT: add.w r0, r0, #256 1276; CHECK-NEXT: bx lr 1277entry: 1278 %z = getelementptr inbounds i8, ptr %y, i32 256 1279 %0 = load <8 x i16>, ptr %x, align 2 1280 store <8 x i16> %0, ptr %y, align 2 1281 ret ptr %z 1282} 1283 1284define ptr @strh16_m254(ptr %y, ptr %x) { 1285; CHECK-LABEL: strh16_m254: 1286; CHECK: @ %bb.0: @ %entry 1287; CHECK-NEXT: vldrh.u16 q0, [r1] 1288; CHECK-NEXT: vstrh.16 q0, [r0], #-254 1289; CHECK-NEXT: bx lr 1290entry: 1291 %z = getelementptr inbounds i8, ptr %y, i32 -254 1292 %0 = load <8 x i16>, ptr %x, align 2 1293 store <8 x i16> %0, ptr %y, align 2 1294 ret ptr %z 1295} 1296 1297define ptr @strh16_m256(ptr %y, ptr %x) { 1298; CHECK-LABEL: strh16_m256: 1299; CHECK: @ %bb.0: @ %entry 1300; CHECK-NEXT: vldrh.u16 q0, [r1] 1301; CHECK-NEXT: vstrh.16 q0, [r0] 1302; CHECK-NEXT: sub.w r0, r0, #256 1303; CHECK-NEXT: bx lr 1304entry: 1305 %z = getelementptr inbounds i8, ptr %y, i32 -256 1306 %0 = load <8 x i16>, ptr %x, align 2 1307 store <8 x i16> %0, ptr %y, align 2 1308 ret ptr %z 1309} 1310 1311 1312define ptr @strb32_4(ptr %y, ptr %x) { 1313; CHECK-LABEL: strb32_4: 1314; CHECK: @ %bb.0: @ %entry 1315; CHECK-NEXT: vldrb.u32 q0, [r1] 1316; CHECK-NEXT: vstrb.32 q0, [r0], #4 1317; CHECK-NEXT: bx lr 1318entry: 1319 %z = getelementptr inbounds i8, ptr %y, i32 4 1320 %0 = load <4 x i8>, ptr %x, align 1 1321 store <4 x i8> %0, ptr %y, align 1 1322 ret ptr %z 1323} 1324 1325define ptr @strb32_3(ptr %y, ptr %x) { 1326; CHECK-LABEL: strb32_3: 1327; CHECK: @ %bb.0: @ %entry 1328; CHECK-NEXT: vldrb.u32 q0, [r1] 1329; CHECK-NEXT: vstrb.32 q0, [r0], #3 1330; CHECK-NEXT: bx lr 1331entry: 1332 %z = getelementptr inbounds i8, ptr %y, i32 3 1333 %0 = load <4 x i8>, ptr %x, align 1 1334 store <4 x i8> %0, ptr %y, align 1 1335 ret ptr %z 1336} 1337 1338define ptr @strb32_127(ptr %y, ptr %x) { 1339; CHECK-LABEL: strb32_127: 1340; CHECK: @ %bb.0: @ %entry 1341; CHECK-NEXT: vldrb.u32 q0, [r1] 1342; CHECK-NEXT: vstrb.32 q0, [r0], #127 1343; CHECK-NEXT: bx lr 1344entry: 1345 %z = getelementptr inbounds i8, ptr %y, i32 127 1346 %0 = load <4 x i8>, ptr %x, align 1 1347 store <4 x i8> %0, ptr %y, align 1 1348 ret ptr %z 1349} 1350 1351define ptr @strb32_128(ptr %y, ptr %x) { 1352; CHECK-LABEL: strb32_128: 1353; CHECK: @ %bb.0: @ %entry 1354; CHECK-NEXT: vldrb.u32 q0, [r1] 1355; CHECK-NEXT: vstrb.32 q0, [r0] 1356; CHECK-NEXT: adds r0, #128 1357; CHECK-NEXT: bx lr 1358entry: 1359 %z = getelementptr inbounds i8, ptr %y, i32 128 1360 %0 = load <4 x i8>, ptr %x, align 1 1361 store <4 x i8> %0, ptr %y, align 1 1362 ret ptr %z 1363} 1364 1365define ptr @strb32_m127(ptr %y, ptr %x) { 1366; CHECK-LABEL: strb32_m127: 1367; CHECK: @ %bb.0: @ %entry 1368; CHECK-NEXT: vldrb.u32 q0, [r1] 1369; CHECK-NEXT: vstrb.32 q0, [r0], #-127 1370; CHECK-NEXT: bx lr 1371entry: 1372 %z = getelementptr inbounds i8, ptr %y, i32 -127 1373 %0 = load <4 x i8>, ptr %x, align 1 1374 store <4 x i8> %0, ptr %y, align 1 1375 ret ptr %z 1376} 1377 1378define ptr @strb32_m128(ptr %y, ptr %x) { 1379; CHECK-LABEL: strb32_m128: 1380; CHECK: @ %bb.0: @ %entry 1381; CHECK-NEXT: vldrb.u32 q0, [r1] 1382; CHECK-NEXT: vstrb.32 q0, [r0] 1383; CHECK-NEXT: subs r0, #128 1384; CHECK-NEXT: bx lr 1385entry: 1386 %z = getelementptr inbounds i8, ptr %y, i32 -128 1387 %0 = load <4 x i8>, ptr %x, align 1 1388 store <4 x i8> %0, ptr %y, align 1 1389 ret ptr %z 1390} 1391 1392 1393define ptr @strb16_4(ptr %y, ptr %x) { 1394; CHECK-LABEL: strb16_4: 1395; CHECK: @ %bb.0: @ %entry 1396; CHECK-NEXT: vldrb.u16 q0, [r1] 1397; CHECK-NEXT: vstrb.16 q0, [r0], #4 1398; CHECK-NEXT: bx lr 1399entry: 1400 %z = getelementptr inbounds i8, ptr %y, i32 4 1401 %0 = load <8 x i8>, ptr %x, align 1 1402 store <8 x i8> %0, ptr %y, align 1 1403 ret ptr %z 1404} 1405 1406define ptr @strb16_3(ptr %y, ptr %x) { 1407; CHECK-LABEL: strb16_3: 1408; CHECK: @ %bb.0: @ %entry 1409; CHECK-NEXT: vldrb.u16 q0, [r1] 1410; CHECK-NEXT: vstrb.16 q0, [r0], #3 1411; CHECK-NEXT: bx lr 1412entry: 1413 %z = getelementptr inbounds i8, ptr %y, i32 3 1414 %0 = load <8 x i8>, ptr %x, align 1 1415 store <8 x i8> %0, ptr %y, align 1 1416 ret ptr %z 1417} 1418 1419define ptr @strb16_127(ptr %y, ptr %x) { 1420; CHECK-LABEL: strb16_127: 1421; CHECK: @ %bb.0: @ %entry 1422; CHECK-NEXT: vldrb.u16 q0, [r1] 1423; CHECK-NEXT: vstrb.16 q0, [r0], #127 1424; CHECK-NEXT: bx lr 1425entry: 1426 %z = getelementptr inbounds i8, ptr %y, i32 127 1427 %0 = load <8 x i8>, ptr %x, align 1 1428 store <8 x i8> %0, ptr %y, align 1 1429 ret ptr %z 1430} 1431 1432define ptr @strb16_128(ptr %y, ptr %x) { 1433; CHECK-LABEL: strb16_128: 1434; CHECK: @ %bb.0: @ %entry 1435; CHECK-NEXT: vldrb.u16 q0, [r1] 1436; CHECK-NEXT: vstrb.16 q0, [r0] 1437; CHECK-NEXT: adds r0, #128 1438; CHECK-NEXT: bx lr 1439entry: 1440 %z = getelementptr inbounds i8, ptr %y, i32 128 1441 %0 = load <8 x i8>, ptr %x, align 1 1442 store <8 x i8> %0, ptr %y, align 1 1443 ret ptr %z 1444} 1445 1446define ptr @strb16_m127(ptr %y, ptr %x) { 1447; CHECK-LABEL: strb16_m127: 1448; CHECK: @ %bb.0: @ %entry 1449; CHECK-NEXT: vldrb.u16 q0, [r1] 1450; CHECK-NEXT: vstrb.16 q0, [r0], #-127 1451; CHECK-NEXT: bx lr 1452entry: 1453 %z = getelementptr inbounds i8, ptr %y, i32 -127 1454 %0 = load <8 x i8>, ptr %x, align 1 1455 store <8 x i8> %0, ptr %y, align 1 1456 ret ptr %z 1457} 1458 1459define ptr @strb16_m128(ptr %y, ptr %x) { 1460; CHECK-LABEL: strb16_m128: 1461; CHECK: @ %bb.0: @ %entry 1462; CHECK-NEXT: vldrb.u16 q0, [r1] 1463; CHECK-NEXT: vstrb.16 q0, [r0] 1464; CHECK-NEXT: subs r0, #128 1465; CHECK-NEXT: bx lr 1466entry: 1467 %z = getelementptr inbounds i8, ptr %y, i32 -128 1468 %0 = load <8 x i8>, ptr %x, align 1 1469 store <8 x i8> %0, ptr %y, align 1 1470 ret ptr %z 1471} 1472 1473 1474define ptr @strb8_4(ptr %y, ptr %x) { 1475; CHECK-LABEL: strb8_4: 1476; CHECK: @ %bb.0: @ %entry 1477; CHECK-NEXT: vldrb.u8 q0, [r1] 1478; CHECK-NEXT: vstrb.8 q0, [r0], #4 1479; CHECK-NEXT: bx lr 1480entry: 1481 %z = getelementptr inbounds i8, ptr %y, i32 4 1482 %0 = load <16 x i8>, ptr %x, align 1 1483 store <16 x i8> %0, ptr %y, align 1 1484 ret ptr %z 1485} 1486 1487define ptr @strb8_3(ptr %y, ptr %x) { 1488; CHECK-LABEL: strb8_3: 1489; CHECK: @ %bb.0: @ %entry 1490; CHECK-NEXT: vldrb.u8 q0, [r1] 1491; CHECK-NEXT: vstrb.8 q0, [r0], #3 1492; CHECK-NEXT: bx lr 1493entry: 1494 %z = getelementptr inbounds i8, ptr %y, i32 3 1495 %0 = load <16 x i8>, ptr %x, align 1 1496 store <16 x i8> %0, ptr %y, align 1 1497 ret ptr %z 1498} 1499 1500define ptr @strb8_127(ptr %y, ptr %x) { 1501; CHECK-LABEL: strb8_127: 1502; CHECK: @ %bb.0: @ %entry 1503; CHECK-NEXT: vldrb.u8 q0, [r1] 1504; CHECK-NEXT: vstrb.8 q0, [r0], #127 1505; CHECK-NEXT: bx lr 1506entry: 1507 %z = getelementptr inbounds i8, ptr %y, i32 127 1508 %0 = load <16 x i8>, ptr %x, align 1 1509 store <16 x i8> %0, ptr %y, align 1 1510 ret ptr %z 1511} 1512 1513define ptr @strb8_128(ptr %y, ptr %x) { 1514; CHECK-LABEL: strb8_128: 1515; CHECK: @ %bb.0: @ %entry 1516; CHECK-NEXT: vldrb.u8 q0, [r1] 1517; CHECK-NEXT: vstrb.8 q0, [r0] 1518; CHECK-NEXT: adds r0, #128 1519; CHECK-NEXT: bx lr 1520entry: 1521 %z = getelementptr inbounds i8, ptr %y, i32 128 1522 %0 = load <16 x i8>, ptr %x, align 1 1523 store <16 x i8> %0, ptr %y, align 1 1524 ret ptr %z 1525} 1526 1527define ptr @strb8_m127(ptr %y, ptr %x) { 1528; CHECK-LABEL: strb8_m127: 1529; CHECK: @ %bb.0: @ %entry 1530; CHECK-NEXT: vldrb.u8 q0, [r1] 1531; CHECK-NEXT: vstrb.8 q0, [r0], #-127 1532; CHECK-NEXT: bx lr 1533entry: 1534 %z = getelementptr inbounds i8, ptr %y, i32 -127 1535 %0 = load <16 x i8>, ptr %x, align 1 1536 store <16 x i8> %0, ptr %y, align 1 1537 ret ptr %z 1538} 1539 1540define ptr @strb8_m128(ptr %y, ptr %x) { 1541; CHECK-LABEL: strb8_m128: 1542; CHECK: @ %bb.0: @ %entry 1543; CHECK-NEXT: vldrb.u8 q0, [r1] 1544; CHECK-NEXT: vstrb.8 q0, [r0] 1545; CHECK-NEXT: subs r0, #128 1546; CHECK-NEXT: bx lr 1547entry: 1548 %z = getelementptr inbounds i8, ptr %y, i32 -128 1549 %0 = load <16 x i8>, ptr %x, align 1 1550 store <16 x i8> %0, ptr %y, align 1 1551 ret ptr %z 1552} 1553 1554 1555define ptr @strf32_4(ptr %y, ptr %x) { 1556; CHECK-LE-LABEL: strf32_4: 1557; CHECK-LE: @ %bb.0: @ %entry 1558; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 1559; CHECK-LE-NEXT: vstrb.8 q0, [r0], #4 1560; CHECK-LE-NEXT: bx lr 1561; 1562; CHECK-BE-LABEL: strf32_4: 1563; CHECK-BE: @ %bb.0: @ %entry 1564; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1565; CHECK-BE-NEXT: vstrw.32 q0, [r0], #4 1566; CHECK-BE-NEXT: bx lr 1567entry: 1568 %z = getelementptr inbounds i8, ptr %y, i32 4 1569 %0 = load <4 x float>, ptr %x, align 4 1570 store <4 x float> %0, ptr %y, align 4 1571 ret ptr %z 1572} 1573 1574define ptr @strf16_4(ptr %y, ptr %x) { 1575; CHECK-LE-LABEL: strf16_4: 1576; CHECK-LE: @ %bb.0: @ %entry 1577; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1578; CHECK-LE-NEXT: vstrb.8 q0, [r0], #4 1579; CHECK-LE-NEXT: bx lr 1580; 1581; CHECK-BE-LABEL: strf16_4: 1582; CHECK-BE: @ %bb.0: @ %entry 1583; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1584; CHECK-BE-NEXT: vstrh.16 q0, [r0], #4 1585; CHECK-BE-NEXT: bx lr 1586entry: 1587 %z = getelementptr inbounds i8, ptr %y, i32 4 1588 %0 = load <8 x half>, ptr %x, align 2 1589 store <8 x half> %0, ptr %y, align 2 1590 ret ptr %z 1591} 1592 1593define ptr @strwi32_align1(ptr %y, ptr %x) { 1594; CHECK-LE-LABEL: strwi32_align1: 1595; CHECK-LE: @ %bb.0: @ %entry 1596; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 1597; CHECK-LE-NEXT: vstrb.8 q0, [r0], #3 1598; CHECK-LE-NEXT: bx lr 1599; 1600; CHECK-BE-LABEL: strwi32_align1: 1601; CHECK-BE: @ %bb.0: @ %entry 1602; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1603; CHECK-BE-NEXT: vrev32.8 q0, q0 1604; CHECK-BE-NEXT: vstrb.8 q0, [r0], #3 1605; CHECK-BE-NEXT: bx lr 1606entry: 1607 %z = getelementptr inbounds i8, ptr %y, i32 3 1608 %0 = load <4 x i32>, ptr %x, align 4 1609 store <4 x i32> %0, ptr %y, align 1 1610 ret ptr %z 1611} 1612 1613define ptr @strhi16_align1(ptr %y, ptr %x) { 1614; CHECK-LE-LABEL: strhi16_align1: 1615; CHECK-LE: @ %bb.0: @ %entry 1616; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1617; CHECK-LE-NEXT: vstrb.8 q0, [r0], #3 1618; CHECK-LE-NEXT: bx lr 1619; 1620; CHECK-BE-LABEL: strhi16_align1: 1621; CHECK-BE: @ %bb.0: @ %entry 1622; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1623; CHECK-BE-NEXT: vrev16.8 q0, q0 1624; CHECK-BE-NEXT: vstrb.8 q0, [r0], #3 1625; CHECK-BE-NEXT: bx lr 1626entry: 1627 %z = getelementptr inbounds i8, ptr %y, i32 3 1628 %0 = load <8 x i16>, ptr %x, align 2 1629 store <8 x i16> %0, ptr %y, align 1 1630 ret ptr %z 1631} 1632 1633define ptr @strhi32_align1(ptr %y, ptr %x) { 1634; CHECK-LABEL: strhi32_align1: 1635; CHECK: @ %bb.0: @ %entry 1636; CHECK-NEXT: .pad #8 1637; CHECK-NEXT: sub sp, #8 1638; CHECK-NEXT: vldrw.u32 q0, [r1] 1639; CHECK-NEXT: mov r1, sp 1640; CHECK-NEXT: vstrh.32 q0, [r1] 1641; CHECK-NEXT: ldrd r1, r2, [sp] 1642; CHECK-NEXT: str r1, [r0] 1643; CHECK-NEXT: str r2, [r0, #4] 1644; CHECK-NEXT: adds r0, #3 1645; CHECK-NEXT: add sp, #8 1646; CHECK-NEXT: bx lr 1647entry: 1648 %z = getelementptr inbounds i8, ptr %y, i32 3 1649 %0 = load <4 x i32>, ptr %x, align 4 1650 %1 = trunc <4 x i32> %0 to <4 x i16> 1651 store <4 x i16> %1, ptr %y, align 1 1652 ret ptr %z 1653} 1654 1655define ptr @strf32_align1(ptr %y, ptr %x) { 1656; CHECK-LE-LABEL: strf32_align1: 1657; CHECK-LE: @ %bb.0: @ %entry 1658; CHECK-LE-NEXT: vldrw.u32 q0, [r1] 1659; CHECK-LE-NEXT: vstrb.8 q0, [r0], #3 1660; CHECK-LE-NEXT: bx lr 1661; 1662; CHECK-BE-LABEL: strf32_align1: 1663; CHECK-BE: @ %bb.0: @ %entry 1664; CHECK-BE-NEXT: vldrw.u32 q0, [r1] 1665; CHECK-BE-NEXT: vrev32.8 q0, q0 1666; CHECK-BE-NEXT: vstrb.8 q0, [r0], #3 1667; CHECK-BE-NEXT: bx lr 1668entry: 1669 %z = getelementptr inbounds i8, ptr %y, i32 3 1670 %0 = load <4 x float>, ptr %x, align 4 1671 store <4 x float> %0, ptr %y, align 1 1672 ret ptr %z 1673} 1674 1675define ptr @strf16_align1(ptr %y, ptr %x) { 1676; CHECK-LE-LABEL: strf16_align1: 1677; CHECK-LE: @ %bb.0: @ %entry 1678; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1679; CHECK-LE-NEXT: vstrb.8 q0, [r0], #3 1680; CHECK-LE-NEXT: bx lr 1681; 1682; CHECK-BE-LABEL: strf16_align1: 1683; CHECK-BE: @ %bb.0: @ %entry 1684; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1685; CHECK-BE-NEXT: vrev16.8 q0, q0 1686; CHECK-BE-NEXT: vstrb.8 q0, [r0], #3 1687; CHECK-BE-NEXT: bx lr 1688entry: 1689 %z = getelementptr inbounds i8, ptr %y, i32 3 1690 %0 = load <8 x half>, ptr %x, align 2 1691 store <8 x half> %0, ptr %y, align 1 1692 ret ptr %z 1693} 1694 1695define ptr @strf16_align8(ptr %y, ptr %x) { 1696; CHECK-LE-LABEL: strf16_align8: 1697; CHECK-LE: @ %bb.0: @ %entry 1698; CHECK-LE-NEXT: vldrh.u16 q0, [r1] 1699; CHECK-LE-NEXT: vstrb.8 q0, [r0], #16 1700; CHECK-LE-NEXT: bx lr 1701; 1702; CHECK-BE-LABEL: strf16_align8: 1703; CHECK-BE: @ %bb.0: @ %entry 1704; CHECK-BE-NEXT: vldrh.u16 q0, [r1] 1705; CHECK-BE-NEXT: vstrh.16 q0, [r0], #16 1706; CHECK-BE-NEXT: bx lr 1707entry: 1708 %z = getelementptr inbounds i8, ptr %y, i32 16 1709 %0 = load <8 x i16>, ptr %x, align 2 1710 store <8 x i16> %0, ptr %y, align 8 1711 ret ptr %z 1712} 1713