blob: 50e4df9f57c5d28cc042812e821c76368b8c6aca [file] [log] [blame]
Dan Gohmanfce288f2009-09-09 00:09:15 +00001; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
Bob Wilson5bafff32009-06-22 23:27:02 +00002
3define <8 x i8> @v_dup8(i8 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +00004;CHECK: v_dup8:
5;CHECK: vdup.8
Bob Wilson5bafff32009-06-22 23:27:02 +00006 %tmp1 = insertelement <8 x i8> zeroinitializer, i8 %A, i32 0
7 %tmp2 = insertelement <8 x i8> %tmp1, i8 %A, i32 1
8 %tmp3 = insertelement <8 x i8> %tmp2, i8 %A, i32 2
9 %tmp4 = insertelement <8 x i8> %tmp3, i8 %A, i32 3
10 %tmp5 = insertelement <8 x i8> %tmp4, i8 %A, i32 4
11 %tmp6 = insertelement <8 x i8> %tmp5, i8 %A, i32 5
12 %tmp7 = insertelement <8 x i8> %tmp6, i8 %A, i32 6
13 %tmp8 = insertelement <8 x i8> %tmp7, i8 %A, i32 7
14 ret <8 x i8> %tmp8
15}
16
17define <4 x i16> @v_dup16(i16 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +000018;CHECK: v_dup16:
19;CHECK: vdup.16
Bob Wilson5bafff32009-06-22 23:27:02 +000020 %tmp1 = insertelement <4 x i16> zeroinitializer, i16 %A, i32 0
21 %tmp2 = insertelement <4 x i16> %tmp1, i16 %A, i32 1
22 %tmp3 = insertelement <4 x i16> %tmp2, i16 %A, i32 2
23 %tmp4 = insertelement <4 x i16> %tmp3, i16 %A, i32 3
24 ret <4 x i16> %tmp4
25}
26
27define <2 x i32> @v_dup32(i32 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +000028;CHECK: v_dup32:
29;CHECK: vdup.32
Bob Wilson5bafff32009-06-22 23:27:02 +000030 %tmp1 = insertelement <2 x i32> zeroinitializer, i32 %A, i32 0
31 %tmp2 = insertelement <2 x i32> %tmp1, i32 %A, i32 1
32 ret <2 x i32> %tmp2
33}
34
35define <2 x float> @v_dupfloat(float %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +000036;CHECK: v_dupfloat:
37;CHECK: vdup.32
Bob Wilson5bafff32009-06-22 23:27:02 +000038 %tmp1 = insertelement <2 x float> zeroinitializer, float %A, i32 0
39 %tmp2 = insertelement <2 x float> %tmp1, float %A, i32 1
40 ret <2 x float> %tmp2
41}
42
43define <16 x i8> @v_dupQ8(i8 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +000044;CHECK: v_dupQ8:
45;CHECK: vdup.8
Bob Wilson5bafff32009-06-22 23:27:02 +000046 %tmp1 = insertelement <16 x i8> zeroinitializer, i8 %A, i32 0
47 %tmp2 = insertelement <16 x i8> %tmp1, i8 %A, i32 1
48 %tmp3 = insertelement <16 x i8> %tmp2, i8 %A, i32 2
49 %tmp4 = insertelement <16 x i8> %tmp3, i8 %A, i32 3
50 %tmp5 = insertelement <16 x i8> %tmp4, i8 %A, i32 4
51 %tmp6 = insertelement <16 x i8> %tmp5, i8 %A, i32 5
52 %tmp7 = insertelement <16 x i8> %tmp6, i8 %A, i32 6
53 %tmp8 = insertelement <16 x i8> %tmp7, i8 %A, i32 7
54 %tmp9 = insertelement <16 x i8> %tmp8, i8 %A, i32 8
55 %tmp10 = insertelement <16 x i8> %tmp9, i8 %A, i32 9
56 %tmp11 = insertelement <16 x i8> %tmp10, i8 %A, i32 10
57 %tmp12 = insertelement <16 x i8> %tmp11, i8 %A, i32 11
58 %tmp13 = insertelement <16 x i8> %tmp12, i8 %A, i32 12
59 %tmp14 = insertelement <16 x i8> %tmp13, i8 %A, i32 13
60 %tmp15 = insertelement <16 x i8> %tmp14, i8 %A, i32 14
61 %tmp16 = insertelement <16 x i8> %tmp15, i8 %A, i32 15
62 ret <16 x i8> %tmp16
63}
64
65define <8 x i16> @v_dupQ16(i16 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +000066;CHECK: v_dupQ16:
67;CHECK: vdup.16
Bob Wilson5bafff32009-06-22 23:27:02 +000068 %tmp1 = insertelement <8 x i16> zeroinitializer, i16 %A, i32 0
69 %tmp2 = insertelement <8 x i16> %tmp1, i16 %A, i32 1
70 %tmp3 = insertelement <8 x i16> %tmp2, i16 %A, i32 2
71 %tmp4 = insertelement <8 x i16> %tmp3, i16 %A, i32 3
72 %tmp5 = insertelement <8 x i16> %tmp4, i16 %A, i32 4
73 %tmp6 = insertelement <8 x i16> %tmp5, i16 %A, i32 5
74 %tmp7 = insertelement <8 x i16> %tmp6, i16 %A, i32 6
75 %tmp8 = insertelement <8 x i16> %tmp7, i16 %A, i32 7
76 ret <8 x i16> %tmp8
77}
78
79define <4 x i32> @v_dupQ32(i32 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +000080;CHECK: v_dupQ32:
81;CHECK: vdup.32
Bob Wilson5bafff32009-06-22 23:27:02 +000082 %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %A, i32 0
83 %tmp2 = insertelement <4 x i32> %tmp1, i32 %A, i32 1
84 %tmp3 = insertelement <4 x i32> %tmp2, i32 %A, i32 2
85 %tmp4 = insertelement <4 x i32> %tmp3, i32 %A, i32 3
86 ret <4 x i32> %tmp4
87}
88
89define <4 x float> @v_dupQfloat(float %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +000090;CHECK: v_dupQfloat:
91;CHECK: vdup.32
Bob Wilson5bafff32009-06-22 23:27:02 +000092 %tmp1 = insertelement <4 x float> zeroinitializer, float %A, i32 0
93 %tmp2 = insertelement <4 x float> %tmp1, float %A, i32 1
94 %tmp3 = insertelement <4 x float> %tmp2, float %A, i32 2
95 %tmp4 = insertelement <4 x float> %tmp3, float %A, i32 3
96 ret <4 x float> %tmp4
97}
98
99; Check to make sure it works with shuffles, too.
100
101define <8 x i8> @v_shuffledup8(i8 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +0000102;CHECK: v_shuffledup8:
103;CHECK: vdup.8
Bob Wilson5bafff32009-06-22 23:27:02 +0000104 %tmp1 = insertelement <8 x i8> undef, i8 %A, i32 0
105 %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> zeroinitializer
106 ret <8 x i8> %tmp2
107}
108
109define <4 x i16> @v_shuffledup16(i16 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +0000110;CHECK: v_shuffledup16:
111;CHECK: vdup.16
Bob Wilson5bafff32009-06-22 23:27:02 +0000112 %tmp1 = insertelement <4 x i16> undef, i16 %A, i32 0
113 %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> zeroinitializer
114 ret <4 x i16> %tmp2
115}
116
117define <2 x i32> @v_shuffledup32(i32 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +0000118;CHECK: v_shuffledup32:
119;CHECK: vdup.32
Bob Wilson5bafff32009-06-22 23:27:02 +0000120 %tmp1 = insertelement <2 x i32> undef, i32 %A, i32 0
121 %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> zeroinitializer
122 ret <2 x i32> %tmp2
123}
124
125define <2 x float> @v_shuffledupfloat(float %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +0000126;CHECK: v_shuffledupfloat:
127;CHECK: vdup.32
Bob Wilson5bafff32009-06-22 23:27:02 +0000128 %tmp1 = insertelement <2 x float> undef, float %A, i32 0
129 %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer
130 ret <2 x float> %tmp2
131}
132
133define <16 x i8> @v_shuffledupQ8(i8 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +0000134;CHECK: v_shuffledupQ8:
135;CHECK: vdup.8
Bob Wilson5bafff32009-06-22 23:27:02 +0000136 %tmp1 = insertelement <16 x i8> undef, i8 %A, i32 0
137 %tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> zeroinitializer
138 ret <16 x i8> %tmp2
139}
140
141define <8 x i16> @v_shuffledupQ16(i16 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +0000142;CHECK: v_shuffledupQ16:
143;CHECK: vdup.16
Bob Wilson5bafff32009-06-22 23:27:02 +0000144 %tmp1 = insertelement <8 x i16> undef, i16 %A, i32 0
145 %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> zeroinitializer
146 ret <8 x i16> %tmp2
147}
148
149define <4 x i32> @v_shuffledupQ32(i32 %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +0000150;CHECK: v_shuffledupQ32:
151;CHECK: vdup.32
Bob Wilson5bafff32009-06-22 23:27:02 +0000152 %tmp1 = insertelement <4 x i32> undef, i32 %A, i32 0
153 %tmp2 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <4 x i32> zeroinitializer
154 ret <4 x i32> %tmp2
155}
156
157define <4 x float> @v_shuffledupQfloat(float %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +0000158;CHECK: v_shuffledupQfloat:
159;CHECK: vdup.32
Bob Wilson5bafff32009-06-22 23:27:02 +0000160 %tmp1 = insertelement <4 x float> undef, float %A, i32 0
161 %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer
162 ret <4 x float> %tmp2
163}
Anton Korobeynikov32a1b252009-08-07 22:36:50 +0000164
165define <2 x float> @v_shuffledupfloat2(float* %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +0000166;CHECK: v_shuffledupfloat2:
167;CHECK: vdup.32
Anton Korobeynikov32a1b252009-08-07 22:36:50 +0000168 %tmp0 = load float* %A
169 %tmp1 = insertelement <2 x float> undef, float %tmp0, i32 0
170 %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer
171 ret <2 x float> %tmp2
172}
173
174define <4 x float> @v_shuffledupQfloat2(float* %A) nounwind {
Bob Wilson6aa97752009-09-04 04:07:19 +0000175;CHECK: v_shuffledupQfloat2:
176;CHECK: vdup.32
Anton Korobeynikov32a1b252009-08-07 22:36:50 +0000177 %tmp0 = load float* %A
178 %tmp1 = insertelement <4 x float> undef, float %tmp0, i32 0
179 %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer
180 ret <4 x float> %tmp2
181}
Bob Wilson83815ae2009-10-09 20:20:54 +0000182
183define <8 x i8> @vduplane8(<8 x i8>* %A) nounwind {
184;CHECK: vduplane8:
185;CHECK: vdup.8
186 %tmp1 = load <8 x i8>* %A
187 %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 >
188 ret <8 x i8> %tmp2
189}
190
191define <4 x i16> @vduplane16(<4 x i16>* %A) nounwind {
192;CHECK: vduplane16:
193;CHECK: vdup.16
194 %tmp1 = load <4 x i16>* %A
195 %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> < i32 1, i32 1, i32 1, i32 1 >
196 ret <4 x i16> %tmp2
197}
198
199define <2 x i32> @vduplane32(<2 x i32>* %A) nounwind {
200;CHECK: vduplane32:
201;CHECK: vdup.32
202 %tmp1 = load <2 x i32>* %A
203 %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> < i32 1, i32 1 >
204 ret <2 x i32> %tmp2
205}
206
207define <2 x float> @vduplanefloat(<2 x float>* %A) nounwind {
208;CHECK: vduplanefloat:
209;CHECK: vdup.32
210 %tmp1 = load <2 x float>* %A
211 %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> < i32 1, i32 1 >
212 ret <2 x float> %tmp2
213}
214
215define <16 x i8> @vduplaneQ8(<8 x i8>* %A) nounwind {
216;CHECK: vduplaneQ8:
217;CHECK: vdup.8
218 %tmp1 = load <8 x i8>* %A
219 %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <16 x i32> < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 >
220 ret <16 x i8> %tmp2
221}
222
223define <8 x i16> @vduplaneQ16(<4 x i16>* %A) nounwind {
224;CHECK: vduplaneQ16:
225;CHECK: vdup.16
226 %tmp1 = load <4 x i16>* %A
227 %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <8 x i32> < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 >
228 ret <8 x i16> %tmp2
229}
230
231define <4 x i32> @vduplaneQ32(<2 x i32>* %A) nounwind {
232;CHECK: vduplaneQ32:
233;CHECK: vdup.32
234 %tmp1 = load <2 x i32>* %A
235 %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <4 x i32> < i32 1, i32 1, i32 1, i32 1 >
236 ret <4 x i32> %tmp2
237}
238
239define <4 x float> @vduplaneQfloat(<2 x float>* %A) nounwind {
240;CHECK: vduplaneQfloat:
241;CHECK: vdup.32
242 %tmp1 = load <2 x float>* %A
243 %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <4 x i32> < i32 1, i32 1, i32 1, i32 1 >
244 ret <4 x float> %tmp2
245}
246
Rafael Espindola1e819662010-06-17 15:18:27 +0000247define <2 x i64> @foo(<2 x i64> %arg0_int64x1_t) nounwind readnone {
Bob Wilson83815ae2009-10-09 20:20:54 +0000248entry:
249 %0 = shufflevector <2 x i64> %arg0_int64x1_t, <2 x i64> undef, <2 x i32> <i32 1, i32 1>
250 ret <2 x i64> %0
251}
252
Rafael Espindola1e819662010-06-17 15:18:27 +0000253define <2 x i64> @bar(<2 x i64> %arg0_int64x1_t) nounwind readnone {
Bob Wilson83815ae2009-10-09 20:20:54 +0000254entry:
255 %0 = shufflevector <2 x i64> %arg0_int64x1_t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
256 ret <2 x i64> %0
257}
258
Rafael Espindola1e819662010-06-17 15:18:27 +0000259define <2 x double> @baz(<2 x double> %arg0_int64x1_t) nounwind readnone {
Bob Wilson83815ae2009-10-09 20:20:54 +0000260entry:
261 %0 = shufflevector <2 x double> %arg0_int64x1_t, <2 x double> undef, <2 x i32> <i32 1, i32 1>
262 ret <2 x double> %0
263}
264
Rafael Espindola1e819662010-06-17 15:18:27 +0000265define <2 x double> @qux(<2 x double> %arg0_int64x1_t) nounwind readnone {
Bob Wilson83815ae2009-10-09 20:20:54 +0000266entry:
267 %0 = shufflevector <2 x double> %arg0_int64x1_t, <2 x double> undef, <2 x i32> <i32 0, i32 0>
268 ret <2 x double> %0
269}