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