a0b17e161a13ece9ede3082abe1a273e0e0fc7cf
[oota-llvm.git] / test / CodeGen / AArch64 / neon-perm.ll
1 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
2
3 %struct.int8x8x2_t = type { [2 x <8 x i8>] }
4 %struct.int16x4x2_t = type { [2 x <4 x i16>] }
5 %struct.int32x2x2_t = type { [2 x <2 x i32>] }
6 %struct.uint8x8x2_t = type { [2 x <8 x i8>] }
7 %struct.uint16x4x2_t = type { [2 x <4 x i16>] }
8 %struct.uint32x2x2_t = type { [2 x <2 x i32>] }
9 %struct.float32x2x2_t = type { [2 x <2 x float>] }
10 %struct.poly8x8x2_t = type { [2 x <8 x i8>] }
11 %struct.poly16x4x2_t = type { [2 x <4 x i16>] }
12 %struct.int8x16x2_t = type { [2 x <16 x i8>] }
13 %struct.int16x8x2_t = type { [2 x <8 x i16>] }
14 %struct.int32x4x2_t = type { [2 x <4 x i32>] }
15 %struct.uint8x16x2_t = type { [2 x <16 x i8>] }
16 %struct.uint16x8x2_t = type { [2 x <8 x i16>] }
17 %struct.uint32x4x2_t = type { [2 x <4 x i32>] }
18 %struct.float32x4x2_t = type { [2 x <4 x float>] }
19 %struct.poly8x16x2_t = type { [2 x <16 x i8>] }
20 %struct.poly16x8x2_t = type { [2 x <8 x i16>] }
21
22 define <8 x i8> @test_vuzp1_s8(<8 x i8> %a, <8 x i8> %b) {
23 ; CHECK: test_vuzp1_s8:
24 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
25 entry:
26   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
27   ret <8 x i8> %shuffle.i
28 }
29
30 define <16 x i8> @test_vuzp1q_s8(<16 x i8> %a, <16 x i8> %b) {
31 ; CHECK: test_vuzp1q_s8:
32 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
33 entry:
34   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
35   ret <16 x i8> %shuffle.i
36 }
37
38 define <4 x i16> @test_vuzp1_s16(<4 x i16> %a, <4 x i16> %b) {
39 ; CHECK: test_vuzp1_s16:
40 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
41 entry:
42   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
43   ret <4 x i16> %shuffle.i
44 }
45
46 define <8 x i16> @test_vuzp1q_s16(<8 x i16> %a, <8 x i16> %b) {
47 ; CHECK: test_vuzp1q_s16:
48 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
49 entry:
50   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
51   ret <8 x i16> %shuffle.i
52 }
53
54 define <2 x i32> @test_vuzp1_s32(<2 x i32> %a, <2 x i32> %b) {
55 ; CHECK: test_vuzp1_s32:
56 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
57 entry:
58   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
59   ret <2 x i32> %shuffle.i
60 }
61
62 define <4 x i32> @test_vuzp1q_s32(<4 x i32> %a, <4 x i32> %b) {
63 ; CHECK: test_vuzp1q_s32:
64 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
65 entry:
66   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
67   ret <4 x i32> %shuffle.i
68 }
69
70 define <2 x i64> @test_vuzp1q_s64(<2 x i64> %a, <2 x i64> %b) {
71 ; CHECK: test_vuzp1q_s64:
72 ; CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
73 entry:
74   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
75   ret <2 x i64> %shuffle.i
76 }
77
78 define <8 x i8> @test_vuzp1_u8(<8 x i8> %a, <8 x i8> %b) {
79 ; CHECK: test_vuzp1_u8:
80 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
81 entry:
82   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
83   ret <8 x i8> %shuffle.i
84 }
85
86 define <16 x i8> @test_vuzp1q_u8(<16 x i8> %a, <16 x i8> %b) {
87 ; CHECK: test_vuzp1q_u8:
88 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
89 entry:
90   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
91   ret <16 x i8> %shuffle.i
92 }
93
94 define <4 x i16> @test_vuzp1_u16(<4 x i16> %a, <4 x i16> %b) {
95 ; CHECK: test_vuzp1_u16:
96 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
97 entry:
98   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
99   ret <4 x i16> %shuffle.i
100 }
101
102 define <8 x i16> @test_vuzp1q_u16(<8 x i16> %a, <8 x i16> %b) {
103 ; CHECK: test_vuzp1q_u16:
104 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
105 entry:
106   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
107   ret <8 x i16> %shuffle.i
108 }
109
110 define <2 x i32> @test_vuzp1_u32(<2 x i32> %a, <2 x i32> %b) {
111 ; CHECK: test_vuzp1_u32:
112 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
113 entry:
114   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
115   ret <2 x i32> %shuffle.i
116 }
117
118 define <4 x i32> @test_vuzp1q_u32(<4 x i32> %a, <4 x i32> %b) {
119 ; CHECK: test_vuzp1q_u32:
120 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
121 entry:
122   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
123   ret <4 x i32> %shuffle.i
124 }
125
126 define <2 x i64> @test_vuzp1q_u64(<2 x i64> %a, <2 x i64> %b) {
127 ; CHECK: test_vuzp1q_u64:
128 ; CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
129 entry:
130   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
131   ret <2 x i64> %shuffle.i
132 }
133
134 define <2 x float> @test_vuzp1_f32(<2 x float> %a, <2 x float> %b) {
135 ; CHECK: test_vuzp1_f32:
136 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
137 entry:
138   %shuffle.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 0, i32 2>
139   ret <2 x float> %shuffle.i
140 }
141
142 define <4 x float> @test_vuzp1q_f32(<4 x float> %a, <4 x float> %b) {
143 ; CHECK: test_vuzp1q_f32:
144 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
145 entry:
146   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
147   ret <4 x float> %shuffle.i
148 }
149
150 define <2 x double> @test_vuzp1q_f64(<2 x double> %a, <2 x double> %b) {
151 ; CHECK: test_vuzp1q_f64:
152 ; CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
153 entry:
154   %shuffle.i = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 2>
155   ret <2 x double> %shuffle.i
156 }
157
158 define <8 x i8> @test_vuzp1_p8(<8 x i8> %a, <8 x i8> %b) {
159 ; CHECK: test_vuzp1_p8:
160 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
161 entry:
162   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
163   ret <8 x i8> %shuffle.i
164 }
165
166 define <16 x i8> @test_vuzp1q_p8(<16 x i8> %a, <16 x i8> %b) {
167 ; CHECK: test_vuzp1q_p8:
168 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
169 entry:
170   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
171   ret <16 x i8> %shuffle.i
172 }
173
174 define <4 x i16> @test_vuzp1_p16(<4 x i16> %a, <4 x i16> %b) {
175 ; CHECK: test_vuzp1_p16:
176 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
177 entry:
178   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
179   ret <4 x i16> %shuffle.i
180 }
181
182 define <8 x i16> @test_vuzp1q_p16(<8 x i16> %a, <8 x i16> %b) {
183 ; CHECK: test_vuzp1q_p16:
184 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
185 entry:
186   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
187   ret <8 x i16> %shuffle.i
188 }
189
190 define <8 x i8> @test_vuzp2_s8(<8 x i8> %a, <8 x i8> %b) {
191 ; CHECK: test_vuzp2_s8:
192 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
193 entry:
194   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
195   ret <8 x i8> %shuffle.i
196 }
197
198 define <16 x i8> @test_vuzp2q_s8(<16 x i8> %a, <16 x i8> %b) {
199 ; CHECK: test_vuzp2q_s8:
200 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
201 entry:
202   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
203   ret <16 x i8> %shuffle.i
204 }
205
206 define <4 x i16> @test_vuzp2_s16(<4 x i16> %a, <4 x i16> %b) {
207 ; CHECK: test_vuzp2_s16:
208 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
209 entry:
210   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
211   ret <4 x i16> %shuffle.i
212 }
213
214 define <8 x i16> @test_vuzp2q_s16(<8 x i16> %a, <8 x i16> %b) {
215 ; CHECK: test_vuzp2q_s16:
216 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
217 entry:
218   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
219   ret <8 x i16> %shuffle.i
220 }
221
222 define <2 x i32> @test_vuzp2_s32(<2 x i32> %a, <2 x i32> %b) {
223 ; CHECK: test_vuzp2_s32:
224 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
225 entry:
226   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
227   ret <2 x i32> %shuffle.i
228 }
229
230 define <4 x i32> @test_vuzp2q_s32(<4 x i32> %a, <4 x i32> %b) {
231 ; CHECK: test_vuzp2q_s32:
232 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
233 entry:
234   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
235   ret <4 x i32> %shuffle.i
236 }
237
238 define <2 x i64> @test_vuzp2q_s64(<2 x i64> %a, <2 x i64> %b) {
239 ; CHECK: test_vuzp2q_s64:
240 ; CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[1]
241 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
242 entry:
243   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
244   ret <2 x i64> %shuffle.i
245 }
246
247 define <8 x i8> @test_vuzp2_u8(<8 x i8> %a, <8 x i8> %b) {
248 ; CHECK: test_vuzp2_u8:
249 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
250 entry:
251   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
252   ret <8 x i8> %shuffle.i
253 }
254
255 define <16 x i8> @test_vuzp2q_u8(<16 x i8> %a, <16 x i8> %b) {
256 ; CHECK: test_vuzp2q_u8:
257 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
258 entry:
259   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
260   ret <16 x i8> %shuffle.i
261 }
262
263 define <4 x i16> @test_vuzp2_u16(<4 x i16> %a, <4 x i16> %b) {
264 ; CHECK: test_vuzp2_u16:
265 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
266 entry:
267   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
268   ret <4 x i16> %shuffle.i
269 }
270
271 define <8 x i16> @test_vuzp2q_u16(<8 x i16> %a, <8 x i16> %b) {
272 ; CHECK: test_vuzp2q_u16:
273 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
274 entry:
275   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
276   ret <8 x i16> %shuffle.i
277 }
278
279 define <2 x i32> @test_vuzp2_u32(<2 x i32> %a, <2 x i32> %b) {
280 ; CHECK: test_vuzp2_u32:
281 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
282 entry:
283   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
284   ret <2 x i32> %shuffle.i
285 }
286
287 define <4 x i32> @test_vuzp2q_u32(<4 x i32> %a, <4 x i32> %b) {
288 ; CHECK: test_vuzp2q_u32:
289 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
290 entry:
291   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
292   ret <4 x i32> %shuffle.i
293 }
294
295 define <2 x i64> @test_vuzp2q_u64(<2 x i64> %a, <2 x i64> %b) {
296 ; CHECK: test_vuzp2q_u64:
297 ; CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[1]
298 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
299 entry:
300   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
301   ret <2 x i64> %shuffle.i
302 }
303
304 define <2 x float> @test_vuzp2_f32(<2 x float> %a, <2 x float> %b) {
305 ; CHECK: test_vuzp2_f32:
306 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
307 entry:
308   %shuffle.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 1, i32 3>
309   ret <2 x float> %shuffle.i
310 }
311
312 define <4 x float> @test_vuzp2q_f32(<4 x float> %a, <4 x float> %b) {
313 ; CHECK: test_vuzp2q_f32:
314 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
315 entry:
316   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
317   ret <4 x float> %shuffle.i
318 }
319
320 define <2 x double> @test_vuzp2q_f64(<2 x double> %a, <2 x double> %b) {
321 ; CHECK: test_vuzp2q_f64:
322 ; CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[1]
323 ; CHECK-NEXT: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
324 entry:
325   %shuffle.i = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 3>
326   ret <2 x double> %shuffle.i
327 }
328
329 define <8 x i8> @test_vuzp2_p8(<8 x i8> %a, <8 x i8> %b) {
330 ; CHECK: test_vuzp2_p8:
331 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
332 entry:
333   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
334   ret <8 x i8> %shuffle.i
335 }
336
337 define <16 x i8> @test_vuzp2q_p8(<16 x i8> %a, <16 x i8> %b) {
338 ; CHECK: test_vuzp2q_p8:
339 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
340 entry:
341   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
342   ret <16 x i8> %shuffle.i
343 }
344
345 define <4 x i16> @test_vuzp2_p16(<4 x i16> %a, <4 x i16> %b) {
346 ; CHECK: test_vuzp2_p16:
347 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
348 entry:
349   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
350   ret <4 x i16> %shuffle.i
351 }
352
353 define <8 x i16> @test_vuzp2q_p16(<8 x i16> %a, <8 x i16> %b) {
354 ; CHECK: test_vuzp2q_p16:
355 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
356 entry:
357   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
358   ret <8 x i16> %shuffle.i
359 }
360
361 define <8 x i8> @test_vzip1_s8(<8 x i8> %a, <8 x i8> %b) {
362 ; CHECK: test_vzip1_s8:
363 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
364 entry:
365   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
366   ret <8 x i8> %shuffle.i
367 }
368
369 define <16 x i8> @test_vzip1q_s8(<16 x i8> %a, <16 x i8> %b) {
370 ; CHECK: test_vzip1q_s8:
371 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
372 entry:
373   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 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>
374   ret <16 x i8> %shuffle.i
375 }
376
377 define <4 x i16> @test_vzip1_s16(<4 x i16> %a, <4 x i16> %b) {
378 ; CHECK: test_vzip1_s16:
379 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
380 entry:
381   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
382   ret <4 x i16> %shuffle.i
383 }
384
385 define <8 x i16> @test_vzip1q_s16(<8 x i16> %a, <8 x i16> %b) {
386 ; CHECK: test_vzip1q_s16:
387 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
388 entry:
389   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
390   ret <8 x i16> %shuffle.i
391 }
392
393 define <2 x i32> @test_vzip1_s32(<2 x i32> %a, <2 x i32> %b) {
394 ; CHECK: test_vzip1_s32:
395 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
396 entry:
397   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
398   ret <2 x i32> %shuffle.i
399 }
400
401 define <4 x i32> @test_vzip1q_s32(<4 x i32> %a, <4 x i32> %b) {
402 ; CHECK: test_vzip1q_s32:
403 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
404 entry:
405   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
406   ret <4 x i32> %shuffle.i
407 }
408
409 define <2 x i64> @test_vzip1q_s64(<2 x i64> %a, <2 x i64> %b) {
410 ; CHECK: test_vzip1q_s64:
411 ; CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
412 entry:
413   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
414   ret <2 x i64> %shuffle.i
415 }
416
417 define <8 x i8> @test_vzip1_u8(<8 x i8> %a, <8 x i8> %b) {
418 ; CHECK: test_vzip1_u8:
419 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
420 entry:
421   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
422   ret <8 x i8> %shuffle.i
423 }
424
425 define <16 x i8> @test_vzip1q_u8(<16 x i8> %a, <16 x i8> %b) {
426 ; CHECK: test_vzip1q_u8:
427 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
428 entry:
429   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 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>
430   ret <16 x i8> %shuffle.i
431 }
432
433 define <4 x i16> @test_vzip1_u16(<4 x i16> %a, <4 x i16> %b) {
434 ; CHECK: test_vzip1_u16:
435 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
436 entry:
437   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
438   ret <4 x i16> %shuffle.i
439 }
440
441 define <8 x i16> @test_vzip1q_u16(<8 x i16> %a, <8 x i16> %b) {
442 ; CHECK: test_vzip1q_u16:
443 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
444 entry:
445   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
446   ret <8 x i16> %shuffle.i
447 }
448
449 define <2 x i32> @test_vzip1_u32(<2 x i32> %a, <2 x i32> %b) {
450 ; CHECK: test_vzip1_u32:
451 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
452 entry:
453   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
454   ret <2 x i32> %shuffle.i
455 }
456
457 define <4 x i32> @test_vzip1q_u32(<4 x i32> %a, <4 x i32> %b) {
458 ; CHECK: test_vzip1q_u32:
459 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
460 entry:
461   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
462   ret <4 x i32> %shuffle.i
463 }
464
465 define <2 x i64> @test_vzip1q_u64(<2 x i64> %a, <2 x i64> %b) {
466 ; CHECK: test_vzip1q_u64:
467 ; CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
468 entry:
469   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
470   ret <2 x i64> %shuffle.i
471 }
472
473 define <2 x float> @test_vzip1_f32(<2 x float> %a, <2 x float> %b) {
474 ; CHECK: test_vzip1_f32:
475 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
476 entry:
477   %shuffle.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 0, i32 2>
478   ret <2 x float> %shuffle.i
479 }
480
481 define <4 x float> @test_vzip1q_f32(<4 x float> %a, <4 x float> %b) {
482 ; CHECK: test_vzip1q_f32:
483 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
484 entry:
485   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
486   ret <4 x float> %shuffle.i
487 }
488
489 define <2 x double> @test_vzip1q_f64(<2 x double> %a, <2 x double> %b) {
490 ; CHECK: test_vzip1q_f64:
491 ; CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
492 entry:
493   %shuffle.i = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 2>
494   ret <2 x double> %shuffle.i
495 }
496
497 define <8 x i8> @test_vzip1_p8(<8 x i8> %a, <8 x i8> %b) {
498 ; CHECK: test_vzip1_p8:
499 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
500 entry:
501   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
502   ret <8 x i8> %shuffle.i
503 }
504
505 define <16 x i8> @test_vzip1q_p8(<16 x i8> %a, <16 x i8> %b) {
506 ; CHECK: test_vzip1q_p8:
507 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
508 entry:
509   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 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>
510   ret <16 x i8> %shuffle.i
511 }
512
513 define <4 x i16> @test_vzip1_p16(<4 x i16> %a, <4 x i16> %b) {
514 ; CHECK: test_vzip1_p16:
515 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
516 entry:
517   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
518   ret <4 x i16> %shuffle.i
519 }
520
521 define <8 x i16> @test_vzip1q_p16(<8 x i16> %a, <8 x i16> %b) {
522 ; CHECK: test_vzip1q_p16:
523 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
524 entry:
525   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
526   ret <8 x i16> %shuffle.i
527 }
528
529 define <8 x i8> @test_vzip2_s8(<8 x i8> %a, <8 x i8> %b) {
530 ; CHECK: test_vzip2_s8:
531 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
532 entry:
533   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
534   ret <8 x i8> %shuffle.i
535 }
536
537 define <16 x i8> @test_vzip2q_s8(<16 x i8> %a, <16 x i8> %b) {
538 ; CHECK: test_vzip2q_s8:
539 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
540 entry:
541   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <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>
542   ret <16 x i8> %shuffle.i
543 }
544
545 define <4 x i16> @test_vzip2_s16(<4 x i16> %a, <4 x i16> %b) {
546 ; CHECK: test_vzip2_s16:
547 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
548 entry:
549   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
550   ret <4 x i16> %shuffle.i
551 }
552
553 define <8 x i16> @test_vzip2q_s16(<8 x i16> %a, <8 x i16> %b) {
554 ; CHECK: test_vzip2q_s16:
555 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
556 entry:
557   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
558   ret <8 x i16> %shuffle.i
559 }
560
561 define <2 x i32> @test_vzip2_s32(<2 x i32> %a, <2 x i32> %b) {
562 ; CHECK: test_vzip2_s32:
563 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
564 entry:
565   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
566   ret <2 x i32> %shuffle.i
567 }
568
569 define <4 x i32> @test_vzip2q_s32(<4 x i32> %a, <4 x i32> %b) {
570 ; CHECK: test_vzip2q_s32:
571 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
572 entry:
573   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
574   ret <4 x i32> %shuffle.i
575 }
576
577 define <2 x i64> @test_vzip2q_s64(<2 x i64> %a, <2 x i64> %b) {
578 ; CHECK: test_vzip2q_s64:
579 ; CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[1]
580 entry:
581   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
582   ret <2 x i64> %shuffle.i
583 }
584
585 define <8 x i8> @test_vzip2_u8(<8 x i8> %a, <8 x i8> %b) {
586 ; CHECK: test_vzip2_u8:
587 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
588 entry:
589   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
590   ret <8 x i8> %shuffle.i
591 }
592
593 define <16 x i8> @test_vzip2q_u8(<16 x i8> %a, <16 x i8> %b) {
594 ; CHECK: test_vzip2q_u8:
595 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
596 entry:
597   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <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>
598   ret <16 x i8> %shuffle.i
599 }
600
601 define <4 x i16> @test_vzip2_u16(<4 x i16> %a, <4 x i16> %b) {
602 ; CHECK: test_vzip2_u16:
603 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
604 entry:
605   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
606   ret <4 x i16> %shuffle.i
607 }
608
609 define <8 x i16> @test_vzip2q_u16(<8 x i16> %a, <8 x i16> %b) {
610 ; CHECK: test_vzip2q_u16:
611 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
612 entry:
613   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
614   ret <8 x i16> %shuffle.i
615 }
616
617 define <2 x i32> @test_vzip2_u32(<2 x i32> %a, <2 x i32> %b) {
618 ; CHECK: test_vzip2_u32:
619 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
620 entry:
621   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
622   ret <2 x i32> %shuffle.i
623 }
624
625 define <4 x i32> @test_vzip2q_u32(<4 x i32> %a, <4 x i32> %b) {
626 ; CHECK: test_vzip2q_u32:
627 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
628 entry:
629   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
630   ret <4 x i32> %shuffle.i
631 }
632
633 define <2 x i64> @test_vzip2q_u64(<2 x i64> %a, <2 x i64> %b) {
634 ; CHECK: test_vzip2q_u64:
635 ; CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[1]
636 entry:
637   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
638   ret <2 x i64> %shuffle.i
639 }
640
641 define <2 x float> @test_vzip2_f32(<2 x float> %a, <2 x float> %b) {
642 ; CHECK: test_vzip2_f32:
643 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
644 entry:
645   %shuffle.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 1, i32 3>
646   ret <2 x float> %shuffle.i
647 }
648
649 define <4 x float> @test_vzip2q_f32(<4 x float> %a, <4 x float> %b) {
650 ; CHECK: test_vzip2q_f32:
651 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
652 entry:
653   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
654   ret <4 x float> %shuffle.i
655 }
656
657 define <2 x double> @test_vzip2q_f64(<2 x double> %a, <2 x double> %b) {
658 ; CHECK: test_vzip2q_f64:
659 ; CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[1]
660 entry:
661   %shuffle.i = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 3>
662   ret <2 x double> %shuffle.i
663 }
664
665 define <8 x i8> @test_vzip2_p8(<8 x i8> %a, <8 x i8> %b) {
666 ; CHECK: test_vzip2_p8:
667 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
668 entry:
669   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
670   ret <8 x i8> %shuffle.i
671 }
672
673 define <16 x i8> @test_vzip2q_p8(<16 x i8> %a, <16 x i8> %b) {
674 ; CHECK: test_vzip2q_p8:
675 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
676 entry:
677   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <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>
678   ret <16 x i8> %shuffle.i
679 }
680
681 define <4 x i16> @test_vzip2_p16(<4 x i16> %a, <4 x i16> %b) {
682 ; CHECK: test_vzip2_p16:
683 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
684 entry:
685   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
686   ret <4 x i16> %shuffle.i
687 }
688
689 define <8 x i16> @test_vzip2q_p16(<8 x i16> %a, <8 x i16> %b) {
690 ; CHECK: test_vzip2q_p16:
691 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
692 entry:
693   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
694   ret <8 x i16> %shuffle.i
695 }
696
697 define <8 x i8> @test_vtrn1_s8(<8 x i8> %a, <8 x i8> %b) {
698 ; CHECK: test_vtrn1_s8:
699 ; CHECK: trn1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
700 entry:
701   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
702   ret <8 x i8> %shuffle.i
703 }
704
705 define <16 x i8> @test_vtrn1q_s8(<16 x i8> %a, <16 x i8> %b) {
706 ; CHECK: test_vtrn1q_s8:
707 ; CHECK: trn1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
708 entry:
709   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
710   ret <16 x i8> %shuffle.i
711 }
712
713 define <4 x i16> @test_vtrn1_s16(<4 x i16> %a, <4 x i16> %b) {
714 ; CHECK: test_vtrn1_s16:
715 ; CHECK: trn1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
716 entry:
717   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
718   ret <4 x i16> %shuffle.i
719 }
720
721 define <8 x i16> @test_vtrn1q_s16(<8 x i16> %a, <8 x i16> %b) {
722 ; CHECK: test_vtrn1q_s16:
723 ; CHECK: trn1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
724 entry:
725   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
726   ret <8 x i16> %shuffle.i
727 }
728
729 define <2 x i32> @test_vtrn1_s32(<2 x i32> %a, <2 x i32> %b) {
730 ; CHECK: test_vtrn1_s32:
731 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
732 entry:
733   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
734   ret <2 x i32> %shuffle.i
735 }
736
737 define <4 x i32> @test_vtrn1q_s32(<4 x i32> %a, <4 x i32> %b) {
738 ; CHECK: test_vtrn1q_s32:
739 ; CHECK: trn1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
740 entry:
741   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
742   ret <4 x i32> %shuffle.i
743 }
744
745 define <2 x i64> @test_vtrn1q_s64(<2 x i64> %a, <2 x i64> %b) {
746 ; CHECK: test_vtrn1q_s64:
747 ; CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
748 entry:
749   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
750   ret <2 x i64> %shuffle.i
751 }
752
753 define <8 x i8> @test_vtrn1_u8(<8 x i8> %a, <8 x i8> %b) {
754 ; CHECK: test_vtrn1_u8:
755 ; CHECK: trn1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
756 entry:
757   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
758   ret <8 x i8> %shuffle.i
759 }
760
761 define <16 x i8> @test_vtrn1q_u8(<16 x i8> %a, <16 x i8> %b) {
762 ; CHECK: test_vtrn1q_u8:
763 ; CHECK: trn1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
764 entry:
765   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
766   ret <16 x i8> %shuffle.i
767 }
768
769 define <4 x i16> @test_vtrn1_u16(<4 x i16> %a, <4 x i16> %b) {
770 ; CHECK: test_vtrn1_u16:
771 ; CHECK: trn1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
772 entry:
773   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
774   ret <4 x i16> %shuffle.i
775 }
776
777 define <8 x i16> @test_vtrn1q_u16(<8 x i16> %a, <8 x i16> %b) {
778 ; CHECK: test_vtrn1q_u16:
779 ; CHECK: trn1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
780 entry:
781   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
782   ret <8 x i16> %shuffle.i
783 }
784
785 define <2 x i32> @test_vtrn1_u32(<2 x i32> %a, <2 x i32> %b) {
786 ; CHECK: test_vtrn1_u32:
787 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
788 entry:
789   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
790   ret <2 x i32> %shuffle.i
791 }
792
793 define <4 x i32> @test_vtrn1q_u32(<4 x i32> %a, <4 x i32> %b) {
794 ; CHECK: test_vtrn1q_u32:
795 ; CHECK: trn1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
796 entry:
797   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
798   ret <4 x i32> %shuffle.i
799 }
800
801 define <2 x i64> @test_vtrn1q_u64(<2 x i64> %a, <2 x i64> %b) {
802 ; CHECK: test_vtrn1q_u64:
803 ; CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
804 entry:
805   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
806   ret <2 x i64> %shuffle.i
807 }
808
809 define <2 x float> @test_vtrn1_f32(<2 x float> %a, <2 x float> %b) {
810 ; CHECK: test_vtrn1_f32:
811 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
812 entry:
813   %shuffle.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 0, i32 2>
814   ret <2 x float> %shuffle.i
815 }
816
817 define <4 x float> @test_vtrn1q_f32(<4 x float> %a, <4 x float> %b) {
818 ; CHECK: test_vtrn1q_f32:
819 ; CHECK: trn1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
820 entry:
821   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
822   ret <4 x float> %shuffle.i
823 }
824
825 define <2 x double> @test_vtrn1q_f64(<2 x double> %a, <2 x double> %b) {
826 ; CHECK: test_vtrn1q_f64:
827 ; CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
828 entry:
829   %shuffle.i = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 2>
830   ret <2 x double> %shuffle.i
831 }
832
833 define <8 x i8> @test_vtrn1_p8(<8 x i8> %a, <8 x i8> %b) {
834 ; CHECK: test_vtrn1_p8:
835 ; CHECK: trn1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
836 entry:
837   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
838   ret <8 x i8> %shuffle.i
839 }
840
841 define <16 x i8> @test_vtrn1q_p8(<16 x i8> %a, <16 x i8> %b) {
842 ; CHECK: test_vtrn1q_p8:
843 ; CHECK: trn1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
844 entry:
845   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
846   ret <16 x i8> %shuffle.i
847 }
848
849 define <4 x i16> @test_vtrn1_p16(<4 x i16> %a, <4 x i16> %b) {
850 ; CHECK: test_vtrn1_p16:
851 ; CHECK: trn1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
852 entry:
853   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
854   ret <4 x i16> %shuffle.i
855 }
856
857 define <8 x i16> @test_vtrn1q_p16(<8 x i16> %a, <8 x i16> %b) {
858 ; CHECK: test_vtrn1q_p16:
859 ; CHECK: trn1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
860 entry:
861   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
862   ret <8 x i16> %shuffle.i
863 }
864
865 define <8 x i8> @test_vtrn2_s8(<8 x i8> %a, <8 x i8> %b) {
866 ; CHECK: test_vtrn2_s8:
867 ; CHECK: trn2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
868 entry:
869   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
870   ret <8 x i8> %shuffle.i
871 }
872
873 define <16 x i8> @test_vtrn2q_s8(<16 x i8> %a, <16 x i8> %b) {
874 ; CHECK: test_vtrn2q_s8:
875 ; CHECK: trn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
876 entry:
877   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
878   ret <16 x i8> %shuffle.i
879 }
880
881 define <4 x i16> @test_vtrn2_s16(<4 x i16> %a, <4 x i16> %b) {
882 ; CHECK: test_vtrn2_s16:
883 ; CHECK: trn2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
884 entry:
885   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
886   ret <4 x i16> %shuffle.i
887 }
888
889 define <8 x i16> @test_vtrn2q_s16(<8 x i16> %a, <8 x i16> %b) {
890 ; CHECK: test_vtrn2q_s16:
891 ; CHECK: trn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
892 entry:
893   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
894   ret <8 x i16> %shuffle.i
895 }
896
897 define <2 x i32> @test_vtrn2_s32(<2 x i32> %a, <2 x i32> %b) {
898 ; CHECK: test_vtrn2_s32:
899 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
900 entry:
901   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
902   ret <2 x i32> %shuffle.i
903 }
904
905 define <4 x i32> @test_vtrn2q_s32(<4 x i32> %a, <4 x i32> %b) {
906 ; CHECK: test_vtrn2q_s32:
907 ; CHECK: trn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
908 entry:
909   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
910   ret <4 x i32> %shuffle.i
911 }
912
913 define <2 x i64> @test_vtrn2q_s64(<2 x i64> %a, <2 x i64> %b) {
914 ; CHECK: test_vtrn2q_s64:
915 ; CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[1]
916 entry:
917   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
918   ret <2 x i64> %shuffle.i
919 }
920
921 define <8 x i8> @test_vtrn2_u8(<8 x i8> %a, <8 x i8> %b) {
922 ; CHECK: test_vtrn2_u8:
923 ; CHECK: trn2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
924 entry:
925   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
926   ret <8 x i8> %shuffle.i
927 }
928
929 define <16 x i8> @test_vtrn2q_u8(<16 x i8> %a, <16 x i8> %b) {
930 ; CHECK: test_vtrn2q_u8:
931 ; CHECK: trn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
932 entry:
933   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
934   ret <16 x i8> %shuffle.i
935 }
936
937 define <4 x i16> @test_vtrn2_u16(<4 x i16> %a, <4 x i16> %b) {
938 ; CHECK: test_vtrn2_u16:
939 ; CHECK: trn2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
940 entry:
941   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
942   ret <4 x i16> %shuffle.i
943 }
944
945 define <8 x i16> @test_vtrn2q_u16(<8 x i16> %a, <8 x i16> %b) {
946 ; CHECK: test_vtrn2q_u16:
947 ; CHECK: trn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
948 entry:
949   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
950   ret <8 x i16> %shuffle.i
951 }
952
953 define <2 x i32> @test_vtrn2_u32(<2 x i32> %a, <2 x i32> %b) {
954 ; CHECK: test_vtrn2_u32:
955 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
956 entry:
957   %shuffle.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
958   ret <2 x i32> %shuffle.i
959 }
960
961 define <4 x i32> @test_vtrn2q_u32(<4 x i32> %a, <4 x i32> %b) {
962 ; CHECK: test_vtrn2q_u32:
963 ; CHECK: trn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
964 entry:
965   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
966   ret <4 x i32> %shuffle.i
967 }
968
969 define <2 x i64> @test_vtrn2q_u64(<2 x i64> %a, <2 x i64> %b) {
970 ; CHECK: test_vtrn2q_u64:
971 ; CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[1]
972 entry:
973   %shuffle.i = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
974   ret <2 x i64> %shuffle.i
975 }
976
977 define <2 x float> @test_vtrn2_f32(<2 x float> %a, <2 x float> %b) {
978 ; CHECK: test_vtrn2_f32:
979 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
980 entry:
981   %shuffle.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 1, i32 3>
982   ret <2 x float> %shuffle.i
983 }
984
985 define <4 x float> @test_vtrn2q_f32(<4 x float> %a, <4 x float> %b) {
986 ; CHECK: test_vtrn2q_f32:
987 ; CHECK: trn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
988 entry:
989   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
990   ret <4 x float> %shuffle.i
991 }
992
993 define <2 x double> @test_vtrn2q_f64(<2 x double> %a, <2 x double> %b) {
994 ; CHECK: test_vtrn2q_f64:
995 ; CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[1]
996 entry:
997   %shuffle.i = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 3>
998   ret <2 x double> %shuffle.i
999 }
1000
1001 define <8 x i8> @test_vtrn2_p8(<8 x i8> %a, <8 x i8> %b) {
1002 ; CHECK: test_vtrn2_p8:
1003 ; CHECK: trn2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1004 entry:
1005   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
1006   ret <8 x i8> %shuffle.i
1007 }
1008
1009 define <16 x i8> @test_vtrn2q_p8(<16 x i8> %a, <16 x i8> %b) {
1010 ; CHECK: test_vtrn2q_p8:
1011 ; CHECK: trn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1012 entry:
1013   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
1014   ret <16 x i8> %shuffle.i
1015 }
1016
1017 define <4 x i16> @test_vtrn2_p16(<4 x i16> %a, <4 x i16> %b) {
1018 ; CHECK: test_vtrn2_p16:
1019 ; CHECK: trn2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1020 entry:
1021   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
1022   ret <4 x i16> %shuffle.i
1023 }
1024
1025 define <8 x i16> @test_vtrn2q_p16(<8 x i16> %a, <8 x i16> %b) {
1026 ; CHECK: test_vtrn2q_p16:
1027 ; CHECK: trn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1028 entry:
1029   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
1030   ret <8 x i16> %shuffle.i
1031 }
1032
1033 define <8 x i8> @test_same_vuzp1_s8(<8 x i8> %a) {
1034 ; CHECK: test_same_vuzp1_s8:
1035 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1036 entry:
1037   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1038   ret <8 x i8> %shuffle.i
1039 }
1040
1041 define <16 x i8> @test_same_vuzp1q_s8(<16 x i8> %a) {
1042 ; CHECK: test_same_vuzp1q_s8:
1043 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1044 entry:
1045   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
1046   ret <16 x i8> %shuffle.i
1047 }
1048
1049 define <4 x i16> @test_same_vuzp1_s16(<4 x i16> %a) {
1050 ; CHECK: test_same_vuzp1_s16:
1051 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1052 entry:
1053   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1054   ret <4 x i16> %shuffle.i
1055 }
1056
1057 define <8 x i16> @test_same_vuzp1q_s16(<8 x i16> %a) {
1058 ; CHECK: test_same_vuzp1q_s16:
1059 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1060 entry:
1061   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1062   ret <8 x i16> %shuffle.i
1063 }
1064
1065 define <4 x i32> @test_same_vuzp1q_s32(<4 x i32> %a) {
1066 ; CHECK: test_same_vuzp1q_s32:
1067 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1068 entry:
1069   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1070   ret <4 x i32> %shuffle.i
1071 }
1072
1073 define <8 x i8> @test_same_vuzp1_u8(<8 x i8> %a) {
1074 ; CHECK: test_same_vuzp1_u8:
1075 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1076 entry:
1077   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1078   ret <8 x i8> %shuffle.i
1079 }
1080
1081 define <16 x i8> @test_same_vuzp1q_u8(<16 x i8> %a) {
1082 ; CHECK: test_same_vuzp1q_u8:
1083 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1084 entry:
1085   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
1086   ret <16 x i8> %shuffle.i
1087 }
1088
1089 define <4 x i16> @test_same_vuzp1_u16(<4 x i16> %a) {
1090 ; CHECK: test_same_vuzp1_u16:
1091 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1092 entry:
1093   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1094   ret <4 x i16> %shuffle.i
1095 }
1096
1097 define <8 x i16> @test_same_vuzp1q_u16(<8 x i16> %a) {
1098 ; CHECK: test_same_vuzp1q_u16:
1099 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1100 entry:
1101   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1102   ret <8 x i16> %shuffle.i
1103 }
1104
1105 define <4 x i32> @test_same_vuzp1q_u32(<4 x i32> %a) {
1106 ; CHECK: test_same_vuzp1q_u32:
1107 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1108 entry:
1109   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1110   ret <4 x i32> %shuffle.i
1111 }
1112
1113 define <4 x float> @test_same_vuzp1q_f32(<4 x float> %a) {
1114 ; CHECK: test_same_vuzp1q_f32:
1115 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1116 entry:
1117   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %a, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1118   ret <4 x float> %shuffle.i
1119 }
1120
1121 define <8 x i8> @test_same_vuzp1_p8(<8 x i8> %a) {
1122 ; CHECK: test_same_vuzp1_p8:
1123 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1124 entry:
1125   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1126   ret <8 x i8> %shuffle.i
1127 }
1128
1129 define <16 x i8> @test_same_vuzp1q_p8(<16 x i8> %a) {
1130 ; CHECK: test_same_vuzp1q_p8:
1131 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1132 entry:
1133   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
1134   ret <16 x i8> %shuffle.i
1135 }
1136
1137 define <4 x i16> @test_same_vuzp1_p16(<4 x i16> %a) {
1138 ; CHECK: test_same_vuzp1_p16:
1139 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1140 entry:
1141   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1142   ret <4 x i16> %shuffle.i
1143 }
1144
1145 define <8 x i16> @test_same_vuzp1q_p16(<8 x i16> %a) {
1146 ; CHECK: test_same_vuzp1q_p16:
1147 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1148 entry:
1149   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1150   ret <8 x i16> %shuffle.i
1151 }
1152
1153 define <8 x i8> @test_same_vuzp2_s8(<8 x i8> %a) {
1154 ; CHECK: test_same_vuzp2_s8:
1155 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1156 entry:
1157   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1158   ret <8 x i8> %shuffle.i
1159 }
1160
1161 define <16 x i8> @test_same_vuzp2q_s8(<16 x i8> %a) {
1162 ; CHECK: test_same_vuzp2q_s8:
1163 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1164 entry:
1165   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
1166   ret <16 x i8> %shuffle.i
1167 }
1168
1169 define <4 x i16> @test_same_vuzp2_s16(<4 x i16> %a) {
1170 ; CHECK: test_same_vuzp2_s16:
1171 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1172 entry:
1173   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1174   ret <4 x i16> %shuffle.i
1175 }
1176
1177 define <8 x i16> @test_same_vuzp2q_s16(<8 x i16> %a) {
1178 ; CHECK: test_same_vuzp2q_s16:
1179 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1180 entry:
1181   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1182   ret <8 x i16> %shuffle.i
1183 }
1184
1185 define <4 x i32> @test_same_vuzp2q_s32(<4 x i32> %a) {
1186 ; CHECK: test_same_vuzp2q_s32:
1187 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1188 entry:
1189   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1190   ret <4 x i32> %shuffle.i
1191 }
1192
1193 define <8 x i8> @test_same_vuzp2_u8(<8 x i8> %a) {
1194 ; CHECK: test_same_vuzp2_u8:
1195 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1196 entry:
1197   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1198   ret <8 x i8> %shuffle.i
1199 }
1200
1201 define <16 x i8> @test_same_vuzp2q_u8(<16 x i8> %a) {
1202 ; CHECK: test_same_vuzp2q_u8:
1203 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1204 entry:
1205   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
1206   ret <16 x i8> %shuffle.i
1207 }
1208
1209 define <4 x i16> @test_same_vuzp2_u16(<4 x i16> %a) {
1210 ; CHECK: test_same_vuzp2_u16:
1211 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1212 entry:
1213   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1214   ret <4 x i16> %shuffle.i
1215 }
1216
1217 define <8 x i16> @test_same_vuzp2q_u16(<8 x i16> %a) {
1218 ; CHECK: test_same_vuzp2q_u16:
1219 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1220 entry:
1221   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1222   ret <8 x i16> %shuffle.i
1223 }
1224
1225 define <4 x i32> @test_same_vuzp2q_u32(<4 x i32> %a) {
1226 ; CHECK: test_same_vuzp2q_u32:
1227 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1228 entry:
1229   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1230   ret <4 x i32> %shuffle.i
1231 }
1232
1233 define <4 x float> @test_same_vuzp2q_f32(<4 x float> %a) {
1234 ; CHECK: test_same_vuzp2q_f32:
1235 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1236 entry:
1237   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %a, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1238   ret <4 x float> %shuffle.i
1239 }
1240
1241 define <8 x i8> @test_same_vuzp2_p8(<8 x i8> %a) {
1242 ; CHECK: test_same_vuzp2_p8:
1243 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1244 entry:
1245   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1246   ret <8 x i8> %shuffle.i
1247 }
1248
1249 define <16 x i8> @test_same_vuzp2q_p8(<16 x i8> %a) {
1250 ; CHECK: test_same_vuzp2q_p8:
1251 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1252 entry:
1253   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
1254   ret <16 x i8> %shuffle.i
1255 }
1256
1257 define <4 x i16> @test_same_vuzp2_p16(<4 x i16> %a) {
1258 ; CHECK: test_same_vuzp2_p16:
1259 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1260 entry:
1261   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1262   ret <4 x i16> %shuffle.i
1263 }
1264
1265 define <8 x i16> @test_same_vuzp2q_p16(<8 x i16> %a) {
1266 ; CHECK: test_same_vuzp2q_p16:
1267 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1268 entry:
1269   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1270   ret <8 x i16> %shuffle.i
1271 }
1272
1273 define <8 x i8> @test_same_vzip1_s8(<8 x i8> %a) {
1274 ; CHECK: test_same_vzip1_s8:
1275 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1276 entry:
1277   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
1278   ret <8 x i8> %shuffle.i
1279 }
1280
1281 define <16 x i8> @test_same_vzip1q_s8(<16 x i8> %a) {
1282 ; CHECK: test_same_vzip1q_s8:
1283 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1284 entry:
1285   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 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>
1286   ret <16 x i8> %shuffle.i
1287 }
1288
1289 define <4 x i16> @test_same_vzip1_s16(<4 x i16> %a) {
1290 ; CHECK: test_same_vzip1_s16:
1291 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1292 entry:
1293   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
1294   ret <4 x i16> %shuffle.i
1295 }
1296
1297 define <8 x i16> @test_same_vzip1q_s16(<8 x i16> %a) {
1298 ; CHECK: test_same_vzip1q_s16:
1299 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1300 entry:
1301   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
1302   ret <8 x i16> %shuffle.i
1303 }
1304
1305 define <4 x i32> @test_same_vzip1q_s32(<4 x i32> %a) {
1306 ; CHECK: test_same_vzip1q_s32:
1307 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1308 entry:
1309   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
1310   ret <4 x i32> %shuffle.i
1311 }
1312
1313 define <8 x i8> @test_same_vzip1_u8(<8 x i8> %a) {
1314 ; CHECK: test_same_vzip1_u8:
1315 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1316 entry:
1317   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
1318   ret <8 x i8> %shuffle.i
1319 }
1320
1321 define <16 x i8> @test_same_vzip1q_u8(<16 x i8> %a) {
1322 ; CHECK: test_same_vzip1q_u8:
1323 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1324 entry:
1325   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 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>
1326   ret <16 x i8> %shuffle.i
1327 }
1328
1329 define <4 x i16> @test_same_vzip1_u16(<4 x i16> %a) {
1330 ; CHECK: test_same_vzip1_u16:
1331 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1332 entry:
1333   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
1334   ret <4 x i16> %shuffle.i
1335 }
1336
1337 define <8 x i16> @test_same_vzip1q_u16(<8 x i16> %a) {
1338 ; CHECK: test_same_vzip1q_u16:
1339 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1340 entry:
1341   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
1342   ret <8 x i16> %shuffle.i
1343 }
1344
1345 define <4 x i32> @test_same_vzip1q_u32(<4 x i32> %a) {
1346 ; CHECK: test_same_vzip1q_u32:
1347 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1348 entry:
1349   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
1350   ret <4 x i32> %shuffle.i
1351 }
1352
1353 define <4 x float> @test_same_vzip1q_f32(<4 x float> %a) {
1354 ; CHECK: test_same_vzip1q_f32:
1355 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1356 entry:
1357   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %a, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
1358   ret <4 x float> %shuffle.i
1359 }
1360
1361 define <8 x i8> @test_same_vzip1_p8(<8 x i8> %a) {
1362 ; CHECK: test_same_vzip1_p8:
1363 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1364 entry:
1365   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
1366   ret <8 x i8> %shuffle.i
1367 }
1368
1369 define <16 x i8> @test_same_vzip1q_p8(<16 x i8> %a) {
1370 ; CHECK: test_same_vzip1q_p8:
1371 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1372 entry:
1373   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 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>
1374   ret <16 x i8> %shuffle.i
1375 }
1376
1377 define <4 x i16> @test_same_vzip1_p16(<4 x i16> %a) {
1378 ; CHECK: test_same_vzip1_p16:
1379 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1380 entry:
1381   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
1382   ret <4 x i16> %shuffle.i
1383 }
1384
1385 define <8 x i16> @test_same_vzip1q_p16(<8 x i16> %a) {
1386 ; CHECK: test_same_vzip1q_p16:
1387 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1388 entry:
1389   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
1390   ret <8 x i16> %shuffle.i
1391 }
1392
1393 define <8 x i8> @test_same_vzip2_s8(<8 x i8> %a) {
1394 ; CHECK: test_same_vzip2_s8:
1395 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1396 entry:
1397   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
1398   ret <8 x i8> %shuffle.i
1399 }
1400
1401 define <16 x i8> @test_same_vzip2q_s8(<16 x i8> %a) {
1402 ; CHECK: test_same_vzip2q_s8:
1403 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1404 entry:
1405   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <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>
1406   ret <16 x i8> %shuffle.i
1407 }
1408
1409 define <4 x i16> @test_same_vzip2_s16(<4 x i16> %a) {
1410 ; CHECK: test_same_vzip2_s16:
1411 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1412 entry:
1413   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
1414   ret <4 x i16> %shuffle.i
1415 }
1416
1417 define <8 x i16> @test_same_vzip2q_s16(<8 x i16> %a) {
1418 ; CHECK: test_same_vzip2q_s16:
1419 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1420 entry:
1421   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
1422   ret <8 x i16> %shuffle.i
1423 }
1424
1425 define <4 x i32> @test_same_vzip2q_s32(<4 x i32> %a) {
1426 ; CHECK: test_same_vzip2q_s32:
1427 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1428 entry:
1429   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
1430   ret <4 x i32> %shuffle.i
1431 }
1432
1433 define <8 x i8> @test_same_vzip2_u8(<8 x i8> %a) {
1434 ; CHECK: test_same_vzip2_u8:
1435 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1436 entry:
1437   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
1438   ret <8 x i8> %shuffle.i
1439 }
1440
1441 define <16 x i8> @test_same_vzip2q_u8(<16 x i8> %a) {
1442 ; CHECK: test_same_vzip2q_u8:
1443 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1444 entry:
1445   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <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>
1446   ret <16 x i8> %shuffle.i
1447 }
1448
1449 define <4 x i16> @test_same_vzip2_u16(<4 x i16> %a) {
1450 ; CHECK: test_same_vzip2_u16:
1451 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1452 entry:
1453   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
1454   ret <4 x i16> %shuffle.i
1455 }
1456
1457 define <8 x i16> @test_same_vzip2q_u16(<8 x i16> %a) {
1458 ; CHECK: test_same_vzip2q_u16:
1459 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1460 entry:
1461   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
1462   ret <8 x i16> %shuffle.i
1463 }
1464
1465 define <4 x i32> @test_same_vzip2q_u32(<4 x i32> %a) {
1466 ; CHECK: test_same_vzip2q_u32:
1467 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1468 entry:
1469   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
1470   ret <4 x i32> %shuffle.i
1471 }
1472
1473 define <4 x float> @test_same_vzip2q_f32(<4 x float> %a) {
1474 ; CHECK: test_same_vzip2q_f32:
1475 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1476 entry:
1477   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %a, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
1478   ret <4 x float> %shuffle.i
1479 }
1480
1481 define <8 x i8> @test_same_vzip2_p8(<8 x i8> %a) {
1482 ; CHECK: test_same_vzip2_p8:
1483 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1484 entry:
1485   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
1486   ret <8 x i8> %shuffle.i
1487 }
1488
1489 define <16 x i8> @test_same_vzip2q_p8(<16 x i8> %a) {
1490 ; CHECK: test_same_vzip2q_p8:
1491 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1492 entry:
1493   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <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>
1494   ret <16 x i8> %shuffle.i
1495 }
1496
1497 define <4 x i16> @test_same_vzip2_p16(<4 x i16> %a) {
1498 ; CHECK: test_same_vzip2_p16:
1499 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1500 entry:
1501   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
1502   ret <4 x i16> %shuffle.i
1503 }
1504
1505 define <8 x i16> @test_same_vzip2q_p16(<8 x i16> %a) {
1506 ; CHECK: test_same_vzip2q_p16:
1507 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1508 entry:
1509   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
1510   ret <8 x i16> %shuffle.i
1511 }
1512
1513 define <8 x i8> @test_same_vtrn1_s8(<8 x i8> %a) {
1514 ; CHECK: test_same_vtrn1_s8:
1515 ; CHECK: trn1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1516 entry:
1517   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
1518   ret <8 x i8> %shuffle.i
1519 }
1520
1521 define <16 x i8> @test_same_vtrn1q_s8(<16 x i8> %a) {
1522 ; CHECK: test_same_vtrn1q_s8:
1523 ; CHECK: trn1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1524 entry:
1525   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
1526   ret <16 x i8> %shuffle.i
1527 }
1528
1529 define <4 x i16> @test_same_vtrn1_s16(<4 x i16> %a) {
1530 ; CHECK: test_same_vtrn1_s16:
1531 ; CHECK: trn1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1532 entry:
1533   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
1534   ret <4 x i16> %shuffle.i
1535 }
1536
1537 define <8 x i16> @test_same_vtrn1q_s16(<8 x i16> %a) {
1538 ; CHECK: test_same_vtrn1q_s16:
1539 ; CHECK: trn1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1540 entry:
1541   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
1542   ret <8 x i16> %shuffle.i
1543 }
1544
1545 define <4 x i32> @test_same_vtrn1q_s32(<4 x i32> %a) {
1546 ; CHECK: test_same_vtrn1q_s32:
1547 ; CHECK: trn1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1548 entry:
1549   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
1550   ret <4 x i32> %shuffle.i
1551 }
1552
1553 define <8 x i8> @test_same_vtrn1_u8(<8 x i8> %a) {
1554 ; CHECK: test_same_vtrn1_u8:
1555 ; CHECK: trn1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1556 entry:
1557   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
1558   ret <8 x i8> %shuffle.i
1559 }
1560
1561 define <16 x i8> @test_same_vtrn1q_u8(<16 x i8> %a) {
1562 ; CHECK: test_same_vtrn1q_u8:
1563 ; CHECK: trn1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1564 entry:
1565   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
1566   ret <16 x i8> %shuffle.i
1567 }
1568
1569 define <4 x i16> @test_same_vtrn1_u16(<4 x i16> %a) {
1570 ; CHECK: test_same_vtrn1_u16:
1571 ; CHECK: trn1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1572 entry:
1573   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
1574   ret <4 x i16> %shuffle.i
1575 }
1576
1577 define <8 x i16> @test_same_vtrn1q_u16(<8 x i16> %a) {
1578 ; CHECK: test_same_vtrn1q_u16:
1579 ; CHECK: trn1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1580 entry:
1581   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
1582   ret <8 x i16> %shuffle.i
1583 }
1584
1585 define <4 x i32> @test_same_vtrn1q_u32(<4 x i32> %a) {
1586 ; CHECK: test_same_vtrn1q_u32:
1587 ; CHECK: trn1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1588 entry:
1589   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
1590   ret <4 x i32> %shuffle.i
1591 }
1592
1593 define <4 x float> @test_same_vtrn1q_f32(<4 x float> %a) {
1594 ; CHECK: test_same_vtrn1q_f32:
1595 ; CHECK: trn1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1596 entry:
1597   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %a, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
1598   ret <4 x float> %shuffle.i
1599 }
1600
1601 define <8 x i8> @test_same_vtrn1_p8(<8 x i8> %a) {
1602 ; CHECK: test_same_vtrn1_p8:
1603 ; CHECK: trn1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1604 entry:
1605   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
1606   ret <8 x i8> %shuffle.i
1607 }
1608
1609 define <16 x i8> @test_same_vtrn1q_p8(<16 x i8> %a) {
1610 ; CHECK: test_same_vtrn1q_p8:
1611 ; CHECK: trn1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1612 entry:
1613   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
1614   ret <16 x i8> %shuffle.i
1615 }
1616
1617 define <4 x i16> @test_same_vtrn1_p16(<4 x i16> %a) {
1618 ; CHECK: test_same_vtrn1_p16:
1619 ; CHECK: trn1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1620 entry:
1621   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
1622   ret <4 x i16> %shuffle.i
1623 }
1624
1625 define <8 x i16> @test_same_vtrn1q_p16(<8 x i16> %a) {
1626 ; CHECK: test_same_vtrn1q_p16:
1627 ; CHECK: trn1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1628 entry:
1629   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
1630   ret <8 x i16> %shuffle.i
1631 }
1632
1633 define <8 x i8> @test_same_vtrn2_s8(<8 x i8> %a) {
1634 ; CHECK: test_same_vtrn2_s8:
1635 ; CHECK: trn2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1636 entry:
1637   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
1638   ret <8 x i8> %shuffle.i
1639 }
1640
1641 define <16 x i8> @test_same_vtrn2q_s8(<16 x i8> %a) {
1642 ; CHECK: test_same_vtrn2q_s8:
1643 ; CHECK: trn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1644 entry:
1645   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
1646   ret <16 x i8> %shuffle.i
1647 }
1648
1649 define <4 x i16> @test_same_vtrn2_s16(<4 x i16> %a) {
1650 ; CHECK: test_same_vtrn2_s16:
1651 ; CHECK: trn2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1652 entry:
1653   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
1654   ret <4 x i16> %shuffle.i
1655 }
1656
1657 define <8 x i16> @test_same_vtrn2q_s16(<8 x i16> %a) {
1658 ; CHECK: test_same_vtrn2q_s16:
1659 ; CHECK: trn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1660 entry:
1661   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
1662   ret <8 x i16> %shuffle.i
1663 }
1664
1665 define <4 x i32> @test_same_vtrn2q_s32(<4 x i32> %a) {
1666 ; CHECK: test_same_vtrn2q_s32:
1667 ; CHECK: trn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1668 entry:
1669   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
1670   ret <4 x i32> %shuffle.i
1671 }
1672
1673 define <8 x i8> @test_same_vtrn2_u8(<8 x i8> %a) {
1674 ; CHECK: test_same_vtrn2_u8:
1675 ; CHECK: trn2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1676 entry:
1677   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
1678   ret <8 x i8> %shuffle.i
1679 }
1680
1681 define <16 x i8> @test_same_vtrn2q_u8(<16 x i8> %a) {
1682 ; CHECK: test_same_vtrn2q_u8:
1683 ; CHECK: trn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1684 entry:
1685   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
1686   ret <16 x i8> %shuffle.i
1687 }
1688
1689 define <4 x i16> @test_same_vtrn2_u16(<4 x i16> %a) {
1690 ; CHECK: test_same_vtrn2_u16:
1691 ; CHECK: trn2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1692 entry:
1693   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
1694   ret <4 x i16> %shuffle.i
1695 }
1696
1697 define <8 x i16> @test_same_vtrn2q_u16(<8 x i16> %a) {
1698 ; CHECK: test_same_vtrn2q_u16:
1699 ; CHECK: trn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1700 entry:
1701   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
1702   ret <8 x i16> %shuffle.i
1703 }
1704
1705 define <4 x i32> @test_same_vtrn2q_u32(<4 x i32> %a) {
1706 ; CHECK: test_same_vtrn2q_u32:
1707 ; CHECK: trn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1708 entry:
1709   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
1710   ret <4 x i32> %shuffle.i
1711 }
1712
1713 define <4 x float> @test_same_vtrn2q_f32(<4 x float> %a) {
1714 ; CHECK: test_same_vtrn2q_f32:
1715 ; CHECK: trn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1716 entry:
1717   %shuffle.i = shufflevector <4 x float> %a, <4 x float> %a, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
1718   ret <4 x float> %shuffle.i
1719 }
1720
1721 define <8 x i8> @test_same_vtrn2_p8(<8 x i8> %a) {
1722 ; CHECK: test_same_vtrn2_p8:
1723 ; CHECK: trn2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1724 entry:
1725   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
1726   ret <8 x i8> %shuffle.i
1727 }
1728
1729 define <16 x i8> @test_same_vtrn2q_p8(<16 x i8> %a) {
1730 ; CHECK: test_same_vtrn2q_p8:
1731 ; CHECK: trn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1732 entry:
1733   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
1734   ret <16 x i8> %shuffle.i
1735 }
1736
1737 define <4 x i16> @test_same_vtrn2_p16(<4 x i16> %a) {
1738 ; CHECK: test_same_vtrn2_p16:
1739 ; CHECK: trn2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1740 entry:
1741   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
1742   ret <4 x i16> %shuffle.i
1743 }
1744
1745 define <8 x i16> @test_same_vtrn2q_p16(<8 x i16> %a) {
1746 ; CHECK: test_same_vtrn2q_p16:
1747 ; CHECK: trn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1748 entry:
1749   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
1750   ret <8 x i16> %shuffle.i
1751 }
1752
1753
1754 define <8 x i8> @test_undef_vuzp1_s8(<8 x i8> %a) {
1755 ; CHECK: test_undef_vuzp1_s8:
1756 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1757 entry:
1758   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1759   ret <8 x i8> %shuffle.i
1760 }
1761
1762 define <16 x i8> @test_undef_vuzp1q_s8(<16 x i8> %a) {
1763 ; CHECK: test_undef_vuzp1q_s8:
1764 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1765 entry:
1766   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
1767   ret <16 x i8> %shuffle.i
1768 }
1769
1770 define <4 x i16> @test_undef_vuzp1_s16(<4 x i16> %a) {
1771 ; CHECK: test_undef_vuzp1_s16:
1772 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1773 entry:
1774   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1775   ret <4 x i16> %shuffle.i
1776 }
1777
1778 define <8 x i16> @test_undef_vuzp1q_s16(<8 x i16> %a) {
1779 ; CHECK: test_undef_vuzp1q_s16:
1780 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1781 entry:
1782   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1783   ret <8 x i16> %shuffle.i
1784 }
1785
1786 define <4 x i32> @test_undef_vuzp1q_s32(<4 x i32> %a) {
1787 ; CHECK: test_undef_vuzp1q_s32:
1788 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1789 entry:
1790   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1791   ret <4 x i32> %shuffle.i
1792 }
1793
1794 define <8 x i8> @test_undef_vuzp1_u8(<8 x i8> %a) {
1795 ; CHECK: test_undef_vuzp1_u8:
1796 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1797 entry:
1798   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1799   ret <8 x i8> %shuffle.i
1800 }
1801
1802 define <16 x i8> @test_undef_vuzp1q_u8(<16 x i8> %a) {
1803 ; CHECK: test_undef_vuzp1q_u8:
1804 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1805 entry:
1806   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
1807   ret <16 x i8> %shuffle.i
1808 }
1809
1810 define <4 x i16> @test_undef_vuzp1_u16(<4 x i16> %a) {
1811 ; CHECK: test_undef_vuzp1_u16:
1812 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1813 entry:
1814   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1815   ret <4 x i16> %shuffle.i
1816 }
1817
1818 define <8 x i16> @test_undef_vuzp1q_u16(<8 x i16> %a) {
1819 ; CHECK: test_undef_vuzp1q_u16:
1820 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1821 entry:
1822   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1823   ret <8 x i16> %shuffle.i
1824 }
1825
1826 define <4 x i32> @test_undef_vuzp1q_u32(<4 x i32> %a) {
1827 ; CHECK: test_undef_vuzp1q_u32:
1828 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1829 entry:
1830   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1831   ret <4 x i32> %shuffle.i
1832 }
1833
1834 define <4 x float> @test_undef_vuzp1q_f32(<4 x float> %a) {
1835 ; CHECK: test_undef_vuzp1q_f32:
1836 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1837 entry:
1838   %shuffle.i = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1839   ret <4 x float> %shuffle.i
1840 }
1841
1842 define <8 x i8> @test_undef_vuzp1_p8(<8 x i8> %a) {
1843 ; CHECK: test_undef_vuzp1_p8:
1844 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1845 entry:
1846   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1847   ret <8 x i8> %shuffle.i
1848 }
1849
1850 define <16 x i8> @test_undef_vuzp1q_p8(<16 x i8> %a) {
1851 ; CHECK: test_undef_vuzp1q_p8:
1852 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1853 entry:
1854   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
1855   ret <16 x i8> %shuffle.i
1856 }
1857
1858 define <4 x i16> @test_undef_vuzp1_p16(<4 x i16> %a) {
1859 ; CHECK: test_undef_vuzp1_p16:
1860 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1861 entry:
1862   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
1863   ret <4 x i16> %shuffle.i
1864 }
1865
1866 define <8 x i16> @test_undef_vuzp1q_p16(<8 x i16> %a) {
1867 ; CHECK: test_undef_vuzp1q_p16:
1868 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1869 entry:
1870   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
1871   ret <8 x i16> %shuffle.i
1872 }
1873
1874 define <8 x i8> @test_undef_vuzp2_s8(<8 x i8> %a) {
1875 ; CHECK: test_undef_vuzp2_s8:
1876 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1877 entry:
1878   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1879   ret <8 x i8> %shuffle.i
1880 }
1881
1882 define <16 x i8> @test_undef_vuzp2q_s8(<16 x i8> %a) {
1883 ; CHECK: test_undef_vuzp2q_s8:
1884 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1885 entry:
1886   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
1887   ret <16 x i8> %shuffle.i
1888 }
1889
1890 define <4 x i16> @test_undef_vuzp2_s16(<4 x i16> %a) {
1891 ; CHECK: test_undef_vuzp2_s16:
1892 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1893 entry:
1894   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1895   ret <4 x i16> %shuffle.i
1896 }
1897
1898 define <8 x i16> @test_undef_vuzp2q_s16(<8 x i16> %a) {
1899 ; CHECK: test_undef_vuzp2q_s16:
1900 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1901 entry:
1902   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1903   ret <8 x i16> %shuffle.i
1904 }
1905
1906 define <4 x i32> @test_undef_vuzp2q_s32(<4 x i32> %a) {
1907 ; CHECK: test_undef_vuzp2q_s32:
1908 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1909 entry:
1910   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1911   ret <4 x i32> %shuffle.i
1912 }
1913
1914 define <8 x i8> @test_undef_vuzp2_u8(<8 x i8> %a) {
1915 ; CHECK: test_undef_vuzp2_u8:
1916 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1917 entry:
1918   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1919   ret <8 x i8> %shuffle.i
1920 }
1921
1922 define <16 x i8> @test_undef_vuzp2q_u8(<16 x i8> %a) {
1923 ; CHECK: test_undef_vuzp2q_u8:
1924 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1925 entry:
1926   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
1927   ret <16 x i8> %shuffle.i
1928 }
1929
1930 define <4 x i16> @test_undef_vuzp2_u16(<4 x i16> %a) {
1931 ; CHECK: test_undef_vuzp2_u16:
1932 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1933 entry:
1934   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1935   ret <4 x i16> %shuffle.i
1936 }
1937
1938 define <8 x i16> @test_undef_vuzp2q_u16(<8 x i16> %a) {
1939 ; CHECK: test_undef_vuzp2q_u16:
1940 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1941 entry:
1942   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1943   ret <8 x i16> %shuffle.i
1944 }
1945
1946 define <4 x i32> @test_undef_vuzp2q_u32(<4 x i32> %a) {
1947 ; CHECK: test_undef_vuzp2q_u32:
1948 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1949 entry:
1950   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1951   ret <4 x i32> %shuffle.i
1952 }
1953
1954 define <4 x float> @test_undef_vuzp2q_f32(<4 x float> %a) {
1955 ; CHECK: test_undef_vuzp2q_f32:
1956 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1957 entry:
1958   %shuffle.i = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1959   ret <4 x float> %shuffle.i
1960 }
1961
1962 define <8 x i8> @test_undef_vuzp2_p8(<8 x i8> %a) {
1963 ; CHECK: test_undef_vuzp2_p8:
1964 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1965 entry:
1966   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1967   ret <8 x i8> %shuffle.i
1968 }
1969
1970 define <16 x i8> @test_undef_vuzp2q_p8(<16 x i8> %a) {
1971 ; CHECK: test_undef_vuzp2q_p8:
1972 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1973 entry:
1974   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
1975   ret <16 x i8> %shuffle.i
1976 }
1977
1978 define <4 x i16> @test_undef_vuzp2_p16(<4 x i16> %a) {
1979 ; CHECK: test_undef_vuzp2_p16:
1980 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1981 entry:
1982   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
1983   ret <4 x i16> %shuffle.i
1984 }
1985
1986 define <8 x i16> @test_undef_vuzp2q_p16(<8 x i16> %a) {
1987 ; CHECK: test_undef_vuzp2q_p16:
1988 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1989 entry:
1990   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
1991   ret <8 x i16> %shuffle.i
1992 }
1993
1994 define <8 x i8> @test_undef_vzip1_s8(<8 x i8> %a) {
1995 ; CHECK: test_undef_vzip1_s8:
1996 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1997 entry:
1998   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
1999   ret <8 x i8> %shuffle.i
2000 }
2001
2002 define <16 x i8> @test_undef_vzip1q_s8(<16 x i8> %a) {
2003 ; CHECK: test_undef_vzip1q_s8:
2004 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2005 entry:
2006   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 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>
2007   ret <16 x i8> %shuffle.i
2008 }
2009
2010 define <4 x i16> @test_undef_vzip1_s16(<4 x i16> %a) {
2011 ; CHECK: test_undef_vzip1_s16:
2012 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2013 entry:
2014   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2015   ret <4 x i16> %shuffle.i
2016 }
2017
2018 define <8 x i16> @test_undef_vzip1q_s16(<8 x i16> %a) {
2019 ; CHECK: test_undef_vzip1q_s16:
2020 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2021 entry:
2022   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2023   ret <8 x i16> %shuffle.i
2024 }
2025
2026 define <4 x i32> @test_undef_vzip1q_s32(<4 x i32> %a) {
2027 ; CHECK: test_undef_vzip1q_s32:
2028 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2029 entry:
2030   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2031   ret <4 x i32> %shuffle.i
2032 }
2033
2034 define <8 x i8> @test_undef_vzip1_u8(<8 x i8> %a) {
2035 ; CHECK: test_undef_vzip1_u8:
2036 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2037 entry:
2038   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2039   ret <8 x i8> %shuffle.i
2040 }
2041
2042 define <16 x i8> @test_undef_vzip1q_u8(<16 x i8> %a) {
2043 ; CHECK: test_undef_vzip1q_u8:
2044 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2045 entry:
2046   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 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>
2047   ret <16 x i8> %shuffle.i
2048 }
2049
2050 define <4 x i16> @test_undef_vzip1_u16(<4 x i16> %a) {
2051 ; CHECK: test_undef_vzip1_u16:
2052 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2053 entry:
2054   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2055   ret <4 x i16> %shuffle.i
2056 }
2057
2058 define <8 x i16> @test_undef_vzip1q_u16(<8 x i16> %a) {
2059 ; CHECK: test_undef_vzip1q_u16:
2060 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2061 entry:
2062   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2063   ret <8 x i16> %shuffle.i
2064 }
2065
2066 define <4 x i32> @test_undef_vzip1q_u32(<4 x i32> %a) {
2067 ; CHECK: test_undef_vzip1q_u32:
2068 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2069 entry:
2070   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2071   ret <4 x i32> %shuffle.i
2072 }
2073
2074 define <4 x float> @test_undef_vzip1q_f32(<4 x float> %a) {
2075 ; CHECK: test_undef_vzip1q_f32:
2076 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2077 entry:
2078   %shuffle.i = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2079   ret <4 x float> %shuffle.i
2080 }
2081
2082 define <8 x i8> @test_undef_vzip1_p8(<8 x i8> %a) {
2083 ; CHECK: test_undef_vzip1_p8:
2084 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2085 entry:
2086   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2087   ret <8 x i8> %shuffle.i
2088 }
2089
2090 define <16 x i8> @test_undef_vzip1q_p8(<16 x i8> %a) {
2091 ; CHECK: test_undef_vzip1q_p8:
2092 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2093 entry:
2094   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 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>
2095   ret <16 x i8> %shuffle.i
2096 }
2097
2098 define <4 x i16> @test_undef_vzip1_p16(<4 x i16> %a) {
2099 ; CHECK: test_undef_vzip1_p16:
2100 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2101 entry:
2102   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2103   ret <4 x i16> %shuffle.i
2104 }
2105
2106 define <8 x i16> @test_undef_vzip1q_p16(<8 x i16> %a) {
2107 ; CHECK: test_undef_vzip1q_p16:
2108 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2109 entry:
2110   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2111   ret <8 x i16> %shuffle.i
2112 }
2113
2114 define <8 x i8> @test_undef_vzip2_s8(<8 x i8> %a) {
2115 ; CHECK: test_undef_vzip2_s8:
2116 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2117 entry:
2118   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2119   ret <8 x i8> %shuffle.i
2120 }
2121
2122 define <16 x i8> @test_undef_vzip2q_s8(<16 x i8> %a) {
2123 ; CHECK: test_undef_vzip2q_s8:
2124 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2125 entry:
2126   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <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>
2127   ret <16 x i8> %shuffle.i
2128 }
2129
2130 define <4 x i16> @test_undef_vzip2_s16(<4 x i16> %a) {
2131 ; CHECK: test_undef_vzip2_s16:
2132 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2133 entry:
2134   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2135   ret <4 x i16> %shuffle.i
2136 }
2137
2138 define <8 x i16> @test_undef_vzip2q_s16(<8 x i16> %a) {
2139 ; CHECK: test_undef_vzip2q_s16:
2140 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2141 entry:
2142   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2143   ret <8 x i16> %shuffle.i
2144 }
2145
2146 define <4 x i32> @test_undef_vzip2q_s32(<4 x i32> %a) {
2147 ; CHECK: test_undef_vzip2q_s32:
2148 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2149 entry:
2150   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2151   ret <4 x i32> %shuffle.i
2152 }
2153
2154 define <8 x i8> @test_undef_vzip2_u8(<8 x i8> %a) {
2155 ; CHECK: test_undef_vzip2_u8:
2156 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2157 entry:
2158   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2159   ret <8 x i8> %shuffle.i
2160 }
2161
2162 define <16 x i8> @test_undef_vzip2q_u8(<16 x i8> %a) {
2163 ; CHECK: test_undef_vzip2q_u8:
2164 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2165 entry:
2166   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <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>
2167   ret <16 x i8> %shuffle.i
2168 }
2169
2170 define <4 x i16> @test_undef_vzip2_u16(<4 x i16> %a) {
2171 ; CHECK: test_undef_vzip2_u16:
2172 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2173 entry:
2174   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2175   ret <4 x i16> %shuffle.i
2176 }
2177
2178 define <8 x i16> @test_undef_vzip2q_u16(<8 x i16> %a) {
2179 ; CHECK: test_undef_vzip2q_u16:
2180 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2181 entry:
2182   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2183   ret <8 x i16> %shuffle.i
2184 }
2185
2186 define <4 x i32> @test_undef_vzip2q_u32(<4 x i32> %a) {
2187 ; CHECK: test_undef_vzip2q_u32:
2188 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2189 entry:
2190   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2191   ret <4 x i32> %shuffle.i
2192 }
2193
2194 define <4 x float> @test_undef_vzip2q_f32(<4 x float> %a) {
2195 ; CHECK: test_undef_vzip2q_f32:
2196 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2197 entry:
2198   %shuffle.i = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2199   ret <4 x float> %shuffle.i
2200 }
2201
2202 define <8 x i8> @test_undef_vzip2_p8(<8 x i8> %a) {
2203 ; CHECK: test_undef_vzip2_p8:
2204 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2205 entry:
2206   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2207   ret <8 x i8> %shuffle.i
2208 }
2209
2210 define <16 x i8> @test_undef_vzip2q_p8(<16 x i8> %a) {
2211 ; CHECK: test_undef_vzip2q_p8:
2212 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2213 entry:
2214   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <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>
2215   ret <16 x i8> %shuffle.i
2216 }
2217
2218 define <4 x i16> @test_undef_vzip2_p16(<4 x i16> %a) {
2219 ; CHECK: test_undef_vzip2_p16:
2220 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2221 entry:
2222   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2223   ret <4 x i16> %shuffle.i
2224 }
2225
2226 define <8 x i16> @test_undef_vzip2q_p16(<8 x i16> %a) {
2227 ; CHECK: test_undef_vzip2q_p16:
2228 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2229 entry:
2230   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2231   ret <8 x i16> %shuffle.i
2232 }
2233
2234 define <8 x i8> @test_undef_vtrn1_s8(<8 x i8> %a) {
2235 ; CHECK: test_undef_vtrn1_s8:
2236 ; CHECK: ret
2237 entry:
2238   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
2239   ret <8 x i8> %shuffle.i
2240 }
2241
2242 define <16 x i8> @test_undef_vtrn1q_s8(<16 x i8> %a) {
2243 ; CHECK: test_undef_vtrn1q_s8:
2244 ; CHECK: ret
2245 entry:
2246   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
2247   ret <16 x i8> %shuffle.i
2248 }
2249
2250 define <4 x i16> @test_undef_vtrn1_s16(<4 x i16> %a) {
2251 ; CHECK: test_undef_vtrn1_s16:
2252 ; CHECK: ret
2253 entry:
2254   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
2255   ret <4 x i16> %shuffle.i
2256 }
2257
2258 define <8 x i16> @test_undef_vtrn1q_s16(<8 x i16> %a) {
2259 ; CHECK: test_undef_vtrn1q_s16:
2260 ; CHECK: ret
2261 entry:
2262   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
2263   ret <8 x i16> %shuffle.i
2264 }
2265
2266 define <4 x i32> @test_undef_vtrn1q_s32(<4 x i32> %a) {
2267 ; CHECK: test_undef_vtrn1q_s32:
2268 ; CHECK: ret
2269 entry:
2270   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
2271   ret <4 x i32> %shuffle.i
2272 }
2273
2274 define <8 x i8> @test_undef_vtrn1_u8(<8 x i8> %a) {
2275 ; CHECK: test_undef_vtrn1_u8:
2276 ; CHECK: ret
2277 entry:
2278   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
2279   ret <8 x i8> %shuffle.i
2280 }
2281
2282 define <16 x i8> @test_undef_vtrn1q_u8(<16 x i8> %a) {
2283 ; CHECK: test_undef_vtrn1q_u8:
2284 ; CHECK: ret
2285 entry:
2286   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
2287   ret <16 x i8> %shuffle.i
2288 }
2289
2290 define <4 x i16> @test_undef_vtrn1_u16(<4 x i16> %a) {
2291 ; CHECK: test_undef_vtrn1_u16:
2292 ; CHECK: ret
2293 entry:
2294   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
2295   ret <4 x i16> %shuffle.i
2296 }
2297
2298 define <8 x i16> @test_undef_vtrn1q_u16(<8 x i16> %a) {
2299 ; CHECK: test_undef_vtrn1q_u16:
2300 ; CHECK: ret
2301 entry:
2302   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
2303   ret <8 x i16> %shuffle.i
2304 }
2305
2306 define <4 x i32> @test_undef_vtrn1q_u32(<4 x i32> %a) {
2307 ; CHECK: test_undef_vtrn1q_u32:
2308 ; CHECK: ret
2309 entry:
2310   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
2311   ret <4 x i32> %shuffle.i
2312 }
2313
2314 define <4 x float> @test_undef_vtrn1q_f32(<4 x float> %a) {
2315 ; CHECK: test_undef_vtrn1q_f32:
2316 ; CHECK: ret
2317 entry:
2318   %shuffle.i = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
2319   ret <4 x float> %shuffle.i
2320 }
2321
2322 define <8 x i8> @test_undef_vtrn1_p8(<8 x i8> %a) {
2323 ; CHECK: test_undef_vtrn1_p8:
2324 ; CHECK: ret
2325 entry:
2326   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
2327   ret <8 x i8> %shuffle.i
2328 }
2329
2330 define <16 x i8> @test_undef_vtrn1q_p8(<16 x i8> %a) {
2331 ; CHECK: test_undef_vtrn1q_p8:
2332 ; CHECK: ret
2333 entry:
2334   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
2335   ret <16 x i8> %shuffle.i
2336 }
2337
2338 define <4 x i16> @test_undef_vtrn1_p16(<4 x i16> %a) {
2339 ; CHECK: test_undef_vtrn1_p16:
2340 ; CHECK: ret
2341 entry:
2342   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
2343   ret <4 x i16> %shuffle.i
2344 }
2345
2346 define <8 x i16> @test_undef_vtrn1q_p16(<8 x i16> %a) {
2347 ; CHECK: test_undef_vtrn1q_p16:
2348 ; CHECK: ret
2349 entry:
2350   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
2351   ret <8 x i16> %shuffle.i
2352 }
2353
2354 define <8 x i8> @test_undef_vtrn2_s8(<8 x i8> %a) {
2355 ; CHECK: test_undef_vtrn2_s8:
2356 ; CHECK: rev16 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2357 entry:
2358   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
2359   ret <8 x i8> %shuffle.i
2360 }
2361
2362 define <16 x i8> @test_undef_vtrn2q_s8(<16 x i8> %a) {
2363 ; CHECK: test_undef_vtrn2q_s8:
2364 ; CHECK: rev16 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2365 entry:
2366   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
2367   ret <16 x i8> %shuffle.i
2368 }
2369
2370 define <4 x i16> @test_undef_vtrn2_s16(<4 x i16> %a) {
2371 ; CHECK: test_undef_vtrn2_s16:
2372 ; CHECK: rev32 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2373 entry:
2374   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
2375   ret <4 x i16> %shuffle.i
2376 }
2377
2378 define <8 x i16> @test_undef_vtrn2q_s16(<8 x i16> %a) {
2379 ; CHECK: test_undef_vtrn2q_s16:
2380 ; CHECK: rev32 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2381 entry:
2382   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
2383   ret <8 x i16> %shuffle.i
2384 }
2385
2386 define <4 x i32> @test_undef_vtrn2q_s32(<4 x i32> %a) {
2387 ; CHECK: test_undef_vtrn2q_s32:
2388 ; CHECK: rev64 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2389 entry:
2390   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
2391   ret <4 x i32> %shuffle.i
2392 }
2393
2394 define <8 x i8> @test_undef_vtrn2_u8(<8 x i8> %a) {
2395 ; CHECK: test_undef_vtrn2_u8:
2396 ; CHECK: rev16 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2397 entry:
2398   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
2399   ret <8 x i8> %shuffle.i
2400 }
2401
2402 define <16 x i8> @test_undef_vtrn2q_u8(<16 x i8> %a) {
2403 ; CHECK: test_undef_vtrn2q_u8:
2404 ; CHECK: rev16 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2405 entry:
2406   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
2407   ret <16 x i8> %shuffle.i
2408 }
2409
2410 define <4 x i16> @test_undef_vtrn2_u16(<4 x i16> %a) {
2411 ; CHECK: test_undef_vtrn2_u16:
2412 ; CHECK: rev32 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2413 entry:
2414   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
2415   ret <4 x i16> %shuffle.i
2416 }
2417
2418 define <8 x i16> @test_undef_vtrn2q_u16(<8 x i16> %a) {
2419 ; CHECK: test_undef_vtrn2q_u16:
2420 ; CHECK: rev32 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2421 entry:
2422   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
2423   ret <8 x i16> %shuffle.i
2424 }
2425
2426 define <4 x i32> @test_undef_vtrn2q_u32(<4 x i32> %a) {
2427 ; CHECK: test_undef_vtrn2q_u32:
2428 ; CHECK: rev64 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2429 entry:
2430   %shuffle.i = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
2431   ret <4 x i32> %shuffle.i
2432 }
2433
2434 define <4 x float> @test_undef_vtrn2q_f32(<4 x float> %a) {
2435 ; CHECK: test_undef_vtrn2q_f32:
2436 ; CHECK: rev64 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2437 entry:
2438   %shuffle.i = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
2439   ret <4 x float> %shuffle.i
2440 }
2441
2442 define <8 x i8> @test_undef_vtrn2_p8(<8 x i8> %a) {
2443 ; CHECK: test_undef_vtrn2_p8:
2444 ; CHECK: rev16 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2445 entry:
2446   %shuffle.i = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
2447   ret <8 x i8> %shuffle.i
2448 }
2449
2450 define <16 x i8> @test_undef_vtrn2q_p8(<16 x i8> %a) {
2451 ; CHECK: test_undef_vtrn2q_p8:
2452 ; CHECK: rev16 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2453 entry:
2454   %shuffle.i = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
2455   ret <16 x i8> %shuffle.i
2456 }
2457
2458 define <4 x i16> @test_undef_vtrn2_p16(<4 x i16> %a) {
2459 ; CHECK: test_undef_vtrn2_p16:
2460 ; CHECK: rev32 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2461 entry:
2462   %shuffle.i = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
2463   ret <4 x i16> %shuffle.i
2464 }
2465
2466 define <8 x i16> @test_undef_vtrn2q_p16(<8 x i16> %a) {
2467 ; CHECK: test_undef_vtrn2q_p16:
2468 ; CHECK: rev32 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2469 entry:
2470   %shuffle.i = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
2471   ret <8 x i16> %shuffle.i
2472 }
2473
2474 define %struct.int8x8x2_t @test_vuzp_s8(<8 x i8> %a, <8 x i8> %b) {
2475 ; CHECK: test_vuzp_s8:
2476 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2477 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2478 entry:
2479   %vuzp.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
2480   %vuzp1.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
2481   %.fca.0.0.insert = insertvalue %struct.int8x8x2_t undef, <8 x i8> %vuzp.i, 0, 0
2482   %.fca.0.1.insert = insertvalue %struct.int8x8x2_t %.fca.0.0.insert, <8 x i8> %vuzp1.i, 0, 1
2483   ret %struct.int8x8x2_t %.fca.0.1.insert
2484 }
2485
2486 define %struct.int16x4x2_t @test_vuzp_s16(<4 x i16> %a, <4 x i16> %b) {
2487 ; CHECK: test_vuzp_s16:
2488 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2489 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2490 entry:
2491   %vuzp.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
2492   %vuzp1.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
2493   %.fca.0.0.insert = insertvalue %struct.int16x4x2_t undef, <4 x i16> %vuzp.i, 0, 0
2494   %.fca.0.1.insert = insertvalue %struct.int16x4x2_t %.fca.0.0.insert, <4 x i16> %vuzp1.i, 0, 1
2495   ret %struct.int16x4x2_t %.fca.0.1.insert
2496 }
2497
2498 define %struct.int32x2x2_t @test_vuzp_s32(<2 x i32> %a, <2 x i32> %b) {
2499 ; CHECK: test_vuzp_s32:
2500 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
2501 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
2502 entry:
2503   %vuzp.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
2504   %vuzp1.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
2505   %.fca.0.0.insert = insertvalue %struct.int32x2x2_t undef, <2 x i32> %vuzp.i, 0, 0
2506   %.fca.0.1.insert = insertvalue %struct.int32x2x2_t %.fca.0.0.insert, <2 x i32> %vuzp1.i, 0, 1
2507   ret %struct.int32x2x2_t %.fca.0.1.insert
2508 }
2509
2510 define %struct.uint8x8x2_t @test_vuzp_u8(<8 x i8> %a, <8 x i8> %b) {
2511 ; CHECK: test_vuzp_u8:
2512 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2513 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2514 entry:
2515   %vuzp.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
2516   %vuzp1.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
2517   %.fca.0.0.insert = insertvalue %struct.uint8x8x2_t undef, <8 x i8> %vuzp.i, 0, 0
2518   %.fca.0.1.insert = insertvalue %struct.uint8x8x2_t %.fca.0.0.insert, <8 x i8> %vuzp1.i, 0, 1
2519   ret %struct.uint8x8x2_t %.fca.0.1.insert
2520 }
2521
2522 define %struct.uint16x4x2_t @test_vuzp_u16(<4 x i16> %a, <4 x i16> %b) {
2523 ; CHECK: test_vuzp_u16:
2524 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2525 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2526 entry:
2527   %vuzp.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
2528   %vuzp1.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
2529   %.fca.0.0.insert = insertvalue %struct.uint16x4x2_t undef, <4 x i16> %vuzp.i, 0, 0
2530   %.fca.0.1.insert = insertvalue %struct.uint16x4x2_t %.fca.0.0.insert, <4 x i16> %vuzp1.i, 0, 1
2531   ret %struct.uint16x4x2_t %.fca.0.1.insert
2532 }
2533
2534 define %struct.uint32x2x2_t @test_vuzp_u32(<2 x i32> %a, <2 x i32> %b) {
2535 ; CHECK: test_vuzp_u32:
2536 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
2537 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
2538 entry:
2539   %vuzp.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
2540   %vuzp1.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
2541   %.fca.0.0.insert = insertvalue %struct.uint32x2x2_t undef, <2 x i32> %vuzp.i, 0, 0
2542   %.fca.0.1.insert = insertvalue %struct.uint32x2x2_t %.fca.0.0.insert, <2 x i32> %vuzp1.i, 0, 1
2543   ret %struct.uint32x2x2_t %.fca.0.1.insert
2544 }
2545
2546 define %struct.float32x2x2_t @test_vuzp_f32(<2 x float> %a, <2 x float> %b) {
2547 ; CHECK: test_vuzp_f32:
2548 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
2549 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
2550 entry:
2551   %vuzp.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 0, i32 2>
2552   %vuzp1.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 1, i32 3>
2553   %.fca.0.0.insert = insertvalue %struct.float32x2x2_t undef, <2 x float> %vuzp.i, 0, 0
2554   %.fca.0.1.insert = insertvalue %struct.float32x2x2_t %.fca.0.0.insert, <2 x float> %vuzp1.i, 0, 1
2555   ret %struct.float32x2x2_t %.fca.0.1.insert
2556 }
2557
2558 define %struct.poly8x8x2_t @test_vuzp_p8(<8 x i8> %a, <8 x i8> %b) {
2559 ; CHECK: test_vuzp_p8:
2560 ; CHECK: uzp1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2561 ; CHECK: uzp2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2562 entry:
2563   %vuzp.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
2564   %vuzp1.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
2565   %.fca.0.0.insert = insertvalue %struct.poly8x8x2_t undef, <8 x i8> %vuzp.i, 0, 0
2566   %.fca.0.1.insert = insertvalue %struct.poly8x8x2_t %.fca.0.0.insert, <8 x i8> %vuzp1.i, 0, 1
2567   ret %struct.poly8x8x2_t %.fca.0.1.insert
2568 }
2569
2570 define %struct.poly16x4x2_t @test_vuzp_p16(<4 x i16> %a, <4 x i16> %b) {
2571 ; CHECK: test_vuzp_p16:
2572 ; CHECK: uzp1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2573 ; CHECK: uzp2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2574 entry:
2575   %vuzp.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
2576   %vuzp1.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
2577   %.fca.0.0.insert = insertvalue %struct.poly16x4x2_t undef, <4 x i16> %vuzp.i, 0, 0
2578   %.fca.0.1.insert = insertvalue %struct.poly16x4x2_t %.fca.0.0.insert, <4 x i16> %vuzp1.i, 0, 1
2579   ret %struct.poly16x4x2_t %.fca.0.1.insert
2580 }
2581
2582 define %struct.int8x16x2_t @test_vuzpq_s8(<16 x i8> %a, <16 x i8> %b) {
2583 ; CHECK: test_vuzpq_s8:
2584 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2585 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2586 entry:
2587   %vuzp.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
2588   %vuzp1.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
2589   %.fca.0.0.insert = insertvalue %struct.int8x16x2_t undef, <16 x i8> %vuzp.i, 0, 0
2590   %.fca.0.1.insert = insertvalue %struct.int8x16x2_t %.fca.0.0.insert, <16 x i8> %vuzp1.i, 0, 1
2591   ret %struct.int8x16x2_t %.fca.0.1.insert
2592 }
2593
2594 define %struct.int16x8x2_t @test_vuzpq_s16(<8 x i16> %a, <8 x i16> %b) {
2595 ; CHECK: test_vuzpq_s16:
2596 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2597 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2598 entry:
2599   %vuzp.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
2600   %vuzp1.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
2601   %.fca.0.0.insert = insertvalue %struct.int16x8x2_t undef, <8 x i16> %vuzp.i, 0, 0
2602   %.fca.0.1.insert = insertvalue %struct.int16x8x2_t %.fca.0.0.insert, <8 x i16> %vuzp1.i, 0, 1
2603   ret %struct.int16x8x2_t %.fca.0.1.insert
2604 }
2605
2606 define %struct.int32x4x2_t @test_vuzpq_s32(<4 x i32> %a, <4 x i32> %b) {
2607 ; CHECK: test_vuzpq_s32:
2608 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2609 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2610 entry:
2611   %vuzp.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
2612   %vuzp1.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
2613   %.fca.0.0.insert = insertvalue %struct.int32x4x2_t undef, <4 x i32> %vuzp.i, 0, 0
2614   %.fca.0.1.insert = insertvalue %struct.int32x4x2_t %.fca.0.0.insert, <4 x i32> %vuzp1.i, 0, 1
2615   ret %struct.int32x4x2_t %.fca.0.1.insert
2616 }
2617
2618 define %struct.uint8x16x2_t @test_vuzpq_u8(<16 x i8> %a, <16 x i8> %b) {
2619 ; CHECK: test_vuzpq_u8:
2620 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2621 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2622 entry:
2623   %vuzp.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
2624   %vuzp1.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
2625   %.fca.0.0.insert = insertvalue %struct.uint8x16x2_t undef, <16 x i8> %vuzp.i, 0, 0
2626   %.fca.0.1.insert = insertvalue %struct.uint8x16x2_t %.fca.0.0.insert, <16 x i8> %vuzp1.i, 0, 1
2627   ret %struct.uint8x16x2_t %.fca.0.1.insert
2628 }
2629
2630 define %struct.uint16x8x2_t @test_vuzpq_u16(<8 x i16> %a, <8 x i16> %b) {
2631 ; CHECK: test_vuzpq_u16:
2632 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2633 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2634 entry:
2635   %vuzp.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
2636   %vuzp1.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
2637   %.fca.0.0.insert = insertvalue %struct.uint16x8x2_t undef, <8 x i16> %vuzp.i, 0, 0
2638   %.fca.0.1.insert = insertvalue %struct.uint16x8x2_t %.fca.0.0.insert, <8 x i16> %vuzp1.i, 0, 1
2639   ret %struct.uint16x8x2_t %.fca.0.1.insert
2640 }
2641
2642 define %struct.uint32x4x2_t @test_vuzpq_u32(<4 x i32> %a, <4 x i32> %b) {
2643 ; CHECK: test_vuzpq_u32:
2644 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2645 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2646 entry:
2647   %vuzp.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
2648   %vuzp1.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
2649   %.fca.0.0.insert = insertvalue %struct.uint32x4x2_t undef, <4 x i32> %vuzp.i, 0, 0
2650   %.fca.0.1.insert = insertvalue %struct.uint32x4x2_t %.fca.0.0.insert, <4 x i32> %vuzp1.i, 0, 1
2651   ret %struct.uint32x4x2_t %.fca.0.1.insert
2652 }
2653
2654 define %struct.float32x4x2_t @test_vuzpq_f32(<4 x float> %a, <4 x float> %b) {
2655 ; CHECK: test_vuzpq_f32:
2656 ; CHECK: uzp1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2657 ; CHECK: uzp2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2658 entry:
2659   %vuzp.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
2660   %vuzp1.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
2661   %.fca.0.0.insert = insertvalue %struct.float32x4x2_t undef, <4 x float> %vuzp.i, 0, 0
2662   %.fca.0.1.insert = insertvalue %struct.float32x4x2_t %.fca.0.0.insert, <4 x float> %vuzp1.i, 0, 1
2663   ret %struct.float32x4x2_t %.fca.0.1.insert
2664 }
2665
2666 define %struct.poly8x16x2_t @test_vuzpq_p8(<16 x i8> %a, <16 x i8> %b) {
2667 ; CHECK: test_vuzpq_p8:
2668 ; CHECK: uzp1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2669 ; CHECK: uzp2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2670 entry:
2671   %vuzp.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
2672   %vuzp1.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
2673   %.fca.0.0.insert = insertvalue %struct.poly8x16x2_t undef, <16 x i8> %vuzp.i, 0, 0
2674   %.fca.0.1.insert = insertvalue %struct.poly8x16x2_t %.fca.0.0.insert, <16 x i8> %vuzp1.i, 0, 1
2675   ret %struct.poly8x16x2_t %.fca.0.1.insert
2676 }
2677
2678 define %struct.poly16x8x2_t @test_vuzpq_p16(<8 x i16> %a, <8 x i16> %b) {
2679 ; CHECK: test_vuzpq_p16:
2680 ; CHECK: uzp1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2681 ; CHECK: uzp2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2682 entry:
2683   %vuzp.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
2684   %vuzp1.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
2685   %.fca.0.0.insert = insertvalue %struct.poly16x8x2_t undef, <8 x i16> %vuzp.i, 0, 0
2686   %.fca.0.1.insert = insertvalue %struct.poly16x8x2_t %.fca.0.0.insert, <8 x i16> %vuzp1.i, 0, 1
2687   ret %struct.poly16x8x2_t %.fca.0.1.insert
2688 }
2689
2690 define %struct.int8x8x2_t @test_vzip_s8(<8 x i8> %a, <8 x i8> %b) {
2691 ; CHECK: test_vzip_s8:
2692 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2693 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2694 entry:
2695   %vzip.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2696   %vzip1.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2697   %.fca.0.0.insert = insertvalue %struct.int8x8x2_t undef, <8 x i8> %vzip.i, 0, 0
2698   %.fca.0.1.insert = insertvalue %struct.int8x8x2_t %.fca.0.0.insert, <8 x i8> %vzip1.i, 0, 1
2699   ret %struct.int8x8x2_t %.fca.0.1.insert
2700 }
2701
2702 define %struct.int16x4x2_t @test_vzip_s16(<4 x i16> %a, <4 x i16> %b) {
2703 ; CHECK: test_vzip_s16:
2704 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2705 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2706 entry:
2707   %vzip.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2708   %vzip1.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2709   %.fca.0.0.insert = insertvalue %struct.int16x4x2_t undef, <4 x i16> %vzip.i, 0, 0
2710   %.fca.0.1.insert = insertvalue %struct.int16x4x2_t %.fca.0.0.insert, <4 x i16> %vzip1.i, 0, 1
2711   ret %struct.int16x4x2_t %.fca.0.1.insert
2712 }
2713
2714 define %struct.int32x2x2_t @test_vzip_s32(<2 x i32> %a, <2 x i32> %b) {
2715 ; CHECK: test_vzip_s32:
2716 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
2717 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
2718 entry:
2719   %vzip.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
2720   %vzip1.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
2721   %.fca.0.0.insert = insertvalue %struct.int32x2x2_t undef, <2 x i32> %vzip.i, 0, 0
2722   %.fca.0.1.insert = insertvalue %struct.int32x2x2_t %.fca.0.0.insert, <2 x i32> %vzip1.i, 0, 1
2723   ret %struct.int32x2x2_t %.fca.0.1.insert
2724 }
2725
2726 define %struct.uint8x8x2_t @test_vzip_u8(<8 x i8> %a, <8 x i8> %b) {
2727 ; CHECK: test_vzip_u8:
2728 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2729 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2730 entry:
2731   %vzip.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2732   %vzip1.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2733   %.fca.0.0.insert = insertvalue %struct.uint8x8x2_t undef, <8 x i8> %vzip.i, 0, 0
2734   %.fca.0.1.insert = insertvalue %struct.uint8x8x2_t %.fca.0.0.insert, <8 x i8> %vzip1.i, 0, 1
2735   ret %struct.uint8x8x2_t %.fca.0.1.insert
2736 }
2737
2738 define %struct.uint16x4x2_t @test_vzip_u16(<4 x i16> %a, <4 x i16> %b) {
2739 ; CHECK: test_vzip_u16:
2740 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2741 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2742 entry:
2743   %vzip.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2744   %vzip1.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2745   %.fca.0.0.insert = insertvalue %struct.uint16x4x2_t undef, <4 x i16> %vzip.i, 0, 0
2746   %.fca.0.1.insert = insertvalue %struct.uint16x4x2_t %.fca.0.0.insert, <4 x i16> %vzip1.i, 0, 1
2747   ret %struct.uint16x4x2_t %.fca.0.1.insert
2748 }
2749
2750 define %struct.uint32x2x2_t @test_vzip_u32(<2 x i32> %a, <2 x i32> %b) {
2751 ; CHECK: test_vzip_u32:
2752 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
2753 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
2754 entry:
2755   %vzip.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
2756   %vzip1.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
2757   %.fca.0.0.insert = insertvalue %struct.uint32x2x2_t undef, <2 x i32> %vzip.i, 0, 0
2758   %.fca.0.1.insert = insertvalue %struct.uint32x2x2_t %.fca.0.0.insert, <2 x i32> %vzip1.i, 0, 1
2759   ret %struct.uint32x2x2_t %.fca.0.1.insert
2760 }
2761
2762 define %struct.float32x2x2_t @test_vzip_f32(<2 x float> %a, <2 x float> %b) {
2763 ; CHECK: test_vzip_f32:
2764 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
2765 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
2766 entry:
2767   %vzip.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 0, i32 2>
2768   %vzip1.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 1, i32 3>
2769   %.fca.0.0.insert = insertvalue %struct.float32x2x2_t undef, <2 x float> %vzip.i, 0, 0
2770   %.fca.0.1.insert = insertvalue %struct.float32x2x2_t %.fca.0.0.insert, <2 x float> %vzip1.i, 0, 1
2771   ret %struct.float32x2x2_t %.fca.0.1.insert
2772 }
2773
2774 define %struct.poly8x8x2_t @test_vzip_p8(<8 x i8> %a, <8 x i8> %b) {
2775 ; CHECK: test_vzip_p8:
2776 ; CHECK: zip1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2777 ; CHECK: zip2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2778 entry:
2779   %vzip.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2780   %vzip1.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2781   %.fca.0.0.insert = insertvalue %struct.poly8x8x2_t undef, <8 x i8> %vzip.i, 0, 0
2782   %.fca.0.1.insert = insertvalue %struct.poly8x8x2_t %.fca.0.0.insert, <8 x i8> %vzip1.i, 0, 1
2783   ret %struct.poly8x8x2_t %.fca.0.1.insert
2784 }
2785
2786 define %struct.poly16x4x2_t @test_vzip_p16(<4 x i16> %a, <4 x i16> %b) {
2787 ; CHECK: test_vzip_p16:
2788 ; CHECK: zip1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2789 ; CHECK: zip2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2790 entry:
2791   %vzip.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2792   %vzip1.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2793   %.fca.0.0.insert = insertvalue %struct.poly16x4x2_t undef, <4 x i16> %vzip.i, 0, 0
2794   %.fca.0.1.insert = insertvalue %struct.poly16x4x2_t %.fca.0.0.insert, <4 x i16> %vzip1.i, 0, 1
2795   ret %struct.poly16x4x2_t %.fca.0.1.insert
2796 }
2797
2798 define %struct.int8x16x2_t @test_vzipq_s8(<16 x i8> %a, <16 x i8> %b) {
2799 ; CHECK: test_vzipq_s8:
2800 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2801 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2802 entry:
2803   %vzip.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 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>
2804   %vzip1.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <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>
2805   %.fca.0.0.insert = insertvalue %struct.int8x16x2_t undef, <16 x i8> %vzip.i, 0, 0
2806   %.fca.0.1.insert = insertvalue %struct.int8x16x2_t %.fca.0.0.insert, <16 x i8> %vzip1.i, 0, 1
2807   ret %struct.int8x16x2_t %.fca.0.1.insert
2808 }
2809
2810 define %struct.int16x8x2_t @test_vzipq_s16(<8 x i16> %a, <8 x i16> %b) {
2811 ; CHECK: test_vzipq_s16:
2812 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2813 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2814 entry:
2815   %vzip.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2816   %vzip1.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2817   %.fca.0.0.insert = insertvalue %struct.int16x8x2_t undef, <8 x i16> %vzip.i, 0, 0
2818   %.fca.0.1.insert = insertvalue %struct.int16x8x2_t %.fca.0.0.insert, <8 x i16> %vzip1.i, 0, 1
2819   ret %struct.int16x8x2_t %.fca.0.1.insert
2820 }
2821
2822 define %struct.int32x4x2_t @test_vzipq_s32(<4 x i32> %a, <4 x i32> %b) {
2823 ; CHECK: test_vzipq_s32:
2824 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2825 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2826 entry:
2827   %vzip.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2828   %vzip1.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2829   %.fca.0.0.insert = insertvalue %struct.int32x4x2_t undef, <4 x i32> %vzip.i, 0, 0
2830   %.fca.0.1.insert = insertvalue %struct.int32x4x2_t %.fca.0.0.insert, <4 x i32> %vzip1.i, 0, 1
2831   ret %struct.int32x4x2_t %.fca.0.1.insert
2832 }
2833
2834 define %struct.uint8x16x2_t @test_vzipq_u8(<16 x i8> %a, <16 x i8> %b) {
2835 ; CHECK: test_vzipq_u8:
2836 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2837 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2838 entry:
2839   %vzip.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 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>
2840   %vzip1.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <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>
2841   %.fca.0.0.insert = insertvalue %struct.uint8x16x2_t undef, <16 x i8> %vzip.i, 0, 0
2842   %.fca.0.1.insert = insertvalue %struct.uint8x16x2_t %.fca.0.0.insert, <16 x i8> %vzip1.i, 0, 1
2843   ret %struct.uint8x16x2_t %.fca.0.1.insert
2844 }
2845
2846 define %struct.uint16x8x2_t @test_vzipq_u16(<8 x i16> %a, <8 x i16> %b) {
2847 ; CHECK: test_vzipq_u16:
2848 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2849 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2850 entry:
2851   %vzip.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2852   %vzip1.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2853   %.fca.0.0.insert = insertvalue %struct.uint16x8x2_t undef, <8 x i16> %vzip.i, 0, 0
2854   %.fca.0.1.insert = insertvalue %struct.uint16x8x2_t %.fca.0.0.insert, <8 x i16> %vzip1.i, 0, 1
2855   ret %struct.uint16x8x2_t %.fca.0.1.insert
2856 }
2857
2858 define %struct.uint32x4x2_t @test_vzipq_u32(<4 x i32> %a, <4 x i32> %b) {
2859 ; CHECK: test_vzipq_u32:
2860 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2861 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2862 entry:
2863   %vzip.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2864   %vzip1.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2865   %.fca.0.0.insert = insertvalue %struct.uint32x4x2_t undef, <4 x i32> %vzip.i, 0, 0
2866   %.fca.0.1.insert = insertvalue %struct.uint32x4x2_t %.fca.0.0.insert, <4 x i32> %vzip1.i, 0, 1
2867   ret %struct.uint32x4x2_t %.fca.0.1.insert
2868 }
2869
2870 define %struct.float32x4x2_t @test_vzipq_f32(<4 x float> %a, <4 x float> %b) {
2871 ; CHECK: test_vzipq_f32:
2872 ; CHECK: zip1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2873 ; CHECK: zip2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
2874 entry:
2875   %vzip.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2876   %vzip1.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
2877   %.fca.0.0.insert = insertvalue %struct.float32x4x2_t undef, <4 x float> %vzip.i, 0, 0
2878   %.fca.0.1.insert = insertvalue %struct.float32x4x2_t %.fca.0.0.insert, <4 x float> %vzip1.i, 0, 1
2879   ret %struct.float32x4x2_t %.fca.0.1.insert
2880 }
2881
2882 define %struct.poly8x16x2_t @test_vzipq_p8(<16 x i8> %a, <16 x i8> %b) {
2883 ; CHECK: test_vzipq_p8:
2884 ; CHECK: zip1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2885 ; CHECK: zip2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
2886 entry:
2887   %vzip.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 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>
2888   %vzip1.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <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>
2889   %.fca.0.0.insert = insertvalue %struct.poly8x16x2_t undef, <16 x i8> %vzip.i, 0, 0
2890   %.fca.0.1.insert = insertvalue %struct.poly8x16x2_t %.fca.0.0.insert, <16 x i8> %vzip1.i, 0, 1
2891   ret %struct.poly8x16x2_t %.fca.0.1.insert
2892 }
2893
2894 define %struct.poly16x8x2_t @test_vzipq_p16(<8 x i16> %a, <8 x i16> %b) {
2895 ; CHECK: test_vzipq_p16:
2896 ; CHECK: zip1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2897 ; CHECK: zip2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
2898 entry:
2899   %vzip.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
2900   %vzip1.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
2901   %.fca.0.0.insert = insertvalue %struct.poly16x8x2_t undef, <8 x i16> %vzip.i, 0, 0
2902   %.fca.0.1.insert = insertvalue %struct.poly16x8x2_t %.fca.0.0.insert, <8 x i16> %vzip1.i, 0, 1
2903   ret %struct.poly16x8x2_t %.fca.0.1.insert
2904 }
2905
2906 define %struct.int8x8x2_t @test_vtrn_s8(<8 x i8> %a, <8 x i8> %b) {
2907 ; CHECK: test_vtrn_s8:
2908 ; CHECK: trn1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2909 ; CHECK: trn2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2910 entry:
2911   %vtrn.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
2912   %vtrn1.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
2913   %.fca.0.0.insert = insertvalue %struct.int8x8x2_t undef, <8 x i8> %vtrn.i, 0, 0
2914   %.fca.0.1.insert = insertvalue %struct.int8x8x2_t %.fca.0.0.insert, <8 x i8> %vtrn1.i, 0, 1
2915   ret %struct.int8x8x2_t %.fca.0.1.insert
2916 }
2917
2918 define %struct.int16x4x2_t @test_vtrn_s16(<4 x i16> %a, <4 x i16> %b) {
2919 ; CHECK: test_vtrn_s16:
2920 ; CHECK: trn1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2921 ; CHECK: trn2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2922 entry:
2923   %vtrn.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
2924   %vtrn1.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
2925   %.fca.0.0.insert = insertvalue %struct.int16x4x2_t undef, <4 x i16> %vtrn.i, 0, 0
2926   %.fca.0.1.insert = insertvalue %struct.int16x4x2_t %.fca.0.0.insert, <4 x i16> %vtrn1.i, 0, 1
2927   ret %struct.int16x4x2_t %.fca.0.1.insert
2928 }
2929
2930 define %struct.int32x2x2_t @test_vtrn_s32(<2 x i32> %a, <2 x i32> %b) {
2931 ; CHECK: test_vtrn_s32:
2932 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
2933 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
2934 entry:
2935   %vtrn.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
2936   %vtrn1.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
2937   %.fca.0.0.insert = insertvalue %struct.int32x2x2_t undef, <2 x i32> %vtrn.i, 0, 0
2938   %.fca.0.1.insert = insertvalue %struct.int32x2x2_t %.fca.0.0.insert, <2 x i32> %vtrn1.i, 0, 1
2939   ret %struct.int32x2x2_t %.fca.0.1.insert
2940 }
2941
2942 define %struct.uint8x8x2_t @test_vtrn_u8(<8 x i8> %a, <8 x i8> %b) {
2943 ; CHECK: test_vtrn_u8:
2944 ; CHECK: trn1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2945 ; CHECK: trn2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2946 entry:
2947   %vtrn.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
2948   %vtrn1.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
2949   %.fca.0.0.insert = insertvalue %struct.uint8x8x2_t undef, <8 x i8> %vtrn.i, 0, 0
2950   %.fca.0.1.insert = insertvalue %struct.uint8x8x2_t %.fca.0.0.insert, <8 x i8> %vtrn1.i, 0, 1
2951   ret %struct.uint8x8x2_t %.fca.0.1.insert
2952 }
2953
2954 define %struct.uint16x4x2_t @test_vtrn_u16(<4 x i16> %a, <4 x i16> %b) {
2955 ; CHECK: test_vtrn_u16:
2956 ; CHECK: trn1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2957 ; CHECK: trn2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
2958 entry:
2959   %vtrn.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
2960   %vtrn1.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
2961   %.fca.0.0.insert = insertvalue %struct.uint16x4x2_t undef, <4 x i16> %vtrn.i, 0, 0
2962   %.fca.0.1.insert = insertvalue %struct.uint16x4x2_t %.fca.0.0.insert, <4 x i16> %vtrn1.i, 0, 1
2963   ret %struct.uint16x4x2_t %.fca.0.1.insert
2964 }
2965
2966 define %struct.uint32x2x2_t @test_vtrn_u32(<2 x i32> %a, <2 x i32> %b) {
2967 ; CHECK: test_vtrn_u32:
2968 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
2969 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
2970 entry:
2971   %vtrn.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 0, i32 2>
2972   %vtrn1.i = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 3>
2973   %.fca.0.0.insert = insertvalue %struct.uint32x2x2_t undef, <2 x i32> %vtrn.i, 0, 0
2974   %.fca.0.1.insert = insertvalue %struct.uint32x2x2_t %.fca.0.0.insert, <2 x i32> %vtrn1.i, 0, 1
2975   ret %struct.uint32x2x2_t %.fca.0.1.insert
2976 }
2977
2978 define %struct.float32x2x2_t @test_vtrn_f32(<2 x float> %a, <2 x float> %b) {
2979 ; CHECK: test_vtrn_f32:
2980 ; CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
2981 ; CHECK: ins {{v[0-9]+}}.s[0], {{v[0-9]+}}.s[1]
2982 entry:
2983   %vtrn.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 0, i32 2>
2984   %vtrn1.i = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 1, i32 3>
2985   %.fca.0.0.insert = insertvalue %struct.float32x2x2_t undef, <2 x float> %vtrn.i, 0, 0
2986   %.fca.0.1.insert = insertvalue %struct.float32x2x2_t %.fca.0.0.insert, <2 x float> %vtrn1.i, 0, 1
2987   ret %struct.float32x2x2_t %.fca.0.1.insert
2988 }
2989
2990 define %struct.poly8x8x2_t @test_vtrn_p8(<8 x i8> %a, <8 x i8> %b) {
2991 ; CHECK: test_vtrn_p8:
2992 ; CHECK: trn1 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2993 ; CHECK: trn2 {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
2994 entry:
2995   %vtrn.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
2996   %vtrn1.i = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
2997   %.fca.0.0.insert = insertvalue %struct.poly8x8x2_t undef, <8 x i8> %vtrn.i, 0, 0
2998   %.fca.0.1.insert = insertvalue %struct.poly8x8x2_t %.fca.0.0.insert, <8 x i8> %vtrn1.i, 0, 1
2999   ret %struct.poly8x8x2_t %.fca.0.1.insert
3000 }
3001
3002 define %struct.poly16x4x2_t @test_vtrn_p16(<4 x i16> %a, <4 x i16> %b) {
3003 ; CHECK: test_vtrn_p16:
3004 ; CHECK: trn1 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
3005 ; CHECK: trn2 {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
3006 entry:
3007   %vtrn.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
3008   %vtrn1.i = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
3009   %.fca.0.0.insert = insertvalue %struct.poly16x4x2_t undef, <4 x i16> %vtrn.i, 0, 0
3010   %.fca.0.1.insert = insertvalue %struct.poly16x4x2_t %.fca.0.0.insert, <4 x i16> %vtrn1.i, 0, 1
3011   ret %struct.poly16x4x2_t %.fca.0.1.insert
3012 }
3013
3014 define %struct.int8x16x2_t @test_vtrnq_s8(<16 x i8> %a, <16 x i8> %b) {
3015 ; CHECK: test_vtrnq_s8:
3016 ; CHECK: trn1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
3017 ; CHECK: trn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
3018 entry:
3019   %vtrn.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
3020   %vtrn1.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
3021   %.fca.0.0.insert = insertvalue %struct.int8x16x2_t undef, <16 x i8> %vtrn.i, 0, 0
3022   %.fca.0.1.insert = insertvalue %struct.int8x16x2_t %.fca.0.0.insert, <16 x i8> %vtrn1.i, 0, 1
3023   ret %struct.int8x16x2_t %.fca.0.1.insert
3024 }
3025
3026 define %struct.int16x8x2_t @test_vtrnq_s16(<8 x i16> %a, <8 x i16> %b) {
3027 ; CHECK: test_vtrnq_s16:
3028 ; CHECK: trn1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
3029 ; CHECK: trn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
3030 entry:
3031   %vtrn.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
3032   %vtrn1.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
3033   %.fca.0.0.insert = insertvalue %struct.int16x8x2_t undef, <8 x i16> %vtrn.i, 0, 0
3034   %.fca.0.1.insert = insertvalue %struct.int16x8x2_t %.fca.0.0.insert, <8 x i16> %vtrn1.i, 0, 1
3035   ret %struct.int16x8x2_t %.fca.0.1.insert
3036 }
3037
3038 define %struct.int32x4x2_t @test_vtrnq_s32(<4 x i32> %a, <4 x i32> %b) {
3039 ; CHECK: test_vtrnq_s32:
3040 ; CHECK: trn1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
3041 ; CHECK: trn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
3042 entry:
3043   %vtrn.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
3044   %vtrn1.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
3045   %.fca.0.0.insert = insertvalue %struct.int32x4x2_t undef, <4 x i32> %vtrn.i, 0, 0
3046   %.fca.0.1.insert = insertvalue %struct.int32x4x2_t %.fca.0.0.insert, <4 x i32> %vtrn1.i, 0, 1
3047   ret %struct.int32x4x2_t %.fca.0.1.insert
3048 }
3049
3050 define %struct.uint8x16x2_t @test_vtrnq_u8(<16 x i8> %a, <16 x i8> %b) {
3051 ; CHECK: test_vtrnq_u8:
3052 ; CHECK: trn1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
3053 ; CHECK: trn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
3054 entry:
3055   %vtrn.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
3056   %vtrn1.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
3057   %.fca.0.0.insert = insertvalue %struct.uint8x16x2_t undef, <16 x i8> %vtrn.i, 0, 0
3058   %.fca.0.1.insert = insertvalue %struct.uint8x16x2_t %.fca.0.0.insert, <16 x i8> %vtrn1.i, 0, 1
3059   ret %struct.uint8x16x2_t %.fca.0.1.insert
3060 }
3061
3062 define %struct.uint16x8x2_t @test_vtrnq_u16(<8 x i16> %a, <8 x i16> %b) {
3063 ; CHECK: test_vtrnq_u16:
3064 ; CHECK: trn1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
3065 ; CHECK: trn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
3066 entry:
3067   %vtrn.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
3068   %vtrn1.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
3069   %.fca.0.0.insert = insertvalue %struct.uint16x8x2_t undef, <8 x i16> %vtrn.i, 0, 0
3070   %.fca.0.1.insert = insertvalue %struct.uint16x8x2_t %.fca.0.0.insert, <8 x i16> %vtrn1.i, 0, 1
3071   ret %struct.uint16x8x2_t %.fca.0.1.insert
3072 }
3073
3074 define %struct.uint32x4x2_t @test_vtrnq_u32(<4 x i32> %a, <4 x i32> %b) {
3075 ; CHECK: test_vtrnq_u32:
3076 ; CHECK: trn1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
3077 ; CHECK: trn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
3078 entry:
3079   %vtrn.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
3080   %vtrn1.i = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
3081   %.fca.0.0.insert = insertvalue %struct.uint32x4x2_t undef, <4 x i32> %vtrn.i, 0, 0
3082   %.fca.0.1.insert = insertvalue %struct.uint32x4x2_t %.fca.0.0.insert, <4 x i32> %vtrn1.i, 0, 1
3083   ret %struct.uint32x4x2_t %.fca.0.1.insert
3084 }
3085
3086 define %struct.float32x4x2_t @test_vtrnq_f32(<4 x float> %a, <4 x float> %b) {
3087 ; CHECK: test_vtrnq_f32:
3088 ; CHECK: trn1 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
3089 ; CHECK: trn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
3090 entry:
3091   %vtrn.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
3092   %vtrn1.i = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
3093   %.fca.0.0.insert = insertvalue %struct.float32x4x2_t undef, <4 x float> %vtrn.i, 0, 0
3094   %.fca.0.1.insert = insertvalue %struct.float32x4x2_t %.fca.0.0.insert, <4 x float> %vtrn1.i, 0, 1
3095   ret %struct.float32x4x2_t %.fca.0.1.insert
3096 }
3097
3098 define %struct.poly8x16x2_t @test_vtrnq_p8(<16 x i8> %a, <16 x i8> %b) {
3099 ; CHECK: test_vtrnq_p8:
3100 ; CHECK: trn1 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
3101 ; CHECK: trn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
3102 entry:
3103   %vtrn.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
3104   %vtrn1.i = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>
3105   %.fca.0.0.insert = insertvalue %struct.poly8x16x2_t undef, <16 x i8> %vtrn.i, 0, 0
3106   %.fca.0.1.insert = insertvalue %struct.poly8x16x2_t %.fca.0.0.insert, <16 x i8> %vtrn1.i, 0, 1
3107   ret %struct.poly8x16x2_t %.fca.0.1.insert
3108 }
3109
3110 define %struct.poly16x8x2_t @test_vtrnq_p16(<8 x i16> %a, <8 x i16> %b) {
3111 ; CHECK: test_vtrnq_p16:
3112 ; CHECK: trn1 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
3113 ; CHECK: trn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
3114 entry:
3115   %vtrn.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
3116   %vtrn1.i = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
3117   %.fca.0.0.insert = insertvalue %struct.poly16x8x2_t undef, <8 x i16> %vtrn.i, 0, 0
3118   %.fca.0.1.insert = insertvalue %struct.poly16x8x2_t %.fca.0.0.insert, <8 x i16> %vtrn1.i, 0, 1
3119   ret %struct.poly16x8x2_t %.fca.0.1.insert
3120 }
3121
3122 define %struct.uint8x8x2_t @test_uzp(<16 x i8> %y) {
3123 ; CHECK: test_uzp:
3124
3125   %vuzp.i = shufflevector <16 x i8> %y, <16 x i8> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
3126   %vuzp1.i = shufflevector <16 x i8> %y, <16 x i8> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
3127   %.fca.0.0.insert = insertvalue %struct.uint8x8x2_t undef, <8 x i8> %vuzp.i, 0, 0
3128   %.fca.0.1.insert = insertvalue %struct.uint8x8x2_t %.fca.0.0.insert, <8 x i8> %vuzp1.i, 0, 1
3129   ret %struct.uint8x8x2_t %.fca.0.1.insert
3130
3131 ; CHECK: dup    {{d[0-9]+}}, {{v[0-9]+}}.d[1]
3132 ; CHECK-NEXT: uzp1      {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
3133 ; CHECK-NEXT: uzp2      {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
3134 }