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