brintos

brintos / llvm-project-archived public Read only

0
0
Text · 75.3 KiB · b31ba46 Raw
2109 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64 < %s -o - | FileCheck %s --check-prefixes=CHECK-LE3; RUN: llc -mtriple=aarch64_be < %s -o - | FileCheck %s --check-prefixes=CHECK-BE4 5; Check that we use the correct offset mode for vector loads and stores, and in6; particular for big-endian we use ld1/st1 which only allows postindex immediate7; offset of the same size as the memory access size.8; FIXME: Currently we fail to make use of postindex register offset ld1/st1.9 10define [2 x ptr] @v8i8_postidx_same_size(ptr %ldptr, ptr %stptr) {11; CHECK-LE-LABEL: v8i8_postidx_same_size:12; CHECK-LE:       // %bb.0: // %entry13; CHECK-LE-NEXT:    ldr d0, [x0], #814; CHECK-LE-NEXT:    str d0, [x1], #815; CHECK-LE-NEXT:    ret16;17; CHECK-BE-LABEL: v8i8_postidx_same_size:18; CHECK-BE:       // %bb.0: // %entry19; CHECK-BE-NEXT:    ld1 { v0.8b }, [x0], #820; CHECK-BE-NEXT:    st1 { v0.8b }, [x1], #821; CHECK-BE-NEXT:    ret22entry:23  %val = load <8 x i8>, ptr %ldptr, align 224  store <8 x i8> %val, ptr %stptr, align 225  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 826  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 827  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 028  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 129  ret [2 x ptr] %ret230}31 32define [2 x ptr] @v8i8_preidx_same_size(ptr %ldptr, ptr %stptr) {33; CHECK-LE-LABEL: v8i8_preidx_same_size:34; CHECK-LE:       // %bb.0: // %entry35; CHECK-LE-NEXT:    ldr d0, [x0, #8]!36; CHECK-LE-NEXT:    str d0, [x1, #8]!37; CHECK-LE-NEXT:    ret38;39; CHECK-BE-LABEL: v8i8_preidx_same_size:40; CHECK-BE:       // %bb.0: // %entry41; CHECK-BE-NEXT:    add x0, x0, #842; CHECK-BE-NEXT:    add x1, x1, #843; CHECK-BE-NEXT:    ld1 { v0.8b }, [x0]44; CHECK-BE-NEXT:    st1 { v0.8b }, [x1]45; CHECK-BE-NEXT:    ret46entry:47  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 848  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 849  %val = load <8 x i8>, ptr %add.ldptr, align 250  store <8 x i8> %val, ptr %add.stptr, align 251  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 052  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 153  ret [2 x ptr] %ret254}55 56define [2 x ptr] @v8i8_postidx_different_size(ptr %ldptr, ptr %stptr) {57; CHECK-LE-LABEL: v8i8_postidx_different_size:58; CHECK-LE:       // %bb.0: // %entry59; CHECK-LE-NEXT:    ldr d0, [x0], #1660; CHECK-LE-NEXT:    str d0, [x1], #1661; CHECK-LE-NEXT:    ret62;63; CHECK-BE-LABEL: v8i8_postidx_different_size:64; CHECK-BE:       // %bb.0: // %entry65; CHECK-BE-NEXT:    ld1 { v0.8b }, [x0]66; CHECK-BE-NEXT:    mov x8, x167; CHECK-BE-NEXT:    add x0, x0, #1668; CHECK-BE-NEXT:    add x1, x1, #1669; CHECK-BE-NEXT:    st1 { v0.8b }, [x8]70; CHECK-BE-NEXT:    ret71entry:72  %val = load <8 x i8>, ptr %ldptr, align 273  store <8 x i8> %val, ptr %stptr, align 274  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 1675  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 1676  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 077  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 178  ret [2 x ptr] %ret279}80 81define [2 x ptr] @v8i8_preidx_different_size(ptr %ldptr, ptr %stptr) {82; CHECK-LE-LABEL: v8i8_preidx_different_size:83; CHECK-LE:       // %bb.0: // %entry84; CHECK-LE-NEXT:    ldr d0, [x0, #16]!85; CHECK-LE-NEXT:    str d0, [x1, #16]!86; CHECK-LE-NEXT:    ret87;88; CHECK-BE-LABEL: v8i8_preidx_different_size:89; CHECK-BE:       // %bb.0: // %entry90; CHECK-BE-NEXT:    add x0, x0, #1691; CHECK-BE-NEXT:    add x1, x1, #1692; CHECK-BE-NEXT:    ld1 { v0.8b }, [x0]93; CHECK-BE-NEXT:    st1 { v0.8b }, [x1]94; CHECK-BE-NEXT:    ret95entry:96  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 1697  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 1698  %val = load <8 x i8>, ptr %add.ldptr, align 299  store <8 x i8> %val, ptr %add.stptr, align 2100  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0101  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1102  ret [2 x ptr] %ret2103}104 105define [2 x ptr] @v8i8_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {106; CHECK-LE-LABEL: v8i8_postidx_reg:107; CHECK-LE:       // %bb.0: // %entry108; CHECK-LE-NEXT:    ldr d0, [x0]109; CHECK-LE-NEXT:    mov x8, x1110; CHECK-LE-NEXT:    add x0, x0, x2111; CHECK-LE-NEXT:    add x1, x1, x2112; CHECK-LE-NEXT:    str d0, [x8]113; CHECK-LE-NEXT:    ret114;115; CHECK-BE-LABEL: v8i8_postidx_reg:116; CHECK-BE:       // %bb.0: // %entry117; CHECK-BE-NEXT:    ld1 { v0.8b }, [x0]118; CHECK-BE-NEXT:    mov x8, x1119; CHECK-BE-NEXT:    add x0, x0, x2120; CHECK-BE-NEXT:    add x1, x1, x2121; CHECK-BE-NEXT:    st1 { v0.8b }, [x8]122; CHECK-BE-NEXT:    ret123entry:124  %val = load <8 x i8>, ptr %ldptr, align 2125  store <8 x i8> %val, ptr %stptr, align 2126  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off127  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off128  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0129  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1130  ret [2 x ptr] %ret2131}132 133define [2 x ptr] @v8i8_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {134; CHECK-LE-LABEL: v8i8_preidx_reg:135; CHECK-LE:       // %bb.0: // %entry136; CHECK-LE-NEXT:    mov x8, x1137; CHECK-LE-NEXT:    ldr d0, [x0, x2]138; CHECK-LE-NEXT:    add x0, x0, x2139; CHECK-LE-NEXT:    add x1, x1, x2140; CHECK-LE-NEXT:    str d0, [x8, x2]141; CHECK-LE-NEXT:    ret142;143; CHECK-BE-LABEL: v8i8_preidx_reg:144; CHECK-BE:       // %bb.0: // %entry145; CHECK-BE-NEXT:    add x0, x0, x2146; CHECK-BE-NEXT:    add x1, x1, x2147; CHECK-BE-NEXT:    ld1 { v0.8b }, [x0]148; CHECK-BE-NEXT:    st1 { v0.8b }, [x1]149; CHECK-BE-NEXT:    ret150entry:151  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off152  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off153  %val = load <8 x i8>, ptr %add.ldptr, align 2154  store <8 x i8> %val, ptr %add.stptr, align 2155  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0156  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1157  ret [2 x ptr] %ret2158}159 160define [2 x ptr] @v4i16_postidx_same_size(ptr %ldptr, ptr %stptr) {161; CHECK-LE-LABEL: v4i16_postidx_same_size:162; CHECK-LE:       // %bb.0: // %entry163; CHECK-LE-NEXT:    ldr d0, [x0], #8164; CHECK-LE-NEXT:    str d0, [x1], #8165; CHECK-LE-NEXT:    ret166;167; CHECK-BE-LABEL: v4i16_postidx_same_size:168; CHECK-BE:       // %bb.0: // %entry169; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0], #8170; CHECK-BE-NEXT:    st1 { v0.4h }, [x1], #8171; CHECK-BE-NEXT:    ret172entry:173  %val = load <4 x i16>, ptr %ldptr, align 2174  store <4 x i16> %val, ptr %stptr, align 2175  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8176  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8177  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0178  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1179  ret [2 x ptr] %ret2180}181 182define [2 x ptr] @v4i16_preidx_same_size(ptr %ldptr, ptr %stptr) {183; CHECK-LE-LABEL: v4i16_preidx_same_size:184; CHECK-LE:       // %bb.0: // %entry185; CHECK-LE-NEXT:    ldr d0, [x0, #8]!186; CHECK-LE-NEXT:    str d0, [x1, #8]!187; CHECK-LE-NEXT:    ret188;189; CHECK-BE-LABEL: v4i16_preidx_same_size:190; CHECK-BE:       // %bb.0: // %entry191; CHECK-BE-NEXT:    add x0, x0, #8192; CHECK-BE-NEXT:    add x1, x1, #8193; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0]194; CHECK-BE-NEXT:    st1 { v0.4h }, [x1]195; CHECK-BE-NEXT:    ret196entry:197  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8198  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8199  %val = load <4 x i16>, ptr %add.ldptr, align 2200  store <4 x i16> %val, ptr %add.stptr, align 2201  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0202  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1203  ret [2 x ptr] %ret2204}205 206define [2 x ptr] @v4i16_postidx_different_size(ptr %ldptr, ptr %stptr) {207; CHECK-LE-LABEL: v4i16_postidx_different_size:208; CHECK-LE:       // %bb.0: // %entry209; CHECK-LE-NEXT:    ldr d0, [x0], #16210; CHECK-LE-NEXT:    str d0, [x1], #16211; CHECK-LE-NEXT:    ret212;213; CHECK-BE-LABEL: v4i16_postidx_different_size:214; CHECK-BE:       // %bb.0: // %entry215; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0]216; CHECK-BE-NEXT:    mov x8, x1217; CHECK-BE-NEXT:    add x0, x0, #16218; CHECK-BE-NEXT:    add x1, x1, #16219; CHECK-BE-NEXT:    st1 { v0.4h }, [x8]220; CHECK-BE-NEXT:    ret221entry:222  %val = load <4 x i16>, ptr %ldptr, align 2223  store <4 x i16> %val, ptr %stptr, align 2224  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16225  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16226  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0227  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1228  ret [2 x ptr] %ret2229}230 231define [2 x ptr] @v4i16_preidx_different_size(ptr %ldptr, ptr %stptr) {232; CHECK-LE-LABEL: v4i16_preidx_different_size:233; CHECK-LE:       // %bb.0: // %entry234; CHECK-LE-NEXT:    ldr d0, [x0, #16]!235; CHECK-LE-NEXT:    str d0, [x1, #16]!236; CHECK-LE-NEXT:    ret237;238; CHECK-BE-LABEL: v4i16_preidx_different_size:239; CHECK-BE:       // %bb.0: // %entry240; CHECK-BE-NEXT:    add x0, x0, #16241; CHECK-BE-NEXT:    add x1, x1, #16242; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0]243; CHECK-BE-NEXT:    st1 { v0.4h }, [x1]244; CHECK-BE-NEXT:    ret245entry:246  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16247  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16248  %val = load <4 x i16>, ptr %add.ldptr, align 2249  store <4 x i16> %val, ptr %add.stptr, align 2250  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0251  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1252  ret [2 x ptr] %ret2253}254 255define [2 x ptr] @v4i16_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {256; CHECK-LE-LABEL: v4i16_postidx_reg:257; CHECK-LE:       // %bb.0: // %entry258; CHECK-LE-NEXT:    ldr d0, [x0]259; CHECK-LE-NEXT:    mov x8, x1260; CHECK-LE-NEXT:    add x0, x0, x2261; CHECK-LE-NEXT:    add x1, x1, x2262; CHECK-LE-NEXT:    str d0, [x8]263; CHECK-LE-NEXT:    ret264;265; CHECK-BE-LABEL: v4i16_postidx_reg:266; CHECK-BE:       // %bb.0: // %entry267; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0]268; CHECK-BE-NEXT:    mov x8, x1269; CHECK-BE-NEXT:    add x0, x0, x2270; CHECK-BE-NEXT:    add x1, x1, x2271; CHECK-BE-NEXT:    st1 { v0.4h }, [x8]272; CHECK-BE-NEXT:    ret273entry:274  %val = load <4 x i16>, ptr %ldptr, align 2275  store <4 x i16> %val, ptr %stptr, align 2276  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off277  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off278  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0279  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1280  ret [2 x ptr] %ret2281}282 283define [2 x ptr] @v4i16_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {284; CHECK-LE-LABEL: v4i16_preidx_reg:285; CHECK-LE:       // %bb.0: // %entry286; CHECK-LE-NEXT:    mov x8, x1287; CHECK-LE-NEXT:    ldr d0, [x0, x2]288; CHECK-LE-NEXT:    add x0, x0, x2289; CHECK-LE-NEXT:    add x1, x1, x2290; CHECK-LE-NEXT:    str d0, [x8, x2]291; CHECK-LE-NEXT:    ret292;293; CHECK-BE-LABEL: v4i16_preidx_reg:294; CHECK-BE:       // %bb.0: // %entry295; CHECK-BE-NEXT:    add x0, x0, x2296; CHECK-BE-NEXT:    add x1, x1, x2297; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0]298; CHECK-BE-NEXT:    st1 { v0.4h }, [x1]299; CHECK-BE-NEXT:    ret300entry:301  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off302  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off303  %val = load <4 x i16>, ptr %add.ldptr, align 2304  store <4 x i16> %val, ptr %add.stptr, align 2305  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0306  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1307  ret [2 x ptr] %ret2308}309 310define [2 x ptr] @v2i32_postidx_same_size(ptr %ldptr, ptr %stptr) {311; CHECK-LE-LABEL: v2i32_postidx_same_size:312; CHECK-LE:       // %bb.0: // %entry313; CHECK-LE-NEXT:    ldr d0, [x0], #8314; CHECK-LE-NEXT:    str d0, [x1], #8315; CHECK-LE-NEXT:    ret316;317; CHECK-BE-LABEL: v2i32_postidx_same_size:318; CHECK-BE:       // %bb.0: // %entry319; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0], #8320; CHECK-BE-NEXT:    st1 { v0.2s }, [x1], #8321; CHECK-BE-NEXT:    ret322entry:323  %val = load <2 x i32>, ptr %ldptr, align 2324  store <2 x i32> %val, ptr %stptr, align 2325  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8326  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8327  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0328  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1329  ret [2 x ptr] %ret2330}331 332define [2 x ptr] @v2i32_preidx_same_size(ptr %ldptr, ptr %stptr) {333; CHECK-LE-LABEL: v2i32_preidx_same_size:334; CHECK-LE:       // %bb.0: // %entry335; CHECK-LE-NEXT:    ldr d0, [x0, #8]!336; CHECK-LE-NEXT:    str d0, [x1, #8]!337; CHECK-LE-NEXT:    ret338;339; CHECK-BE-LABEL: v2i32_preidx_same_size:340; CHECK-BE:       // %bb.0: // %entry341; CHECK-BE-NEXT:    add x0, x0, #8342; CHECK-BE-NEXT:    add x1, x1, #8343; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0]344; CHECK-BE-NEXT:    st1 { v0.2s }, [x1]345; CHECK-BE-NEXT:    ret346entry:347  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8348  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8349  %val = load <2 x i32>, ptr %add.ldptr, align 2350  store <2 x i32> %val, ptr %add.stptr, align 2351  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0352  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1353  ret [2 x ptr] %ret2354}355 356define [2 x ptr] @v2i32_postidx_different_size(ptr %ldptr, ptr %stptr) {357; CHECK-LE-LABEL: v2i32_postidx_different_size:358; CHECK-LE:       // %bb.0: // %entry359; CHECK-LE-NEXT:    ldr d0, [x0], #16360; CHECK-LE-NEXT:    str d0, [x1], #16361; CHECK-LE-NEXT:    ret362;363; CHECK-BE-LABEL: v2i32_postidx_different_size:364; CHECK-BE:       // %bb.0: // %entry365; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0]366; CHECK-BE-NEXT:    mov x8, x1367; CHECK-BE-NEXT:    add x0, x0, #16368; CHECK-BE-NEXT:    add x1, x1, #16369; CHECK-BE-NEXT:    st1 { v0.2s }, [x8]370; CHECK-BE-NEXT:    ret371entry:372  %val = load <2 x i32>, ptr %ldptr, align 2373  store <2 x i32> %val, ptr %stptr, align 2374  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16375  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16376  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0377  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1378  ret [2 x ptr] %ret2379}380 381define [2 x ptr] @v2i32_preidx_different_size(ptr %ldptr, ptr %stptr) {382; CHECK-LE-LABEL: v2i32_preidx_different_size:383; CHECK-LE:       // %bb.0: // %entry384; CHECK-LE-NEXT:    ldr d0, [x0, #16]!385; CHECK-LE-NEXT:    str d0, [x1, #16]!386; CHECK-LE-NEXT:    ret387;388; CHECK-BE-LABEL: v2i32_preidx_different_size:389; CHECK-BE:       // %bb.0: // %entry390; CHECK-BE-NEXT:    add x0, x0, #16391; CHECK-BE-NEXT:    add x1, x1, #16392; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0]393; CHECK-BE-NEXT:    st1 { v0.2s }, [x1]394; CHECK-BE-NEXT:    ret395entry:396  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16397  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16398  %val = load <2 x i32>, ptr %add.ldptr, align 2399  store <2 x i32> %val, ptr %add.stptr, align 2400  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0401  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1402  ret [2 x ptr] %ret2403}404 405define [2 x ptr] @v2i32_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {406; CHECK-LE-LABEL: v2i32_postidx_reg:407; CHECK-LE:       // %bb.0: // %entry408; CHECK-LE-NEXT:    ldr d0, [x0]409; CHECK-LE-NEXT:    mov x8, x1410; CHECK-LE-NEXT:    add x0, x0, x2411; CHECK-LE-NEXT:    add x1, x1, x2412; CHECK-LE-NEXT:    str d0, [x8]413; CHECK-LE-NEXT:    ret414;415; CHECK-BE-LABEL: v2i32_postidx_reg:416; CHECK-BE:       // %bb.0: // %entry417; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0]418; CHECK-BE-NEXT:    mov x8, x1419; CHECK-BE-NEXT:    add x0, x0, x2420; CHECK-BE-NEXT:    add x1, x1, x2421; CHECK-BE-NEXT:    st1 { v0.2s }, [x8]422; CHECK-BE-NEXT:    ret423entry:424  %val = load <2 x i32>, ptr %ldptr, align 2425  store <2 x i32> %val, ptr %stptr, align 2426  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off427  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off428  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0429  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1430  ret [2 x ptr] %ret2431}432 433define [2 x ptr] @v2i32_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {434; CHECK-LE-LABEL: v2i32_preidx_reg:435; CHECK-LE:       // %bb.0: // %entry436; CHECK-LE-NEXT:    mov x8, x1437; CHECK-LE-NEXT:    ldr d0, [x0, x2]438; CHECK-LE-NEXT:    add x0, x0, x2439; CHECK-LE-NEXT:    add x1, x1, x2440; CHECK-LE-NEXT:    str d0, [x8, x2]441; CHECK-LE-NEXT:    ret442;443; CHECK-BE-LABEL: v2i32_preidx_reg:444; CHECK-BE:       // %bb.0: // %entry445; CHECK-BE-NEXT:    add x0, x0, x2446; CHECK-BE-NEXT:    add x1, x1, x2447; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0]448; CHECK-BE-NEXT:    st1 { v0.2s }, [x1]449; CHECK-BE-NEXT:    ret450entry:451  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off452  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off453  %val = load <2 x i32>, ptr %add.ldptr, align 2454  store <2 x i32> %val, ptr %add.stptr, align 2455  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0456  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1457  ret [2 x ptr] %ret2458}459 460define [2 x ptr] @v1i64_postidx_same_size(ptr %ldptr, ptr %stptr) {461; CHECK-LE-LABEL: v1i64_postidx_same_size:462; CHECK-LE:       // %bb.0: // %entry463; CHECK-LE-NEXT:    ldr d0, [x0], #8464; CHECK-LE-NEXT:    str d0, [x1], #8465; CHECK-LE-NEXT:    ret466;467; CHECK-BE-LABEL: v1i64_postidx_same_size:468; CHECK-BE:       // %bb.0: // %entry469; CHECK-BE-NEXT:    ld1 { v0.1d }, [x0], #8470; CHECK-BE-NEXT:    st1 { v0.1d }, [x1], #8471; CHECK-BE-NEXT:    ret472entry:473  %val = load <1 x i64>, ptr %ldptr, align 2474  store <1 x i64> %val, ptr %stptr, align 2475  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8476  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8477  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0478  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1479  ret [2 x ptr] %ret2480}481 482define [2 x ptr] @v1i64_preidx_same_size(ptr %ldptr, ptr %stptr) {483; CHECK-LE-LABEL: v1i64_preidx_same_size:484; CHECK-LE:       // %bb.0: // %entry485; CHECK-LE-NEXT:    ldr d0, [x0, #8]!486; CHECK-LE-NEXT:    str d0, [x1, #8]!487; CHECK-LE-NEXT:    ret488;489; CHECK-BE-LABEL: v1i64_preidx_same_size:490; CHECK-BE:       // %bb.0: // %entry491; CHECK-BE-NEXT:    ldr d0, [x0, #8]!492; CHECK-BE-NEXT:    mov x8, x1493; CHECK-BE-NEXT:    add x1, x1, #8494; CHECK-BE-NEXT:    str d0, [x8, #8]495; CHECK-BE-NEXT:    ret496entry:497  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8498  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8499  %val = load <1 x i64>, ptr %add.ldptr, align 2500  store <1 x i64> %val, ptr %add.stptr, align 2501  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0502  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1503  ret [2 x ptr] %ret2504}505 506define [2 x ptr] @v1i64_postidx_different_size(ptr %ldptr, ptr %stptr) {507; CHECK-LE-LABEL: v1i64_postidx_different_size:508; CHECK-LE:       // %bb.0: // %entry509; CHECK-LE-NEXT:    ldr d0, [x0], #16510; CHECK-LE-NEXT:    str d0, [x1], #16511; CHECK-LE-NEXT:    ret512;513; CHECK-BE-LABEL: v1i64_postidx_different_size:514; CHECK-BE:       // %bb.0: // %entry515; CHECK-BE-NEXT:    ldr d0, [x0], #16516; CHECK-BE-NEXT:    mov x8, x1517; CHECK-BE-NEXT:    add x1, x1, #16518; CHECK-BE-NEXT:    str d0, [x8]519; CHECK-BE-NEXT:    ret520entry:521  %val = load <1 x i64>, ptr %ldptr, align 2522  store <1 x i64> %val, ptr %stptr, align 2523  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16524  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16525  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0526  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1527  ret [2 x ptr] %ret2528}529 530define [2 x ptr] @v1i64_preidx_different_size(ptr %ldptr, ptr %stptr) {531; CHECK-LE-LABEL: v1i64_preidx_different_size:532; CHECK-LE:       // %bb.0: // %entry533; CHECK-LE-NEXT:    ldr d0, [x0, #16]!534; CHECK-LE-NEXT:    str d0, [x1, #16]!535; CHECK-LE-NEXT:    ret536;537; CHECK-BE-LABEL: v1i64_preidx_different_size:538; CHECK-BE:       // %bb.0: // %entry539; CHECK-BE-NEXT:    ldr d0, [x0, #16]!540; CHECK-BE-NEXT:    mov x8, x1541; CHECK-BE-NEXT:    add x1, x1, #16542; CHECK-BE-NEXT:    str d0, [x8, #16]543; CHECK-BE-NEXT:    ret544entry:545  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16546  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16547  %val = load <1 x i64>, ptr %add.ldptr, align 2548  store <1 x i64> %val, ptr %add.stptr, align 2549  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0550  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1551  ret [2 x ptr] %ret2552}553 554define [2 x ptr] @v1i64_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {555; CHECK-LE-LABEL: v1i64_postidx_reg:556; CHECK-LE:       // %bb.0: // %entry557; CHECK-LE-NEXT:    ldr d0, [x0]558; CHECK-LE-NEXT:    mov x8, x1559; CHECK-LE-NEXT:    add x0, x0, x2560; CHECK-LE-NEXT:    add x1, x1, x2561; CHECK-LE-NEXT:    str d0, [x8]562; CHECK-LE-NEXT:    ret563;564; CHECK-BE-LABEL: v1i64_postidx_reg:565; CHECK-BE:       // %bb.0: // %entry566; CHECK-BE-NEXT:    ldr d0, [x0]567; CHECK-BE-NEXT:    mov x8, x1568; CHECK-BE-NEXT:    add x0, x0, x2569; CHECK-BE-NEXT:    add x1, x1, x2570; CHECK-BE-NEXT:    str d0, [x8]571; CHECK-BE-NEXT:    ret572entry:573  %val = load <1 x i64>, ptr %ldptr, align 2574  store <1 x i64> %val, ptr %stptr, align 2575  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off576  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off577  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0578  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1579  ret [2 x ptr] %ret2580}581 582define [2 x ptr] @v1i64_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {583; CHECK-LE-LABEL: v1i64_preidx_reg:584; CHECK-LE:       // %bb.0: // %entry585; CHECK-LE-NEXT:    mov x8, x1586; CHECK-LE-NEXT:    ldr d0, [x0, x2]587; CHECK-LE-NEXT:    add x0, x0, x2588; CHECK-LE-NEXT:    add x1, x1, x2589; CHECK-LE-NEXT:    str d0, [x8, x2]590; CHECK-LE-NEXT:    ret591;592; CHECK-BE-LABEL: v1i64_preidx_reg:593; CHECK-BE:       // %bb.0: // %entry594; CHECK-BE-NEXT:    mov x8, x1595; CHECK-BE-NEXT:    ldr d0, [x0, x2]596; CHECK-BE-NEXT:    add x0, x0, x2597; CHECK-BE-NEXT:    add x1, x1, x2598; CHECK-BE-NEXT:    str d0, [x8, x2]599; CHECK-BE-NEXT:    ret600entry:601  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off602  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off603  %val = load <1 x i64>, ptr %add.ldptr, align 2604  store <1 x i64> %val, ptr %add.stptr, align 2605  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0606  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1607  ret [2 x ptr] %ret2608}609 610define [2 x ptr] @v4f16_postidx_same_size(ptr %ldptr, ptr %stptr) {611; CHECK-LE-LABEL: v4f16_postidx_same_size:612; CHECK-LE:       // %bb.0: // %entry613; CHECK-LE-NEXT:    ldr d0, [x0], #8614; CHECK-LE-NEXT:    str d0, [x1], #8615; CHECK-LE-NEXT:    ret616;617; CHECK-BE-LABEL: v4f16_postidx_same_size:618; CHECK-BE:       // %bb.0: // %entry619; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0], #8620; CHECK-BE-NEXT:    st1 { v0.4h }, [x1], #8621; CHECK-BE-NEXT:    ret622entry:623  %val = load <4 x half>, ptr %ldptr, align 2624  store <4 x half> %val, ptr %stptr, align 2625  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8626  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8627  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0628  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1629  ret [2 x ptr] %ret2630}631 632define [2 x ptr] @v4f16_preidx_same_size(ptr %ldptr, ptr %stptr) {633; CHECK-LE-LABEL: v4f16_preidx_same_size:634; CHECK-LE:       // %bb.0: // %entry635; CHECK-LE-NEXT:    ldr d0, [x0, #8]!636; CHECK-LE-NEXT:    str d0, [x1, #8]!637; CHECK-LE-NEXT:    ret638;639; CHECK-BE-LABEL: v4f16_preidx_same_size:640; CHECK-BE:       // %bb.0: // %entry641; CHECK-BE-NEXT:    add x0, x0, #8642; CHECK-BE-NEXT:    add x1, x1, #8643; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0]644; CHECK-BE-NEXT:    st1 { v0.4h }, [x1]645; CHECK-BE-NEXT:    ret646entry:647  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8648  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8649  %val = load <4 x half>, ptr %add.ldptr, align 2650  store <4 x half> %val, ptr %add.stptr, align 2651  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0652  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1653  ret [2 x ptr] %ret2654}655 656define [2 x ptr] @v4f16_postidx_different_size(ptr %ldptr, ptr %stptr) {657; CHECK-LE-LABEL: v4f16_postidx_different_size:658; CHECK-LE:       // %bb.0: // %entry659; CHECK-LE-NEXT:    ldr d0, [x0], #16660; CHECK-LE-NEXT:    str d0, [x1], #16661; CHECK-LE-NEXT:    ret662;663; CHECK-BE-LABEL: v4f16_postidx_different_size:664; CHECK-BE:       // %bb.0: // %entry665; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0]666; CHECK-BE-NEXT:    mov x8, x1667; CHECK-BE-NEXT:    add x0, x0, #16668; CHECK-BE-NEXT:    add x1, x1, #16669; CHECK-BE-NEXT:    st1 { v0.4h }, [x8]670; CHECK-BE-NEXT:    ret671entry:672  %val = load <4 x half>, ptr %ldptr, align 2673  store <4 x half> %val, ptr %stptr, align 2674  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16675  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16676  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0677  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1678  ret [2 x ptr] %ret2679}680 681define [2 x ptr] @v4f16_preidx_different_size(ptr %ldptr, ptr %stptr) {682; CHECK-LE-LABEL: v4f16_preidx_different_size:683; CHECK-LE:       // %bb.0: // %entry684; CHECK-LE-NEXT:    ldr d0, [x0, #16]!685; CHECK-LE-NEXT:    str d0, [x1, #16]!686; CHECK-LE-NEXT:    ret687;688; CHECK-BE-LABEL: v4f16_preidx_different_size:689; CHECK-BE:       // %bb.0: // %entry690; CHECK-BE-NEXT:    add x0, x0, #16691; CHECK-BE-NEXT:    add x1, x1, #16692; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0]693; CHECK-BE-NEXT:    st1 { v0.4h }, [x1]694; CHECK-BE-NEXT:    ret695entry:696  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16697  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16698  %val = load <4 x half>, ptr %add.ldptr, align 2699  store <4 x half> %val, ptr %add.stptr, align 2700  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0701  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1702  ret [2 x ptr] %ret2703}704 705define [2 x ptr] @v4f16_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {706; CHECK-LE-LABEL: v4f16_postidx_reg:707; CHECK-LE:       // %bb.0: // %entry708; CHECK-LE-NEXT:    ldr d0, [x0]709; CHECK-LE-NEXT:    mov x8, x1710; CHECK-LE-NEXT:    add x0, x0, x2711; CHECK-LE-NEXT:    add x1, x1, x2712; CHECK-LE-NEXT:    str d0, [x8]713; CHECK-LE-NEXT:    ret714;715; CHECK-BE-LABEL: v4f16_postidx_reg:716; CHECK-BE:       // %bb.0: // %entry717; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0]718; CHECK-BE-NEXT:    mov x8, x1719; CHECK-BE-NEXT:    add x0, x0, x2720; CHECK-BE-NEXT:    add x1, x1, x2721; CHECK-BE-NEXT:    st1 { v0.4h }, [x8]722; CHECK-BE-NEXT:    ret723entry:724  %val = load <4 x half>, ptr %ldptr, align 2725  store <4 x half> %val, ptr %stptr, align 2726  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off727  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off728  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0729  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1730  ret [2 x ptr] %ret2731}732 733define [2 x ptr] @v4f16_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {734; CHECK-LE-LABEL: v4f16_preidx_reg:735; CHECK-LE:       // %bb.0: // %entry736; CHECK-LE-NEXT:    mov x8, x1737; CHECK-LE-NEXT:    ldr d0, [x0, x2]738; CHECK-LE-NEXT:    add x0, x0, x2739; CHECK-LE-NEXT:    add x1, x1, x2740; CHECK-LE-NEXT:    str d0, [x8, x2]741; CHECK-LE-NEXT:    ret742;743; CHECK-BE-LABEL: v4f16_preidx_reg:744; CHECK-BE:       // %bb.0: // %entry745; CHECK-BE-NEXT:    add x0, x0, x2746; CHECK-BE-NEXT:    add x1, x1, x2747; CHECK-BE-NEXT:    ld1 { v0.4h }, [x0]748; CHECK-BE-NEXT:    st1 { v0.4h }, [x1]749; CHECK-BE-NEXT:    ret750entry:751  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off752  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off753  %val = load <4 x half>, ptr %add.ldptr, align 2754  store <4 x half> %val, ptr %add.stptr, align 2755  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0756  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1757  ret [2 x ptr] %ret2758}759 760define [2 x ptr] @v2f32_postidx_same_size(ptr %ldptr, ptr %stptr) {761; CHECK-LE-LABEL: v2f32_postidx_same_size:762; CHECK-LE:       // %bb.0: // %entry763; CHECK-LE-NEXT:    ldr d0, [x0], #8764; CHECK-LE-NEXT:    str d0, [x1], #8765; CHECK-LE-NEXT:    ret766;767; CHECK-BE-LABEL: v2f32_postidx_same_size:768; CHECK-BE:       // %bb.0: // %entry769; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0], #8770; CHECK-BE-NEXT:    st1 { v0.2s }, [x1], #8771; CHECK-BE-NEXT:    ret772entry:773  %val = load <2 x float>, ptr %ldptr, align 2774  store <2 x float> %val, ptr %stptr, align 2775  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8776  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8777  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0778  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1779  ret [2 x ptr] %ret2780}781 782define [2 x ptr] @v2f32_preidx_same_size(ptr %ldptr, ptr %stptr) {783; CHECK-LE-LABEL: v2f32_preidx_same_size:784; CHECK-LE:       // %bb.0: // %entry785; CHECK-LE-NEXT:    ldr d0, [x0, #8]!786; CHECK-LE-NEXT:    str d0, [x1, #8]!787; CHECK-LE-NEXT:    ret788;789; CHECK-BE-LABEL: v2f32_preidx_same_size:790; CHECK-BE:       // %bb.0: // %entry791; CHECK-BE-NEXT:    add x0, x0, #8792; CHECK-BE-NEXT:    add x1, x1, #8793; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0]794; CHECK-BE-NEXT:    st1 { v0.2s }, [x1]795; CHECK-BE-NEXT:    ret796entry:797  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8798  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8799  %val = load <2 x float>, ptr %add.ldptr, align 2800  store <2 x float> %val, ptr %add.stptr, align 2801  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0802  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1803  ret [2 x ptr] %ret2804}805 806define [2 x ptr] @v2f32_postidx_different_size(ptr %ldptr, ptr %stptr) {807; CHECK-LE-LABEL: v2f32_postidx_different_size:808; CHECK-LE:       // %bb.0: // %entry809; CHECK-LE-NEXT:    ldr d0, [x0], #16810; CHECK-LE-NEXT:    str d0, [x1], #16811; CHECK-LE-NEXT:    ret812;813; CHECK-BE-LABEL: v2f32_postidx_different_size:814; CHECK-BE:       // %bb.0: // %entry815; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0]816; CHECK-BE-NEXT:    mov x8, x1817; CHECK-BE-NEXT:    add x0, x0, #16818; CHECK-BE-NEXT:    add x1, x1, #16819; CHECK-BE-NEXT:    st1 { v0.2s }, [x8]820; CHECK-BE-NEXT:    ret821entry:822  %val = load <2 x float>, ptr %ldptr, align 2823  store <2 x float> %val, ptr %stptr, align 2824  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16825  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16826  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0827  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1828  ret [2 x ptr] %ret2829}830 831define [2 x ptr] @v2f32_preidx_different_size(ptr %ldptr, ptr %stptr) {832; CHECK-LE-LABEL: v2f32_preidx_different_size:833; CHECK-LE:       // %bb.0: // %entry834; CHECK-LE-NEXT:    ldr d0, [x0, #16]!835; CHECK-LE-NEXT:    str d0, [x1, #16]!836; CHECK-LE-NEXT:    ret837;838; CHECK-BE-LABEL: v2f32_preidx_different_size:839; CHECK-BE:       // %bb.0: // %entry840; CHECK-BE-NEXT:    add x0, x0, #16841; CHECK-BE-NEXT:    add x1, x1, #16842; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0]843; CHECK-BE-NEXT:    st1 { v0.2s }, [x1]844; CHECK-BE-NEXT:    ret845entry:846  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16847  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16848  %val = load <2 x float>, ptr %add.ldptr, align 2849  store <2 x float> %val, ptr %add.stptr, align 2850  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0851  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1852  ret [2 x ptr] %ret2853}854 855define [2 x ptr] @v2f32_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {856; CHECK-LE-LABEL: v2f32_postidx_reg:857; CHECK-LE:       // %bb.0: // %entry858; CHECK-LE-NEXT:    ldr d0, [x0]859; CHECK-LE-NEXT:    mov x8, x1860; CHECK-LE-NEXT:    add x0, x0, x2861; CHECK-LE-NEXT:    add x1, x1, x2862; CHECK-LE-NEXT:    str d0, [x8]863; CHECK-LE-NEXT:    ret864;865; CHECK-BE-LABEL: v2f32_postidx_reg:866; CHECK-BE:       // %bb.0: // %entry867; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0]868; CHECK-BE-NEXT:    mov x8, x1869; CHECK-BE-NEXT:    add x0, x0, x2870; CHECK-BE-NEXT:    add x1, x1, x2871; CHECK-BE-NEXT:    st1 { v0.2s }, [x8]872; CHECK-BE-NEXT:    ret873entry:874  %val = load <2 x float>, ptr %ldptr, align 2875  store <2 x float> %val, ptr %stptr, align 2876  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off877  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off878  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0879  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1880  ret [2 x ptr] %ret2881}882 883define [2 x ptr] @v2f32_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {884; CHECK-LE-LABEL: v2f32_preidx_reg:885; CHECK-LE:       // %bb.0: // %entry886; CHECK-LE-NEXT:    mov x8, x1887; CHECK-LE-NEXT:    ldr d0, [x0, x2]888; CHECK-LE-NEXT:    add x0, x0, x2889; CHECK-LE-NEXT:    add x1, x1, x2890; CHECK-LE-NEXT:    str d0, [x8, x2]891; CHECK-LE-NEXT:    ret892;893; CHECK-BE-LABEL: v2f32_preidx_reg:894; CHECK-BE:       // %bb.0: // %entry895; CHECK-BE-NEXT:    add x0, x0, x2896; CHECK-BE-NEXT:    add x1, x1, x2897; CHECK-BE-NEXT:    ld1 { v0.2s }, [x0]898; CHECK-BE-NEXT:    st1 { v0.2s }, [x1]899; CHECK-BE-NEXT:    ret900entry:901  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off902  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off903  %val = load <2 x float>, ptr %add.ldptr, align 2904  store <2 x float> %val, ptr %add.stptr, align 2905  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0906  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1907  ret [2 x ptr] %ret2908}909 910define [2 x ptr] @v1f64_postidx_same_size(ptr %ldptr, ptr %stptr) {911; CHECK-LE-LABEL: v1f64_postidx_same_size:912; CHECK-LE:       // %bb.0: // %entry913; CHECK-LE-NEXT:    ldr d0, [x0], #8914; CHECK-LE-NEXT:    str d0, [x1], #8915; CHECK-LE-NEXT:    ret916;917; CHECK-BE-LABEL: v1f64_postidx_same_size:918; CHECK-BE:       // %bb.0: // %entry919; CHECK-BE-NEXT:    ld1 { v0.1d }, [x0], #8920; CHECK-BE-NEXT:    st1 { v0.1d }, [x1], #8921; CHECK-BE-NEXT:    ret922entry:923  %val = load <1 x double>, ptr %ldptr, align 2924  store <1 x double> %val, ptr %stptr, align 2925  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8926  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8927  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0928  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1929  ret [2 x ptr] %ret2930}931 932define [2 x ptr] @v1f64_preidx_same_size(ptr %ldptr, ptr %stptr) {933; CHECK-LE-LABEL: v1f64_preidx_same_size:934; CHECK-LE:       // %bb.0: // %entry935; CHECK-LE-NEXT:    ldr d0, [x0, #8]!936; CHECK-LE-NEXT:    str d0, [x1, #8]!937; CHECK-LE-NEXT:    ret938;939; CHECK-BE-LABEL: v1f64_preidx_same_size:940; CHECK-BE:       // %bb.0: // %entry941; CHECK-BE-NEXT:    ldr d0, [x0, #8]!942; CHECK-BE-NEXT:    mov x8, x1943; CHECK-BE-NEXT:    add x1, x1, #8944; CHECK-BE-NEXT:    str d0, [x8, #8]945; CHECK-BE-NEXT:    ret946entry:947  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 8948  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 8949  %val = load <1 x double>, ptr %add.ldptr, align 2950  store <1 x double> %val, ptr %add.stptr, align 2951  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0952  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1953  ret [2 x ptr] %ret2954}955 956define [2 x ptr] @v1f64_postidx_different_size(ptr %ldptr, ptr %stptr) {957; CHECK-LE-LABEL: v1f64_postidx_different_size:958; CHECK-LE:       // %bb.0: // %entry959; CHECK-LE-NEXT:    ldr d0, [x0], #16960; CHECK-LE-NEXT:    str d0, [x1], #16961; CHECK-LE-NEXT:    ret962;963; CHECK-BE-LABEL: v1f64_postidx_different_size:964; CHECK-BE:       // %bb.0: // %entry965; CHECK-BE-NEXT:    ldr d0, [x0], #16966; CHECK-BE-NEXT:    mov x8, x1967; CHECK-BE-NEXT:    add x1, x1, #16968; CHECK-BE-NEXT:    str d0, [x8]969; CHECK-BE-NEXT:    ret970entry:971  %val = load <1 x double>, ptr %ldptr, align 2972  store <1 x double> %val, ptr %stptr, align 2973  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16974  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16975  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 0976  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 1977  ret [2 x ptr] %ret2978}979 980define [2 x ptr] @v1f64_preidx_different_size(ptr %ldptr, ptr %stptr) {981; CHECK-LE-LABEL: v1f64_preidx_different_size:982; CHECK-LE:       // %bb.0: // %entry983; CHECK-LE-NEXT:    ldr d0, [x0, #16]!984; CHECK-LE-NEXT:    str d0, [x1, #16]!985; CHECK-LE-NEXT:    ret986;987; CHECK-BE-LABEL: v1f64_preidx_different_size:988; CHECK-BE:       // %bb.0: // %entry989; CHECK-BE-NEXT:    ldr d0, [x0, #16]!990; CHECK-BE-NEXT:    mov x8, x1991; CHECK-BE-NEXT:    add x1, x1, #16992; CHECK-BE-NEXT:    str d0, [x8, #16]993; CHECK-BE-NEXT:    ret994entry:995  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 16996  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 16997  %val = load <1 x double>, ptr %add.ldptr, align 2998  store <1 x double> %val, ptr %add.stptr, align 2999  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01000  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11001  ret [2 x ptr] %ret21002}1003 1004define [2 x ptr] @v1f64_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1005; CHECK-LE-LABEL: v1f64_postidx_reg:1006; CHECK-LE:       // %bb.0: // %entry1007; CHECK-LE-NEXT:    ldr d0, [x0]1008; CHECK-LE-NEXT:    mov x8, x11009; CHECK-LE-NEXT:    add x0, x0, x21010; CHECK-LE-NEXT:    add x1, x1, x21011; CHECK-LE-NEXT:    str d0, [x8]1012; CHECK-LE-NEXT:    ret1013;1014; CHECK-BE-LABEL: v1f64_postidx_reg:1015; CHECK-BE:       // %bb.0: // %entry1016; CHECK-BE-NEXT:    ldr d0, [x0]1017; CHECK-BE-NEXT:    mov x8, x11018; CHECK-BE-NEXT:    add x0, x0, x21019; CHECK-BE-NEXT:    add x1, x1, x21020; CHECK-BE-NEXT:    str d0, [x8]1021; CHECK-BE-NEXT:    ret1022entry:1023  %val = load <1 x double>, ptr %ldptr, align 21024  store <1 x double> %val, ptr %stptr, align 21025  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1026  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1027  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01028  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11029  ret [2 x ptr] %ret21030}1031 1032define [2 x ptr] @v1f64_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1033; CHECK-LE-LABEL: v1f64_preidx_reg:1034; CHECK-LE:       // %bb.0: // %entry1035; CHECK-LE-NEXT:    mov x8, x11036; CHECK-LE-NEXT:    ldr d0, [x0, x2]1037; CHECK-LE-NEXT:    add x0, x0, x21038; CHECK-LE-NEXT:    add x1, x1, x21039; CHECK-LE-NEXT:    str d0, [x8, x2]1040; CHECK-LE-NEXT:    ret1041;1042; CHECK-BE-LABEL: v1f64_preidx_reg:1043; CHECK-BE:       // %bb.0: // %entry1044; CHECK-BE-NEXT:    mov x8, x11045; CHECK-BE-NEXT:    ldr d0, [x0, x2]1046; CHECK-BE-NEXT:    add x0, x0, x21047; CHECK-BE-NEXT:    add x1, x1, x21048; CHECK-BE-NEXT:    str d0, [x8, x2]1049; CHECK-BE-NEXT:    ret1050entry:1051  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1052  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1053  %val = load <1 x double>, ptr %add.ldptr, align 21054  store <1 x double> %val, ptr %add.stptr, align 21055  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01056  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11057  ret [2 x ptr] %ret21058}1059 1060define [2 x ptr] @v16i8_postidx_same_size(ptr %ldptr, ptr %stptr) {1061; CHECK-LE-LABEL: v16i8_postidx_same_size:1062; CHECK-LE:       // %bb.0: // %entry1063; CHECK-LE-NEXT:    ldr q0, [x0], #161064; CHECK-LE-NEXT:    str q0, [x1], #161065; CHECK-LE-NEXT:    ret1066;1067; CHECK-BE-LABEL: v16i8_postidx_same_size:1068; CHECK-BE:       // %bb.0: // %entry1069; CHECK-BE-NEXT:    ld1 { v0.16b }, [x0], #161070; CHECK-BE-NEXT:    st1 { v0.16b }, [x1], #161071; CHECK-BE-NEXT:    ret1072entry:1073  %val = load <16 x i8>, ptr %ldptr, align 21074  store <16 x i8> %val, ptr %stptr, align 21075  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161076  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161077  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01078  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11079  ret [2 x ptr] %ret21080}1081 1082define [2 x ptr] @v16i8_preidx_same_size(ptr %ldptr, ptr %stptr) {1083; CHECK-LE-LABEL: v16i8_preidx_same_size:1084; CHECK-LE:       // %bb.0: // %entry1085; CHECK-LE-NEXT:    ldr q0, [x0, #16]!1086; CHECK-LE-NEXT:    str q0, [x1, #16]!1087; CHECK-LE-NEXT:    ret1088;1089; CHECK-BE-LABEL: v16i8_preidx_same_size:1090; CHECK-BE:       // %bb.0: // %entry1091; CHECK-BE-NEXT:    add x0, x0, #161092; CHECK-BE-NEXT:    add x1, x1, #161093; CHECK-BE-NEXT:    ld1 { v0.16b }, [x0]1094; CHECK-BE-NEXT:    st1 { v0.16b }, [x1]1095; CHECK-BE-NEXT:    ret1096entry:1097  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161098  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161099  %val = load <16 x i8>, ptr %add.ldptr, align 21100  store <16 x i8> %val, ptr %add.stptr, align 21101  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01102  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11103  ret [2 x ptr] %ret21104}1105 1106define [2 x ptr] @v16i8_postidx_different_size(ptr %ldptr, ptr %stptr) {1107; CHECK-LE-LABEL: v16i8_postidx_different_size:1108; CHECK-LE:       // %bb.0: // %entry1109; CHECK-LE-NEXT:    ldr q0, [x0], #321110; CHECK-LE-NEXT:    str q0, [x1], #321111; CHECK-LE-NEXT:    ret1112;1113; CHECK-BE-LABEL: v16i8_postidx_different_size:1114; CHECK-BE:       // %bb.0: // %entry1115; CHECK-BE-NEXT:    ld1 { v0.16b }, [x0]1116; CHECK-BE-NEXT:    mov x8, x11117; CHECK-BE-NEXT:    add x0, x0, #321118; CHECK-BE-NEXT:    add x1, x1, #321119; CHECK-BE-NEXT:    st1 { v0.16b }, [x8]1120; CHECK-BE-NEXT:    ret1121entry:1122  %val = load <16 x i8>, ptr %ldptr, align 21123  store <16 x i8> %val, ptr %stptr, align 21124  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321125  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321126  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01127  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11128  ret [2 x ptr] %ret21129}1130 1131define [2 x ptr] @v16i8_preidx_different_size(ptr %ldptr, ptr %stptr) {1132; CHECK-LE-LABEL: v16i8_preidx_different_size:1133; CHECK-LE:       // %bb.0: // %entry1134; CHECK-LE-NEXT:    ldr q0, [x0, #32]!1135; CHECK-LE-NEXT:    str q0, [x1, #32]!1136; CHECK-LE-NEXT:    ret1137;1138; CHECK-BE-LABEL: v16i8_preidx_different_size:1139; CHECK-BE:       // %bb.0: // %entry1140; CHECK-BE-NEXT:    add x0, x0, #321141; CHECK-BE-NEXT:    add x1, x1, #321142; CHECK-BE-NEXT:    ld1 { v0.16b }, [x0]1143; CHECK-BE-NEXT:    st1 { v0.16b }, [x1]1144; CHECK-BE-NEXT:    ret1145entry:1146  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321147  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321148  %val = load <16 x i8>, ptr %add.ldptr, align 21149  store <16 x i8> %val, ptr %add.stptr, align 21150  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01151  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11152  ret [2 x ptr] %ret21153}1154 1155define [2 x ptr] @v16i8_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1156; CHECK-LE-LABEL: v16i8_postidx_reg:1157; CHECK-LE:       // %bb.0: // %entry1158; CHECK-LE-NEXT:    ldr q0, [x0]1159; CHECK-LE-NEXT:    mov x8, x11160; CHECK-LE-NEXT:    add x0, x0, x21161; CHECK-LE-NEXT:    add x1, x1, x21162; CHECK-LE-NEXT:    str q0, [x8]1163; CHECK-LE-NEXT:    ret1164;1165; CHECK-BE-LABEL: v16i8_postidx_reg:1166; CHECK-BE:       // %bb.0: // %entry1167; CHECK-BE-NEXT:    ld1 { v0.16b }, [x0]1168; CHECK-BE-NEXT:    mov x8, x11169; CHECK-BE-NEXT:    add x0, x0, x21170; CHECK-BE-NEXT:    add x1, x1, x21171; CHECK-BE-NEXT:    st1 { v0.16b }, [x8]1172; CHECK-BE-NEXT:    ret1173entry:1174  %val = load <16 x i8>, ptr %ldptr, align 21175  store <16 x i8> %val, ptr %stptr, align 21176  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1177  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1178  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01179  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11180  ret [2 x ptr] %ret21181}1182 1183define [2 x ptr] @v16i8_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1184; CHECK-LE-LABEL: v16i8_preidx_reg:1185; CHECK-LE:       // %bb.0: // %entry1186; CHECK-LE-NEXT:    mov x8, x11187; CHECK-LE-NEXT:    ldr q0, [x0, x2]1188; CHECK-LE-NEXT:    add x0, x0, x21189; CHECK-LE-NEXT:    add x1, x1, x21190; CHECK-LE-NEXT:    str q0, [x8, x2]1191; CHECK-LE-NEXT:    ret1192;1193; CHECK-BE-LABEL: v16i8_preidx_reg:1194; CHECK-BE:       // %bb.0: // %entry1195; CHECK-BE-NEXT:    add x0, x0, x21196; CHECK-BE-NEXT:    add x1, x1, x21197; CHECK-BE-NEXT:    ld1 { v0.16b }, [x0]1198; CHECK-BE-NEXT:    st1 { v0.16b }, [x1]1199; CHECK-BE-NEXT:    ret1200entry:1201  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1202  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1203  %val = load <16 x i8>, ptr %add.ldptr, align 21204  store <16 x i8> %val, ptr %add.stptr, align 21205  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01206  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11207  ret [2 x ptr] %ret21208}1209 1210define [2 x ptr] @v8i16_postidx_same_size(ptr %ldptr, ptr %stptr) {1211; CHECK-LE-LABEL: v8i16_postidx_same_size:1212; CHECK-LE:       // %bb.0: // %entry1213; CHECK-LE-NEXT:    ldr q0, [x0], #161214; CHECK-LE-NEXT:    str q0, [x1], #161215; CHECK-LE-NEXT:    ret1216;1217; CHECK-BE-LABEL: v8i16_postidx_same_size:1218; CHECK-BE:       // %bb.0: // %entry1219; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0], #161220; CHECK-BE-NEXT:    st1 { v0.8h }, [x1], #161221; CHECK-BE-NEXT:    ret1222entry:1223  %val = load <8 x i16>, ptr %ldptr, align 21224  store <8 x i16> %val, ptr %stptr, align 21225  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161226  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161227  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01228  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11229  ret [2 x ptr] %ret21230}1231 1232define [2 x ptr] @v8i16_preidx_same_size(ptr %ldptr, ptr %stptr) {1233; CHECK-LE-LABEL: v8i16_preidx_same_size:1234; CHECK-LE:       // %bb.0: // %entry1235; CHECK-LE-NEXT:    ldr q0, [x0, #16]!1236; CHECK-LE-NEXT:    str q0, [x1, #16]!1237; CHECK-LE-NEXT:    ret1238;1239; CHECK-BE-LABEL: v8i16_preidx_same_size:1240; CHECK-BE:       // %bb.0: // %entry1241; CHECK-BE-NEXT:    add x0, x0, #161242; CHECK-BE-NEXT:    add x1, x1, #161243; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0]1244; CHECK-BE-NEXT:    st1 { v0.8h }, [x1]1245; CHECK-BE-NEXT:    ret1246entry:1247  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161248  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161249  %val = load <8 x i16>, ptr %add.ldptr, align 21250  store <8 x i16> %val, ptr %add.stptr, align 21251  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01252  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11253  ret [2 x ptr] %ret21254}1255 1256define [2 x ptr] @v8i16_postidx_different_size(ptr %ldptr, ptr %stptr) {1257; CHECK-LE-LABEL: v8i16_postidx_different_size:1258; CHECK-LE:       // %bb.0: // %entry1259; CHECK-LE-NEXT:    ldr q0, [x0], #321260; CHECK-LE-NEXT:    str q0, [x1], #321261; CHECK-LE-NEXT:    ret1262;1263; CHECK-BE-LABEL: v8i16_postidx_different_size:1264; CHECK-BE:       // %bb.0: // %entry1265; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0]1266; CHECK-BE-NEXT:    mov x8, x11267; CHECK-BE-NEXT:    add x0, x0, #321268; CHECK-BE-NEXT:    add x1, x1, #321269; CHECK-BE-NEXT:    st1 { v0.8h }, [x8]1270; CHECK-BE-NEXT:    ret1271entry:1272  %val = load <8 x i16>, ptr %ldptr, align 21273  store <8 x i16> %val, ptr %stptr, align 21274  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321275  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321276  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01277  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11278  ret [2 x ptr] %ret21279}1280 1281define [2 x ptr] @v8i16_preidx_different_size(ptr %ldptr, ptr %stptr) {1282; CHECK-LE-LABEL: v8i16_preidx_different_size:1283; CHECK-LE:       // %bb.0: // %entry1284; CHECK-LE-NEXT:    ldr q0, [x0, #32]!1285; CHECK-LE-NEXT:    str q0, [x1, #32]!1286; CHECK-LE-NEXT:    ret1287;1288; CHECK-BE-LABEL: v8i16_preidx_different_size:1289; CHECK-BE:       // %bb.0: // %entry1290; CHECK-BE-NEXT:    add x0, x0, #321291; CHECK-BE-NEXT:    add x1, x1, #321292; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0]1293; CHECK-BE-NEXT:    st1 { v0.8h }, [x1]1294; CHECK-BE-NEXT:    ret1295entry:1296  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321297  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321298  %val = load <8 x i16>, ptr %add.ldptr, align 21299  store <8 x i16> %val, ptr %add.stptr, align 21300  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01301  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11302  ret [2 x ptr] %ret21303}1304 1305define [2 x ptr] @v8i16_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1306; CHECK-LE-LABEL: v8i16_postidx_reg:1307; CHECK-LE:       // %bb.0: // %entry1308; CHECK-LE-NEXT:    ldr q0, [x0]1309; CHECK-LE-NEXT:    mov x8, x11310; CHECK-LE-NEXT:    add x0, x0, x21311; CHECK-LE-NEXT:    add x1, x1, x21312; CHECK-LE-NEXT:    str q0, [x8]1313; CHECK-LE-NEXT:    ret1314;1315; CHECK-BE-LABEL: v8i16_postidx_reg:1316; CHECK-BE:       // %bb.0: // %entry1317; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0]1318; CHECK-BE-NEXT:    mov x8, x11319; CHECK-BE-NEXT:    add x0, x0, x21320; CHECK-BE-NEXT:    add x1, x1, x21321; CHECK-BE-NEXT:    st1 { v0.8h }, [x8]1322; CHECK-BE-NEXT:    ret1323entry:1324  %val = load <8 x i16>, ptr %ldptr, align 21325  store <8 x i16> %val, ptr %stptr, align 21326  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1327  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1328  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01329  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11330  ret [2 x ptr] %ret21331}1332 1333define [2 x ptr] @v8i16_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1334; CHECK-LE-LABEL: v8i16_preidx_reg:1335; CHECK-LE:       // %bb.0: // %entry1336; CHECK-LE-NEXT:    mov x8, x11337; CHECK-LE-NEXT:    ldr q0, [x0, x2]1338; CHECK-LE-NEXT:    add x0, x0, x21339; CHECK-LE-NEXT:    add x1, x1, x21340; CHECK-LE-NEXT:    str q0, [x8, x2]1341; CHECK-LE-NEXT:    ret1342;1343; CHECK-BE-LABEL: v8i16_preidx_reg:1344; CHECK-BE:       // %bb.0: // %entry1345; CHECK-BE-NEXT:    add x0, x0, x21346; CHECK-BE-NEXT:    add x1, x1, x21347; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0]1348; CHECK-BE-NEXT:    st1 { v0.8h }, [x1]1349; CHECK-BE-NEXT:    ret1350entry:1351  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1352  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1353  %val = load <8 x i16>, ptr %add.ldptr, align 21354  store <8 x i16> %val, ptr %add.stptr, align 21355  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01356  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11357  ret [2 x ptr] %ret21358}1359 1360define [2 x ptr] @v4i32_postidx_same_size(ptr %ldptr, ptr %stptr) {1361; CHECK-LE-LABEL: v4i32_postidx_same_size:1362; CHECK-LE:       // %bb.0: // %entry1363; CHECK-LE-NEXT:    ldr q0, [x0], #161364; CHECK-LE-NEXT:    str q0, [x1], #161365; CHECK-LE-NEXT:    ret1366;1367; CHECK-BE-LABEL: v4i32_postidx_same_size:1368; CHECK-BE:       // %bb.0: // %entry1369; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0], #161370; CHECK-BE-NEXT:    st1 { v0.4s }, [x1], #161371; CHECK-BE-NEXT:    ret1372entry:1373  %val = load <4 x i32>, ptr %ldptr, align 21374  store <4 x i32> %val, ptr %stptr, align 21375  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161376  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161377  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01378  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11379  ret [2 x ptr] %ret21380}1381 1382define [2 x ptr] @v4i32_preidx_same_size(ptr %ldptr, ptr %stptr) {1383; CHECK-LE-LABEL: v4i32_preidx_same_size:1384; CHECK-LE:       // %bb.0: // %entry1385; CHECK-LE-NEXT:    ldr q0, [x0, #16]!1386; CHECK-LE-NEXT:    str q0, [x1, #16]!1387; CHECK-LE-NEXT:    ret1388;1389; CHECK-BE-LABEL: v4i32_preidx_same_size:1390; CHECK-BE:       // %bb.0: // %entry1391; CHECK-BE-NEXT:    add x0, x0, #161392; CHECK-BE-NEXT:    add x1, x1, #161393; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]1394; CHECK-BE-NEXT:    st1 { v0.4s }, [x1]1395; CHECK-BE-NEXT:    ret1396entry:1397  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161398  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161399  %val = load <4 x i32>, ptr %add.ldptr, align 21400  store <4 x i32> %val, ptr %add.stptr, align 21401  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01402  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11403  ret [2 x ptr] %ret21404}1405 1406define [2 x ptr] @v4i32_postidx_different_size(ptr %ldptr, ptr %stptr) {1407; CHECK-LE-LABEL: v4i32_postidx_different_size:1408; CHECK-LE:       // %bb.0: // %entry1409; CHECK-LE-NEXT:    ldr q0, [x0], #321410; CHECK-LE-NEXT:    str q0, [x1], #321411; CHECK-LE-NEXT:    ret1412;1413; CHECK-BE-LABEL: v4i32_postidx_different_size:1414; CHECK-BE:       // %bb.0: // %entry1415; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]1416; CHECK-BE-NEXT:    mov x8, x11417; CHECK-BE-NEXT:    add x0, x0, #321418; CHECK-BE-NEXT:    add x1, x1, #321419; CHECK-BE-NEXT:    st1 { v0.4s }, [x8]1420; CHECK-BE-NEXT:    ret1421entry:1422  %val = load <4 x i32>, ptr %ldptr, align 21423  store <4 x i32> %val, ptr %stptr, align 21424  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321425  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321426  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01427  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11428  ret [2 x ptr] %ret21429}1430 1431define [2 x ptr] @v4i32_preidx_different_size(ptr %ldptr, ptr %stptr) {1432; CHECK-LE-LABEL: v4i32_preidx_different_size:1433; CHECK-LE:       // %bb.0: // %entry1434; CHECK-LE-NEXT:    ldr q0, [x0, #32]!1435; CHECK-LE-NEXT:    str q0, [x1, #32]!1436; CHECK-LE-NEXT:    ret1437;1438; CHECK-BE-LABEL: v4i32_preidx_different_size:1439; CHECK-BE:       // %bb.0: // %entry1440; CHECK-BE-NEXT:    add x0, x0, #321441; CHECK-BE-NEXT:    add x1, x1, #321442; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]1443; CHECK-BE-NEXT:    st1 { v0.4s }, [x1]1444; CHECK-BE-NEXT:    ret1445entry:1446  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321447  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321448  %val = load <4 x i32>, ptr %add.ldptr, align 21449  store <4 x i32> %val, ptr %add.stptr, align 21450  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01451  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11452  ret [2 x ptr] %ret21453}1454 1455define [2 x ptr] @v4i32_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1456; CHECK-LE-LABEL: v4i32_postidx_reg:1457; CHECK-LE:       // %bb.0: // %entry1458; CHECK-LE-NEXT:    ldr q0, [x0]1459; CHECK-LE-NEXT:    mov x8, x11460; CHECK-LE-NEXT:    add x0, x0, x21461; CHECK-LE-NEXT:    add x1, x1, x21462; CHECK-LE-NEXT:    str q0, [x8]1463; CHECK-LE-NEXT:    ret1464;1465; CHECK-BE-LABEL: v4i32_postidx_reg:1466; CHECK-BE:       // %bb.0: // %entry1467; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]1468; CHECK-BE-NEXT:    mov x8, x11469; CHECK-BE-NEXT:    add x0, x0, x21470; CHECK-BE-NEXT:    add x1, x1, x21471; CHECK-BE-NEXT:    st1 { v0.4s }, [x8]1472; CHECK-BE-NEXT:    ret1473entry:1474  %val = load <4 x i32>, ptr %ldptr, align 21475  store <4 x i32> %val, ptr %stptr, align 21476  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1477  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1478  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01479  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11480  ret [2 x ptr] %ret21481}1482 1483define [2 x ptr] @v4i32_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1484; CHECK-LE-LABEL: v4i32_preidx_reg:1485; CHECK-LE:       // %bb.0: // %entry1486; CHECK-LE-NEXT:    mov x8, x11487; CHECK-LE-NEXT:    ldr q0, [x0, x2]1488; CHECK-LE-NEXT:    add x0, x0, x21489; CHECK-LE-NEXT:    add x1, x1, x21490; CHECK-LE-NEXT:    str q0, [x8, x2]1491; CHECK-LE-NEXT:    ret1492;1493; CHECK-BE-LABEL: v4i32_preidx_reg:1494; CHECK-BE:       // %bb.0: // %entry1495; CHECK-BE-NEXT:    add x0, x0, x21496; CHECK-BE-NEXT:    add x1, x1, x21497; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]1498; CHECK-BE-NEXT:    st1 { v0.4s }, [x1]1499; CHECK-BE-NEXT:    ret1500entry:1501  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1502  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1503  %val = load <4 x i32>, ptr %add.ldptr, align 21504  store <4 x i32> %val, ptr %add.stptr, align 21505  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01506  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11507  ret [2 x ptr] %ret21508}1509 1510define [2 x ptr] @v2i64_postidx_same_size(ptr %ldptr, ptr %stptr) {1511; CHECK-LE-LABEL: v2i64_postidx_same_size:1512; CHECK-LE:       // %bb.0: // %entry1513; CHECK-LE-NEXT:    ldr q0, [x0], #161514; CHECK-LE-NEXT:    str q0, [x1], #161515; CHECK-LE-NEXT:    ret1516;1517; CHECK-BE-LABEL: v2i64_postidx_same_size:1518; CHECK-BE:       // %bb.0: // %entry1519; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0], #161520; CHECK-BE-NEXT:    st1 { v0.2d }, [x1], #161521; CHECK-BE-NEXT:    ret1522entry:1523  %val = load <2 x i64>, ptr %ldptr, align 21524  store <2 x i64> %val, ptr %stptr, align 21525  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161526  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161527  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01528  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11529  ret [2 x ptr] %ret21530}1531 1532define [2 x ptr] @v2i64_preidx_same_size(ptr %ldptr, ptr %stptr) {1533; CHECK-LE-LABEL: v2i64_preidx_same_size:1534; CHECK-LE:       // %bb.0: // %entry1535; CHECK-LE-NEXT:    ldr q0, [x0, #16]!1536; CHECK-LE-NEXT:    str q0, [x1, #16]!1537; CHECK-LE-NEXT:    ret1538;1539; CHECK-BE-LABEL: v2i64_preidx_same_size:1540; CHECK-BE:       // %bb.0: // %entry1541; CHECK-BE-NEXT:    add x0, x0, #161542; CHECK-BE-NEXT:    add x1, x1, #161543; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0]1544; CHECK-BE-NEXT:    st1 { v0.2d }, [x1]1545; CHECK-BE-NEXT:    ret1546entry:1547  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161548  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161549  %val = load <2 x i64>, ptr %add.ldptr, align 21550  store <2 x i64> %val, ptr %add.stptr, align 21551  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01552  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11553  ret [2 x ptr] %ret21554}1555 1556define [2 x ptr] @v2i64_postidx_different_size(ptr %ldptr, ptr %stptr) {1557; CHECK-LE-LABEL: v2i64_postidx_different_size:1558; CHECK-LE:       // %bb.0: // %entry1559; CHECK-LE-NEXT:    ldr q0, [x0], #321560; CHECK-LE-NEXT:    str q0, [x1], #321561; CHECK-LE-NEXT:    ret1562;1563; CHECK-BE-LABEL: v2i64_postidx_different_size:1564; CHECK-BE:       // %bb.0: // %entry1565; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0]1566; CHECK-BE-NEXT:    mov x8, x11567; CHECK-BE-NEXT:    add x0, x0, #321568; CHECK-BE-NEXT:    add x1, x1, #321569; CHECK-BE-NEXT:    st1 { v0.2d }, [x8]1570; CHECK-BE-NEXT:    ret1571entry:1572  %val = load <2 x i64>, ptr %ldptr, align 21573  store <2 x i64> %val, ptr %stptr, align 21574  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321575  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321576  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01577  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11578  ret [2 x ptr] %ret21579}1580 1581define [2 x ptr] @v2i64_preidx_different_size(ptr %ldptr, ptr %stptr) {1582; CHECK-LE-LABEL: v2i64_preidx_different_size:1583; CHECK-LE:       // %bb.0: // %entry1584; CHECK-LE-NEXT:    ldr q0, [x0, #32]!1585; CHECK-LE-NEXT:    str q0, [x1, #32]!1586; CHECK-LE-NEXT:    ret1587;1588; CHECK-BE-LABEL: v2i64_preidx_different_size:1589; CHECK-BE:       // %bb.0: // %entry1590; CHECK-BE-NEXT:    add x0, x0, #321591; CHECK-BE-NEXT:    add x1, x1, #321592; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0]1593; CHECK-BE-NEXT:    st1 { v0.2d }, [x1]1594; CHECK-BE-NEXT:    ret1595entry:1596  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321597  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321598  %val = load <2 x i64>, ptr %add.ldptr, align 21599  store <2 x i64> %val, ptr %add.stptr, align 21600  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01601  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11602  ret [2 x ptr] %ret21603}1604 1605define [2 x ptr] @v2i64_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1606; CHECK-LE-LABEL: v2i64_postidx_reg:1607; CHECK-LE:       // %bb.0: // %entry1608; CHECK-LE-NEXT:    ldr q0, [x0]1609; CHECK-LE-NEXT:    mov x8, x11610; CHECK-LE-NEXT:    add x0, x0, x21611; CHECK-LE-NEXT:    add x1, x1, x21612; CHECK-LE-NEXT:    str q0, [x8]1613; CHECK-LE-NEXT:    ret1614;1615; CHECK-BE-LABEL: v2i64_postidx_reg:1616; CHECK-BE:       // %bb.0: // %entry1617; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0]1618; CHECK-BE-NEXT:    mov x8, x11619; CHECK-BE-NEXT:    add x0, x0, x21620; CHECK-BE-NEXT:    add x1, x1, x21621; CHECK-BE-NEXT:    st1 { v0.2d }, [x8]1622; CHECK-BE-NEXT:    ret1623entry:1624  %val = load <2 x i64>, ptr %ldptr, align 21625  store <2 x i64> %val, ptr %stptr, align 21626  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1627  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1628  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01629  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11630  ret [2 x ptr] %ret21631}1632 1633define [2 x ptr] @v2i64_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1634; CHECK-LE-LABEL: v2i64_preidx_reg:1635; CHECK-LE:       // %bb.0: // %entry1636; CHECK-LE-NEXT:    mov x8, x11637; CHECK-LE-NEXT:    ldr q0, [x0, x2]1638; CHECK-LE-NEXT:    add x0, x0, x21639; CHECK-LE-NEXT:    add x1, x1, x21640; CHECK-LE-NEXT:    str q0, [x8, x2]1641; CHECK-LE-NEXT:    ret1642;1643; CHECK-BE-LABEL: v2i64_preidx_reg:1644; CHECK-BE:       // %bb.0: // %entry1645; CHECK-BE-NEXT:    add x0, x0, x21646; CHECK-BE-NEXT:    add x1, x1, x21647; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0]1648; CHECK-BE-NEXT:    st1 { v0.2d }, [x1]1649; CHECK-BE-NEXT:    ret1650entry:1651  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1652  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1653  %val = load <2 x i64>, ptr %add.ldptr, align 21654  store <2 x i64> %val, ptr %add.stptr, align 21655  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01656  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11657  ret [2 x ptr] %ret21658}1659 1660define [2 x ptr] @v8f16_postidx_same_size(ptr %ldptr, ptr %stptr) {1661; CHECK-LE-LABEL: v8f16_postidx_same_size:1662; CHECK-LE:       // %bb.0: // %entry1663; CHECK-LE-NEXT:    ldr q0, [x0], #161664; CHECK-LE-NEXT:    str q0, [x1], #161665; CHECK-LE-NEXT:    ret1666;1667; CHECK-BE-LABEL: v8f16_postidx_same_size:1668; CHECK-BE:       // %bb.0: // %entry1669; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0], #161670; CHECK-BE-NEXT:    st1 { v0.8h }, [x1], #161671; CHECK-BE-NEXT:    ret1672entry:1673  %val = load <8 x half>, ptr %ldptr, align 21674  store <8 x half> %val, ptr %stptr, align 21675  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161676  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161677  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01678  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11679  ret [2 x ptr] %ret21680}1681 1682define [2 x ptr] @v8f16_preidx_same_size(ptr %ldptr, ptr %stptr) {1683; CHECK-LE-LABEL: v8f16_preidx_same_size:1684; CHECK-LE:       // %bb.0: // %entry1685; CHECK-LE-NEXT:    ldr q0, [x0, #16]!1686; CHECK-LE-NEXT:    str q0, [x1, #16]!1687; CHECK-LE-NEXT:    ret1688;1689; CHECK-BE-LABEL: v8f16_preidx_same_size:1690; CHECK-BE:       // %bb.0: // %entry1691; CHECK-BE-NEXT:    add x0, x0, #161692; CHECK-BE-NEXT:    add x1, x1, #161693; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0]1694; CHECK-BE-NEXT:    st1 { v0.8h }, [x1]1695; CHECK-BE-NEXT:    ret1696entry:1697  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161698  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161699  %val = load <8 x half>, ptr %add.ldptr, align 21700  store <8 x half> %val, ptr %add.stptr, align 21701  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01702  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11703  ret [2 x ptr] %ret21704}1705 1706define [2 x ptr] @v8f16_postidx_different_size(ptr %ldptr, ptr %stptr) {1707; CHECK-LE-LABEL: v8f16_postidx_different_size:1708; CHECK-LE:       // %bb.0: // %entry1709; CHECK-LE-NEXT:    ldr q0, [x0], #321710; CHECK-LE-NEXT:    str q0, [x1], #321711; CHECK-LE-NEXT:    ret1712;1713; CHECK-BE-LABEL: v8f16_postidx_different_size:1714; CHECK-BE:       // %bb.0: // %entry1715; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0]1716; CHECK-BE-NEXT:    mov x8, x11717; CHECK-BE-NEXT:    add x0, x0, #321718; CHECK-BE-NEXT:    add x1, x1, #321719; CHECK-BE-NEXT:    st1 { v0.8h }, [x8]1720; CHECK-BE-NEXT:    ret1721entry:1722  %val = load <8 x half>, ptr %ldptr, align 21723  store <8 x half> %val, ptr %stptr, align 21724  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321725  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321726  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01727  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11728  ret [2 x ptr] %ret21729}1730 1731define [2 x ptr] @v8f16_preidx_different_size(ptr %ldptr, ptr %stptr) {1732; CHECK-LE-LABEL: v8f16_preidx_different_size:1733; CHECK-LE:       // %bb.0: // %entry1734; CHECK-LE-NEXT:    ldr q0, [x0, #32]!1735; CHECK-LE-NEXT:    str q0, [x1, #32]!1736; CHECK-LE-NEXT:    ret1737;1738; CHECK-BE-LABEL: v8f16_preidx_different_size:1739; CHECK-BE:       // %bb.0: // %entry1740; CHECK-BE-NEXT:    add x0, x0, #321741; CHECK-BE-NEXT:    add x1, x1, #321742; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0]1743; CHECK-BE-NEXT:    st1 { v0.8h }, [x1]1744; CHECK-BE-NEXT:    ret1745entry:1746  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321747  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321748  %val = load <8 x half>, ptr %add.ldptr, align 21749  store <8 x half> %val, ptr %add.stptr, align 21750  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01751  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11752  ret [2 x ptr] %ret21753}1754 1755define [2 x ptr] @v8f16_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1756; CHECK-LE-LABEL: v8f16_postidx_reg:1757; CHECK-LE:       // %bb.0: // %entry1758; CHECK-LE-NEXT:    ldr q0, [x0]1759; CHECK-LE-NEXT:    mov x8, x11760; CHECK-LE-NEXT:    add x0, x0, x21761; CHECK-LE-NEXT:    add x1, x1, x21762; CHECK-LE-NEXT:    str q0, [x8]1763; CHECK-LE-NEXT:    ret1764;1765; CHECK-BE-LABEL: v8f16_postidx_reg:1766; CHECK-BE:       // %bb.0: // %entry1767; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0]1768; CHECK-BE-NEXT:    mov x8, x11769; CHECK-BE-NEXT:    add x0, x0, x21770; CHECK-BE-NEXT:    add x1, x1, x21771; CHECK-BE-NEXT:    st1 { v0.8h }, [x8]1772; CHECK-BE-NEXT:    ret1773entry:1774  %val = load <8 x half>, ptr %ldptr, align 21775  store <8 x half> %val, ptr %stptr, align 21776  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1777  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1778  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01779  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11780  ret [2 x ptr] %ret21781}1782 1783define [2 x ptr] @v8f16_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1784; CHECK-LE-LABEL: v8f16_preidx_reg:1785; CHECK-LE:       // %bb.0: // %entry1786; CHECK-LE-NEXT:    mov x8, x11787; CHECK-LE-NEXT:    ldr q0, [x0, x2]1788; CHECK-LE-NEXT:    add x0, x0, x21789; CHECK-LE-NEXT:    add x1, x1, x21790; CHECK-LE-NEXT:    str q0, [x8, x2]1791; CHECK-LE-NEXT:    ret1792;1793; CHECK-BE-LABEL: v8f16_preidx_reg:1794; CHECK-BE:       // %bb.0: // %entry1795; CHECK-BE-NEXT:    add x0, x0, x21796; CHECK-BE-NEXT:    add x1, x1, x21797; CHECK-BE-NEXT:    ld1 { v0.8h }, [x0]1798; CHECK-BE-NEXT:    st1 { v0.8h }, [x1]1799; CHECK-BE-NEXT:    ret1800entry:1801  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1802  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1803  %val = load <8 x half>, ptr %add.ldptr, align 21804  store <8 x half> %val, ptr %add.stptr, align 21805  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01806  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11807  ret [2 x ptr] %ret21808}1809 1810define [2 x ptr] @v4f32_postidx_same_size(ptr %ldptr, ptr %stptr) {1811; CHECK-LE-LABEL: v4f32_postidx_same_size:1812; CHECK-LE:       // %bb.0: // %entry1813; CHECK-LE-NEXT:    ldr q0, [x0], #161814; CHECK-LE-NEXT:    str q0, [x1], #161815; CHECK-LE-NEXT:    ret1816;1817; CHECK-BE-LABEL: v4f32_postidx_same_size:1818; CHECK-BE:       // %bb.0: // %entry1819; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0], #161820; CHECK-BE-NEXT:    st1 { v0.4s }, [x1], #161821; CHECK-BE-NEXT:    ret1822entry:1823  %val = load <4 x float>, ptr %ldptr, align 21824  store <4 x float> %val, ptr %stptr, align 21825  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161826  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161827  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01828  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11829  ret [2 x ptr] %ret21830}1831 1832define [2 x ptr] @v4f32_preidx_same_size(ptr %ldptr, ptr %stptr) {1833; CHECK-LE-LABEL: v4f32_preidx_same_size:1834; CHECK-LE:       // %bb.0: // %entry1835; CHECK-LE-NEXT:    ldr q0, [x0, #16]!1836; CHECK-LE-NEXT:    str q0, [x1, #16]!1837; CHECK-LE-NEXT:    ret1838;1839; CHECK-BE-LABEL: v4f32_preidx_same_size:1840; CHECK-BE:       // %bb.0: // %entry1841; CHECK-BE-NEXT:    add x0, x0, #161842; CHECK-BE-NEXT:    add x1, x1, #161843; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]1844; CHECK-BE-NEXT:    st1 { v0.4s }, [x1]1845; CHECK-BE-NEXT:    ret1846entry:1847  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161848  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161849  %val = load <4 x float>, ptr %add.ldptr, align 21850  store <4 x float> %val, ptr %add.stptr, align 21851  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01852  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11853  ret [2 x ptr] %ret21854}1855 1856define [2 x ptr] @v4f32_postidx_different_size(ptr %ldptr, ptr %stptr) {1857; CHECK-LE-LABEL: v4f32_postidx_different_size:1858; CHECK-LE:       // %bb.0: // %entry1859; CHECK-LE-NEXT:    ldr q0, [x0], #321860; CHECK-LE-NEXT:    str q0, [x1], #321861; CHECK-LE-NEXT:    ret1862;1863; CHECK-BE-LABEL: v4f32_postidx_different_size:1864; CHECK-BE:       // %bb.0: // %entry1865; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]1866; CHECK-BE-NEXT:    mov x8, x11867; CHECK-BE-NEXT:    add x0, x0, #321868; CHECK-BE-NEXT:    add x1, x1, #321869; CHECK-BE-NEXT:    st1 { v0.4s }, [x8]1870; CHECK-BE-NEXT:    ret1871entry:1872  %val = load <4 x float>, ptr %ldptr, align 21873  store <4 x float> %val, ptr %stptr, align 21874  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321875  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321876  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01877  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11878  ret [2 x ptr] %ret21879}1880 1881define [2 x ptr] @v4f32_preidx_different_size(ptr %ldptr, ptr %stptr) {1882; CHECK-LE-LABEL: v4f32_preidx_different_size:1883; CHECK-LE:       // %bb.0: // %entry1884; CHECK-LE-NEXT:    ldr q0, [x0, #32]!1885; CHECK-LE-NEXT:    str q0, [x1, #32]!1886; CHECK-LE-NEXT:    ret1887;1888; CHECK-BE-LABEL: v4f32_preidx_different_size:1889; CHECK-BE:       // %bb.0: // %entry1890; CHECK-BE-NEXT:    add x0, x0, #321891; CHECK-BE-NEXT:    add x1, x1, #321892; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]1893; CHECK-BE-NEXT:    st1 { v0.4s }, [x1]1894; CHECK-BE-NEXT:    ret1895entry:1896  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 321897  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 321898  %val = load <4 x float>, ptr %add.ldptr, align 21899  store <4 x float> %val, ptr %add.stptr, align 21900  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01901  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11902  ret [2 x ptr] %ret21903}1904 1905define [2 x ptr] @v4f32_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1906; CHECK-LE-LABEL: v4f32_postidx_reg:1907; CHECK-LE:       // %bb.0: // %entry1908; CHECK-LE-NEXT:    ldr q0, [x0]1909; CHECK-LE-NEXT:    mov x8, x11910; CHECK-LE-NEXT:    add x0, x0, x21911; CHECK-LE-NEXT:    add x1, x1, x21912; CHECK-LE-NEXT:    str q0, [x8]1913; CHECK-LE-NEXT:    ret1914;1915; CHECK-BE-LABEL: v4f32_postidx_reg:1916; CHECK-BE:       // %bb.0: // %entry1917; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]1918; CHECK-BE-NEXT:    mov x8, x11919; CHECK-BE-NEXT:    add x0, x0, x21920; CHECK-BE-NEXT:    add x1, x1, x21921; CHECK-BE-NEXT:    st1 { v0.4s }, [x8]1922; CHECK-BE-NEXT:    ret1923entry:1924  %val = load <4 x float>, ptr %ldptr, align 21925  store <4 x float> %val, ptr %stptr, align 21926  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1927  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1928  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01929  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11930  ret [2 x ptr] %ret21931}1932 1933define [2 x ptr] @v4f32_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {1934; CHECK-LE-LABEL: v4f32_preidx_reg:1935; CHECK-LE:       // %bb.0: // %entry1936; CHECK-LE-NEXT:    mov x8, x11937; CHECK-LE-NEXT:    ldr q0, [x0, x2]1938; CHECK-LE-NEXT:    add x0, x0, x21939; CHECK-LE-NEXT:    add x1, x1, x21940; CHECK-LE-NEXT:    str q0, [x8, x2]1941; CHECK-LE-NEXT:    ret1942;1943; CHECK-BE-LABEL: v4f32_preidx_reg:1944; CHECK-BE:       // %bb.0: // %entry1945; CHECK-BE-NEXT:    add x0, x0, x21946; CHECK-BE-NEXT:    add x1, x1, x21947; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]1948; CHECK-BE-NEXT:    st1 { v0.4s }, [x1]1949; CHECK-BE-NEXT:    ret1950entry:1951  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off1952  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off1953  %val = load <4 x float>, ptr %add.ldptr, align 21954  store <4 x float> %val, ptr %add.stptr, align 21955  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01956  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11957  ret [2 x ptr] %ret21958}1959 1960define [2 x ptr] @v2f64_postidx_same_size(ptr %ldptr, ptr %stptr) {1961; CHECK-LE-LABEL: v2f64_postidx_same_size:1962; CHECK-LE:       // %bb.0: // %entry1963; CHECK-LE-NEXT:    ldr q0, [x0], #161964; CHECK-LE-NEXT:    str q0, [x1], #161965; CHECK-LE-NEXT:    ret1966;1967; CHECK-BE-LABEL: v2f64_postidx_same_size:1968; CHECK-BE:       // %bb.0: // %entry1969; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0], #161970; CHECK-BE-NEXT:    st1 { v0.2d }, [x1], #161971; CHECK-BE-NEXT:    ret1972entry:1973  %val = load <2 x double>, ptr %ldptr, align 21974  store <2 x double> %val, ptr %stptr, align 21975  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161976  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161977  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 01978  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 11979  ret [2 x ptr] %ret21980}1981 1982define [2 x ptr] @v2f64_preidx_same_size(ptr %ldptr, ptr %stptr) {1983; CHECK-LE-LABEL: v2f64_preidx_same_size:1984; CHECK-LE:       // %bb.0: // %entry1985; CHECK-LE-NEXT:    ldr q0, [x0, #16]!1986; CHECK-LE-NEXT:    str q0, [x1, #16]!1987; CHECK-LE-NEXT:    ret1988;1989; CHECK-BE-LABEL: v2f64_preidx_same_size:1990; CHECK-BE:       // %bb.0: // %entry1991; CHECK-BE-NEXT:    add x0, x0, #161992; CHECK-BE-NEXT:    add x1, x1, #161993; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0]1994; CHECK-BE-NEXT:    st1 { v0.2d }, [x1]1995; CHECK-BE-NEXT:    ret1996entry:1997  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 161998  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 161999  %val = load <2 x double>, ptr %add.ldptr, align 22000  store <2 x double> %val, ptr %add.stptr, align 22001  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 02002  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 12003  ret [2 x ptr] %ret22004}2005 2006define [2 x ptr] @v2f64_postidx_different_size(ptr %ldptr, ptr %stptr) {2007; CHECK-LE-LABEL: v2f64_postidx_different_size:2008; CHECK-LE:       // %bb.0: // %entry2009; CHECK-LE-NEXT:    ldr q0, [x0], #322010; CHECK-LE-NEXT:    str q0, [x1], #322011; CHECK-LE-NEXT:    ret2012;2013; CHECK-BE-LABEL: v2f64_postidx_different_size:2014; CHECK-BE:       // %bb.0: // %entry2015; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0]2016; CHECK-BE-NEXT:    mov x8, x12017; CHECK-BE-NEXT:    add x0, x0, #322018; CHECK-BE-NEXT:    add x1, x1, #322019; CHECK-BE-NEXT:    st1 { v0.2d }, [x8]2020; CHECK-BE-NEXT:    ret2021entry:2022  %val = load <2 x double>, ptr %ldptr, align 22023  store <2 x double> %val, ptr %stptr, align 22024  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 322025  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 322026  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 02027  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 12028  ret [2 x ptr] %ret22029}2030 2031define [2 x ptr] @v2f64_preidx_different_size(ptr %ldptr, ptr %stptr) {2032; CHECK-LE-LABEL: v2f64_preidx_different_size:2033; CHECK-LE:       // %bb.0: // %entry2034; CHECK-LE-NEXT:    ldr q0, [x0, #32]!2035; CHECK-LE-NEXT:    str q0, [x1, #32]!2036; CHECK-LE-NEXT:    ret2037;2038; CHECK-BE-LABEL: v2f64_preidx_different_size:2039; CHECK-BE:       // %bb.0: // %entry2040; CHECK-BE-NEXT:    add x0, x0, #322041; CHECK-BE-NEXT:    add x1, x1, #322042; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0]2043; CHECK-BE-NEXT:    st1 { v0.2d }, [x1]2044; CHECK-BE-NEXT:    ret2045entry:2046  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 322047  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 322048  %val = load <2 x double>, ptr %add.ldptr, align 22049  store <2 x double> %val, ptr %add.stptr, align 22050  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 02051  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 12052  ret [2 x ptr] %ret22053}2054 2055define [2 x ptr] @v2f64_postidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {2056; CHECK-LE-LABEL: v2f64_postidx_reg:2057; CHECK-LE:       // %bb.0: // %entry2058; CHECK-LE-NEXT:    ldr q0, [x0]2059; CHECK-LE-NEXT:    mov x8, x12060; CHECK-LE-NEXT:    add x0, x0, x22061; CHECK-LE-NEXT:    add x1, x1, x22062; CHECK-LE-NEXT:    str q0, [x8]2063; CHECK-LE-NEXT:    ret2064;2065; CHECK-BE-LABEL: v2f64_postidx_reg:2066; CHECK-BE:       // %bb.0: // %entry2067; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0]2068; CHECK-BE-NEXT:    mov x8, x12069; CHECK-BE-NEXT:    add x0, x0, x22070; CHECK-BE-NEXT:    add x1, x1, x22071; CHECK-BE-NEXT:    st1 { v0.2d }, [x8]2072; CHECK-BE-NEXT:    ret2073entry:2074  %val = load <2 x double>, ptr %ldptr, align 22075  store <2 x double> %val, ptr %stptr, align 22076  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off2077  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off2078  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 02079  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 12080  ret [2 x ptr] %ret22081}2082 2083define [2 x ptr] @v2f64_preidx_reg(ptr %ldptr, ptr %stptr, i64 %off) {2084; CHECK-LE-LABEL: v2f64_preidx_reg:2085; CHECK-LE:       // %bb.0: // %entry2086; CHECK-LE-NEXT:    mov x8, x12087; CHECK-LE-NEXT:    ldr q0, [x0, x2]2088; CHECK-LE-NEXT:    add x0, x0, x22089; CHECK-LE-NEXT:    add x1, x1, x22090; CHECK-LE-NEXT:    str q0, [x8, x2]2091; CHECK-LE-NEXT:    ret2092;2093; CHECK-BE-LABEL: v2f64_preidx_reg:2094; CHECK-BE:       // %bb.0: // %entry2095; CHECK-BE-NEXT:    add x0, x0, x22096; CHECK-BE-NEXT:    add x1, x1, x22097; CHECK-BE-NEXT:    ld1 { v0.2d }, [x0]2098; CHECK-BE-NEXT:    st1 { v0.2d }, [x1]2099; CHECK-BE-NEXT:    ret2100entry:2101  %add.ldptr = getelementptr inbounds nuw i8, ptr %ldptr, i64 %off2102  %add.stptr = getelementptr inbounds nuw i8, ptr %stptr, i64 %off2103  %val = load <2 x double>, ptr %add.ldptr, align 22104  store <2 x double> %val, ptr %add.stptr, align 22105  %ret1 = insertvalue [2 x ptr] poison, ptr %add.ldptr, 02106  %ret2 = insertvalue [2 x ptr] %ret1, ptr %add.stptr, 12107  ret [2 x ptr] %ret22108}2109