666 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp,+fp64 -verify-machineinstrs %s -o - | FileCheck %s3 4; i325 6define void @vst2_v2i32(ptr %src, ptr %dst) {7; CHECK-LABEL: vst2_v2i32:8; CHECK: @ %bb.0: @ %entry9; CHECK-NEXT: ldm.w r0, {r2, r3, r12}10; CHECK-NEXT: ldr r0, [r0, #12]11; CHECK-NEXT: vmov q0[2], q0[0], r2, r312; CHECK-NEXT: vmov q0[3], q0[1], r12, r013; CHECK-NEXT: vstrw.32 q0, [r1]14; CHECK-NEXT: bx lr15entry:16 %l1 = load <2 x i32>, ptr %src, align 417 %s2 = getelementptr <2 x i32>, ptr %src, i32 118 %l2 = load <2 x i32>, ptr %s2, align 419 %s = shufflevector <2 x i32> %l1, <2 x i32> %l2, <4 x i32> <i32 0, i32 2, i32 1, i32 3>20 store <4 x i32> %s, ptr %dst, align 421 ret void22}23 24define void @vst2_v4i32(ptr %src, ptr %dst) {25; CHECK-LABEL: vst2_v4i32:26; CHECK: @ %bb.0: @ %entry27; CHECK-NEXT: vldrw.u32 q1, [r0, #16]28; CHECK-NEXT: vldrw.u32 q0, [r0]29; CHECK-NEXT: vst20.32 {q0, q1}, [r1]30; CHECK-NEXT: vst21.32 {q0, q1}, [r1]31; CHECK-NEXT: bx lr32entry:33 %l1 = load <4 x i32>, ptr %src, align 434 %s2 = getelementptr <4 x i32>, ptr %src, i32 135 %l2 = load <4 x i32>, ptr %s2, align 436 %s = shufflevector <4 x i32> %l1, <4 x i32> %l2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>37 store <8 x i32> %s, ptr %dst, align 438 ret void39}40 41define void @vst2_v8i32(ptr %src, ptr %dst) {42; CHECK-LABEL: vst2_v8i32:43; CHECK: @ %bb.0: @ %entry44; CHECK-NEXT: vldrw.u32 q1, [r0, #32]45; CHECK-NEXT: vldrw.u32 q0, [r0]46; CHECK-NEXT: vldrw.u32 q3, [r0, #48]47; CHECK-NEXT: vldrw.u32 q2, [r0, #16]48; CHECK-NEXT: vst20.32 {q0, q1}, [r1]49; CHECK-NEXT: vst21.32 {q0, q1}, [r1]!50; CHECK-NEXT: vst20.32 {q2, q3}, [r1]51; CHECK-NEXT: vst21.32 {q2, q3}, [r1]52; CHECK-NEXT: bx lr53entry:54 %l1 = load <8 x i32>, ptr %src, align 455 %s2 = getelementptr <8 x i32>, ptr %src, i32 156 %l2 = load <8 x i32>, ptr %s2, align 457 %s = shufflevector <8 x i32> %l1, <8 x i32> %l2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>58 store <16 x i32> %s, ptr %dst, align 459 ret void60}61 62define void @vst2_v16i32(ptr %src, ptr %dst) {63; CHECK-LABEL: vst2_v16i32:64; CHECK: @ %bb.0: @ %entry65; CHECK-NEXT: .vsave {d8, d9, d10, d11, d12, d13, d14, d15}66; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13, d14, d15}67; CHECK-NEXT: vldrw.u32 q7, [r0, #64]68; CHECK-NEXT: vldrw.u32 q6, [r0]69; CHECK-NEXT: vldrw.u32 q1, [r0, #112]70; CHECK-NEXT: vldrw.u32 q3, [r0, #96]71; CHECK-NEXT: vldrw.u32 q5, [r0, #80]72; CHECK-NEXT: vldrw.u32 q0, [r0, #48]73; CHECK-NEXT: vldrw.u32 q2, [r0, #32]74; CHECK-NEXT: vldrw.u32 q4, [r0, #16]75; CHECK-NEXT: add.w r0, r1, #9676; CHECK-NEXT: add.w r2, r1, #6477; CHECK-NEXT: vst20.32 {q6, q7}, [r1]78; CHECK-NEXT: vst21.32 {q6, q7}, [r1]!79; CHECK-NEXT: vst20.32 {q4, q5}, [r1]80; CHECK-NEXT: vst20.32 {q2, q3}, [r2]81; CHECK-NEXT: vst20.32 {q0, q1}, [r0]82; CHECK-NEXT: vst21.32 {q4, q5}, [r1]83; CHECK-NEXT: vst21.32 {q2, q3}, [r2]84; CHECK-NEXT: vst21.32 {q0, q1}, [r0]85; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13, d14, d15}86; CHECK-NEXT: bx lr87entry:88 %l1 = load <16 x i32>, ptr %src, align 489 %s2 = getelementptr <16 x i32>, ptr %src, i32 190 %l2 = load <16 x i32>, ptr %s2, align 491 %s = shufflevector <16 x i32> %l1, <16 x i32> %l2, <32 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>92 store <32 x i32> %s, ptr %dst, align 493 ret void94}95 96define void @vst2_v4i32_align1(ptr %src, ptr %dst) {97; CHECK-LABEL: vst2_v4i32_align1:98; CHECK: @ %bb.0: @ %entry99; CHECK-NEXT: vldrw.u32 q0, [r0, #16]100; CHECK-NEXT: vldrw.u32 q1, [r0]101; CHECK-NEXT: vmov.f32 s8, s6102; CHECK-NEXT: vmov.f32 s9, s2103; CHECK-NEXT: vmov.f32 s10, s7104; CHECK-NEXT: vmov.f32 s11, s3105; CHECK-NEXT: vmov.f32 s12, s4106; CHECK-NEXT: vstrb.8 q2, [r1, #16]107; CHECK-NEXT: vmov.f32 s13, s0108; CHECK-NEXT: vmov.f32 s14, s5109; CHECK-NEXT: vmov.f32 s15, s1110; CHECK-NEXT: vstrb.8 q3, [r1]111; CHECK-NEXT: bx lr112entry:113 %l1 = load <4 x i32>, ptr %src, align 4114 %s2 = getelementptr <4 x i32>, ptr %src, i32 1115 %l2 = load <4 x i32>, ptr %s2, align 4116 %s = shufflevector <4 x i32> %l1, <4 x i32> %l2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>117 store <8 x i32> %s, ptr %dst, align 1118 ret void119}120 121; i16122 123define void @vst2_v2i16(ptr %src, ptr %dst) {124; CHECK-LABEL: vst2_v2i16:125; CHECK: @ %bb.0: @ %entry126; CHECK-NEXT: ldrh r2, [r0, #2]127; CHECK-NEXT: ldrh r3, [r0]128; CHECK-NEXT: ldrh.w r12, [r0, #6]129; CHECK-NEXT: ldrh r0, [r0, #4]130; CHECK-NEXT: vmov q0[2], q0[0], r3, r2131; CHECK-NEXT: vmov q0[3], q0[1], r0, r12132; CHECK-NEXT: vstrh.32 q0, [r1]133; CHECK-NEXT: bx lr134entry:135 %l1 = load <2 x i16>, ptr %src, align 4136 %s2 = getelementptr <2 x i16>, ptr %src, i32 1137 %l2 = load <2 x i16>, ptr %s2, align 4138 %s = shufflevector <2 x i16> %l1, <2 x i16> %l2, <4 x i32> <i32 0, i32 2, i32 1, i32 3>139 store <4 x i16> %s, ptr %dst, align 2140 ret void141}142 143define void @vst2_v4i16(ptr %src, ptr %dst) {144; CHECK-LABEL: vst2_v4i16:145; CHECK: @ %bb.0: @ %entry146; CHECK-NEXT: vldrh.u32 q0, [r0, #8]147; CHECK-NEXT: vldrh.u32 q1, [r0]148; CHECK-NEXT: vmovnt.i32 q1, q0149; CHECK-NEXT: vstrh.16 q1, [r1]150; CHECK-NEXT: bx lr151entry:152 %l1 = load <4 x i16>, ptr %src, align 4153 %s2 = getelementptr <4 x i16>, ptr %src, i32 1154 %l2 = load <4 x i16>, ptr %s2, align 4155 %s = shufflevector <4 x i16> %l1, <4 x i16> %l2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>156 store <8 x i16> %s, ptr %dst, align 2157 ret void158}159 160define void @vst2_v8i16(ptr %src, ptr %dst) {161; CHECK-LABEL: vst2_v8i16:162; CHECK: @ %bb.0: @ %entry163; CHECK-NEXT: vldrw.u32 q1, [r0, #16]164; CHECK-NEXT: vldrw.u32 q0, [r0]165; CHECK-NEXT: vst20.16 {q0, q1}, [r1]166; CHECK-NEXT: vst21.16 {q0, q1}, [r1]167; CHECK-NEXT: bx lr168entry:169 %l1 = load <8 x i16>, ptr %src, align 4170 %s2 = getelementptr <8 x i16>, ptr %src, i32 1171 %l2 = load <8 x i16>, ptr %s2, align 4172 %s = shufflevector <8 x i16> %l1, <8 x i16> %l2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>173 store <16 x i16> %s, ptr %dst, align 2174 ret void175}176 177define void @vst2_v16i16(ptr %src, ptr %dst) {178; CHECK-LABEL: vst2_v16i16:179; CHECK: @ %bb.0: @ %entry180; CHECK-NEXT: vldrw.u32 q1, [r0, #32]181; CHECK-NEXT: vldrw.u32 q0, [r0]182; CHECK-NEXT: vldrw.u32 q3, [r0, #48]183; CHECK-NEXT: vldrw.u32 q2, [r0, #16]184; CHECK-NEXT: vst20.16 {q0, q1}, [r1]185; CHECK-NEXT: vst21.16 {q0, q1}, [r1]!186; CHECK-NEXT: vst20.16 {q2, q3}, [r1]187; CHECK-NEXT: vst21.16 {q2, q3}, [r1]188; CHECK-NEXT: bx lr189entry:190 %l1 = load <16 x i16>, ptr %src, align 4191 %s2 = getelementptr <16 x i16>, ptr %src, i32 1192 %l2 = load <16 x i16>, ptr %s2, align 4193 %s = shufflevector <16 x i16> %l1, <16 x i16> %l2, <32 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>194 store <32 x i16> %s, ptr %dst, align 2195 ret void196}197 198define void @vst2_v8i16_align1(ptr %src, ptr %dst) {199; CHECK-LABEL: vst2_v8i16_align1:200; CHECK: @ %bb.0: @ %entry201; CHECK-NEXT: vldrw.u32 q2, [r0]202; CHECK-NEXT: vldrw.u32 q1, [r0, #16]203; CHECK-NEXT: vmovx.f16 s1, s10204; CHECK-NEXT: vmovx.f16 s0, s6205; CHECK-NEXT: vins.f16 s10, s6206; CHECK-NEXT: vmovx.f16 s3, s11207; CHECK-NEXT: vmovx.f16 s6, s7208; CHECK-NEXT: vins.f16 s11, s7209; CHECK-NEXT: vins.f16 s3, s6210; CHECK-NEXT: vmovx.f16 s6, s8211; CHECK-NEXT: vins.f16 s8, s4212; CHECK-NEXT: vmovx.f16 s4, s4213; CHECK-NEXT: vmov q3, q2214; CHECK-NEXT: vins.f16 s6, s4215; CHECK-NEXT: vmovx.f16 s15, s9216; CHECK-NEXT: vins.f16 s9, s5217; CHECK-NEXT: vmovx.f16 s4, s5218; CHECK-NEXT: vins.f16 s1, s0219; CHECK-NEXT: vmov.f32 s0, s10220; CHECK-NEXT: vins.f16 s15, s4221; CHECK-NEXT: vmov.f32 s2, s11222; CHECK-NEXT: vmov.f32 s13, s6223; CHECK-NEXT: vstrb.8 q0, [r1, #16]224; CHECK-NEXT: vmov.f32 s14, s9225; CHECK-NEXT: vstrb.8 q3, [r1]226; CHECK-NEXT: bx lr227entry:228 %l1 = load <8 x i16>, ptr %src, align 4229 %s2 = getelementptr <8 x i16>, ptr %src, i32 1230 %l2 = load <8 x i16>, ptr %s2, align 4231 %s = shufflevector <8 x i16> %l1, <8 x i16> %l2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>232 store <16 x i16> %s, ptr %dst, align 1233 ret void234}235 236; i8237 238define void @vst2_v2i8(ptr %src, ptr %dst) {239; CHECK-LABEL: vst2_v2i8:240; CHECK: @ %bb.0: @ %entry241; CHECK-NEXT: ldrb r2, [r0]242; CHECK-NEXT: ldrb r3, [r0, #1]243; CHECK-NEXT: ldrb.w r12, [r0, #2]244; CHECK-NEXT: ldrb r0, [r0, #3]245; CHECK-NEXT: vmov q0[2], q0[0], r2, r3246; CHECK-NEXT: vmov q0[3], q0[1], r12, r0247; CHECK-NEXT: vstrb.32 q0, [r1]248; CHECK-NEXT: bx lr249entry:250 %l1 = load <2 x i8>, ptr %src, align 4251 %s2 = getelementptr <2 x i8>, ptr %src, i32 1252 %l2 = load <2 x i8>, ptr %s2, align 4253 %s = shufflevector <2 x i8> %l1, <2 x i8> %l2, <4 x i32> <i32 0, i32 2, i32 1, i32 3>254 store <4 x i8> %s, ptr %dst, align 1255 ret void256}257 258define void @vst2_v4i8(ptr %src, ptr %dst) {259; CHECK-LABEL: vst2_v4i8:260; CHECK: @ %bb.0: @ %entry261; CHECK-NEXT: vldrb.u32 q0, [r0, #4]262; CHECK-NEXT: vldrb.u32 q1, [r0]263; CHECK-NEXT: vmovnt.i32 q1, q0264; CHECK-NEXT: vstrb.16 q1, [r1]265; CHECK-NEXT: bx lr266entry:267 %l1 = load <4 x i8>, ptr %src, align 4268 %s2 = getelementptr <4 x i8>, ptr %src, i32 1269 %l2 = load <4 x i8>, ptr %s2, align 4270 %s = shufflevector <4 x i8> %l1, <4 x i8> %l2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>271 store <8 x i8> %s, ptr %dst, align 1272 ret void273}274 275define void @vst2_v8i8(ptr %src, ptr %dst) {276; CHECK-LABEL: vst2_v8i8:277; CHECK: @ %bb.0: @ %entry278; CHECK-NEXT: vldrb.u16 q0, [r0, #8]279; CHECK-NEXT: vldrb.u16 q1, [r0]280; CHECK-NEXT: vmovnt.i16 q1, q0281; CHECK-NEXT: vstrb.8 q1, [r1]282; CHECK-NEXT: bx lr283entry:284 %l1 = load <8 x i8>, ptr %src, align 4285 %s2 = getelementptr <8 x i8>, ptr %src, i32 1286 %l2 = load <8 x i8>, ptr %s2, align 4287 %s = shufflevector <8 x i8> %l1, <8 x i8> %l2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>288 store <16 x i8> %s, ptr %dst, align 1289 ret void290}291 292define void @vst2_v16i8(ptr %src, ptr %dst) {293; CHECK-LABEL: vst2_v16i8:294; CHECK: @ %bb.0: @ %entry295; CHECK-NEXT: vldrw.u32 q1, [r0, #16]296; CHECK-NEXT: vldrw.u32 q0, [r0]297; CHECK-NEXT: vst20.8 {q0, q1}, [r1]298; CHECK-NEXT: vst21.8 {q0, q1}, [r1]299; CHECK-NEXT: bx lr300entry:301 %l1 = load <16 x i8>, ptr %src, align 4302 %s2 = getelementptr <16 x i8>, ptr %src, i32 1303 %l2 = load <16 x i8>, ptr %s2, align 4304 %s = shufflevector <16 x i8> %l1, <16 x i8> %l2, <32 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>305 store <32 x i8> %s, ptr %dst, align 1306 ret void307}308 309; i64310 311define void @vst2_v2i64(ptr %src, ptr %dst) {312; CHECK-LABEL: vst2_v2i64:313; CHECK: @ %bb.0: @ %entry314; CHECK-NEXT: vldrw.u32 q0, [r0, #16]315; CHECK-NEXT: vldrw.u32 q1, [r0]316; CHECK-NEXT: vmov.f64 d4, d3317; CHECK-NEXT: vmov.f64 d5, d1318; CHECK-NEXT: vmov.f64 d3, d0319; CHECK-NEXT: vstrw.32 q2, [r1, #16]320; CHECK-NEXT: vstrw.32 q1, [r1]321; CHECK-NEXT: bx lr322entry:323 %l1 = load <2 x i64>, ptr %src, align 4324 %s2 = getelementptr <2 x i64>, ptr %src, i32 1325 %l2 = load <2 x i64>, ptr %s2, align 4326 %s = shufflevector <2 x i64> %l1, <2 x i64> %l2, <4 x i32> <i32 0, i32 2, i32 1, i32 3>327 store <4 x i64> %s, ptr %dst, align 8328 ret void329}330 331define void @vst2_v4i64(ptr %src, ptr %dst) {332; CHECK-LABEL: vst2_v4i64:333; CHECK: @ %bb.0: @ %entry334; CHECK-NEXT: .vsave {d8, d9}335; CHECK-NEXT: vpush {d8, d9}336; CHECK-NEXT: vldrw.u32 q0, [r0, #32]337; CHECK-NEXT: vldrw.u32 q1, [r0]338; CHECK-NEXT: vldrw.u32 q2, [r0, #48]339; CHECK-NEXT: vldrw.u32 q3, [r0, #16]340; CHECK-NEXT: vmov.f64 d8, d2341; CHECK-NEXT: vmov.f64 d9, d0342; CHECK-NEXT: vmov.f64 d0, d3343; CHECK-NEXT: vstrw.32 q4, [r1]344; CHECK-NEXT: vmov.f64 d3, d4345; CHECK-NEXT: vstrw.32 q0, [r1, #16]346; CHECK-NEXT: vmov.f64 d2, d6347; CHECK-NEXT: vmov.f64 d4, d7348; CHECK-NEXT: vstrw.32 q1, [r1, #32]349; CHECK-NEXT: vstrw.32 q2, [r1, #48]350; CHECK-NEXT: vpop {d8, d9}351; CHECK-NEXT: bx lr352entry:353 %l1 = load <4 x i64>, ptr %src, align 4354 %s2 = getelementptr <4 x i64>, ptr %src, i32 1355 %l2 = load <4 x i64>, ptr %s2, align 4356 %s = shufflevector <4 x i64> %l1, <4 x i64> %l2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>357 store <8 x i64> %s, ptr %dst, align 8358 ret void359}360 361; f32362 363define void @vst2_v2f32(ptr %src, ptr %dst) {364; CHECK-LABEL: vst2_v2f32:365; CHECK: @ %bb.0: @ %entry366; CHECK-NEXT: vldr s0, [r0]367; CHECK-NEXT: vldr s2, [r0, #4]368; CHECK-NEXT: vldr s1, [r0, #8]369; CHECK-NEXT: vldr s3, [r0, #12]370; CHECK-NEXT: vstrw.32 q0, [r1]371; CHECK-NEXT: bx lr372entry:373 %l1 = load <2 x float>, ptr %src, align 4374 %s2 = getelementptr <2 x float>, ptr %src, i32 1375 %l2 = load <2 x float>, ptr %s2, align 4376 %s = shufflevector <2 x float> %l1, <2 x float> %l2, <4 x i32> <i32 0, i32 2, i32 1, i32 3>377 store <4 x float> %s, ptr %dst, align 4378 ret void379}380 381define void @vst2_v4f32(ptr %src, ptr %dst) {382; CHECK-LABEL: vst2_v4f32:383; CHECK: @ %bb.0: @ %entry384; CHECK-NEXT: vldrw.u32 q1, [r0, #16]385; CHECK-NEXT: vldrw.u32 q0, [r0]386; CHECK-NEXT: vst20.32 {q0, q1}, [r1]387; CHECK-NEXT: vst21.32 {q0, q1}, [r1]388; CHECK-NEXT: bx lr389entry:390 %l1 = load <4 x float>, ptr %src, align 4391 %s2 = getelementptr <4 x float>, ptr %src, i32 1392 %l2 = load <4 x float>, ptr %s2, align 4393 %s = shufflevector <4 x float> %l1, <4 x float> %l2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>394 store <8 x float> %s, ptr %dst, align 4395 ret void396}397 398define void @vst2_v8f32(ptr %src, ptr %dst) {399; CHECK-LABEL: vst2_v8f32:400; CHECK: @ %bb.0: @ %entry401; CHECK-NEXT: vldrw.u32 q1, [r0, #32]402; CHECK-NEXT: vldrw.u32 q0, [r0]403; CHECK-NEXT: vldrw.u32 q3, [r0, #48]404; CHECK-NEXT: vldrw.u32 q2, [r0, #16]405; CHECK-NEXT: vst20.32 {q0, q1}, [r1]406; CHECK-NEXT: vst21.32 {q0, q1}, [r1]!407; CHECK-NEXT: vst20.32 {q2, q3}, [r1]408; CHECK-NEXT: vst21.32 {q2, q3}, [r1]409; CHECK-NEXT: bx lr410entry:411 %l1 = load <8 x float>, ptr %src, align 4412 %s2 = getelementptr <8 x float>, ptr %src, i32 1413 %l2 = load <8 x float>, ptr %s2, align 4414 %s = shufflevector <8 x float> %l1, <8 x float> %l2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>415 store <16 x float> %s, ptr %dst, align 4416 ret void417}418 419define void @vst2_v16f32(ptr %src, ptr %dst) {420; CHECK-LABEL: vst2_v16f32:421; CHECK: @ %bb.0: @ %entry422; CHECK-NEXT: .vsave {d8, d9, d10, d11, d12, d13, d14, d15}423; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13, d14, d15}424; CHECK-NEXT: vldrw.u32 q7, [r0, #64]425; CHECK-NEXT: vldrw.u32 q6, [r0]426; CHECK-NEXT: vldrw.u32 q1, [r0, #112]427; CHECK-NEXT: vldrw.u32 q3, [r0, #96]428; CHECK-NEXT: vldrw.u32 q5, [r0, #80]429; CHECK-NEXT: vldrw.u32 q0, [r0, #48]430; CHECK-NEXT: vldrw.u32 q2, [r0, #32]431; CHECK-NEXT: vldrw.u32 q4, [r0, #16]432; CHECK-NEXT: add.w r0, r1, #96433; CHECK-NEXT: add.w r2, r1, #64434; CHECK-NEXT: vst20.32 {q6, q7}, [r1]435; CHECK-NEXT: vst21.32 {q6, q7}, [r1]!436; CHECK-NEXT: vst20.32 {q4, q5}, [r1]437; CHECK-NEXT: vst20.32 {q2, q3}, [r2]438; CHECK-NEXT: vst20.32 {q0, q1}, [r0]439; CHECK-NEXT: vst21.32 {q4, q5}, [r1]440; CHECK-NEXT: vst21.32 {q2, q3}, [r2]441; CHECK-NEXT: vst21.32 {q0, q1}, [r0]442; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13, d14, d15}443; CHECK-NEXT: bx lr444entry:445 %l1 = load <16 x float>, ptr %src, align 4446 %s2 = getelementptr <16 x float>, ptr %src, i32 1447 %l2 = load <16 x float>, ptr %s2, align 4448 %s = shufflevector <16 x float> %l1, <16 x float> %l2, <32 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>449 store <32 x float> %s, ptr %dst, align 4450 ret void451}452 453define void @vst2_v4f32_align1(ptr %src, ptr %dst) {454; CHECK-LABEL: vst2_v4f32_align1:455; CHECK: @ %bb.0: @ %entry456; CHECK-NEXT: vldrw.u32 q0, [r0, #16]457; CHECK-NEXT: vldrw.u32 q1, [r0]458; CHECK-NEXT: vmov.f32 s8, s6459; CHECK-NEXT: vmov.f32 s9, s2460; CHECK-NEXT: vmov.f32 s10, s7461; CHECK-NEXT: vmov.f32 s11, s3462; CHECK-NEXT: vmov.f32 s12, s4463; CHECK-NEXT: vstrb.8 q2, [r1, #16]464; CHECK-NEXT: vmov.f32 s13, s0465; CHECK-NEXT: vmov.f32 s14, s5466; CHECK-NEXT: vmov.f32 s15, s1467; CHECK-NEXT: vstrb.8 q3, [r1]468; CHECK-NEXT: bx lr469entry:470 %l1 = load <4 x float>, ptr %src, align 4471 %s2 = getelementptr <4 x float>, ptr %src, i32 1472 %l2 = load <4 x float>, ptr %s2, align 4473 %s = shufflevector <4 x float> %l1, <4 x float> %l2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>474 store <8 x float> %s, ptr %dst, align 1475 ret void476}477 478; f16479 480define void @vst2_v2f16(ptr %src, ptr %dst) {481; CHECK-LABEL: vst2_v2f16:482; CHECK: @ %bb.0: @ %entry483; CHECK-NEXT: ldrd r0, r2, [r0]484; CHECK-NEXT: vmov.32 q1[0], r0485; CHECK-NEXT: vmov.32 q0[0], r2486; CHECK-NEXT: vmovx.f16 s5, s4487; CHECK-NEXT: vins.f16 s4, s0488; CHECK-NEXT: vmovx.f16 s0, s0489; CHECK-NEXT: vins.f16 s5, s0490; CHECK-NEXT: vmov r0, r2, d2491; CHECK-NEXT: str r2, [r1, #4]492; CHECK-NEXT: str r0, [r1]493; CHECK-NEXT: bx lr494entry:495 %l1 = load <2 x half>, ptr %src, align 4496 %s2 = getelementptr <2 x half>, ptr %src, i32 1497 %l2 = load <2 x half>, ptr %s2, align 4498 %s = shufflevector <2 x half> %l1, <2 x half> %l2, <4 x i32> <i32 0, i32 2, i32 1, i32 3>499 store <4 x half> %s, ptr %dst, align 2500 ret void501}502 503define void @vst2_v4f16(ptr %src, ptr %dst) {504; CHECK-LABEL: vst2_v4f16:505; CHECK: @ %bb.0: @ %entry506; CHECK-NEXT: .vsave {d8, d9}507; CHECK-NEXT: vpush {d8, d9}508; CHECK-NEXT: ldrd r2, r12, [r0]509; CHECK-NEXT: ldrd r3, r0, [r0, #8]510; CHECK-NEXT: vmov.32 q4[0], r2511; CHECK-NEXT: vmov q0, q4512; CHECK-NEXT: vmov.32 q3[0], r3513; CHECK-NEXT: vmov q2, q3514; CHECK-NEXT: vmov.32 q0[1], r12515; CHECK-NEXT: vmov.32 q2[1], r0516; CHECK-NEXT: vmovx.f16 s0, s12517; CHECK-NEXT: vmovx.f16 s5, s16518; CHECK-NEXT: vmov.f32 s4, s16519; CHECK-NEXT: vins.f16 s5, s0520; CHECK-NEXT: vmovx.f16 s7, s1521; CHECK-NEXT: vins.f16 s1, s9522; CHECK-NEXT: vmovx.f16 s0, s9523; CHECK-NEXT: vins.f16 s4, s12524; CHECK-NEXT: vins.f16 s7, s0525; CHECK-NEXT: vmov.f32 s6, s1526; CHECK-NEXT: vstrh.16 q1, [r1]527; CHECK-NEXT: vpop {d8, d9}528; CHECK-NEXT: bx lr529entry:530 %l1 = load <4 x half>, ptr %src, align 4531 %s2 = getelementptr <4 x half>, ptr %src, i32 1532 %l2 = load <4 x half>, ptr %s2, align 4533 %s = shufflevector <4 x half> %l1, <4 x half> %l2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>534 store <8 x half> %s, ptr %dst, align 2535 ret void536}537 538define void @vst2_v8f16(ptr %src, ptr %dst) {539; CHECK-LABEL: vst2_v8f16:540; CHECK: @ %bb.0: @ %entry541; CHECK-NEXT: vldrw.u32 q1, [r0, #16]542; CHECK-NEXT: vldrw.u32 q0, [r0]543; CHECK-NEXT: vst20.16 {q0, q1}, [r1]544; CHECK-NEXT: vst21.16 {q0, q1}, [r1]545; CHECK-NEXT: bx lr546entry:547 %l1 = load <8 x half>, ptr %src, align 4548 %s2 = getelementptr <8 x half>, ptr %src, i32 1549 %l2 = load <8 x half>, ptr %s2, align 4550 %s = shufflevector <8 x half> %l1, <8 x half> %l2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>551 store <16 x half> %s, ptr %dst, align 2552 ret void553}554 555define void @vst2_v16f16(ptr %src, ptr %dst) {556; CHECK-LABEL: vst2_v16f16:557; CHECK: @ %bb.0: @ %entry558; CHECK-NEXT: vldrw.u32 q3, [r0, #32]559; CHECK-NEXT: vldrw.u32 q2, [r0]560; CHECK-NEXT: vldrw.u32 q1, [r0, #48]561; CHECK-NEXT: vldrw.u32 q0, [r0, #16]562; CHECK-NEXT: vst20.16 {q2, q3}, [r1]563; CHECK-NEXT: vst21.16 {q2, q3}, [r1]!564; CHECK-NEXT: vst20.16 {q0, q1}, [r1]565; CHECK-NEXT: vst21.16 {q0, q1}, [r1]566; CHECK-NEXT: bx lr567entry:568 %l1 = load <16 x half>, ptr %src, align 4569 %s2 = getelementptr <16 x half>, ptr %src, i32 1570 %l2 = load <16 x half>, ptr %s2, align 4571 %s = shufflevector <16 x half> %l1, <16 x half> %l2, <32 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>572 store <32 x half> %s, ptr %dst, align 2573 ret void574}575 576define void @vst2_v8f16_align1(ptr %src, ptr %dst) {577; CHECK-LABEL: vst2_v8f16_align1:578; CHECK: @ %bb.0: @ %entry579; CHECK-NEXT: vldrw.u32 q1, [r0]580; CHECK-NEXT: vldrw.u32 q2, [r0, #16]581; CHECK-NEXT: vmovx.f16 s1, s6582; CHECK-NEXT: vmovx.f16 s0, s10583; CHECK-NEXT: vins.f16 s1, s0584; CHECK-NEXT: vmovx.f16 s3, s7585; CHECK-NEXT: vmovx.f16 s0, s11586; CHECK-NEXT: vins.f16 s6, s10587; CHECK-NEXT: vins.f16 s3, s0588; CHECK-NEXT: vmovx.f16 s10, s4589; CHECK-NEXT: vmovx.f16 s0, s8590; CHECK-NEXT: vins.f16 s7, s11591; CHECK-NEXT: vins.f16 s4, s8592; CHECK-NEXT: vins.f16 s10, s0593; CHECK-NEXT: vmovx.f16 s8, s5594; CHECK-NEXT: vins.f16 s5, s9595; CHECK-NEXT: vmovx.f16 s0, s9596; CHECK-NEXT: vmov q3, q1597; CHECK-NEXT: vins.f16 s8, s0598; CHECK-NEXT: vmov.f32 s0, s6599; CHECK-NEXT: vmov.f32 s2, s7600; CHECK-NEXT: vmov.f32 s13, s10601; CHECK-NEXT: vstrb.8 q0, [r1, #16]602; CHECK-NEXT: vmov.f32 s14, s5603; CHECK-NEXT: vmov.f32 s15, s8604; CHECK-NEXT: vstrb.8 q3, [r1]605; CHECK-NEXT: bx lr606entry:607 %l1 = load <8 x half>, ptr %src, align 4608 %s2 = getelementptr <8 x half>, ptr %src, i32 1609 %l2 = load <8 x half>, ptr %s2, align 4610 %s = shufflevector <8 x half> %l1, <8 x half> %l2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>611 store <16 x half> %s, ptr %dst, align 1612 ret void613}614 615; f64616 617define void @vst2_v2f64(ptr %src, ptr %dst) {618; CHECK-LABEL: vst2_v2f64:619; CHECK: @ %bb.0: @ %entry620; CHECK-NEXT: vldrw.u32 q0, [r0, #16]621; CHECK-NEXT: vldrw.u32 q1, [r0]622; CHECK-NEXT: vmov.f64 d4, d3623; CHECK-NEXT: vmov.f64 d5, d1624; CHECK-NEXT: vmov.f64 d3, d0625; CHECK-NEXT: vstrw.32 q2, [r1, #16]626; CHECK-NEXT: vstrw.32 q1, [r1]627; CHECK-NEXT: bx lr628entry:629 %l1 = load <2 x double>, ptr %src, align 4630 %s2 = getelementptr <2 x double>, ptr %src, i32 1631 %l2 = load <2 x double>, ptr %s2, align 4632 %s = shufflevector <2 x double> %l1, <2 x double> %l2, <4 x i32> <i32 0, i32 2, i32 1, i32 3>633 store <4 x double> %s, ptr %dst, align 8634 ret void635}636 637define void @vst2_v4f64(ptr %src, ptr %dst) {638; CHECK-LABEL: vst2_v4f64:639; CHECK: @ %bb.0: @ %entry640; CHECK-NEXT: .vsave {d8, d9}641; CHECK-NEXT: vpush {d8, d9}642; CHECK-NEXT: vldrw.u32 q0, [r0, #32]643; CHECK-NEXT: vldrw.u32 q1, [r0]644; CHECK-NEXT: vldrw.u32 q2, [r0, #48]645; CHECK-NEXT: vldrw.u32 q3, [r0, #16]646; CHECK-NEXT: vmov.f64 d8, d2647; CHECK-NEXT: vmov.f64 d9, d0648; CHECK-NEXT: vmov.f64 d0, d3649; CHECK-NEXT: vstrw.32 q4, [r1]650; CHECK-NEXT: vmov.f64 d3, d4651; CHECK-NEXT: vstrw.32 q0, [r1, #16]652; CHECK-NEXT: vmov.f64 d2, d6653; CHECK-NEXT: vmov.f64 d4, d7654; CHECK-NEXT: vstrw.32 q1, [r1, #32]655; CHECK-NEXT: vstrw.32 q2, [r1, #48]656; CHECK-NEXT: vpop {d8, d9}657; CHECK-NEXT: bx lr658entry:659 %l1 = load <4 x double>, ptr %src, align 4660 %s2 = getelementptr <4 x double>, ptr %src, i32 1661 %l2 = load <4 x double>, ptr %s2, align 4662 %s = shufflevector <4 x double> %l1, <4 x double> %l2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>663 store <8 x double> %s, ptr %dst, align 8664 ret void665}666