7faf2a2a8cc0d1795a0d560b0bef6277a7b04b01
[oota-llvm.git] / test / CodeGen / AArch64 / neon-copy.ll
1 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -fp-contract=fast | FileCheck %s
2
3
4 define <16 x i8> @ins16bw(<16 x i8> %tmp1, i8 %tmp2) {
5 ;CHECK: ins {{v[0-9]+}}.b[15], {{w[0-9]+}}
6   %tmp3 = insertelement <16 x i8> %tmp1, i8 %tmp2, i32 15
7   ret <16 x i8> %tmp3
8 }
9
10 define <8 x i16> @ins8hw(<8 x i16> %tmp1, i16 %tmp2) {
11 ;CHECK: ins {{v[0-9]+}}.h[6], {{w[0-9]+}}
12   %tmp3 = insertelement <8 x i16> %tmp1, i16 %tmp2, i32 6
13   ret <8 x i16> %tmp3
14 }
15
16 define <4 x i32> @ins4sw(<4 x i32> %tmp1, i32 %tmp2) {
17 ;CHECK: ins {{v[0-9]+}}.s[2], {{w[0-9]+}}
18   %tmp3 = insertelement <4 x i32> %tmp1, i32 %tmp2, i32 2
19   ret <4 x i32> %tmp3
20 }
21
22 define <2 x i64> @ins2dw(<2 x i64> %tmp1, i64 %tmp2) {
23 ;CHECK: ins {{v[0-9]+}}.d[1], {{x[0-9]+}}
24   %tmp3 = insertelement <2 x i64> %tmp1, i64 %tmp2, i32 1
25   ret <2 x i64> %tmp3
26 }
27
28 define <8 x i8> @ins8bw(<8 x i8> %tmp1, i8 %tmp2) {
29 ;CHECK: ins {{v[0-9]+}}.b[5], {{w[0-9]+}}
30   %tmp3 = insertelement <8 x i8> %tmp1, i8 %tmp2, i32 5
31   ret <8 x i8> %tmp3
32 }
33
34 define <4 x i16> @ins4hw(<4 x i16> %tmp1, i16 %tmp2) {
35 ;CHECK: ins {{v[0-9]+}}.h[3], {{w[0-9]+}}
36   %tmp3 = insertelement <4 x i16> %tmp1, i16 %tmp2, i32 3
37   ret <4 x i16> %tmp3
38 }
39
40 define <2 x i32> @ins2sw(<2 x i32> %tmp1, i32 %tmp2) {
41 ;CHECK: ins {{v[0-9]+}}.s[1], {{w[0-9]+}}
42   %tmp3 = insertelement <2 x i32> %tmp1, i32 %tmp2, i32 1
43   ret <2 x i32> %tmp3
44 }
45
46 define <16 x i8> @ins16b16(<16 x i8> %tmp1, <16 x i8> %tmp2) {
47 ;CHECK: ins {{v[0-9]+}}.b[15], {{v[0-9]+}}.b[2]
48   %tmp3 = extractelement <16 x i8> %tmp1, i32 2
49   %tmp4 = insertelement <16 x i8> %tmp2, i8 %tmp3, i32 15
50   ret <16 x i8> %tmp4
51 }
52
53 define <8 x i16> @ins8h8(<8 x i16> %tmp1, <8 x i16> %tmp2) {
54 ;CHECK: ins {{v[0-9]+}}.h[7], {{v[0-9]+}}.h[2]
55   %tmp3 = extractelement <8 x i16> %tmp1, i32 2
56   %tmp4 = insertelement <8 x i16> %tmp2, i16 %tmp3, i32 7
57   ret <8 x i16> %tmp4
58 }
59
60 define <4 x i32> @ins4s4(<4 x i32> %tmp1, <4 x i32> %tmp2) {
61 ;CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[2]
62   %tmp3 = extractelement <4 x i32> %tmp1, i32 2
63   %tmp4 = insertelement <4 x i32> %tmp2, i32 %tmp3, i32 1
64   ret <4 x i32> %tmp4
65 }
66
67 define <2 x i64> @ins2d2(<2 x i64> %tmp1, <2 x i64> %tmp2) {
68 ;CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
69   %tmp3 = extractelement <2 x i64> %tmp1, i32 0
70   %tmp4 = insertelement <2 x i64> %tmp2, i64 %tmp3, i32 1
71   ret <2 x i64> %tmp4
72 }
73
74 define <4 x float> @ins4f4(<4 x float> %tmp1, <4 x float> %tmp2) {
75 ;CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[2]
76   %tmp3 = extractelement <4 x float> %tmp1, i32 2
77   %tmp4 = insertelement <4 x float> %tmp2, float %tmp3, i32 1
78   ret <4 x float> %tmp4
79 }
80
81 define <2 x double> @ins2df2(<2 x double> %tmp1, <2 x double> %tmp2) {
82 ;CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
83   %tmp3 = extractelement <2 x double> %tmp1, i32 0
84   %tmp4 = insertelement <2 x double> %tmp2, double %tmp3, i32 1
85   ret <2 x double> %tmp4
86 }
87
88 define <16 x i8> @ins8b16(<8 x i8> %tmp1, <16 x i8> %tmp2) {
89 ;CHECK: ins {{v[0-9]+}}.b[15], {{v[0-9]+}}.b[2]
90   %tmp3 = extractelement <8 x i8> %tmp1, i32 2
91   %tmp4 = insertelement <16 x i8> %tmp2, i8 %tmp3, i32 15
92   ret <16 x i8> %tmp4
93 }
94
95 define <8 x i16> @ins4h8(<4 x i16> %tmp1, <8 x i16> %tmp2) {
96 ;CHECK: ins {{v[0-9]+}}.h[7], {{v[0-9]+}}.h[2]
97   %tmp3 = extractelement <4 x i16> %tmp1, i32 2
98   %tmp4 = insertelement <8 x i16> %tmp2, i16 %tmp3, i32 7
99   ret <8 x i16> %tmp4
100 }
101
102 define <4 x i32> @ins2s4(<2 x i32> %tmp1, <4 x i32> %tmp2) {
103 ;CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[1]
104   %tmp3 = extractelement <2 x i32> %tmp1, i32 1
105   %tmp4 = insertelement <4 x i32> %tmp2, i32 %tmp3, i32 1
106   ret <4 x i32> %tmp4
107 }
108
109 define <2 x i64> @ins1d2(<1 x i64> %tmp1, <2 x i64> %tmp2) {
110 ;CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
111   %tmp3 = extractelement <1 x i64> %tmp1, i32 0
112   %tmp4 = insertelement <2 x i64> %tmp2, i64 %tmp3, i32 1
113   ret <2 x i64> %tmp4
114 }
115
116 define <4 x float> @ins2f4(<2 x float> %tmp1, <4 x float> %tmp2) {
117 ;CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[1]
118   %tmp3 = extractelement <2 x float> %tmp1, i32 1
119   %tmp4 = insertelement <4 x float> %tmp2, float %tmp3, i32 1
120   ret <4 x float> %tmp4
121 }
122
123 define <2 x double> @ins1f2(<1 x double> %tmp1, <2 x double> %tmp2) {
124 ;CHECK: ins {{v[0-9]+}}.d[1], {{v[0-9]+}}.d[0]
125   %tmp3 = extractelement <1 x double> %tmp1, i32 0
126   %tmp4 = insertelement <2 x double> %tmp2, double %tmp3, i32 1
127   ret <2 x double> %tmp4
128 }
129
130 define <8 x i8> @ins16b8(<16 x i8> %tmp1, <8 x i8> %tmp2) {
131 ;CHECK: ins {{v[0-9]+}}.b[7], {{v[0-9]+}}.b[2]
132   %tmp3 = extractelement <16 x i8> %tmp1, i32 2
133   %tmp4 = insertelement <8 x i8> %tmp2, i8 %tmp3, i32 7
134   ret <8 x i8> %tmp4
135 }
136
137 define <4 x i16> @ins8h4(<8 x i16> %tmp1, <4 x i16> %tmp2) {
138 ;CHECK: ins {{v[0-9]+}}.h[3], {{v[0-9]+}}.h[2]
139   %tmp3 = extractelement <8 x i16> %tmp1, i32 2
140   %tmp4 = insertelement <4 x i16> %tmp2, i16 %tmp3, i32 3
141   ret <4 x i16> %tmp4
142 }
143
144 define <2 x i32> @ins4s2(<4 x i32> %tmp1, <2 x i32> %tmp2) {
145 ;CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[2]
146   %tmp3 = extractelement <4 x i32> %tmp1, i32 2
147   %tmp4 = insertelement <2 x i32> %tmp2, i32 %tmp3, i32 1
148   ret <2 x i32> %tmp4
149 }
150
151 define <1 x i64> @ins2d1(<2 x i64> %tmp1, <1 x i64> %tmp2) {
152 ;CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[0]
153   %tmp3 = extractelement <2 x i64> %tmp1, i32 0
154   %tmp4 = insertelement <1 x i64> %tmp2, i64 %tmp3, i32 0
155   ret <1 x i64> %tmp4
156 }
157
158 define <2 x float> @ins4f2(<4 x float> %tmp1, <2 x float> %tmp2) {
159 ;CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[2]
160   %tmp3 = extractelement <4 x float> %tmp1, i32 2
161   %tmp4 = insertelement <2 x float> %tmp2, float %tmp3, i32 1
162   ret <2 x float> %tmp4
163 }
164
165 define <1 x double> @ins2f1(<2 x double> %tmp1, <1 x double> %tmp2) {
166 ;CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[0]
167   %tmp3 = extractelement <2 x double> %tmp1, i32 0
168   %tmp4 = insertelement <1 x double> %tmp2, double %tmp3, i32 0
169   ret <1 x double> %tmp4
170 }
171
172 define <8 x i8> @ins8b8(<8 x i8> %tmp1, <8 x i8> %tmp2) {
173 ;CHECK: ins {{v[0-9]+}}.b[4], {{v[0-9]+}}.b[2]
174   %tmp3 = extractelement <8 x i8> %tmp1, i32 2
175   %tmp4 = insertelement <8 x i8> %tmp2, i8 %tmp3, i32 4
176   ret <8 x i8> %tmp4
177 }
178
179 define <4 x i16> @ins4h4(<4 x i16> %tmp1, <4 x i16> %tmp2) {
180 ;CHECK: ins {{v[0-9]+}}.h[3], {{v[0-9]+}}.h[2]
181   %tmp3 = extractelement <4 x i16> %tmp1, i32 2
182   %tmp4 = insertelement <4 x i16> %tmp2, i16 %tmp3, i32 3
183   ret <4 x i16> %tmp4
184 }
185
186 define <2 x i32> @ins2s2(<2 x i32> %tmp1, <2 x i32> %tmp2) {
187 ;CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
188   %tmp3 = extractelement <2 x i32> %tmp1, i32 0
189   %tmp4 = insertelement <2 x i32> %tmp2, i32 %tmp3, i32 1
190   ret <2 x i32> %tmp4
191 }
192
193 define <1 x i64> @ins1d1(<1 x i64> %tmp1, <1 x i64> %tmp2) {
194 ;CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[0]
195   %tmp3 = extractelement <1 x i64> %tmp1, i32 0
196   %tmp4 = insertelement <1 x i64> %tmp2, i64 %tmp3, i32 0
197   ret <1 x i64> %tmp4
198 }
199
200 define <2 x float> @ins2f2(<2 x float> %tmp1, <2 x float> %tmp2) {
201 ;CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0]
202   %tmp3 = extractelement <2 x float> %tmp1, i32 0
203   %tmp4 = insertelement <2 x float> %tmp2, float %tmp3, i32 1
204   ret <2 x float> %tmp4
205 }
206
207 define <1 x double> @ins1df1(<1 x double> %tmp1, <1 x double> %tmp2) {
208 ;CHECK: ins {{v[0-9]+}}.d[0], {{v[0-9]+}}.d[0]
209   %tmp3 = extractelement <1 x double> %tmp1, i32 0
210   %tmp4 = insertelement <1 x double> %tmp2, double %tmp3, i32 0
211   ret <1 x double> %tmp4
212 }
213
214 define i32 @umovw16b(<16 x i8> %tmp1) {
215 ;CHECK: umov {{w[0-9]+}}, {{v[0-9]+}}.b[8]
216   %tmp3 = extractelement <16 x i8> %tmp1, i32 8
217   %tmp4 = zext i8 %tmp3 to i32
218   ret i32 %tmp4
219 }
220
221 define i32 @umovw8h(<8 x i16> %tmp1) {
222 ;CHECK: umov {{w[0-9]+}}, {{v[0-9]+}}.h[2]
223   %tmp3 = extractelement <8 x i16> %tmp1, i32 2
224   %tmp4 = zext i16 %tmp3 to i32
225   ret i32 %tmp4
226 }
227
228 define i32 @umovw4s(<4 x i32> %tmp1) {
229 ;CHECK: umov {{w[0-9]+}}, {{v[0-9]+}}.s[2]
230   %tmp3 = extractelement <4 x i32> %tmp1, i32 2
231   ret i32 %tmp3
232 }
233
234 define i64 @umovx2d(<2 x i64> %tmp1) {
235 ;CHECK: umov {{x[0-9]+}}, {{v[0-9]+}}.d[0]
236   %tmp3 = extractelement <2 x i64> %tmp1, i32 0
237   ret i64 %tmp3
238 }
239
240 define i32 @umovw8b(<8 x i8> %tmp1) {
241 ;CHECK: umov {{w[0-9]+}}, {{v[0-9]+}}.b[7]
242   %tmp3 = extractelement <8 x i8> %tmp1, i32 7
243   %tmp4 = zext i8 %tmp3 to i32
244   ret i32 %tmp4
245 }
246
247 define i32 @umovw4h(<4 x i16> %tmp1) {
248 ;CHECK: umov {{w[0-9]+}}, {{v[0-9]+}}.h[2]
249   %tmp3 = extractelement <4 x i16> %tmp1, i32 2
250   %tmp4 = zext i16 %tmp3 to i32
251   ret i32 %tmp4
252 }
253
254 define i32 @umovw2s(<2 x i32> %tmp1) {
255 ;CHECK: umov {{w[0-9]+}}, {{v[0-9]+}}.s[1]
256   %tmp3 = extractelement <2 x i32> %tmp1, i32 1
257   ret i32 %tmp3
258 }
259
260 define i64 @umovx1d(<1 x i64> %tmp1) {
261 ;CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}}
262   %tmp3 = extractelement <1 x i64> %tmp1, i32 0
263   ret i64 %tmp3
264 }
265
266 define i32 @smovw16b(<16 x i8> %tmp1) {
267 ;CHECK: smov {{w[0-9]+}}, {{v[0-9]+}}.b[8]
268   %tmp3 = extractelement <16 x i8> %tmp1, i32 8
269   %tmp4 = sext i8 %tmp3 to i32
270   %tmp5 = add i32 5, %tmp4
271   ret i32 %tmp5
272 }
273
274 define i32 @smovw8h(<8 x i16> %tmp1) {
275 ;CHECK: smov {{w[0-9]+}}, {{v[0-9]+}}.h[2]
276   %tmp3 = extractelement <8 x i16> %tmp1, i32 2
277   %tmp4 = sext i16 %tmp3 to i32
278   %tmp5 = add i32 5, %tmp4
279   ret i32 %tmp5
280 }
281
282 define i32 @smovx16b(<16 x i8> %tmp1) {
283 ;CHECK: smov {{x[0-9]+}}, {{v[0-9]+}}.b[8]
284   %tmp3 = extractelement <16 x i8> %tmp1, i32 8
285   %tmp4 = sext i8 %tmp3 to i32
286   ret i32 %tmp4
287 }
288
289 define i32 @smovx8h(<8 x i16> %tmp1) {
290 ;CHECK: smov {{x[0-9]+}}, {{v[0-9]+}}.h[2]
291   %tmp3 = extractelement <8 x i16> %tmp1, i32 2
292   %tmp4 = sext i16 %tmp3 to i32
293   ret i32 %tmp4
294 }
295
296 define i64 @smovx4s(<4 x i32> %tmp1) {
297 ;CHECK: smov {{x[0-9]+}}, {{v[0-9]+}}.s[2]
298   %tmp3 = extractelement <4 x i32> %tmp1, i32 2
299   %tmp4 = sext i32 %tmp3 to i64
300   ret i64 %tmp4
301 }
302
303 define i32 @smovw8b(<8 x i8> %tmp1) {
304 ;CHECK: smov {{w[0-9]+}}, {{v[0-9]+}}.b[4]
305   %tmp3 = extractelement <8 x i8> %tmp1, i32 4
306   %tmp4 = sext i8 %tmp3 to i32
307   %tmp5 = add i32 5, %tmp4
308   ret i32 %tmp5
309 }
310
311 define i32 @smovw4h(<4 x i16> %tmp1) {
312 ;CHECK: smov {{w[0-9]+}}, {{v[0-9]+}}.h[2]
313   %tmp3 = extractelement <4 x i16> %tmp1, i32 2
314   %tmp4 = sext i16 %tmp3 to i32
315   %tmp5 = add i32 5, %tmp4
316   ret i32 %tmp5
317 }
318
319 define i32 @smovx8b(<8 x i8> %tmp1) {
320 ;CHECK: smov {{x[0-9]+}}, {{v[0-9]+}}.b[6]
321   %tmp3 = extractelement <8 x i8> %tmp1, i32 6
322   %tmp4 = sext i8 %tmp3 to i32
323   ret i32 %tmp4
324 }
325
326 define i32 @smovx4h(<4 x i16> %tmp1) {
327 ;CHECK: smov {{x[0-9]+}}, {{v[0-9]+}}.h[2]
328   %tmp3 = extractelement <4 x i16> %tmp1, i32 2
329   %tmp4 = sext i16 %tmp3 to i32
330   ret i32 %tmp4
331 }
332
333 define i64 @smovx2s(<2 x i32> %tmp1) {
334 ;CHECK: smov {{x[0-9]+}}, {{v[0-9]+}}.s[1]
335   %tmp3 = extractelement <2 x i32> %tmp1, i32 1
336   %tmp4 = sext i32 %tmp3 to i64
337   ret i64 %tmp4
338 }
339
340 define <8 x i8> @test_vcopy_lane_s8(<8 x i8> %v1, <8 x i8> %v2) {
341 ;CHECK: ins  {{v[0-9]+}}.b[5], {{v[0-9]+}}.b[3]
342   %vset_lane = shufflevector <8 x i8> %v1, <8 x i8> %v2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 11, i32 6, i32 7>
343   ret <8 x i8> %vset_lane
344 }
345
346 define <16 x i8> @test_vcopyq_laneq_s8(<16 x i8> %v1, <16 x i8> %v2) {
347 ;CHECK: ins  {{v[0-9]+}}.b[14], {{v[0-9]+}}.b[6]
348   %vset_lane = shufflevector <16 x i8> %v1, <16 x i8> %v2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 22, i32 15>
349   ret <16 x i8> %vset_lane
350 }
351
352 define <8 x i8> @test_vcopy_lane_swap_s8(<8 x i8> %v1, <8 x i8> %v2) {
353 ;CHECK: ins {{v[0-9]+}}.b[7], {{v[0-9]+}}.b[0]
354   %vset_lane = shufflevector <8 x i8> %v1, <8 x i8> %v2, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 0>
355   ret <8 x i8> %vset_lane
356 }
357
358 define <16 x i8> @test_vcopyq_laneq_swap_s8(<16 x i8> %v1, <16 x i8> %v2) {
359 ;CHECK: ins {{v[0-9]+}}.b[0], {{v[0-9]+}}.b[15]
360   %vset_lane = shufflevector <16 x i8> %v1, <16 x i8> %v2, <16 x i32> <i32 15, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
361   ret <16 x i8> %vset_lane
362 }
363
364 define <8 x i8> @test_vdup_n_u8(i8 %v1) #0 {
365 ;CHECK: dup {{v[0-9]+}}.8b, {{w[0-9]+}}
366   %vecinit.i = insertelement <8 x i8> undef, i8 %v1, i32 0
367   %vecinit1.i = insertelement <8 x i8> %vecinit.i, i8 %v1, i32 1
368   %vecinit2.i = insertelement <8 x i8> %vecinit1.i, i8 %v1, i32 2
369   %vecinit3.i = insertelement <8 x i8> %vecinit2.i, i8 %v1, i32 3
370   %vecinit4.i = insertelement <8 x i8> %vecinit3.i, i8 %v1, i32 4
371   %vecinit5.i = insertelement <8 x i8> %vecinit4.i, i8 %v1, i32 5
372   %vecinit6.i = insertelement <8 x i8> %vecinit5.i, i8 %v1, i32 6
373   %vecinit7.i = insertelement <8 x i8> %vecinit6.i, i8 %v1, i32 7
374   ret <8 x i8> %vecinit7.i
375 }
376
377 define <4 x i16> @test_vdup_n_u16(i16 %v1) #0 {
378 ;CHECK: dup {{v[0-9]+}}.4h, {{w[0-9]+}}
379   %vecinit.i = insertelement <4 x i16> undef, i16 %v1, i32 0
380   %vecinit1.i = insertelement <4 x i16> %vecinit.i, i16 %v1, i32 1
381   %vecinit2.i = insertelement <4 x i16> %vecinit1.i, i16 %v1, i32 2
382   %vecinit3.i = insertelement <4 x i16> %vecinit2.i, i16 %v1, i32 3
383   ret <4 x i16> %vecinit3.i
384 }
385
386 define <2 x i32> @test_vdup_n_u32(i32 %v1) #0 {
387 ;CHECK: dup {{v[0-9]+}}.2s, {{w[0-9]+}}
388   %vecinit.i = insertelement <2 x i32> undef, i32 %v1, i32 0
389   %vecinit1.i = insertelement <2 x i32> %vecinit.i, i32 %v1, i32 1
390   ret <2 x i32> %vecinit1.i
391 }
392
393 define <1 x i64> @test_vdup_n_u64(i64 %v1) #0 {
394 ;CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}}
395   %vecinit.i = insertelement <1 x i64> undef, i64 %v1, i32 0
396   ret <1 x i64> %vecinit.i
397 }
398
399 define <16 x i8> @test_vdupq_n_u8(i8 %v1) #0 {
400 ;CHECK: dup {{v[0-9]+}}.16b, {{w[0-9]+}}
401   %vecinit.i = insertelement <16 x i8> undef, i8 %v1, i32 0
402   %vecinit1.i = insertelement <16 x i8> %vecinit.i, i8 %v1, i32 1
403   %vecinit2.i = insertelement <16 x i8> %vecinit1.i, i8 %v1, i32 2
404   %vecinit3.i = insertelement <16 x i8> %vecinit2.i, i8 %v1, i32 3
405   %vecinit4.i = insertelement <16 x i8> %vecinit3.i, i8 %v1, i32 4
406   %vecinit5.i = insertelement <16 x i8> %vecinit4.i, i8 %v1, i32 5
407   %vecinit6.i = insertelement <16 x i8> %vecinit5.i, i8 %v1, i32 6
408   %vecinit7.i = insertelement <16 x i8> %vecinit6.i, i8 %v1, i32 7
409   %vecinit8.i = insertelement <16 x i8> %vecinit7.i, i8 %v1, i32 8
410   %vecinit9.i = insertelement <16 x i8> %vecinit8.i, i8 %v1, i32 9
411   %vecinit10.i = insertelement <16 x i8> %vecinit9.i, i8 %v1, i32 10
412   %vecinit11.i = insertelement <16 x i8> %vecinit10.i, i8 %v1, i32 11
413   %vecinit12.i = insertelement <16 x i8> %vecinit11.i, i8 %v1, i32 12
414   %vecinit13.i = insertelement <16 x i8> %vecinit12.i, i8 %v1, i32 13
415   %vecinit14.i = insertelement <16 x i8> %vecinit13.i, i8 %v1, i32 14
416   %vecinit15.i = insertelement <16 x i8> %vecinit14.i, i8 %v1, i32 15
417   ret <16 x i8> %vecinit15.i
418 }
419
420 define <8 x i16> @test_vdupq_n_u16(i16 %v1) #0 {
421 ;CHECK: dup {{v[0-9]+}}.8h, {{w[0-9]+}}
422   %vecinit.i = insertelement <8 x i16> undef, i16 %v1, i32 0
423   %vecinit1.i = insertelement <8 x i16> %vecinit.i, i16 %v1, i32 1
424   %vecinit2.i = insertelement <8 x i16> %vecinit1.i, i16 %v1, i32 2
425   %vecinit3.i = insertelement <8 x i16> %vecinit2.i, i16 %v1, i32 3
426   %vecinit4.i = insertelement <8 x i16> %vecinit3.i, i16 %v1, i32 4
427   %vecinit5.i = insertelement <8 x i16> %vecinit4.i, i16 %v1, i32 5
428   %vecinit6.i = insertelement <8 x i16> %vecinit5.i, i16 %v1, i32 6
429   %vecinit7.i = insertelement <8 x i16> %vecinit6.i, i16 %v1, i32 7
430   ret <8 x i16> %vecinit7.i
431 }
432
433 define <4 x i32> @test_vdupq_n_u32(i32 %v1) #0 {
434 ;CHECK: dup {{v[0-9]+}}.4s, {{w[0-9]+}}
435   %vecinit.i = insertelement <4 x i32> undef, i32 %v1, i32 0
436   %vecinit1.i = insertelement <4 x i32> %vecinit.i, i32 %v1, i32 1
437   %vecinit2.i = insertelement <4 x i32> %vecinit1.i, i32 %v1, i32 2
438   %vecinit3.i = insertelement <4 x i32> %vecinit2.i, i32 %v1, i32 3
439   ret <4 x i32> %vecinit3.i
440 }
441
442 define <2 x i64> @test_vdupq_n_u64(i64 %v1) #0 {
443 ;CHECK: dup {{v[0-9]+}}.2d, {{x[0-9]+}}
444   %vecinit.i = insertelement <2 x i64> undef, i64 %v1, i32 0
445   %vecinit1.i = insertelement <2 x i64> %vecinit.i, i64 %v1, i32 1
446   ret <2 x i64> %vecinit1.i
447 }
448
449 define <8 x i8> @test_vdup_lane_s8(<8 x i8> %v1) #0 {
450 ;CHECK: dup {{v[0-9]+}}.8b, {{v[0-9]+}}.b[5]
451   %shuffle = shufflevector <8 x i8> %v1, <8 x i8> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
452   ret <8 x i8> %shuffle
453 }
454
455 define <4 x i16> @test_vdup_lane_s16(<4 x i16> %v1) #0 {
456 ;CHECK: dup {{v[0-9]+}}.4h, {{v[0-9]+}}.h[2]
457   %shuffle = shufflevector <4 x i16> %v1, <4 x i16> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
458   ret <4 x i16> %shuffle
459 }
460
461 define <2 x i32> @test_vdup_lane_s32(<2 x i32> %v1) #0 {
462 ;CHECK: dup {{v[0-9]+}}.2s, {{v[0-9]+}}.s[1]
463   %shuffle = shufflevector <2 x i32> %v1, <2 x i32> undef, <2 x i32> <i32 1, i32 1>
464   ret <2 x i32> %shuffle
465 }
466
467 define <16 x i8> @test_vdupq_lane_s8(<8 x i8> %v1) #0 {
468 ;CHECK: {{v[0-9]+}}.16b, {{v[0-9]+}}.b[5]
469   %shuffle = shufflevector <8 x i8> %v1, <8 x i8> undef, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
470   ret <16 x i8> %shuffle
471 }
472
473 define <8 x i16> @test_vdupq_lane_s16(<4 x i16> %v1) #0 {
474 ;CHECK: {{v[0-9]+}}.8h, {{v[0-9]+}}.h[2]
475   %shuffle = shufflevector <4 x i16> %v1, <4 x i16> undef, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
476   ret <8 x i16> %shuffle
477 }
478
479 define <4 x i32> @test_vdupq_lane_s32(<2 x i32> %v1) #0 {
480 ;CHECK: {{v[0-9]+}}.4s, {{v[0-9]+}}.s[1]
481   %shuffle = shufflevector <2 x i32> %v1, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
482   ret <4 x i32> %shuffle
483 }
484
485 define <2 x i64> @test_vdupq_lane_s64(<1 x i64> %v1) #0 {
486 ;CHECK: {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
487   %shuffle = shufflevector <1 x i64> %v1, <1 x i64> undef, <2 x i32> zeroinitializer
488   ret <2 x i64> %shuffle
489 }
490
491 define <8 x i8> @test_vdup_laneq_s8(<16 x i8> %v1) #0 {
492 ;CHECK: dup {{v[0-9]+}}.8b, {{v[0-9]+}}.b[5]
493   %shuffle = shufflevector <16 x i8> %v1, <16 x i8> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
494   ret <8 x i8> %shuffle
495 }
496
497 define <4 x i16> @test_vdup_laneq_s16(<8 x i16> %v1) #0 {
498 ;CHECK: dup {{v[0-9]+}}.4h, {{v[0-9]+}}.h[2]
499   %shuffle = shufflevector <8 x i16> %v1, <8 x i16> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
500   ret <4 x i16> %shuffle
501 }
502
503 define <2 x i32> @test_vdup_laneq_s32(<4 x i32> %v1) #0 {
504 ;CHECK: dup {{v[0-9]+}}.2s, {{v[0-9]+}}.s[1]
505   %shuffle = shufflevector <4 x i32> %v1, <4 x i32> undef, <2 x i32> <i32 1, i32 1>
506   ret <2 x i32> %shuffle
507 }
508
509 define <16 x i8> @test_vdupq_laneq_s8(<16 x i8> %v1) #0 {
510 ;CHECK: dup {{v[0-9]+}}.16b, {{v[0-9]+}}.b[5]
511   %shuffle = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
512   ret <16 x i8> %shuffle
513 }
514
515 define <8 x i16> @test_vdupq_laneq_s16(<8 x i16> %v1) #0 {
516 ;CHECK: {{v[0-9]+}}.8h, {{v[0-9]+}}.h[2]
517   %shuffle = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
518   ret <8 x i16> %shuffle
519 }
520
521 define <4 x i32> @test_vdupq_laneq_s32(<4 x i32> %v1) #0 {
522 ;CHECK: dup {{v[0-9]+}}.4s, {{v[0-9]+}}.s[1]
523   %shuffle = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
524   ret <4 x i32> %shuffle
525 }
526
527 define <2 x i64> @test_vdupq_laneq_s64(<2 x i64> %v1) #0 {
528 ;CHECK: dup {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
529   %shuffle = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer
530   ret <2 x i64> %shuffle
531 }
532
533 define i64 @test_bitcastv8i8toi64(<8 x i8> %in) {
534 ; CHECK-LABEL: test_bitcastv8i8toi64:
535    %res = bitcast <8 x i8> %in to i64
536 ; CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}}
537    ret i64 %res
538 }
539
540 define i64 @test_bitcastv4i16toi64(<4 x i16> %in) {
541 ; CHECK-LABEL: test_bitcastv4i16toi64:
542    %res = bitcast <4 x i16> %in to i64
543 ; CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}}
544    ret i64 %res
545 }
546
547 define i64 @test_bitcastv2i32toi64(<2 x i32> %in) {
548 ; CHECK-LABEL: test_bitcastv2i32toi64:
549    %res = bitcast <2 x i32> %in to i64
550 ; CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}}
551    ret i64 %res
552 }
553
554 define i64 @test_bitcastv2f32toi64(<2 x float> %in) {
555 ; CHECK-LABEL: test_bitcastv2f32toi64:
556    %res = bitcast <2 x float> %in to i64
557 ; CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}}
558    ret i64 %res
559 }
560
561 define i64 @test_bitcastv1i64toi64(<1 x i64> %in) {
562 ; CHECK-LABEL: test_bitcastv1i64toi64:
563    %res = bitcast <1 x i64> %in to i64
564 ; CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}}
565    ret i64 %res
566 }
567
568 define i64 @test_bitcastv1f64toi64(<1 x double> %in) {
569 ; CHECK-LABEL: test_bitcastv1f64toi64:
570    %res = bitcast <1 x double> %in to i64
571 ; CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}}
572    ret i64 %res
573 }
574
575 define <8 x i8> @test_bitcasti64tov8i8(i64 %in) {
576 ; CHECK-LABEL: test_bitcasti64tov8i8:
577    %res = bitcast i64 %in to <8 x i8>
578 ; CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}}
579    ret <8 x i8> %res
580 }
581
582 define <4 x i16> @test_bitcasti64tov4i16(i64 %in) {
583 ; CHECK-LABEL: test_bitcasti64tov4i16:
584    %res = bitcast i64 %in to <4 x i16>
585 ; CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}}
586    ret <4 x i16> %res
587 }
588
589 define <2 x i32> @test_bitcasti64tov2i32(i64 %in) {
590 ; CHECK-LABEL: test_bitcasti64tov2i32:
591    %res = bitcast i64 %in to <2 x i32>
592 ; CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}}
593    ret <2 x i32> %res
594 }
595
596 define <2 x float> @test_bitcasti64tov2f32(i64 %in) {
597 ; CHECK-LABEL: test_bitcasti64tov2f32:
598    %res = bitcast i64 %in to <2 x float>
599 ; CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}}
600    ret <2 x float> %res
601 }
602
603 define <1 x i64> @test_bitcasti64tov1i64(i64 %in) {
604 ; CHECK-LABEL: test_bitcasti64tov1i64:
605    %res = bitcast i64 %in to <1 x i64>
606 ; CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}}
607    ret <1 x i64> %res
608 }
609
610 define <1 x double> @test_bitcasti64tov1f64(i64 %in) {
611 ; CHECK-LABEL: test_bitcasti64tov1f64:
612    %res = bitcast i64 %in to <1 x double>
613 ; CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}}
614    ret <1 x double> %res
615 }
616
617 define <1 x i64> @test_bitcastv8i8tov1f64(<8 x i8> %a) #0 {
618 ; CHECK-LABEL: test_bitcastv8i8tov1f64:
619 ; CHECK: neg {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
620 ; CHECK-NEXT: fcvtzs {{d[0-9]+}}, {{d[0-9]+}}
621   %sub.i = sub <8 x i8> zeroinitializer, %a
622   %1 = bitcast <8 x i8> %sub.i to <1 x double>
623   %vcvt.i = fptosi <1 x double> %1 to <1 x i64>
624   ret <1 x i64> %vcvt.i
625 }
626
627 define <1 x i64> @test_bitcastv4i16tov1f64(<4 x i16> %a) #0 {
628 ; CHECK-LABEL: test_bitcastv4i16tov1f64:
629 ; CHECK: neg {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
630 ; CHECK-NEXT: fcvtzs {{d[0-9]+}}, {{d[0-9]+}}
631   %sub.i = sub <4 x i16> zeroinitializer, %a
632   %1 = bitcast <4 x i16> %sub.i to <1 x double>
633   %vcvt.i = fptosi <1 x double> %1 to <1 x i64>
634   ret <1 x i64> %vcvt.i
635 }
636
637 define <1 x i64> @test_bitcastv2i32tov1f64(<2 x i32> %a) #0 {
638 ; CHECK-LABEL: test_bitcastv2i32tov1f64:
639 ; CHECK: neg {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
640 ; CHECK-NEXT: fcvtzs {{d[0-9]+}}, {{d[0-9]+}}
641   %sub.i = sub <2 x i32> zeroinitializer, %a
642   %1 = bitcast <2 x i32> %sub.i to <1 x double>
643   %vcvt.i = fptosi <1 x double> %1 to <1 x i64>
644   ret <1 x i64> %vcvt.i
645 }
646
647 define <1 x i64> @test_bitcastv1i64tov1f64(<1 x i64> %a) #0 {
648 ; CHECK-LABEL: test_bitcastv1i64tov1f64:
649 ; CHECK: neg {{d[0-9]+}}, {{d[0-9]+}}
650 ; CHECK-NEXT: fcvtzs {{d[0-9]+}}, {{d[0-9]+}}
651   %sub.i = sub <1 x i64> zeroinitializer, %a
652   %1 = bitcast <1 x i64> %sub.i to <1 x double>
653   %vcvt.i = fptosi <1 x double> %1 to <1 x i64>
654   ret <1 x i64> %vcvt.i
655 }
656
657 define <1 x i64> @test_bitcastv2f32tov1f64(<2 x float> %a) #0 {
658 ; CHECK-LABEL: test_bitcastv2f32tov1f64:
659 ; CHECK: fneg {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
660 ; CHECK-NEXT: fcvtzs {{d[0-9]+}}, {{d[0-9]+}}
661   %sub.i = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, %a
662   %1 = bitcast <2 x float> %sub.i to <1 x double>
663   %vcvt.i = fptosi <1 x double> %1 to <1 x i64>
664   ret <1 x i64> %vcvt.i
665 }
666
667 define <8 x i8> @test_bitcastv1f64tov8i8(<1 x i64> %a) #0 {
668 ; CHECK-LABEL: test_bitcastv1f64tov8i8:
669 ; CHECK: scvtf {{d[0-9]+}}, {{d[0-9]+}}
670 ; CHECK-NEXT: neg {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
671   %vcvt.i = sitofp <1 x i64> %a to <1 x double>
672   %1 = bitcast <1 x double> %vcvt.i to <8 x i8>
673   %sub.i = sub <8 x i8> zeroinitializer, %1
674   ret <8 x i8> %sub.i
675 }
676
677 define <4 x i16> @test_bitcastv1f64tov4i16(<1 x i64> %a) #0 {
678 ; CHECK-LABEL: test_bitcastv1f64tov4i16:
679 ; CHECK: scvtf {{d[0-9]+}}, {{d[0-9]+}}
680 ; CHECK-NEXT: neg {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
681   %vcvt.i = sitofp <1 x i64> %a to <1 x double>
682   %1 = bitcast <1 x double> %vcvt.i to <4 x i16>
683   %sub.i = sub <4 x i16> zeroinitializer, %1
684   ret <4 x i16> %sub.i
685 }
686
687 define <2 x i32> @test_bitcastv1f64tov2i32(<1 x i64> %a) #0 {
688 ; CHECK-LABEL: test_bitcastv1f64tov2i32:
689 ; CHECK: scvtf {{d[0-9]+}}, {{d[0-9]+}}
690 ; CHECK-NEXT: neg {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
691   %vcvt.i = sitofp <1 x i64> %a to <1 x double>
692   %1 = bitcast <1 x double> %vcvt.i to <2 x i32>
693   %sub.i = sub <2 x i32> zeroinitializer, %1
694   ret <2 x i32> %sub.i
695 }
696
697 define <1 x i64> @test_bitcastv1f64tov1i64(<1 x i64> %a) #0 {
698 ; CHECK-LABEL: test_bitcastv1f64tov1i64:
699 ; CHECK: scvtf {{d[0-9]+}}, {{d[0-9]+}}
700 ; CHECK-NEXT: neg {{d[0-9]+}}, {{d[0-9]+}}
701   %vcvt.i = sitofp <1 x i64> %a to <1 x double>
702   %1 = bitcast <1 x double> %vcvt.i to <1 x i64>
703   %sub.i = sub <1 x i64> zeroinitializer, %1
704   ret <1 x i64> %sub.i
705 }
706
707 define <2 x float> @test_bitcastv1f64tov2f32(<1 x i64> %a) #0 {
708 ; CHECK-LABEL: test_bitcastv1f64tov2f32:
709 ; CHECK: scvtf {{d[0-9]+}}, {{d[0-9]+}}
710 ; CHECK-NEXT: fneg {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
711   %vcvt.i = sitofp <1 x i64> %a to <1 x double>
712   %1 = bitcast <1 x double> %vcvt.i to <2 x float>
713   %sub.i = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, %1
714   ret <2 x float> %sub.i
715 }
716
717 ; Test insert element into an undef vector
718 define <8 x i8> @scalar_to_vector.v8i8(i8 %a) {
719 ; CHECK-LABEL: scalar_to_vector.v8i8:
720 ; CHECK: ins {{v[0-9]+}}.b[0], {{w[0-9]+}}
721   %b = insertelement <8 x i8> undef, i8 %a, i32 0
722   ret <8 x i8> %b
723 }
724
725 define <16 x i8> @scalar_to_vector.v16i8(i8 %a) {
726 ; CHECK-LABEL: scalar_to_vector.v16i8:
727 ; CHECK: ins {{v[0-9]+}}.b[0], {{w[0-9]+}}
728   %b = insertelement <16 x i8> undef, i8 %a, i32 0
729   ret <16 x i8> %b
730 }
731
732 define <4 x i16> @scalar_to_vector.v4i16(i16 %a) {
733 ; CHECK-LABEL: scalar_to_vector.v4i16:
734 ; CHECK: ins {{v[0-9]+}}.h[0], {{w[0-9]+}}
735   %b = insertelement <4 x i16> undef, i16 %a, i32 0
736   ret <4 x i16> %b
737 }
738
739 define <8 x i16> @scalar_to_vector.v8i16(i16 %a) {
740 ; CHECK-LABEL: scalar_to_vector.v8i16:
741 ; CHECK: ins {{v[0-9]+}}.h[0], {{w[0-9]+}}
742   %b = insertelement <8 x i16> undef, i16 %a, i32 0
743   ret <8 x i16> %b
744 }
745
746 define <2 x i32> @scalar_to_vector.v2i32(i32 %a) {
747 ; CHECK-LABEL: scalar_to_vector.v2i32:
748 ; CHECK: ins {{v[0-9]+}}.s[0], {{w[0-9]+}}
749   %b = insertelement <2 x i32> undef, i32 %a, i32 0
750   ret <2 x i32> %b
751 }
752
753 define <4 x i32> @scalar_to_vector.v4i32(i32 %a) {
754 ; CHECK-LABEL: scalar_to_vector.v4i32:
755 ; CHECK: ins {{v[0-9]+}}.s[0], {{w[0-9]+}}
756   %b = insertelement <4 x i32> undef, i32 %a, i32 0
757   ret <4 x i32> %b
758 }
759
760 define <2 x i64> @scalar_to_vector.v2i64(i64 %a) {
761 ; CHECK-LABEL: scalar_to_vector.v2i64:
762 ; CHECK: ins {{v[0-9]+}}.d[0], {{x[0-9]+}}
763   %b = insertelement <2 x i64> undef, i64 %a, i32 0
764   ret <2 x i64> %b
765 }
766
767 define <8 x i8> @testDUP.v1i8(<1 x i8> %a) {
768 ; CHECK-LABEL: testDUP.v1i8:
769 ; CHECK: dup {{v[0-9]+}}.8b, {{w[0-9]+}}
770   %b = extractelement <1 x i8> %a, i32 0
771   %c = insertelement <8 x i8> undef, i8 %b, i32 0
772   %d = insertelement <8 x i8> %c, i8 %b, i32 1
773   %e = insertelement <8 x i8> %d, i8 %b, i32 2
774   %f = insertelement <8 x i8> %e, i8 %b, i32 3
775   %g = insertelement <8 x i8> %f, i8 %b, i32 4
776   %h = insertelement <8 x i8> %g, i8 %b, i32 5
777   %i = insertelement <8 x i8> %h, i8 %b, i32 6
778   %j = insertelement <8 x i8> %i, i8 %b, i32 7
779   ret <8 x i8> %j
780 }
781
782 define <8 x i16> @testDUP.v1i16(<1 x i16> %a) {
783 ; CHECK-LABEL: testDUP.v1i16:
784 ; CHECK: dup {{v[0-9]+}}.8h, {{w[0-9]+}}
785   %b = extractelement <1 x i16> %a, i32 0
786   %c = insertelement <8 x i16> undef, i16 %b, i32 0
787   %d = insertelement <8 x i16> %c, i16 %b, i32 1
788   %e = insertelement <8 x i16> %d, i16 %b, i32 2
789   %f = insertelement <8 x i16> %e, i16 %b, i32 3
790   %g = insertelement <8 x i16> %f, i16 %b, i32 4
791   %h = insertelement <8 x i16> %g, i16 %b, i32 5
792   %i = insertelement <8 x i16> %h, i16 %b, i32 6
793   %j = insertelement <8 x i16> %i, i16 %b, i32 7
794   ret <8 x i16> %j
795 }
796
797 define <4 x i32> @testDUP.v1i32(<1 x i32> %a) {
798 ; CHECK-LABEL: testDUP.v1i32:
799 ; CHECK: dup {{v[0-9]+}}.4s, {{w[0-9]+}}
800   %b = extractelement <1 x i32> %a, i32 0
801   %c = insertelement <4 x i32> undef, i32 %b, i32 0
802   %d = insertelement <4 x i32> %c, i32 %b, i32 1
803   %e = insertelement <4 x i32> %d, i32 %b, i32 2
804   %f = insertelement <4 x i32> %e, i32 %b, i32 3
805   ret <4 x i32> %f
806 }
807
808 define <8 x i8> @getl(<16 x i8> %x) #0 {
809 ; CHECK-LABEL: getl:
810 ; CHECK: ret
811   %vecext = extractelement <16 x i8> %x, i32 0
812   %vecinit = insertelement <8 x i8> undef, i8 %vecext, i32 0
813   %vecext1 = extractelement <16 x i8> %x, i32 1
814   %vecinit2 = insertelement <8 x i8> %vecinit, i8 %vecext1, i32 1
815   %vecext3 = extractelement <16 x i8> %x, i32 2
816   %vecinit4 = insertelement <8 x i8> %vecinit2, i8 %vecext3, i32 2
817   %vecext5 = extractelement <16 x i8> %x, i32 3
818   %vecinit6 = insertelement <8 x i8> %vecinit4, i8 %vecext5, i32 3
819   %vecext7 = extractelement <16 x i8> %x, i32 4
820   %vecinit8 = insertelement <8 x i8> %vecinit6, i8 %vecext7, i32 4
821   %vecext9 = extractelement <16 x i8> %x, i32 5
822   %vecinit10 = insertelement <8 x i8> %vecinit8, i8 %vecext9, i32 5
823   %vecext11 = extractelement <16 x i8> %x, i32 6
824   %vecinit12 = insertelement <8 x i8> %vecinit10, i8 %vecext11, i32 6
825   %vecext13 = extractelement <16 x i8> %x, i32 7
826   %vecinit14 = insertelement <8 x i8> %vecinit12, i8 %vecext13, i32 7
827   ret <8 x i8> %vecinit14
828 }
829
830 define <4 x i16> @test_dup_v2i32_v4i16(<2 x i32> %a) {
831 ; CHECK-LABEL: test_dup_v2i32_v4i16:
832 ; CHECK: dup v0.4h, v0.h[2]
833 entry:
834   %x = extractelement <2 x i32> %a, i32 1
835   %vget_lane = trunc i32 %x to i16
836   %vecinit.i = insertelement <4 x i16> undef, i16 %vget_lane, i32 0
837   %vecinit1.i = insertelement <4 x i16> %vecinit.i, i16 %vget_lane, i32 1
838   %vecinit2.i = insertelement <4 x i16> %vecinit1.i, i16 %vget_lane, i32 2
839   %vecinit3.i = insertelement <4 x i16> %vecinit2.i, i16 %vget_lane, i32 3
840   ret <4 x i16> %vecinit3.i
841 }
842
843 define <8 x i16> @test_dup_v4i32_v8i16(<4 x i32> %a) {
844 ; CHECK-LABEL: test_dup_v4i32_v8i16:
845 ; CHECK: dup v0.8h, v0.h[6]
846 entry:
847   %x = extractelement <4 x i32> %a, i32 3
848   %vget_lane = trunc i32 %x to i16
849   %vecinit.i = insertelement <8 x i16> undef, i16 %vget_lane, i32 0
850   %vecinit1.i = insertelement <8 x i16> %vecinit.i, i16 %vget_lane, i32 1
851   %vecinit2.i = insertelement <8 x i16> %vecinit1.i, i16 %vget_lane, i32 2
852   %vecinit3.i = insertelement <8 x i16> %vecinit2.i, i16 %vget_lane, i32 3
853   %vecinit4.i = insertelement <8 x i16> %vecinit3.i, i16 %vget_lane, i32 4
854   %vecinit5.i = insertelement <8 x i16> %vecinit4.i, i16 %vget_lane, i32 5
855   %vecinit6.i = insertelement <8 x i16> %vecinit5.i, i16 %vget_lane, i32 6
856   %vecinit7.i = insertelement <8 x i16> %vecinit6.i, i16 %vget_lane, i32 7
857   ret <8 x i16> %vecinit7.i
858 }
859
860 define <4 x i16> @test_dup_v1i64_v4i16(<1 x i64> %a) {
861 ; CHECK-LABEL: test_dup_v1i64_v4i16:
862 ; CHECK: dup v0.4h, v0.h[0]
863 entry:
864   %x = extractelement <1 x i64> %a, i32 0
865   %vget_lane = trunc i64 %x to i16
866   %vecinit.i = insertelement <4 x i16> undef, i16 %vget_lane, i32 0
867   %vecinit1.i = insertelement <4 x i16> %vecinit.i, i16 %vget_lane, i32 1
868   %vecinit2.i = insertelement <4 x i16> %vecinit1.i, i16 %vget_lane, i32 2
869   %vecinit3.i = insertelement <4 x i16> %vecinit2.i, i16 %vget_lane, i32 3
870   ret <4 x i16> %vecinit3.i
871 }
872
873 define <2 x i32> @test_dup_v1i64_v2i32(<1 x i64> %a) {
874 ; CHECK-LABEL: test_dup_v1i64_v2i32:
875 ; CHECK: dup v0.2s, v0.s[0]
876 entry:
877   %x = extractelement <1 x i64> %a, i32 0
878   %vget_lane = trunc i64 %x to i32
879   %vecinit.i = insertelement <2 x i32> undef, i32 %vget_lane, i32 0
880   %vecinit1.i = insertelement <2 x i32> %vecinit.i, i32 %vget_lane, i32 1
881   ret <2 x i32> %vecinit1.i
882 }
883
884 define <8 x i16> @test_dup_v2i64_v8i16(<2 x i64> %a) {
885 ; CHECK-LABEL: test_dup_v2i64_v8i16:
886 ; CHECK: dup v0.8h, v0.h[4]
887 entry:
888   %x = extractelement <2 x i64> %a, i32 1
889   %vget_lane = trunc i64 %x to i16
890   %vecinit.i = insertelement <8 x i16> undef, i16 %vget_lane, i32 0
891   %vecinit1.i = insertelement <8 x i16> %vecinit.i, i16 %vget_lane, i32 1
892   %vecinit2.i = insertelement <8 x i16> %vecinit1.i, i16 %vget_lane, i32 2
893   %vecinit3.i = insertelement <8 x i16> %vecinit2.i, i16 %vget_lane, i32 3
894   %vecinit4.i = insertelement <8 x i16> %vecinit3.i, i16 %vget_lane, i32 4
895   %vecinit5.i = insertelement <8 x i16> %vecinit4.i, i16 %vget_lane, i32 5
896   %vecinit6.i = insertelement <8 x i16> %vecinit5.i, i16 %vget_lane, i32 6
897   %vecinit7.i = insertelement <8 x i16> %vecinit6.i, i16 %vget_lane, i32 7
898   ret <8 x i16> %vecinit7.i
899 }
900
901 define <4 x i32> @test_dup_v2i64_v4i32(<2 x i64> %a) {
902 ; CHECK-LABEL: test_dup_v2i64_v4i32:
903 ; CHECK: dup v0.4s, v0.s[2]
904 entry:
905   %x = extractelement <2 x i64> %a, i32 1
906   %vget_lane = trunc i64 %x to i32
907   %vecinit.i = insertelement <4 x i32> undef, i32 %vget_lane, i32 0
908   %vecinit1.i = insertelement <4 x i32> %vecinit.i, i32 %vget_lane, i32 1
909   %vecinit2.i = insertelement <4 x i32> %vecinit1.i, i32 %vget_lane, i32 2
910   %vecinit3.i = insertelement <4 x i32> %vecinit2.i, i32 %vget_lane, i32 3
911   ret <4 x i32> %vecinit3.i
912 }
913
914 define <4 x i16> @test_dup_v4i32_v4i16(<4 x i32> %a) {
915 ; CHECK-LABEL: test_dup_v4i32_v4i16:
916 ; CHECK: dup v0.4h, v0.h[2]
917 entry:
918   %x = extractelement <4 x i32> %a, i32 1
919   %vget_lane = trunc i32 %x to i16
920   %vecinit.i = insertelement <4 x i16> undef, i16 %vget_lane, i32 0
921   %vecinit1.i = insertelement <4 x i16> %vecinit.i, i16 %vget_lane, i32 1
922   %vecinit2.i = insertelement <4 x i16> %vecinit1.i, i16 %vget_lane, i32 2
923   %vecinit3.i = insertelement <4 x i16> %vecinit2.i, i16 %vget_lane, i32 3
924   ret <4 x i16> %vecinit3.i
925 }
926
927 define <4 x i16> @test_dup_v2i64_v4i16(<2 x i64> %a) {
928 ; CHECK-LABEL: test_dup_v2i64_v4i16:
929 ; CHECK: dup v0.4h, v0.h[0]
930 entry:
931   %x = extractelement <2 x i64> %a, i32 0
932   %vget_lane = trunc i64 %x to i16
933   %vecinit.i = insertelement <4 x i16> undef, i16 %vget_lane, i32 0
934   %vecinit1.i = insertelement <4 x i16> %vecinit.i, i16 %vget_lane, i32 1
935   %vecinit2.i = insertelement <4 x i16> %vecinit1.i, i16 %vget_lane, i32 2
936   %vecinit3.i = insertelement <4 x i16> %vecinit2.i, i16 %vget_lane, i32 3
937   ret <4 x i16> %vecinit3.i
938 }
939
940 define <2 x i32> @test_dup_v2i64_v2i32(<2 x i64> %a) {
941 ; CHECK-LABEL: test_dup_v2i64_v2i32:
942 ; CHECK: dup v0.2s, v0.s[0]
943 entry:
944   %x = extractelement <2 x i64> %a, i32 0
945   %vget_lane = trunc i64 %x to i32
946   %vecinit.i = insertelement <2 x i32> undef, i32 %vget_lane, i32 0
947   %vecinit1.i = insertelement <2 x i32> %vecinit.i, i32 %vget_lane, i32 1
948   ret <2 x i32> %vecinit1.i
949 }
950
951 define <2 x i32> @test_concat_undef_v1i32(<1 x i32> %a) {
952 ; CHECK-LABEL: test_concat_undef_v1i32:
953 ; CHECK: dup v{{[0-9]+}}.2s, v{{[0-9]+}}.s[0]
954 entry:
955   %0 = extractelement <1 x i32> %a, i32 0
956   %vecinit1.i = insertelement <2 x i32> undef, i32 %0, i32 1
957   ret <2 x i32> %vecinit1.i
958 }
959
960 define <2 x i32> @test_concat_v1i32_v1i32(<1 x i32> %a) {
961 ; CHECK-LABEL: test_concat_v1i32_v1i32:
962 ; CHECK: dup v{{[0-9]+}}.2s, v{{[0-9]+}}.s[0]
963 entry:
964   %0 = extractelement <1 x i32> %a, i32 0
965   %vecinit.i = insertelement <2 x i32> undef, i32 %0, i32 0
966   %vecinit1.i = insertelement <2 x i32> %vecinit.i, i32 %0, i32 1
967   ret <2 x i32> %vecinit1.i
968 }
969
970 define <2 x float> @test_scalar_to_vector_f32_to_v2f32(<1 x float> %a) {
971 entry:
972   %0 = extractelement <1 x float> %a, i32 0
973   %vecinit1.i = insertelement <2 x float> undef, float %0, i32 0
974   ret <2 x float> %vecinit1.i
975 }
976
977 define <4 x float> @test_scalar_to_vector_f32_to_v4f32(<1 x float> %a) {
978 entry:
979   %0 = extractelement <1 x float> %a, i32 0
980   %vecinit1.i = insertelement <4 x float> undef, float %0, i32 0
981   ret <4 x float> %vecinit1.i
982 }