1651 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 %x16}17 18define ptr @ldrwu32_3(ptr %x, ptr %y) {19; CHECK-LABEL: ldrwu32_3:20; CHECK: @ %bb.0: @ %entry21; CHECK-NEXT: adds r2, r0, #322; CHECK-NEXT: vldrw.u32 q0, [r2]23; CHECK-NEXT: vstrw.32 q0, [r1]24; CHECK-NEXT: bx lr25entry:26 %z = getelementptr inbounds i8, ptr %x, i32 327 %0 = load <4 x i32>, ptr %z, align 428 store <4 x i32> %0, ptr %y, align 429 ret ptr %x30}31 32define ptr @ldrwu32_m4(ptr %x, ptr %y) {33; CHECK-LABEL: ldrwu32_m4:34; CHECK: @ %bb.0: @ %entry35; CHECK-NEXT: vldrw.u32 q0, [r0, #-4]36; CHECK-NEXT: vstrw.32 q0, [r1]37; CHECK-NEXT: bx lr38entry:39 %z = getelementptr inbounds i8, ptr %x, i32 -440 %0 = load <4 x i32>, ptr %z, align 441 store <4 x i32> %0, ptr %y, align 442 ret ptr %x43}44 45define ptr @ldrwu32_508(ptr %x, ptr %y) {46; CHECK-LABEL: ldrwu32_508:47; CHECK: @ %bb.0: @ %entry48; CHECK-NEXT: vldrw.u32 q0, [r0, #508]49; CHECK-NEXT: vstrw.32 q0, [r1]50; CHECK-NEXT: bx lr51entry:52 %z = getelementptr inbounds i8, ptr %x, i32 50853 %0 = load <4 x i32>, ptr %z, align 454 store <4 x i32> %0, ptr %y, align 455 ret ptr %x56}57 58define ptr @ldrwu32_512(ptr %x, ptr %y) {59; CHECK-LABEL: ldrwu32_512:60; CHECK: @ %bb.0: @ %entry61; CHECK-NEXT: add.w r2, r0, #51262; CHECK-NEXT: vldrw.u32 q0, [r2]63; CHECK-NEXT: vstrw.32 q0, [r1]64; CHECK-NEXT: bx lr65entry:66 %z = getelementptr inbounds i8, ptr %x, i32 51267 %0 = load <4 x i32>, ptr %z, align 468 store <4 x i32> %0, ptr %y, align 469 ret ptr %x70}71 72define ptr @ldrwu32_m508(ptr %x, ptr %y) {73; CHECK-LABEL: ldrwu32_m508:74; CHECK: @ %bb.0: @ %entry75; CHECK-NEXT: vldrw.u32 q0, [r0, #-508]76; CHECK-NEXT: vstrw.32 q0, [r1]77; CHECK-NEXT: bx lr78entry:79 %z = getelementptr inbounds i8, ptr %x, i32 -50880 %0 = load <4 x i32>, ptr %z, align 481 store <4 x i32> %0, ptr %y, align 482 ret ptr %x83}84 85define ptr @ldrwu32_m512(ptr %x, ptr %y) {86; CHECK-LABEL: ldrwu32_m512:87; CHECK: @ %bb.0: @ %entry88; CHECK-NEXT: sub.w r2, r0, #51289; CHECK-NEXT: vldrw.u32 q0, [r2]90; CHECK-NEXT: vstrw.32 q0, [r1]91; CHECK-NEXT: bx lr92entry:93 %z = getelementptr inbounds i8, ptr %x, i32 -51294 %0 = load <4 x i32>, ptr %z, align 495 store <4 x i32> %0, ptr %y, align 496 ret ptr %x97}98 99 100define ptr @ldrhu32_4(ptr %x, ptr %y) {101; CHECK-LABEL: ldrhu32_4:102; CHECK: @ %bb.0: @ %entry103; CHECK-NEXT: vldrh.u32 q0, [r0, #4]104; CHECK-NEXT: vstrw.32 q0, [r1]105; CHECK-NEXT: bx lr106entry:107 %z = getelementptr inbounds i8, ptr %x, i32 4108 %0 = load <4 x i16>, ptr %z, align 2109 %1 = zext <4 x i16> %0 to <4 x i32>110 store <4 x i32> %1, ptr %y, align 4111 ret ptr %x112}113 114define ptr @ldrhu32_3(ptr %x, ptr %y) {115; CHECK-LABEL: ldrhu32_3:116; CHECK: @ %bb.0: @ %entry117; CHECK-NEXT: adds r2, r0, #3118; CHECK-NEXT: vldrh.u32 q0, [r2]119; CHECK-NEXT: vstrw.32 q0, [r1]120; CHECK-NEXT: bx lr121entry:122 %z = getelementptr inbounds i8, ptr %x, i32 3123 %0 = load <4 x i16>, ptr %z, align 2124 %1 = zext <4 x i16> %0 to <4 x i32>125 store <4 x i32> %1, ptr %y, align 4126 ret ptr %x127}128 129define ptr @ldrhu32_2(ptr %x, ptr %y) {130; CHECK-LABEL: ldrhu32_2:131; CHECK: @ %bb.0: @ %entry132; CHECK-NEXT: vldrh.u32 q0, [r0, #2]133; CHECK-NEXT: vstrw.32 q0, [r1]134; CHECK-NEXT: bx lr135entry:136 %z = getelementptr inbounds i8, ptr %x, i32 2137 %0 = load <4 x i16>, ptr %z, align 2138 %1 = zext <4 x i16> %0 to <4 x i32>139 store <4 x i32> %1, ptr %y, align 4140 ret ptr %x141}142 143define ptr @ldrhu32_254(ptr %x, ptr %y) {144; CHECK-LABEL: ldrhu32_254:145; CHECK: @ %bb.0: @ %entry146; CHECK-NEXT: vldrh.u32 q0, [r0, #254]147; CHECK-NEXT: vstrw.32 q0, [r1]148; CHECK-NEXT: bx lr149entry:150 %z = getelementptr inbounds i8, ptr %x, i32 254151 %0 = load <4 x i16>, ptr %z, align 2152 %1 = zext <4 x i16> %0 to <4 x i32>153 store <4 x i32> %1, ptr %y, align 4154 ret ptr %x155}156 157define ptr @ldrhu32_256(ptr %x, ptr %y) {158; CHECK-LABEL: ldrhu32_256:159; CHECK: @ %bb.0: @ %entry160; CHECK-NEXT: add.w r2, r0, #256161; CHECK-NEXT: vldrh.u32 q0, [r2]162; CHECK-NEXT: vstrw.32 q0, [r1]163; CHECK-NEXT: bx lr164entry:165 %z = getelementptr inbounds i8, ptr %x, i32 256166 %0 = load <4 x i16>, ptr %z, align 2167 %1 = zext <4 x i16> %0 to <4 x i32>168 store <4 x i32> %1, ptr %y, align 4169 ret ptr %x170}171 172define ptr @ldrhu32_m254(ptr %x, ptr %y) {173; CHECK-LABEL: ldrhu32_m254:174; CHECK: @ %bb.0: @ %entry175; CHECK-NEXT: vldrh.u32 q0, [r0, #-254]176; CHECK-NEXT: vstrw.32 q0, [r1]177; CHECK-NEXT: bx lr178entry:179 %z = getelementptr inbounds i8, ptr %x, i32 -254180 %0 = load <4 x i16>, ptr %z, align 2181 %1 = zext <4 x i16> %0 to <4 x i32>182 store <4 x i32> %1, ptr %y, align 4183 ret ptr %x184}185 186define ptr @ldrhu32_m256(ptr %x, ptr %y) {187; CHECK-LABEL: ldrhu32_m256:188; CHECK: @ %bb.0: @ %entry189; CHECK-NEXT: sub.w r2, r0, #256190; CHECK-NEXT: vldrh.u32 q0, [r2]191; CHECK-NEXT: vstrw.32 q0, [r1]192; CHECK-NEXT: bx lr193entry:194 %z = getelementptr inbounds i8, ptr %x, i32 -256195 %0 = load <4 x i16>, ptr %z, align 2196 %1 = zext <4 x i16> %0 to <4 x i32>197 store <4 x i32> %1, ptr %y, align 4198 ret ptr %x199}200 201 202define ptr @ldrhs32_4(ptr %x, ptr %y) {203; CHECK-LABEL: ldrhs32_4:204; CHECK: @ %bb.0: @ %entry205; CHECK-NEXT: vldrh.s32 q0, [r0, #4]206; CHECK-NEXT: vstrw.32 q0, [r1]207; CHECK-NEXT: bx lr208entry:209 %z = getelementptr inbounds i8, ptr %x, i32 4210 %0 = load <4 x i16>, ptr %z, align 2211 %1 = sext <4 x i16> %0 to <4 x i32>212 store <4 x i32> %1, ptr %y, align 4213 ret ptr %x214}215 216define ptr @ldrhs32_3(ptr %x, ptr %y) {217; CHECK-LABEL: ldrhs32_3:218; CHECK: @ %bb.0: @ %entry219; CHECK-NEXT: adds r2, r0, #3220; CHECK-NEXT: vldrh.s32 q0, [r2]221; CHECK-NEXT: vstrw.32 q0, [r1]222; CHECK-NEXT: bx lr223entry:224 %z = getelementptr inbounds i8, ptr %x, i32 3225 %0 = load <4 x i16>, ptr %z, align 2226 %1 = sext <4 x i16> %0 to <4 x i32>227 store <4 x i32> %1, ptr %y, align 4228 ret ptr %x229}230 231define ptr @ldrhs32_2(ptr %x, ptr %y) {232; CHECK-LABEL: ldrhs32_2:233; CHECK: @ %bb.0: @ %entry234; CHECK-NEXT: vldrh.s32 q0, [r0, #2]235; CHECK-NEXT: vstrw.32 q0, [r1]236; CHECK-NEXT: bx lr237entry:238 %z = getelementptr inbounds i8, ptr %x, i32 2239 %0 = load <4 x i16>, ptr %z, align 2240 %1 = sext <4 x i16> %0 to <4 x i32>241 store <4 x i32> %1, ptr %y, align 4242 ret ptr %x243}244 245define ptr @ldrhs32_254(ptr %x, ptr %y) {246; CHECK-LABEL: ldrhs32_254:247; CHECK: @ %bb.0: @ %entry248; CHECK-NEXT: vldrh.s32 q0, [r0, #254]249; CHECK-NEXT: vstrw.32 q0, [r1]250; CHECK-NEXT: bx lr251entry:252 %z = getelementptr inbounds i8, ptr %x, i32 254253 %0 = load <4 x i16>, ptr %z, align 2254 %1 = sext <4 x i16> %0 to <4 x i32>255 store <4 x i32> %1, ptr %y, align 4256 ret ptr %x257}258 259define ptr @ldrhs32_256(ptr %x, ptr %y) {260; CHECK-LABEL: ldrhs32_256:261; CHECK: @ %bb.0: @ %entry262; CHECK-NEXT: add.w r2, r0, #256263; CHECK-NEXT: vldrh.s32 q0, [r2]264; CHECK-NEXT: vstrw.32 q0, [r1]265; CHECK-NEXT: bx lr266entry:267 %z = getelementptr inbounds i8, ptr %x, i32 256268 %0 = load <4 x i16>, ptr %z, align 2269 %1 = sext <4 x i16> %0 to <4 x i32>270 store <4 x i32> %1, ptr %y, align 4271 ret ptr %x272}273 274define ptr @ldrhs32_m254(ptr %x, ptr %y) {275; CHECK-LABEL: ldrhs32_m254:276; CHECK: @ %bb.0: @ %entry277; CHECK-NEXT: vldrh.s32 q0, [r0, #-254]278; CHECK-NEXT: vstrw.32 q0, [r1]279; CHECK-NEXT: bx lr280entry:281 %z = getelementptr inbounds i8, ptr %x, i32 -254282 %0 = load <4 x i16>, ptr %z, align 2283 %1 = sext <4 x i16> %0 to <4 x i32>284 store <4 x i32> %1, ptr %y, align 4285 ret ptr %x286}287 288define ptr @ldrhs32_m256(ptr %x, ptr %y) {289; CHECK-LABEL: ldrhs32_m256:290; CHECK: @ %bb.0: @ %entry291; CHECK-NEXT: sub.w r2, r0, #256292; CHECK-NEXT: vldrh.s32 q0, [r2]293; CHECK-NEXT: vstrw.32 q0, [r1]294; CHECK-NEXT: bx lr295entry:296 %z = getelementptr inbounds i8, ptr %x, i32 -256297 %0 = load <4 x i16>, ptr %z, align 2298 %1 = sext <4 x i16> %0 to <4 x i32>299 store <4 x i32> %1, ptr %y, align 4300 ret ptr %x301}302 303 304define ptr @ldrhu16_4(ptr %x, ptr %y) {305; CHECK-LABEL: ldrhu16_4:306; CHECK: @ %bb.0: @ %entry307; CHECK-NEXT: vldrh.u16 q0, [r0, #4]308; CHECK-NEXT: vstrh.16 q0, [r1]309; CHECK-NEXT: bx lr310entry:311 %z = getelementptr inbounds i8, ptr %x, i32 4312 %0 = load <8 x i16>, ptr %z, align 2313 store <8 x i16> %0, ptr %y, align 2314 ret ptr %x315}316 317define ptr @ldrhu16_3(ptr %x, ptr %y) {318; CHECK-LABEL: ldrhu16_3:319; CHECK: @ %bb.0: @ %entry320; CHECK-NEXT: adds r2, r0, #3321; CHECK-NEXT: vldrh.u16 q0, [r2]322; CHECK-NEXT: vstrh.16 q0, [r1]323; CHECK-NEXT: bx lr324entry:325 %z = getelementptr inbounds i8, ptr %x, i32 3326 %0 = load <8 x i16>, ptr %z, align 2327 store <8 x i16> %0, ptr %y, align 2328 ret ptr %x329}330 331define ptr @ldrhu16_2(ptr %x, ptr %y) {332; CHECK-LABEL: ldrhu16_2:333; CHECK: @ %bb.0: @ %entry334; CHECK-NEXT: vldrh.u16 q0, [r0, #2]335; CHECK-NEXT: vstrh.16 q0, [r1]336; CHECK-NEXT: bx lr337entry:338 %z = getelementptr inbounds i8, ptr %x, i32 2339 %0 = load <8 x i16>, ptr %z, align 2340 store <8 x i16> %0, ptr %y, align 2341 ret ptr %x342}343 344define ptr @ldrhu16_254(ptr %x, ptr %y) {345; CHECK-LABEL: ldrhu16_254:346; CHECK: @ %bb.0: @ %entry347; CHECK-NEXT: vldrh.u16 q0, [r0, #254]348; CHECK-NEXT: vstrh.16 q0, [r1]349; CHECK-NEXT: bx lr350entry:351 %z = getelementptr inbounds i8, ptr %x, i32 254352 %0 = load <8 x i16>, ptr %z, align 2353 store <8 x i16> %0, ptr %y, align 2354 ret ptr %x355}356 357define ptr @ldrhu16_256(ptr %x, ptr %y) {358; CHECK-LABEL: ldrhu16_256:359; CHECK: @ %bb.0: @ %entry360; CHECK-NEXT: add.w r2, r0, #256361; CHECK-NEXT: vldrh.u16 q0, [r2]362; CHECK-NEXT: vstrh.16 q0, [r1]363; CHECK-NEXT: bx lr364entry:365 %z = getelementptr inbounds i8, ptr %x, i32 256366 %0 = load <8 x i16>, ptr %z, align 2367 store <8 x i16> %0, ptr %y, align 2368 ret ptr %x369}370 371define ptr @ldrhu16_m254(ptr %x, ptr %y) {372; CHECK-LABEL: ldrhu16_m254:373; CHECK: @ %bb.0: @ %entry374; CHECK-NEXT: vldrh.u16 q0, [r0, #-254]375; CHECK-NEXT: vstrh.16 q0, [r1]376; CHECK-NEXT: bx lr377entry:378 %z = getelementptr inbounds i8, ptr %x, i32 -254379 %0 = load <8 x i16>, ptr %z, align 2380 store <8 x i16> %0, ptr %y, align 2381 ret ptr %x382}383 384define ptr @ldrhu16_m256(ptr %x, ptr %y) {385; CHECK-LABEL: ldrhu16_m256:386; CHECK: @ %bb.0: @ %entry387; CHECK-NEXT: sub.w r2, r0, #256388; CHECK-NEXT: vldrh.u16 q0, [r2]389; CHECK-NEXT: vstrh.16 q0, [r1]390; CHECK-NEXT: bx lr391entry:392 %z = getelementptr inbounds i8, ptr %x, i32 -256393 %0 = load <8 x i16>, ptr %z, align 2394 store <8 x i16> %0, ptr %y, align 2395 ret ptr %x396}397 398 399define ptr @ldrbu32_4(ptr %x, ptr %y) {400; CHECK-LABEL: ldrbu32_4:401; CHECK: @ %bb.0: @ %entry402; CHECK-NEXT: vldrb.u32 q0, [r0, #4]403; CHECK-NEXT: vstrw.32 q0, [r1]404; CHECK-NEXT: bx lr405entry:406 %z = getelementptr inbounds i8, ptr %x, i32 4407 %0 = load <4 x i8>, ptr %z, align 1408 %1 = zext <4 x i8> %0 to <4 x i32>409 store <4 x i32> %1, ptr %y, align 4410 ret ptr %x411}412 413define ptr @ldrbu32_3(ptr %x, ptr %y) {414; CHECK-LABEL: ldrbu32_3:415; CHECK: @ %bb.0: @ %entry416; CHECK-NEXT: vldrb.u32 q0, [r0, #3]417; CHECK-NEXT: vstrw.32 q0, [r1]418; CHECK-NEXT: bx lr419entry:420 %z = getelementptr inbounds i8, ptr %x, i32 3421 %0 = load <4 x i8>, ptr %z, align 1422 %1 = zext <4 x i8> %0 to <4 x i32>423 store <4 x i32> %1, ptr %y, align 4424 ret ptr %x425}426 427define ptr @ldrbu32_127(ptr %x, ptr %y) {428; CHECK-LABEL: ldrbu32_127:429; CHECK: @ %bb.0: @ %entry430; CHECK-NEXT: vldrb.u32 q0, [r0, #127]431; CHECK-NEXT: vstrw.32 q0, [r1]432; CHECK-NEXT: bx lr433entry:434 %z = getelementptr inbounds i8, ptr %x, i32 127435 %0 = load <4 x i8>, ptr %z, align 1436 %1 = zext <4 x i8> %0 to <4 x i32>437 store <4 x i32> %1, ptr %y, align 4438 ret ptr %x439}440 441define ptr @ldrbu32_128(ptr %x, ptr %y) {442; CHECK-LABEL: ldrbu32_128:443; CHECK: @ %bb.0: @ %entry444; CHECK-NEXT: add.w r2, r0, #128445; CHECK-NEXT: vldrb.u32 q0, [r2]446; CHECK-NEXT: vstrw.32 q0, [r1]447; CHECK-NEXT: bx lr448entry:449 %z = getelementptr inbounds i8, ptr %x, i32 128450 %0 = load <4 x i8>, ptr %z, align 1451 %1 = zext <4 x i8> %0 to <4 x i32>452 store <4 x i32> %1, ptr %y, align 4453 ret ptr %x454}455 456define ptr @ldrbu32_m127(ptr %x, ptr %y) {457; CHECK-LABEL: ldrbu32_m127:458; CHECK: @ %bb.0: @ %entry459; CHECK-NEXT: vldrb.u32 q0, [r0, #-127]460; CHECK-NEXT: vstrw.32 q0, [r1]461; CHECK-NEXT: bx lr462entry:463 %z = getelementptr inbounds i8, ptr %x, i32 -127464 %0 = load <4 x i8>, ptr %z, align 1465 %1 = zext <4 x i8> %0 to <4 x i32>466 store <4 x i32> %1, ptr %y, align 4467 ret ptr %x468}469 470define ptr @ldrbu32_m128(ptr %x, ptr %y) {471; CHECK-LABEL: ldrbu32_m128:472; CHECK: @ %bb.0: @ %entry473; CHECK-NEXT: sub.w r2, r0, #128474; CHECK-NEXT: vldrb.u32 q0, [r2]475; CHECK-NEXT: vstrw.32 q0, [r1]476; CHECK-NEXT: bx lr477entry:478 %z = getelementptr inbounds i8, ptr %x, i32 -128479 %0 = load <4 x i8>, ptr %z, align 1480 %1 = zext <4 x i8> %0 to <4 x i32>481 store <4 x i32> %1, ptr %y, align 4482 ret ptr %x483}484 485 486define ptr @ldrbs32_4(ptr %x, ptr %y) {487; CHECK-LABEL: ldrbs32_4:488; CHECK: @ %bb.0: @ %entry489; CHECK-NEXT: vldrb.s32 q0, [r0, #4]490; CHECK-NEXT: vstrw.32 q0, [r1]491; CHECK-NEXT: bx lr492entry:493 %z = getelementptr inbounds i8, ptr %x, i32 4494 %0 = load <4 x i8>, ptr %z, align 1495 %1 = sext <4 x i8> %0 to <4 x i32>496 store <4 x i32> %1, ptr %y, align 4497 ret ptr %x498}499 500define ptr @ldrbs32_3(ptr %x, ptr %y) {501; CHECK-LABEL: ldrbs32_3:502; CHECK: @ %bb.0: @ %entry503; CHECK-NEXT: vldrb.s32 q0, [r0, #3]504; CHECK-NEXT: vstrw.32 q0, [r1]505; CHECK-NEXT: bx lr506entry:507 %z = getelementptr inbounds i8, ptr %x, i32 3508 %0 = load <4 x i8>, ptr %z, align 1509 %1 = sext <4 x i8> %0 to <4 x i32>510 store <4 x i32> %1, ptr %y, align 4511 ret ptr %x512}513 514define ptr @ldrbs32_127(ptr %x, ptr %y) {515; CHECK-LABEL: ldrbs32_127:516; CHECK: @ %bb.0: @ %entry517; CHECK-NEXT: vldrb.s32 q0, [r0, #127]518; CHECK-NEXT: vstrw.32 q0, [r1]519; CHECK-NEXT: bx lr520entry:521 %z = getelementptr inbounds i8, ptr %x, i32 127522 %0 = load <4 x i8>, ptr %z, align 1523 %1 = sext <4 x i8> %0 to <4 x i32>524 store <4 x i32> %1, ptr %y, align 4525 ret ptr %x526}527 528define ptr @ldrbs32_128(ptr %x, ptr %y) {529; CHECK-LABEL: ldrbs32_128:530; CHECK: @ %bb.0: @ %entry531; CHECK-NEXT: add.w r2, r0, #128532; CHECK-NEXT: vldrb.s32 q0, [r2]533; CHECK-NEXT: vstrw.32 q0, [r1]534; CHECK-NEXT: bx lr535entry:536 %z = getelementptr inbounds i8, ptr %x, i32 128537 %0 = load <4 x i8>, ptr %z, align 1538 %1 = sext <4 x i8> %0 to <4 x i32>539 store <4 x i32> %1, ptr %y, align 4540 ret ptr %x541}542 543define ptr @ldrbs32_m127(ptr %x, ptr %y) {544; CHECK-LABEL: ldrbs32_m127:545; CHECK: @ %bb.0: @ %entry546; CHECK-NEXT: vldrb.s32 q0, [r0, #-127]547; CHECK-NEXT: vstrw.32 q0, [r1]548; CHECK-NEXT: bx lr549entry:550 %z = getelementptr inbounds i8, ptr %x, i32 -127551 %0 = load <4 x i8>, ptr %z, align 1552 %1 = sext <4 x i8> %0 to <4 x i32>553 store <4 x i32> %1, ptr %y, align 4554 ret ptr %x555}556 557define ptr @ldrbs32_m128(ptr %x, ptr %y) {558; CHECK-LABEL: ldrbs32_m128:559; CHECK: @ %bb.0: @ %entry560; CHECK-NEXT: sub.w r2, r0, #128561; CHECK-NEXT: vldrb.s32 q0, [r2]562; CHECK-NEXT: vstrw.32 q0, [r1]563; CHECK-NEXT: bx lr564entry:565 %z = getelementptr inbounds i8, ptr %x, i32 -128566 %0 = load <4 x i8>, ptr %z, align 1567 %1 = sext <4 x i8> %0 to <4 x i32>568 store <4 x i32> %1, ptr %y, align 4569 ret ptr %x570}571 572 573define ptr @ldrbu16_4(ptr %x, ptr %y) {574; CHECK-LABEL: ldrbu16_4:575; CHECK: @ %bb.0: @ %entry576; CHECK-NEXT: vldrb.u16 q0, [r0, #4]577; CHECK-NEXT: vstrh.16 q0, [r1]578; CHECK-NEXT: bx lr579entry:580 %z = getelementptr inbounds i8, ptr %x, i32 4581 %0 = load <8 x i8>, ptr %z, align 1582 %1 = zext <8 x i8> %0 to <8 x i16>583 store <8 x i16> %1, ptr %y, align 2584 ret ptr %x585}586 587define ptr @ldrbu16_3(ptr %x, ptr %y) {588; CHECK-LABEL: ldrbu16_3:589; CHECK: @ %bb.0: @ %entry590; CHECK-NEXT: vldrb.u16 q0, [r0, #3]591; CHECK-NEXT: vstrh.16 q0, [r1]592; CHECK-NEXT: bx lr593entry:594 %z = getelementptr inbounds i8, ptr %x, i32 3595 %0 = load <8 x i8>, ptr %z, align 1596 %1 = zext <8 x i8> %0 to <8 x i16>597 store <8 x i16> %1, ptr %y, align 2598 ret ptr %x599}600 601define ptr @ldrbu16_127(ptr %x, ptr %y) {602; CHECK-LABEL: ldrbu16_127:603; CHECK: @ %bb.0: @ %entry604; CHECK-NEXT: vldrb.u16 q0, [r0, #127]605; CHECK-NEXT: vstrh.16 q0, [r1]606; CHECK-NEXT: bx lr607entry:608 %z = getelementptr inbounds i8, ptr %x, i32 127609 %0 = load <8 x i8>, ptr %z, align 1610 %1 = zext <8 x i8> %0 to <8 x i16>611 store <8 x i16> %1, ptr %y, align 2612 ret ptr %x613}614 615define ptr @ldrbu16_128(ptr %x, ptr %y) {616; CHECK-LABEL: ldrbu16_128:617; CHECK: @ %bb.0: @ %entry618; CHECK-NEXT: add.w r2, r0, #128619; CHECK-NEXT: vldrb.u16 q0, [r2]620; CHECK-NEXT: vstrh.16 q0, [r1]621; CHECK-NEXT: bx lr622entry:623 %z = getelementptr inbounds i8, ptr %x, i32 128624 %0 = load <8 x i8>, ptr %z, align 1625 %1 = zext <8 x i8> %0 to <8 x i16>626 store <8 x i16> %1, ptr %y, align 2627 ret ptr %x628}629 630define ptr @ldrbu16_m127(ptr %x, ptr %y) {631; CHECK-LABEL: ldrbu16_m127:632; CHECK: @ %bb.0: @ %entry633; CHECK-NEXT: vldrb.u16 q0, [r0, #-127]634; CHECK-NEXT: vstrh.16 q0, [r1]635; CHECK-NEXT: bx lr636entry:637 %z = getelementptr inbounds i8, ptr %x, i32 -127638 %0 = load <8 x i8>, ptr %z, align 1639 %1 = zext <8 x i8> %0 to <8 x i16>640 store <8 x i16> %1, ptr %y, align 2641 ret ptr %x642}643 644define ptr @ldrbu16_m128(ptr %x, ptr %y) {645; CHECK-LABEL: ldrbu16_m128:646; CHECK: @ %bb.0: @ %entry647; CHECK-NEXT: sub.w r2, r0, #128648; CHECK-NEXT: vldrb.u16 q0, [r2]649; CHECK-NEXT: vstrh.16 q0, [r1]650; CHECK-NEXT: bx lr651entry:652 %z = getelementptr inbounds i8, ptr %x, i32 -128653 %0 = load <8 x i8>, ptr %z, align 1654 %1 = zext <8 x i8> %0 to <8 x i16>655 store <8 x i16> %1, ptr %y, align 2656 ret ptr %x657}658 659 660define ptr @ldrbs16_4(ptr %x, ptr %y) {661; CHECK-LABEL: ldrbs16_4:662; CHECK: @ %bb.0: @ %entry663; CHECK-NEXT: vldrb.s16 q0, [r0, #4]664; CHECK-NEXT: vstrh.16 q0, [r1]665; CHECK-NEXT: bx lr666entry:667 %z = getelementptr inbounds i8, ptr %x, i32 4668 %0 = load <8 x i8>, ptr %z, align 1669 %1 = sext <8 x i8> %0 to <8 x i16>670 store <8 x i16> %1, ptr %y, align 2671 ret ptr %x672}673 674define ptr @ldrbs16_3(ptr %x, ptr %y) {675; CHECK-LABEL: ldrbs16_3:676; CHECK: @ %bb.0: @ %entry677; CHECK-NEXT: vldrb.s16 q0, [r0, #3]678; CHECK-NEXT: vstrh.16 q0, [r1]679; CHECK-NEXT: bx lr680entry:681 %z = getelementptr inbounds i8, ptr %x, i32 3682 %0 = load <8 x i8>, ptr %z, align 1683 %1 = sext <8 x i8> %0 to <8 x i16>684 store <8 x i16> %1, ptr %y, align 2685 ret ptr %x686}687 688define ptr @ldrbs16_127(ptr %x, ptr %y) {689; CHECK-LABEL: ldrbs16_127:690; CHECK: @ %bb.0: @ %entry691; CHECK-NEXT: vldrb.s16 q0, [r0, #127]692; CHECK-NEXT: vstrh.16 q0, [r1]693; CHECK-NEXT: bx lr694entry:695 %z = getelementptr inbounds i8, ptr %x, i32 127696 %0 = load <8 x i8>, ptr %z, align 1697 %1 = sext <8 x i8> %0 to <8 x i16>698 store <8 x i16> %1, ptr %y, align 2699 ret ptr %x700}701 702define ptr @ldrbs16_128(ptr %x, ptr %y) {703; CHECK-LABEL: ldrbs16_128:704; CHECK: @ %bb.0: @ %entry705; CHECK-NEXT: add.w r2, r0, #128706; CHECK-NEXT: vldrb.s16 q0, [r2]707; CHECK-NEXT: vstrh.16 q0, [r1]708; CHECK-NEXT: bx lr709entry:710 %z = getelementptr inbounds i8, ptr %x, i32 128711 %0 = load <8 x i8>, ptr %z, align 1712 %1 = sext <8 x i8> %0 to <8 x i16>713 store <8 x i16> %1, ptr %y, align 2714 ret ptr %x715}716 717define ptr @ldrbs16_m127(ptr %x, ptr %y) {718; CHECK-LABEL: ldrbs16_m127:719; CHECK: @ %bb.0: @ %entry720; CHECK-NEXT: vldrb.s16 q0, [r0, #-127]721; CHECK-NEXT: vstrh.16 q0, [r1]722; CHECK-NEXT: bx lr723entry:724 %z = getelementptr inbounds i8, ptr %x, i32 -127725 %0 = load <8 x i8>, ptr %z, align 1726 %1 = sext <8 x i8> %0 to <8 x i16>727 store <8 x i16> %1, ptr %y, align 2728 ret ptr %x729}730 731define ptr @ldrbs16_m128(ptr %x, ptr %y) {732; CHECK-LABEL: ldrbs16_m128:733; CHECK: @ %bb.0: @ %entry734; CHECK-NEXT: sub.w r2, r0, #128735; CHECK-NEXT: vldrb.s16 q0, [r2]736; CHECK-NEXT: vstrh.16 q0, [r1]737; CHECK-NEXT: bx lr738entry:739 %z = getelementptr inbounds i8, ptr %x, i32 -128740 %0 = load <8 x i8>, ptr %z, align 1741 %1 = sext <8 x i8> %0 to <8 x i16>742 store <8 x i16> %1, ptr %y, align 2743 ret ptr %x744}745 746 747define ptr @ldrbu8_4(ptr %x, ptr %y) {748; CHECK-LABEL: ldrbu8_4:749; CHECK: @ %bb.0: @ %entry750; CHECK-NEXT: vldrb.u8 q0, [r0, #4]751; CHECK-NEXT: vstrb.8 q0, [r1]752; CHECK-NEXT: bx lr753entry:754 %z = getelementptr inbounds i8, ptr %x, i32 4755 %0 = load <16 x i8>, ptr %z, align 1756 store <16 x i8> %0, ptr %y, align 1757 ret ptr %x758}759 760define ptr @ldrbu8_3(ptr %x, ptr %y) {761; CHECK-LABEL: ldrbu8_3:762; CHECK: @ %bb.0: @ %entry763; CHECK-NEXT: vldrb.u8 q0, [r0, #3]764; CHECK-NEXT: vstrb.8 q0, [r1]765; CHECK-NEXT: bx lr766entry:767 %z = getelementptr inbounds i8, ptr %x, i32 3768 %0 = load <16 x i8>, ptr %z, align 1769 store <16 x i8> %0, ptr %y, align 1770 ret ptr %x771}772 773define ptr @ldrbu8_127(ptr %x, ptr %y) {774; CHECK-LABEL: ldrbu8_127:775; CHECK: @ %bb.0: @ %entry776; CHECK-NEXT: vldrb.u8 q0, [r0, #127]777; CHECK-NEXT: vstrb.8 q0, [r1]778; CHECK-NEXT: bx lr779entry:780 %z = getelementptr inbounds i8, ptr %x, i32 127781 %0 = load <16 x i8>, ptr %z, align 1782 store <16 x i8> %0, ptr %y, align 1783 ret ptr %x784}785 786define ptr @ldrbu8_128(ptr %x, ptr %y) {787; CHECK-LABEL: ldrbu8_128:788; CHECK: @ %bb.0: @ %entry789; CHECK-NEXT: add.w r2, r0, #128790; CHECK-NEXT: vldrb.u8 q0, [r2]791; CHECK-NEXT: vstrb.8 q0, [r1]792; CHECK-NEXT: bx lr793entry:794 %z = getelementptr inbounds i8, ptr %x, i32 128795 %0 = load <16 x i8>, ptr %z, align 1796 store <16 x i8> %0, ptr %y, align 1797 ret ptr %x798}799 800define ptr @ldrbu8_m127(ptr %x, ptr %y) {801; CHECK-LABEL: ldrbu8_m127:802; CHECK: @ %bb.0: @ %entry803; CHECK-NEXT: vldrb.u8 q0, [r0, #-127]804; CHECK-NEXT: vstrb.8 q0, [r1]805; CHECK-NEXT: bx lr806entry:807 %z = getelementptr inbounds i8, ptr %x, i32 -127808 %0 = load <16 x i8>, ptr %z, align 1809 store <16 x i8> %0, ptr %y, align 1810 ret ptr %x811}812 813define ptr @ldrbu8_m128(ptr %x, ptr %y) {814; CHECK-LABEL: ldrbu8_m128:815; CHECK: @ %bb.0: @ %entry816; CHECK-NEXT: sub.w r2, r0, #128817; CHECK-NEXT: vldrb.u8 q0, [r2]818; CHECK-NEXT: vstrb.8 q0, [r1]819; CHECK-NEXT: bx lr820entry:821 %z = getelementptr inbounds i8, ptr %x, i32 -128822 %0 = load <16 x i8>, ptr %z, align 1823 store <16 x i8> %0, ptr %y, align 1824 ret ptr %x825}826 827 828define ptr @ldrwf32_4(ptr %x, ptr %y) {829; CHECK-LABEL: ldrwf32_4:830; CHECK: @ %bb.0: @ %entry831; CHECK-NEXT: vldrw.u32 q0, [r0, #4]832; CHECK-NEXT: vstrw.32 q0, [r1]833; CHECK-NEXT: bx lr834entry:835 %z = getelementptr inbounds i8, ptr %x, i32 4836 %0 = load <4 x float>, ptr %z, align 4837 store <4 x float> %0, ptr %y, align 4838 ret ptr %x839}840 841define ptr @ldrwf16_4(ptr %x, ptr %y) {842; CHECK-LABEL: ldrwf16_4:843; CHECK: @ %bb.0: @ %entry844; CHECK-NEXT: vldrh.u16 q0, [r0, #4]845; CHECK-NEXT: vstrh.16 q0, [r1]846; CHECK-NEXT: bx lr847entry:848 %z = getelementptr inbounds i8, ptr %x, i32 4849 %0 = load <8 x half>, ptr %z, align 2850 store <8 x half> %0, ptr %y, align 2851 ret ptr %x852}853 854define ptr @ldrwi32_align1(ptr %x, ptr %y) {855; CHECK-LE-LABEL: ldrwi32_align1:856; CHECK-LE: @ %bb.0: @ %entry857; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]858; CHECK-LE-NEXT: vstrw.32 q0, [r1]859; CHECK-LE-NEXT: bx lr860;861; CHECK-BE-LABEL: ldrwi32_align1:862; CHECK-BE: @ %bb.0: @ %entry863; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3]864; CHECK-BE-NEXT: vrev32.8 q0, q0865; CHECK-BE-NEXT: vstrw.32 q0, [r1]866; CHECK-BE-NEXT: bx lr867entry:868 %z = getelementptr inbounds i8, ptr %x, i32 3869 %0 = load <4 x i32>, ptr %z, align 1870 store <4 x i32> %0, ptr %y, align 4871 ret ptr %x872}873 874define ptr @ldrhi16_align1(ptr %x, ptr %y) {875; CHECK-LE-LABEL: ldrhi16_align1:876; CHECK-LE: @ %bb.0: @ %entry877; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]878; CHECK-LE-NEXT: vstrh.16 q0, [r1]879; CHECK-LE-NEXT: bx lr880;881; CHECK-BE-LABEL: ldrhi16_align1:882; CHECK-BE: @ %bb.0: @ %entry883; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3]884; CHECK-BE-NEXT: vrev16.8 q0, q0885; CHECK-BE-NEXT: vstrh.16 q0, [r1]886; CHECK-BE-NEXT: bx lr887entry:888 %z = getelementptr inbounds i8, ptr %x, i32 3889 %0 = load <8 x i16>, ptr %z, align 1890 store <8 x i16> %0, ptr %y, align 2891 ret ptr %x892}893 894define ptr @ldrhi32_align1(ptr %x, ptr %y) {895; CHECK-LABEL: ldrhi32_align1:896; CHECK: @ %bb.0: @ %entry897; CHECK-NEXT: .pad #8898; CHECK-NEXT: sub sp, #8899; CHECK-NEXT: ldr.w r3, [r0, #7]900; CHECK-NEXT: ldr.w r2, [r0, #3]901; CHECK-NEXT: strd r2, r3, [sp]902; CHECK-NEXT: mov r2, sp903; CHECK-NEXT: vldrh.s32 q0, [r2]904; CHECK-NEXT: vstrw.32 q0, [r1]905; CHECK-NEXT: add sp, #8906; CHECK-NEXT: bx lr907entry:908 %z = getelementptr inbounds i8, ptr %x, i32 3909 %0 = load <4 x i16>, ptr %z, align 1910 %1 = sext <4 x i16> %0 to <4 x i32>911 store <4 x i32> %1, ptr %y, align 4912 ret ptr %x913}914 915define ptr @ldrf32_align1(ptr %x, ptr %y) {916; CHECK-LE-LABEL: ldrf32_align1:917; CHECK-LE: @ %bb.0: @ %entry918; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]919; CHECK-LE-NEXT: vstrw.32 q0, [r1]920; CHECK-LE-NEXT: bx lr921;922; CHECK-BE-LABEL: ldrf32_align1:923; CHECK-BE: @ %bb.0: @ %entry924; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3]925; CHECK-BE-NEXT: vrev32.8 q0, q0926; CHECK-BE-NEXT: vstrw.32 q0, [r1]927; CHECK-BE-NEXT: bx lr928entry:929 %z = getelementptr inbounds i8, ptr %x, i32 3930 %0 = load <4 x float>, ptr %z, align 1931 store <4 x float> %0, ptr %y, align 4932 ret ptr %x933}934 935define ptr @ldrf16_align1(ptr %x, ptr %y) {936; CHECK-LE-LABEL: ldrf16_align1:937; CHECK-LE: @ %bb.0: @ %entry938; CHECK-LE-NEXT: vldrb.u8 q0, [r0, #3]939; CHECK-LE-NEXT: vstrh.16 q0, [r1]940; CHECK-LE-NEXT: bx lr941;942; CHECK-BE-LABEL: ldrf16_align1:943; CHECK-BE: @ %bb.0: @ %entry944; CHECK-BE-NEXT: vldrb.u8 q0, [r0, #3]945; CHECK-BE-NEXT: vrev16.8 q0, q0946; CHECK-BE-NEXT: vstrh.16 q0, [r1]947; CHECK-BE-NEXT: bx lr948entry:949 %z = getelementptr inbounds i8, ptr %x, i32 3950 %0 = load <8 x half>, ptr %z, align 1951 store <8 x half> %0, ptr %y, align 2952 ret ptr %x953}954 955define ptr @ldrh16_align8(ptr %x, ptr %y) {956; CHECK-LE-LABEL: ldrh16_align8:957; CHECK-LE: @ %bb.0: @ %entry958; CHECK-LE-NEXT: vldrw.u32 q0, [r0, #4]959; CHECK-LE-NEXT: vstrh.16 q0, [r1]960; CHECK-LE-NEXT: bx lr961;962; CHECK-BE-LABEL: ldrh16_align8:963; CHECK-BE: @ %bb.0: @ %entry964; CHECK-BE-NEXT: vldrh.u16 q0, [r0, #4]965; CHECK-BE-NEXT: vstrh.16 q0, [r1]966; CHECK-BE-NEXT: bx lr967entry:968 %z = getelementptr inbounds i8, ptr %x, i32 4969 %0 = load <8 x i16>, ptr %z, align 8970 store <8 x i16> %0, ptr %y, align 2971 ret ptr %x972}973 974 975 976 977 978define ptr @strw32_4(ptr %y, ptr %x) {979; CHECK-LABEL: strw32_4:980; CHECK: @ %bb.0: @ %entry981; CHECK-NEXT: vldrw.u32 q0, [r1]982; CHECK-NEXT: vstrw.32 q0, [r0, #4]983; CHECK-NEXT: bx lr984entry:985 %z = getelementptr inbounds i8, ptr %y, i32 4986 %0 = load <4 x i32>, ptr %x, align 4987 store <4 x i32> %0, ptr %z, align 4988 ret ptr %y989}990 991define ptr @strw32_3(ptr %y, ptr %x) {992; CHECK-LABEL: strw32_3:993; CHECK: @ %bb.0: @ %entry994; CHECK-NEXT: vldrw.u32 q0, [r1]995; CHECK-NEXT: adds r1, r0, #3996; CHECK-NEXT: vstrw.32 q0, [r1]997; CHECK-NEXT: bx lr998entry:999 %z = getelementptr inbounds i8, ptr %y, i32 31000 %0 = load <4 x i32>, ptr %x, align 41001 store <4 x i32> %0, ptr %z, align 41002 ret ptr %y1003}1004 1005define ptr @strw32_m4(ptr %y, ptr %x) {1006; CHECK-LABEL: strw32_m4:1007; CHECK: @ %bb.0: @ %entry1008; CHECK-NEXT: vldrw.u32 q0, [r1]1009; CHECK-NEXT: vstrw.32 q0, [r0, #-4]1010; CHECK-NEXT: bx lr1011entry:1012 %z = getelementptr inbounds i8, ptr %y, i32 -41013 %0 = load <4 x i32>, ptr %x, align 41014 store <4 x i32> %0, ptr %z, align 41015 ret ptr %y1016}1017 1018define ptr @strw32_508(ptr %y, ptr %x) {1019; CHECK-LABEL: strw32_508:1020; CHECK: @ %bb.0: @ %entry1021; CHECK-NEXT: vldrw.u32 q0, [r1]1022; CHECK-NEXT: vstrw.32 q0, [r0, #508]1023; CHECK-NEXT: bx lr1024entry:1025 %z = getelementptr inbounds i8, ptr %y, i32 5081026 %0 = load <4 x i32>, ptr %x, align 41027 store <4 x i32> %0, ptr %z, align 41028 ret ptr %y1029}1030 1031define ptr @strw32_512(ptr %y, ptr %x) {1032; CHECK-LABEL: strw32_512:1033; CHECK: @ %bb.0: @ %entry1034; CHECK-NEXT: vldrw.u32 q0, [r1]1035; CHECK-NEXT: add.w r1, r0, #5121036; CHECK-NEXT: vstrw.32 q0, [r1]1037; CHECK-NEXT: bx lr1038entry:1039 %z = getelementptr inbounds i8, ptr %y, i32 5121040 %0 = load <4 x i32>, ptr %x, align 41041 store <4 x i32> %0, ptr %z, align 41042 ret ptr %y1043}1044 1045define ptr @strw32_m508(ptr %y, ptr %x) {1046; CHECK-LABEL: strw32_m508:1047; CHECK: @ %bb.0: @ %entry1048; CHECK-NEXT: vldrw.u32 q0, [r1]1049; CHECK-NEXT: vstrw.32 q0, [r0, #-508]1050; CHECK-NEXT: bx lr1051entry:1052 %z = getelementptr inbounds i8, ptr %y, i32 -5081053 %0 = load <4 x i32>, ptr %x, align 41054 store <4 x i32> %0, ptr %z, align 41055 ret ptr %y1056}1057 1058define ptr @strw32_m512(ptr %y, ptr %x) {1059; CHECK-LABEL: strw32_m512:1060; CHECK: @ %bb.0: @ %entry1061; CHECK-NEXT: vldrw.u32 q0, [r1]1062; CHECK-NEXT: sub.w r1, r0, #5121063; CHECK-NEXT: vstrw.32 q0, [r1]1064; CHECK-NEXT: bx lr1065entry:1066 %z = getelementptr inbounds i8, ptr %y, i32 -5121067 %0 = load <4 x i32>, ptr %x, align 41068 store <4 x i32> %0, ptr %z, align 41069 ret ptr %y1070}1071 1072 1073define ptr @strh32_4(ptr %y, ptr %x) {1074; CHECK-LABEL: strh32_4:1075; CHECK: @ %bb.0: @ %entry1076; CHECK-NEXT: vldrh.u32 q0, [r1]1077; CHECK-NEXT: vstrh.32 q0, [r0, #4]1078; CHECK-NEXT: bx lr1079entry:1080 %z = getelementptr inbounds i8, ptr %y, i32 41081 %0 = load <4 x i16>, ptr %x, align 21082 store <4 x i16> %0, ptr %z, align 21083 ret ptr %y1084}1085 1086define ptr @strh32_3(ptr %y, ptr %x) {1087; CHECK-LABEL: strh32_3:1088; CHECK: @ %bb.0: @ %entry1089; CHECK-NEXT: vldrh.u32 q0, [r1]1090; CHECK-NEXT: adds r1, r0, #31091; CHECK-NEXT: vstrh.32 q0, [r1]1092; CHECK-NEXT: bx lr1093entry:1094 %z = getelementptr inbounds i8, ptr %y, i32 31095 %0 = load <4 x i16>, ptr %x, align 21096 store <4 x i16> %0, ptr %z, align 21097 ret ptr %y1098}1099 1100define ptr @strh32_2(ptr %y, ptr %x) {1101; CHECK-LABEL: strh32_2:1102; CHECK: @ %bb.0: @ %entry1103; CHECK-NEXT: vldrh.u32 q0, [r1]1104; CHECK-NEXT: vstrh.32 q0, [r0, #2]1105; CHECK-NEXT: bx lr1106entry:1107 %z = getelementptr inbounds i8, ptr %y, i32 21108 %0 = load <4 x i16>, ptr %x, align 21109 store <4 x i16> %0, ptr %z, align 21110 ret ptr %y1111}1112 1113define ptr @strh32_254(ptr %y, ptr %x) {1114; CHECK-LABEL: strh32_254:1115; CHECK: @ %bb.0: @ %entry1116; CHECK-NEXT: vldrh.u32 q0, [r1]1117; CHECK-NEXT: vstrh.32 q0, [r0, #254]1118; CHECK-NEXT: bx lr1119entry:1120 %z = getelementptr inbounds i8, ptr %y, i32 2541121 %0 = load <4 x i16>, ptr %x, align 21122 store <4 x i16> %0, ptr %z, align 21123 ret ptr %y1124}1125 1126define ptr @strh32_256(ptr %y, ptr %x) {1127; CHECK-LABEL: strh32_256:1128; CHECK: @ %bb.0: @ %entry1129; CHECK-NEXT: vldrh.u32 q0, [r1]1130; CHECK-NEXT: add.w r1, r0, #2561131; CHECK-NEXT: vstrh.32 q0, [r1]1132; CHECK-NEXT: bx lr1133entry:1134 %z = getelementptr inbounds i8, ptr %y, i32 2561135 %0 = load <4 x i16>, ptr %x, align 21136 store <4 x i16> %0, ptr %z, align 21137 ret ptr %y1138}1139 1140define ptr @strh32_m254(ptr %y, ptr %x) {1141; CHECK-LABEL: strh32_m254:1142; CHECK: @ %bb.0: @ %entry1143; CHECK-NEXT: vldrh.u32 q0, [r1]1144; CHECK-NEXT: vstrh.32 q0, [r0, #-254]1145; CHECK-NEXT: bx lr1146entry:1147 %z = getelementptr inbounds i8, ptr %y, i32 -2541148 %0 = load <4 x i16>, ptr %x, align 21149 store <4 x i16> %0, ptr %z, align 21150 ret ptr %y1151}1152 1153define ptr @strh32_m256(ptr %y, ptr %x) {1154; CHECK-LABEL: strh32_m256:1155; CHECK: @ %bb.0: @ %entry1156; CHECK-NEXT: vldrh.u32 q0, [r1]1157; CHECK-NEXT: sub.w r1, r0, #2561158; CHECK-NEXT: vstrh.32 q0, [r1]1159; CHECK-NEXT: bx lr1160entry:1161 %z = getelementptr inbounds i8, ptr %y, i32 -2561162 %0 = load <4 x i16>, ptr %x, align 21163 store <4 x i16> %0, ptr %z, align 21164 ret ptr %y1165}1166 1167 1168define ptr @strh16_4(ptr %y, ptr %x) {1169; CHECK-LABEL: strh16_4:1170; CHECK: @ %bb.0: @ %entry1171; CHECK-NEXT: vldrh.u16 q0, [r1]1172; CHECK-NEXT: vstrh.16 q0, [r0, #4]1173; CHECK-NEXT: bx lr1174entry:1175 %z = getelementptr inbounds i8, ptr %y, i32 41176 %0 = load <8 x i16>, ptr %x, align 21177 store <8 x i16> %0, ptr %z, align 21178 ret ptr %y1179}1180 1181define ptr @strh16_3(ptr %y, ptr %x) {1182; CHECK-LABEL: strh16_3:1183; CHECK: @ %bb.0: @ %entry1184; CHECK-NEXT: vldrh.u16 q0, [r1]1185; CHECK-NEXT: adds r1, r0, #31186; CHECK-NEXT: vstrh.16 q0, [r1]1187; CHECK-NEXT: bx lr1188entry:1189 %z = getelementptr inbounds i8, ptr %y, i32 31190 %0 = load <8 x i16>, ptr %x, align 21191 store <8 x i16> %0, ptr %z, align 21192 ret ptr %y1193}1194 1195define ptr @strh16_2(ptr %y, ptr %x) {1196; CHECK-LABEL: strh16_2:1197; CHECK: @ %bb.0: @ %entry1198; CHECK-NEXT: vldrh.u16 q0, [r1]1199; CHECK-NEXT: vstrh.16 q0, [r0, #2]1200; CHECK-NEXT: bx lr1201entry:1202 %z = getelementptr inbounds i8, ptr %y, i32 21203 %0 = load <8 x i16>, ptr %x, align 21204 store <8 x i16> %0, ptr %z, align 21205 ret ptr %y1206}1207 1208define ptr @strh16_254(ptr %y, ptr %x) {1209; CHECK-LABEL: strh16_254:1210; CHECK: @ %bb.0: @ %entry1211; CHECK-NEXT: vldrh.u16 q0, [r1]1212; CHECK-NEXT: vstrh.16 q0, [r0, #254]1213; CHECK-NEXT: bx lr1214entry:1215 %z = getelementptr inbounds i8, ptr %y, i32 2541216 %0 = load <8 x i16>, ptr %x, align 21217 store <8 x i16> %0, ptr %z, align 21218 ret ptr %y1219}1220 1221define ptr @strh16_256(ptr %y, ptr %x) {1222; CHECK-LABEL: strh16_256:1223; CHECK: @ %bb.0: @ %entry1224; CHECK-NEXT: vldrh.u16 q0, [r1]1225; CHECK-NEXT: add.w r1, r0, #2561226; CHECK-NEXT: vstrh.16 q0, [r1]1227; CHECK-NEXT: bx lr1228entry:1229 %z = getelementptr inbounds i8, ptr %y, i32 2561230 %0 = load <8 x i16>, ptr %x, align 21231 store <8 x i16> %0, ptr %z, align 21232 ret ptr %y1233}1234 1235define ptr @strh16_m254(ptr %y, ptr %x) {1236; CHECK-LABEL: strh16_m254:1237; CHECK: @ %bb.0: @ %entry1238; CHECK-NEXT: vldrh.u16 q0, [r1]1239; CHECK-NEXT: vstrh.16 q0, [r0, #-254]1240; CHECK-NEXT: bx lr1241entry:1242 %z = getelementptr inbounds i8, ptr %y, i32 -2541243 %0 = load <8 x i16>, ptr %x, align 21244 store <8 x i16> %0, ptr %z, align 21245 ret ptr %y1246}1247 1248define ptr @strh16_m256(ptr %y, ptr %x) {1249; CHECK-LABEL: strh16_m256:1250; CHECK: @ %bb.0: @ %entry1251; CHECK-NEXT: vldrh.u16 q0, [r1]1252; CHECK-NEXT: sub.w r1, r0, #2561253; CHECK-NEXT: vstrh.16 q0, [r1]1254; CHECK-NEXT: bx lr1255entry:1256 %z = getelementptr inbounds i8, ptr %y, i32 -2561257 %0 = load <8 x i16>, ptr %x, align 21258 store <8 x i16> %0, ptr %z, align 21259 ret ptr %y1260}1261 1262 1263define ptr @strb32_4(ptr %y, ptr %x) {1264; CHECK-LABEL: strb32_4:1265; CHECK: @ %bb.0: @ %entry1266; CHECK-NEXT: vldrb.u32 q0, [r1]1267; CHECK-NEXT: vstrb.32 q0, [r0, #4]1268; CHECK-NEXT: bx lr1269entry:1270 %z = getelementptr inbounds i8, ptr %y, i32 41271 %0 = load <4 x i8>, ptr %x, align 11272 store <4 x i8> %0, ptr %z, align 11273 ret ptr %y1274}1275 1276define ptr @strb32_3(ptr %y, ptr %x) {1277; CHECK-LABEL: strb32_3:1278; CHECK: @ %bb.0: @ %entry1279; CHECK-NEXT: vldrb.u32 q0, [r1]1280; CHECK-NEXT: vstrb.32 q0, [r0, #3]1281; CHECK-NEXT: bx lr1282entry:1283 %z = getelementptr inbounds i8, ptr %y, i32 31284 %0 = load <4 x i8>, ptr %x, align 11285 store <4 x i8> %0, ptr %z, align 11286 ret ptr %y1287}1288 1289define ptr @strb32_127(ptr %y, ptr %x) {1290; CHECK-LABEL: strb32_127:1291; CHECK: @ %bb.0: @ %entry1292; CHECK-NEXT: vldrb.u32 q0, [r1]1293; CHECK-NEXT: vstrb.32 q0, [r0, #127]1294; CHECK-NEXT: bx lr1295entry:1296 %z = getelementptr inbounds i8, ptr %y, i32 1271297 %0 = load <4 x i8>, ptr %x, align 11298 store <4 x i8> %0, ptr %z, align 11299 ret ptr %y1300}1301 1302define ptr @strb32_128(ptr %y, ptr %x) {1303; CHECK-LABEL: strb32_128:1304; CHECK: @ %bb.0: @ %entry1305; CHECK-NEXT: vldrb.u32 q0, [r1]1306; CHECK-NEXT: add.w r1, r0, #1281307; CHECK-NEXT: vstrb.32 q0, [r1]1308; CHECK-NEXT: bx lr1309entry:1310 %z = getelementptr inbounds i8, ptr %y, i32 1281311 %0 = load <4 x i8>, ptr %x, align 11312 store <4 x i8> %0, ptr %z, align 11313 ret ptr %y1314}1315 1316define ptr @strb32_m127(ptr %y, ptr %x) {1317; CHECK-LABEL: strb32_m127:1318; CHECK: @ %bb.0: @ %entry1319; CHECK-NEXT: vldrb.u32 q0, [r1]1320; CHECK-NEXT: vstrb.32 q0, [r0, #-127]1321; CHECK-NEXT: bx lr1322entry:1323 %z = getelementptr inbounds i8, ptr %y, i32 -1271324 %0 = load <4 x i8>, ptr %x, align 11325 store <4 x i8> %0, ptr %z, align 11326 ret ptr %y1327}1328 1329define ptr @strb32_m128(ptr %y, ptr %x) {1330; CHECK-LABEL: strb32_m128:1331; CHECK: @ %bb.0: @ %entry1332; CHECK-NEXT: vldrb.u32 q0, [r1]1333; CHECK-NEXT: sub.w r1, r0, #1281334; CHECK-NEXT: vstrb.32 q0, [r1]1335; CHECK-NEXT: bx lr1336entry:1337 %z = getelementptr inbounds i8, ptr %y, i32 -1281338 %0 = load <4 x i8>, ptr %x, align 11339 store <4 x i8> %0, ptr %z, align 11340 ret ptr %y1341}1342 1343 1344define ptr @strb16_4(ptr %y, ptr %x) {1345; CHECK-LABEL: strb16_4:1346; CHECK: @ %bb.0: @ %entry1347; CHECK-NEXT: vldrb.u16 q0, [r1]1348; CHECK-NEXT: vstrb.16 q0, [r0, #4]1349; CHECK-NEXT: bx lr1350entry:1351 %z = getelementptr inbounds i8, ptr %y, i32 41352 %0 = load <8 x i8>, ptr %x, align 11353 store <8 x i8> %0, ptr %z, align 11354 ret ptr %y1355}1356 1357define ptr @strb16_3(ptr %y, ptr %x) {1358; CHECK-LABEL: strb16_3:1359; CHECK: @ %bb.0: @ %entry1360; CHECK-NEXT: vldrb.u16 q0, [r1]1361; CHECK-NEXT: vstrb.16 q0, [r0, #3]1362; CHECK-NEXT: bx lr1363entry:1364 %z = getelementptr inbounds i8, ptr %y, i32 31365 %0 = load <8 x i8>, ptr %x, align 11366 store <8 x i8> %0, ptr %z, align 11367 ret ptr %y1368}1369 1370define ptr @strb16_127(ptr %y, ptr %x) {1371; CHECK-LABEL: strb16_127:1372; CHECK: @ %bb.0: @ %entry1373; CHECK-NEXT: vldrb.u16 q0, [r1]1374; CHECK-NEXT: vstrb.16 q0, [r0, #127]1375; CHECK-NEXT: bx lr1376entry:1377 %z = getelementptr inbounds i8, ptr %y, i32 1271378 %0 = load <8 x i8>, ptr %x, align 11379 store <8 x i8> %0, ptr %z, align 11380 ret ptr %y1381}1382 1383define ptr @strb16_128(ptr %y, ptr %x) {1384; CHECK-LABEL: strb16_128:1385; CHECK: @ %bb.0: @ %entry1386; CHECK-NEXT: vldrb.u16 q0, [r1]1387; CHECK-NEXT: add.w r1, r0, #1281388; CHECK-NEXT: vstrb.16 q0, [r1]1389; CHECK-NEXT: bx lr1390entry:1391 %z = getelementptr inbounds i8, ptr %y, i32 1281392 %0 = load <8 x i8>, ptr %x, align 11393 store <8 x i8> %0, ptr %z, align 11394 ret ptr %y1395}1396 1397define ptr @strb16_m127(ptr %y, ptr %x) {1398; CHECK-LABEL: strb16_m127:1399; CHECK: @ %bb.0: @ %entry1400; CHECK-NEXT: vldrb.u16 q0, [r1]1401; CHECK-NEXT: vstrb.16 q0, [r0, #-127]1402; CHECK-NEXT: bx lr1403entry:1404 %z = getelementptr inbounds i8, ptr %y, i32 -1271405 %0 = load <8 x i8>, ptr %x, align 11406 store <8 x i8> %0, ptr %z, align 11407 ret ptr %y1408}1409 1410define ptr @strb16_m128(ptr %y, ptr %x) {1411; CHECK-LABEL: strb16_m128:1412; CHECK: @ %bb.0: @ %entry1413; CHECK-NEXT: vldrb.u16 q0, [r1]1414; CHECK-NEXT: sub.w r1, r0, #1281415; CHECK-NEXT: vstrb.16 q0, [r1]1416; CHECK-NEXT: bx lr1417entry:1418 %z = getelementptr inbounds i8, ptr %y, i32 -1281419 %0 = load <8 x i8>, ptr %x, align 11420 store <8 x i8> %0, ptr %z, align 11421 ret ptr %y1422}1423 1424 1425define ptr @strb8_4(ptr %y, ptr %x) {1426; CHECK-LABEL: strb8_4:1427; CHECK: @ %bb.0: @ %entry1428; CHECK-NEXT: vldrb.u8 q0, [r1]1429; CHECK-NEXT: vstrb.8 q0, [r0, #4]1430; CHECK-NEXT: bx lr1431entry:1432 %z = getelementptr inbounds i8, ptr %y, i32 41433 %0 = load <16 x i8>, ptr %x, align 11434 store <16 x i8> %0, ptr %z, align 11435 ret ptr %y1436}1437 1438define ptr @strb8_3(ptr %y, ptr %x) {1439; CHECK-LABEL: strb8_3:1440; CHECK: @ %bb.0: @ %entry1441; CHECK-NEXT: vldrb.u8 q0, [r1]1442; CHECK-NEXT: vstrb.8 q0, [r0, #3]1443; CHECK-NEXT: bx lr1444entry:1445 %z = getelementptr inbounds i8, ptr %y, i32 31446 %0 = load <16 x i8>, ptr %x, align 11447 store <16 x i8> %0, ptr %z, align 11448 ret ptr %y1449}1450 1451define ptr @strb8_127(ptr %y, ptr %x) {1452; CHECK-LABEL: strb8_127:1453; CHECK: @ %bb.0: @ %entry1454; CHECK-NEXT: vldrb.u8 q0, [r1]1455; CHECK-NEXT: vstrb.8 q0, [r0, #127]1456; CHECK-NEXT: bx lr1457entry:1458 %z = getelementptr inbounds i8, ptr %y, i32 1271459 %0 = load <16 x i8>, ptr %x, align 11460 store <16 x i8> %0, ptr %z, align 11461 ret ptr %y1462}1463 1464define ptr @strb8_128(ptr %y, ptr %x) {1465; CHECK-LABEL: strb8_128:1466; CHECK: @ %bb.0: @ %entry1467; CHECK-NEXT: vldrb.u8 q0, [r1]1468; CHECK-NEXT: add.w r1, r0, #1281469; CHECK-NEXT: vstrb.8 q0, [r1]1470; CHECK-NEXT: bx lr1471entry:1472 %z = getelementptr inbounds i8, ptr %y, i32 1281473 %0 = load <16 x i8>, ptr %x, align 11474 store <16 x i8> %0, ptr %z, align 11475 ret ptr %y1476}1477 1478define ptr @strb8_m127(ptr %y, ptr %x) {1479; CHECK-LABEL: strb8_m127:1480; CHECK: @ %bb.0: @ %entry1481; CHECK-NEXT: vldrb.u8 q0, [r1]1482; CHECK-NEXT: vstrb.8 q0, [r0, #-127]1483; CHECK-NEXT: bx lr1484entry:1485 %z = getelementptr inbounds i8, ptr %y, i32 -1271486 %0 = load <16 x i8>, ptr %x, align 11487 store <16 x i8> %0, ptr %z, align 11488 ret ptr %y1489}1490 1491define ptr @strb8_m128(ptr %y, ptr %x) {1492; CHECK-LABEL: strb8_m128:1493; CHECK: @ %bb.0: @ %entry1494; CHECK-NEXT: vldrb.u8 q0, [r1]1495; CHECK-NEXT: sub.w r1, r0, #1281496; CHECK-NEXT: vstrb.8 q0, [r1]1497; CHECK-NEXT: bx lr1498entry:1499 %z = getelementptr inbounds i8, ptr %y, i32 -1281500 %0 = load <16 x i8>, ptr %x, align 11501 store <16 x i8> %0, ptr %z, align 11502 ret ptr %y1503}1504 1505 1506define ptr @strf32_4(ptr %y, ptr %x) {1507; CHECK-LABEL: strf32_4:1508; CHECK: @ %bb.0: @ %entry1509; CHECK-NEXT: vldrw.u32 q0, [r1]1510; CHECK-NEXT: vstrw.32 q0, [r0, #4]1511; CHECK-NEXT: bx lr1512entry:1513 %z = getelementptr inbounds i8, ptr %y, i32 41514 %0 = load <4 x float>, ptr %x, align 41515 store <4 x float> %0, ptr %z, align 41516 ret ptr %y1517}1518 1519define ptr @strf16_4(ptr %y, ptr %x) {1520; CHECK-LABEL: strf16_4:1521; CHECK: @ %bb.0: @ %entry1522; CHECK-NEXT: vldrh.u16 q0, [r1]1523; CHECK-NEXT: vstrh.16 q0, [r0, #4]1524; CHECK-NEXT: bx lr1525entry:1526 %z = getelementptr inbounds i8, ptr %y, i32 41527 %0 = load <8 x half>, ptr %x, align 21528 store <8 x half> %0, ptr %z, align 21529 ret ptr %y1530}1531 1532define ptr @strwi32_align1(ptr %y, ptr %x) {1533; CHECK-LE-LABEL: strwi32_align1:1534; CHECK-LE: @ %bb.0: @ %entry1535; CHECK-LE-NEXT: vldrw.u32 q0, [r1]1536; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]1537; CHECK-LE-NEXT: bx lr1538;1539; CHECK-BE-LABEL: strwi32_align1:1540; CHECK-BE: @ %bb.0: @ %entry1541; CHECK-BE-NEXT: vldrw.u32 q0, [r1]1542; CHECK-BE-NEXT: vrev32.8 q0, q01543; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3]1544; CHECK-BE-NEXT: bx lr1545entry:1546 %z = getelementptr inbounds i8, ptr %y, i32 31547 %0 = load <4 x i32>, ptr %x, align 41548 store <4 x i32> %0, ptr %z, align 11549 ret ptr %y1550}1551 1552define ptr @strhi16_align1(ptr %y, ptr %x) {1553; CHECK-LE-LABEL: strhi16_align1:1554; CHECK-LE: @ %bb.0: @ %entry1555; CHECK-LE-NEXT: vldrh.u16 q0, [r1]1556; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]1557; CHECK-LE-NEXT: bx lr1558;1559; CHECK-BE-LABEL: strhi16_align1:1560; CHECK-BE: @ %bb.0: @ %entry1561; CHECK-BE-NEXT: vldrh.u16 q0, [r1]1562; CHECK-BE-NEXT: vrev16.8 q0, q01563; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3]1564; CHECK-BE-NEXT: bx lr1565entry:1566 %z = getelementptr inbounds i8, ptr %y, i32 31567 %0 = load <8 x i16>, ptr %x, align 21568 store <8 x i16> %0, ptr %z, align 11569 ret ptr %y1570}1571 1572define ptr @strhi32_align1(ptr %y, ptr %x) {1573; CHECK-LABEL: strhi32_align1:1574; CHECK: @ %bb.0: @ %entry1575; CHECK-NEXT: .pad #81576; CHECK-NEXT: sub sp, #81577; CHECK-NEXT: vldrw.u32 q0, [r1]1578; CHECK-NEXT: mov r1, sp1579; CHECK-NEXT: vstrh.32 q0, [r1]1580; CHECK-NEXT: ldrd r1, r2, [sp]1581; CHECK-NEXT: str.w r1, [r0, #3]1582; CHECK-NEXT: str.w r2, [r0, #7]1583; CHECK-NEXT: add sp, #81584; CHECK-NEXT: bx lr1585entry:1586 %z = getelementptr inbounds i8, ptr %y, i32 31587 %0 = load <4 x i32>, ptr %x, align 41588 %1 = trunc <4 x i32> %0 to <4 x i16>1589 store <4 x i16> %1, ptr %z, align 11590 ret ptr %y1591}1592 1593define ptr @strf32_align1(ptr %y, ptr %x) {1594; CHECK-LE-LABEL: strf32_align1:1595; CHECK-LE: @ %bb.0: @ %entry1596; CHECK-LE-NEXT: vldrw.u32 q0, [r1]1597; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]1598; CHECK-LE-NEXT: bx lr1599;1600; CHECK-BE-LABEL: strf32_align1:1601; CHECK-BE: @ %bb.0: @ %entry1602; CHECK-BE-NEXT: vldrw.u32 q0, [r1]1603; CHECK-BE-NEXT: vrev32.8 q0, q01604; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3]1605; CHECK-BE-NEXT: bx lr1606entry:1607 %z = getelementptr inbounds i8, ptr %y, i32 31608 %0 = load <4 x float>, ptr %x, align 41609 store <4 x float> %0, ptr %z, align 11610 ret ptr %y1611}1612 1613define ptr @strf16_align1(ptr %y, ptr %x) {1614; CHECK-LE-LABEL: strf16_align1:1615; CHECK-LE: @ %bb.0: @ %entry1616; CHECK-LE-NEXT: vldrh.u16 q0, [r1]1617; CHECK-LE-NEXT: vstrb.8 q0, [r0, #3]1618; CHECK-LE-NEXT: bx lr1619;1620; CHECK-BE-LABEL: strf16_align1:1621; CHECK-BE: @ %bb.0: @ %entry1622; CHECK-BE-NEXT: vldrh.u16 q0, [r1]1623; CHECK-BE-NEXT: vrev16.8 q0, q01624; CHECK-BE-NEXT: vstrb.8 q0, [r0, #3]1625; CHECK-BE-NEXT: bx lr1626entry:1627 %z = getelementptr inbounds i8, ptr %y, i32 31628 %0 = load <8 x half>, ptr %x, align 21629 store <8 x half> %0, ptr %z, align 11630 ret ptr %y1631}1632 1633define ptr @strf16_align8(ptr %y, ptr %x) {1634; CHECK-LE-LABEL: strf16_align8:1635; CHECK-LE: @ %bb.0: @ %entry1636; CHECK-LE-NEXT: vldrh.u16 q0, [r1]1637; CHECK-LE-NEXT: vstrw.32 q0, [r0, #16]1638; CHECK-LE-NEXT: bx lr1639;1640; CHECK-BE-LABEL: strf16_align8:1641; CHECK-BE: @ %bb.0: @ %entry1642; CHECK-BE-NEXT: vldrh.u16 q0, [r1]1643; CHECK-BE-NEXT: vstrh.16 q0, [r0, #16]1644; CHECK-BE-NEXT: bx lr1645entry:1646 %z = getelementptr inbounds i8, ptr %y, i32 161647 %0 = load <8 x i16>, ptr %x, align 21648 store <8 x i16> %0, ptr %z, align 81649 ret ptr %y1650}1651