OSDN Git Service

Subzero: Replace global pointers to allocation functions
[android-x86/external-swiftshader.git] / tests_lit / llvm2ice_tests / vector-arith.ll
1 ; This test checks support for vector arithmetic.
2
3 ; RUN: %p2i -i %s --filetype=obj --disassemble -a -O2 \
4 ; RUN:   | FileCheck %s
5 ; RUN: %p2i -i %s --filetype=obj --disassemble -a -Om1 \
6 ; RUN:   | FileCheck %s
7 ; RUN: %p2i -i %s --filetype=obj --disassemble -a -O2 -mattr=sse4.1 \
8 ; RUN:   | FileCheck --check-prefix=SSE41 %s
9 ; RUN: %p2i -i %s --filetype=obj --disassemble -a -Om1 -mattr=sse4.1 \
10 ; RUN:   | FileCheck --check-prefix=SSE41 %s
11
12 define internal <4 x float> @test_fadd(<4 x float> %arg0, <4 x float> %arg1) {
13 entry:
14   %res = fadd <4 x float> %arg0, %arg1
15   ret <4 x float> %res
16 ; CHECK-LABEL: test_fadd
17 ; CHECK: addps
18 }
19
20 define internal <4 x float> @test_fsub(<4 x float> %arg0, <4 x float> %arg1) {
21 entry:
22   %res = fsub <4 x float> %arg0, %arg1
23   ret <4 x float> %res
24 ; CHECK-LABEL: test_fsub
25 ; CHECK: subps
26 }
27
28 define internal <4 x float> @test_fmul(<4 x float> %arg0, <4 x float> %arg1) {
29 entry:
30   %res = fmul <4 x float> %arg0, %arg1
31   ret <4 x float> %res
32 ; CHECK-LABEL: test_fmul
33 ; CHECK: mulps
34 }
35
36 define internal <4 x float> @test_fdiv(<4 x float> %arg0, <4 x float> %arg1) {
37 entry:
38   %res = fdiv <4 x float> %arg0, %arg1
39   ret <4 x float> %res
40 ; CHECK-LABEL: test_fdiv
41 ; CHECK: divps
42 }
43
44 define internal <4 x float> @test_frem(<4 x float> %arg0, <4 x float> %arg1) {
45 entry:
46   %res = frem <4 x float> %arg0, %arg1
47   ret <4 x float> %res
48 ; CHECK-LABEL: test_frem
49 ; CHECK: fmodf
50 ; CHECK: fmodf
51 ; CHECK: fmodf
52 ; CHECK: fmodf
53 }
54
55 define internal <16 x i8> @test_add_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
56 entry:
57   %res = add <16 x i8> %arg0, %arg1
58   ret <16 x i8> %res
59 ; CHECK-LABEL: test_add_v16i8
60 ; CHECK: paddb
61 }
62
63 define internal <16 x i8> @test_and_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
64 entry:
65   %res = and <16 x i8> %arg0, %arg1
66   ret <16 x i8> %res
67 ; CHECK-LABEL: test_and_v16i8
68 ; CHECK: pand
69 }
70
71 define internal <16 x i8> @test_or_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
72 entry:
73   %res = or <16 x i8> %arg0, %arg1
74   ret <16 x i8> %res
75 ; CHECK-LABEL: test_or_v16i8
76 ; CHECK: por
77 }
78
79 define internal <16 x i8> @test_xor_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
80 entry:
81   %res = xor <16 x i8> %arg0, %arg1
82   ret <16 x i8> %res
83 ; CHECK-LABEL: test_xor_v16i8
84 ; CHECK: pxor
85 }
86
87 define internal <16 x i8> @test_sub_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
88 entry:
89   %res = sub <16 x i8> %arg0, %arg1
90   ret <16 x i8> %res
91 ; CHECK-LABEL: test_sub_v16i8
92 ; CHECK: psubb
93 }
94
95 define internal <16 x i8> @test_mul_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
96 entry:
97   %res = mul <16 x i8> %arg0, %arg1
98   ret <16 x i8> %res
99 ; CHECK-LABEL: test_mul_v16i8
100 ; CHECK: imul
101 ; CHECK: imul
102 ; CHECK: imul
103 ; CHECK: imul
104 ; CHECK: imul
105 ; CHECK: imul
106 ; CHECK: imul
107 ; CHECK: imul
108 ; CHECK: imul
109 ; CHECK: imul
110 ; CHECK: imul
111 ; CHECK: imul
112 ; CHECK: imul
113 ; CHECK: imul
114 ; CHECK: imul
115 ; CHECK: imul
116 }
117
118 define internal <16 x i8> @test_shl_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
119 entry:
120   %res = shl <16 x i8> %arg0, %arg1
121   ret <16 x i8> %res
122 ; CHECK-LABEL: test_shl_v16i8
123 ; CHECK: shl
124 ; CHECK: shl
125 ; CHECK: shl
126 ; CHECK: shl
127 ; CHECK: shl
128 ; CHECK: shl
129 ; CHECK: shl
130 ; CHECK: shl
131 ; CHECK: shl
132 ; CHECK: shl
133 ; CHECK: shl
134 ; CHECK: shl
135 ; CHECK: shl
136 ; CHECK: shl
137 ; CHECK: shl
138 ; CHECK: shl
139 }
140
141 define internal <16 x i8> @test_lshr_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
142 entry:
143   %res = lshr <16 x i8> %arg0, %arg1
144   ret <16 x i8> %res
145 ; CHECK-LABEL: test_lshr_v16i8
146 ; CHECK: shr
147 ; CHECK: shr
148 ; CHECK: shr
149 ; CHECK: shr
150 ; CHECK: shr
151 ; CHECK: shr
152 ; CHECK: shr
153 ; CHECK: shr
154 ; CHECK: shr
155 ; CHECK: shr
156 ; CHECK: shr
157 ; CHECK: shr
158 ; CHECK: shr
159 ; CHECK: shr
160 ; CHECK: shr
161 ; CHECK: shr
162 }
163
164 define internal <16 x i8> @test_ashr_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
165 entry:
166   %res = ashr <16 x i8> %arg0, %arg1
167   ret <16 x i8> %res
168 ; CHECK-LABEL: test_ashr_v16i8
169 ; CHECK: sar
170 ; CHECK: sar
171 ; CHECK: sar
172 ; CHECK: sar
173 ; CHECK: sar
174 ; CHECK: sar
175 ; CHECK: sar
176 ; CHECK: sar
177 ; CHECK: sar
178 ; CHECK: sar
179 ; CHECK: sar
180 ; CHECK: sar
181 ; CHECK: sar
182 ; CHECK: sar
183 ; CHECK: sar
184 ; CHECK: sar
185 }
186
187 define internal <16 x i8> @test_udiv_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
188 entry:
189   %res = udiv <16 x i8> %arg0, %arg1
190   ret <16 x i8> %res
191 ; CHECK-LABEL: test_udiv_v16i8
192 ; CHECK: div
193 ; CHECK: div
194 ; CHECK: div
195 ; CHECK: div
196 ; CHECK: div
197 ; CHECK: div
198 ; CHECK: div
199 ; CHECK: div
200 ; CHECK: div
201 ; CHECK: div
202 ; CHECK: div
203 ; CHECK: div
204 ; CHECK: div
205 ; CHECK: div
206 ; CHECK: div
207 ; CHECK: div
208 }
209
210 define internal <16 x i8> @test_sdiv_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
211 entry:
212   %res = sdiv <16 x i8> %arg0, %arg1
213   ret <16 x i8> %res
214 ; CHECK-LABEL: test_sdiv_v16i8
215 ; CHECK: idiv
216 ; CHECK: idiv
217 ; CHECK: idiv
218 ; CHECK: idiv
219 ; CHECK: idiv
220 ; CHECK: idiv
221 ; CHECK: idiv
222 ; CHECK: idiv
223 ; CHECK: idiv
224 ; CHECK: idiv
225 ; CHECK: idiv
226 ; CHECK: idiv
227 ; CHECK: idiv
228 ; CHECK: idiv
229 ; CHECK: idiv
230 ; CHECK: idiv
231 }
232
233 define internal <16 x i8> @test_urem_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
234 entry:
235   %res = urem <16 x i8> %arg0, %arg1
236   ret <16 x i8> %res
237 ; CHECK-LABEL: test_urem_v16i8
238 ; CHECK: div
239 ; CHECK: div
240 ; CHECK: div
241 ; CHECK: div
242 ; CHECK: div
243 ; CHECK: div
244 ; CHECK: div
245 ; CHECK: div
246 ; CHECK: div
247 ; CHECK: div
248 ; CHECK: div
249 ; CHECK: div
250 ; CHECK: div
251 ; CHECK: div
252 ; CHECK: div
253 ; CHECK: div
254 }
255
256 define internal <16 x i8> @test_srem_v16i8(<16 x i8> %arg0, <16 x i8> %arg1) {
257 entry:
258   %res = srem <16 x i8> %arg0, %arg1
259   ret <16 x i8> %res
260 ; CHECK-LABEL: test_srem_v16i8
261 ; CHECK: idiv
262 ; CHECK: idiv
263 ; CHECK: idiv
264 ; CHECK: idiv
265 ; CHECK: idiv
266 ; CHECK: idiv
267 ; CHECK: idiv
268 ; CHECK: idiv
269 ; CHECK: idiv
270 ; CHECK: idiv
271 ; CHECK: idiv
272 ; CHECK: idiv
273 ; CHECK: idiv
274 ; CHECK: idiv
275 ; CHECK: idiv
276 ; CHECK: idiv
277 }
278
279 define internal <8 x i16> @test_add_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
280 entry:
281   %res = add <8 x i16> %arg0, %arg1
282   ret <8 x i16> %res
283 ; CHECK-LABEL: test_add_v8i16
284 ; CHECK: paddw
285 }
286
287 define internal <8 x i16> @test_and_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
288 entry:
289   %res = and <8 x i16> %arg0, %arg1
290   ret <8 x i16> %res
291 ; CHECK-LABEL: test_and_v8i16
292 ; CHECK: pand
293 }
294
295 define internal <8 x i16> @test_or_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
296 entry:
297   %res = or <8 x i16> %arg0, %arg1
298   ret <8 x i16> %res
299 ; CHECK-LABEL: test_or_v8i16
300 ; CHECK: por
301 }
302
303 define internal <8 x i16> @test_xor_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
304 entry:
305   %res = xor <8 x i16> %arg0, %arg1
306   ret <8 x i16> %res
307 ; CHECK-LABEL: test_xor_v8i16
308 ; CHECK: pxor
309 }
310
311 define internal <8 x i16> @test_sub_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
312 entry:
313   %res = sub <8 x i16> %arg0, %arg1
314   ret <8 x i16> %res
315 ; CHECK-LABEL: test_sub_v8i16
316 ; CHECK: psubw
317 }
318
319 define internal <8 x i16> @test_mul_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
320 entry:
321   %res = mul <8 x i16> %arg0, %arg1
322   ret <8 x i16> %res
323 ; CHECK-LABEL: test_mul_v8i16
324 ; CHECK: pmullw
325 }
326
327 define internal <8 x i16> @test_shl_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
328 entry:
329   %res = shl <8 x i16> %arg0, %arg1
330   ret <8 x i16> %res
331 ; CHECK-LABEL: test_shl_v8i16
332 ; CHECK: shl
333 ; CHECK: shl
334 ; CHECK: shl
335 ; CHECK: shl
336 ; CHECK: shl
337 ; CHECK: shl
338 ; CHECK: shl
339 ; CHECK: shl
340 }
341
342 define internal <8 x i16> @test_lshr_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
343 entry:
344   %res = lshr <8 x i16> %arg0, %arg1
345   ret <8 x i16> %res
346 ; CHECK-LABEL: test_lshr_v8i16
347 ; CHECK: shr
348 ; CHECK: shr
349 ; CHECK: shr
350 ; CHECK: shr
351 ; CHECK: shr
352 ; CHECK: shr
353 ; CHECK: shr
354 ; CHECK: shr
355 }
356
357 define internal <8 x i16> @test_ashr_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
358 entry:
359   %res = ashr <8 x i16> %arg0, %arg1
360   ret <8 x i16> %res
361 ; CHECK-LABEL: test_ashr_v8i16
362 ; CHECK: sar
363 ; CHECK: sar
364 ; CHECK: sar
365 ; CHECK: sar
366 ; CHECK: sar
367 ; CHECK: sar
368 ; CHECK: sar
369 ; CHECK: sar
370 }
371
372 define internal <8 x i16> @test_udiv_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
373 entry:
374   %res = udiv <8 x i16> %arg0, %arg1
375   ret <8 x i16> %res
376 ; CHECK-LABEL: test_udiv_v8i16
377 ; CHECK: div
378 ; CHECK: div
379 ; CHECK: div
380 ; CHECK: div
381 ; CHECK: div
382 ; CHECK: div
383 ; CHECK: div
384 ; CHECK: div
385 }
386
387 define internal <8 x i16> @test_sdiv_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
388 entry:
389   %res = sdiv <8 x i16> %arg0, %arg1
390   ret <8 x i16> %res
391 ; CHECK-LABEL: test_sdiv_v8i16
392 ; CHECK: idiv
393 ; CHECK: idiv
394 ; CHECK: idiv
395 ; CHECK: idiv
396 ; CHECK: idiv
397 ; CHECK: idiv
398 ; CHECK: idiv
399 ; CHECK: idiv
400 }
401
402 define internal <8 x i16> @test_urem_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
403 entry:
404   %res = urem <8 x i16> %arg0, %arg1
405   ret <8 x i16> %res
406 ; CHECK-LABEL: test_urem_v8i16
407 ; CHECK: div
408 ; CHECK: div
409 ; CHECK: div
410 ; CHECK: div
411 ; CHECK: div
412 ; CHECK: div
413 ; CHECK: div
414 ; CHECK: div
415 }
416
417 define internal <8 x i16> @test_srem_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) {
418 entry:
419   %res = srem <8 x i16> %arg0, %arg1
420   ret <8 x i16> %res
421 ; CHECK-LABEL: test_srem_v8i16
422 ; CHECK: idiv
423 ; CHECK: idiv
424 ; CHECK: idiv
425 ; CHECK: idiv
426 ; CHECK: idiv
427 ; CHECK: idiv
428 ; CHECK: idiv
429 ; CHECK: idiv
430 }
431
432 define internal <4 x i32> @test_add_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
433 entry:
434   %res = add <4 x i32> %arg0, %arg1
435   ret <4 x i32> %res
436 ; CHECK-LABEL: test_add_v4i32
437 ; CHECK: paddd
438 }
439
440 define internal <4 x i32> @test_and_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
441 entry:
442   %res = and <4 x i32> %arg0, %arg1
443   ret <4 x i32> %res
444 ; CHECK-LABEL: test_and_v4i32
445 ; CHECK: pand
446 }
447
448 define internal <4 x i32> @test_or_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
449 entry:
450   %res = or <4 x i32> %arg0, %arg1
451   ret <4 x i32> %res
452 ; CHECK-LABEL: test_or_v4i32
453 ; CHECK: por
454 }
455
456 define internal <4 x i32> @test_xor_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
457 entry:
458   %res = xor <4 x i32> %arg0, %arg1
459   ret <4 x i32> %res
460 ; CHECK-LABEL: test_xor_v4i32
461 ; CHECK: pxor
462 }
463
464 define internal <4 x i32> @test_sub_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
465 entry:
466   %res = sub <4 x i32> %arg0, %arg1
467   ret <4 x i32> %res
468 ; CHECK-LABEL: test_sub_v4i32
469 ; CHECK: psubd
470 }
471
472 define internal <4 x i32> @test_mul_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
473 entry:
474   %res = mul <4 x i32> %arg0, %arg1
475   ret <4 x i32> %res
476 ; CHECK-LABEL: test_mul_v4i32
477 ; CHECK: pmuludq
478 ; CHECK: pmuludq
479 ;
480 ; SSE41-LABEL: test_mul_v4i32
481 ; SSE41: pmulld
482 }
483
484 define internal <4 x i32> @test_shl_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
485 entry:
486   %res = shl <4 x i32> %arg0, %arg1
487   ret <4 x i32> %res
488 ; CHECK-LABEL: test_shl_v4i32
489 ; CHECK: shl
490 ; CHECK: shl
491 ; CHECK: shl
492 ; CHECK: shl
493
494 ; This line is to ensure that pmulld is generated in test_mul_v4i32 above.
495 ; SSE41-LABEL: test_shl_v4i32
496 }
497
498 define internal <4 x i32> @test_lshr_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
499 entry:
500   %res = lshr <4 x i32> %arg0, %arg1
501   ret <4 x i32> %res
502 ; CHECK-LABEL: test_lshr_v4i32
503 ; CHECK: shr
504 ; CHECK: shr
505 ; CHECK: shr
506 ; CHECK: shr
507 }
508
509 define internal <4 x i32> @test_ashr_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
510 entry:
511   %res = ashr <4 x i32> %arg0, %arg1
512   ret <4 x i32> %res
513 ; CHECK-LABEL: test_ashr_v4i32
514 ; CHECK: sar
515 ; CHECK: sar
516 ; CHECK: sar
517 ; CHECK: sar
518 }
519
520 define internal <4 x i32> @test_udiv_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
521 entry:
522   %res = udiv <4 x i32> %arg0, %arg1
523   ret <4 x i32> %res
524 ; CHECK-LABEL: test_udiv_v4i32
525 ; CHECK: div
526 ; CHECK: div
527 ; CHECK: div
528 ; CHECK: div
529 }
530
531 define internal <4 x i32> @test_sdiv_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
532 entry:
533   %res = sdiv <4 x i32> %arg0, %arg1
534   ret <4 x i32> %res
535 ; CHECK-LABEL: test_sdiv_v4i32
536 ; CHECK: idiv
537 ; CHECK: idiv
538 ; CHECK: idiv
539 ; CHECK: idiv
540 }
541
542 define internal <4 x i32> @test_urem_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
543 entry:
544   %res = urem <4 x i32> %arg0, %arg1
545   ret <4 x i32> %res
546 ; CHECK-LABEL: test_urem_v4i32
547 ; CHECK: div
548 ; CHECK: div
549 ; CHECK: div
550 ; CHECK: div
551 }
552
553 define internal <4 x i32> @test_srem_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) {
554 entry:
555   %res = srem <4 x i32> %arg0, %arg1
556   ret <4 x i32> %res
557 ; CHECK-LABEL: test_srem_v4i32
558 ; CHECK: idiv
559 ; CHECK: idiv
560 ; CHECK: idiv
561 ; CHECK: idiv
562 }