Fix incorrect asm-printing of some NEON immediates. Fix weak testcase so
[oota-llvm.git] / test / CodeGen / ARM / vmov.ll
1 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
2
3 define <8 x i8> @v_movi8() nounwind {
4 ;CHECK: v_movi8:
5 ;CHECK: vmov.i8 d0, #0x8
6         ret <8 x i8> < i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8 >
7 }
8
9 define <4 x i16> @v_movi16a() nounwind {
10 ;CHECK: v_movi16a:
11 ;CHECK: vmov.i16 d0, #0x10
12         ret <4 x i16> < i16 16, i16 16, i16 16, i16 16 >
13 }
14
15 define <4 x i16> @v_movi16b() nounwind {
16 ;CHECK: v_movi16b:
17 ;CHECK: vmov.i16 d0, #0x1000
18         ret <4 x i16> < i16 4096, i16 4096, i16 4096, i16 4096 >
19 }
20
21 define <2 x i32> @v_movi32a() nounwind {
22 ;CHECK: v_movi32a:
23 ;CHECK: vmov.i32 d0, #0x20
24         ret <2 x i32> < i32 32, i32 32 >
25 }
26
27 define <2 x i32> @v_movi32b() nounwind {
28 ;CHECK: v_movi32b:
29 ;CHECK: vmov.i32 d0, #0x2000
30         ret <2 x i32> < i32 8192, i32 8192 >
31 }
32
33 define <2 x i32> @v_movi32c() nounwind {
34 ;CHECK: v_movi32c:
35 ;CHECK: vmov.i32 d0, #0x200000
36         ret <2 x i32> < i32 2097152, i32 2097152 >
37 }
38
39 define <2 x i32> @v_movi32d() nounwind {
40 ;CHECK: v_movi32d:
41 ;CHECK: vmov.i32 d0, #0x20000000
42         ret <2 x i32> < i32 536870912, i32 536870912 >
43 }
44
45 define <2 x i32> @v_movi32e() nounwind {
46 ;CHECK: v_movi32e:
47 ;CHECK: vmov.i32 d0, #0x20FF
48         ret <2 x i32> < i32 8447, i32 8447 >
49 }
50
51 define <2 x i32> @v_movi32f() nounwind {
52 ;CHECK: v_movi32f:
53 ;CHECK: vmov.i32 d0, #0x20FFFF
54         ret <2 x i32> < i32 2162687, i32 2162687 >
55 }
56
57 define <1 x i64> @v_movi64() nounwind {
58 ;CHECK: v_movi64:
59 ;CHECK: vmov.i64 d0, #0xFF0000FF0000FFFF
60         ret <1 x i64> < i64 18374687574888349695 >
61 }
62
63 define <16 x i8> @v_movQi8() nounwind {
64 ;CHECK: v_movQi8:
65 ;CHECK: vmov.i8 q0, #0x8
66         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 >
67 }
68
69 define <8 x i16> @v_movQi16a() nounwind {
70 ;CHECK: v_movQi16a:
71 ;CHECK: vmov.i16 q0, #0x10
72         ret <8 x i16> < i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16 >
73 }
74
75 define <8 x i16> @v_movQi16b() nounwind {
76 ;CHECK: v_movQi16b:
77 ;CHECK: vmov.i16 q0, #0x1000
78         ret <8 x i16> < i16 4096, i16 4096, i16 4096, i16 4096, i16 4096, i16 4096, i16 4096, i16 4096 >
79 }
80
81 define <4 x i32> @v_movQi32a() nounwind {
82 ;CHECK: v_movQi32a:
83 ;CHECK: vmov.i32 q0, #0x20
84         ret <4 x i32> < i32 32, i32 32, i32 32, i32 32 >
85 }
86
87 define <4 x i32> @v_movQi32b() nounwind {
88 ;CHECK: v_movQi32b:
89 ;CHECK: vmov.i32 q0, #0x2000
90         ret <4 x i32> < i32 8192, i32 8192, i32 8192, i32 8192 >
91 }
92
93 define <4 x i32> @v_movQi32c() nounwind {
94 ;CHECK: v_movQi32c:
95 ;CHECK: vmov.i32 q0, #0x200000
96         ret <4 x i32> < i32 2097152, i32 2097152, i32 2097152, i32 2097152 >
97 }
98
99 define <4 x i32> @v_movQi32d() nounwind {
100 ;CHECK: v_movQi32d:
101 ;CHECK: vmov.i32 q0, #0x20000000
102         ret <4 x i32> < i32 536870912, i32 536870912, i32 536870912, i32 536870912 >
103 }
104
105 define <4 x i32> @v_movQi32e() nounwind {
106 ;CHECK: v_movQi32e:
107 ;CHECK: vmov.i32 q0, #0x20FF
108         ret <4 x i32> < i32 8447, i32 8447, i32 8447, i32 8447 >
109 }
110
111 define <4 x i32> @v_movQi32f() nounwind {
112 ;CHECK: v_movQi32f:
113 ;CHECK: vmov.i32 q0, #0x20FFFF
114         ret <4 x i32> < i32 2162687, i32 2162687, i32 2162687, i32 2162687 >
115 }
116
117 define <2 x i64> @v_movQi64() nounwind {
118 ;CHECK: v_movQi64:
119 ;CHECK: vmov.i64 q0, #0xFF0000FF0000FFFF
120         ret <2 x i64> < i64 18374687574888349695, i64 18374687574888349695 >
121 }
122
123 ; Check for correct assembler printing for immediate values.
124 %struct.int8x8_t = type { <8 x i8> }
125 define void @vdupn128(%struct.int8x8_t* noalias nocapture sret %agg.result) nounwind {
126 entry:
127 ;CHECK: vdupn128:
128 ;CHECK: vmov.i8 d0, #0x80
129   %0 = getelementptr inbounds %struct.int8x8_t* %agg.result, i32 0, i32 0 ; <<8 x i8>*> [#uses=1]
130   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
131   ret void
132 }
133
134 define void @vdupnneg75(%struct.int8x8_t* noalias nocapture sret %agg.result) nounwind {
135 entry:
136 ;CHECK: vdupnneg75:
137 ;CHECK: vmov.i8 d0, #0xB5
138   %0 = getelementptr inbounds %struct.int8x8_t* %agg.result, i32 0, i32 0 ; <<8 x i8>*> [#uses=1]
139   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
140   ret void
141 }
142
143 define <8 x i16> @vmovls8(<8 x i8>* %A) nounwind {
144 ;CHECK: vmovls8:
145 ;CHECK: vmovl.s8
146         %tmp1 = load <8 x i8>* %A
147         %tmp2 = call <8 x i16> @llvm.arm.neon.vmovls.v8i16(<8 x i8> %tmp1)
148         ret <8 x i16> %tmp2
149 }
150
151 define <4 x i32> @vmovls16(<4 x i16>* %A) nounwind {
152 ;CHECK: vmovls16:
153 ;CHECK: vmovl.s16
154         %tmp1 = load <4 x i16>* %A
155         %tmp2 = call <4 x i32> @llvm.arm.neon.vmovls.v4i32(<4 x i16> %tmp1)
156         ret <4 x i32> %tmp2
157 }
158
159 define <2 x i64> @vmovls32(<2 x i32>* %A) nounwind {
160 ;CHECK: vmovls32:
161 ;CHECK: vmovl.s32
162         %tmp1 = load <2 x i32>* %A
163         %tmp2 = call <2 x i64> @llvm.arm.neon.vmovls.v2i64(<2 x i32> %tmp1)
164         ret <2 x i64> %tmp2
165 }
166
167 define <8 x i16> @vmovlu8(<8 x i8>* %A) nounwind {
168 ;CHECK: vmovlu8:
169 ;CHECK: vmovl.u8
170         %tmp1 = load <8 x i8>* %A
171         %tmp2 = call <8 x i16> @llvm.arm.neon.vmovlu.v8i16(<8 x i8> %tmp1)
172         ret <8 x i16> %tmp2
173 }
174
175 define <4 x i32> @vmovlu16(<4 x i16>* %A) nounwind {
176 ;CHECK: vmovlu16:
177 ;CHECK: vmovl.u16
178         %tmp1 = load <4 x i16>* %A
179         %tmp2 = call <4 x i32> @llvm.arm.neon.vmovlu.v4i32(<4 x i16> %tmp1)
180         ret <4 x i32> %tmp2
181 }
182
183 define <2 x i64> @vmovlu32(<2 x i32>* %A) nounwind {
184 ;CHECK: vmovlu32:
185 ;CHECK: vmovl.u32
186         %tmp1 = load <2 x i32>* %A
187         %tmp2 = call <2 x i64> @llvm.arm.neon.vmovlu.v2i64(<2 x i32> %tmp1)
188         ret <2 x i64> %tmp2
189 }
190
191 declare <8 x i16> @llvm.arm.neon.vmovls.v8i16(<8 x i8>) nounwind readnone
192 declare <4 x i32> @llvm.arm.neon.vmovls.v4i32(<4 x i16>) nounwind readnone
193 declare <2 x i64> @llvm.arm.neon.vmovls.v2i64(<2 x i32>) nounwind readnone
194
195 declare <8 x i16> @llvm.arm.neon.vmovlu.v8i16(<8 x i8>) nounwind readnone
196 declare <4 x i32> @llvm.arm.neon.vmovlu.v4i32(<4 x i16>) nounwind readnone
197 declare <2 x i64> @llvm.arm.neon.vmovlu.v2i64(<2 x i32>) nounwind readnone
198
199 define <8 x i8> @vmovni16(<8 x i16>* %A) nounwind {
200 ;CHECK: vmovni16:
201 ;CHECK: vmovn.i16
202         %tmp1 = load <8 x i16>* %A
203         %tmp2 = call <8 x i8> @llvm.arm.neon.vmovn.v8i8(<8 x i16> %tmp1)
204         ret <8 x i8> %tmp2
205 }
206
207 define <4 x i16> @vmovni32(<4 x i32>* %A) nounwind {
208 ;CHECK: vmovni32:
209 ;CHECK: vmovn.i32
210         %tmp1 = load <4 x i32>* %A
211         %tmp2 = call <4 x i16> @llvm.arm.neon.vmovn.v4i16(<4 x i32> %tmp1)
212         ret <4 x i16> %tmp2
213 }
214
215 define <2 x i32> @vmovni64(<2 x i64>* %A) nounwind {
216 ;CHECK: vmovni64:
217 ;CHECK: vmovn.i64
218         %tmp1 = load <2 x i64>* %A
219         %tmp2 = call <2 x i32> @llvm.arm.neon.vmovn.v2i32(<2 x i64> %tmp1)
220         ret <2 x i32> %tmp2
221 }
222
223 declare <8 x i8>  @llvm.arm.neon.vmovn.v8i8(<8 x i16>) nounwind readnone
224 declare <4 x i16> @llvm.arm.neon.vmovn.v4i16(<4 x i32>) nounwind readnone
225 declare <2 x i32> @llvm.arm.neon.vmovn.v2i32(<2 x i64>) nounwind readnone
226
227 define <8 x i8> @vqmovns16(<8 x i16>* %A) nounwind {
228 ;CHECK: vqmovns16:
229 ;CHECK: vqmovn.s16
230         %tmp1 = load <8 x i16>* %A
231         %tmp2 = call <8 x i8> @llvm.arm.neon.vqmovns.v8i8(<8 x i16> %tmp1)
232         ret <8 x i8> %tmp2
233 }
234
235 define <4 x i16> @vqmovns32(<4 x i32>* %A) nounwind {
236 ;CHECK: vqmovns32:
237 ;CHECK: vqmovn.s32
238         %tmp1 = load <4 x i32>* %A
239         %tmp2 = call <4 x i16> @llvm.arm.neon.vqmovns.v4i16(<4 x i32> %tmp1)
240         ret <4 x i16> %tmp2
241 }
242
243 define <2 x i32> @vqmovns64(<2 x i64>* %A) nounwind {
244 ;CHECK: vqmovns64:
245 ;CHECK: vqmovn.s64
246         %tmp1 = load <2 x i64>* %A
247         %tmp2 = call <2 x i32> @llvm.arm.neon.vqmovns.v2i32(<2 x i64> %tmp1)
248         ret <2 x i32> %tmp2
249 }
250
251 define <8 x i8> @vqmovnu16(<8 x i16>* %A) nounwind {
252 ;CHECK: vqmovnu16:
253 ;CHECK: vqmovn.u16
254         %tmp1 = load <8 x i16>* %A
255         %tmp2 = call <8 x i8> @llvm.arm.neon.vqmovnu.v8i8(<8 x i16> %tmp1)
256         ret <8 x i8> %tmp2
257 }
258
259 define <4 x i16> @vqmovnu32(<4 x i32>* %A) nounwind {
260 ;CHECK: vqmovnu32:
261 ;CHECK: vqmovn.u32
262         %tmp1 = load <4 x i32>* %A
263         %tmp2 = call <4 x i16> @llvm.arm.neon.vqmovnu.v4i16(<4 x i32> %tmp1)
264         ret <4 x i16> %tmp2
265 }
266
267 define <2 x i32> @vqmovnu64(<2 x i64>* %A) nounwind {
268 ;CHECK: vqmovnu64:
269 ;CHECK: vqmovn.u64
270         %tmp1 = load <2 x i64>* %A
271         %tmp2 = call <2 x i32> @llvm.arm.neon.vqmovnu.v2i32(<2 x i64> %tmp1)
272         ret <2 x i32> %tmp2
273 }
274
275 define <8 x i8> @vqmovuns16(<8 x i16>* %A) nounwind {
276 ;CHECK: vqmovuns16:
277 ;CHECK: vqmovun.s16
278         %tmp1 = load <8 x i16>* %A
279         %tmp2 = call <8 x i8> @llvm.arm.neon.vqmovnsu.v8i8(<8 x i16> %tmp1)
280         ret <8 x i8> %tmp2
281 }
282
283 define <4 x i16> @vqmovuns32(<4 x i32>* %A) nounwind {
284 ;CHECK: vqmovuns32:
285 ;CHECK: vqmovun.s32
286         %tmp1 = load <4 x i32>* %A
287         %tmp2 = call <4 x i16> @llvm.arm.neon.vqmovnsu.v4i16(<4 x i32> %tmp1)
288         ret <4 x i16> %tmp2
289 }
290
291 define <2 x i32> @vqmovuns64(<2 x i64>* %A) nounwind {
292 ;CHECK: vqmovuns64:
293 ;CHECK: vqmovun.s64
294         %tmp1 = load <2 x i64>* %A
295         %tmp2 = call <2 x i32> @llvm.arm.neon.vqmovnsu.v2i32(<2 x i64> %tmp1)
296         ret <2 x i32> %tmp2
297 }
298
299 declare <8 x i8>  @llvm.arm.neon.vqmovns.v8i8(<8 x i16>) nounwind readnone
300 declare <4 x i16> @llvm.arm.neon.vqmovns.v4i16(<4 x i32>) nounwind readnone
301 declare <2 x i32> @llvm.arm.neon.vqmovns.v2i32(<2 x i64>) nounwind readnone
302
303 declare <8 x i8>  @llvm.arm.neon.vqmovnu.v8i8(<8 x i16>) nounwind readnone
304 declare <4 x i16> @llvm.arm.neon.vqmovnu.v4i16(<4 x i32>) nounwind readnone
305 declare <2 x i32> @llvm.arm.neon.vqmovnu.v2i32(<2 x i64>) nounwind readnone
306
307 declare <8 x i8>  @llvm.arm.neon.vqmovnsu.v8i8(<8 x i16>) nounwind readnone
308 declare <4 x i16> @llvm.arm.neon.vqmovnsu.v4i16(<4 x i32>) nounwind readnone
309 declare <2 x i32> @llvm.arm.neon.vqmovnsu.v2i32(<2 x i64>) nounwind readnone