707 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc < %s -mtriple=armv8-linux-gnueabi --float-abi=hard -verify-machineinstrs \3; RUN: -asm-verbose=false | FileCheck %s4 5%struct.uint16x4x2_t = type { <4 x i16>, <4 x i16> }6%struct.uint16x4x3_t = type { <4 x i16>, <4 x i16>, <4 x i16> }7%struct.uint16x4x4_t = type { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }8 9%struct.uint32x2x2_t = type { <2 x i32>, <2 x i32> }10%struct.uint32x2x3_t = type { <2 x i32>, <2 x i32>, <2 x i32> }11%struct.uint32x2x4_t = type { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> }12 13%struct.uint64x1x2_t = type { <1 x i64>, <1 x i64> }14%struct.uint64x1x3_t = type { <1 x i64>, <1 x i64>, <1 x i64> }15%struct.uint64x1x4_t = type { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> }16 17%struct.uint8x8x2_t = type { <8 x i8>, <8 x i8> }18%struct.uint8x8x3_t = type { <8 x i8>, <8 x i8>, <8 x i8> }19%struct.uint8x8x4_t = type { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> }20 21%struct.uint16x8x2_t = type { <8 x i16>, <8 x i16> }22%struct.uint16x8x3_t = type { <8 x i16>, <8 x i16>, <8 x i16> }23%struct.uint16x8x4_t = type { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }24 25%struct.uint32x4x2_t = type { <4 x i32>, <4 x i32> }26%struct.uint32x4x3_t = type { <4 x i32>, <4 x i32>, <4 x i32> }27%struct.uint32x4x4_t = type { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> }28 29%struct.uint8x16x2_t = type { <16 x i8>, <16 x i8> }30%struct.uint8x16x3_t = type { <16 x i8>, <16 x i8>, <16 x i8> }31%struct.uint8x16x4_t = type { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> }32 33declare %struct.uint8x8x2_t @llvm.arm.neon.vld2dup.v8i8.p0(ptr, i32)34declare %struct.uint16x4x2_t @llvm.arm.neon.vld2dup.v4i16.p0(ptr, i32)35declare %struct.uint32x2x2_t @llvm.arm.neon.vld2dup.v2i32.p0(ptr, i32)36declare %struct.uint64x1x2_t @llvm.arm.neon.vld2dup.v1i64.p0(ptr, i32)37 38declare %struct.uint8x8x3_t @llvm.arm.neon.vld3dup.v8i8.p0(ptr, i32)39declare %struct.uint16x4x3_t @llvm.arm.neon.vld3dup.v4i16.p0(ptr, i32)40declare %struct.uint32x2x3_t @llvm.arm.neon.vld3dup.v2i32.p0(ptr, i32)41declare %struct.uint64x1x3_t @llvm.arm.neon.vld3dup.v1i64.p0(ptr, i32)42 43declare %struct.uint8x8x4_t @llvm.arm.neon.vld4dup.v8i8.p0(ptr, i32)44declare %struct.uint16x4x4_t @llvm.arm.neon.vld4dup.v4i16.p0(ptr, i32)45declare %struct.uint32x2x4_t @llvm.arm.neon.vld4dup.v2i32.p0(ptr, i32)46declare %struct.uint64x1x4_t @llvm.arm.neon.vld4dup.v1i64.p0(ptr, i32)47 48declare %struct.uint8x16x2_t @llvm.arm.neon.vld2dup.v16i8.p0(ptr, i32)49declare %struct.uint16x8x2_t @llvm.arm.neon.vld2dup.v8i16.p0(ptr, i32)50declare %struct.uint32x4x2_t @llvm.arm.neon.vld2dup.v4i32.p0(ptr, i32)51 52declare %struct.uint8x16x3_t @llvm.arm.neon.vld3dup.v16i8.p0(ptr, i32)53declare %struct.uint16x8x3_t @llvm.arm.neon.vld3dup.v8i16.p0(ptr, i32)54declare %struct.uint32x4x3_t @llvm.arm.neon.vld3dup.v4i32.p0(ptr, i32)55 56declare %struct.uint8x16x4_t @llvm.arm.neon.vld4dup.v16i8.p0(ptr, i32)57declare %struct.uint16x8x4_t @llvm.arm.neon.vld4dup.v8i16.p0(ptr, i32)58declare %struct.uint32x4x4_t @llvm.arm.neon.vld4dup.v4i32.p0(ptr, i32)59 60define ptr @test_vld2_dup_u16_update(ptr %dest, ptr %src) {61; CHECK-LABEL: test_vld2_dup_u16_update:62; CHECK: vld2.16 {d16[], d17[]}, [r1]!63; CHECK-NEXT: vst1.16 {d16}, [r0:64]!64; CHECK-NEXT: vstr d17, [r0]65; CHECK-NEXT: mov r0, r166; CHECK-NEXT: bx lr67entry:68 %tmp = tail call %struct.uint16x4x2_t @llvm.arm.neon.vld2dup.v4i16.p0(ptr %src, i32 2)69 store %struct.uint16x4x2_t %tmp, ptr %dest, align 870 %updated_src = getelementptr inbounds i8, ptr %src, i32 471 ret ptr %updated_src72}73 74define ptr @test_vld2_dup_u16_update_reg(ptr %dest, ptr %src, i32 %inc) {75; CHECK-LABEL: test_vld2_dup_u16_update_reg:76; CHECK: vld2.16 {d16[], d17[]}, [r1], r277; CHECK-NEXT: vst1.16 {d16}, [r0:64]!78; CHECK-NEXT: vstr d17, [r0]79; CHECK-NEXT: mov r0, r180; CHECK-NEXT: bx lr81entry:82 %tmp = tail call %struct.uint16x4x2_t @llvm.arm.neon.vld2dup.v4i16.p0(ptr %src, i32 2)83 store %struct.uint16x4x2_t %tmp, ptr %dest, align 884 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc85 ret ptr %updated_src86}87 88define ptr @test_vld2_dup_update(ptr %dest, ptr %src) {89; CHECK-LABEL: test_vld2_dup_update:90; CHECK: vld2.32 {d16[], d17[]}, [r1]!91; CHECK-NEXT: vst1.32 {d16}, [r0:64]!92; CHECK-NEXT: vstr d17, [r0]93; CHECK-NEXT: mov r0, r194; CHECK-NEXT: bx lr95entry:96 %tmp = tail call %struct.uint32x2x2_t @llvm.arm.neon.vld2dup.v2i32.p0(ptr %src, i32 4)97 store %struct.uint32x2x2_t %tmp, ptr %dest, align 898 %updated_src = getelementptr inbounds i8, ptr %src, i32 899 ret ptr %updated_src100}101 102define ptr @test_vld2_dup_update_reg(ptr %dest, ptr %src, i32 %inc) {103; CHECK-LABEL: test_vld2_dup_update_reg:104; CHECK: vld2.32 {d16[], d17[]}, [r1], r2105; CHECK-NEXT: vst1.32 {d16}, [r0:64]!106; CHECK-NEXT: vstr d17, [r0]107; CHECK-NEXT: mov r0, r1108; CHECK-NEXT: bx lr109entry:110 %tmp = tail call %struct.uint32x2x2_t @llvm.arm.neon.vld2dup.v2i32.p0(ptr %src, i32 4)111 store %struct.uint32x2x2_t %tmp, ptr %dest, align 8112 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc113 ret ptr %updated_src114}115 116define ptr @test_vld2_dup_u64_update(ptr %dest, ptr %src) {117; CHECK-LABEL: test_vld2_dup_u64_update:118; CHECK: vld1.64 {d16, d17}, [r1:64]!119; CHECK-NEXT: vst1.64 {d16}, [r0:64]!120; CHECK-NEXT: vstr d17, [r0]121; CHECK-NEXT: mov r0, r1122; CHECK-NEXT: bx lr123entry:124 %tmp = tail call %struct.uint64x1x2_t @llvm.arm.neon.vld2dup.v1i64.p0(ptr %src, i32 8)125 store %struct.uint64x1x2_t %tmp, ptr %dest, align 8126 %updated_src = getelementptr inbounds i8, ptr %src, i32 16127 ret ptr %updated_src128}129 130define ptr @test_vld2_dup_u64_update_reg(ptr %dest, ptr %src, i32 %inc) {131; CHECK-LABEL: test_vld2_dup_u64_update_reg:132; CHECK: vld1.64 {d16, d17}, [r1:64], r2133; CHECK-NEXT: vst1.64 {d16}, [r0:64]!134; CHECK-NEXT: vstr d17, [r0]135; CHECK-NEXT: mov r0, r1136; CHECK-NEXT: bx lr137entry:138 %tmp = tail call %struct.uint64x1x2_t @llvm.arm.neon.vld2dup.v1i64.p0(ptr %src, i32 8)139 store %struct.uint64x1x2_t %tmp, ptr %dest, align 8140 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc141 ret ptr %updated_src142}143 144define ptr @test_vld2_dup_u8_update(ptr %dest, ptr %src) {145; CHECK-LABEL: test_vld2_dup_u8_update:146; CHECK: vld2.8 {d16[], d17[]}, [r1]!147; CHECK-NEXT: vst1.8 {d16}, [r0:64]!148; CHECK-NEXT: vstr d17, [r0]149; CHECK-NEXT: mov r0, r1150; CHECK-NEXT: bx lr151entry:152 %tmp = tail call %struct.uint8x8x2_t @llvm.arm.neon.vld2dup.v8i8.p0(ptr %src, i32 1)153 store %struct.uint8x8x2_t %tmp, ptr %dest, align 8154 %updated_src = getelementptr inbounds i8, ptr %src, i32 2155 ret ptr %updated_src156}157 158define ptr @test_vld2_dup_u8_update_reg(ptr %dest, ptr %src, i32 %inc) {159; CHECK-LABEL: test_vld2_dup_u8_update_reg:160; CHECK: vld2.8 {d16[], d17[]}, [r1], r2161; CHECK-NEXT: vst1.8 {d16}, [r0:64]!162; CHECK-NEXT: vstr d17, [r0]163; CHECK-NEXT: mov r0, r1164; CHECK-NEXT: bx lr165entry:166 %tmp = tail call %struct.uint8x8x2_t @llvm.arm.neon.vld2dup.v8i8.p0(ptr %src, i32 1)167 store %struct.uint8x8x2_t %tmp, ptr %dest, align 8168 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc169 ret ptr %updated_src170}171 172define ptr @test_vld3_dup_u16_update(ptr %dest, ptr %src) {173; CHECK-LABEL: test_vld3_dup_u16_update:174; CHECK: vld3.16 {d16[], d17[], d18[]}, [r1]!175; CHECK-NEXT: vst1.16 {d16}, [r0:64]!176; CHECK-NEXT: vst1.16 {d17}, [r0:64]!177; CHECK-NEXT: vstr d18, [r0]178; CHECK-NEXT: mov r0, r1179; CHECK-NEXT: bx lr180entry:181 %tmp = tail call %struct.uint16x4x3_t @llvm.arm.neon.vld3dup.v4i16.p0(ptr %src, i32 2)182 store %struct.uint16x4x3_t %tmp, ptr %dest, align 8183 %updated_src = getelementptr inbounds i8, ptr %src, i32 6184 ret ptr %updated_src185}186 187define ptr @test_vld3_dup_u16_update_reg(ptr %dest, ptr %src, i32 %inc) {188; CHECK-LABEL: test_vld3_dup_u16_update_reg:189; CHECK: vld3.16 {d16[], d17[], d18[]}, [r1], r2190; CHECK-NEXT: vst1.16 {d16}, [r0:64]!191; CHECK-NEXT: vst1.16 {d17}, [r0:64]!192; CHECK-NEXT: vstr d18, [r0]193; CHECK-NEXT: mov r0, r1194; CHECK-NEXT: bx lr195entry:196 %tmp = tail call %struct.uint16x4x3_t @llvm.arm.neon.vld3dup.v4i16.p0(ptr %src, i32 2)197 store %struct.uint16x4x3_t %tmp, ptr %dest, align 8198 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc199 ret ptr %updated_src200}201 202define ptr @test_vld3_dup_u32_update(ptr %dest, ptr %src) {203; CHECK-LABEL: test_vld3_dup_u32_update:204; CHECK: vld3.32 {d16[], d17[], d18[]}, [r1]!205; CHECK-NEXT: vst1.32 {d16}, [r0:64]!206; CHECK-NEXT: vst1.32 {d17}, [r0:64]!207; CHECK-NEXT: vstr d18, [r0]208; CHECK-NEXT: mov r0, r1209; CHECK-NEXT: bx lr210entry:211 %tmp = tail call %struct.uint32x2x3_t @llvm.arm.neon.vld3dup.v2i32.p0(ptr %src, i32 4)212 store %struct.uint32x2x3_t %tmp, ptr %dest, align 8213 %updated_src = getelementptr inbounds i8, ptr %src, i32 12214 ret ptr %updated_src215}216 217define ptr @test_vld3_dup_u32_update_reg(ptr %dest, ptr %src, i32 %inc) {218; CHECK-LABEL: test_vld3_dup_u32_update_reg:219; CHECK: vld3.32 {d16[], d17[], d18[]}, [r1], r2220; CHECK-NEXT: vst1.32 {d16}, [r0:64]!221; CHECK-NEXT: vst1.32 {d17}, [r0:64]!222; CHECK-NEXT: vstr d18, [r0]223; CHECK-NEXT: mov r0, r1224; CHECK-NEXT: bx lr225entry:226 %tmp = tail call %struct.uint32x2x3_t @llvm.arm.neon.vld3dup.v2i32.p0(ptr %src, i32 4)227 store %struct.uint32x2x3_t %tmp, ptr %dest, align 8228 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc229 ret ptr %updated_src230}231 232define ptr @test_vld3_dup_u64_update(ptr %dest, ptr %src) {233; CHECK-LABEL: test_vld3_dup_u64_update:234; CHECK: vld1.64 {d16, d17, d18}, [r1]!235; CHECK-NEXT: vst1.64 {d16}, [r0:64]!236; CHECK-NEXT: vst1.64 {d17}, [r0:64]!237; CHECK-NEXT: vstr d18, [r0]238; CHECK-NEXT: mov r0, r1239; CHECK-NEXT: bx lr240entry:241 %tmp = tail call %struct.uint64x1x3_t @llvm.arm.neon.vld3dup.v1i64.p0(ptr %src, i32 8)242 store %struct.uint64x1x3_t %tmp, ptr %dest, align 8243 %updated_src = getelementptr inbounds i8, ptr %src, i32 24244 ret ptr %updated_src245}246 247define ptr @test_vld3_dup_u64_update_reg(ptr %dest, ptr %src, i32 %inc) {248; CHECK-LABEL: test_vld3_dup_u64_update_reg:249; CHECK: vld1.64 {d16, d17, d18}, [r1], r2250; CHECK-NEXT: vst1.64 {d16}, [r0:64]!251; CHECK-NEXT: vst1.64 {d17}, [r0:64]!252; CHECK-NEXT: vstr d18, [r0]253; CHECK-NEXT: mov r0, r1254; CHECK-NEXT: bx lr255entry:256 %tmp = tail call %struct.uint64x1x3_t @llvm.arm.neon.vld3dup.v1i64.p0(ptr %src, i32 8)257 store %struct.uint64x1x3_t %tmp, ptr %dest, align 8258 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc259 ret ptr %updated_src260}261 262define ptr @test_vld3_dup_u8_update(ptr %dest, ptr %src) {263; CHECK-LABEL: test_vld3_dup_u8_update:264; CHECK: vld3.8 {d16[], d17[], d18[]}, [r1]!265; CHECK-NEXT: vst1.8 {d16}, [r0:64]!266; CHECK-NEXT: vst1.8 {d17}, [r0:64]!267; CHECK-NEXT: vstr d18, [r0]268; CHECK-NEXT: mov r0, r1269; CHECK-NEXT: bx lr270entry:271 %tmp = tail call %struct.uint8x8x3_t @llvm.arm.neon.vld3dup.v8i8.p0(ptr %src, i32 1)272 store %struct.uint8x8x3_t %tmp, ptr %dest, align 8273 %updated_src = getelementptr inbounds i8, ptr %src, i32 3274 ret ptr %updated_src275}276 277define ptr @test_vld3_dup_u8_update_reg(ptr %dest, ptr %src, i32 %inc) {278; CHECK-LABEL: test_vld3_dup_u8_update_reg:279; CHECK: vld3.8 {d16[], d17[], d18[]}, [r1], r2280; CHECK-NEXT: vst1.8 {d16}, [r0:64]!281; CHECK-NEXT: vst1.8 {d17}, [r0:64]!282; CHECK-NEXT: vstr d18, [r0]283; CHECK-NEXT: mov r0, r1284; CHECK-NEXT: bx lr285entry:286 %tmp = tail call %struct.uint8x8x3_t @llvm.arm.neon.vld3dup.v8i8.p0(ptr %src, i32 1)287 store %struct.uint8x8x3_t %tmp, ptr %dest, align 8288 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc289 ret ptr %updated_src290}291 292define ptr @test_vld4_dup_u16_update(ptr %dest, ptr %src) {293; CHECK-LABEL: test_vld4_dup_u16_update:294; CHECK: vld4.16 {d16[], d17[], d18[], d19[]}, [r1]!295; CHECK-NEXT: vst1.16 {d16}, [r0:64]!296; CHECK-NEXT: vst1.16 {d17}, [r0:64]!297; CHECK-NEXT: vst1.16 {d18}, [r0:64]!298; CHECK-NEXT: vstr d19, [r0]299; CHECK-NEXT: mov r0, r1300; CHECK-NEXT: bx lr301entry:302 %tmp = tail call %struct.uint16x4x4_t @llvm.arm.neon.vld4dup.v4i16.p0(ptr %src, i32 2)303 store %struct.uint16x4x4_t %tmp, ptr %dest, align 8304 %updated_src = getelementptr inbounds i8, ptr %src, i32 8305 ret ptr %updated_src306}307 308define ptr @test_vld4_dup_u16_update_reg(ptr %dest, ptr %src, i32 %inc) {309; CHECK-LABEL: test_vld4_dup_u16_update_reg:310; CHECK: vld4.16 {d16[], d17[], d18[], d19[]}, [r1], r2311; CHECK-NEXT: vst1.16 {d16}, [r0:64]!312; CHECK-NEXT: vst1.16 {d17}, [r0:64]!313; CHECK-NEXT: vst1.16 {d18}, [r0:64]!314; CHECK-NEXT: vstr d19, [r0]315; CHECK-NEXT: mov r0, r1316; CHECK-NEXT: bx lr317entry:318 %tmp = tail call %struct.uint16x4x4_t @llvm.arm.neon.vld4dup.v4i16.p0(ptr %src, i32 2)319 store %struct.uint16x4x4_t %tmp, ptr %dest, align 8320 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc321 ret ptr %updated_src322}323 324define ptr @test_vld4_dup_u32_update(ptr %dest, ptr %src) {325; CHECK-LABEL: test_vld4_dup_u32_update:326; CHECK: vld4.32 {d16[], d17[], d18[], d19[]}, [r1]!327; CHECK-NEXT: vst1.32 {d16}, [r0:64]!328; CHECK-NEXT: vst1.32 {d17}, [r0:64]!329; CHECK-NEXT: vst1.32 {d18}, [r0:64]!330; CHECK-NEXT: vstr d19, [r0]331; CHECK-NEXT: mov r0, r1332; CHECK-NEXT: bx lr333entry:334 %tmp = tail call %struct.uint32x2x4_t @llvm.arm.neon.vld4dup.v2i32.p0(ptr %src, i32 4)335 store %struct.uint32x2x4_t %tmp, ptr %dest, align 8336 %updated_src = getelementptr inbounds i8, ptr %src, i32 16337 ret ptr %updated_src338}339 340define ptr @test_vld4_dup_u32_update_reg(ptr %dest, ptr %src, i32 %inc) {341; CHECK-LABEL: test_vld4_dup_u32_update_reg:342; CHECK: vld4.32 {d16[], d17[], d18[], d19[]}, [r1], r2343; CHECK-NEXT: vst1.32 {d16}, [r0:64]!344; CHECK-NEXT: vst1.32 {d17}, [r0:64]!345; CHECK-NEXT: vst1.32 {d18}, [r0:64]!346; CHECK-NEXT: vstr d19, [r0]347; CHECK-NEXT: mov r0, r1348; CHECK-NEXT: bx lr349entry:350 %tmp = tail call %struct.uint32x2x4_t @llvm.arm.neon.vld4dup.v2i32.p0(ptr %src, i32 4)351 store %struct.uint32x2x4_t %tmp, ptr %dest, align 8352 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc353 ret ptr %updated_src354}355 356define ptr @test_vld4_dup_u64_update(ptr %dest, ptr %src) {357; CHECK-LABEL: test_vld4_dup_u64_update:358; CHECK: vld1.64 {d16, d17, d18, d19}, [r1:64]!359; CHECK-NEXT: vst1.64 {d16}, [r0:64]!360; CHECK-NEXT: vst1.64 {d17}, [r0:64]!361; CHECK-NEXT: vst1.64 {d18}, [r0:64]!362; CHECK-NEXT: vstr d19, [r0]363; CHECK-NEXT: mov r0, r1364; CHECK-NEXT: bx lr365entry:366 %tmp = tail call %struct.uint64x1x4_t @llvm.arm.neon.vld4dup.v1i64.p0(ptr %src, i32 8)367 store %struct.uint64x1x4_t %tmp, ptr %dest, align 8368 %updated_src = getelementptr inbounds i8, ptr %src, i32 32369 ret ptr %updated_src370}371 372define ptr @test_vld4_dup_u64_update_reg(ptr %dest, ptr %src, i32 %inc) {373; CHECK-LABEL: test_vld4_dup_u64_update_reg:374; CHECK: vld1.64 {d16, d17, d18, d19}, [r1:64], r2375; CHECK-NEXT: vst1.64 {d16}, [r0:64]!376; CHECK-NEXT: vst1.64 {d17}, [r0:64]!377; CHECK-NEXT: vst1.64 {d18}, [r0:64]!378; CHECK-NEXT: vstr d19, [r0]379; CHECK-NEXT: mov r0, r1380; CHECK-NEXT: bx lr381entry:382 %tmp = tail call %struct.uint64x1x4_t @llvm.arm.neon.vld4dup.v1i64.p0(ptr %src, i32 8)383 store %struct.uint64x1x4_t %tmp, ptr %dest, align 8384 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc385 ret ptr %updated_src386}387 388define ptr @test_vld4_dup_u8_update(ptr %dest, ptr %src) {389; CHECK-LABEL: test_vld4_dup_u8_update:390; CHECK: vld4.8 {d16[], d17[], d18[], d19[]}, [r1]!391; CHECK-NEXT: vst1.8 {d16}, [r0:64]!392; CHECK-NEXT: vst1.8 {d17}, [r0:64]!393; CHECK-NEXT: vst1.8 {d18}, [r0:64]!394; CHECK-NEXT: vstr d19, [r0]395; CHECK-NEXT: mov r0, r1396; CHECK-NEXT: bx lr397entry:398 %tmp = tail call %struct.uint8x8x4_t @llvm.arm.neon.vld4dup.v8i8.p0(ptr %src, i32 1)399 store %struct.uint8x8x4_t %tmp, ptr %dest, align 8400 %updated_src = getelementptr inbounds i8, ptr %src, i32 4401 ret ptr %updated_src402}403 404define ptr @test_vld4_dup_u8_update_reg(ptr %dest, ptr %src, i32 %inc) {405; CHECK-LABEL: test_vld4_dup_u8_update_reg:406; CHECK: vld4.8 {d16[], d17[], d18[], d19[]}, [r1], r2407; CHECK-NEXT: vst1.8 {d16}, [r0:64]!408; CHECK-NEXT: vst1.8 {d17}, [r0:64]!409; CHECK-NEXT: vst1.8 {d18}, [r0:64]!410; CHECK-NEXT: vstr d19, [r0]411; CHECK-NEXT: mov r0, r1412; CHECK-NEXT: bx lr413entry:414 %tmp = tail call %struct.uint8x8x4_t @llvm.arm.neon.vld4dup.v8i8.p0(ptr %src, i32 1)415 store %struct.uint8x8x4_t %tmp, ptr %dest, align 8416 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc417 ret ptr %updated_src418}419 420define ptr @test_vld2q_dup_u16_update(ptr %dest, ptr %src, ptr %dest0) {421; CHECK-LABEL: test_vld2q_dup_u16_update:422; CHECK: vld2.16 {d16[], d18[]}, [r1]423; CHECK-NEXT: vld2.16 {d17[], d19[]}, [r1]!424; CHECK-NEXT: vst1.16 {d16, d17}, [r0]!425; CHECK-NEXT: vst1.64 {d18, d19}, [r0]426; CHECK-NEXT: mov r0, r1427; CHECK-NEXT: bx lr428entry:429 %tmp = tail call %struct.uint16x8x2_t @llvm.arm.neon.vld2dup.v8i16.p0(ptr %src, i32 2)430 store %struct.uint16x8x2_t %tmp, ptr %dest, align 8431 %updated_src = getelementptr inbounds i8, ptr %src, i32 4432 ret ptr %updated_src433}434 435define ptr @test_vld2q_dup_u16_update_reg(ptr %dest, ptr %src, i32 %inc) {436; CHECK-LABEL: test_vld2q_dup_u16_update_reg:437; CHECK: vld2.16 {d16[], d18[]}, [r1]438; CHECK-NEXT: vld2.16 {d17[], d19[]}, [r1], r2439; CHECK-NEXT: vst1.16 {d16, d17}, [r0]!440; CHECK-NEXT: vst1.64 {d18, d19}, [r0]441; CHECK-NEXT: mov r0, r1442; CHECK-NEXT: bx lr443entry:444 %tmp = tail call %struct.uint16x8x2_t @llvm.arm.neon.vld2dup.v8i16.p0(ptr %src, i32 2)445 store %struct.uint16x8x2_t %tmp, ptr %dest, align 8446 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc447 ret ptr %updated_src448}449 450define ptr @test_vld2q_dup_u32_update(ptr %dest, ptr %src) {451; CHECK-LABEL: test_vld2q_dup_u32_update:452; CHECK: vld2.32 {d16[], d18[]}, [r1]453; CHECK-NEXT: vld2.32 {d17[], d19[]}, [r1]!454; CHECK-NEXT: vst1.32 {d16, d17}, [r0]!455; CHECK-NEXT: vst1.64 {d18, d19}, [r0]456; CHECK-NEXT: mov r0, r1457; CHECK-NEXT: bx lr458entry:459 %tmp = tail call %struct.uint32x4x2_t @llvm.arm.neon.vld2dup.v4i32.p0(ptr %src, i32 4)460 store %struct.uint32x4x2_t %tmp, ptr %dest, align 8461 %updated_src = getelementptr inbounds i8, ptr %src, i32 8462 ret ptr %updated_src463}464 465define ptr @test_vld2q_dup_u32_update_reg(ptr %dest, ptr %src, i32 %inc) {466; CHECK-LABEL: test_vld2q_dup_u32_update_reg:467; CHECK: vld2.32 {d16[], d18[]}, [r1]468; CHECK-NEXT: vld2.32 {d17[], d19[]}, [r1], r2469; CHECK-NEXT: vst1.32 {d16, d17}, [r0]!470; CHECK-NEXT: vst1.64 {d18, d19}, [r0]471; CHECK-NEXT: mov r0, r1472; CHECK-NEXT: bx lr473entry:474 %tmp = tail call %struct.uint32x4x2_t @llvm.arm.neon.vld2dup.v4i32.p0(ptr %src, i32 4)475 store %struct.uint32x4x2_t %tmp, ptr %dest, align 8476 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc477 ret ptr %updated_src478}479 480define ptr @test_vld2q_dup_u8_update(ptr %dest, ptr %src) {481; CHECK-LABEL: test_vld2q_dup_u8_update:482; CHECK: vld2.8 {d16[], d18[]}, [r1]483; CHECK-NEXT: vld2.8 {d17[], d19[]}, [r1]!484; CHECK-NEXT: vst1.8 {d16, d17}, [r0]!485; CHECK-NEXT: vst1.64 {d18, d19}, [r0]486; CHECK-NEXT: mov r0, r1487; CHECK-NEXT: bx lr488entry:489 %tmp = tail call %struct.uint8x16x2_t @llvm.arm.neon.vld2dup.v16i8.p0(ptr %src, i32 1)490 store %struct.uint8x16x2_t %tmp, ptr %dest, align 8491 %updated_src = getelementptr inbounds i8, ptr %src, i32 2492 ret ptr %updated_src493}494 495define ptr @test_vld2q_dup_u8_update_reg(ptr %dest, ptr %src, i32 %inc) {496; CHECK-LABEL: test_vld2q_dup_u8_update_reg:497; CHECK: vld2.8 {d16[], d18[]}, [r1]498; CHECK-NEXT: vld2.8 {d17[], d19[]}, [r1], r2499; CHECK-NEXT: vst1.8 {d16, d17}, [r0]!500; CHECK-NEXT: vst1.64 {d18, d19}, [r0]501; CHECK-NEXT: mov r0, r1502; CHECK-NEXT: bx lr503entry:504 %tmp = tail call %struct.uint8x16x2_t @llvm.arm.neon.vld2dup.v16i8.p0(ptr %src, i32 1)505 store %struct.uint8x16x2_t %tmp, ptr %dest, align 8506 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc507 ret ptr %updated_src508}509 510define ptr @test_vld3q_dup_u16_update(ptr %dest, ptr %src) {511; CHECK-LABEL: test_vld3q_dup_u16_update:512; CHECK: vld3.16 {d16[], d18[], d20[]}, [r1]513; CHECK-NEXT: vld3.16 {d17[], d19[], d21[]}, [r1]!514; CHECK-NEXT: vst1.16 {d16, d17}, [r0]!515; CHECK-NEXT: vst1.16 {d18, d19}, [r0]!516; CHECK-NEXT: vst1.64 {d20, d21}, [r0]517; CHECK-NEXT: mov r0, r1518; CHECK-NEXT: bx lr519entry:520 %tmp = tail call %struct.uint16x8x3_t @llvm.arm.neon.vld3dup.v8i16.p0(ptr %src, i32 2)521 store %struct.uint16x8x3_t %tmp, ptr %dest, align 8522 %updated_src = getelementptr inbounds i8, ptr %src, i32 6523 ret ptr %updated_src524}525 526define ptr @test_vld3q_dup_u16_update_reg(ptr %dest, ptr %src, i32 %inc) {527; CHECK-LABEL: test_vld3q_dup_u16_update_reg:528; CHECK: vld3.16 {d16[], d18[], d20[]}, [r1]529; CHECK-NEXT: vld3.16 {d17[], d19[], d21[]}, [r1], r2530; CHECK-NEXT: vst1.16 {d16, d17}, [r0]!531; CHECK-NEXT: vst1.16 {d18, d19}, [r0]!532; CHECK-NEXT: vst1.64 {d20, d21}, [r0]533; CHECK-NEXT: mov r0, r1534; CHECK-NEXT: bx lr535entry:536 %tmp = tail call %struct.uint16x8x3_t @llvm.arm.neon.vld3dup.v8i16.p0(ptr %src, i32 2)537 store %struct.uint16x8x3_t %tmp, ptr %dest, align 8538 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc539 ret ptr %updated_src540}541 542define ptr @test_vld3q_dup_u32_update(ptr %dest, ptr %src) {543; CHECK-LABEL: test_vld3q_dup_u32_update:544; CHECK: vld3.32 {d16[], d18[], d20[]}, [r1]545; CHECK-NEXT: vld3.32 {d17[], d19[], d21[]}, [r1]!546; CHECK-NEXT: vst1.32 {d16, d17}, [r0]!547; CHECK-NEXT: vst1.32 {d18, d19}, [r0]!548; CHECK-NEXT: vst1.64 {d20, d21}, [r0]549; CHECK-NEXT: mov r0, r1550; CHECK-NEXT: bx lr551entry:552 %tmp = tail call %struct.uint32x4x3_t @llvm.arm.neon.vld3dup.v4i32.p0(ptr %src, i32 4)553 store %struct.uint32x4x3_t %tmp, ptr %dest, align 8554 %updated_src = getelementptr inbounds i8, ptr %src, i32 12555 ret ptr %updated_src556}557 558define ptr @test_vld3q_dup_u32_update_reg(ptr %dest, ptr %src, i32 %inc) {559; CHECK-LABEL: test_vld3q_dup_u32_update_reg:560; CHECK: vld3.32 {d16[], d18[], d20[]}, [r1]561; CHECK-NEXT: vld3.32 {d17[], d19[], d21[]}, [r1], r2562; CHECK-NEXT: vst1.32 {d16, d17}, [r0]!563; CHECK-NEXT: vst1.32 {d18, d19}, [r0]!564; CHECK-NEXT: vst1.64 {d20, d21}, [r0]565; CHECK-NEXT: mov r0, r1566; CHECK-NEXT: bx lr567entry:568 %tmp = tail call %struct.uint32x4x3_t @llvm.arm.neon.vld3dup.v4i32.p0(ptr %src, i32 4)569 store %struct.uint32x4x3_t %tmp, ptr %dest, align 8570 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc571 ret ptr %updated_src572}573 574define ptr @test_vld3q_dup_u8_update(ptr %dest, ptr %src) {575; CHECK-LABEL: test_vld3q_dup_u8_update:576; CHECK: vld3.8 {d16[], d18[], d20[]}, [r1]577; CHECK-NEXT: vld3.8 {d17[], d19[], d21[]}, [r1]!578; CHECK-NEXT: vst1.8 {d16, d17}, [r0]!579; CHECK-NEXT: vst1.8 {d18, d19}, [r0]!580; CHECK-NEXT: vst1.64 {d20, d21}, [r0]581; CHECK-NEXT: mov r0, r1582; CHECK-NEXT: bx lr583entry:584 %tmp = tail call %struct.uint8x16x3_t @llvm.arm.neon.vld3dup.v16i8.p0(ptr %src, i32 1)585 store %struct.uint8x16x3_t %tmp, ptr %dest, align 8586 %updated_src = getelementptr inbounds i8, ptr %src, i32 3587 ret ptr %updated_src588}589 590define ptr @test_vld3q_dup_u8_update_reg(ptr %dest, ptr %src, i32 %inc) {591; CHECK-LABEL: test_vld3q_dup_u8_update_reg:592; CHECK: vld3.8 {d16[], d18[], d20[]}, [r1]593; CHECK-NEXT: vld3.8 {d17[], d19[], d21[]}, [r1], r2594; CHECK-NEXT: vst1.8 {d16, d17}, [r0]!595; CHECK-NEXT: vst1.8 {d18, d19}, [r0]!596; CHECK-NEXT: vst1.64 {d20, d21}, [r0]597; CHECK-NEXT: mov r0, r1598; CHECK-NEXT: bx lr599entry:600 %tmp = tail call %struct.uint8x16x3_t @llvm.arm.neon.vld3dup.v16i8.p0(ptr %src, i32 1)601 store %struct.uint8x16x3_t %tmp, ptr %dest, align 8602 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc603 ret ptr %updated_src604}605 606define ptr @test_vld4q_dup_u16_update(ptr %dest, ptr %src) {607; CHECK-LABEL: test_vld4q_dup_u16_update:608; CHECK: vld4.16 {d16[], d18[], d20[], d22[]}, [r1]609; CHECK-NEXT: vld4.16 {d17[], d19[], d21[], d23[]}, [r1]!610; CHECK-NEXT: vst1.16 {d16, d17}, [r0]!611; CHECK-NEXT: vst1.16 {d18, d19}, [r0]!612; CHECK-NEXT: vst1.16 {d20, d21}, [r0]!613; CHECK-NEXT: vst1.64 {d22, d23}, [r0]614; CHECK-NEXT: mov r0, r1615; CHECK-NEXT: bx lr616entry:617 %tmp = tail call %struct.uint16x8x4_t @llvm.arm.neon.vld4dup.v8i16.p0(ptr %src, i32 2)618 store %struct.uint16x8x4_t %tmp, ptr %dest, align 8619 %updated_src = getelementptr inbounds i8, ptr %src, i32 8620 ret ptr %updated_src621}622 623define ptr @test_vld4q_dup_u16_update_reg(ptr %dest, ptr %src, i32 %inc) {624; CHECK-LABEL: test_vld4q_dup_u16_update_reg:625; CHECK: vld4.16 {d16[], d18[], d20[], d22[]}, [r1]626; CHECK-NEXT: vld4.16 {d17[], d19[], d21[], d23[]}, [r1], r2627; CHECK-NEXT: vst1.16 {d16, d17}, [r0]!628; CHECK-NEXT: vst1.16 {d18, d19}, [r0]!629; CHECK-NEXT: vst1.16 {d20, d21}, [r0]!630; CHECK-NEXT: vst1.64 {d22, d23}, [r0]631; CHECK-NEXT: mov r0, r1632; CHECK-NEXT: bx lr633entry:634 %tmp = tail call %struct.uint16x8x4_t @llvm.arm.neon.vld4dup.v8i16.p0(ptr %src, i32 2)635 store %struct.uint16x8x4_t %tmp, ptr %dest, align 8636 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc637 ret ptr %updated_src638}639 640define ptr @test_vld4q_dup_u32_update(ptr %dest, ptr %src) {641; CHECK-LABEL: test_vld4q_dup_u32_update:642; CHECK: vld4.32 {d16[], d18[], d20[], d22[]}, [r1]643; CHECK-NEXT: vld4.32 {d17[], d19[], d21[], d23[]}, [r1]!644; CHECK-NEXT: vst1.32 {d16, d17}, [r0]!645; CHECK-NEXT: vst1.32 {d18, d19}, [r0]!646; CHECK-NEXT: vst1.32 {d20, d21}, [r0]!647; CHECK-NEXT: vst1.64 {d22, d23}, [r0]648; CHECK-NEXT: mov r0, r1649; CHECK-NEXT: bx lr650entry:651 %tmp = tail call %struct.uint32x4x4_t @llvm.arm.neon.vld4dup.v4i32.p0(ptr %src, i32 4)652 store %struct.uint32x4x4_t %tmp, ptr %dest, align 8653 %updated_src = getelementptr inbounds i8, ptr %src, i32 16654 ret ptr %updated_src655}656 657define ptr @test_vld4q_dup_u32_update_reg(ptr %dest, ptr %src, i32 %inc) {658; CHECK-LABEL: test_vld4q_dup_u32_update_reg:659; CHECK: vld4.32 {d16[], d18[], d20[], d22[]}, [r1]660; CHECK-NEXT: vld4.32 {d17[], d19[], d21[], d23[]}, [r1], r2661; CHECK-NEXT: vst1.32 {d16, d17}, [r0]!662; CHECK-NEXT: vst1.32 {d18, d19}, [r0]!663; CHECK-NEXT: vst1.32 {d20, d21}, [r0]!664; CHECK-NEXT: vst1.64 {d22, d23}, [r0]665; CHECK-NEXT: mov r0, r1666; CHECK-NEXT: bx lr667entry:668 %tmp = tail call %struct.uint32x4x4_t @llvm.arm.neon.vld4dup.v4i32.p0(ptr %src, i32 4)669 store %struct.uint32x4x4_t %tmp, ptr %dest, align 8670 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc671 ret ptr %updated_src672}673 674define ptr @test_vld4q_dup_u8_update(ptr %dest, ptr %src) {675; CHECK-LABEL: test_vld4q_dup_u8_update:676; CHECK: vld4.8 {d16[], d18[], d20[], d22[]}, [r1]677; CHECK-NEXT: vld4.8 {d17[], d19[], d21[], d23[]}, [r1]!678; CHECK-NEXT: vst1.8 {d16, d17}, [r0]!679; CHECK-NEXT: vst1.8 {d18, d19}, [r0]!680; CHECK-NEXT: vst1.8 {d20, d21}, [r0]!681; CHECK-NEXT: vst1.64 {d22, d23}, [r0]682; CHECK-NEXT: mov r0, r1683; CHECK-NEXT: bx lr684entry:685 %tmp = tail call %struct.uint8x16x4_t @llvm.arm.neon.vld4dup.v16i8.p0(ptr %src, i32 1)686 store %struct.uint8x16x4_t %tmp, ptr %dest, align 8687 %updated_src = getelementptr inbounds i8, ptr %src, i32 4688 ret ptr %updated_src689}690 691define ptr @test_vld4q_dup_u8_update_reg(ptr %dest, ptr %src, i32 %inc) {692; CHECK-LABEL: test_vld4q_dup_u8_update_reg:693; CHECK: vld4.8 {d16[], d18[], d20[], d22[]}, [r1]694; CHECK-NEXT: vld4.8 {d17[], d19[], d21[], d23[]}, [r1], r2695; CHECK-NEXT: vst1.8 {d16, d17}, [r0]!696; CHECK-NEXT: vst1.8 {d18, d19}, [r0]!697; CHECK-NEXT: vst1.8 {d20, d21}, [r0]!698; CHECK-NEXT: vst1.64 {d22, d23}, [r0]699; CHECK-NEXT: mov r0, r1700; CHECK-NEXT: bx lr701entry:702 %tmp = tail call %struct.uint8x16x4_t @llvm.arm.neon.vld4dup.v16i8.p0(ptr %src, i32 1)703 store %struct.uint8x16x4_t %tmp, ptr %dest, align 8704 %updated_src = getelementptr inbounds i8, ptr %src, i32 %inc705 ret ptr %updated_src706}707