1720 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LE3; RUN: llc -mtriple=thumbebv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BE4 5define ptr @ldrwu32_4(ptr %x, ptr %y) {6; CHECK-LABEL: ldrwu32_4:7; CHECK: @ %bb.0: @ %entry8; CHECK-NEXT: vldrw.u32 q0, [r0, #4]!9; CHECK-NEXT: vstrw.32 q0, [r1]10; CHECK-NEXT: bx lr11entry:12 %z = getelementptr inbounds i8, ptr %x, i32 413 %0 = load <4 x i32>, ptr %z, align 414 store <4 x i32> %0, ptr %y, align 415 ret ptr %z16}17 18define ptr @ldrwu32_3(ptr %x, ptr %y) {19; CHECK-LE-LABEL: ldrwu32_3:20; CHECK-LE: @ %bb.0: @ %entry21; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]!22; CHECK-LE-NEXT: vstrw.32 q0, [r1]23; CHECK-LE-NEXT: bx lr24;25; CHECK-BE-LABEL: ldrwu32_3:26; CHECK-BE: @ %bb.0: @ %entry27; CHECK-BE-NEXT: adds r0, #328; CHECK-BE-NEXT: vldrw.u32 q0, [r0]29; CHECK-BE-NEXT: vstrw.32 q0, [r1]30; CHECK-BE-NEXT: bx lr31entry:32 %z = getelementptr inbounds i8, ptr %x, i32 333 %0 = load <4 x i32>, ptr %z, align 434 store <4 x i32> %0, ptr %y, align 435 ret ptr %z36}37 38define ptr @ldrwu32_m4(ptr %x, ptr %y) {39; CHECK-LABEL: ldrwu32_m4:40; CHECK: @ %bb.0: @ %entry41; CHECK-NEXT: vldrw.u32 q0, [r0, #-4]!42; CHECK-NEXT: vstrw.32 q0, [r1]43; CHECK-NEXT: bx lr44entry:45 %z = getelementptr inbounds i8, ptr %x, i32 -446 %0 = load <4 x i32>, ptr %z, align 447 store <4 x i32> %0, ptr %y, align 448 ret ptr %z49}50 51define ptr @ldrwu32_508(ptr %x, ptr %y) {52; CHECK-LABEL: ldrwu32_508:53; CHECK: @ %bb.0: @ %entry54; CHECK-NEXT: vldrw.u32 q0, [r0, #508]!55; CHECK-NEXT: vstrw.32 q0, [r1]56; CHECK-NEXT: bx lr57entry:58 %z = getelementptr inbounds i8, ptr %x, i32 50859 %0 = load <4 x i32>, ptr %z, align 460 store <4 x i32> %0, ptr %y, align 461 ret ptr %z62}63 64define ptr @ldrwu32_512(ptr %x, ptr %y) {65; CHECK-LABEL: ldrwu32_512:66; CHECK: @ %bb.0: @ %entry67; CHECK-NEXT: add.w r0, r0, #51268; CHECK-NEXT: vldrw.u32 q0, [r0]69; CHECK-NEXT: vstrw.32 q0, [r1]70; CHECK-NEXT: bx lr71entry:72 %z = getelementptr inbounds i8, ptr %x, i32 51273 %0 = load <4 x i32>, ptr %z, align 474 store <4 x i32> %0, ptr %y, align 475 ret ptr %z76}77 78define ptr @ldrwu32_m508(ptr %x, ptr %y) {79; CHECK-LABEL: ldrwu32_m508:80; CHECK: @ %bb.0: @ %entry81; CHECK-NEXT: vldrw.u32 q0, [r0, #-508]!82; CHECK-NEXT: vstrw.32 q0, [r1]83; CHECK-NEXT: bx lr84entry:85 %z = getelementptr inbounds i8, ptr %x, i32 -50886 %0 = load <4 x i32>, ptr %z, align 487 store <4 x i32> %0, ptr %y, align 488 ret ptr %z89}90 91define ptr @ldrwu32_m512(ptr %x, ptr %y) {92; CHECK-LABEL: ldrwu32_m512:93; CHECK: @ %bb.0: @ %entry94; CHECK-NEXT: sub.w r0, r0, #51295; CHECK-NEXT: vldrw.u32 q0, [r0]96; CHECK-NEXT: vstrw.32 q0, [r1]97; CHECK-NEXT: bx lr98entry:99 %z = getelementptr inbounds i8, ptr %x, i32 -512100 %0 = load <4 x i32>, ptr %z, align 4101 store <4 x i32> %0, ptr %y, align 4102 ret ptr %z103}104 105 106define ptr @ldrhu32_4(ptr %x, ptr %y) {107; CHECK-LABEL: ldrhu32_4:108; CHECK: @ %bb.0: @ %entry109; CHECK-NEXT: vldrh.u32 q0, [r0, #4]!110; CHECK-NEXT: vstrw.32 q0, [r1]111; CHECK-NEXT: bx lr112entry:113 %z = getelementptr inbounds i8, ptr %x, i32 4114 %0 = load <4 x i16>, ptr %z, align 2115 %1 = zext <4 x i16> %0 to <4 x i32>116 store <4 x i32> %1, ptr %y, align 4117 ret ptr %z118}119 120define ptr @ldrhu32_3(ptr %x, ptr %y) {121; CHECK-LABEL: ldrhu32_3:122; CHECK: @ %bb.0: @ %entry123; CHECK-NEXT: adds r0, #3124; CHECK-NEXT: vldrh.u32 q0, [r0]125; CHECK-NEXT: vstrw.32 q0, [r1]126; CHECK-NEXT: bx lr127entry:128 %z = getelementptr inbounds i8, ptr %x, i32 3129 %0 = load <4 x i16>, ptr %z, align 2130 %1 = zext <4 x i16> %0 to <4 x i32>131 store <4 x i32> %1, ptr %y, align 4132 ret ptr %z133}134 135define ptr @ldrhu32_2(ptr %x, ptr %y) {136; CHECK-LABEL: ldrhu32_2:137; CHECK: @ %bb.0: @ %entry138; CHECK-NEXT: vldrh.u32 q0, [r0, #2]!139; CHECK-NEXT: vstrw.32 q0, [r1]140; CHECK-NEXT: bx lr141entry:142 %z = getelementptr inbounds i8, ptr %x, i32 2143 %0 = load <4 x i16>, ptr %z, align 2144 %1 = zext <4 x i16> %0 to <4 x i32>145 store <4 x i32> %1, ptr %y, align 4146 ret ptr %z147}148 149define ptr @ldrhu32_254(ptr %x, ptr %y) {150; CHECK-LABEL: ldrhu32_254:151; CHECK: @ %bb.0: @ %entry152; CHECK-NEXT: vldrh.u32 q0, [r0, #254]!153; CHECK-NEXT: vstrw.32 q0, [r1]154; CHECK-NEXT: bx lr155entry:156 %z = getelementptr inbounds i8, ptr %x, i32 254157 %0 = load <4 x i16>, ptr %z, align 2158 %1 = zext <4 x i16> %0 to <4 x i32>159 store <4 x i32> %1, ptr %y, align 4160 ret ptr %z161}162 163define ptr @ldrhu32_256(ptr %x, ptr %y) {164; CHECK-LABEL: ldrhu32_256:165; CHECK: @ %bb.0: @ %entry166; CHECK-NEXT: add.w r0, r0, #256167; CHECK-NEXT: vldrh.u32 q0, [r0]168; CHECK-NEXT: vstrw.32 q0, [r1]169; CHECK-NEXT: bx lr170entry:171 %z = getelementptr inbounds i8, ptr %x, i32 256172 %0 = load <4 x i16>, ptr %z, align 2173 %1 = zext <4 x i16> %0 to <4 x i32>174 store <4 x i32> %1, ptr %y, align 4175 ret ptr %z176}177 178define ptr @ldrhu32_m254(ptr %x, ptr %y) {179; CHECK-LABEL: ldrhu32_m254:180; CHECK: @ %bb.0: @ %entry181; CHECK-NEXT: vldrh.u32 q0, [r0, #-254]!182; CHECK-NEXT: vstrw.32 q0, [r1]183; CHECK-NEXT: bx lr184entry:185 %z = getelementptr inbounds i8, ptr %x, i32 -254186 %0 = load <4 x i16>, ptr %z, align 2187 %1 = zext <4 x i16> %0 to <4 x i32>188 store <4 x i32> %1, ptr %y, align 4189 ret ptr %z190}191 192define ptr @ldrhu32_m256(ptr %x, ptr %y) {193; CHECK-LABEL: ldrhu32_m256:194; CHECK: @ %bb.0: @ %entry195; CHECK-NEXT: sub.w r0, r0, #256196; CHECK-NEXT: vldrh.u32 q0, [r0]197; CHECK-NEXT: vstrw.32 q0, [r1]198; CHECK-NEXT: bx lr199entry:200 %z = getelementptr inbounds i8, ptr %x, i32 -256201 %0 = load <4 x i16>, ptr %z, align 2202 %1 = zext <4 x i16> %0 to <4 x i32>203 store <4 x i32> %1, ptr %y, align 4204 ret ptr %z205}206 207 208define ptr @ldrhs32_4(ptr %x, ptr %y) {209; CHECK-LABEL: ldrhs32_4:210; CHECK: @ %bb.0: @ %entry211; CHECK-NEXT: vldrh.s32 q0, [r0, #4]!212; CHECK-NEXT: vstrw.32 q0, [r1]213; CHECK-NEXT: bx lr214entry:215 %z = getelementptr inbounds i8, ptr %x, i32 4216 %0 = load <4 x i16>, ptr %z, align 2217 %1 = sext <4 x i16> %0 to <4 x i32>218 store <4 x i32> %1, ptr %y, align 4219 ret ptr %z220}221 222define ptr @ldrhs32_3(ptr %x, ptr %y) {223; CHECK-LABEL: ldrhs32_3:224; CHECK: @ %bb.0: @ %entry225; CHECK-NEXT: adds r0, #3226; CHECK-NEXT: vldrh.s32 q0, [r0]227; CHECK-NEXT: vstrw.32 q0, [r1]228; CHECK-NEXT: bx lr229entry:230 %z = getelementptr inbounds i8, ptr %x, i32 3231 %0 = load <4 x i16>, ptr %z, align 2232 %1 = sext <4 x i16> %0 to <4 x i32>233 store <4 x i32> %1, ptr %y, align 4234 ret ptr %z235}236 237define ptr @ldrhs32_2(ptr %x, ptr %y) {238; CHECK-LABEL: ldrhs32_2:239; CHECK: @ %bb.0: @ %entry240; CHECK-NEXT: vldrh.s32 q0, [r0, #2]!241; CHECK-NEXT: vstrw.32 q0, [r1]242; CHECK-NEXT: bx lr243entry:244 %z = getelementptr inbounds i8, ptr %x, i32 2245 %0 = load <4 x i16>, ptr %z, align 2246 %1 = sext <4 x i16> %0 to <4 x i32>247 store <4 x i32> %1, ptr %y, align 4248 ret ptr %z249}250 251define ptr @ldrhs32_254(ptr %x, ptr %y) {252; CHECK-LABEL: ldrhs32_254:253; CHECK: @ %bb.0: @ %entry254; CHECK-NEXT: vldrh.s32 q0, [r0, #254]!255; CHECK-NEXT: vstrw.32 q0, [r1]256; CHECK-NEXT: bx lr257entry:258 %z = getelementptr inbounds i8, ptr %x, i32 254259 %0 = load <4 x i16>, ptr %z, align 2260 %1 = sext <4 x i16> %0 to <4 x i32>261 store <4 x i32> %1, ptr %y, align 4262 ret ptr %z263}264 265define ptr @ldrhs32_256(ptr %x, ptr %y) {266; CHECK-LABEL: ldrhs32_256:267; CHECK: @ %bb.0: @ %entry268; CHECK-NEXT: add.w r0, r0, #256269; CHECK-NEXT: vldrh.s32 q0, [r0]270; CHECK-NEXT: vstrw.32 q0, [r1]271; CHECK-NEXT: bx lr272entry:273 %z = getelementptr inbounds i8, ptr %x, i32 256274 %0 = load <4 x i16>, ptr %z, align 2275 %1 = sext <4 x i16> %0 to <4 x i32>276 store <4 x i32> %1, ptr %y, align 4277 ret ptr %z278}279 280define ptr @ldrhs32_m254(ptr %x, ptr %y) {281; CHECK-LABEL: ldrhs32_m254:282; CHECK: @ %bb.0: @ %entry283; CHECK-NEXT: vldrh.s32 q0, [r0, #-254]!284; CHECK-NEXT: vstrw.32 q0, [r1]285; CHECK-NEXT: bx lr286entry:287 %z = getelementptr inbounds i8, ptr %x, i32 -254288 %0 = load <4 x i16>, ptr %z, align 2289 %1 = sext <4 x i16> %0 to <4 x i32>290 store <4 x i32> %1, ptr %y, align 4291 ret ptr %z292}293 294define ptr @ldrhs32_m256(ptr %x, ptr %y) {295; CHECK-LABEL: ldrhs32_m256:296; CHECK: @ %bb.0: @ %entry297; CHECK-NEXT: sub.w r0, r0, #256298; CHECK-NEXT: vldrh.s32 q0, [r0]299; CHECK-NEXT: vstrw.32 q0, [r1]300; CHECK-NEXT: bx lr301entry:302 %z = getelementptr inbounds i8, ptr %x, i32 -256303 %0 = load <4 x i16>, ptr %z, align 2304 %1 = sext <4 x i16> %0 to <4 x i32>305 store <4 x i32> %1, ptr %y, align 4306 ret ptr %z307}308 309 310define ptr @ldrhu16_4(ptr %x, ptr %y) {311; CHECK-LABEL: ldrhu16_4:312; CHECK: @ %bb.0: @ %entry313; CHECK-NEXT: vldrh.u16 q0, [r0, #4]!314; CHECK-NEXT: vstrh.16 q0, [r1]315; CHECK-NEXT: bx lr316entry:317 %z = getelementptr inbounds i8, ptr %x, i32 4318 %0 = load <8 x i16>, ptr %z, align 2319 store <8 x i16> %0, ptr %y, align 2320 ret ptr %z321}322 323define ptr @ldrhu16_3(ptr %x, ptr %y) {324; CHECK-LE-LABEL: ldrhu16_3:325; CHECK-LE: @ %bb.0: @ %entry326; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]!327; CHECK-LE-NEXT: vstrh.16 q0, [r1]328; CHECK-LE-NEXT: bx lr329;330; CHECK-BE-LABEL: ldrhu16_3:331; CHECK-BE: @ %bb.0: @ %entry332; CHECK-BE-NEXT: adds r0, #3333; CHECK-BE-NEXT: vldrh.u16 q0, [r0]334; CHECK-BE-NEXT: vstrh.16 q0, [r1]335; CHECK-BE-NEXT: bx lr336entry:337 %z = getelementptr inbounds i8, ptr %x, i32 3338 %0 = load <8 x i16>, ptr %z, align 2339 store <8 x i16> %0, ptr %y, align 2340 ret ptr %z341}342 343define ptr @ldrhu16_2(ptr %x, ptr %y) {344; CHECK-LABEL: ldrhu16_2:345; CHECK: @ %bb.0: @ %entry346; CHECK-NEXT: vldrh.u16 q0, [r0, #2]!347; CHECK-NEXT: vstrh.16 q0, [r1]348; CHECK-NEXT: bx lr349entry:350 %z = getelementptr inbounds i8, ptr %x, i32 2351 %0 = load <8 x i16>, ptr %z, align 2352 store <8 x i16> %0, ptr %y, align 2353 ret ptr %z354}355 356define ptr @ldrhu16_254(ptr %x, ptr %y) {357; CHECK-LABEL: ldrhu16_254:358; CHECK: @ %bb.0: @ %entry359; CHECK-NEXT: vldrh.u16 q0, [r0, #254]!360; CHECK-NEXT: vstrh.16 q0, [r1]361; CHECK-NEXT: bx lr362entry:363 %z = getelementptr inbounds i8, ptr %x, i32 254364 %0 = load <8 x i16>, ptr %z, align 2365 store <8 x i16> %0, ptr %y, align 2366 ret ptr %z367}368 369define ptr @ldrhu16_256(ptr %x, ptr %y) {370; CHECK-LABEL: ldrhu16_256:371; CHECK: @ %bb.0: @ %entry372; CHECK-NEXT: add.w r0, r0, #256373; CHECK-NEXT: vldrh.u16 q0, [r0]374; CHECK-NEXT: vstrh.16 q0, [r1]375; CHECK-NEXT: bx lr376entry:377 %z = getelementptr inbounds i8, ptr %x, i32 256378 %0 = load <8 x i16>, ptr %z, align 2379 store <8 x i16> %0, ptr %y, align 2380 ret ptr %z381}382 383define ptr @ldrhu16_m254(ptr %x, ptr %y) {384; CHECK-LABEL: ldrhu16_m254:385; CHECK: @ %bb.0: @ %entry386; CHECK-NEXT: vldrh.u16 q0, [r0, #-254]!387; CHECK-NEXT: vstrh.16 q0, [r1]388; CHECK-NEXT: bx lr389entry:390 %z = getelementptr inbounds i8, ptr %x, i32 -254391 %0 = load <8 x i16>, ptr %z, align 2392 store <8 x i16> %0, ptr %y, align 2393 ret ptr %z394}395 396define ptr @ldrhu16_m256(ptr %x, ptr %y) {397; CHECK-LABEL: ldrhu16_m256:398; CHECK: @ %bb.0: @ %entry399; CHECK-NEXT: sub.w r0, r0, #256400; CHECK-NEXT: vldrh.u16 q0, [r0]401; CHECK-NEXT: vstrh.16 q0, [r1]402; CHECK-NEXT: bx lr403entry:404 %z = getelementptr inbounds i8, ptr %x, i32 -256405 %0 = load <8 x i16>, ptr %z, align 2406 store <8 x i16> %0, ptr %y, align 2407 ret ptr %z408}409 410 411define ptr @ldrbu32_4(ptr %x, ptr %y) {412; CHECK-LABEL: ldrbu32_4:413; CHECK: @ %bb.0: @ %entry414; CHECK-NEXT: vldrb.u32 q0, [r0, #4]!415; CHECK-NEXT: vstrw.32 q0, [r1]416; CHECK-NEXT: bx lr417entry:418 %z = getelementptr inbounds i8, ptr %x, i32 4419 %0 = load <4 x i8>, ptr %z, align 1420 %1 = zext <4 x i8> %0 to <4 x i32>421 store <4 x i32> %1, ptr %y, align 4422 ret ptr %z423}424 425define ptr @ldrbu32_3(ptr %x, ptr %y) {426; CHECK-LABEL: ldrbu32_3:427; CHECK: @ %bb.0: @ %entry428; CHECK-NEXT: vldrb.u32 q0, [r0, #3]!429; CHECK-NEXT: vstrw.32 q0, [r1]430; CHECK-NEXT: bx lr431entry:432 %z = getelementptr inbounds i8, ptr %x, i32 3433 %0 = load <4 x i8>, ptr %z, align 1434 %1 = zext <4 x i8> %0 to <4 x i32>435 store <4 x i32> %1, ptr %y, align 4436 ret ptr %z437}438 439define ptr @ldrbu32_127(ptr %x, ptr %y) {440; CHECK-LABEL: ldrbu32_127:441; CHECK: @ %bb.0: @ %entry442; CHECK-NEXT: vldrb.u32 q0, [r0, #127]!443; CHECK-NEXT: vstrw.32 q0, [r1]444; CHECK-NEXT: bx lr445entry:446 %z = getelementptr inbounds i8, ptr %x, i32 127447 %0 = load <4 x i8>, ptr %z, align 1448 %1 = zext <4 x i8> %0 to <4 x i32>449 store <4 x i32> %1, ptr %y, align 4450 ret ptr %z451}452 453define ptr @ldrbu32_128(ptr %x, ptr %y) {454; CHECK-LABEL: ldrbu32_128:455; CHECK: @ %bb.0: @ %entry456; CHECK-NEXT: adds r0, #128457; CHECK-NEXT: vldrb.u32 q0, [r0]458; CHECK-NEXT: vstrw.32 q0, [r1]459; CHECK-NEXT: bx lr460entry:461 %z = getelementptr inbounds i8, ptr %x, i32 128462 %0 = load <4 x i8>, ptr %z, align 1463 %1 = zext <4 x i8> %0 to <4 x i32>464 store <4 x i32> %1, ptr %y, align 4465 ret ptr %z466}467 468define ptr @ldrbu32_m127(ptr %x, ptr %y) {469; CHECK-LABEL: ldrbu32_m127:470; CHECK: @ %bb.0: @ %entry471; CHECK-NEXT: vldrb.u32 q0, [r0, #-127]!472; CHECK-NEXT: vstrw.32 q0, [r1]473; CHECK-NEXT: bx lr474entry:475 %z = getelementptr inbounds i8, ptr %x, i32 -127476 %0 = load <4 x i8>, ptr %z, align 1477 %1 = zext <4 x i8> %0 to <4 x i32>478 store <4 x i32> %1, ptr %y, align 4479 ret ptr %z480}481 482define ptr @ldrbu32_m128(ptr %x, ptr %y) {483; CHECK-LABEL: ldrbu32_m128:484; CHECK: @ %bb.0: @ %entry485; CHECK-NEXT: subs r0, #128486; CHECK-NEXT: vldrb.u32 q0, [r0]487; CHECK-NEXT: vstrw.32 q0, [r1]488; CHECK-NEXT: bx lr489entry:490 %z = getelementptr inbounds i8, ptr %x, i32 -128491 %0 = load <4 x i8>, ptr %z, align 1492 %1 = zext <4 x i8> %0 to <4 x i32>493 store <4 x i32> %1, ptr %y, align 4494 ret ptr %z495}496 497 498define ptr @ldrbs32_4(ptr %x, ptr %y) {499; CHECK-LABEL: ldrbs32_4:500; CHECK: @ %bb.0: @ %entry501; CHECK-NEXT: vldrb.s32 q0, [r0, #4]!502; CHECK-NEXT: vstrw.32 q0, [r1]503; CHECK-NEXT: bx lr504entry:505 %z = getelementptr inbounds i8, ptr %x, i32 4506 %0 = load <4 x i8>, ptr %z, align 1507 %1 = sext <4 x i8> %0 to <4 x i32>508 store <4 x i32> %1, ptr %y, align 4509 ret ptr %z510}511 512define ptr @ldrbs32_3(ptr %x, ptr %y) {513; CHECK-LABEL: ldrbs32_3:514; CHECK: @ %bb.0: @ %entry515; CHECK-NEXT: vldrb.s32 q0, [r0, #3]!516; CHECK-NEXT: vstrw.32 q0, [r1]517; CHECK-NEXT: bx lr518entry:519 %z = getelementptr inbounds i8, ptr %x, i32 3520 %0 = load <4 x i8>, ptr %z, align 1521 %1 = sext <4 x i8> %0 to <4 x i32>522 store <4 x i32> %1, ptr %y, align 4523 ret ptr %z524}525 526define ptr @ldrbs32_127(ptr %x, ptr %y) {527; CHECK-LABEL: ldrbs32_127:528; CHECK: @ %bb.0: @ %entry529; CHECK-NEXT: vldrb.s32 q0, [r0, #127]!530; CHECK-NEXT: vstrw.32 q0, [r1]531; CHECK-NEXT: bx lr532entry:533 %z = getelementptr inbounds i8, ptr %x, i32 127534 %0 = load <4 x i8>, ptr %z, align 1535 %1 = sext <4 x i8> %0 to <4 x i32>536 store <4 x i32> %1, ptr %y, align 4537 ret ptr %z538}539 540define ptr @ldrbs32_128(ptr %x, ptr %y) {541; CHECK-LABEL: ldrbs32_128:542; CHECK: @ %bb.0: @ %entry543; CHECK-NEXT: adds r0, #128544; CHECK-NEXT: vldrb.s32 q0, [r0]545; CHECK-NEXT: vstrw.32 q0, [r1]546; CHECK-NEXT: bx lr547entry:548 %z = getelementptr inbounds i8, ptr %x, i32 128549 %0 = load <4 x i8>, ptr %z, align 1550 %1 = sext <4 x i8> %0 to <4 x i32>551 store <4 x i32> %1, ptr %y, align 4552 ret ptr %z553}554 555define ptr @ldrbs32_m127(ptr %x, ptr %y) {556; CHECK-LABEL: ldrbs32_m127:557; CHECK: @ %bb.0: @ %entry558; CHECK-NEXT: vldrb.s32 q0, [r0, #-127]!559; CHECK-NEXT: vstrw.32 q0, [r1]560; CHECK-NEXT: bx lr561entry:562 %z = getelementptr inbounds i8, ptr %x, i32 -127563 %0 = load <4 x i8>, ptr %z, align 1564 %1 = sext <4 x i8> %0 to <4 x i32>565 store <4 x i32> %1, ptr %y, align 4566 ret ptr %z567}568 569define ptr @ldrbs32_m128(ptr %x, ptr %y) {570; CHECK-LABEL: ldrbs32_m128:571; CHECK: @ %bb.0: @ %entry572; CHECK-NEXT: subs r0, #128573; CHECK-NEXT: vldrb.s32 q0, [r0]574; CHECK-NEXT: vstrw.32 q0, [r1]575; CHECK-NEXT: bx lr576entry:577 %z = getelementptr inbounds i8, ptr %x, i32 -128578 %0 = load <4 x i8>, ptr %z, align 1579 %1 = sext <4 x i8> %0 to <4 x i32>580 store <4 x i32> %1, ptr %y, align 4581 ret ptr %z582}583 584 585define ptr @ldrbu16_4(ptr %x, ptr %y) {586; CHECK-LABEL: ldrbu16_4:587; CHECK: @ %bb.0: @ %entry588; CHECK-NEXT: vldrb.u16 q0, [r0, #4]!589; CHECK-NEXT: vstrh.16 q0, [r1]590; CHECK-NEXT: bx lr591entry:592 %z = getelementptr inbounds i8, ptr %x, i32 4593 %0 = load <8 x i8>, ptr %z, align 1594 %1 = zext <8 x i8> %0 to <8 x i16>595 store <8 x i16> %1, ptr %y, align 2596 ret ptr %z597}598 599define ptr @ldrbu16_3(ptr %x, ptr %y) {600; CHECK-LABEL: ldrbu16_3:601; CHECK: @ %bb.0: @ %entry602; CHECK-NEXT: vldrb.u16 q0, [r0, #3]!603; CHECK-NEXT: vstrh.16 q0, [r1]604; CHECK-NEXT: bx lr605entry:606 %z = getelementptr inbounds i8, ptr %x, i32 3607 %0 = load <8 x i8>, ptr %z, align 1608 %1 = zext <8 x i8> %0 to <8 x i16>609 store <8 x i16> %1, ptr %y, align 2610 ret ptr %z611}612 613define ptr @ldrbu16_127(ptr %x, ptr %y) {614; CHECK-LABEL: ldrbu16_127:615; CHECK: @ %bb.0: @ %entry616; CHECK-NEXT: vldrb.u16 q0, [r0, #127]!617; CHECK-NEXT: vstrh.16 q0, [r1]618; CHECK-NEXT: bx lr619entry:620 %z = getelementptr inbounds i8, ptr %x, i32 127621 %0 = load <8 x i8>, ptr %z, align 1622 %1 = zext <8 x i8> %0 to <8 x i16>623 store <8 x i16> %1, ptr %y, align 2624 ret ptr %z625}626 627define ptr @ldrbu16_128(ptr %x, ptr %y) {628; CHECK-LABEL: ldrbu16_128:629; CHECK: @ %bb.0: @ %entry630; CHECK-NEXT: adds r0, #128631; CHECK-NEXT: vldrb.u16 q0, [r0]632; CHECK-NEXT: vstrh.16 q0, [r1]633; CHECK-NEXT: bx lr634entry:635 %z = getelementptr inbounds i8, ptr %x, i32 128636 %0 = load <8 x i8>, ptr %z, align 1637 %1 = zext <8 x i8> %0 to <8 x i16>638 store <8 x i16> %1, ptr %y, align 2639 ret ptr %z640}641 642define ptr @ldrbu16_m127(ptr %x, ptr %y) {643; CHECK-LABEL: ldrbu16_m127:644; CHECK: @ %bb.0: @ %entry645; CHECK-NEXT: vldrb.u16 q0, [r0, #-127]!646; CHECK-NEXT: vstrh.16 q0, [r1]647; CHECK-NEXT: bx lr648entry:649 %z = getelementptr inbounds i8, ptr %x, i32 -127650 %0 = load <8 x i8>, ptr %z, align 1651 %1 = zext <8 x i8> %0 to <8 x i16>652 store <8 x i16> %1, ptr %y, align 2653 ret ptr %z654}655 656define ptr @ldrbu16_m128(ptr %x, ptr %y) {657; CHECK-LABEL: ldrbu16_m128:658; CHECK: @ %bb.0: @ %entry659; CHECK-NEXT: subs r0, #128660; CHECK-NEXT: vldrb.u16 q0, [r0]661; CHECK-NEXT: vstrh.16 q0, [r1]662; CHECK-NEXT: bx lr663entry:664 %z = getelementptr inbounds i8, ptr %x, i32 -128665 %0 = load <8 x i8>, ptr %z, align 1666 %1 = zext <8 x i8> %0 to <8 x i16>667 store <8 x i16> %1, ptr %y, align 2668 ret ptr %z669}670 671 672define ptr @ldrbs16_4(ptr %x, ptr %y) {673; CHECK-LABEL: ldrbs16_4:674; CHECK: @ %bb.0: @ %entry675; CHECK-NEXT: vldrb.s16 q0, [r0, #4]!676; CHECK-NEXT: vstrh.16 q0, [r1]677; CHECK-NEXT: bx lr678entry:679 %z = getelementptr inbounds i8, ptr %x, i32 4680 %0 = load <8 x i8>, ptr %z, align 1681 %1 = sext <8 x i8> %0 to <8 x i16>682 store <8 x i16> %1, ptr %y, align 2683 ret ptr %z684}685 686define ptr @ldrbs16_3(ptr %x, ptr %y) {687; CHECK-LABEL: ldrbs16_3:688; CHECK: @ %bb.0: @ %entry689; CHECK-NEXT: vldrb.s16 q0, [r0, #3]!690; CHECK-NEXT: vstrh.16 q0, [r1]691; CHECK-NEXT: bx lr692entry:693 %z = getelementptr inbounds i8, ptr %x, i32 3694 %0 = load <8 x i8>, ptr %z, align 1695 %1 = sext <8 x i8> %0 to <8 x i16>696 store <8 x i16> %1, ptr %y, align 2697 ret ptr %z698}699 700define ptr @ldrbs16_127(ptr %x, ptr %y) {701; CHECK-LABEL: ldrbs16_127:702; CHECK: @ %bb.0: @ %entry703; CHECK-NEXT: vldrb.s16 q0, [r0, #127]!704; CHECK-NEXT: vstrh.16 q0, [r1]705; CHECK-NEXT: bx lr706entry:707 %z = getelementptr inbounds i8, ptr %x, i32 127708 %0 = load <8 x i8>, ptr %z, align 1709 %1 = sext <8 x i8> %0 to <8 x i16>710 store <8 x i16> %1, ptr %y, align 2711 ret ptr %z712}713 714define ptr @ldrbs16_128(ptr %x, ptr %y) {715; CHECK-LABEL: ldrbs16_128:716; CHECK: @ %bb.0: @ %entry717; CHECK-NEXT: adds r0, #128718; CHECK-NEXT: vldrb.s16 q0, [r0]719; CHECK-NEXT: vstrh.16 q0, [r1]720; CHECK-NEXT: bx lr721entry:722 %z = getelementptr inbounds i8, ptr %x, i32 128723 %0 = load <8 x i8>, ptr %z, align 1724 %1 = sext <8 x i8> %0 to <8 x i16>725 store <8 x i16> %1, ptr %y, align 2726 ret ptr %z727}728 729define ptr @ldrbs16_m127(ptr %x, ptr %y) {730; CHECK-LABEL: ldrbs16_m127:731; CHECK: @ %bb.0: @ %entry732; CHECK-NEXT: vldrb.s16 q0, [r0, #-127]!733; CHECK-NEXT: vstrh.16 q0, [r1]734; CHECK-NEXT: bx lr735entry:736 %z = getelementptr inbounds i8, ptr %x, i32 -127737 %0 = load <8 x i8>, ptr %z, align 1738 %1 = sext <8 x i8> %0 to <8 x i16>739 store <8 x i16> %1, ptr %y, align 2740 ret ptr %z741}742 743define ptr @ldrbs16_m128(ptr %x, ptr %y) {744; CHECK-LABEL: ldrbs16_m128:745; CHECK: @ %bb.0: @ %entry746; CHECK-NEXT: subs r0, #128747; CHECK-NEXT: vldrb.s16 q0, [r0]748; CHECK-NEXT: vstrh.16 q0, [r1]749; CHECK-NEXT: bx lr750entry:751 %z = getelementptr inbounds i8, ptr %x, i32 -128752 %0 = load <8 x i8>, ptr %z, align 1753 %1 = sext <8 x i8> %0 to <8 x i16>754 store <8 x i16> %1, ptr %y, align 2755 ret ptr %z756}757 758 759define ptr @ldrbu8_4(ptr %x, ptr %y) {760; CHECK-LABEL: ldrbu8_4:761; CHECK: @ %bb.0: @ %entry762; CHECK-NEXT: vldrb.u8 q0, [r0, #4]!763; CHECK-NEXT: vstrb.8 q0, [r1]764; CHECK-NEXT: bx lr765entry:766 %z = getelementptr inbounds i8, ptr %x, i32 4767 %0 = load <16 x i8>, ptr %z, align 1768 store <16 x i8> %0, ptr %y, align 1769 ret ptr %z770}771 772define ptr @ldrbu8_3(ptr %x, ptr %y) {773; CHECK-LABEL: ldrbu8_3:774; CHECK: @ %bb.0: @ %entry775; CHECK-NEXT: vldrb.u8 q0, [r0, #3]!776; CHECK-NEXT: vstrb.8 q0, [r1]777; CHECK-NEXT: bx lr778entry:779 %z = getelementptr inbounds i8, ptr %x, i32 3780 %0 = load <16 x i8>, ptr %z, align 1781 store <16 x i8> %0, ptr %y, align 1782 ret ptr %z783}784 785define ptr @ldrbu8_127(ptr %x, ptr %y) {786; CHECK-LABEL: ldrbu8_127:787; CHECK: @ %bb.0: @ %entry788; CHECK-NEXT: vldrb.u8 q0, [r0, #127]!789; CHECK-NEXT: vstrb.8 q0, [r1]790; CHECK-NEXT: bx lr791entry:792 %z = getelementptr inbounds i8, ptr %x, i32 127793 %0 = load <16 x i8>, ptr %z, align 1794 store <16 x i8> %0, ptr %y, align 1795 ret ptr %z796}797 798define ptr @ldrbu8_128(ptr %x, ptr %y) {799; CHECK-LABEL: ldrbu8_128:800; CHECK: @ %bb.0: @ %entry801; CHECK-NEXT: adds r0, #128802; CHECK-NEXT: vldrb.u8 q0, [r0]803; CHECK-NEXT: vstrb.8 q0, [r1]804; CHECK-NEXT: bx lr805entry:806 %z = getelementptr inbounds i8, ptr %x, i32 128807 %0 = load <16 x i8>, ptr %z, align 1808 store <16 x i8> %0, ptr %y, align 1809 ret ptr %z810}811 812define ptr @ldrbu8_m127(ptr %x, ptr %y) {813; CHECK-LABEL: ldrbu8_m127:814; CHECK: @ %bb.0: @ %entry815; CHECK-NEXT: vldrb.u8 q0, [r0, #-127]!816; CHECK-NEXT: vstrb.8 q0, [r1]817; CHECK-NEXT: bx lr818entry:819 %z = getelementptr inbounds i8, ptr %x, i32 -127820 %0 = load <16 x i8>, ptr %z, align 1821 store <16 x i8> %0, ptr %y, align 1822 ret ptr %z823}824 825define ptr @ldrbu8_m128(ptr %x, ptr %y) {826; CHECK-LABEL: ldrbu8_m128:827; CHECK: @ %bb.0: @ %entry828; CHECK-NEXT: subs r0, #128829; CHECK-NEXT: vldrb.u8 q0, [r0]830; CHECK-NEXT: vstrb.8 q0, [r1]831; CHECK-NEXT: bx lr832entry:833 %z = getelementptr inbounds i8, ptr %x, i32 -128834 %0 = load <16 x i8>, ptr %z, align 1835 store <16 x i8> %0, ptr %y, align 1836 ret ptr %z837}838 839 840define ptr @ldrwf32_4(ptr %x, ptr %y) {841; CHECK-LABEL: ldrwf32_4:842; CHECK: @ %bb.0: @ %entry843; CHECK-NEXT: vldrw.u32 q0, [r0, #4]!844; CHECK-NEXT: vstrw.32 q0, [r1]845; CHECK-NEXT: bx lr846entry:847 %z = getelementptr inbounds i8, ptr %x, i32 4848 %0 = load <4 x float>, ptr %z, align 4849 store <4 x float> %0, ptr %y, align 4850 ret ptr %z851}852 853define ptr @ldrwf16_4(ptr %x, ptr %y) {854; CHECK-LABEL: ldrwf16_4:855; CHECK: @ %bb.0: @ %entry856; CHECK-NEXT: vldrh.u16 q0, [r0, #4]!857; CHECK-NEXT: vstrh.16 q0, [r1]858; CHECK-NEXT: bx lr859entry:860 %z = getelementptr inbounds i8, ptr %x, i32 4861 %0 = load <8 x half>, ptr %z, align 2862 store <8 x half> %0, ptr %y, align 2863 ret ptr %z864}865 866define ptr @ldrwi32_align1(ptr %x, ptr %y) {867; CHECK-LE-LABEL: ldrwi32_align1:868; CHECK-LE: @ %bb.0: @ %entry869; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]!870; CHECK-LE-NEXT: vstrw.32 q0, [r1]871; CHECK-LE-NEXT: bx lr872;873; CHECK-BE-LABEL: ldrwi32_align1:874; CHECK-BE: @ %bb.0: @ %entry875; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3]876; CHECK-BE-NEXT: adds r0, #3877; CHECK-BE-NEXT: vrev32.8 q0, q0878; CHECK-BE-NEXT: vstrw.32 q0, [r1]879; CHECK-BE-NEXT: bx lr880entry:881 %z = getelementptr inbounds i8, ptr %x, i32 3882 %0 = load <4 x i32>, ptr %z, align 1883 store <4 x i32> %0, ptr %y, align 4884 ret ptr %z885}886 887define ptr @ldrhi16_align1(ptr %x, ptr %y) {888; CHECK-LE-LABEL: ldrhi16_align1:889; CHECK-LE: @ %bb.0: @ %entry890; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]!891; CHECK-LE-NEXT: vstrh.16 q0, [r1]892; CHECK-LE-NEXT: bx lr893;894; CHECK-BE-LABEL: ldrhi16_align1:895; CHECK-BE: @ %bb.0: @ %entry896; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3]897; CHECK-BE-NEXT: adds r0, #3898; CHECK-BE-NEXT: vrev16.8 q0, q0899; CHECK-BE-NEXT: vstrh.16 q0, [r1]900; CHECK-BE-NEXT: bx lr901entry:902 %z = getelementptr inbounds i8, ptr %x, i32 3903 %0 = load <8 x i16>, ptr %z, align 1904 store <8 x i16> %0, ptr %y, align 2905 ret ptr %z906}907 908define ptr @ldrhi32_align1(ptr %x, ptr %y) {909; CHECK-LABEL: ldrhi32_align1:910; CHECK: @ %bb.0: @ %entry911; CHECK-NEXT: .pad #8912; CHECK-NEXT: sub sp, #8913; 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, sp918; CHECK-NEXT: vldrh.s32 q0, [r2]919; CHECK-NEXT: vstrw.32 q0, [r1]920; CHECK-NEXT: add sp, #8921; CHECK-NEXT: bx lr922entry:923 %z = getelementptr inbounds i8, ptr %x, i32 3924 %0 = load <4 x i16>, ptr %z, align 1925 %1 = sext <4 x i16> %0 to <4 x i32>926 store <4 x i32> %1, ptr %y, align 4927 ret ptr %z928}929 930define ptr @ldrf32_align1(ptr %x, ptr %y) {931; CHECK-LE-LABEL: ldrf32_align1:932; CHECK-LE: @ %bb.0: @ %entry933; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]!934; CHECK-LE-NEXT: vstrw.32 q0, [r1]935; CHECK-LE-NEXT: bx lr936;937; CHECK-BE-LABEL: ldrf32_align1:938; CHECK-BE: @ %bb.0: @ %entry939; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3]940; CHECK-BE-NEXT: adds r0, #3941; CHECK-BE-NEXT: vrev32.8 q0, q0942; CHECK-BE-NEXT: vstrw.32 q0, [r1]943; CHECK-BE-NEXT: bx lr944entry:945 %z = getelementptr inbounds i8, ptr %x, i32 3946 %0 = load <4 x float>, ptr %z, align 1947 store <4 x float> %0, ptr %y, align 4948 ret ptr %z949}950 951define ptr @ldrf16_align1(ptr %x, ptr %y) {952; CHECK-LE-LABEL: ldrf16_align1:953; CHECK-LE: @ %bb.0: @ %entry954; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]!955; CHECK-LE-NEXT: vstrh.16 q0, [r1]956; CHECK-LE-NEXT: bx lr957;958; CHECK-BE-LABEL: ldrf16_align1:959; CHECK-BE: @ %bb.0: @ %entry960; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3]961; CHECK-BE-NEXT: adds r0, #3962; CHECK-BE-NEXT: vrev16.8 q0, q0963; CHECK-BE-NEXT: vstrh.16 q0, [r1]964; CHECK-BE-NEXT: bx lr965entry:966 %z = getelementptr inbounds i8, ptr %x, i32 3967 %0 = load <8 x half>, ptr %z, align 1968 store <8 x half> %0, ptr %y, align 2969 ret ptr %z970}971 972define ptr @ldrh16_align8(ptr %x, ptr %y) {973; CHECK-LE-LABEL: ldrh16_align8:974; CHECK-LE: @ %bb.0: @ %entry975; CHECK-LE-NEXT: vldrw.u32 q0, [r0, #4]!976; CHECK-LE-NEXT: vstrh.16 q0, [r1]977; CHECK-LE-NEXT: bx lr978;979; CHECK-BE-LABEL: ldrh16_align8:980; CHECK-BE: @ %bb.0: @ %entry981; CHECK-BE-NEXT: vldrh.u16 q0, [r0, #4]!982; CHECK-BE-NEXT: vstrh.16 q0, [r1]983; CHECK-BE-NEXT: bx lr984entry:985 %z = getelementptr inbounds i8, ptr %x, i32 4986 %0 = load <8 x i16>, ptr %z, align 8987 store <8 x i16> %0, ptr %y, align 2988 ret ptr %z989}990 991 992 993 994 995define ptr @strw32_4(ptr %y, ptr %x) {996; CHECK-LE-LABEL: strw32_4:997; CHECK-LE: @ %bb.0: @ %entry998; CHECK-LE-NEXT: vldrw.u32 q0, [r1]999; CHECK-LE-NEXT: vstrb.8 q0, [r0, #4]!1000; CHECK-LE-NEXT: bx lr1001;1002; CHECK-BE-LABEL: strw32_4:1003; CHECK-BE: @ %bb.0: @ %entry1004; CHECK-BE-NEXT: vldrw.u32 q0, [r1]1005; CHECK-BE-NEXT: vstrw.32 q0, [r0, #4]!1006; CHECK-BE-NEXT: bx lr1007entry:1008 %z = getelementptr inbounds i8, ptr %y, i32 41009 %0 = load <4 x i32>, ptr %x, align 41010 store <4 x i32> %0, ptr %z, align 41011 ret ptr %z1012}1013 1014define ptr @strw32_3(ptr %y, ptr %x) {1015; CHECK-LE-LABEL: strw32_3:1016; CHECK-LE: @ %bb.0: @ %entry1017; CHECK-LE-NEXT: vldrw.u32 q0, [r1]1018; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]!1019; CHECK-LE-NEXT: bx lr1020;1021; CHECK-BE-LABEL: strw32_3:1022; CHECK-BE: @ %bb.0: @ %entry1023; CHECK-BE-NEXT: adds r0, #31024; CHECK-BE-NEXT: vldrw.u32 q0, [r1]1025; CHECK-BE-NEXT: vstrw.32 q0, [r0]1026; CHECK-BE-NEXT: bx lr1027entry:1028 %z = getelementptr inbounds i8, ptr %y, i32 31029 %0 = load <4 x i32>, ptr %x, align 41030 store <4 x i32> %0, ptr %z, align 41031 ret ptr %z1032}1033 1034define ptr @strw32_m4(ptr %y, ptr %x) {1035; CHECK-LE-LABEL: strw32_m4:1036; CHECK-LE: @ %bb.0: @ %entry1037; CHECK-LE-NEXT: vldrw.u32 q0, [r1]1038; CHECK-LE-NEXT: vstrb.8 q0, [r0, #-4]!1039; CHECK-LE-NEXT: bx lr1040;1041; CHECK-BE-LABEL: strw32_m4:1042; CHECK-BE: @ %bb.0: @ %entry1043; CHECK-BE-NEXT: vldrw.u32 q0, [r1]1044; CHECK-BE-NEXT: vstrw.32 q0, [r0, #-4]!1045; CHECK-BE-NEXT: bx lr1046entry:1047 %z = getelementptr inbounds i8, ptr %y, i32 -41048 %0 = load <4 x i32>, ptr %x, align 41049 store <4 x i32> %0, ptr %z, align 41050 ret ptr %z1051}1052 1053define ptr @strw32_508(ptr %y, ptr %x) {1054; CHECK-LABEL: strw32_508:1055; CHECK: @ %bb.0: @ %entry1056; CHECK-NEXT: vldrw.u32 q0, [r1]1057; CHECK-NEXT: vstrw.32 q0, [r0, #508]!1058; CHECK-NEXT: bx lr1059entry:1060 %z = getelementptr inbounds i8, ptr %y, i32 5081061 %0 = load <4 x i32>, ptr %x, align 41062 store <4 x i32> %0, ptr %z, align 41063 ret ptr %z1064}1065 1066define ptr @strw32_512(ptr %y, ptr %x) {1067; CHECK-LABEL: strw32_512:1068; CHECK: @ %bb.0: @ %entry1069; CHECK-NEXT: add.w r0, r0, #5121070; CHECK-NEXT: vldrw.u32 q0, [r1]1071; CHECK-NEXT: vstrw.32 q0, [r0]1072; CHECK-NEXT: bx lr1073entry:1074 %z = getelementptr inbounds i8, ptr %y, i32 5121075 %0 = load <4 x i32>, ptr %x, align 41076 store <4 x i32> %0, ptr %z, align 41077 ret ptr %z1078}1079 1080define ptr @strw32_m508(ptr %y, ptr %x) {1081; CHECK-LABEL: strw32_m508:1082; CHECK: @ %bb.0: @ %entry1083; CHECK-NEXT: vldrw.u32 q0, [r1]1084; CHECK-NEXT: vstrw.32 q0, [r0, #-508]!1085; CHECK-NEXT: bx lr1086entry:1087 %z = getelementptr inbounds i8, ptr %y, i32 -5081088 %0 = load <4 x i32>, ptr %x, align 41089 store <4 x i32> %0, ptr %z, align 41090 ret ptr %z1091}1092 1093define ptr @strw32_m512(ptr %y, ptr %x) {1094; CHECK-LABEL: strw32_m512:1095; CHECK: @ %bb.0: @ %entry1096; CHECK-NEXT: sub.w r0, r0, #5121097; CHECK-NEXT: vldrw.u32 q0, [r1]1098; CHECK-NEXT: vstrw.32 q0, [r0]1099; CHECK-NEXT: bx lr1100entry:1101 %z = getelementptr inbounds i8, ptr %y, i32 -5121102 %0 = load <4 x i32>, ptr %x, align 41103 store <4 x i32> %0, ptr %z, align 41104 ret ptr %z1105}1106 1107 1108define ptr @strh32_4(ptr %y, ptr %x) {1109; CHECK-LABEL: strh32_4:1110; CHECK: @ %bb.0: @ %entry1111; CHECK-NEXT: vldrh.u32 q0, [r1]1112; CHECK-NEXT: vstrh.32 q0, [r0, #4]!1113; CHECK-NEXT: bx lr1114entry:1115 %z = getelementptr inbounds i8, ptr %y, i32 41116 %0 = load <4 x i16>, ptr %x, align 21117 store <4 x i16> %0, ptr %z, align 21118 ret ptr %z1119}1120 1121define ptr @strh32_3(ptr %y, ptr %x) {1122; CHECK-LABEL: strh32_3:1123; CHECK: @ %bb.0: @ %entry1124; CHECK-NEXT: adds r0, #31125; CHECK-NEXT: vldrh.u32 q0, [r1]1126; CHECK-NEXT: vstrh.32 q0, [r0]1127; CHECK-NEXT: bx lr1128entry:1129 %z = getelementptr inbounds i8, ptr %y, i32 31130 %0 = load <4 x i16>, ptr %x, align 21131 store <4 x i16> %0, ptr %z, align 21132 ret ptr %z1133}1134 1135define ptr @strh32_2(ptr %y, ptr %x) {1136; CHECK-LABEL: strh32_2:1137; CHECK: @ %bb.0: @ %entry1138; CHECK-NEXT: vldrh.u32 q0, [r1]1139; CHECK-NEXT: vstrh.32 q0, [r0, #2]!1140; CHECK-NEXT: bx lr1141entry:1142 %z = getelementptr inbounds i8, ptr %y, i32 21143 %0 = load <4 x i16>, ptr %x, align 21144 store <4 x i16> %0, ptr %z, align 21145 ret ptr %z1146}1147 1148define ptr @strh32_254(ptr %y, ptr %x) {1149; CHECK-LABEL: strh32_254:1150; CHECK: @ %bb.0: @ %entry1151; CHECK-NEXT: vldrh.u32 q0, [r1]1152; CHECK-NEXT: vstrh.32 q0, [r0, #254]!1153; CHECK-NEXT: bx lr1154entry:1155 %z = getelementptr inbounds i8, ptr %y, i32 2541156 %0 = load <4 x i16>, ptr %x, align 21157 store <4 x i16> %0, ptr %z, align 21158 ret ptr %z1159}1160 1161define ptr @strh32_256(ptr %y, ptr %x) {1162; CHECK-LABEL: strh32_256:1163; CHECK: @ %bb.0: @ %entry1164; CHECK-NEXT: add.w r0, r0, #2561165; CHECK-NEXT: vldrh.u32 q0, [r1]1166; CHECK-NEXT: vstrh.32 q0, [r0]1167; CHECK-NEXT: bx lr1168entry:1169 %z = getelementptr inbounds i8, ptr %y, i32 2561170 %0 = load <4 x i16>, ptr %x, align 21171 store <4 x i16> %0, ptr %z, align 21172 ret ptr %z1173}1174 1175define ptr @strh32_m254(ptr %y, ptr %x) {1176; CHECK-LABEL: strh32_m254:1177; CHECK: @ %bb.0: @ %entry1178; CHECK-NEXT: vldrh.u32 q0, [r1]1179; CHECK-NEXT: vstrh.32 q0, [r0, #-254]!1180; CHECK-NEXT: bx lr1181entry:1182 %z = getelementptr inbounds i8, ptr %y, i32 -2541183 %0 = load <4 x i16>, ptr %x, align 21184 store <4 x i16> %0, ptr %z, align 21185 ret ptr %z1186}1187 1188define ptr @strh32_m256(ptr %y, ptr %x) {1189; CHECK-LABEL: strh32_m256:1190; CHECK: @ %bb.0: @ %entry1191; CHECK-NEXT: sub.w r0, r0, #2561192; CHECK-NEXT: vldrh.u32 q0, [r1]1193; CHECK-NEXT: vstrh.32 q0, [r0]1194; CHECK-NEXT: bx lr1195entry:1196 %z = getelementptr inbounds i8, ptr %y, i32 -2561197 %0 = load <4 x i16>, ptr %x, align 21198 store <4 x i16> %0, ptr %z, align 21199 ret ptr %z1200}1201 1202 1203define ptr @strh16_4(ptr %y, ptr %x) {1204; CHECK-LE-LABEL: strh16_4:1205; CHECK-LE: @ %bb.0: @ %entry1206; CHECK-LE-NEXT: vldrh.u16 q0, [r1]1207; CHECK-LE-NEXT: vstrb.8 q0, [r0, #4]!1208; CHECK-LE-NEXT: bx lr1209;1210; CHECK-BE-LABEL: strh16_4:1211; CHECK-BE: @ %bb.0: @ %entry1212; CHECK-BE-NEXT: vldrh.u16 q0, [r1]1213; CHECK-BE-NEXT: vstrh.16 q0, [r0, #4]!1214; CHECK-BE-NEXT: bx lr1215entry:1216 %z = getelementptr inbounds i8, ptr %y, i32 41217 %0 = load <8 x i16>, ptr %x, align 21218 store <8 x i16> %0, ptr %z, align 21219 ret ptr %z1220}1221 1222define ptr @strh16_3(ptr %y, ptr %x) {1223; CHECK-LE-LABEL: strh16_3:1224; CHECK-LE: @ %bb.0: @ %entry1225; CHECK-LE-NEXT: vldrh.u16 q0, [r1]1226; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]!1227; CHECK-LE-NEXT: bx lr1228;1229; CHECK-BE-LABEL: strh16_3:1230; CHECK-BE: @ %bb.0: @ %entry1231; CHECK-BE-NEXT: adds r0, #31232; CHECK-BE-NEXT: vldrh.u16 q0, [r1]1233; CHECK-BE-NEXT: vstrh.16 q0, [r0]1234; CHECK-BE-NEXT: bx lr1235entry:1236 %z = getelementptr inbounds i8, ptr %y, i32 31237 %0 = load <8 x i16>, ptr %x, align 21238 store <8 x i16> %0, ptr %z, align 21239 ret ptr %z1240}1241 1242define ptr @strh16_2(ptr %y, ptr %x) {1243; CHECK-LE-LABEL: strh16_2:1244; CHECK-LE: @ %bb.0: @ %entry1245; CHECK-LE-NEXT: vldrh.u16 q0, [r1]1246; CHECK-LE-NEXT: vstrb.8 q0, [r0, #2]!1247; CHECK-LE-NEXT: bx lr1248;1249; CHECK-BE-LABEL: strh16_2:1250; CHECK-BE: @ %bb.0: @ %entry1251; CHECK-BE-NEXT: vldrh.u16 q0, [r1]1252; CHECK-BE-NEXT: vstrh.16 q0, [r0, #2]!1253; CHECK-BE-NEXT: bx lr1254entry:1255 %z = getelementptr inbounds i8, ptr %y, i32 21256 %0 = load <8 x i16>, ptr %x, align 21257 store <8 x i16> %0, ptr %z, align 21258 ret ptr %z1259}1260 1261define ptr @strh16_254(ptr %y, ptr %x) {1262; CHECK-LABEL: strh16_254:1263; CHECK: @ %bb.0: @ %entry1264; CHECK-NEXT: vldrh.u16 q0, [r1]1265; CHECK-NEXT: vstrh.16 q0, [r0, #254]!1266; CHECK-NEXT: bx lr1267entry:1268 %z = getelementptr inbounds i8, ptr %y, i32 2541269 %0 = load <8 x i16>, ptr %x, align 21270 store <8 x i16> %0, ptr %z, align 21271 ret ptr %z1272}1273 1274define ptr @strh16_256(ptr %y, ptr %x) {1275; CHECK-LABEL: strh16_256:1276; CHECK: @ %bb.0: @ %entry1277; CHECK-NEXT: add.w r0, r0, #2561278; CHECK-NEXT: vldrh.u16 q0, [r1]1279; CHECK-NEXT: vstrh.16 q0, [r0]1280; CHECK-NEXT: bx lr1281entry:1282 %z = getelementptr inbounds i8, ptr %y, i32 2561283 %0 = load <8 x i16>, ptr %x, align 21284 store <8 x i16> %0, ptr %z, align 21285 ret ptr %z1286}1287 1288define ptr @strh16_m254(ptr %y, ptr %x) {1289; CHECK-LABEL: strh16_m254:1290; CHECK: @ %bb.0: @ %entry1291; CHECK-NEXT: vldrh.u16 q0, [r1]1292; CHECK-NEXT: vstrh.16 q0, [r0, #-254]!1293; CHECK-NEXT: bx lr1294entry:1295 %z = getelementptr inbounds i8, ptr %y, i32 -2541296 %0 = load <8 x i16>, ptr %x, align 21297 store <8 x i16> %0, ptr %z, align 21298 ret ptr %z1299}1300 1301define ptr @strh16_m256(ptr %y, ptr %x) {1302; CHECK-LABEL: strh16_m256:1303; CHECK: @ %bb.0: @ %entry1304; CHECK-NEXT: sub.w r0, r0, #2561305; CHECK-NEXT: vldrh.u16 q0, [r1]1306; CHECK-NEXT: vstrh.16 q0, [r0]1307; CHECK-NEXT: bx lr1308entry:1309 %z = getelementptr inbounds i8, ptr %y, i32 -2561310 %0 = load <8 x i16>, ptr %x, align 21311 store <8 x i16> %0, ptr %z, align 21312 ret ptr %z1313}1314 1315 1316define ptr @strb32_4(ptr %y, ptr %x) {1317; CHECK-LABEL: strb32_4:1318; CHECK: @ %bb.0: @ %entry1319; CHECK-NEXT: vldrb.u32 q0, [r1]1320; CHECK-NEXT: vstrb.32 q0, [r0, #4]!1321; CHECK-NEXT: bx lr1322entry:1323 %z = getelementptr inbounds i8, ptr %y, i32 41324 %0 = load <4 x i8>, ptr %x, align 11325 store <4 x i8> %0, ptr %z, align 11326 ret ptr %z1327}1328 1329define ptr @strb32_3(ptr %y, ptr %x) {1330; CHECK-LABEL: strb32_3:1331; CHECK: @ %bb.0: @ %entry1332; CHECK-NEXT: vldrb.u32 q0, [r1]1333; CHECK-NEXT: vstrb.32 q0, [r0, #3]!1334; CHECK-NEXT: bx lr1335entry:1336 %z = getelementptr inbounds i8, ptr %y, i32 31337 %0 = load <4 x i8>, ptr %x, align 11338 store <4 x i8> %0, ptr %z, align 11339 ret ptr %z1340}1341 1342define ptr @strb32_127(ptr %y, ptr %x) {1343; CHECK-LABEL: strb32_127:1344; CHECK: @ %bb.0: @ %entry1345; CHECK-NEXT: vldrb.u32 q0, [r1]1346; CHECK-NEXT: vstrb.32 q0, [r0, #127]!1347; CHECK-NEXT: bx lr1348entry:1349 %z = getelementptr inbounds i8, ptr %y, i32 1271350 %0 = load <4 x i8>, ptr %x, align 11351 store <4 x i8> %0, ptr %z, align 11352 ret ptr %z1353}1354 1355define ptr @strb32_128(ptr %y, ptr %x) {1356; CHECK-LABEL: strb32_128:1357; CHECK: @ %bb.0: @ %entry1358; CHECK-NEXT: adds r0, #1281359; CHECK-NEXT: vldrb.u32 q0, [r1]1360; CHECK-NEXT: vstrb.32 q0, [r0]1361; CHECK-NEXT: bx lr1362entry:1363 %z = getelementptr inbounds i8, ptr %y, i32 1281364 %0 = load <4 x i8>, ptr %x, align 11365 store <4 x i8> %0, ptr %z, align 11366 ret ptr %z1367}1368 1369define ptr @strb32_m127(ptr %y, ptr %x) {1370; CHECK-LABEL: strb32_m127:1371; CHECK: @ %bb.0: @ %entry1372; CHECK-NEXT: vldrb.u32 q0, [r1]1373; CHECK-NEXT: vstrb.32 q0, [r0, #-127]!1374; CHECK-NEXT: bx lr1375entry:1376 %z = getelementptr inbounds i8, ptr %y, i32 -1271377 %0 = load <4 x i8>, ptr %x, align 11378 store <4 x i8> %0, ptr %z, align 11379 ret ptr %z1380}1381 1382define ptr @strb32_m128(ptr %y, ptr %x) {1383; CHECK-LABEL: strb32_m128:1384; CHECK: @ %bb.0: @ %entry1385; CHECK-NEXT: subs r0, #1281386; CHECK-NEXT: vldrb.u32 q0, [r1]1387; CHECK-NEXT: vstrb.32 q0, [r0]1388; CHECK-NEXT: bx lr1389entry:1390 %z = getelementptr inbounds i8, ptr %y, i32 -1281391 %0 = load <4 x i8>, ptr %x, align 11392 store <4 x i8> %0, ptr %z, align 11393 ret ptr %z1394}1395 1396 1397define ptr @strb16_4(ptr %y, ptr %x) {1398; CHECK-LABEL: strb16_4:1399; CHECK: @ %bb.0: @ %entry1400; CHECK-NEXT: vldrb.u16 q0, [r1]1401; CHECK-NEXT: vstrb.16 q0, [r0, #4]!1402; CHECK-NEXT: bx lr1403entry:1404 %z = getelementptr inbounds i8, ptr %y, i32 41405 %0 = load <8 x i8>, ptr %x, align 11406 store <8 x i8> %0, ptr %z, align 11407 ret ptr %z1408}1409 1410define ptr @strb16_3(ptr %y, ptr %x) {1411; CHECK-LABEL: strb16_3:1412; CHECK: @ %bb.0: @ %entry1413; CHECK-NEXT: vldrb.u16 q0, [r1]1414; CHECK-NEXT: vstrb.16 q0, [r0, #3]!1415; CHECK-NEXT: bx lr1416entry:1417 %z = getelementptr inbounds i8, ptr %y, i32 31418 %0 = load <8 x i8>, ptr %x, align 11419 store <8 x i8> %0, ptr %z, align 11420 ret ptr %z1421}1422 1423define ptr @strb16_127(ptr %y, ptr %x) {1424; CHECK-LABEL: strb16_127:1425; CHECK: @ %bb.0: @ %entry1426; CHECK-NEXT: vldrb.u16 q0, [r1]1427; CHECK-NEXT: vstrb.16 q0, [r0, #127]!1428; CHECK-NEXT: bx lr1429entry:1430 %z = getelementptr inbounds i8, ptr %y, i32 1271431 %0 = load <8 x i8>, ptr %x, align 11432 store <8 x i8> %0, ptr %z, align 11433 ret ptr %z1434}1435 1436define ptr @strb16_128(ptr %y, ptr %x) {1437; CHECK-LABEL: strb16_128:1438; CHECK: @ %bb.0: @ %entry1439; CHECK-NEXT: adds r0, #1281440; CHECK-NEXT: vldrb.u16 q0, [r1]1441; CHECK-NEXT: vstrb.16 q0, [r0]1442; CHECK-NEXT: bx lr1443entry:1444 %z = getelementptr inbounds i8, ptr %y, i32 1281445 %0 = load <8 x i8>, ptr %x, align 11446 store <8 x i8> %0, ptr %z, align 11447 ret ptr %z1448}1449 1450define ptr @strb16_m127(ptr %y, ptr %x) {1451; CHECK-LABEL: strb16_m127:1452; CHECK: @ %bb.0: @ %entry1453; CHECK-NEXT: vldrb.u16 q0, [r1]1454; CHECK-NEXT: vstrb.16 q0, [r0, #-127]!1455; CHECK-NEXT: bx lr1456entry:1457 %z = getelementptr inbounds i8, ptr %y, i32 -1271458 %0 = load <8 x i8>, ptr %x, align 11459 store <8 x i8> %0, ptr %z, align 11460 ret ptr %z1461}1462 1463define ptr @strb16_m128(ptr %y, ptr %x) {1464; CHECK-LABEL: strb16_m128:1465; CHECK: @ %bb.0: @ %entry1466; CHECK-NEXT: subs r0, #1281467; CHECK-NEXT: vldrb.u16 q0, [r1]1468; CHECK-NEXT: vstrb.16 q0, [r0]1469; CHECK-NEXT: bx lr1470entry:1471 %z = getelementptr inbounds i8, ptr %y, i32 -1281472 %0 = load <8 x i8>, ptr %x, align 11473 store <8 x i8> %0, ptr %z, align 11474 ret ptr %z1475}1476 1477 1478define ptr @strb8_4(ptr %y, ptr %x) {1479; CHECK-LABEL: strb8_4:1480; CHECK: @ %bb.0: @ %entry1481; CHECK-NEXT: vldrb.u8 q0, [r1]1482; CHECK-NEXT: vstrb.8 q0, [r0, #4]!1483; CHECK-NEXT: bx lr1484entry:1485 %z = getelementptr inbounds i8, ptr %y, i32 41486 %0 = load <16 x i8>, ptr %x, align 11487 store <16 x i8> %0, ptr %z, align 11488 ret ptr %z1489}1490 1491define ptr @strb8_3(ptr %y, ptr %x) {1492; CHECK-LABEL: strb8_3:1493; CHECK: @ %bb.0: @ %entry1494; CHECK-NEXT: vldrb.u8 q0, [r1]1495; CHECK-NEXT: vstrb.8 q0, [r0, #3]!1496; CHECK-NEXT: bx lr1497entry:1498 %z = getelementptr inbounds i8, ptr %y, i32 31499 %0 = load <16 x i8>, ptr %x, align 11500 store <16 x i8> %0, ptr %z, align 11501 ret ptr %z1502}1503 1504define ptr @strb8_127(ptr %y, ptr %x) {1505; CHECK-LABEL: strb8_127:1506; CHECK: @ %bb.0: @ %entry1507; CHECK-NEXT: vldrb.u8 q0, [r1]1508; CHECK-NEXT: vstrb.8 q0, [r0, #127]!1509; CHECK-NEXT: bx lr1510entry:1511 %z = getelementptr inbounds i8, ptr %y, i32 1271512 %0 = load <16 x i8>, ptr %x, align 11513 store <16 x i8> %0, ptr %z, align 11514 ret ptr %z1515}1516 1517define ptr @strb8_128(ptr %y, ptr %x) {1518; CHECK-LABEL: strb8_128:1519; CHECK: @ %bb.0: @ %entry1520; CHECK-NEXT: adds r0, #1281521; CHECK-NEXT: vldrb.u8 q0, [r1]1522; CHECK-NEXT: vstrb.8 q0, [r0]1523; CHECK-NEXT: bx lr1524entry:1525 %z = getelementptr inbounds i8, ptr %y, i32 1281526 %0 = load <16 x i8>, ptr %x, align 11527 store <16 x i8> %0, ptr %z, align 11528 ret ptr %z1529}1530 1531define ptr @strb8_m127(ptr %y, ptr %x) {1532; CHECK-LABEL: strb8_m127:1533; CHECK: @ %bb.0: @ %entry1534; CHECK-NEXT: vldrb.u8 q0, [r1]1535; CHECK-NEXT: vstrb.8 q0, [r0, #-127]!1536; CHECK-NEXT: bx lr1537entry:1538 %z = getelementptr inbounds i8, ptr %y, i32 -1271539 %0 = load <16 x i8>, ptr %x, align 11540 store <16 x i8> %0, ptr %z, align 11541 ret ptr %z1542}1543 1544define ptr @strb8_m128(ptr %y, ptr %x) {1545; CHECK-LABEL: strb8_m128:1546; CHECK: @ %bb.0: @ %entry1547; CHECK-NEXT: subs r0, #1281548; CHECK-NEXT: vldrb.u8 q0, [r1]1549; CHECK-NEXT: vstrb.8 q0, [r0]1550; CHECK-NEXT: bx lr1551entry:1552 %z = getelementptr inbounds i8, ptr %y, i32 -1281553 %0 = load <16 x i8>, ptr %x, align 11554 store <16 x i8> %0, ptr %z, align 11555 ret ptr %z1556}1557 1558 1559define ptr @strf32_4(ptr %y, ptr %x) {1560; CHECK-LE-LABEL: strf32_4:1561; CHECK-LE: @ %bb.0: @ %entry1562; CHECK-LE-NEXT: vldrw.u32 q0, [r1]1563; CHECK-LE-NEXT: vstrb.8 q0, [r0, #4]!1564; CHECK-LE-NEXT: bx lr1565;1566; CHECK-BE-LABEL: strf32_4:1567; CHECK-BE: @ %bb.0: @ %entry1568; CHECK-BE-NEXT: vldrw.u32 q0, [r1]1569; CHECK-BE-NEXT: vstrw.32 q0, [r0, #4]!1570; CHECK-BE-NEXT: bx lr1571entry:1572 %z = getelementptr inbounds i8, ptr %y, i32 41573 %0 = load <4 x float>, ptr %x, align 41574 store <4 x float> %0, ptr %z, align 41575 ret ptr %z1576}1577 1578define ptr @strf16_4(ptr %y, ptr %x) {1579; CHECK-LE-LABEL: strf16_4:1580; CHECK-LE: @ %bb.0: @ %entry1581; CHECK-LE-NEXT: vldrh.u16 q0, [r1]1582; CHECK-LE-NEXT: vstrb.8 q0, [r0, #4]!1583; CHECK-LE-NEXT: bx lr1584;1585; CHECK-BE-LABEL: strf16_4:1586; CHECK-BE: @ %bb.0: @ %entry1587; CHECK-BE-NEXT: vldrh.u16 q0, [r1]1588; CHECK-BE-NEXT: vstrh.16 q0, [r0, #4]!1589; CHECK-BE-NEXT: bx lr1590entry:1591 %z = getelementptr inbounds i8, ptr %y, i32 41592 %0 = load <8 x half>, ptr %x, align 21593 store <8 x half> %0, ptr %z, align 21594 ret ptr %z1595}1596 1597define ptr @strwi32_align1(ptr %y, ptr %x) {1598; CHECK-LE-LABEL: strwi32_align1:1599; CHECK-LE: @ %bb.0: @ %entry1600; CHECK-LE-NEXT: vldrw.u32 q0, [r1]1601; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]!1602; CHECK-LE-NEXT: bx lr1603;1604; CHECK-BE-LABEL: strwi32_align1:1605; CHECK-BE: @ %bb.0: @ %entry1606; CHECK-BE-NEXT: vldrw.u32 q0, [r1]1607; CHECK-BE-NEXT: vrev32.8 q0, q01608; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3]1609; CHECK-BE-NEXT: adds r0, #31610; CHECK-BE-NEXT: bx lr1611entry:1612 %z = getelementptr inbounds i8, ptr %y, i32 31613 %0 = load <4 x i32>, ptr %x, align 41614 store <4 x i32> %0, ptr %z, align 11615 ret ptr %z1616}1617 1618define ptr @strhi16_align1(ptr %y, ptr %x) {1619; CHECK-LE-LABEL: strhi16_align1:1620; CHECK-LE: @ %bb.0: @ %entry1621; CHECK-LE-NEXT: vldrh.u16 q0, [r1]1622; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]!1623; CHECK-LE-NEXT: bx lr1624;1625; CHECK-BE-LABEL: strhi16_align1:1626; CHECK-BE: @ %bb.0: @ %entry1627; CHECK-BE-NEXT: vldrh.u16 q0, [r1]1628; CHECK-BE-NEXT: vrev16.8 q0, q01629; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3]1630; CHECK-BE-NEXT: adds r0, #31631; CHECK-BE-NEXT: bx lr1632entry:1633 %z = getelementptr inbounds i8, ptr %y, i32 31634 %0 = load <8 x i16>, ptr %x, align 21635 store <8 x i16> %0, ptr %z, align 11636 ret ptr %z1637}1638 1639define ptr @strhi32_align1(ptr %y, ptr %x) {1640; CHECK-LABEL: strhi32_align1:1641; CHECK: @ %bb.0: @ %entry1642; CHECK-NEXT: .pad #81643; CHECK-NEXT: sub sp, #81644; CHECK-NEXT: vldrw.u32 q0, [r1]1645; CHECK-NEXT: mov r1, sp1646; 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, #81651; CHECK-NEXT: bx lr1652entry:1653 %z = getelementptr inbounds i8, ptr %y, i32 31654 %0 = load <4 x i32>, ptr %x, align 41655 %1 = trunc <4 x i32> %0 to <4 x i16>1656 store <4 x i16> %1, ptr %z, align 11657 ret ptr %z1658}1659 1660define ptr @strf32_align1(ptr %y, ptr %x) {1661; CHECK-LE-LABEL: strf32_align1:1662; CHECK-LE: @ %bb.0: @ %entry1663; CHECK-LE-NEXT: vldrw.u32 q0, [r1]1664; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]!1665; CHECK-LE-NEXT: bx lr1666;1667; CHECK-BE-LABEL: strf32_align1:1668; CHECK-BE: @ %bb.0: @ %entry1669; CHECK-BE-NEXT: vldrw.u32 q0, [r1]1670; CHECK-BE-NEXT: vrev32.8 q0, q01671; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3]1672; CHECK-BE-NEXT: adds r0, #31673; CHECK-BE-NEXT: bx lr1674entry:1675 %z = getelementptr inbounds i8, ptr %y, i32 31676 %0 = load <4 x float>, ptr %x, align 41677 store <4 x float> %0, ptr %z, align 11678 ret ptr %z1679}1680 1681define ptr @strf16_align1(ptr %y, ptr %x) {1682; CHECK-LE-LABEL: strf16_align1:1683; CHECK-LE: @ %bb.0: @ %entry1684; CHECK-LE-NEXT: vldrh.u16 q0, [r1]1685; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]!1686; CHECK-LE-NEXT: bx lr1687;1688; CHECK-BE-LABEL: strf16_align1:1689; CHECK-BE: @ %bb.0: @ %entry1690; CHECK-BE-NEXT: vldrh.u16 q0, [r1]1691; CHECK-BE-NEXT: vrev16.8 q0, q01692; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3]1693; CHECK-BE-NEXT: adds r0, #31694; CHECK-BE-NEXT: bx lr1695entry:1696 %z = getelementptr inbounds i8, ptr %y, i32 31697 %0 = load <8 x half>, ptr %x, align 21698 store <8 x half> %0, ptr %z, align 11699 ret ptr %z1700}1701 1702define ptr @strf16_align8(ptr %y, ptr %x) {1703; CHECK-LE-LABEL: strf16_align8:1704; CHECK-LE: @ %bb.0: @ %entry1705; CHECK-LE-NEXT: vldrh.u16 q0, [r1]1706; CHECK-LE-NEXT: vstrb.8 q0, [r0, #16]!1707; CHECK-LE-NEXT: bx lr1708;1709; CHECK-BE-LABEL: strf16_align8:1710; CHECK-BE: @ %bb.0: @ %entry1711; CHECK-BE-NEXT: vldrh.u16 q0, [r1]1712; CHECK-BE-NEXT: vstrh.16 q0, [r0, #16]!1713; CHECK-BE-NEXT: bx lr1714entry:1715 %z = getelementptr inbounds i8, ptr %y, i32 161716 %0 = load <8 x i16>, ptr %x, align 21717 store <8 x i16> %0, ptr %z, align 81718 ret ptr %z1719}1720