[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-vst3.ll
blob7d4763fdeb03a1fb5f48d5d78f1b9c3e1c20b7b6
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp,+fp64 -verify-machineinstrs %s -o - | FileCheck %s
4 ; i32
6 define void @vst3_v2i32(<2 x i32> *%src, <6 x i32> *%dst) {
7 ; CHECK-LABEL: vst3_v2i32:
8 ; CHECK:       @ %bb.0: @ %entry
9 ; CHECK-NEXT:    .save {r4, lr}
10 ; CHECK-NEXT:    push {r4, lr}
11 ; CHECK-NEXT:    ldrd lr, r12, [r0]
12 ; CHECK-NEXT:    ldrd r3, r2, [r0, #8]
13 ; CHECK-NEXT:    ldrd r4, r0, [r0, #16]
14 ; CHECK-NEXT:    vmov q1[2], q1[0], lr, r3
15 ; CHECK-NEXT:    vmov q1[3], q1[1], r12, r2
16 ; CHECK-NEXT:    vmov.32 q0[0], r4
17 ; CHECK-NEXT:    vmov.f32 s8, s7
18 ; CHECK-NEXT:    vmov.32 q0[1], r0
19 ; CHECK-NEXT:    vmov.f32 s9, s6
20 ; CHECK-NEXT:    vmov.f32 s10, s0
21 ; CHECK-NEXT:    vmov.f32 s11, s5
22 ; CHECK-NEXT:    vmov r2, s8
23 ; CHECK-NEXT:    vmov.f32 s8, s4
24 ; CHECK-NEXT:    vstrw.32 q2, [r1]
25 ; CHECK-NEXT:    strd r2, r0, [r1, #16]
26 ; CHECK-NEXT:    pop {r4, pc}
27 entry:
28   %s1 = getelementptr <2 x i32>, <2 x i32>* %src, i32 0
29   %l1 = load <2 x i32>, <2 x i32>* %s1, align 4
30   %s2 = getelementptr <2 x i32>, <2 x i32>* %src, i32 1
31   %l2 = load <2 x i32>, <2 x i32>* %s2, align 4
32   %s3 = getelementptr <2 x i32>, <2 x i32>* %src, i32 2
33   %l3 = load <2 x i32>, <2 x i32>* %s3, align 4
34   %t1 = shufflevector <2 x i32> %l1, <2 x i32> %l2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
35   %t2 = shufflevector <2 x i32> %l3, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
36   %s = shufflevector <4 x i32> %t1, <4 x i32> %t2, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>
37   store <6 x i32> %s, <6 x i32> *%dst
38   ret void
41 define void @vst3_v4i32(<4 x i32> *%src, <12 x i32> *%dst) {
42 ; CHECK-LABEL: vst3_v4i32:
43 ; CHECK:       @ %bb.0: @ %entry
44 ; CHECK-NEXT:    .vsave {d8, d9}
45 ; CHECK-NEXT:    vpush {d8, d9}
46 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #16]
47 ; CHECK-NEXT:    vldrw.u32 q3, [r0]
48 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #32]
49 ; CHECK-NEXT:    vmov.f32 s8, s5
50 ; CHECK-NEXT:    vmov.f32 s9, s1
51 ; CHECK-NEXT:    vmov.f32 s18, s0
52 ; CHECK-NEXT:    vmov.f32 s0, s2
53 ; CHECK-NEXT:    vmov.f32 s11, s6
54 ; CHECK-NEXT:    vmov.f32 s10, s14
55 ; CHECK-NEXT:    vmov.f32 s16, s12
56 ; CHECK-NEXT:    vstrw.32 q2, [r1, #16]
57 ; CHECK-NEXT:    vmov.f32 s17, s4
58 ; CHECK-NEXT:    vmov.f32 s19, s13
59 ; CHECK-NEXT:    vmov.f32 s1, s15
60 ; CHECK-NEXT:    vstrw.32 q4, [r1]
61 ; CHECK-NEXT:    vmov.f32 s2, s7
62 ; CHECK-NEXT:    vstrw.32 q0, [r1, #32]
63 ; CHECK-NEXT:    vpop {d8, d9}
64 ; CHECK-NEXT:    bx lr
65 entry:
66   %s1 = getelementptr <4 x i32>, <4 x i32>* %src, i32 0
67   %l1 = load <4 x i32>, <4 x i32>* %s1, align 4
68   %s2 = getelementptr <4 x i32>, <4 x i32>* %src, i32 1
69   %l2 = load <4 x i32>, <4 x i32>* %s2, align 4
70   %s3 = getelementptr <4 x i32>, <4 x i32>* %src, i32 2
71   %l3 = load <4 x i32>, <4 x i32>* %s3, align 4
72   %t1 = shufflevector <4 x i32> %l1, <4 x i32> %l2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
73   %t2 = shufflevector <4 x i32> %l3, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
74   %s = shufflevector <8 x i32> %t1, <8 x i32> %t2, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
75   store <12 x i32> %s, <12 x i32> *%dst
76   ret void
79 define void @vst3_v8i32(<8 x i32> *%src, <24 x i32> *%dst) {
80 ; CHECK-LABEL: vst3_v8i32:
81 ; CHECK:       @ %bb.0: @ %entry
82 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
83 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
84 ; CHECK-NEXT:    .pad #16
85 ; CHECK-NEXT:    sub sp, #16
86 ; CHECK-NEXT:    vldrw.u32 q7, [r0]
87 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #80]
88 ; CHECK-NEXT:    vldrw.u32 q4, [r0, #16]
89 ; CHECK-NEXT:    vldrw.u32 q3, [r0, #48]
90 ; CHECK-NEXT:    vstrw.32 q7, [sp] @ 16-byte Spill
91 ; CHECK-NEXT:    vldrw.u32 q6, [r0, #32]
92 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #64]
93 ; CHECK-NEXT:    vmov.f32 s8, s2
94 ; CHECK-NEXT:    vmov.f32 s20, s28
95 ; CHECK-NEXT:    vmov.f32 s9, s19
96 ; CHECK-NEXT:    vmov.f32 s28, s16
97 ; CHECK-NEXT:    vmov.f32 s31, s17
98 ; CHECK-NEXT:    vmov.f32 s2, s18
99 ; CHECK-NEXT:    vldrw.u32 q4, [sp] @ 16-byte Reload
100 ; CHECK-NEXT:    vmov.f32 s11, s3
101 ; CHECK-NEXT:    vmov.f32 s10, s15
102 ; CHECK-NEXT:    vmov.f32 s23, s29
103 ; CHECK-NEXT:    vstrw.32 q2, [r1, #80]
104 ; CHECK-NEXT:    vmov.f32 s22, s4
105 ; CHECK-NEXT:    vmov.f32 s21, s24
106 ; CHECK-NEXT:    vmov.f32 s29, s12
107 ; CHECK-NEXT:    vstrw.32 q5, [r1]
108 ; CHECK-NEXT:    vmov.f32 s30, s0
109 ; CHECK-NEXT:    vmov.f32 s0, s13
110 ; CHECK-NEXT:    vstrw.32 q7, [r1, #48]
111 ; CHECK-NEXT:    vmov.f32 s3, s14
112 ; CHECK-NEXT:    vmov.f32 s13, s5
113 ; CHECK-NEXT:    vstrw.32 q0, [r1, #64]
114 ; CHECK-NEXT:    vmov.f32 s4, s6
115 ; CHECK-NEXT:    vmov.f32 s12, s25
116 ; CHECK-NEXT:    vmov.f32 s15, s26
117 ; CHECK-NEXT:    vmov.f32 s14, s18
118 ; CHECK-NEXT:    vmov.f32 s5, s19
119 ; CHECK-NEXT:    vstrw.32 q3, [r1, #16]
120 ; CHECK-NEXT:    vmov.f32 s6, s27
121 ; CHECK-NEXT:    vstrw.32 q1, [r1, #32]
122 ; CHECK-NEXT:    add sp, #16
123 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
124 ; CHECK-NEXT:    bx lr
125 entry:
126   %s1 = getelementptr <8 x i32>, <8 x i32>* %src, i32 0
127   %l1 = load <8 x i32>, <8 x i32>* %s1, align 4
128   %s2 = getelementptr <8 x i32>, <8 x i32>* %src, i32 1
129   %l2 = load <8 x i32>, <8 x i32>* %s2, align 4
130   %s3 = getelementptr <8 x i32>, <8 x i32>* %src, i32 2
131   %l3 = load <8 x i32>, <8 x i32>* %s3, align 4
132   %t1 = shufflevector <8 x i32> %l1, <8 x i32> %l2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
133   %t2 = shufflevector <8 x i32> %l3, <8 x i32> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
134   %s = shufflevector <16 x i32> %t1, <16 x i32> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>
135   store <24 x i32> %s, <24 x i32> *%dst
136   ret void
139 define void @vst3_v16i32(<16 x i32> *%src, <48 x i32> *%dst) {
140 ; CHECK-LABEL: vst3_v16i32:
141 ; CHECK:       @ %bb.0: @ %entry
142 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
143 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
144 ; CHECK-NEXT:    .pad #144
145 ; CHECK-NEXT:    sub sp, #144
146 ; CHECK-NEXT:    vldrw.u32 q7, [r0, #96]
147 ; CHECK-NEXT:    vldrw.u32 q3, [r0, #160]
148 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #64]
149 ; CHECK-NEXT:    vldrw.u32 q2, [r0, #128]
150 ; CHECK-NEXT:    vstrw.32 q7, [sp] @ 16-byte Spill
151 ; CHECK-NEXT:    vldrw.u32 q7, [r0, #80]
152 ; CHECK-NEXT:    vstrw.32 q3, [sp, #128] @ 16-byte Spill
153 ; CHECK-NEXT:    vldrw.u32 q3, [r0, #112]
154 ; CHECK-NEXT:    vstrw.32 q7, [sp, #80] @ 16-byte Spill
155 ; CHECK-NEXT:    vldrw.u32 q7, [r0, #32]
156 ; CHECK-NEXT:    vldrw.u32 q6, [r0]
157 ; CHECK-NEXT:    vstrw.32 q3, [sp, #64] @ 16-byte Spill
158 ; CHECK-NEXT:    vstrw.32 q7, [sp, #16] @ 16-byte Spill
159 ; CHECK-NEXT:    vldrw.u32 q7, [r0, #16]
160 ; CHECK-NEXT:    vmov.f32 s16, s1
161 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #176]
162 ; CHECK-NEXT:    vmov.f32 s19, s2
163 ; CHECK-NEXT:    vstrw.32 q7, [sp, #48] @ 16-byte Spill
164 ; CHECK-NEXT:    vmov.f32 s17, s9
165 ; CHECK-NEXT:    vldrw.u32 q3, [r0, #48]
166 ; CHECK-NEXT:    vmov.f32 s18, s26
167 ; CHECK-NEXT:    vldrw.u32 q7, [sp, #64] @ 16-byte Reload
168 ; CHECK-NEXT:    vldrw.u32 q5, [r0, #144]
169 ; CHECK-NEXT:    vstrw.32 q4, [r1, #16]
170 ; CHECK-NEXT:    vmov.f32 s18, s3
171 ; CHECK-NEXT:    vmov.f32 s16, s10
172 ; CHECK-NEXT:    vmov.f32 s17, s27
173 ; CHECK-NEXT:    vmov.f32 s19, s11
174 ; CHECK-NEXT:    vstrw.32 q4, [r1, #32]
175 ; CHECK-NEXT:    vmov.f32 s16, s6
176 ; CHECK-NEXT:    vmov.f32 s19, s7
177 ; CHECK-NEXT:    vmov.f32 s17, s15
178 ; CHECK-NEXT:    vmov.f32 s18, s31
179 ; CHECK-NEXT:    vstrw.32 q4, [sp, #112] @ 16-byte Spill
180 ; CHECK-NEXT:    vmov.f32 s18, s8
181 ; CHECK-NEXT:    vmov.f64 d4, d14
182 ; CHECK-NEXT:    vmov.f32 s2, s4
183 ; CHECK-NEXT:    vmov.f32 s1, s8
184 ; CHECK-NEXT:    vmov.f32 s4, s9
185 ; CHECK-NEXT:    vldrw.u32 q2, [sp, #16] @ 16-byte Reload
186 ; CHECK-NEXT:    vmov.f32 s17, s0
187 ; CHECK-NEXT:    vmov.f32 s3, s13
188 ; CHECK-NEXT:    vmov.f32 s0, s12
189 ; CHECK-NEXT:    vmov.f64 d14, d4
190 ; CHECK-NEXT:    vstrw.32 q0, [sp, #64] @ 16-byte Spill
191 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #128] @ 16-byte Reload
192 ; CHECK-NEXT:    vmov.f32 s16, s24
193 ; CHECK-NEXT:    vmov.f32 s19, s25
194 ; CHECK-NEXT:    vstrw.32 q4, [sp, #96] @ 16-byte Spill
195 ; CHECK-NEXT:    vmov.f32 s17, s1
196 ; CHECK-NEXT:    vmov.f32 s12, s2
197 ; CHECK-NEXT:    vmov.f32 s15, s3
198 ; CHECK-NEXT:    vmov q0, q5
199 ; CHECK-NEXT:    vstrw.32 q0, [sp, #16] @ 16-byte Spill
200 ; CHECK-NEXT:    vmov.f64 d0, d14
201 ; CHECK-NEXT:    vldrw.u32 q5, [sp, #48] @ 16-byte Reload
202 ; CHECK-NEXT:    vmov.f32 s6, s14
203 ; CHECK-NEXT:    vmov.f32 s7, s30
204 ; CHECK-NEXT:    vstrw.32 q1, [sp, #32] @ 16-byte Spill
205 ; CHECK-NEXT:    vldrw.u32 q1, [sp] @ 16-byte Reload
206 ; CHECK-NEXT:    vmov.f32 s31, s1
207 ; CHECK-NEXT:    vmov.f64 d0, d10
208 ; CHECK-NEXT:    vmov.f32 s16, s5
209 ; CHECK-NEXT:    vmov.f32 s19, s6
210 ; CHECK-NEXT:    vmov.f32 s14, s7
211 ; CHECK-NEXT:    vmov.f32 s29, s4
212 ; CHECK-NEXT:    vldrw.u32 q1, [sp, #128] @ 16-byte Reload
213 ; CHECK-NEXT:    vmov.f32 s24, s2
214 ; CHECK-NEXT:    vmov.f32 s30, s4
215 ; CHECK-NEXT:    vmov.f32 s27, s3
216 ; CHECK-NEXT:    vstrw.32 q7, [r1, #96]
217 ; CHECK-NEXT:    vmov.f32 s4, s0
218 ; CHECK-NEXT:    vmov.f32 s7, s1
219 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #16] @ 16-byte Reload
220 ; CHECK-NEXT:    vmov.f32 s18, s10
221 ; CHECK-NEXT:    vmov.f64 d10, d0
222 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #64] @ 16-byte Reload
223 ; CHECK-NEXT:    vstrw.32 q4, [r1, #112]
224 ; CHECK-NEXT:    vstrw.32 q0, [r1, #144]
225 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #32] @ 16-byte Reload
226 ; CHECK-NEXT:    vstrw.32 q0, [r1, #160]
227 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #112] @ 16-byte Reload
228 ; CHECK-NEXT:    vmov.f32 s13, s11
229 ; CHECK-NEXT:    vldrw.u32 q2, [sp, #80] @ 16-byte Reload
230 ; CHECK-NEXT:    vstrw.32 q0, [r1, #176]
231 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #96] @ 16-byte Reload
232 ; CHECK-NEXT:    vmov.f32 s25, s23
233 ; CHECK-NEXT:    vstrw.32 q3, [r1, #128]
234 ; CHECK-NEXT:    vmov.f32 s26, s11
235 ; CHECK-NEXT:    vstrw.32 q0, [r1]
236 ; CHECK-NEXT:    vmov.f32 s6, s20
237 ; CHECK-NEXT:    vstrw.32 q6, [r1, #80]
238 ; CHECK-NEXT:    vmov.f32 s5, s8
239 ; CHECK-NEXT:    vmov.f32 s20, s9
240 ; CHECK-NEXT:    vstrw.32 q1, [r1, #48]
241 ; CHECK-NEXT:    vmov.f32 s23, s10
242 ; CHECK-NEXT:    vstrw.32 q5, [r1, #64]
243 ; CHECK-NEXT:    add sp, #144
244 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
245 ; CHECK-NEXT:    bx lr
246 entry:
247   %s1 = getelementptr <16 x i32>, <16 x i32>* %src, i32 0
248   %l1 = load <16 x i32>, <16 x i32>* %s1, align 4
249   %s2 = getelementptr <16 x i32>, <16 x i32>* %src, i32 1
250   %l2 = load <16 x i32>, <16 x i32>* %s2, align 4
251   %s3 = getelementptr <16 x i32>, <16 x i32>* %src, i32 2
252   %l3 = load <16 x i32>, <16 x i32>* %s3, align 4
253   %t1 = shufflevector <16 x i32> %l1, <16 x i32> %l2, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
254   %t2 = shufflevector <16 x i32> %l3, <16 x i32> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
255   %s = shufflevector <32 x i32> %t1, <32 x i32> %t2, <48 x i32> <i32 0, i32 16, i32 32, i32 1, i32 17, i32 33, i32 2, i32 18, i32 34, i32 3, i32 19, i32 35, i32 4, i32 20, i32 36, i32 5, i32 21, i32 37, i32 6, i32 22, i32 38, i32 7, i32 23, i32 39, i32 8, i32 24, i32 40, i32 9, i32 25, i32 41, i32 10, i32 26, i32 42, i32 11, i32 27, i32 43, i32 12, i32 28, i32 44, i32 13, i32 29, i32 45, i32 14, i32 30, i32 46, i32 15, i32 31, i32 47>
256   store <48 x i32> %s, <48 x i32> *%dst
257   ret void
260 ; i16
262 define void @vst3_v2i16(<2 x i16> *%src, <6 x i16> *%dst) {
263 ; CHECK-LABEL: vst3_v2i16:
264 ; CHECK:       @ %bb.0: @ %entry
265 ; CHECK-NEXT:    .save {r4, lr}
266 ; CHECK-NEXT:    push {r4, lr}
267 ; CHECK-NEXT:    ldrh r2, [r0, #6]
268 ; CHECK-NEXT:    ldrh.w lr, [r0, #4]
269 ; CHECK-NEXT:    ldrh.w r12, [r0, #8]
270 ; CHECK-NEXT:    vmov.16 q0[4], r2
271 ; CHECK-NEXT:    ldrh r3, [r0, #2]
272 ; CHECK-NEXT:    vmov q1[2], q1[0], lr, r2
273 ; CHECK-NEXT:    ldrh r4, [r0]
274 ; CHECK-NEXT:    ldrh r0, [r0, #10]
275 ; CHECK-NEXT:    vmov.16 q0[5], r0
276 ; CHECK-NEXT:    vmov r0, s2
277 ; CHECK-NEXT:    vmov q0[2], q0[0], r4, r3
278 ; CHECK-NEXT:    vmov.f32 s1, s4
279 ; CHECK-NEXT:    vmov.f32 s3, s2
280 ; CHECK-NEXT:    vmov.32 q0[2], r12
281 ; CHECK-NEXT:    vstrh.32 q0, [r1]
282 ; CHECK-NEXT:    str r0, [r1, #8]
283 ; CHECK-NEXT:    pop {r4, pc}
284 entry:
285   %s1 = getelementptr <2 x i16>, <2 x i16>* %src, i32 0
286   %l1 = load <2 x i16>, <2 x i16>* %s1, align 4
287   %s2 = getelementptr <2 x i16>, <2 x i16>* %src, i32 1
288   %l2 = load <2 x i16>, <2 x i16>* %s2, align 4
289   %s3 = getelementptr <2 x i16>, <2 x i16>* %src, i32 2
290   %l3 = load <2 x i16>, <2 x i16>* %s3, align 4
291   %t1 = shufflevector <2 x i16> %l1, <2 x i16> %l2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
292   %t2 = shufflevector <2 x i16> %l3, <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
293   %s = shufflevector <4 x i16> %t1, <4 x i16> %t2, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>
294   store <6 x i16> %s, <6 x i16> *%dst
295   ret void
298 define void @vst3_v4i16(<4 x i16> *%src, <12 x i16> *%dst) {
299 ; CHECK-LABEL: vst3_v4i16:
300 ; CHECK:       @ %bb.0: @ %entry
301 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
302 ; CHECK-NEXT:    push {r4, r5, r7, lr}
303 ; CHECK-NEXT:    vldrh.u32 q1, [r0]
304 ; CHECK-NEXT:    vldrh.u32 q0, [r0, #8]
305 ; CHECK-NEXT:    vldrh.u32 q2, [r0, #16]
306 ; CHECK-NEXT:    vmov r0, r5, d2
307 ; CHECK-NEXT:    vmov.f32 s5, s7
308 ; CHECK-NEXT:    vmov r2, r3, d0
309 ; CHECK-NEXT:    vmov lr, r4, d1
310 ; CHECK-NEXT:    vmov.16 q0[0], r0
311 ; CHECK-NEXT:    vmov.f32 s4, s10
312 ; CHECK-NEXT:    vmov.16 q0[1], r2
313 ; CHECK-NEXT:    vmov.f32 s7, s11
314 ; CHECK-NEXT:    vmov r12, s6
315 ; CHECK-NEXT:    vmov.32 q1[2], r4
316 ; CHECK-NEXT:    vmov r0, r4, d4
317 ; CHECK-NEXT:    vstrh.32 q1, [r1, #16]
318 ; CHECK-NEXT:    vmov.16 q0[2], r0
319 ; CHECK-NEXT:    vmov.16 q0[3], r5
320 ; CHECK-NEXT:    vmov.16 q0[4], r3
321 ; CHECK-NEXT:    vmov.16 q0[5], r4
322 ; CHECK-NEXT:    vmov.16 q0[6], r12
323 ; CHECK-NEXT:    vmov.16 q0[7], lr
324 ; CHECK-NEXT:    vstrw.32 q0, [r1]
325 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
326 entry:
327   %s1 = getelementptr <4 x i16>, <4 x i16>* %src, i32 0
328   %l1 = load <4 x i16>, <4 x i16>* %s1, align 4
329   %s2 = getelementptr <4 x i16>, <4 x i16>* %src, i32 1
330   %l2 = load <4 x i16>, <4 x i16>* %s2, align 4
331   %s3 = getelementptr <4 x i16>, <4 x i16>* %src, i32 2
332   %l3 = load <4 x i16>, <4 x i16>* %s3, align 4
333   %t1 = shufflevector <4 x i16> %l1, <4 x i16> %l2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
334   %t2 = shufflevector <4 x i16> %l3, <4 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
335   %s = shufflevector <8 x i16> %t1, <8 x i16> %t2, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
336   store <12 x i16> %s, <12 x i16> *%dst
337   ret void
340 define void @vst3_v8i16(<8 x i16> *%src, <24 x i16> *%dst) {
341 ; CHECK-LABEL: vst3_v8i16:
342 ; CHECK:       @ %bb.0: @ %entry
343 ; CHECK-NEXT:    .vsave {d8, d9}
344 ; CHECK-NEXT:    vpush {d8, d9}
345 ; CHECK-NEXT:    vldrw.u32 q2, [r0]
346 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #16]
347 ; CHECK-NEXT:    vmov.f32 s0, s8
348 ; CHECK-NEXT:    vmov.u16 r2, q1[1]
349 ; CHECK-NEXT:    vins.f16 s0, s4
350 ; CHECK-NEXT:    vmov.f32 s12, s9
351 ; CHECK-NEXT:    vins.f16 s12, s5
352 ; CHECK-NEXT:    vmov.16 q0[4], r2
353 ; CHECK-NEXT:    vmov.f32 s3, s12
354 ; CHECK-NEXT:    vldrw.u32 q3, [r0, #32]
355 ; CHECK-NEXT:    vmovx.f16 s8, s8
356 ; CHECK-NEXT:    vmovx.f16 s16, s6
357 ; CHECK-NEXT:    vmov.f32 s1, s12
358 ; CHECK-NEXT:    vins.f16 s17, s7
359 ; CHECK-NEXT:    vins.f16 s1, s8
360 ; CHECK-NEXT:    vmovx.f16 s8, s12
361 ; CHECK-NEXT:    vins.f16 s2, s8
362 ; CHECK-NEXT:    vmovx.f16 s8, s14
363 ; CHECK-NEXT:    vins.f16 s16, s8
364 ; CHECK-NEXT:    vmovx.f16 s19, s7
365 ; CHECK-NEXT:    vmovx.f16 s8, s15
366 ; CHECK-NEXT:    vmov.f32 s18, s15
367 ; CHECK-NEXT:    vins.f16 s19, s8
368 ; CHECK-NEXT:    vmovx.f16 s8, s17
369 ; CHECK-NEXT:    vmov.f32 s17, s11
370 ; CHECK-NEXT:    vmovx.f16 s12, s9
371 ; CHECK-NEXT:    vins.f16 s17, s8
372 ; CHECK-NEXT:    vmovx.f16 s8, s11
373 ; CHECK-NEXT:    vins.f16 s18, s8
374 ; CHECK-NEXT:    vmov.f32 s8, s13
375 ; CHECK-NEXT:    vins.f16 s8, s12
376 ; CHECK-NEXT:    vmovx.f16 s12, s10
377 ; CHECK-NEXT:    vins.f16 s14, s12
378 ; CHECK-NEXT:    vrev32.16 q1, q1
379 ; CHECK-NEXT:    vmovx.f16 s12, s13
380 ; CHECK-NEXT:    vmovx.f16 s4, s6
381 ; CHECK-NEXT:    vins.f16 s5, s12
382 ; CHECK-NEXT:    vmov.f32 s11, s14
383 ; CHECK-NEXT:    vins.f16 s10, s4
384 ; CHECK-NEXT:    vmov.f32 s9, s5
385 ; CHECK-NEXT:    vstrw.32 q4, [r1, #32]
386 ; CHECK-NEXT:    vstrw.32 q2, [r1, #16]
387 ; CHECK-NEXT:    vstrw.32 q0, [r1]
388 ; CHECK-NEXT:    vpop {d8, d9}
389 ; CHECK-NEXT:    bx lr
390 entry:
391   %s1 = getelementptr <8 x i16>, <8 x i16>* %src, i32 0
392   %l1 = load <8 x i16>, <8 x i16>* %s1, align 4
393   %s2 = getelementptr <8 x i16>, <8 x i16>* %src, i32 1
394   %l2 = load <8 x i16>, <8 x i16>* %s2, align 4
395   %s3 = getelementptr <8 x i16>, <8 x i16>* %src, i32 2
396   %l3 = load <8 x i16>, <8 x i16>* %s3, align 4
397   %t1 = shufflevector <8 x i16> %l1, <8 x i16> %l2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
398   %t2 = shufflevector <8 x i16> %l3, <8 x i16> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
399   %s = shufflevector <16 x i16> %t1, <16 x i16> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>
400   store <24 x i16> %s, <24 x i16> *%dst
401   ret void
404 define void @vst3_v16i16(<16 x i16> *%src, <48 x i16> *%dst) {
405 ; CHECK-LABEL: vst3_v16i16:
406 ; CHECK:       @ %bb.0: @ %entry
407 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
408 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
409 ; CHECK-NEXT:    .pad #64
410 ; CHECK-NEXT:    sub sp, #64
411 ; CHECK-NEXT:    vldrw.u32 q2, [r0, #80]
412 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #48]
413 ; CHECK-NEXT:    vldrw.u32 q6, [r0]
414 ; CHECK-NEXT:    vstrw.32 q1, [sp, #48] @ 16-byte Spill
415 ; CHECK-NEXT:    vmovx.f16 s0, s10
416 ; CHECK-NEXT:    vmovx.f16 s4, s6
417 ; CHECK-NEXT:    vins.f16 s1, s7
418 ; CHECK-NEXT:    vins.f16 s4, s0
419 ; CHECK-NEXT:    vmovx.f16 s0, s11
420 ; CHECK-NEXT:    vmovx.f16 s7, s7
421 ; CHECK-NEXT:    vmov.f32 s12, s4
422 ; CHECK-NEXT:    vins.f16 s7, s0
423 ; CHECK-NEXT:    vmovx.f16 s4, s1
424 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #16]
425 ; CHECK-NEXT:    vmov.f32 s18, s11
426 ; CHECK-NEXT:    vmov.f32 s15, s7
427 ; CHECK-NEXT:    vstrw.32 q6, [sp] @ 16-byte Spill
428 ; CHECK-NEXT:    vmov.f32 s13, s3
429 ; CHECK-NEXT:    vins.f16 s13, s4
430 ; CHECK-NEXT:    vmovx.f16 s4, s3
431 ; CHECK-NEXT:    vins.f16 s18, s4
432 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #32]
433 ; CHECK-NEXT:    vmov.f32 s20, s24
434 ; CHECK-NEXT:    vins.f16 s20, s4
435 ; CHECK-NEXT:    vmov.u16 r2, q1[1]
436 ; CHECK-NEXT:    vmov.16 q5[4], r2
437 ; CHECK-NEXT:    vstrw.32 q1, [sp, #32] @ 16-byte Spill
438 ; CHECK-NEXT:    vmov.f32 s23, s25
439 ; CHECK-NEXT:    vmovx.f16 s4, s24
440 ; CHECK-NEXT:    vldrw.u32 q6, [r0, #64]
441 ; CHECK-NEXT:    vmov.f32 s14, s18
442 ; CHECK-NEXT:    vins.f16 s23, s5
443 ; CHECK-NEXT:    vstrw.32 q3, [sp, #16] @ 16-byte Spill
444 ; CHECK-NEXT:    vmov.f32 s5, s24
445 ; CHECK-NEXT:    vldrw.u32 q3, [sp, #48] @ 16-byte Reload
446 ; CHECK-NEXT:    vmov.f32 s28, s0
447 ; CHECK-NEXT:    vins.f16 s5, s4
448 ; CHECK-NEXT:    vmovx.f16 s4, s24
449 ; CHECK-NEXT:    vmov.u16 r0, q3[1]
450 ; CHECK-NEXT:    vins.f16 s28, s12
451 ; CHECK-NEXT:    vins.f16 s22, s4
452 ; CHECK-NEXT:    vmov.f32 s4, s1
453 ; CHECK-NEXT:    vmov.16 q7[4], r0
454 ; CHECK-NEXT:    vins.f16 s4, s13
455 ; CHECK-NEXT:    vmov.f32 s21, s5
456 ; CHECK-NEXT:    vmov.f32 s31, s4
457 ; CHECK-NEXT:    vldrw.u32 q1, [sp, #32] @ 16-byte Reload
458 ; CHECK-NEXT:    vmovx.f16 s0, s0
459 ; CHECK-NEXT:    vmov.f32 s29, s8
460 ; CHECK-NEXT:    vins.f16 s29, s0
461 ; CHECK-NEXT:    vmovx.f16 s0, s8
462 ; CHECK-NEXT:    vins.f16 s30, s0
463 ; CHECK-NEXT:    vmovx.f16 s4, s6
464 ; CHECK-NEXT:    vmovx.f16 s0, s26
465 ; CHECK-NEXT:    vldrw.u32 q4, [sp] @ 16-byte Reload
466 ; CHECK-NEXT:    vins.f16 s4, s0
467 ; CHECK-NEXT:    vins.f16 s5, s7
468 ; CHECK-NEXT:    vmovx.f16 s7, s7
469 ; CHECK-NEXT:    vmovx.f16 s0, s27
470 ; CHECK-NEXT:    vins.f16 s7, s0
471 ; CHECK-NEXT:    vmovx.f16 s0, s5
472 ; CHECK-NEXT:    vmov.f32 s13, s19
473 ; CHECK-NEXT:    vmovx.f16 s6, s1
474 ; CHECK-NEXT:    vins.f16 s13, s0
475 ; CHECK-NEXT:    vmov.f32 s14, s27
476 ; CHECK-NEXT:    vmovx.f16 s0, s19
477 ; CHECK-NEXT:    vmov.f32 s12, s25
478 ; CHECK-NEXT:    vins.f16 s14, s0
479 ; CHECK-NEXT:    vmov.f32 s0, s9
480 ; CHECK-NEXT:    vins.f16 s0, s6
481 ; CHECK-NEXT:    vmovx.f16 s6, s2
482 ; CHECK-NEXT:    vins.f16 s10, s6
483 ; CHECK-NEXT:    vmovx.f16 s6, s9
484 ; CHECK-NEXT:    vmov.f32 s3, s10
485 ; CHECK-NEXT:    vldrw.u32 q2, [sp, #48] @ 16-byte Reload
486 ; CHECK-NEXT:    vmov.f32 s5, s13
487 ; CHECK-NEXT:    vstrw.32 q7, [r1, #48]
488 ; CHECK-NEXT:    vrev32.16 q2, q2
489 ; CHECK-NEXT:    vstrw.32 q5, [r1]
490 ; CHECK-NEXT:    vmovx.f16 s8, s17
491 ; CHECK-NEXT:    vins.f16 s9, s6
492 ; CHECK-NEXT:    vmovx.f16 s6, s10
493 ; CHECK-NEXT:    vins.f16 s12, s8
494 ; CHECK-NEXT:    vmovx.f16 s8, s18
495 ; CHECK-NEXT:    vmov.f32 s10, s18
496 ; CHECK-NEXT:    vldrw.u32 q4, [sp, #32] @ 16-byte Reload
497 ; CHECK-NEXT:    vins.f16 s26, s8
498 ; CHECK-NEXT:    vmov.f32 s15, s26
499 ; CHECK-NEXT:    vmovx.f16 s8, s25
500 ; CHECK-NEXT:    vrev32.16 q6, q4
501 ; CHECK-NEXT:    vins.f16 s2, s6
502 ; CHECK-NEXT:    vins.f16 s25, s8
503 ; CHECK-NEXT:    vmov.f32 s1, s9
504 ; CHECK-NEXT:    vmovx.f16 s8, s26
505 ; CHECK-NEXT:    vstrw.32 q0, [r1, #64]
506 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #16] @ 16-byte Reload
507 ; CHECK-NEXT:    vins.f16 s10, s8
508 ; CHECK-NEXT:    vmov.f32 s6, s14
509 ; CHECK-NEXT:    vmov.f32 s14, s10
510 ; CHECK-NEXT:    vstrw.32 q1, [r1, #32]
511 ; CHECK-NEXT:    vmov.f32 s13, s25
512 ; CHECK-NEXT:    vstrw.32 q0, [r1, #80]
513 ; CHECK-NEXT:    vstrw.32 q3, [r1, #16]
514 ; CHECK-NEXT:    add sp, #64
515 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
516 ; CHECK-NEXT:    bx lr
517 entry:
518   %s1 = getelementptr <16 x i16>, <16 x i16>* %src, i32 0
519   %l1 = load <16 x i16>, <16 x i16>* %s1, align 4
520   %s2 = getelementptr <16 x i16>, <16 x i16>* %src, i32 1
521   %l2 = load <16 x i16>, <16 x i16>* %s2, align 4
522   %s3 = getelementptr <16 x i16>, <16 x i16>* %src, i32 2
523   %l3 = load <16 x i16>, <16 x i16>* %s3, align 4
524   %t1 = shufflevector <16 x i16> %l1, <16 x i16> %l2, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
525   %t2 = shufflevector <16 x i16> %l3, <16 x i16> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
526   %s = shufflevector <32 x i16> %t1, <32 x i16> %t2, <48 x i32> <i32 0, i32 16, i32 32, i32 1, i32 17, i32 33, i32 2, i32 18, i32 34, i32 3, i32 19, i32 35, i32 4, i32 20, i32 36, i32 5, i32 21, i32 37, i32 6, i32 22, i32 38, i32 7, i32 23, i32 39, i32 8, i32 24, i32 40, i32 9, i32 25, i32 41, i32 10, i32 26, i32 42, i32 11, i32 27, i32 43, i32 12, i32 28, i32 44, i32 13, i32 29, i32 45, i32 14, i32 30, i32 46, i32 15, i32 31, i32 47>
527   store <48 x i16> %s, <48 x i16> *%dst
528   ret void
531 ; i8
533 define void @vst3_v2i8(<2 x i8> *%src, <6 x i8> *%dst) {
534 ; CHECK-LABEL: vst3_v2i8:
535 ; CHECK:       @ %bb.0: @ %entry
536 ; CHECK-NEXT:    .save {r4, r5, r6, lr}
537 ; CHECK-NEXT:    push {r4, r5, r6, lr}
538 ; CHECK-NEXT:    .pad #16
539 ; CHECK-NEXT:    sub sp, #16
540 ; CHECK-NEXT:    ldrb r2, [r0]
541 ; CHECK-NEXT:    movs r6, #0
542 ; CHECK-NEXT:    ldrb r3, [r0, #1]
543 ; CHECK-NEXT:    ldrb.w r12, [r0, #2]
544 ; CHECK-NEXT:    vmov q0[2], q0[0], r2, r3
545 ; CHECK-NEXT:    ldrb.w lr, [r0, #3]
546 ; CHECK-NEXT:    vmov r4, s0
547 ; CHECK-NEXT:    ldrb r5, [r0, #5]
548 ; CHECK-NEXT:    vmov.16 q0[0], r4
549 ; CHECK-NEXT:    ldrb r0, [r0, #4]
550 ; CHECK-NEXT:    vmov.16 q0[1], r12
551 ; CHECK-NEXT:    mov r2, sp
552 ; CHECK-NEXT:    vmov.16 q0[2], r0
553 ; CHECK-NEXT:    add r0, sp, #8
554 ; CHECK-NEXT:    vmov.16 q0[3], r3
555 ; CHECK-NEXT:    vmov.16 q0[4], lr
556 ; CHECK-NEXT:    vmov.16 q0[5], r5
557 ; CHECK-NEXT:    vmov.16 q0[6], r6
558 ; CHECK-NEXT:    vmov.16 q0[7], r6
559 ; CHECK-NEXT:    vstrb.16 q0, [r2]
560 ; CHECK-NEXT:    vstrb.16 q0, [r0]
561 ; CHECK-NEXT:    vldrh.u32 q0, [r0]
562 ; CHECK-NEXT:    ldr r2, [sp]
563 ; CHECK-NEXT:    str r2, [r1]
564 ; CHECK-NEXT:    vmov r0, s2
565 ; CHECK-NEXT:    strh r0, [r1, #4]
566 ; CHECK-NEXT:    add sp, #16
567 ; CHECK-NEXT:    pop {r4, r5, r6, pc}
568 entry:
569   %s1 = getelementptr <2 x i8>, <2 x i8>* %src, i32 0
570   %l1 = load <2 x i8>, <2 x i8>* %s1, align 4
571   %s2 = getelementptr <2 x i8>, <2 x i8>* %src, i32 1
572   %l2 = load <2 x i8>, <2 x i8>* %s2, align 4
573   %s3 = getelementptr <2 x i8>, <2 x i8>* %src, i32 2
574   %l3 = load <2 x i8>, <2 x i8>* %s3, align 4
575   %t1 = shufflevector <2 x i8> %l1, <2 x i8> %l2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
576   %t2 = shufflevector <2 x i8> %l3, <2 x i8> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
577   %s = shufflevector <4 x i8> %t1, <4 x i8> %t2, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>
578   store <6 x i8> %s, <6 x i8> *%dst
579   ret void
582 define void @vst3_v4i8(<4 x i8> *%src, <12 x i8> *%dst) {
583 ; CHECK-LABEL: vst3_v4i8:
584 ; CHECK:       @ %bb.0: @ %entry
585 ; CHECK-NEXT:    .save {r4, r5, r6, lr}
586 ; CHECK-NEXT:    push {r4, r5, r6, lr}
587 ; CHECK-NEXT:    vldrb.u32 q0, [r0, #4]
588 ; CHECK-NEXT:    vldrb.u32 q1, [r0]
589 ; CHECK-NEXT:    vmov r2, lr, d0
590 ; CHECK-NEXT:    vmov r12, r3, d1
591 ; CHECK-NEXT:    vldrb.u32 q0, [r0, #8]
592 ; CHECK-NEXT:    vmov r0, r6, d3
593 ; CHECK-NEXT:    vmov r4, r5, d1
594 ; CHECK-NEXT:    vmov.8 q2[8], r4
595 ; CHECK-NEXT:    vmov.8 q2[9], r6
596 ; CHECK-NEXT:    vmov.8 q2[10], r3
597 ; CHECK-NEXT:    vmov.8 q2[11], r5
598 ; CHECK-NEXT:    vmov r3, s10
599 ; CHECK-NEXT:    str r3, [r1, #8]
600 ; CHECK-NEXT:    vmov r3, r4, d2
601 ; CHECK-NEXT:    vmov.16 q1[0], r3
602 ; CHECK-NEXT:    vmov r3, r5, d0
603 ; CHECK-NEXT:    vmov.16 q1[1], r2
604 ; CHECK-NEXT:    vmov.16 q1[2], r3
605 ; CHECK-NEXT:    vmov.16 q1[3], r4
606 ; CHECK-NEXT:    vmov.16 q1[4], lr
607 ; CHECK-NEXT:    vmov.16 q1[5], r5
608 ; CHECK-NEXT:    vmov.16 q1[6], r0
609 ; CHECK-NEXT:    vmov.16 q1[7], r12
610 ; CHECK-NEXT:    vstrb.16 q1, [r1]
611 ; CHECK-NEXT:    pop {r4, r5, r6, pc}
612 entry:
613   %s1 = getelementptr <4 x i8>, <4 x i8>* %src, i32 0
614   %l1 = load <4 x i8>, <4 x i8>* %s1, align 4
615   %s2 = getelementptr <4 x i8>, <4 x i8>* %src, i32 1
616   %l2 = load <4 x i8>, <4 x i8>* %s2, align 4
617   %s3 = getelementptr <4 x i8>, <4 x i8>* %src, i32 2
618   %l3 = load <4 x i8>, <4 x i8>* %s3, align 4
619   %t1 = shufflevector <4 x i8> %l1, <4 x i8> %l2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
620   %t2 = shufflevector <4 x i8> %l3, <4 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
621   %s = shufflevector <8 x i8> %t1, <8 x i8> %t2, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
622   store <12 x i8> %s, <12 x i8> *%dst
623   ret void
626 define void @vst3_v8i8(<8 x i8> *%src, <24 x i8> *%dst) {
627 ; CHECK-LABEL: vst3_v8i8:
628 ; CHECK:       @ %bb.0: @ %entry
629 ; CHECK-NEXT:    .vsave {d8, d9}
630 ; CHECK-NEXT:    vpush {d8, d9}
631 ; CHECK-NEXT:    vldrb.u16 q2, [r0, #8]
632 ; CHECK-NEXT:    vldrb.u16 q1, [r0, #16]
633 ; CHECK-NEXT:    vldrb.u16 q3, [r0]
634 ; CHECK-NEXT:    vins.f16 s1, s11
635 ; CHECK-NEXT:    vmovx.f16 s2, s6
636 ; CHECK-NEXT:    vmovx.f16 s0, s10
637 ; CHECK-NEXT:    vmovx.f16 s3, s11
638 ; CHECK-NEXT:    vins.f16 s0, s2
639 ; CHECK-NEXT:    vmovx.f16 s2, s7
640 ; CHECK-NEXT:    vmovx.f16 s1, s1
641 ; CHECK-NEXT:    vmov.f32 s17, s15
642 ; CHECK-NEXT:    vins.f16 s3, s2
643 ; CHECK-NEXT:    vins.f16 s17, s1
644 ; CHECK-NEXT:    vmov.f32 s2, s7
645 ; CHECK-NEXT:    vmovx.f16 s1, s15
646 ; CHECK-NEXT:    vmov.u16 r0, q3[0]
647 ; CHECK-NEXT:    vins.f16 s2, s1
648 ; CHECK-NEXT:    vmov.f32 s1, s17
649 ; CHECK-NEXT:    vmov.8 q4[0], r0
650 ; CHECK-NEXT:    vmov.u16 r0, q2[0]
651 ; CHECK-NEXT:    vstrb.16 q0, [r1, #16]
652 ; CHECK-NEXT:    vmov.8 q4[1], r0
653 ; CHECK-NEXT:    vmov.u16 r0, q1[0]
654 ; CHECK-NEXT:    vmov.8 q4[2], r0
655 ; CHECK-NEXT:    vmov.u16 r0, q3[1]
656 ; CHECK-NEXT:    vmov.8 q4[3], r0
657 ; CHECK-NEXT:    vmov.u16 r0, q2[1]
658 ; CHECK-NEXT:    vmov.8 q4[4], r0
659 ; CHECK-NEXT:    vmov.u16 r0, q1[1]
660 ; CHECK-NEXT:    vmov.8 q4[5], r0
661 ; CHECK-NEXT:    vmov.u16 r0, q3[2]
662 ; CHECK-NEXT:    vmov.8 q4[6], r0
663 ; CHECK-NEXT:    vmov.u16 r0, q2[2]
664 ; CHECK-NEXT:    vmov.8 q4[7], r0
665 ; CHECK-NEXT:    vmov.u16 r0, q1[2]
666 ; CHECK-NEXT:    vmov.8 q4[8], r0
667 ; CHECK-NEXT:    vmov.u16 r0, q3[3]
668 ; CHECK-NEXT:    vmov.8 q4[9], r0
669 ; CHECK-NEXT:    vmov.u16 r0, q2[3]
670 ; CHECK-NEXT:    vmov.8 q4[10], r0
671 ; CHECK-NEXT:    vmov.u16 r0, q1[3]
672 ; CHECK-NEXT:    vmov.8 q4[11], r0
673 ; CHECK-NEXT:    vmov.u16 r0, q3[4]
674 ; CHECK-NEXT:    vmov.8 q4[12], r0
675 ; CHECK-NEXT:    vmov.u16 r0, q2[4]
676 ; CHECK-NEXT:    vmov.8 q4[13], r0
677 ; CHECK-NEXT:    vmov.u16 r0, q1[4]
678 ; CHECK-NEXT:    vmov.8 q4[14], r0
679 ; CHECK-NEXT:    vmov.u16 r0, q3[5]
680 ; CHECK-NEXT:    vmov.8 q4[15], r0
681 ; CHECK-NEXT:    vstrw.32 q4, [r1]
682 ; CHECK-NEXT:    vpop {d8, d9}
683 ; CHECK-NEXT:    bx lr
684 entry:
685   %s1 = getelementptr <8 x i8>, <8 x i8>* %src, i32 0
686   %l1 = load <8 x i8>, <8 x i8>* %s1, align 4
687   %s2 = getelementptr <8 x i8>, <8 x i8>* %src, i32 1
688   %l2 = load <8 x i8>, <8 x i8>* %s2, align 4
689   %s3 = getelementptr <8 x i8>, <8 x i8>* %src, i32 2
690   %l3 = load <8 x i8>, <8 x i8>* %s3, align 4
691   %t1 = shufflevector <8 x i8> %l1, <8 x i8> %l2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
692   %t2 = shufflevector <8 x i8> %l3, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
693   %s = shufflevector <16 x i8> %t1, <16 x i8> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>
694   store <24 x i8> %s, <24 x i8> *%dst
695   ret void
698 define void @vst3_v16i8(<16 x i8> *%src, <48 x i8> *%dst) {
699 ; CHECK-LABEL: vst3_v16i8:
700 ; CHECK:       @ %bb.0: @ %entry
701 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13}
702 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13}
703 ; CHECK-NEXT:    vldrw.u32 q3, [r0]
704 ; CHECK-NEXT:    vldrw.u32 q2, [r0, #16]
705 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #32]
706 ; CHECK-NEXT:    vmov.u8 r3, q3[0]
707 ; CHECK-NEXT:    vmov.u8 r0, q2[0]
708 ; CHECK-NEXT:    vmov.8 q5[0], r3
709 ; CHECK-NEXT:    vmov.u8 r2, q1[0]
710 ; CHECK-NEXT:    vmov.8 q5[1], r0
711 ; CHECK-NEXT:    vmov.u8 r0, q3[1]
712 ; CHECK-NEXT:    vmov.8 q5[3], r0
713 ; CHECK-NEXT:    vmov.u8 r0, q2[1]
714 ; CHECK-NEXT:    vmov.8 q5[4], r0
715 ; CHECK-NEXT:    vmov.u8 r0, q3[2]
716 ; CHECK-NEXT:    vmov.8 q5[6], r0
717 ; CHECK-NEXT:    vmov.u8 r0, q2[2]
718 ; CHECK-NEXT:    vmov.8 q5[7], r0
719 ; CHECK-NEXT:    vmov.u8 r0, q3[3]
720 ; CHECK-NEXT:    vmov.8 q5[9], r0
721 ; CHECK-NEXT:    vmov.u8 r0, q2[3]
722 ; CHECK-NEXT:    vmov.8 q5[10], r0
723 ; CHECK-NEXT:    vmov.u8 r0, q3[4]
724 ; CHECK-NEXT:    vmov.8 q4[2], r2
725 ; CHECK-NEXT:    vmov.u8 r2, q1[2]
726 ; CHECK-NEXT:    vmov.8 q5[12], r0
727 ; CHECK-NEXT:    vmov.u8 r0, q2[4]
728 ; CHECK-NEXT:    vmov.8 q4[8], r2
729 ; CHECK-NEXT:    vmov.u8 r2, q1[3]
730 ; CHECK-NEXT:    vmov.8 q5[13], r0
731 ; CHECK-NEXT:    vmov.u8 r0, q3[5]
732 ; CHECK-NEXT:    vmov.8 q5[15], r0
733 ; CHECK-NEXT:    vmov.8 q4[11], r2
734 ; CHECK-NEXT:    vmov.u8 r2, q1[4]
735 ; CHECK-NEXT:    vmov.u8 r0, q5[0]
736 ; CHECK-NEXT:    vmov.8 q4[14], r2
737 ; CHECK-NEXT:    vmov.8 q0[0], r0
738 ; CHECK-NEXT:    vmov.f32 s17, s4
739 ; CHECK-NEXT:    vmov.u8 r0, q5[1]
740 ; CHECK-NEXT:    vmov.8 q0[1], r0
741 ; CHECK-NEXT:    vmov.u8 r2, q4[2]
742 ; CHECK-NEXT:    vmov.8 q0[2], r2
743 ; CHECK-NEXT:    vmov.u8 r0, q5[3]
744 ; CHECK-NEXT:    vmov.8 q0[3], r0
745 ; CHECK-NEXT:    vmov.u8 r0, q5[4]
746 ; CHECK-NEXT:    vmov.8 q0[4], r0
747 ; CHECK-NEXT:    vmov.u8 r0, q4[5]
748 ; CHECK-NEXT:    vmov.8 q0[5], r0
749 ; CHECK-NEXT:    vmov.u8 r0, q5[6]
750 ; CHECK-NEXT:    vmov.8 q0[6], r0
751 ; CHECK-NEXT:    vmov.u8 r0, q5[7]
752 ; CHECK-NEXT:    vmov.8 q0[7], r0
753 ; CHECK-NEXT:    vmov.u8 r0, q4[8]
754 ; CHECK-NEXT:    vmov.8 q0[8], r0
755 ; CHECK-NEXT:    vmov.u8 r0, q5[9]
756 ; CHECK-NEXT:    vmov.8 q0[9], r0
757 ; CHECK-NEXT:    vmov.u8 r0, q5[10]
758 ; CHECK-NEXT:    vmov.8 q0[10], r0
759 ; CHECK-NEXT:    vmov.u8 r0, q4[11]
760 ; CHECK-NEXT:    vmov.8 q0[11], r0
761 ; CHECK-NEXT:    vmov.u8 r0, q5[12]
762 ; CHECK-NEXT:    vmov.8 q0[12], r0
763 ; CHECK-NEXT:    vmov.u8 r0, q5[13]
764 ; CHECK-NEXT:    vmov.8 q0[13], r0
765 ; CHECK-NEXT:    vmov.u8 r0, q4[14]
766 ; CHECK-NEXT:    vmov.8 q0[14], r0
767 ; CHECK-NEXT:    vmov.u8 r0, q5[15]
768 ; CHECK-NEXT:    vmov.8 q0[15], r0
769 ; CHECK-NEXT:    vmov.u8 r0, q2[5]
770 ; CHECK-NEXT:    vmov.8 q5[0], r0
771 ; CHECK-NEXT:    vmov.u8 r0, q1[5]
772 ; CHECK-NEXT:    vmov.8 q5[1], r0
773 ; CHECK-NEXT:    vmov.u8 r0, q2[6]
774 ; CHECK-NEXT:    vmov.8 q5[3], r0
775 ; CHECK-NEXT:    vmov.u8 r0, q1[6]
776 ; CHECK-NEXT:    vmov.8 q5[4], r0
777 ; CHECK-NEXT:    vmov.u8 r0, q2[7]
778 ; CHECK-NEXT:    vmov.8 q5[6], r0
779 ; CHECK-NEXT:    vmov.u8 r0, q1[7]
780 ; CHECK-NEXT:    vmov.8 q5[7], r0
781 ; CHECK-NEXT:    vmov.u8 r0, q2[8]
782 ; CHECK-NEXT:    vmov.8 q5[9], r0
783 ; CHECK-NEXT:    vmov.u8 r0, q1[8]
784 ; CHECK-NEXT:    vmov.8 q5[10], r0
785 ; CHECK-NEXT:    vmov.u8 r0, q2[9]
786 ; CHECK-NEXT:    vmov.8 q5[12], r0
787 ; CHECK-NEXT:    vmov.u8 r0, q1[9]
788 ; CHECK-NEXT:    vmov.8 q5[13], r0
789 ; CHECK-NEXT:    vmov.u8 r0, q2[10]
790 ; CHECK-NEXT:    vmov.8 q5[15], r0
791 ; CHECK-NEXT:    vstrw.32 q0, [r1]
792 ; CHECK-NEXT:    vmov.u8 r0, q5[0]
793 ; CHECK-NEXT:    vmov.8 q4[0], r0
794 ; CHECK-NEXT:    vmov.u8 r0, q5[1]
795 ; CHECK-NEXT:    vmov.8 q4[1], r0
796 ; CHECK-NEXT:    vmov.u8 r0, q3[7]
797 ; CHECK-NEXT:    vmov.8 q6[5], r0
798 ; CHECK-NEXT:    vmov.u8 r0, q3[8]
799 ; CHECK-NEXT:    vmov.8 q6[8], r0
800 ; CHECK-NEXT:    vmov.u8 r0, q3[9]
801 ; CHECK-NEXT:    vmov.8 q6[11], r0
802 ; CHECK-NEXT:    vmov.f32 s24, s13
803 ; CHECK-NEXT:    vmov.f32 s27, s14
804 ; CHECK-NEXT:    vmov.u8 r0, q6[2]
805 ; CHECK-NEXT:    vmov.8 q4[2], r0
806 ; CHECK-NEXT:    vmov.u8 r0, q5[3]
807 ; CHECK-NEXT:    vmov.8 q4[3], r0
808 ; CHECK-NEXT:    vmov.u8 r0, q5[4]
809 ; CHECK-NEXT:    vmov.8 q4[4], r0
810 ; CHECK-NEXT:    vmov.u8 r0, q6[5]
811 ; CHECK-NEXT:    vmov.8 q4[5], r0
812 ; CHECK-NEXT:    vmov.u8 r0, q5[6]
813 ; CHECK-NEXT:    vmov.8 q4[6], r0
814 ; CHECK-NEXT:    vmov.u8 r0, q5[7]
815 ; CHECK-NEXT:    vmov.8 q4[7], r0
816 ; CHECK-NEXT:    vmov.u8 r0, q6[8]
817 ; CHECK-NEXT:    vmov.8 q4[8], r0
818 ; CHECK-NEXT:    vmov.u8 r0, q5[9]
819 ; CHECK-NEXT:    vmov.8 q4[9], r0
820 ; CHECK-NEXT:    vmov.u8 r0, q5[10]
821 ; CHECK-NEXT:    vmov.8 q4[10], r0
822 ; CHECK-NEXT:    vmov.u8 r0, q6[11]
823 ; CHECK-NEXT:    vmov.8 q4[11], r0
824 ; CHECK-NEXT:    vmov.u8 r0, q5[12]
825 ; CHECK-NEXT:    vmov.8 q4[12], r0
826 ; CHECK-NEXT:    vmov.u8 r0, q5[13]
827 ; CHECK-NEXT:    vmov.8 q4[13], r0
828 ; CHECK-NEXT:    vmov.u8 r0, q6[14]
829 ; CHECK-NEXT:    vmov.8 q4[14], r0
830 ; CHECK-NEXT:    vmov.u8 r0, q5[15]
831 ; CHECK-NEXT:    vmov.8 q4[15], r0
832 ; CHECK-NEXT:    vmov.u8 r0, q1[10]
833 ; CHECK-NEXT:    vmov.8 q5[0], r0
834 ; CHECK-NEXT:    vmov.u8 r0, q3[11]
835 ; CHECK-NEXT:    vmov.8 q5[1], r0
836 ; CHECK-NEXT:    vmov.u8 r0, q1[11]
837 ; CHECK-NEXT:    vmov.8 q5[3], r0
838 ; CHECK-NEXT:    vmov.u8 r0, q3[12]
839 ; CHECK-NEXT:    vmov.8 q5[4], r0
840 ; CHECK-NEXT:    vmov.u8 r0, q1[12]
841 ; CHECK-NEXT:    vmov.8 q5[6], r0
842 ; CHECK-NEXT:    vmov.u8 r0, q3[13]
843 ; CHECK-NEXT:    vmov.8 q5[7], r0
844 ; CHECK-NEXT:    vmov.u8 r0, q1[13]
845 ; CHECK-NEXT:    vmov.8 q5[9], r0
846 ; CHECK-NEXT:    vmov.u8 r0, q3[14]
847 ; CHECK-NEXT:    vmov.8 q5[10], r0
848 ; CHECK-NEXT:    vmov.u8 r0, q1[14]
849 ; CHECK-NEXT:    vmov.8 q5[12], r0
850 ; CHECK-NEXT:    vmov.u8 r0, q3[15]
851 ; CHECK-NEXT:    vmov.8 q5[13], r0
852 ; CHECK-NEXT:    vmov.u8 r0, q1[15]
853 ; CHECK-NEXT:    vmov.8 q5[15], r0
854 ; CHECK-NEXT:    vstrw.32 q4, [r1, #16]
855 ; CHECK-NEXT:    vmov.u8 r0, q5[0]
856 ; CHECK-NEXT:    vmov.8 q1[0], r0
857 ; CHECK-NEXT:    vmov.u8 r0, q5[1]
858 ; CHECK-NEXT:    vmov.8 q1[1], r0
859 ; CHECK-NEXT:    vmov.u8 r0, q2[11]
860 ; CHECK-NEXT:    vmov.8 q3[2], r0
861 ; CHECK-NEXT:    vmov.u8 r0, q2[12]
862 ; CHECK-NEXT:    vmov.8 q3[5], r0
863 ; CHECK-NEXT:    vmov.u8 r0, q2[13]
864 ; CHECK-NEXT:    vmov.8 q3[8], r0
865 ; CHECK-NEXT:    vmov.u8 r0, q2[14]
866 ; CHECK-NEXT:    vmov.8 q3[11], r0
867 ; CHECK-NEXT:    vmov.u8 r0, q2[15]
868 ; CHECK-NEXT:    vmov.8 q3[14], r0
869 ; CHECK-NEXT:    vmov.u8 r0, q3[2]
870 ; CHECK-NEXT:    vmov.8 q1[2], r0
871 ; CHECK-NEXT:    vmov.u8 r0, q5[3]
872 ; CHECK-NEXT:    vmov.8 q1[3], r0
873 ; CHECK-NEXT:    vmov.u8 r0, q5[4]
874 ; CHECK-NEXT:    vmov.8 q1[4], r0
875 ; CHECK-NEXT:    vmov.u8 r0, q3[5]
876 ; CHECK-NEXT:    vmov.8 q1[5], r0
877 ; CHECK-NEXT:    vmov.u8 r0, q5[6]
878 ; CHECK-NEXT:    vmov.8 q1[6], r0
879 ; CHECK-NEXT:    vmov.u8 r0, q5[7]
880 ; CHECK-NEXT:    vmov.8 q1[7], r0
881 ; CHECK-NEXT:    vmov.u8 r0, q3[8]
882 ; CHECK-NEXT:    vmov.8 q1[8], r0
883 ; CHECK-NEXT:    vmov.u8 r0, q5[9]
884 ; CHECK-NEXT:    vmov.8 q1[9], r0
885 ; CHECK-NEXT:    vmov.u8 r0, q5[10]
886 ; CHECK-NEXT:    vmov.8 q1[10], r0
887 ; CHECK-NEXT:    vmov.u8 r0, q3[11]
888 ; CHECK-NEXT:    vmov.8 q1[11], r0
889 ; CHECK-NEXT:    vmov.u8 r0, q5[12]
890 ; CHECK-NEXT:    vmov.8 q1[12], r0
891 ; CHECK-NEXT:    vmov.u8 r0, q5[13]
892 ; CHECK-NEXT:    vmov.8 q1[13], r0
893 ; CHECK-NEXT:    vmov.u8 r0, q3[14]
894 ; CHECK-NEXT:    vmov.8 q1[14], r0
895 ; CHECK-NEXT:    vmov.u8 r0, q5[15]
896 ; CHECK-NEXT:    vmov.8 q1[15], r0
897 ; CHECK-NEXT:    vstrw.32 q1, [r1, #32]
898 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13}
899 ; CHECK-NEXT:    bx lr
900 entry:
901   %s1 = getelementptr <16 x i8>, <16 x i8>* %src, i32 0
902   %l1 = load <16 x i8>, <16 x i8>* %s1, align 4
903   %s2 = getelementptr <16 x i8>, <16 x i8>* %src, i32 1
904   %l2 = load <16 x i8>, <16 x i8>* %s2, align 4
905   %s3 = getelementptr <16 x i8>, <16 x i8>* %src, i32 2
906   %l3 = load <16 x i8>, <16 x i8>* %s3, align 4
907   %t1 = shufflevector <16 x i8> %l1, <16 x i8> %l2, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
908   %t2 = shufflevector <16 x i8> %l3, <16 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
909   %s = shufflevector <32 x i8> %t1, <32 x i8> %t2, <48 x i32> <i32 0, i32 16, i32 32, i32 1, i32 17, i32 33, i32 2, i32 18, i32 34, i32 3, i32 19, i32 35, i32 4, i32 20, i32 36, i32 5, i32 21, i32 37, i32 6, i32 22, i32 38, i32 7, i32 23, i32 39, i32 8, i32 24, i32 40, i32 9, i32 25, i32 41, i32 10, i32 26, i32 42, i32 11, i32 27, i32 43, i32 12, i32 28, i32 44, i32 13, i32 29, i32 45, i32 14, i32 30, i32 46, i32 15, i32 31, i32 47>
910   store <48 x i8> %s, <48 x i8> *%dst
911   ret void
914 ; i64
916 define void @vst3_v2i64(<2 x i64> *%src, <6 x i64> *%dst) {
917 ; CHECK-LABEL: vst3_v2i64:
918 ; CHECK:       @ %bb.0: @ %entry
919 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #32]
920 ; CHECK-NEXT:    vldrw.u32 q2, [r0, #16]
921 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
922 ; CHECK-NEXT:    vmov.f32 s14, s2
923 ; CHECK-NEXT:    vmov.f32 s15, s3
924 ; CHECK-NEXT:    vmov.f32 s2, s6
925 ; CHECK-NEXT:    vmov.f32 s3, s7
926 ; CHECK-NEXT:    vmov.f32 s6, s8
927 ; CHECK-NEXT:    vmov.f32 s7, s9
928 ; CHECK-NEXT:    vstrb.8 q1, [r1], #32
929 ; CHECK-NEXT:    vmov.f32 s12, s10
930 ; CHECK-NEXT:    vmov.f32 s13, s11
931 ; CHECK-NEXT:    vstrw.32 q0, [r1, #-16]
932 ; CHECK-NEXT:    vstrw.32 q3, [r1]
933 ; CHECK-NEXT:    bx lr
934 entry:
935   %s1 = getelementptr <2 x i64>, <2 x i64>* %src, i32 0
936   %l1 = load <2 x i64>, <2 x i64>* %s1, align 4
937   %s2 = getelementptr <2 x i64>, <2 x i64>* %src, i32 1
938   %l2 = load <2 x i64>, <2 x i64>* %s2, align 4
939   %s3 = getelementptr <2 x i64>, <2 x i64>* %src, i32 2
940   %l3 = load <2 x i64>, <2 x i64>* %s3, align 4
941   %t1 = shufflevector <2 x i64> %l1, <2 x i64> %l2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
942   %t2 = shufflevector <2 x i64> %l3, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
943   %s = shufflevector <4 x i64> %t1, <4 x i64> %t2, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>
944   store <6 x i64> %s, <6 x i64> *%dst
945   ret void
948 define void @vst3_v4i64(<4 x i64> *%src, <12 x i64> *%dst) {
949 ; CHECK-LABEL: vst3_v4i64:
950 ; CHECK:       @ %bb.0: @ %entry
951 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
952 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
953 ; CHECK-NEXT:    vldrw.u32 q3, [r0, #48]
954 ; CHECK-NEXT:    vldrw.u32 q7, [r0, #32]
955 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #80]
956 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
957 ; CHECK-NEXT:    vmov.f32 s16, s14
958 ; CHECK-NEXT:    vldrw.u32 q6, [r0, #16]
959 ; CHECK-NEXT:    vmov.f32 s17, s15
960 ; CHECK-NEXT:    vldrw.u32 q2, [r0, #64]
961 ; CHECK-NEXT:    vmov.f64 d7, d15
962 ; CHECK-NEXT:    vmov.f32 s18, s2
963 ; CHECK-NEXT:    vmov.f32 s19, s3
964 ; CHECK-NEXT:    vmov.f32 s20, s4
965 ; CHECK-NEXT:    vstrw.32 q4, [r1, #80]
966 ; CHECK-NEXT:    vmov.f32 s21, s5
967 ; CHECK-NEXT:    vmov.f32 s22, s28
968 ; CHECK-NEXT:    vmov.f32 s23, s29
969 ; CHECK-NEXT:    vmov.f32 s4, s8
970 ; CHECK-NEXT:    vstrw.32 q5, [r1]
971 ; CHECK-NEXT:    vmov.f32 s5, s9
972 ; CHECK-NEXT:    vmov.f32 s28, s24
973 ; CHECK-NEXT:    vstrw.32 q1, [r1, #16]
974 ; CHECK-NEXT:    vmov.f32 s29, s25
975 ; CHECK-NEXT:    vmov.f32 s30, s12
976 ; CHECK-NEXT:    vmov.f32 s31, s13
977 ; CHECK-NEXT:    vmov.f32 s2, s26
978 ; CHECK-NEXT:    vstrw.32 q7, [r1, #48]
979 ; CHECK-NEXT:    vmov.f32 s3, s27
980 ; CHECK-NEXT:    vmov.f32 s8, s14
981 ; CHECK-NEXT:    vstrw.32 q0, [r1, #64]
982 ; CHECK-NEXT:    vmov.f32 s9, s15
983 ; CHECK-NEXT:    vstrw.32 q2, [r1, #32]
984 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
985 ; CHECK-NEXT:    bx lr
986 entry:
987   %s1 = getelementptr <4 x i64>, <4 x i64>* %src, i32 0
988   %l1 = load <4 x i64>, <4 x i64>* %s1, align 4
989   %s2 = getelementptr <4 x i64>, <4 x i64>* %src, i32 1
990   %l2 = load <4 x i64>, <4 x i64>* %s2, align 4
991   %s3 = getelementptr <4 x i64>, <4 x i64>* %src, i32 2
992   %l3 = load <4 x i64>, <4 x i64>* %s3, align 4
993   %t1 = shufflevector <4 x i64> %l1, <4 x i64> %l2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
994   %t2 = shufflevector <4 x i64> %l3, <4 x i64> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
995   %s = shufflevector <8 x i64> %t1, <8 x i64> %t2, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
996   store <12 x i64> %s, <12 x i64> *%dst
997   ret void
1000 ; f32
1002 define void @vst3_v2f32(<2 x float> *%src, <6 x float> *%dst) {
1003 ; CHECK-LABEL: vst3_v2f32:
1004 ; CHECK:       @ %bb.0: @ %entry
1005 ; CHECK-NEXT:    ldr r2, [r0, #20]
1006 ; CHECK-NEXT:    vldr s0, [r0]
1007 ; CHECK-NEXT:    vldr s3, [r0, #4]
1008 ; CHECK-NEXT:    vldr s1, [r0, #8]
1009 ; CHECK-NEXT:    vldr s2, [r0, #16]
1010 ; CHECK-NEXT:    ldr r0, [r0, #12]
1011 ; CHECK-NEXT:    strd r0, r2, [r1, #16]
1012 ; CHECK-NEXT:    vstrw.32 q0, [r1]
1013 ; CHECK-NEXT:    bx lr
1014 entry:
1015   %s1 = getelementptr <2 x float>, <2 x float>* %src, i32 0
1016   %l1 = load <2 x float>, <2 x float>* %s1, align 4
1017   %s2 = getelementptr <2 x float>, <2 x float>* %src, i32 1
1018   %l2 = load <2 x float>, <2 x float>* %s2, align 4
1019   %s3 = getelementptr <2 x float>, <2 x float>* %src, i32 2
1020   %l3 = load <2 x float>, <2 x float>* %s3, align 4
1021   %t1 = shufflevector <2 x float> %l1, <2 x float> %l2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1022   %t2 = shufflevector <2 x float> %l3, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1023   %s = shufflevector <4 x float> %t1, <4 x float> %t2, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>
1024   store <6 x float> %s, <6 x float> *%dst
1025   ret void
1028 define void @vst3_v4f32(<4 x float> *%src, <12 x float> *%dst) {
1029 ; CHECK-LABEL: vst3_v4f32:
1030 ; CHECK:       @ %bb.0: @ %entry
1031 ; CHECK-NEXT:    .vsave {d8, d9}
1032 ; CHECK-NEXT:    vpush {d8, d9}
1033 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #16]
1034 ; CHECK-NEXT:    vldrw.u32 q3, [r0]
1035 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #32]
1036 ; CHECK-NEXT:    vmov.f32 s8, s1
1037 ; CHECK-NEXT:    vmov.f32 s9, s5
1038 ; CHECK-NEXT:    vmov.f32 s18, s4
1039 ; CHECK-NEXT:    vmov.f32 s4, s6
1040 ; CHECK-NEXT:    vmov.f32 s11, s2
1041 ; CHECK-NEXT:    vmov.f32 s10, s14
1042 ; CHECK-NEXT:    vmov.f32 s16, s12
1043 ; CHECK-NEXT:    vstrw.32 q2, [r1, #16]
1044 ; CHECK-NEXT:    vmov.f32 s17, s0
1045 ; CHECK-NEXT:    vmov.f32 s19, s13
1046 ; CHECK-NEXT:    vmov.f32 s5, s15
1047 ; CHECK-NEXT:    vstrw.32 q4, [r1]
1048 ; CHECK-NEXT:    vmov.f32 s6, s3
1049 ; CHECK-NEXT:    vstrw.32 q1, [r1, #32]
1050 ; CHECK-NEXT:    vpop {d8, d9}
1051 ; CHECK-NEXT:    bx lr
1052 entry:
1053   %s1 = getelementptr <4 x float>, <4 x float>* %src, i32 0
1054   %l1 = load <4 x float>, <4 x float>* %s1, align 4
1055   %s2 = getelementptr <4 x float>, <4 x float>* %src, i32 1
1056   %l2 = load <4 x float>, <4 x float>* %s2, align 4
1057   %s3 = getelementptr <4 x float>, <4 x float>* %src, i32 2
1058   %l3 = load <4 x float>, <4 x float>* %s3, align 4
1059   %t1 = shufflevector <4 x float> %l1, <4 x float> %l2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1060   %t2 = shufflevector <4 x float> %l3, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
1061   %s = shufflevector <8 x float> %t1, <8 x float> %t2, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
1062   store <12 x float> %s, <12 x float> *%dst
1063   ret void
1066 define void @vst3_v8f32(<8 x float> *%src, <24 x float> *%dst) {
1067 ; CHECK-LABEL: vst3_v8f32:
1068 ; CHECK:       @ %bb.0: @ %entry
1069 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
1070 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
1071 ; CHECK-NEXT:    .pad #16
1072 ; CHECK-NEXT:    sub sp, #16
1073 ; CHECK-NEXT:    vldrw.u32 q6, [r0]
1074 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #80]
1075 ; CHECK-NEXT:    vldrw.u32 q4, [r0, #16]
1076 ; CHECK-NEXT:    vldrw.u32 q2, [r0, #48]
1077 ; CHECK-NEXT:    vstrw.32 q6, [sp] @ 16-byte Spill
1078 ; CHECK-NEXT:    vldrw.u32 q7, [r0, #32]
1079 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #64]
1080 ; CHECK-NEXT:    vmov.f32 s12, s2
1081 ; CHECK-NEXT:    vmov.f32 s20, s24
1082 ; CHECK-NEXT:    vmov.f32 s13, s19
1083 ; CHECK-NEXT:    vmov.f32 s24, s16
1084 ; CHECK-NEXT:    vmov.f32 s27, s17
1085 ; CHECK-NEXT:    vmov.f32 s2, s18
1086 ; CHECK-NEXT:    vldrw.u32 q4, [sp] @ 16-byte Reload
1087 ; CHECK-NEXT:    vmov.f32 s15, s3
1088 ; CHECK-NEXT:    vmov.f32 s14, s11
1089 ; CHECK-NEXT:    vmov.f32 s23, s25
1090 ; CHECK-NEXT:    vstrw.32 q3, [r1, #80]
1091 ; CHECK-NEXT:    vmov.f32 s22, s4
1092 ; CHECK-NEXT:    vmov.f32 s21, s28
1093 ; CHECK-NEXT:    vmov.f32 s25, s8
1094 ; CHECK-NEXT:    vstrw.32 q5, [r1]
1095 ; CHECK-NEXT:    vmov.f32 s26, s0
1096 ; CHECK-NEXT:    vmov.f32 s0, s9
1097 ; CHECK-NEXT:    vstrw.32 q6, [r1, #48]
1098 ; CHECK-NEXT:    vmov.f32 s3, s10
1099 ; CHECK-NEXT:    vmov.f32 s9, s5
1100 ; CHECK-NEXT:    vstrw.32 q0, [r1, #64]
1101 ; CHECK-NEXT:    vmov.f32 s4, s6
1102 ; CHECK-NEXT:    vmov.f32 s8, s29
1103 ; CHECK-NEXT:    vmov.f32 s11, s30
1104 ; CHECK-NEXT:    vmov.f32 s10, s18
1105 ; CHECK-NEXT:    vmov.f32 s5, s19
1106 ; CHECK-NEXT:    vstrw.32 q2, [r1, #16]
1107 ; CHECK-NEXT:    vmov.f32 s6, s31
1108 ; CHECK-NEXT:    vstrw.32 q1, [r1, #32]
1109 ; CHECK-NEXT:    add sp, #16
1110 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
1111 ; CHECK-NEXT:    bx lr
1112 entry:
1113   %s1 = getelementptr <8 x float>, <8 x float>* %src, i32 0
1114   %l1 = load <8 x float>, <8 x float>* %s1, align 4
1115   %s2 = getelementptr <8 x float>, <8 x float>* %src, i32 1
1116   %l2 = load <8 x float>, <8 x float>* %s2, align 4
1117   %s3 = getelementptr <8 x float>, <8 x float>* %src, i32 2
1118   %l3 = load <8 x float>, <8 x float>* %s3, align 4
1119   %t1 = shufflevector <8 x float> %l1, <8 x float> %l2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1120   %t2 = shufflevector <8 x float> %l3, <8 x float> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1121   %s = shufflevector <16 x float> %t1, <16 x float> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>
1122   store <24 x float> %s, <24 x float> *%dst
1123   ret void
1126 define void @vst3_v16f32(<16 x float> *%src, <48 x float> *%dst) {
1127 ; CHECK-LABEL: vst3_v16f32:
1128 ; CHECK:       @ %bb.0: @ %entry
1129 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
1130 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
1131 ; CHECK-NEXT:    .pad #144
1132 ; CHECK-NEXT:    sub sp, #144
1133 ; CHECK-NEXT:    vldrw.u32 q5, [r0, #112]
1134 ; CHECK-NEXT:    vldrw.u32 q7, [r0, #32]
1135 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #64]
1136 ; CHECK-NEXT:    vldrw.u32 q2, [r0, #128]
1137 ; CHECK-NEXT:    vstrw.32 q5, [sp, #48] @ 16-byte Spill
1138 ; CHECK-NEXT:    vldrw.u32 q5, [r0, #96]
1139 ; CHECK-NEXT:    vldrw.u32 q6, [r0]
1140 ; CHECK-NEXT:    vstrw.32 q7, [sp, #16] @ 16-byte Spill
1141 ; CHECK-NEXT:    vstrw.32 q5, [sp] @ 16-byte Spill
1142 ; CHECK-NEXT:    vldrw.u32 q5, [r0, #80]
1143 ; CHECK-NEXT:    vldrw.u32 q7, [r0, #16]
1144 ; CHECK-NEXT:    vldrw.u32 q4, [r0, #160]
1145 ; CHECK-NEXT:    vstrw.32 q5, [sp, #80] @ 16-byte Spill
1146 ; CHECK-NEXT:    vmov.f32 s12, s1
1147 ; CHECK-NEXT:    vstrw.32 q7, [sp, #64] @ 16-byte Spill
1148 ; CHECK-NEXT:    vmov.f32 s13, s9
1149 ; CHECK-NEXT:    vmov.f32 s15, s2
1150 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #176]
1151 ; CHECK-NEXT:    vmov.f32 s14, s26
1152 ; CHECK-NEXT:    vldrw.u32 q5, [r0, #48]
1153 ; CHECK-NEXT:    vldrw.u32 q7, [sp, #48] @ 16-byte Reload
1154 ; CHECK-NEXT:    vstrw.32 q4, [sp, #128] @ 16-byte Spill
1155 ; CHECK-NEXT:    vldrw.u32 q4, [r0, #144]
1156 ; CHECK-NEXT:    vstrw.32 q3, [r1, #16]
1157 ; CHECK-NEXT:    vmov.f32 s14, s3
1158 ; CHECK-NEXT:    vmov.f32 s12, s10
1159 ; CHECK-NEXT:    vmov.f32 s13, s27
1160 ; CHECK-NEXT:    vmov.f32 s15, s11
1161 ; CHECK-NEXT:    vstrw.32 q3, [r1, #32]
1162 ; CHECK-NEXT:    vmov.f32 s13, s23
1163 ; CHECK-NEXT:    vmov.f32 s12, s6
1164 ; CHECK-NEXT:    vmov.f32 s15, s7
1165 ; CHECK-NEXT:    vmov.f32 s14, s31
1166 ; CHECK-NEXT:    vstrw.32 q3, [sp, #112] @ 16-byte Spill
1167 ; CHECK-NEXT:    vmov.f32 s13, s0
1168 ; CHECK-NEXT:    vmov.f32 s14, s8
1169 ; CHECK-NEXT:    vmov.f64 d4, d14
1170 ; CHECK-NEXT:    vmov.f32 s0, s20
1171 ; CHECK-NEXT:    vmov.f32 s3, s21
1172 ; CHECK-NEXT:    vmov.f64 d10, d2
1173 ; CHECK-NEXT:    vldrw.u32 q1, [sp, #16] @ 16-byte Reload
1174 ; CHECK-NEXT:    vmov.f32 s2, s20
1175 ; CHECK-NEXT:    vmov.f32 s1, s8
1176 ; CHECK-NEXT:    vmov.f64 d14, d2
1177 ; CHECK-NEXT:    vstrw.32 q0, [sp, #48] @ 16-byte Spill
1178 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #128] @ 16-byte Reload
1179 ; CHECK-NEXT:    vmov.f32 s20, s9
1180 ; CHECK-NEXT:    vldrw.u32 q2, [sp] @ 16-byte Reload
1181 ; CHECK-NEXT:    vmov.f32 s23, s30
1182 ; CHECK-NEXT:    vmov.f32 s12, s24
1183 ; CHECK-NEXT:    vstrw.32 q5, [sp, #32] @ 16-byte Spill
1184 ; CHECK-NEXT:    vmov.f32 s15, s25
1185 ; CHECK-NEXT:    vstrw.32 q3, [sp, #96] @ 16-byte Spill
1186 ; CHECK-NEXT:    vmov.f32 s21, s1
1187 ; CHECK-NEXT:    vmov.f32 s12, s2
1188 ; CHECK-NEXT:    vmov.f32 s15, s3
1189 ; CHECK-NEXT:    vmov q0, q4
1190 ; CHECK-NEXT:    vstrw.32 q0, [sp, #16] @ 16-byte Spill
1191 ; CHECK-NEXT:    vmov.f64 d0, d14
1192 ; CHECK-NEXT:    vldrw.u32 q4, [sp, #64] @ 16-byte Reload
1193 ; CHECK-NEXT:    vmov.f32 s31, s1
1194 ; CHECK-NEXT:    vmov.f64 d0, d8
1195 ; CHECK-NEXT:    vmov.f32 s20, s9
1196 ; CHECK-NEXT:    vmov.f32 s23, s10
1197 ; CHECK-NEXT:    vmov.f32 s14, s11
1198 ; CHECK-NEXT:    vmov.f32 s29, s8
1199 ; CHECK-NEXT:    vldrw.u32 q2, [sp, #128] @ 16-byte Reload
1200 ; CHECK-NEXT:    vmov.f32 s24, s2
1201 ; CHECK-NEXT:    vmov.f32 s30, s8
1202 ; CHECK-NEXT:    vmov.f32 s27, s3
1203 ; CHECK-NEXT:    vstrw.32 q7, [r1, #96]
1204 ; CHECK-NEXT:    vmov.f32 s8, s0
1205 ; CHECK-NEXT:    vmov.f32 s11, s1
1206 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #16] @ 16-byte Reload
1207 ; CHECK-NEXT:    vmov.f32 s22, s6
1208 ; CHECK-NEXT:    vmov.f64 d8, d0
1209 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #48] @ 16-byte Reload
1210 ; CHECK-NEXT:    vstrw.32 q5, [r1, #112]
1211 ; CHECK-NEXT:    vstrw.32 q0, [r1, #144]
1212 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #32] @ 16-byte Reload
1213 ; CHECK-NEXT:    vstrw.32 q0, [r1, #160]
1214 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #112] @ 16-byte Reload
1215 ; CHECK-NEXT:    vmov.f32 s13, s7
1216 ; CHECK-NEXT:    vldrw.u32 q1, [sp, #80] @ 16-byte Reload
1217 ; CHECK-NEXT:    vstrw.32 q0, [r1, #176]
1218 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #96] @ 16-byte Reload
1219 ; CHECK-NEXT:    vmov.f32 s25, s19
1220 ; CHECK-NEXT:    vstrw.32 q3, [r1, #128]
1221 ; CHECK-NEXT:    vmov.f32 s26, s7
1222 ; CHECK-NEXT:    vstrw.32 q0, [r1]
1223 ; CHECK-NEXT:    vmov.f32 s10, s16
1224 ; CHECK-NEXT:    vstrw.32 q6, [r1, #80]
1225 ; CHECK-NEXT:    vmov.f32 s9, s4
1226 ; CHECK-NEXT:    vmov.f32 s16, s5
1227 ; CHECK-NEXT:    vstrw.32 q2, [r1, #48]
1228 ; CHECK-NEXT:    vmov.f32 s19, s6
1229 ; CHECK-NEXT:    vstrw.32 q4, [r1, #64]
1230 ; CHECK-NEXT:    add sp, #144
1231 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
1232 ; CHECK-NEXT:    bx lr
1233 entry:
1234   %s1 = getelementptr <16 x float>, <16 x float>* %src, i32 0
1235   %l1 = load <16 x float>, <16 x float>* %s1, align 4
1236   %s2 = getelementptr <16 x float>, <16 x float>* %src, i32 1
1237   %l2 = load <16 x float>, <16 x float>* %s2, align 4
1238   %s3 = getelementptr <16 x float>, <16 x float>* %src, i32 2
1239   %l3 = load <16 x float>, <16 x float>* %s3, align 4
1240   %t1 = shufflevector <16 x float> %l1, <16 x float> %l2, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
1241   %t2 = shufflevector <16 x float> %l3, <16 x float> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1242   %s = shufflevector <32 x float> %t1, <32 x float> %t2, <48 x i32> <i32 0, i32 16, i32 32, i32 1, i32 17, i32 33, i32 2, i32 18, i32 34, i32 3, i32 19, i32 35, i32 4, i32 20, i32 36, i32 5, i32 21, i32 37, i32 6, i32 22, i32 38, i32 7, i32 23, i32 39, i32 8, i32 24, i32 40, i32 9, i32 25, i32 41, i32 10, i32 26, i32 42, i32 11, i32 27, i32 43, i32 12, i32 28, i32 44, i32 13, i32 29, i32 45, i32 14, i32 30, i32 46, i32 15, i32 31, i32 47>
1243   store <48 x float> %s, <48 x float> *%dst
1244   ret void
1247 ; f16
1249 define void @vst3_v2f16(<2 x half> *%src, <6 x half> *%dst) {
1250 ; CHECK-LABEL: vst3_v2f16:
1251 ; CHECK:       @ %bb.0: @ %entry
1252 ; CHECK-NEXT:    vldmia r0, {s0, s1}
1253 ; CHECK-NEXT:    ldr r0, [r0, #8]
1254 ; CHECK-NEXT:    vmovx.f16 s2, s0
1255 ; CHECK-NEXT:    vins.f16 s0, s1
1256 ; CHECK-NEXT:    vmov.32 q1[0], r0
1257 ; CHECK-NEXT:    vmovx.f16 s6, s4
1258 ; CHECK-NEXT:    vins.f16 s4, s2
1259 ; CHECK-NEXT:    vmovx.f16 s2, s1
1260 ; CHECK-NEXT:    vmov.f32 s1, s4
1261 ; CHECK-NEXT:    vins.f16 s2, s6
1262 ; CHECK-NEXT:    vmov r3, s2
1263 ; CHECK-NEXT:    vmov r0, r2, d0
1264 ; CHECK-NEXT:    stm r1!, {r0, r2, r3}
1265 ; CHECK-NEXT:    bx lr
1266 entry:
1267   %s1 = getelementptr <2 x half>, <2 x half>* %src, i32 0
1268   %l1 = load <2 x half>, <2 x half>* %s1, align 4
1269   %s2 = getelementptr <2 x half>, <2 x half>* %src, i32 1
1270   %l2 = load <2 x half>, <2 x half>* %s2, align 4
1271   %s3 = getelementptr <2 x half>, <2 x half>* %src, i32 2
1272   %l3 = load <2 x half>, <2 x half>* %s3, align 4
1273   %t1 = shufflevector <2 x half> %l1, <2 x half> %l2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1274   %t2 = shufflevector <2 x half> %l3, <2 x half> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1275   %s = shufflevector <4 x half> %t1, <4 x half> %t2, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>
1276   store <6 x half> %s, <6 x half> *%dst
1277   ret void
1280 define void @vst3_v4f16(<4 x half> *%src, <12 x half> *%dst) {
1281 ; CHECK-LABEL: vst3_v4f16:
1282 ; CHECK:       @ %bb.0: @ %entry
1283 ; CHECK-NEXT:    .save {r7, lr}
1284 ; CHECK-NEXT:    push {r7, lr}
1285 ; CHECK-NEXT:    ldrd r2, r12, [r0]
1286 ; CHECK-NEXT:    ldrd r3, lr, [r0, #8]
1287 ; CHECK-NEXT:    vmov.32 q0[0], r2
1288 ; CHECK-NEXT:    ldrd r2, r0, [r0, #16]
1289 ; CHECK-NEXT:    vmov.32 q1[0], r3
1290 ; CHECK-NEXT:    vmov.32 q0[1], r12
1291 ; CHECK-NEXT:    vmov.32 q1[1], lr
1292 ; CHECK-NEXT:    vmov.f32 s8, s1
1293 ; CHECK-NEXT:    vmov.f32 s3, s5
1294 ; CHECK-NEXT:    vins.f16 s8, s5
1295 ; CHECK-NEXT:    vmov.f32 s2, s4
1296 ; CHECK-NEXT:    vmov.32 q1[0], r2
1297 ; CHECK-NEXT:    vmov.32 q1[1], r0
1298 ; CHECK-NEXT:    vmovx.f16 s13, s3
1299 ; CHECK-NEXT:    vmovx.f16 s6, s0
1300 ; CHECK-NEXT:    vins.f16 s0, s2
1301 ; CHECK-NEXT:    vmovx.f16 s10, s4
1302 ; CHECK-NEXT:    vmovx.f16 s2, s2
1303 ; CHECK-NEXT:    vins.f16 s4, s6
1304 ; CHECK-NEXT:    vmovx.f16 s6, s1
1305 ; CHECK-NEXT:    vins.f16 s2, s10
1306 ; CHECK-NEXT:    vmovx.f16 s10, s5
1307 ; CHECK-NEXT:    vins.f16 s5, s6
1308 ; CHECK-NEXT:    vins.f16 s13, s10
1309 ; CHECK-NEXT:    vmov.f32 s12, s5
1310 ; CHECK-NEXT:    vmov.f32 s1, s4
1311 ; CHECK-NEXT:    vmov.f32 s3, s8
1312 ; CHECK-NEXT:    vstrw.32 q0, [r1]
1313 ; CHECK-NEXT:    vmov r0, r2, d6
1314 ; CHECK-NEXT:    strd r0, r2, [r1, #16]
1315 ; CHECK-NEXT:    pop {r7, pc}
1316 entry:
1317   %s1 = getelementptr <4 x half>, <4 x half>* %src, i32 0
1318   %l1 = load <4 x half>, <4 x half>* %s1, align 4
1319   %s2 = getelementptr <4 x half>, <4 x half>* %src, i32 1
1320   %l2 = load <4 x half>, <4 x half>* %s2, align 4
1321   %s3 = getelementptr <4 x half>, <4 x half>* %src, i32 2
1322   %l3 = load <4 x half>, <4 x half>* %s3, align 4
1323   %t1 = shufflevector <4 x half> %l1, <4 x half> %l2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1324   %t2 = shufflevector <4 x half> %l3, <4 x half> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
1325   %s = shufflevector <8 x half> %t1, <8 x half> %t2, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
1326   store <12 x half> %s, <12 x half> *%dst
1327   ret void
1330 define void @vst3_v8f16(<8 x half> *%src, <24 x half> *%dst) {
1331 ; CHECK-LABEL: vst3_v8f16:
1332 ; CHECK:       @ %bb.0: @ %entry
1333 ; CHECK-NEXT:    .vsave {d8, d9}
1334 ; CHECK-NEXT:    vpush {d8, d9}
1335 ; CHECK-NEXT:    vldrw.u32 q3, [r0, #16]
1336 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
1337 ; CHECK-NEXT:    vldrw.u32 q4, [r0, #32]
1338 ; CHECK-NEXT:    vmov.f32 s0, s4
1339 ; CHECK-NEXT:    vmovx.f16 s2, s12
1340 ; CHECK-NEXT:    vins.f16 s0, s12
1341 ; CHECK-NEXT:    vmov r2, s2
1342 ; CHECK-NEXT:    vmov.16 q0[4], r2
1343 ; CHECK-NEXT:    vmovx.f16 s4, s4
1344 ; CHECK-NEXT:    vmov.f32 s1, s16
1345 ; CHECK-NEXT:    vmovx.f16 s11, s15
1346 ; CHECK-NEXT:    vmov.f32 s8, s5
1347 ; CHECK-NEXT:    vins.f16 s1, s4
1348 ; CHECK-NEXT:    vmovx.f16 s4, s16
1349 ; CHECK-NEXT:    vins.f16 s8, s13
1350 ; CHECK-NEXT:    vins.f16 s2, s4
1351 ; CHECK-NEXT:    vmovx.f16 s4, s19
1352 ; CHECK-NEXT:    vmov.f32 s3, s8
1353 ; CHECK-NEXT:    vins.f16 s11, s4
1354 ; CHECK-NEXT:    vmovx.f16 s4, s18
1355 ; CHECK-NEXT:    vmovx.f16 s8, s14
1356 ; CHECK-NEXT:    vins.f16 s9, s15
1357 ; CHECK-NEXT:    vins.f16 s8, s4
1358 ; CHECK-NEXT:    vmovx.f16 s4, s9
1359 ; CHECK-NEXT:    vmov.f32 s9, s7
1360 ; CHECK-NEXT:    vins.f16 s9, s4
1361 ; CHECK-NEXT:    vrev32.16 q3, q3
1362 ; CHECK-NEXT:    vmov.f32 s10, s19
1363 ; CHECK-NEXT:    vmovx.f16 s4, s7
1364 ; CHECK-NEXT:    vins.f16 s10, s4
1365 ; CHECK-NEXT:    vmovx.f16 s4, s5
1366 ; CHECK-NEXT:    vmov.f32 s12, s17
1367 ; CHECK-NEXT:    vstrw.32 q2, [r1, #32]
1368 ; CHECK-NEXT:    vins.f16 s12, s4
1369 ; CHECK-NEXT:    vmovx.f16 s4, s6
1370 ; CHECK-NEXT:    vins.f16 s18, s4
1371 ; CHECK-NEXT:    vmovx.f16 s4, s17
1372 ; CHECK-NEXT:    vins.f16 s13, s4
1373 ; CHECK-NEXT:    vmovx.f16 s4, s14
1374 ; CHECK-NEXT:    vins.f16 s6, s4
1375 ; CHECK-NEXT:    vmov.f32 s15, s18
1376 ; CHECK-NEXT:    vmov.f32 s14, s6
1377 ; CHECK-NEXT:    vstrw.32 q0, [r1]
1378 ; CHECK-NEXT:    vstrw.32 q3, [r1, #16]
1379 ; CHECK-NEXT:    vpop {d8, d9}
1380 ; CHECK-NEXT:    bx lr
1381 entry:
1382   %s1 = getelementptr <8 x half>, <8 x half>* %src, i32 0
1383   %l1 = load <8 x half>, <8 x half>* %s1, align 4
1384   %s2 = getelementptr <8 x half>, <8 x half>* %src, i32 1
1385   %l2 = load <8 x half>, <8 x half>* %s2, align 4
1386   %s3 = getelementptr <8 x half>, <8 x half>* %src, i32 2
1387   %l3 = load <8 x half>, <8 x half>* %s3, align 4
1388   %t1 = shufflevector <8 x half> %l1, <8 x half> %l2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1389   %t2 = shufflevector <8 x half> %l3, <8 x half> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1390   %s = shufflevector <16 x half> %t1, <16 x half> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>
1391   store <24 x half> %s, <24 x half> *%dst
1392   ret void
1395 define void @vst3_v16f16(<16 x half> *%src, <48 x half> *%dst) {
1396 ; CHECK-LABEL: vst3_v16f16:
1397 ; CHECK:       @ %bb.0: @ %entry
1398 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
1399 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
1400 ; CHECK-NEXT:    .pad #96
1401 ; CHECK-NEXT:    sub sp, #96
1402 ; CHECK-NEXT:    vldrw.u32 q2, [r0, #32]
1403 ; CHECK-NEXT:    vldrw.u32 q3, [r0, #64]
1404 ; CHECK-NEXT:    vldrw.u32 q4, [r0, #16]
1405 ; CHECK-NEXT:    vldrw.u32 q5, [r0, #48]
1406 ; CHECK-NEXT:    vmovx.f16 s0, s15
1407 ; CHECK-NEXT:    vmovx.f16 s7, s11
1408 ; CHECK-NEXT:    vins.f16 s7, s0
1409 ; CHECK-NEXT:    vmov q6, q2
1410 ; CHECK-NEXT:    vmovx.f16 s0, s14
1411 ; CHECK-NEXT:    vmovx.f16 s4, s10
1412 ; CHECK-NEXT:    vins.f16 s1, s11
1413 ; CHECK-NEXT:    vldrw.u32 q2, [r0]
1414 ; CHECK-NEXT:    vins.f16 s4, s0
1415 ; CHECK-NEXT:    vmovx.f16 s0, s1
1416 ; CHECK-NEXT:    vstrw.32 q1, [sp, #80] @ 16-byte Spill
1417 ; CHECK-NEXT:    vmov.f32 s5, s11
1418 ; CHECK-NEXT:    vins.f16 s5, s0
1419 ; CHECK-NEXT:    vmov.f32 s6, s15
1420 ; CHECK-NEXT:    vmovx.f16 s0, s11
1421 ; CHECK-NEXT:    vmov q7, q4
1422 ; CHECK-NEXT:    vins.f16 s6, s0
1423 ; CHECK-NEXT:    vmovx.f16 s2, s20
1424 ; CHECK-NEXT:    vstrw.32 q1, [sp, #64] @ 16-byte Spill
1425 ; CHECK-NEXT:    vmov.f32 s4, s16
1426 ; CHECK-NEXT:    vins.f16 s4, s20
1427 ; CHECK-NEXT:    vmov.f32 s0, s17
1428 ; CHECK-NEXT:    vmov r2, s2
1429 ; CHECK-NEXT:    vstrw.32 q7, [sp, #16] @ 16-byte Spill
1430 ; CHECK-NEXT:    vmov.f32 s16, s4
1431 ; CHECK-NEXT:    vmovx.f16 s4, s28
1432 ; CHECK-NEXT:    vldrw.u32 q7, [r0, #80]
1433 ; CHECK-NEXT:    vmov.16 q4[4], r2
1434 ; CHECK-NEXT:    vins.f16 s0, s21
1435 ; CHECK-NEXT:    vstrw.32 q5, [sp] @ 16-byte Spill
1436 ; CHECK-NEXT:    vmov.f32 s19, s0
1437 ; CHECK-NEXT:    vmovx.f16 s0, s28
1438 ; CHECK-NEXT:    vins.f16 s18, s0
1439 ; CHECK-NEXT:    vmov.f64 d0, d4
1440 ; CHECK-NEXT:    vstrw.32 q6, [sp, #48] @ 16-byte Spill
1441 ; CHECK-NEXT:    vmov.f32 s20, s8
1442 ; CHECK-NEXT:    vmovx.f16 s8, s24
1443 ; CHECK-NEXT:    vmov.f32 s22, s28
1444 ; CHECK-NEXT:    vins.f16 s20, s24
1445 ; CHECK-NEXT:    vmov r0, s8
1446 ; CHECK-NEXT:    vmov.f32 s17, s28
1447 ; CHECK-NEXT:    vmov.16 q5[4], r0
1448 ; CHECK-NEXT:    vmov.f32 s2, s10
1449 ; CHECK-NEXT:    vins.f16 s17, s4
1450 ; CHECK-NEXT:    vmov.f32 s4, s9
1451 ; CHECK-NEXT:    vldrw.u32 q2, [sp] @ 16-byte Reload
1452 ; CHECK-NEXT:    vstrw.32 q0, [sp, #32] @ 16-byte Spill
1453 ; CHECK-NEXT:    vmovx.f16 s0, s0
1454 ; CHECK-NEXT:    vmov.f32 s21, s12
1455 ; CHECK-NEXT:    vmovx.f16 s24, s10
1456 ; CHECK-NEXT:    vins.f16 s21, s0
1457 ; CHECK-NEXT:    vmovx.f16 s0, s12
1458 ; CHECK-NEXT:    vins.f16 s22, s0
1459 ; CHECK-NEXT:    vmovx.f16 s0, s30
1460 ; CHECK-NEXT:    vins.f16 s24, s0
1461 ; CHECK-NEXT:    vmovx.f16 s0, s31
1462 ; CHECK-NEXT:    vmovx.f16 s27, s11
1463 ; CHECK-NEXT:    vins.f16 s4, s25
1464 ; CHECK-NEXT:    vins.f16 s27, s0
1465 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #16] @ 16-byte Reload
1466 ; CHECK-NEXT:    vins.f16 s25, s11
1467 ; CHECK-NEXT:    vmov.f32 s23, s4
1468 ; CHECK-NEXT:    vmovx.f16 s4, s25
1469 ; CHECK-NEXT:    vmov.f32 s25, s3
1470 ; CHECK-NEXT:    vmov.f32 s26, s31
1471 ; CHECK-NEXT:    vmovx.f16 s0, s3
1472 ; CHECK-NEXT:    vins.f16 s25, s4
1473 ; CHECK-NEXT:    vins.f16 s26, s0
1474 ; CHECK-NEXT:    vmovx.f16 s4, s1
1475 ; CHECK-NEXT:    vmov.f32 s0, s29
1476 ; CHECK-NEXT:    vins.f16 s0, s4
1477 ; CHECK-NEXT:    vmovx.f16 s4, s2
1478 ; CHECK-NEXT:    vins.f16 s30, s4
1479 ; CHECK-NEXT:    vmov.f32 s6, s18
1480 ; CHECK-NEXT:    vrev32.16 q2, q2
1481 ; CHECK-NEXT:    vmovx.f16 s4, s29
1482 ; CHECK-NEXT:    vmov.f32 s3, s30
1483 ; CHECK-NEXT:    vldrw.u32 q7, [sp, #32] @ 16-byte Reload
1484 ; CHECK-NEXT:    vins.f16 s9, s4
1485 ; CHECK-NEXT:    vmovx.f16 s4, s10
1486 ; CHECK-NEXT:    vins.f16 s2, s4
1487 ; CHECK-NEXT:    vmovx.f16 s4, s29
1488 ; CHECK-NEXT:    vmov.f32 s8, s13
1489 ; CHECK-NEXT:    vstrw.32 q6, [r1, #80]
1490 ; CHECK-NEXT:    vins.f16 s8, s4
1491 ; CHECK-NEXT:    vmovx.f16 s4, s30
1492 ; CHECK-NEXT:    vins.f16 s14, s4
1493 ; CHECK-NEXT:    vmov.f32 s10, s30
1494 ; CHECK-NEXT:    vmov.f32 s11, s14
1495 ; CHECK-NEXT:    vmovx.f16 s4, s13
1496 ; CHECK-NEXT:    vldrw.u32 q3, [sp, #48] @ 16-byte Reload
1497 ; CHECK-NEXT:    vldrw.u32 q7, [sp, #64] @ 16-byte Reload
1498 ; CHECK-NEXT:    vmov.f32 s18, s6
1499 ; CHECK-NEXT:    vstrw.32 q5, [r1]
1500 ; CHECK-NEXT:    vrev32.16 q3, q3
1501 ; CHECK-NEXT:    vmov.f32 s6, s30
1502 ; CHECK-NEXT:    vldrw.u32 q7, [sp, #80] @ 16-byte Reload
1503 ; CHECK-NEXT:    vins.f16 s13, s4
1504 ; CHECK-NEXT:    vmovx.f16 s4, s14
1505 ; CHECK-NEXT:    vmov.f32 s1, s9
1506 ; CHECK-NEXT:    vins.f16 s10, s4
1507 ; CHECK-NEXT:    vmov.f32 s9, s13
1508 ; CHECK-NEXT:    vmov.f32 s4, s28
1509 ; CHECK-NEXT:    vstrw.32 q2, [r1, #16]
1510 ; CHECK-NEXT:    vmov.f32 s7, s31
1511 ; CHECK-NEXT:    vstrw.32 q4, [r1, #48]
1512 ; CHECK-NEXT:    vstrw.32 q1, [r1, #32]
1513 ; CHECK-NEXT:    vstrw.32 q0, [r1, #64]
1514 ; CHECK-NEXT:    add sp, #96
1515 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
1516 ; CHECK-NEXT:    bx lr
1517 entry:
1518   %s1 = getelementptr <16 x half>, <16 x half>* %src, i32 0
1519   %l1 = load <16 x half>, <16 x half>* %s1, align 4
1520   %s2 = getelementptr <16 x half>, <16 x half>* %src, i32 1
1521   %l2 = load <16 x half>, <16 x half>* %s2, align 4
1522   %s3 = getelementptr <16 x half>, <16 x half>* %src, i32 2
1523   %l3 = load <16 x half>, <16 x half>* %s3, align 4
1524   %t1 = shufflevector <16 x half> %l1, <16 x half> %l2, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
1525   %t2 = shufflevector <16 x half> %l3, <16 x half> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1526   %s = shufflevector <32 x half> %t1, <32 x half> %t2, <48 x i32> <i32 0, i32 16, i32 32, i32 1, i32 17, i32 33, i32 2, i32 18, i32 34, i32 3, i32 19, i32 35, i32 4, i32 20, i32 36, i32 5, i32 21, i32 37, i32 6, i32 22, i32 38, i32 7, i32 23, i32 39, i32 8, i32 24, i32 40, i32 9, i32 25, i32 41, i32 10, i32 26, i32 42, i32 11, i32 27, i32 43, i32 12, i32 28, i32 44, i32 13, i32 29, i32 45, i32 14, i32 30, i32 46, i32 15, i32 31, i32 47>
1527   store <48 x half> %s, <48 x half> *%dst
1528   ret void
1531 ; f64
1533 define void @vst3_v2f64(<2 x double> *%src, <6 x double> *%dst) {
1534 ; CHECK-LABEL: vst3_v2f64:
1535 ; CHECK:       @ %bb.0: @ %entry
1536 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
1537 ; CHECK-NEXT:    vldrw.u32 q1, [r0, #32]
1538 ; CHECK-NEXT:    vldrw.u32 q2, [r0, #16]
1539 ; CHECK-NEXT:    vmov.f64 d6, d2
1540 ; CHECK-NEXT:    vmov.f64 d7, d1
1541 ; CHECK-NEXT:    vmov.f64 d1, d4
1542 ; CHECK-NEXT:    vstrw.32 q3, [r1, #16]
1543 ; CHECK-NEXT:    vmov.f64 d2, d5
1544 ; CHECK-NEXT:    vstrw.32 q0, [r1]
1545 ; CHECK-NEXT:    vstrw.32 q1, [r1, #32]
1546 ; CHECK-NEXT:    bx lr
1547 entry:
1548   %s1 = getelementptr <2 x double>, <2 x double>* %src, i32 0
1549   %l1 = load <2 x double>, <2 x double>* %s1, align 4
1550   %s2 = getelementptr <2 x double>, <2 x double>* %src, i32 1
1551   %l2 = load <2 x double>, <2 x double>* %s2, align 4
1552   %s3 = getelementptr <2 x double>, <2 x double>* %src, i32 2
1553   %l3 = load <2 x double>, <2 x double>* %s3, align 4
1554   %t1 = shufflevector <2 x double> %l1, <2 x double> %l2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1555   %t2 = shufflevector <2 x double> %l3, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1556   %s = shufflevector <4 x double> %t1, <4 x double> %t2, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>
1557   store <6 x double> %s, <6 x double> *%dst
1558   ret void
1561 define void @vst3_v4f64(<4 x double> *%src, <12 x double> *%dst) {
1562 ; CHECK-LABEL: vst3_v4f64:
1563 ; CHECK:       @ %bb.0: @ %entry
1564 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
1565 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
1566 ; CHECK-NEXT:    vldrw.u32 q7, [r0, #48]
1567 ; CHECK-NEXT:    vldrw.u32 q6, [r0, #32]
1568 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #80]
1569 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
1570 ; CHECK-NEXT:    vmov.f64 d6, d15
1571 ; CHECK-NEXT:    vldrw.u32 q2, [r0, #16]
1572 ; CHECK-NEXT:    vldrw.u32 q4, [r0, #64]
1573 ; CHECK-NEXT:    vmov.f64 d15, d13
1574 ; CHECK-NEXT:    vmov.f64 d7, d1
1575 ; CHECK-NEXT:    vmov.f64 d10, d2
1576 ; CHECK-NEXT:    vstrw.32 q3, [r1, #80]
1577 ; CHECK-NEXT:    vmov.f64 d11, d12
1578 ; CHECK-NEXT:    vmov.f64 d2, d8
1579 ; CHECK-NEXT:    vstrw.32 q5, [r1]
1580 ; CHECK-NEXT:    vmov.f64 d1, d5
1581 ; CHECK-NEXT:    vstrw.32 q1, [r1, #16]
1582 ; CHECK-NEXT:    vmov.f64 d8, d15
1583 ; CHECK-NEXT:    vstrw.32 q0, [r1, #64]
1584 ; CHECK-NEXT:    vmov.f64 d12, d4
1585 ; CHECK-NEXT:    vstrw.32 q4, [r1, #32]
1586 ; CHECK-NEXT:    vmov.f64 d13, d14
1587 ; CHECK-NEXT:    vstrw.32 q6, [r1, #48]
1588 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
1589 ; CHECK-NEXT:    bx lr
1590 entry:
1591   %s1 = getelementptr <4 x double>, <4 x double>* %src, i32 0
1592   %l1 = load <4 x double>, <4 x double>* %s1, align 4
1593   %s2 = getelementptr <4 x double>, <4 x double>* %src, i32 1
1594   %l2 = load <4 x double>, <4 x double>* %s2, align 4
1595   %s3 = getelementptr <4 x double>, <4 x double>* %src, i32 2
1596   %l3 = load <4 x double>, <4 x double>* %s3, align 4
1597   %t1 = shufflevector <4 x double> %l1, <4 x double> %l2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1598   %t2 = shufflevector <4 x double> %l3, <4 x double> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
1599   %s = shufflevector <8 x double> %t1, <8 x double> %t2, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
1600   store <12 x double> %s, <12 x double> *%dst
1601   ret void