brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.4 KiB · 875c4e0 Raw
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