Revert 374373: [Codegen] Alter the default promotion for saturating adds and subs
[llvm-core.git] / test / CodeGen / AArch64 / neon-bitcast.ll
blob8f67ff83ae129f486f60ca95f74678c71917b6c8
1 ; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon -verify-machineinstrs < %s | FileCheck %s
3 ; From <8 x i8>
5 define <1 x i64> @test_v8i8_to_v1i64(<8 x i8> %in) nounwind {
6 ; CHECK: test_v8i8_to_v1i64:
7 ; CHECK-NEXT: // %bb.0:
8 ; CHECK-NEXT: ret
10   %val = bitcast <8 x i8> %in to <1 x i64>
11   ret <1 x i64> %val
14 define <2 x i32> @test_v8i8_to_v2i32(<8 x i8> %in) nounwind {
15 ; CHECK: test_v8i8_to_v2i32:
16 ; CHECK-NEXT: // %bb.0:
17 ; CHECK-NEXT: ret
19   %val = bitcast <8 x i8> %in to <2 x i32>
20   ret <2 x i32> %val
23 define <2 x float> @test_v8i8_to_v2f32(<8 x i8> %in) nounwind{
24 ; CHECK: test_v8i8_to_v2f32:
25 ; CHECK-NEXT: // %bb.0:
26 ; CHECK-NEXT: ret
28   %val = bitcast <8 x i8> %in to <2 x float>
29   ret <2 x float> %val
32 define <4 x i16> @test_v8i8_to_v4i16(<8 x i8> %in) nounwind{
33 ; CHECK: test_v8i8_to_v4i16:
34 ; CHECK-NEXT: // %bb.0:
35 ; CHECK-NEXT: ret
37   %val = bitcast <8 x i8> %in to <4 x i16>
38   ret <4 x i16> %val
41 define <8 x i8> @test_v8i8_to_v8i8(<8 x i8> %in) nounwind{
42 ; CHECK: test_v8i8_to_v8i8:
43 ; CHECK-NEXT: // %bb.0:
44 ; CHECK-NEXT: ret
46   %val = bitcast <8 x i8> %in to <8 x i8>
47   ret <8 x i8> %val
50 ; From <4 x i16>
52 define <1 x i64> @test_v4i16_to_v1i64(<4 x i16> %in) nounwind {
53 ; CHECK: test_v4i16_to_v1i64:
54 ; CHECK-NEXT: // %bb.0:
55 ; CHECK-NEXT: ret
57   %val = bitcast <4 x i16> %in to <1 x i64>
58   ret <1 x i64> %val
61 define <2 x i32> @test_v4i16_to_v2i32(<4 x i16> %in) nounwind {
62 ; CHECK: test_v4i16_to_v2i32:
63 ; CHECK-NEXT: // %bb.0:
64 ; CHECK-NEXT: ret
66   %val = bitcast <4 x i16> %in to <2 x i32>
67   ret <2 x i32> %val
70 define <2 x float> @test_v4i16_to_v2f32(<4 x i16> %in) nounwind{
71 ; CHECK: test_v4i16_to_v2f32:
72 ; CHECK-NEXT: // %bb.0:
73 ; CHECK-NEXT: ret
75   %val = bitcast <4 x i16> %in to <2 x float>
76   ret <2 x float> %val
79 define <4 x i16> @test_v4i16_to_v4i16(<4 x i16> %in) nounwind{
80 ; CHECK: test_v4i16_to_v4i16:
81 ; CHECK-NEXT: // %bb.0:
82 ; CHECK-NEXT: ret
84   %val = bitcast <4 x i16> %in to <4 x i16>
85   ret <4 x i16> %val
88 define <8 x i8> @test_v4i16_to_v8i8(<4 x i16> %in) nounwind{
89 ; CHECK: test_v4i16_to_v8i8:
90 ; CHECK-NEXT: // %bb.0:
91 ; CHECK-NEXT: ret
93   %val = bitcast <4 x i16> %in to <8 x i8>
94   ret <8 x i8> %val
97 ; From <2 x i32>
99 define <1 x i64> @test_v2i32_to_v1i64(<2 x i32> %in) nounwind {
100 ; CHECK: test_v2i32_to_v1i64:
101 ; CHECK-NEXT: // %bb.0:
102 ; CHECK-NEXT: ret
104   %val = bitcast <2 x i32> %in to <1 x i64>
105   ret <1 x i64> %val
108 define <2 x i32> @test_v2i32_to_v2i32(<2 x i32> %in) nounwind {
109 ; CHECK: test_v2i32_to_v2i32:
110 ; CHECK-NEXT: // %bb.0:
111 ; CHECK-NEXT: ret
113   %val = bitcast <2 x i32> %in to <2 x i32>
114   ret <2 x i32> %val
117 define <2 x float> @test_v2i32_to_v2f32(<2 x i32> %in) nounwind{
118 ; CHECK: test_v2i32_to_v2f32:
119 ; CHECK-NEXT: // %bb.0:
120 ; CHECK-NEXT: ret
122   %val = bitcast <2 x i32> %in to <2 x float>
123   ret <2 x float> %val
126 define <4 x i16> @test_v2i32_to_v4i16(<2 x i32> %in) nounwind{
127 ; CHECK: test_v2i32_to_v4i16:
128 ; CHECK-NEXT: // %bb.0:
129 ; CHECK-NEXT: ret
131   %val = bitcast <2 x i32> %in to <4 x i16>
132   ret <4 x i16> %val
135 define <8 x i8> @test_v2i32_to_v8i8(<2 x i32> %in) nounwind{
136 ; CHECK: test_v2i32_to_v8i8:
137 ; CHECK-NEXT: // %bb.0:
138 ; CHECK-NEXT: ret
140   %val = bitcast <2 x i32> %in to <8 x i8>
141   ret <8 x i8> %val
144 ; From <2 x float>
146 define <1 x i64> @test_v2f32_to_v1i64(<2 x float> %in) nounwind {
147 ; CHECK: test_v2f32_to_v1i64:
148 ; CHECK-NEXT: // %bb.0:
149 ; CHECK-NEXT: ret
151   %val = bitcast <2 x float> %in to <1 x i64>
152   ret <1 x i64> %val
155 define <2 x i32> @test_v2f32_to_v2i32(<2 x float> %in) nounwind {
156 ; CHECK: test_v2f32_to_v2i32:
157 ; CHECK-NEXT: // %bb.0:
158 ; CHECK-NEXT: ret
160   %val = bitcast <2 x float> %in to <2 x i32>
161   ret <2 x i32> %val
164 define <2 x float> @test_v2f32_to_v2f32(<2 x float> %in) nounwind{
165 ; CHECK: test_v2f32_to_v2f32:
166 ; CHECK-NEXT: // %bb.0:
167 ; CHECK-NEXT: ret
169   %val = bitcast <2 x float> %in to <2 x float>
170   ret <2 x float> %val
173 define <4 x i16> @test_v2f32_to_v4i16(<2 x float> %in) nounwind{
174 ; CHECK: test_v2f32_to_v4i16:
175 ; CHECK-NEXT: // %bb.0:
176 ; CHECK-NEXT: ret
178   %val = bitcast <2 x float> %in to <4 x i16>
179   ret <4 x i16> %val
182 define <8 x i8> @test_v2f32_to_v8i8(<2 x float> %in) nounwind{
183 ; CHECK: test_v2f32_to_v8i8:
184 ; CHECK-NEXT: // %bb.0:
185 ; CHECK-NEXT: ret
187   %val = bitcast <2 x float> %in to <8 x i8>
188   ret <8 x i8> %val
191 ; From <1 x i64>
193 define <1 x i64> @test_v1i64_to_v1i64(<1 x i64> %in) nounwind {
194 ; CHECK: test_v1i64_to_v1i64:
195 ; CHECK-NEXT: // %bb.0:
196 ; CHECK-NEXT: ret
198   %val = bitcast <1 x i64> %in to <1 x i64>
199   ret <1 x i64> %val
202 define <2 x i32> @test_v1i64_to_v2i32(<1 x i64> %in) nounwind {
203 ; CHECK: test_v1i64_to_v2i32:
204 ; CHECK-NEXT: // %bb.0:
205 ; CHECK-NEXT: ret
207   %val = bitcast <1 x i64> %in to <2 x i32>
208   ret <2 x i32> %val
211 define <2 x float> @test_v1i64_to_v2f32(<1 x i64> %in) nounwind{
212 ; CHECK: test_v1i64_to_v2f32:
213 ; CHECK-NEXT: // %bb.0:
214 ; CHECK-NEXT: ret
216   %val = bitcast <1 x i64> %in to <2 x float>
217   ret <2 x float> %val
220 define <4 x i16> @test_v1i64_to_v4i16(<1 x i64> %in) nounwind{
221 ; CHECK: test_v1i64_to_v4i16:
222 ; CHECK-NEXT: // %bb.0:
223 ; CHECK-NEXT: ret
225   %val = bitcast <1 x i64> %in to <4 x i16>
226   ret <4 x i16> %val
229 define <8 x i8> @test_v1i64_to_v8i8(<1 x i64> %in) nounwind{
230 ; CHECK: test_v1i64_to_v8i8:
231 ; CHECK-NEXT: // %bb.0:
232 ; CHECK-NEXT: ret
234   %val = bitcast <1 x i64> %in to <8 x i8>
235   ret <8 x i8> %val
239 ; From <16 x i8>
241 define <2 x double> @test_v16i8_to_v2f64(<16 x i8> %in) nounwind {
242 ; CHECK: test_v16i8_to_v2f64:
243 ; CHECK-NEXT: // %bb.0:
244 ; CHECK-NEXT: ret
246   %val = bitcast <16 x i8> %in to <2 x double>
247   ret <2 x double> %val
250 define <2 x i64> @test_v16i8_to_v2i64(<16 x i8> %in) nounwind {
251 ; CHECK: test_v16i8_to_v2i64:
252 ; CHECK-NEXT: // %bb.0:
253 ; CHECK-NEXT: ret
255   %val = bitcast <16 x i8> %in to <2 x i64>
256   ret <2 x i64> %val
259 define <4 x i32> @test_v16i8_to_v4i32(<16 x i8> %in) nounwind {
260 ; CHECK: test_v16i8_to_v4i32:
261 ; CHECK-NEXT: // %bb.0:
262 ; CHECK-NEXT: ret
264   %val = bitcast <16 x i8> %in to <4 x i32>
265   ret <4 x i32> %val
268 define <4 x float> @test_v16i8_to_v2f32(<16 x i8> %in) nounwind{
269 ; CHECK: test_v16i8_to_v2f32:
270 ; CHECK-NEXT: // %bb.0:
271 ; CHECK-NEXT: ret
273   %val = bitcast <16 x i8> %in to <4 x float>
274   ret <4 x float> %val
277 define <8 x i16> @test_v16i8_to_v8i16(<16 x i8> %in) nounwind{
278 ; CHECK: test_v16i8_to_v8i16:
279 ; CHECK-NEXT: // %bb.0:
280 ; CHECK-NEXT: ret
282   %val = bitcast <16 x i8> %in to <8 x i16>
283   ret <8 x i16> %val
286 define <16 x i8> @test_v16i8_to_v16i8(<16 x i8> %in) nounwind{
287 ; CHECK: test_v16i8_to_v16i8:
288 ; CHECK-NEXT: // %bb.0:
289 ; CHECK-NEXT: ret
291   %val = bitcast <16 x i8> %in to <16 x i8>
292   ret <16 x i8> %val
295 ; From <8 x i16>
297 define <2 x double> @test_v8i16_to_v2f64(<8 x i16> %in) nounwind {
298 ; CHECK: test_v8i16_to_v2f64:
299 ; CHECK-NEXT: // %bb.0:
300 ; CHECK-NEXT: ret
302   %val = bitcast <8 x i16> %in to <2 x double>
303   ret <2 x double> %val
306 define <2 x i64> @test_v8i16_to_v2i64(<8 x i16> %in) nounwind {
307 ; CHECK: test_v8i16_to_v2i64:
308 ; CHECK-NEXT: // %bb.0:
309 ; CHECK-NEXT: ret
311   %val = bitcast <8 x i16> %in to <2 x i64>
312   ret <2 x i64> %val
315 define <4 x i32> @test_v8i16_to_v4i32(<8 x i16> %in) nounwind {
316 ; CHECK: test_v8i16_to_v4i32:
317 ; CHECK-NEXT: // %bb.0:
318 ; CHECK-NEXT: ret
320   %val = bitcast <8 x i16> %in to <4 x i32>
321   ret <4 x i32> %val
324 define <4 x float> @test_v8i16_to_v2f32(<8 x i16> %in) nounwind{
325 ; CHECK: test_v8i16_to_v2f32:
326 ; CHECK-NEXT: // %bb.0:
327 ; CHECK-NEXT: ret
329   %val = bitcast <8 x i16> %in to <4 x float>
330   ret <4 x float> %val
333 define <8 x i16> @test_v8i16_to_v8i16(<8 x i16> %in) nounwind{
334 ; CHECK: test_v8i16_to_v8i16:
335 ; CHECK-NEXT: // %bb.0:
336 ; CHECK-NEXT: ret
338   %val = bitcast <8 x i16> %in to <8 x i16>
339   ret <8 x i16> %val
342 define <16 x i8> @test_v8i16_to_v16i8(<8 x i16> %in) nounwind{
343 ; CHECK: test_v8i16_to_v16i8:
344 ; CHECK-NEXT: // %bb.0:
345 ; CHECK-NEXT: ret
347   %val = bitcast <8 x i16> %in to <16 x i8>
348   ret <16 x i8> %val
351 ; From <4 x i32>
353 define <2 x double> @test_v4i32_to_v2f64(<4 x i32> %in) nounwind {
354 ; CHECK: test_v4i32_to_v2f64:
355 ; CHECK-NEXT: // %bb.0:
356 ; CHECK-NEXT: ret
358   %val = bitcast <4 x i32> %in to <2 x double>
359   ret <2 x double> %val
362 define <2 x i64> @test_v4i32_to_v2i64(<4 x i32> %in) nounwind {
363 ; CHECK: test_v4i32_to_v2i64:
364 ; CHECK-NEXT: // %bb.0:
365 ; CHECK-NEXT: ret
367   %val = bitcast <4 x i32> %in to <2 x i64>
368   ret <2 x i64> %val
371 define <4 x i32> @test_v4i32_to_v4i32(<4 x i32> %in) nounwind {
372 ; CHECK: test_v4i32_to_v4i32:
373 ; CHECK-NEXT: // %bb.0:
374 ; CHECK-NEXT: ret
376   %val = bitcast <4 x i32> %in to <4 x i32>
377   ret <4 x i32> %val
380 define <4 x float> @test_v4i32_to_v2f32(<4 x i32> %in) nounwind{
381 ; CHECK: test_v4i32_to_v2f32:
382 ; CHECK-NEXT: // %bb.0:
383 ; CHECK-NEXT: ret
385   %val = bitcast <4 x i32> %in to <4 x float>
386   ret <4 x float> %val
389 define <8 x i16> @test_v4i32_to_v8i16(<4 x i32> %in) nounwind{
390 ; CHECK: test_v4i32_to_v8i16:
391 ; CHECK-NEXT: // %bb.0:
392 ; CHECK-NEXT: ret
394   %val = bitcast <4 x i32> %in to <8 x i16>
395   ret <8 x i16> %val
398 define <16 x i8> @test_v4i32_to_v16i8(<4 x i32> %in) nounwind{
399 ; CHECK: test_v4i32_to_v16i8:
400 ; CHECK-NEXT: // %bb.0:
401 ; CHECK-NEXT: ret
403   %val = bitcast <4 x i32> %in to <16 x i8>
404   ret <16 x i8> %val
407 ; From <4 x float>
409 define <2 x double> @test_v4f32_to_v2f64(<4 x float> %in) nounwind {
410 ; CHECK: test_v4f32_to_v2f64:
411 ; CHECK-NEXT: // %bb.0:
412 ; CHECK-NEXT: ret
414   %val = bitcast <4 x float> %in to <2 x double>
415   ret <2 x double> %val
418 define <2 x i64> @test_v4f32_to_v2i64(<4 x float> %in) nounwind {
419 ; CHECK: test_v4f32_to_v2i64:
420 ; CHECK-NEXT: // %bb.0:
421 ; CHECK-NEXT: ret
423   %val = bitcast <4 x float> %in to <2 x i64>
424   ret <2 x i64> %val
427 define <4 x i32> @test_v4f32_to_v4i32(<4 x float> %in) nounwind {
428 ; CHECK: test_v4f32_to_v4i32:
429 ; CHECK-NEXT: // %bb.0:
430 ; CHECK-NEXT: ret
432   %val = bitcast <4 x float> %in to <4 x i32>
433   ret <4 x i32> %val
436 define <4 x float> @test_v4f32_to_v4f32(<4 x float> %in) nounwind{
437 ; CHECK: test_v4f32_to_v4f32:
438 ; CHECK-NEXT: // %bb.0:
439 ; CHECK-NEXT: ret
441   %val = bitcast <4 x float> %in to <4 x float>
442   ret <4 x float> %val
445 define <8 x i16> @test_v4f32_to_v8i16(<4 x float> %in) nounwind{
446 ; CHECK: test_v4f32_to_v8i16:
447 ; CHECK-NEXT: // %bb.0:
448 ; CHECK-NEXT: ret
450   %val = bitcast <4 x float> %in to <8 x i16>
451   ret <8 x i16> %val
454 define <16 x i8> @test_v4f32_to_v16i8(<4 x float> %in) nounwind{
455 ; CHECK: test_v4f32_to_v16i8:
456 ; CHECK-NEXT: // %bb.0:
457 ; CHECK-NEXT: ret
459   %val = bitcast <4 x float> %in to <16 x i8>
460   ret <16 x i8> %val
463 ; From <2 x i64>
465 define <2 x double> @test_v2i64_to_v2f64(<2 x i64> %in) nounwind {
466 ; CHECK: test_v2i64_to_v2f64:
467 ; CHECK-NEXT: // %bb.0:
468 ; CHECK-NEXT: ret
470   %val = bitcast <2 x i64> %in to <2 x double>
471   ret <2 x double> %val
474 define <2 x i64> @test_v2i64_to_v2i64(<2 x i64> %in) nounwind {
475 ; CHECK: test_v2i64_to_v2i64:
476 ; CHECK-NEXT: // %bb.0:
477 ; CHECK-NEXT: ret
479   %val = bitcast <2 x i64> %in to <2 x i64>
480   ret <2 x i64> %val
483 define <4 x i32> @test_v2i64_to_v4i32(<2 x i64> %in) nounwind {
484 ; CHECK: test_v2i64_to_v4i32:
485 ; CHECK-NEXT: // %bb.0:
486 ; CHECK-NEXT: ret
488   %val = bitcast <2 x i64> %in to <4 x i32>
489   ret <4 x i32> %val
492 define <4 x float> @test_v2i64_to_v4f32(<2 x i64> %in) nounwind{
493 ; CHECK: test_v2i64_to_v4f32:
494 ; CHECK-NEXT: // %bb.0:
495 ; CHECK-NEXT: ret
497   %val = bitcast <2 x i64> %in to <4 x float>
498   ret <4 x float> %val
501 define <8 x i16> @test_v2i64_to_v8i16(<2 x i64> %in) nounwind{
502 ; CHECK: test_v2i64_to_v8i16:
503 ; CHECK-NEXT: // %bb.0:
504 ; CHECK-NEXT: ret
506   %val = bitcast <2 x i64> %in to <8 x i16>
507   ret <8 x i16> %val
510 define <16 x i8> @test_v2i64_to_v16i8(<2 x i64> %in) nounwind{
511 ; CHECK: test_v2i64_to_v16i8:
512 ; CHECK-NEXT: // %bb.0:
513 ; CHECK-NEXT: ret
515   %val = bitcast <2 x i64> %in to <16 x i8>
516   ret <16 x i8> %val
519 ; From <2 x double>
521 define <2 x double> @test_v2f64_to_v2f64(<2 x double> %in) nounwind {
522 ; CHECK: test_v2f64_to_v2f64:
523 ; CHECK-NEXT: // %bb.0:
524 ; CHECK-NEXT: ret
526   %val = bitcast <2 x double> %in to <2 x double>
527   ret <2 x double> %val
530 define <2 x i64> @test_v2f64_to_v2i64(<2 x double> %in) nounwind {
531 ; CHECK: test_v2f64_to_v2i64:
532 ; CHECK-NEXT: // %bb.0:
533 ; CHECK-NEXT: ret
535   %val = bitcast <2 x double> %in to <2 x i64>
536   ret <2 x i64> %val
539 define <4 x i32> @test_v2f64_to_v4i32(<2 x double> %in) nounwind {
540 ; CHECK: test_v2f64_to_v4i32:
541 ; CHECK-NEXT: // %bb.0:
542 ; CHECK-NEXT: ret
544   %val = bitcast <2 x double> %in to <4 x i32>
545   ret <4 x i32> %val
548 define <4 x float> @test_v2f64_to_v4f32(<2 x double> %in) nounwind{
549 ; CHECK: test_v2f64_to_v4f32:
550 ; CHECK-NEXT: // %bb.0:
551 ; CHECK-NEXT: ret
553   %val = bitcast <2 x double> %in to <4 x float>
554   ret <4 x float> %val
557 define <8 x i16> @test_v2f64_to_v8i16(<2 x double> %in) nounwind{
558 ; CHECK: test_v2f64_to_v8i16:
559 ; CHECK-NEXT: // %bb.0:
560 ; CHECK-NEXT: ret
562   %val = bitcast <2 x double> %in to <8 x i16>
563   ret <8 x i16> %val
566 define <16 x i8> @test_v2f64_to_v16i8(<2 x double> %in) nounwind{
567 ; CHECK: test_v2f64_to_v16i8:
568 ; CHECK-NEXT: // %bb.0:
569 ; CHECK-NEXT: ret
571   %val = bitcast <2 x double> %in to <16 x i8>
572   ret <16 x i8> %val