62290fb65c999100fda483a5b14187a5c51c95bf
[oota-llvm.git] / test / MC / ARM / neon-add-encoding.ll
1 ; RUN: llc -show-mc-encoding -march=arm -mcpu=cortex-a8 -mattr=+neon < %s | FileCheck %s
2
3 ; XFAIL: *
4
5 ; CHECK: vadd_8xi8
6 define <8 x i8> @vadd_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {                                                                          
7   %tmp1 = load <8 x i8>* %A
8   %tmp2 = load <8 x i8>* %B
9 ; CHECK: vadd.i8        d16, d17, d16           @ encoding: [0xa0,0x08,0x41,0xf2]
10   %tmp3 = add <8 x i8> %tmp1, %tmp2
11         ret <8 x i8> %tmp3
12 }
13
14 ; CHECK: vadd_4xi16
15 define <4 x i16> @vadd_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {                                                                          
16   %tmp1 = load <4 x i16>* %A
17   %tmp2 = load <4 x i16>* %B
18 ; CHECK: vadd.i16       d16, d17, d16   @ encoding: [0xa0,0x08,0x51,0xf2]
19   %tmp3 = add <4 x i16> %tmp1, %tmp2
20         ret <4 x i16> %tmp3
21 }
22
23 ; CHECK: vadd_1xi64
24 define <1 x i64> @vadd_1xi64(<1 x i64>* %A, <1 x i64>* %B) nounwind {                                                                          
25   %tmp1 = load <1 x i64>* %A
26   %tmp2 = load <1 x i64>* %B
27 ; CHECK: vadd.i64       d16, d17, d16   @ encoding: [0xa0,0x08,0x71,0xf2]
28   %tmp3 = add <1 x i64> %tmp1, %tmp2
29         ret <1 x i64> %tmp3
30 }
31
32 ; CHECK: vadd_2xi32
33 define <2 x i32> @vadd_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {                                                                          
34   %tmp1 = load <2 x i32>* %A
35   %tmp2 = load <2 x i32>* %B
36 ; CHECK: vadd.i32       d16, d17, d16   @ encoding: [0xa0,0x08,0x61,0xf2]
37   %tmp3 = add <2 x i32> %tmp1, %tmp2
38         ret <2 x i32> %tmp3
39 }
40
41 ; CHECK: vadd_2xfloat
42 define <2 x float> @vadd_2xfloat(<2 x float>* %A, <2 x float>* %B) nounwind {                                                                          
43   %tmp1 = load <2 x float>* %A
44   %tmp2 = load <2 x float>* %B
45 ; CHECK: vadd.f32       d16, d16, d17   @ encoding: [0xa1,0x0d,0x40,0xf2]
46   %tmp3 = fadd <2 x float> %tmp1, %tmp2
47         ret <2 x float> %tmp3
48 }
49
50 ; CHECK: vadd_4xfloat
51 define <4 x float> @vadd_4xfloat(<4 x float>* %A, <4 x float>* %B) nounwind {
52         %tmp1 = load <4 x float>* %A
53         %tmp2 = load <4 x float>* %B
54 ; CHECK: vadd.f32       q8, q8, q9      @ encoding: [0xe2,0x0d,0x40,0xf2]
55         %tmp3 = fadd <4 x float> %tmp1, %tmp2
56         ret <4 x float> %tmp3
57 }
58
59 ; CHECK: vaddls_8xi8
60 define <8 x i16> @vaddls_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
61         %tmp1 = load <8 x i8>* %A
62         %tmp2 = load <8 x i8>* %B
63         %tmp3 = sext <8 x i8> %tmp1 to <8 x i16>
64         %tmp4 = sext <8 x i8> %tmp2 to <8 x i16>
65 ; CHECK: vaddl.s8       q8, d17, d16    @ encoding: [0xa0,0x00,0xc1,0xf2]
66         %tmp5 = add <8 x i16> %tmp3, %tmp4
67         ret <8 x i16> %tmp5
68 }
69
70 ; CHECK: vaddls_4xi16
71 define <4 x i32> @vaddls_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
72         %tmp1 = load <4 x i16>* %A
73         %tmp2 = load <4 x i16>* %B
74         %tmp3 = sext <4 x i16> %tmp1 to <4 x i32>
75         %tmp4 = sext <4 x i16> %tmp2 to <4 x i32>
76 ; CHECK: vaddl.s16      q8, d17, d16    @ encoding: [0xa0,0x00,0xd1,0xf2]
77         %tmp5 = add <4 x i32> %tmp3, %tmp4
78         ret <4 x i32> %tmp5
79 }
80
81 ; CHECK: vaddls_2xi32
82 define <2 x i64> @vaddls_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
83         %tmp1 = load <2 x i32>* %A
84         %tmp2 = load <2 x i32>* %B
85         %tmp3 = sext <2 x i32> %tmp1 to <2 x i64>
86         %tmp4 = sext <2 x i32> %tmp2 to <2 x i64>
87 ; CHECK: vaddl.s32      q8, d17, d16    @ encoding: [0xa0,0x00,0xe1,0xf2]
88         %tmp5 = add <2 x i64> %tmp3, %tmp4
89         ret <2 x i64> %tmp5
90 }
91
92 ; CHECK: vaddlu_8xi8
93 define <8 x i16> @vaddlu_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
94         %tmp1 = load <8 x i8>* %A
95         %tmp2 = load <8 x i8>* %B
96         %tmp3 = zext <8 x i8> %tmp1 to <8 x i16>
97         %tmp4 = zext <8 x i8> %tmp2 to <8 x i16>
98 ; CHECK: vaddl.u8       q8, d17, d16    @ encoding: [0xa0,0x00,0xc1,0xf3]
99         %tmp5 = add <8 x i16> %tmp3, %tmp4
100         ret <8 x i16> %tmp5
101 }
102
103 ; CHECK: vaddlu_4xi16
104 define <4 x i32> @vaddlu_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
105         %tmp1 = load <4 x i16>* %A
106         %tmp2 = load <4 x i16>* %B
107         %tmp3 = zext <4 x i16> %tmp1 to <4 x i32>
108         %tmp4 = zext <4 x i16> %tmp2 to <4 x i32>
109 ; CHECK: vaddl.u16      q8, d17, d16    @ encoding: [0xa0,0x00,0xd1,0xf3]
110         %tmp5 = add <4 x i32> %tmp3, %tmp4
111         ret <4 x i32> %tmp5
112 }
113
114 ; CHECK: vaddlu_2xi32
115 define <2 x i64> @vaddlu_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
116         %tmp1 = load <2 x i32>* %A
117         %tmp2 = load <2 x i32>* %B
118         %tmp3 = zext <2 x i32> %tmp1 to <2 x i64>
119         %tmp4 = zext <2 x i32> %tmp2 to <2 x i64>
120 ; CHECK: vaddl.u32      q8, d17, d16    @ encoding: [0xa0,0x00,0xe1,0xf3]
121         %tmp5 = add <2 x i64> %tmp3, %tmp4
122         ret <2 x i64> %tmp5
123 }
124
125 ; CHECK: vaddws_8xi8
126 define <8 x i16> @vaddws_8xi8(<8 x i16>* %A, <8 x i8>* %B) nounwind {
127         %tmp1 = load <8 x i16>* %A
128         %tmp2 = load <8 x i8>* %B
129         %tmp3 = sext <8 x i8> %tmp2 to <8 x i16>
130 ; CHECK: vaddw.s8       q8, q8, d18     @ encoding: [0xa2,0x01,0xc0,0xf2]
131         %tmp4 = add <8 x i16> %tmp1, %tmp3
132         ret <8 x i16> %tmp4
133 }
134
135 ; CHECK: vaddws_4xi16
136 define <4 x i32> @vaddws_4xi16(<4 x i32>* %A, <4 x i16>* %B) nounwind {
137         %tmp1 = load <4 x i32>* %A
138         %tmp2 = load <4 x i16>* %B
139         %tmp3 = sext <4 x i16> %tmp2 to <4 x i32>
140 ; CHECK: vaddw.s16      q8, q8, d18     @ encoding: [0xa2,0x01,0xd0,0xf2]
141         %tmp4 = add <4 x i32> %tmp1, %tmp3
142         ret <4 x i32> %tmp4
143 }
144
145 ; CHECK: vaddws_2xi32
146 define <2 x i64> @vaddws_2xi32(<2 x i64>* %A, <2 x i32>* %B) nounwind {
147         %tmp1 = load <2 x i64>* %A
148         %tmp2 = load <2 x i32>* %B
149         %tmp3 = sext <2 x i32> %tmp2 to <2 x i64>
150 ; CHECK: vaddw.s32      q8, q8, d18     @ encoding: [0xa2,0x01,0xe0,0xf2]
151         %tmp4 = add <2 x i64> %tmp1, %tmp3
152         ret <2 x i64> %tmp4
153 }
154
155 ; CHECK: vaddwu_8xi8
156 define <8 x i16> @vaddwu_8xi8(<8 x i16>* %A, <8 x i8>* %B) nounwind {
157         %tmp1 = load <8 x i16>* %A
158         %tmp2 = load <8 x i8>* %B
159         %tmp3 = zext <8 x i8> %tmp2 to <8 x i16>
160 ; CHECK: vaddw.u8       q8, q8, d18     @ encoding: [0xa2,0x01,0xc0,0xf3]
161         %tmp4 = add <8 x i16> %tmp1, %tmp3
162         ret <8 x i16> %tmp4
163 }
164
165 ; CHECK: vaddwu_4xi16
166 define <4 x i32> @vaddwu_4xi16(<4 x i32>* %A, <4 x i16>* %B) nounwind {
167         %tmp1 = load <4 x i32>* %A
168         %tmp2 = load <4 x i16>* %B
169         %tmp3 = zext <4 x i16> %tmp2 to <4 x i32>
170 ; CHECK: vaddw.u16      q8, q8, d18     @ encoding: [0xa2,0x01,0xd0,0xf3]
171         %tmp4 = add <4 x i32> %tmp1, %tmp3
172         ret <4 x i32> %tmp4
173 }
174
175 ; CHECK: vaddwu_2xi32
176 define <2 x i64> @vaddwu_2xi32(<2 x i64>* %A, <2 x i32>* %B) nounwind {
177         %tmp1 = load <2 x i64>* %A
178         %tmp2 = load <2 x i32>* %B
179         %tmp3 = zext <2 x i32> %tmp2 to <2 x i64>
180 ; CHECK: vaddw.u32      q8, q8, d18     @ encoding: [0xa2,0x01,0xe0,0xf3]
181         %tmp4 = add <2 x i64> %tmp1, %tmp3
182         ret <2 x i64> %tmp4
183 }
184
185 declare <8 x i8>  @llvm.arm.neon.vhadds.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
186 declare <4 x i16> @llvm.arm.neon.vhadds.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
187 declare <2 x i32> @llvm.arm.neon.vhadds.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
188
189 ; CHECK: vhadds_8xi8
190 define <8 x i8> @vhadds_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
191         %tmp1 = load <8 x i8>* %A
192         %tmp2 = load <8 x i8>* %B
193 ; CHECK: vhadd.s8       d16, d16, d17   @ encoding: [0xa1,0x00,0x40,0xf2]
194         %tmp3 = call <8 x i8> @llvm.arm.neon.vhadds.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
195         ret <8 x i8> %tmp3
196 }
197
198 ; CHECK: vhadds_4xi16
199 define <4 x i16> @vhadds_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
200         %tmp1 = load <4 x i16>* %A
201         %tmp2 = load <4 x i16>* %B
202 ; CHECK: vhadd.s16      d16, d16, d17   @ encoding: [0xa1,0x00,0x50,0xf2]
203         %tmp3 = call <4 x i16> @llvm.arm.neon.vhadds.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
204         ret <4 x i16> %tmp3
205 }
206
207 ; CHECK: vhadds_2xi32
208 define <2 x i32> @vhadds_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
209         %tmp1 = load <2 x i32>* %A
210         %tmp2 = load <2 x i32>* %B
211 ; CHECK: vhadd.s32      d16, d16, d17   @ encoding: [0xa1,0x00,0x60,0xf2]
212         %tmp3 = call <2 x i32> @llvm.arm.neon.vhadds.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
213         ret <2 x i32> %tmp3
214 }
215
216 declare <8 x i8>  @llvm.arm.neon.vhaddu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
217 declare <4 x i16> @llvm.arm.neon.vhaddu.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
218 declare <2 x i32> @llvm.arm.neon.vhaddu.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
219
220 ; CHECK: vhaddu_8xi8
221 define <8 x i8> @vhaddu_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
222         %tmp1 = load <8 x i8>* %A
223         %tmp2 = load <8 x i8>* %B
224 ; CHECK: vhadd.u8       d16, d16, d17   @ encoding: [0xa1,0x00,0x40,0xf3]
225         %tmp3 = call <8 x i8> @llvm.arm.neon.vhaddu.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
226         ret <8 x i8> %tmp3
227 }
228
229 ; CHECK: vhaddu_4xi16
230 define <4 x i16> @vhaddu_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
231         %tmp1 = load <4 x i16>* %A
232         %tmp2 = load <4 x i16>* %B
233 ; CHECK: vhadd.u16      d16, d16, d17   @ encoding: [0xa1,0x00,0x50,0xf3]
234         %tmp3 = call <4 x i16> @llvm.arm.neon.vhaddu.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
235         ret <4 x i16> %tmp3
236 }
237
238 ; CHECK: vhaddu_2xi32
239 define <2 x i32> @vhaddu_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
240         %tmp1 = load <2 x i32>* %A
241         %tmp2 = load <2 x i32>* %B
242 ; CHECK: vhadd.u32      d16, d16, d17   @ encoding: [0xa1,0x00,0x60,0xf3]
243         %tmp3 = call <2 x i32> @llvm.arm.neon.vhaddu.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
244         ret <2 x i32> %tmp3
245 }
246
247 declare <16 x i8> @llvm.arm.neon.vhadds.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
248 declare <8 x i16> @llvm.arm.neon.vhadds.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
249 declare <4 x i32> @llvm.arm.neon.vhadds.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
250
251 ; CHECK: vhadds_16xi8
252 define <16 x i8> @vhadds_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
253         %tmp1 = load <16 x i8>* %A
254         %tmp2 = load <16 x i8>* %B
255 ; CHECK: vhadd.s8       q8, q8, q9      @ encoding: [0xe2,0x00,0x40,0xf2]
256         %tmp3 = call <16 x i8> @llvm.arm.neon.vhadds.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
257         ret <16 x i8> %tmp3
258 }
259
260 ; CHECK: vhadds_8xi16
261 define <8 x i16> @vhadds_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
262         %tmp1 = load <8 x i16>* %A
263         %tmp2 = load <8 x i16>* %B
264 ; CHECK: vhadd.s16      q8, q8, q9      @ encoding: [0xe2,0x00,0x50,0xf2]
265         %tmp3 = call <8 x i16> @llvm.arm.neon.vhadds.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
266         ret <8 x i16> %tmp3
267 }
268
269 ; CHECK: vhadds_4xi32
270 define <4 x i32> @vhadds_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
271         %tmp1 = load <4 x i32>* %A
272         %tmp2 = load <4 x i32>* %B
273 ; CHECK: vhadd.s32      q8, q8, q9      @ encoding: [0xe2,0x00,0x60,0xf2]
274         %tmp3 = call <4 x i32> @llvm.arm.neon.vhadds.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
275         ret <4 x i32> %tmp3
276 }
277
278 declare <16 x i8> @llvm.arm.neon.vhaddu.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
279 declare <8 x i16> @llvm.arm.neon.vhaddu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
280 declare <4 x i32> @llvm.arm.neon.vhaddu.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
281
282 ; CHECK: vhaddu_16xi8
283 define <16 x i8> @vhaddu_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
284         %tmp1 = load <16 x i8>* %A
285         %tmp2 = load <16 x i8>* %B
286 ; CHECK: vhadd.u8       q8, q8, q9      @ encoding: [0xe2,0x00,0x40,0xf3]
287         %tmp3 = call <16 x i8> @llvm.arm.neon.vhaddu.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
288         ret <16 x i8> %tmp3
289 }
290
291 ; CHECK: vhaddu_8xi16
292 define <8 x i16> @vhaddu_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
293         %tmp1 = load <8 x i16>* %A
294         %tmp2 = load <8 x i16>* %B
295 ; CHECK: vhadd.u16      q8, q8, q9      @ encoding: [0xe2,0x00,0x50,0xf3]
296         %tmp3 = call <8 x i16> @llvm.arm.neon.vhaddu.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
297         ret <8 x i16> %tmp3
298 }
299
300 ; CHECK: vhaddu_4xi32
301 define <4 x i32> @vhaddu_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
302         %tmp1 = load <4 x i32>* %A
303         %tmp2 = load <4 x i32>* %B
304 ; CHECK: vhadd.u32      q8, q8, q9      @ encoding: [0xe2,0x00,0x60,0xf3]
305         %tmp3 = call <4 x i32> @llvm.arm.neon.vhaddu.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
306         ret <4 x i32> %tmp3
307 }
308
309 declare <8 x i8>  @llvm.arm.neon.vrhadds.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
310 declare <4 x i16> @llvm.arm.neon.vrhadds.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
311 declare <2 x i32> @llvm.arm.neon.vrhadds.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
312
313 ; CHECK: vrhadds_8xi8
314 define <8 x i8> @vrhadds_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
315         %tmp1 = load <8 x i8>* %A
316         %tmp2 = load <8 x i8>* %B
317 ; CHECK: vrhadd.s8      d16, d16, d17   @ encoding: [0xa1,0x01,0x40,0xf2]
318         %tmp3 = call <8 x i8> @llvm.arm.neon.vrhadds.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
319         ret <8 x i8> %tmp3
320 }
321
322 ; CHECK: vrhadds_4xi16
323 define <4 x i16> @vrhadds_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
324         %tmp1 = load <4 x i16>* %A
325         %tmp2 = load <4 x i16>* %B
326 ; CHECK: vrhadd.s16     d16, d16, d17   @ encoding: [0xa1,0x01,0x50,0xf2]
327         %tmp3 = call <4 x i16> @llvm.arm.neon.vrhadds.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
328         ret <4 x i16> %tmp3
329 }
330
331 ; CHECK: vrhadds_2xi32
332 define <2 x i32> @vrhadds_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
333         %tmp1 = load <2 x i32>* %A
334         %tmp2 = load <2 x i32>* %B
335 ; CHECK: vrhadd.s32     d16, d16, d17   @ encoding: [0xa1,0x01,0x60,0xf2]
336         %tmp3 = call <2 x i32> @llvm.arm.neon.vrhadds.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
337         ret <2 x i32> %tmp3
338 }
339
340 declare <8 x i8>  @llvm.arm.neon.vrhaddu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
341 declare <4 x i16> @llvm.arm.neon.vrhaddu.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
342 declare <2 x i32> @llvm.arm.neon.vrhaddu.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
343
344 ; CHECK: vrhaddu_8xi8
345 define <8 x i8> @vrhaddu_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
346         %tmp1 = load <8 x i8>* %A
347         %tmp2 = load <8 x i8>* %B
348 ; CHECK: vrhadd.u8      d16, d16, d17   @ encoding: [0xa1,0x01,0x40,0xf3]
349         %tmp3 = call <8 x i8> @llvm.arm.neon.vrhaddu.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
350         ret <8 x i8> %tmp3
351 }
352
353 ; CHECK: vrhaddu_4xi16
354 define <4 x i16> @vrhaddu_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
355         %tmp1 = load <4 x i16>* %A
356         %tmp2 = load <4 x i16>* %B
357 ; CHECK: vrhadd.u16     d16, d16, d17   @ encoding: [0xa1,0x01,0x50,0xf3]
358         %tmp3 = call <4 x i16> @llvm.arm.neon.vrhaddu.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
359         ret <4 x i16> %tmp3
360 }
361
362 ; CHECK: vrhaddu_2xi32
363 define <2 x i32> @vrhaddu_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
364         %tmp1 = load <2 x i32>* %A
365         %tmp2 = load <2 x i32>* %B
366 ; CHECK: vrhadd.u32     d16, d16, d17   @ encoding: [0xa1,0x01,0x60,0xf3]
367         %tmp3 = call <2 x i32> @llvm.arm.neon.vrhaddu.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
368         ret <2 x i32> %tmp3
369 }
370
371 declare <16 x i8> @llvm.arm.neon.vrhadds.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
372 declare <8 x i16> @llvm.arm.neon.vrhadds.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
373 declare <4 x i32> @llvm.arm.neon.vrhadds.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
374
375 ; CHECK: vrhadds_16xi8
376 define <16 x i8> @vrhadds_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
377         %tmp1 = load <16 x i8>* %A
378         %tmp2 = load <16 x i8>* %B
379 ; CHECK: vrhadd.s8      q8, q8, q9      @ encoding: [0xe2,0x01,0x40,0xf2]
380         %tmp3 = call <16 x i8> @llvm.arm.neon.vrhadds.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
381         ret <16 x i8> %tmp3
382 }
383
384 ; CHECK: vrhadds_8xi16
385 define <8 x i16> @vrhadds_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
386         %tmp1 = load <8 x i16>* %A
387         %tmp2 = load <8 x i16>* %B
388 ; CHECK: vrhadd.s16     q8, q8, q9      @ encoding: [0xe2,0x01,0x50,0xf2]
389         %tmp3 = call <8 x i16> @llvm.arm.neon.vrhadds.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
390         ret <8 x i16> %tmp3
391 }
392
393 ; CHECK: vrhadds_4xi32
394 define <4 x i32> @vrhadds_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
395         %tmp1 = load <4 x i32>* %A
396         %tmp2 = load <4 x i32>* %B
397 ; CHECK: vrhadd.s32     q8, q8, q9      @ encoding: [0xe2,0x01,0x60,0xf2]
398         %tmp3 = call <4 x i32> @llvm.arm.neon.vrhadds.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
399         ret <4 x i32> %tmp3
400 }
401
402 declare <16 x i8> @llvm.arm.neon.vrhaddu.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
403 declare <8 x i16> @llvm.arm.neon.vrhaddu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
404 declare <4 x i32> @llvm.arm.neon.vrhaddu.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
405
406 ; CHECK: vrhaddu_16xi8
407 define <16 x i8> @vrhaddu_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
408         %tmp1 = load <16 x i8>* %A
409         %tmp2 = load <16 x i8>* %B
410 ; CHECK: vrhadd.u8      q8, q8, q9      @ encoding: [0xe2,0x01,0x40,0xf3]
411         %tmp3 = call <16 x i8> @llvm.arm.neon.vrhaddu.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
412         ret <16 x i8> %tmp3
413 }
414
415 ; CHECK: vrhaddu_8xi16
416 define <8 x i16> @vrhaddu_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
417         %tmp1 = load <8 x i16>* %A
418         %tmp2 = load <8 x i16>* %B
419 ; CHECK: vrhadd.u16     q8, q8, q9      @ encoding: [0xe2,0x01,0x50,0xf3]
420         %tmp3 = call <8 x i16> @llvm.arm.neon.vrhaddu.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
421         ret <8 x i16> %tmp3
422 }
423
424 ; CHECK: vrhaddu_4xi32
425 define <4 x i32> @vrhaddu_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
426         %tmp1 = load <4 x i32>* %A
427         %tmp2 = load <4 x i32>* %B
428 ; CHECK: vrhadd.u32     q8, q8, q9      @ encoding: [0xe2,0x01,0x60,0xf3]
429         %tmp3 = call <4 x i32> @llvm.arm.neon.vrhaddu.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
430         ret <4 x i32> %tmp3
431 }
432
433 declare <8 x i8>  @llvm.arm.neon.vqadds.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
434 declare <4 x i16> @llvm.arm.neon.vqadds.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
435 declare <2 x i32> @llvm.arm.neon.vqadds.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
436 declare <1 x i64> @llvm.arm.neon.vqadds.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
437
438 ; CHECK: vqadds_8xi8
439 define <8 x i8> @vqadds_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
440         %tmp1 = load <8 x i8>* %A
441         %tmp2 = load <8 x i8>* %B
442 ; CHECK: vqadd.s8       d16, d16, d17   @ encoding: [0xb1,0x00,0x40,0xf2]
443         %tmp3 = call <8 x i8> @llvm.arm.neon.vqadds.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
444         ret <8 x i8> %tmp3
445 }
446
447 ; CHECK: vqadds_4xi16
448 define <4 x i16> @vqadds_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
449         %tmp1 = load <4 x i16>* %A
450         %tmp2 = load <4 x i16>* %B
451 ; CHECK: vqadd.s16      d16, d16, d17   @ encoding: [0xb1,0x00,0x50,0xf2]
452         %tmp3 = call <4 x i16> @llvm.arm.neon.vqadds.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
453         ret <4 x i16> %tmp3
454 }
455
456 ; CHECK: vqadds_2xi32
457 define <2 x i32> @vqadds_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
458         %tmp1 = load <2 x i32>* %A
459         %tmp2 = load <2 x i32>* %B
460 ; CHECK: vqadd.s32      d16, d16, d17   @ encoding: [0xb1,0x00,0x60,0xf2]
461         %tmp3 = call <2 x i32> @llvm.arm.neon.vqadds.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
462         ret <2 x i32> %tmp3
463 }
464
465 ; CHECK: vqadds_1xi64
466 define <1 x i64> @vqadds_1xi64(<1 x i64>* %A, <1 x i64>* %B) nounwind {
467         %tmp1 = load <1 x i64>* %A
468         %tmp2 = load <1 x i64>* %B
469 ; CHECK: vqadd.s64      d16, d16, d17   @ encoding: [0xb1,0x00,0x70,0xf2]
470         %tmp3 = call <1 x i64> @llvm.arm.neon.vqadds.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2)
471         ret <1 x i64> %tmp3
472 }
473
474 declare <8 x i8>  @llvm.arm.neon.vqaddu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
475 declare <4 x i16> @llvm.arm.neon.vqaddu.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
476 declare <2 x i32> @llvm.arm.neon.vqaddu.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
477 declare <1 x i64> @llvm.arm.neon.vqaddu.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
478
479 ; CHECK: vqaddu_8xi8
480 define <8 x i8> @vqaddu_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
481         %tmp1 = load <8 x i8>* %A
482         %tmp2 = load <8 x i8>* %B
483 ; CHECK: vqadd.u8       d16, d16, d17   @ encoding: [0xb1,0x00,0x40,0xf3]
484         %tmp3 = call <8 x i8> @llvm.arm.neon.vqaddu.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
485         ret <8 x i8> %tmp3
486 }
487
488 ; CHECK: vqaddu_4xi16
489 define <4 x i16> @vqaddu_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
490         %tmp1 = load <4 x i16>* %A
491         %tmp2 = load <4 x i16>* %B
492 ; CHECK: vqadd.u16      d16, d16, d17   @ encoding: [0xb1,0x00,0x50,0xf3]
493         %tmp3 = call <4 x i16> @llvm.arm.neon.vqaddu.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
494         ret <4 x i16> %tmp3
495 }
496
497 ; CHECK: vqaddu_2xi32
498 define <2 x i32> @vqaddu_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
499         %tmp1 = load <2 x i32>* %A
500         %tmp2 = load <2 x i32>* %B
501 ; CHECK: vqadd.u32      d16, d16, d17   @ encoding: [0xb1,0x00,0x60,0xf3]
502         %tmp3 = call <2 x i32> @llvm.arm.neon.vqaddu.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
503         ret <2 x i32> %tmp3
504 }
505
506 ; CHECK: vqaddu_1xi64
507 define <1 x i64> @vqaddu_1xi64(<1 x i64>* %A, <1 x i64>* %B) nounwind {
508         %tmp1 = load <1 x i64>* %A
509         %tmp2 = load <1 x i64>* %B
510 ; CHECK: vqadd.u64      d16, d16, d17   @ encoding: [0xb1,0x00,0x70,0xf3]
511         %tmp3 = call <1 x i64> @llvm.arm.neon.vqaddu.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2)
512         ret <1 x i64> %tmp3
513 }
514
515 declare <16 x i8> @llvm.arm.neon.vqadds.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
516 declare <8 x i16> @llvm.arm.neon.vqadds.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
517 declare <4 x i32> @llvm.arm.neon.vqadds.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
518 declare <2 x i64> @llvm.arm.neon.vqadds.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
519
520 ; CHECK: vqadds_16xi8
521 define <16 x i8> @vqadds_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
522         %tmp1 = load <16 x i8>* %A
523         %tmp2 = load <16 x i8>* %B
524 ; CHECK: vqadd.s8       q8, q8, q9      @ encoding: [0xf2,0x00,0x40,0xf2]
525         %tmp3 = call <16 x i8> @llvm.arm.neon.vqadds.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
526         ret <16 x i8> %tmp3
527 }
528
529 ; CHECK: vqadds_8xi16
530 define <8 x i16> @vqadds_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
531         %tmp1 = load <8 x i16>* %A
532         %tmp2 = load <8 x i16>* %B
533 ; CHECK: vqadd.s16      q8, q8, q9      @ encoding: [0xf2,0x00,0x50,0xf2]
534         %tmp3 = call <8 x i16> @llvm.arm.neon.vqadds.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
535         ret <8 x i16> %tmp3
536 }
537
538 ; CHECK: vqadds_4xi32
539 define <4 x i32> @vqadds_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
540         %tmp1 = load <4 x i32>* %A
541         %tmp2 = load <4 x i32>* %B
542 ; CHECK: vqadd.s32      q8, q8, q9      @ encoding: [0xf2,0x00,0x60,0xf2]
543         %tmp3 = call <4 x i32> @llvm.arm.neon.vqadds.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
544         ret <4 x i32> %tmp3
545 }
546
547 ; CHECK: vqadds_2xi64
548 define <2 x i64> @vqadds_2xi64(<2 x i64>* %A, <2 x i64>* %B) nounwind {
549         %tmp1 = load <2 x i64>* %A
550         %tmp2 = load <2 x i64>* %B
551 ; CHECK: vqadd.s64      q8, q8, q9      @ encoding: [0xf2,0x00,0x70,0xf2]
552         %tmp3 = call <2 x i64> @llvm.arm.neon.vqadds.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
553         ret <2 x i64> %tmp3
554 }
555
556 declare <16 x i8> @llvm.arm.neon.vqaddu.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
557 declare <8 x i16> @llvm.arm.neon.vqaddu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
558 declare <4 x i32> @llvm.arm.neon.vqaddu.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
559 declare <2 x i64> @llvm.arm.neon.vqaddu.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
560
561 ; CHECK: vqaddu_16xi8
562 define <16 x i8> @vqaddu_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
563         %tmp1 = load <16 x i8>* %A
564         %tmp2 = load <16 x i8>* %B
565 ; CHECK: vqadd.u8       q8, q8, q9      @ encoding: [0xf2,0x00,0x40,0xf3]
566         %tmp3 = call <16 x i8> @llvm.arm.neon.vqaddu.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
567         ret <16 x i8> %tmp3
568 }
569
570 ; CHECK: vqaddu_8xi16
571 define <8 x i16> @vqaddu_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
572         %tmp1 = load <8 x i16>* %A
573         %tmp2 = load <8 x i16>* %B
574 ; CHECK: vqadd.u16      q8, q8, q9      @ encoding: [0xf2,0x00,0x50,0xf3]
575         %tmp3 = call <8 x i16> @llvm.arm.neon.vqaddu.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
576         ret <8 x i16> %tmp3
577 }
578
579 ; CHECK: vqaddu_4xi32
580 define <4 x i32> @vqaddu_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
581         %tmp1 = load <4 x i32>* %A
582         %tmp2 = load <4 x i32>* %B
583 ; CHECK: vqadd.u32      q8, q8, q9      @ encoding: [0xf2,0x00,0x60,0xf3]
584         %tmp3 = call <4 x i32> @llvm.arm.neon.vqaddu.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
585         ret <4 x i32> %tmp3
586 }
587
588 ; CHECK: vqaddu_2xi64
589 define <2 x i64> @vqaddu_2xi64(<2 x i64>* %A, <2 x i64>* %B) nounwind {
590         %tmp1 = load <2 x i64>* %A
591         %tmp2 = load <2 x i64>* %B
592 ; CHECK: vqadd.u64      q8, q8, q9      @ encoding: [0xf2,0x00,0x70,0xf3]
593         %tmp3 = call <2 x i64> @llvm.arm.neon.vqaddu.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
594         ret <2 x i64> %tmp3
595 }
596
597 declare <8 x i8>  @llvm.arm.neon.vaddhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
598 declare <4 x i16> @llvm.arm.neon.vaddhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
599 declare <2 x i32> @llvm.arm.neon.vaddhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
600
601 ; CHECK: vaddhn_8xi16
602 define <8 x i8> @vaddhn_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
603         %tmp1 = load <8 x i16>* %A
604         %tmp2 = load <8 x i16>* %B
605 ; CHECK: vaddhn.i16     d16, q8, q9     @ encoding: [0xa2,0x04,0xc0,0xf2]
606         %tmp3 = call <8 x i8> @llvm.arm.neon.vaddhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
607         ret <8 x i8> %tmp3
608 }
609
610 ; CHECK: vaddhn_4xi32
611 define <4 x i16> @vaddhn_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
612         %tmp1 = load <4 x i32>* %A
613         %tmp2 = load <4 x i32>* %B
614 ; CHECK: vaddhn.i32     d16, q8, q9     @ encoding: [0xa2,0x04,0xd0,0xf2]
615         %tmp3 = call <4 x i16> @llvm.arm.neon.vaddhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
616         ret <4 x i16> %tmp3
617 }
618
619 ; CHECK: vaddhn_2xi64
620 define <2 x i32> @vaddhn_2xi64(<2 x i64>* %A, <2 x i64>* %B) nounwind {
621         %tmp1 = load <2 x i64>* %A
622         %tmp2 = load <2 x i64>* %B
623 ; CHECK: vaddhn.i64     d16, q8, q9     @ encoding: [0xa2,0x04,0xe0,0xf2]
624         %tmp3 = call <2 x i32> @llvm.arm.neon.vaddhn.v2i32(<2 x i64> %tmp1, <2 x i64> %tmp2)
625         ret <2 x i32> %tmp3
626 }
627
628 declare <8 x i8>  @llvm.arm.neon.vraddhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
629 declare <4 x i16> @llvm.arm.neon.vraddhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
630 declare <2 x i32> @llvm.arm.neon.vraddhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
631
632 ; CHECK: vraddhn_8xi16
633 define <8 x i8> @vraddhn_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
634         %tmp1 = load <8 x i16>* %A
635         %tmp2 = load <8 x i16>* %B
636 ; CHECK: vraddhn.i16    d16, q8, q9     @ encoding: [0xa2,0x04,0xc0,0xf3]
637         %tmp3 = call <8 x i8> @llvm.arm.neon.vraddhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
638         ret <8 x i8> %tmp3
639 }
640
641 ; CHECK: vraddhn_4xi32
642 define <4 x i16> @vraddhn_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
643         %tmp1 = load <4 x i32>* %A
644         %tmp2 = load <4 x i32>* %B
645 ; CHECK: vraddhn.i32    d16, q8, q9     @ encoding: [0xa2,0x04,0xd0,0xf3]
646         %tmp3 = call <4 x i16> @llvm.arm.neon.vraddhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
647         ret <4 x i16> %tmp3
648 }
649
650 ; CHECK: vraddhn_2xi64
651 define <2 x i32> @vraddhn_2xi64(<2 x i64>* %A, <2 x i64>* %B) nounwind {
652         %tmp1 = load <2 x i64>* %A
653         %tmp2 = load <2 x i64>* %B
654 ; CHECK: vraddhn.i64    d16, q8, q9     @ encoding: [0xa2,0x04,0xe0,0xf3]
655         %tmp3 = call <2 x i32> @llvm.arm.neon.vraddhn.v2i32(<2 x i64> %tmp1, <2 x i64> %tmp2)
656         ret <2 x i32> %tmp3
657 }