blob: e4368d6d5db379796589f8baea6d3c5fcb32a3b1 [file] [log] [blame]
Bob Wilsonfe27c512009-10-07 23:47:21 +00001; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
Bob Wilson5bafff32009-06-22 23:27:02 +00002
3define <8 x i8> @v_movi8() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +00004;CHECK: v_movi8:
5;CHECK: vmov.i8
Bob Wilson5bafff32009-06-22 23:27:02 +00006 ret <8 x i8> < i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8 >
7}
8
9define <4 x i16> @v_movi16a() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000010;CHECK: v_movi16a:
11;CHECK: vmov.i16
Bob Wilson5bafff32009-06-22 23:27:02 +000012 ret <4 x i16> < i16 16, i16 16, i16 16, i16 16 >
13}
14
15; 0x1000 = 4096
16define <4 x i16> @v_movi16b() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000017;CHECK: v_movi16b:
18;CHECK: vmov.i16
Bob Wilson5bafff32009-06-22 23:27:02 +000019 ret <4 x i16> < i16 4096, i16 4096, i16 4096, i16 4096 >
20}
21
22define <2 x i32> @v_movi32a() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000023;CHECK: v_movi32a:
24;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +000025 ret <2 x i32> < i32 32, i32 32 >
26}
27
28; 0x2000 = 8192
29define <2 x i32> @v_movi32b() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000030;CHECK: v_movi32b:
31;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +000032 ret <2 x i32> < i32 8192, i32 8192 >
33}
34
35; 0x200000 = 2097152
36define <2 x i32> @v_movi32c() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000037;CHECK: v_movi32c:
38;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +000039 ret <2 x i32> < i32 2097152, i32 2097152 >
40}
41
42; 0x20000000 = 536870912
43define <2 x i32> @v_movi32d() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000044;CHECK: v_movi32d:
45;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +000046 ret <2 x i32> < i32 536870912, i32 536870912 >
47}
48
49; 0x20ff = 8447
50define <2 x i32> @v_movi32e() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000051;CHECK: v_movi32e:
52;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +000053 ret <2 x i32> < i32 8447, i32 8447 >
54}
55
56; 0x20ffff = 2162687
57define <2 x i32> @v_movi32f() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000058;CHECK: v_movi32f:
59;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +000060 ret <2 x i32> < i32 2162687, i32 2162687 >
61}
62
63; 0xff0000ff0000ffff = 18374687574888349695
64define <1 x i64> @v_movi64() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000065;CHECK: v_movi64:
66;CHECK: vmov.i64
Bob Wilson5bafff32009-06-22 23:27:02 +000067 ret <1 x i64> < i64 18374687574888349695 >
68}
69
70define <16 x i8> @v_movQi8() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000071;CHECK: v_movQi8:
72;CHECK: vmov.i8
Bob Wilson5bafff32009-06-22 23:27:02 +000073 ret <16 x i8> < i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8 >
74}
75
76define <8 x i16> @v_movQi16a() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000077;CHECK: v_movQi16a:
78;CHECK: vmov.i16
Bob Wilson5bafff32009-06-22 23:27:02 +000079 ret <8 x i16> < i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16 >
80}
81
82; 0x1000 = 4096
83define <8 x i16> @v_movQi16b() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000084;CHECK: v_movQi16b:
85;CHECK: vmov.i16
Bob Wilson5bafff32009-06-22 23:27:02 +000086 ret <8 x i16> < i16 4096, i16 4096, i16 4096, i16 4096, i16 4096, i16 4096, i16 4096, i16 4096 >
87}
88
89define <4 x i32> @v_movQi32a() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000090;CHECK: v_movQi32a:
91;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +000092 ret <4 x i32> < i32 32, i32 32, i32 32, i32 32 >
93}
94
95; 0x2000 = 8192
96define <4 x i32> @v_movQi32b() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +000097;CHECK: v_movQi32b:
98;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +000099 ret <4 x i32> < i32 8192, i32 8192, i32 8192, i32 8192 >
100}
101
102; 0x200000 = 2097152
103define <4 x i32> @v_movQi32c() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +0000104;CHECK: v_movQi32c:
105;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +0000106 ret <4 x i32> < i32 2097152, i32 2097152, i32 2097152, i32 2097152 >
107}
108
109; 0x20000000 = 536870912
110define <4 x i32> @v_movQi32d() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +0000111;CHECK: v_movQi32d:
112;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +0000113 ret <4 x i32> < i32 536870912, i32 536870912, i32 536870912, i32 536870912 >
114}
115
116; 0x20ff = 8447
117define <4 x i32> @v_movQi32e() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +0000118;CHECK: v_movQi32e:
119;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +0000120 ret <4 x i32> < i32 8447, i32 8447, i32 8447, i32 8447 >
121}
122
123; 0x20ffff = 2162687
124define <4 x i32> @v_movQi32f() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +0000125;CHECK: v_movQi32f:
126;CHECK: vmov.i32
Bob Wilson5bafff32009-06-22 23:27:02 +0000127 ret <4 x i32> < i32 2162687, i32 2162687, i32 2162687, i32 2162687 >
128}
129
130; 0xff0000ff0000ffff = 18374687574888349695
131define <2 x i64> @v_movQi64() nounwind {
Bob Wilsonfe27c512009-10-07 23:47:21 +0000132;CHECK: v_movQi64:
133;CHECK: vmov.i64
Bob Wilson5bafff32009-06-22 23:27:02 +0000134 ret <2 x i64> < i64 18374687574888349695, i64 18374687574888349695 >
135}
Bob Wilson83815ae2009-10-09 20:20:54 +0000136
Bob Wilson54c78ef2009-11-06 23:33:28 +0000137; Check for correct assembler printing for immediate values.
138%struct.int8x8_t = type { <8 x i8> }
139define arm_apcscc void @vdupn128(%struct.int8x8_t* noalias nocapture sret %agg.result) nounwind {
140entry:
141;CHECK: vdupn128:
142;CHECK: vmov.i8 d0, #0x80
143 %0 = getelementptr inbounds %struct.int8x8_t* %agg.result, i32 0, i32 0 ; <<8 x i8>*> [#uses=1]
144 store <8 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>, <8 x i8>* %0, align 8
145 ret void
146}
147
148define arm_apcscc void @vdupnneg75(%struct.int8x8_t* noalias nocapture sret %agg.result) nounwind {
149entry:
150;CHECK: vdupnneg75:
151;CHECK: vmov.i8 d0, #0xB5
152 %0 = getelementptr inbounds %struct.int8x8_t* %agg.result, i32 0, i32 0 ; <<8 x i8>*> [#uses=1]
153 store <8 x i8> <i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75>, <8 x i8>* %0, align 8
154 ret void
155}
156
Bob Wilson83815ae2009-10-09 20:20:54 +0000157define <8 x i16> @vmovls8(<8 x i8>* %A) nounwind {
158;CHECK: vmovls8:
159;CHECK: vmovl.s8
160 %tmp1 = load <8 x i8>* %A
161 %tmp2 = call <8 x i16> @llvm.arm.neon.vmovls.v8i16(<8 x i8> %tmp1)
162 ret <8 x i16> %tmp2
163}
164
165define <4 x i32> @vmovls16(<4 x i16>* %A) nounwind {
166;CHECK: vmovls16:
167;CHECK: vmovl.s16
168 %tmp1 = load <4 x i16>* %A
169 %tmp2 = call <4 x i32> @llvm.arm.neon.vmovls.v4i32(<4 x i16> %tmp1)
170 ret <4 x i32> %tmp2
171}
172
173define <2 x i64> @vmovls32(<2 x i32>* %A) nounwind {
174;CHECK: vmovls32:
175;CHECK: vmovl.s32
176 %tmp1 = load <2 x i32>* %A
177 %tmp2 = call <2 x i64> @llvm.arm.neon.vmovls.v2i64(<2 x i32> %tmp1)
178 ret <2 x i64> %tmp2
179}
180
181define <8 x i16> @vmovlu8(<8 x i8>* %A) nounwind {
182;CHECK: vmovlu8:
183;CHECK: vmovl.u8
184 %tmp1 = load <8 x i8>* %A
185 %tmp2 = call <8 x i16> @llvm.arm.neon.vmovlu.v8i16(<8 x i8> %tmp1)
186 ret <8 x i16> %tmp2
187}
188
189define <4 x i32> @vmovlu16(<4 x i16>* %A) nounwind {
190;CHECK: vmovlu16:
191;CHECK: vmovl.u16
192 %tmp1 = load <4 x i16>* %A
193 %tmp2 = call <4 x i32> @llvm.arm.neon.vmovlu.v4i32(<4 x i16> %tmp1)
194 ret <4 x i32> %tmp2
195}
196
197define <2 x i64> @vmovlu32(<2 x i32>* %A) nounwind {
198;CHECK: vmovlu32:
199;CHECK: vmovl.u32
200 %tmp1 = load <2 x i32>* %A
201 %tmp2 = call <2 x i64> @llvm.arm.neon.vmovlu.v2i64(<2 x i32> %tmp1)
202 ret <2 x i64> %tmp2
203}
204
205declare <8 x i16> @llvm.arm.neon.vmovls.v8i16(<8 x i8>) nounwind readnone
206declare <4 x i32> @llvm.arm.neon.vmovls.v4i32(<4 x i16>) nounwind readnone
207declare <2 x i64> @llvm.arm.neon.vmovls.v2i64(<2 x i32>) nounwind readnone
208
209declare <8 x i16> @llvm.arm.neon.vmovlu.v8i16(<8 x i8>) nounwind readnone
210declare <4 x i32> @llvm.arm.neon.vmovlu.v4i32(<4 x i16>) nounwind readnone
211declare <2 x i64> @llvm.arm.neon.vmovlu.v2i64(<2 x i32>) nounwind readnone
212
213define <8 x i8> @vmovni16(<8 x i16>* %A) nounwind {
214;CHECK: vmovni16:
215;CHECK: vmovn.i16
216 %tmp1 = load <8 x i16>* %A
217 %tmp2 = call <8 x i8> @llvm.arm.neon.vmovn.v8i8(<8 x i16> %tmp1)
218 ret <8 x i8> %tmp2
219}
220
221define <4 x i16> @vmovni32(<4 x i32>* %A) nounwind {
222;CHECK: vmovni32:
223;CHECK: vmovn.i32
224 %tmp1 = load <4 x i32>* %A
225 %tmp2 = call <4 x i16> @llvm.arm.neon.vmovn.v4i16(<4 x i32> %tmp1)
226 ret <4 x i16> %tmp2
227}
228
229define <2 x i32> @vmovni64(<2 x i64>* %A) nounwind {
230;CHECK: vmovni64:
231;CHECK: vmovn.i64
232 %tmp1 = load <2 x i64>* %A
233 %tmp2 = call <2 x i32> @llvm.arm.neon.vmovn.v2i32(<2 x i64> %tmp1)
234 ret <2 x i32> %tmp2
235}
236
237declare <8 x i8> @llvm.arm.neon.vmovn.v8i8(<8 x i16>) nounwind readnone
238declare <4 x i16> @llvm.arm.neon.vmovn.v4i16(<4 x i32>) nounwind readnone
239declare <2 x i32> @llvm.arm.neon.vmovn.v2i32(<2 x i64>) nounwind readnone
240
241define <8 x i8> @vqmovns16(<8 x i16>* %A) nounwind {
242;CHECK: vqmovns16:
243;CHECK: vqmovn.s16
244 %tmp1 = load <8 x i16>* %A
245 %tmp2 = call <8 x i8> @llvm.arm.neon.vqmovns.v8i8(<8 x i16> %tmp1)
246 ret <8 x i8> %tmp2
247}
248
249define <4 x i16> @vqmovns32(<4 x i32>* %A) nounwind {
250;CHECK: vqmovns32:
251;CHECK: vqmovn.s32
252 %tmp1 = load <4 x i32>* %A
253 %tmp2 = call <4 x i16> @llvm.arm.neon.vqmovns.v4i16(<4 x i32> %tmp1)
254 ret <4 x i16> %tmp2
255}
256
257define <2 x i32> @vqmovns64(<2 x i64>* %A) nounwind {
258;CHECK: vqmovns64:
259;CHECK: vqmovn.s64
260 %tmp1 = load <2 x i64>* %A
261 %tmp2 = call <2 x i32> @llvm.arm.neon.vqmovns.v2i32(<2 x i64> %tmp1)
262 ret <2 x i32> %tmp2
263}
264
265define <8 x i8> @vqmovnu16(<8 x i16>* %A) nounwind {
266;CHECK: vqmovnu16:
267;CHECK: vqmovn.u16
268 %tmp1 = load <8 x i16>* %A
269 %tmp2 = call <8 x i8> @llvm.arm.neon.vqmovnu.v8i8(<8 x i16> %tmp1)
270 ret <8 x i8> %tmp2
271}
272
273define <4 x i16> @vqmovnu32(<4 x i32>* %A) nounwind {
274;CHECK: vqmovnu32:
275;CHECK: vqmovn.u32
276 %tmp1 = load <4 x i32>* %A
277 %tmp2 = call <4 x i16> @llvm.arm.neon.vqmovnu.v4i16(<4 x i32> %tmp1)
278 ret <4 x i16> %tmp2
279}
280
281define <2 x i32> @vqmovnu64(<2 x i64>* %A) nounwind {
282;CHECK: vqmovnu64:
283;CHECK: vqmovn.u64
284 %tmp1 = load <2 x i64>* %A
285 %tmp2 = call <2 x i32> @llvm.arm.neon.vqmovnu.v2i32(<2 x i64> %tmp1)
286 ret <2 x i32> %tmp2
287}
288
289define <8 x i8> @vqmovuns16(<8 x i16>* %A) nounwind {
290;CHECK: vqmovuns16:
291;CHECK: vqmovun.s16
292 %tmp1 = load <8 x i16>* %A
293 %tmp2 = call <8 x i8> @llvm.arm.neon.vqmovnsu.v8i8(<8 x i16> %tmp1)
294 ret <8 x i8> %tmp2
295}
296
297define <4 x i16> @vqmovuns32(<4 x i32>* %A) nounwind {
298;CHECK: vqmovuns32:
299;CHECK: vqmovun.s32
300 %tmp1 = load <4 x i32>* %A
301 %tmp2 = call <4 x i16> @llvm.arm.neon.vqmovnsu.v4i16(<4 x i32> %tmp1)
302 ret <4 x i16> %tmp2
303}
304
305define <2 x i32> @vqmovuns64(<2 x i64>* %A) nounwind {
306;CHECK: vqmovuns64:
307;CHECK: vqmovun.s64
308 %tmp1 = load <2 x i64>* %A
309 %tmp2 = call <2 x i32> @llvm.arm.neon.vqmovnsu.v2i32(<2 x i64> %tmp1)
310 ret <2 x i32> %tmp2
311}
312
313declare <8 x i8> @llvm.arm.neon.vqmovns.v8i8(<8 x i16>) nounwind readnone
314declare <4 x i16> @llvm.arm.neon.vqmovns.v4i16(<4 x i32>) nounwind readnone
315declare <2 x i32> @llvm.arm.neon.vqmovns.v2i32(<2 x i64>) nounwind readnone
316
317declare <8 x i8> @llvm.arm.neon.vqmovnu.v8i8(<8 x i16>) nounwind readnone
318declare <4 x i16> @llvm.arm.neon.vqmovnu.v4i16(<4 x i32>) nounwind readnone
319declare <2 x i32> @llvm.arm.neon.vqmovnu.v2i32(<2 x i64>) nounwind readnone
320
321declare <8 x i8> @llvm.arm.neon.vqmovnsu.v8i8(<8 x i16>) nounwind readnone
322declare <4 x i16> @llvm.arm.neon.vqmovnsu.v4i16(<4 x i32>) nounwind readnone
323declare <2 x i32> @llvm.arm.neon.vqmovnsu.v2i32(<2 x i64>) nounwind readnone