AArch64/ARM64: enable more AArch64 tests on ARM64.
[oota-llvm.git] / test / CodeGen / AArch64 / neon-scalar-copy.ll
1 ; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon < %s | FileCheck %s
2
3 define float @test_dup_sv2S(<2 x float> %v) {
4  ;CHECK: test_dup_sv2S
5  ;CHECK: dup {{s[0-9]+}}, {{v[0-9]+}}.s[1]
6  %tmp1 = extractelement <2 x float> %v, i32 1
7  ret float  %tmp1
8 }
9
10 define float @test_dup_sv2S_0(<2 x float> %v) {
11  ;CHECK-LABEL: test_dup_sv2S_0
12  ;CHECK-NOT: dup {{s[0-9]+}}, {{v[0-9]+}}.s[0]
13  ;CHECK: ret
14  %tmp1 = extractelement <2 x float> %v, i32 0
15  ret float  %tmp1
16 }
17
18 define float @test_dup_sv4S(<4 x float> %v) {
19  ;CHECK-LABEL: test_dup_sv4S
20  ;CHECK-NOT: dup {{s[0-9]+}}, {{v[0-9]+}}.s[0]
21  ;CHECK: ret
22  %tmp1 = extractelement <4 x float> %v, i32 0
23  ret float  %tmp1
24 }
25
26 define double @test_dup_dvD(<1 x double> %v) {
27  ;CHECK: test_dup_dvD
28  ;CHECK-NOT: dup {{d[0-9]+}}, {{v[0-9]+}}.d[0]
29  ;CHECK: ret
30  %tmp1 = extractelement <1 x double> %v, i32 0
31  ret double  %tmp1
32 }
33
34 define double @test_dup_dv2D(<2 x double> %v) {
35  ;CHECK: test_dup_dv2D
36  ;CHECK: dup {{d[0-9]+}}, {{v[0-9]+}}.d[1]
37  %tmp1 = extractelement <2 x double> %v, i32 1
38  ret double  %tmp1
39 }
40
41 define double @test_dup_dv2D_0(<2 x double> %v) {
42  ;CHECK: test_dup_dv2D_0
43  ;CHECK-NOT: dup {{d[0-9]+}}, {{v[0-9]+}}.d[0]
44  ;CHECK: ret
45  %tmp1 = extractelement <2 x double> %v, i32 1
46  ret double  %tmp1
47 }
48
49 define <1 x i8> @test_vector_dup_bv16B(<16 x i8> %v1) {
50  ;CHECK: test_vector_dup_bv16B
51  ;CHECK: dup {{b[0-9]+}}, {{v[0-9]+}}.b[14]
52  %shuffle.i = shufflevector <16 x i8> %v1, <16 x i8> undef, <1 x i32> <i32 14> 
53  ret <1 x i8> %shuffle.i
54 }
55
56 define <1 x i8> @test_vector_dup_bv8B(<8 x i8> %v1) {
57  ;CHECK: test_vector_dup_bv8B
58  ;CHECK: dup {{b[0-9]+}}, {{v[0-9]+}}.b[7]
59  %shuffle.i = shufflevector <8 x i8> %v1, <8 x i8> undef, <1 x i32> <i32 7> 
60  ret <1 x i8> %shuffle.i
61 }
62
63 define <1 x i16> @test_vector_dup_hv8H(<8 x i16> %v1) {
64  ;CHECK: test_vector_dup_hv8H
65  ;CHECK: dup {{h[0-9]+}}, {{v[0-9]+}}.h[7]
66  %shuffle.i = shufflevector <8 x i16> %v1, <8 x i16> undef, <1 x i32> <i32 7> 
67  ret <1 x i16> %shuffle.i
68 }
69
70 define <1 x i16> @test_vector_dup_hv4H(<4 x i16> %v1) {
71  ;CHECK: test_vector_dup_hv4H
72  ;CHECK: dup {{h[0-9]+}}, {{v[0-9]+}}.h[3]
73  %shuffle.i = shufflevector <4 x i16> %v1, <4 x i16> undef, <1 x i32> <i32 3> 
74  ret <1 x i16> %shuffle.i
75 }
76
77 define <1 x i32> @test_vector_dup_sv4S(<4 x i32> %v1) {
78  ;CHECK: test_vector_dup_sv4S
79  ;CHECK: dup {{s[0-9]+}}, {{v[0-9]+}}.s[3]
80  %shuffle = shufflevector <4 x i32> %v1, <4 x i32> undef, <1 x i32> <i32 3> 
81  ret <1 x i32> %shuffle
82 }
83
84 define <1 x i32> @test_vector_dup_sv2S(<2 x i32> %v1) {
85  ;CHECK: test_vector_dup_sv2S
86  ;CHECK: dup {{s[0-9]+}}, {{v[0-9]+}}.s[1]
87  %shuffle = shufflevector <2 x i32> %v1, <2 x i32> undef, <1 x i32> <i32 1> 
88  ret <1 x i32> %shuffle
89 }
90
91 define <1 x i64> @test_vector_dup_dv2D(<2 x i64> %v1) {
92  ;CHECK: test_vector_dup_dv2D
93  ;CHECK: dup {{d[0-9]+}}, {{v[0-9]+}}.d[1]
94  %shuffle.i = shufflevector <2 x i64> %v1, <2 x i64> undef, <1 x i32> <i32 1> 
95  ret <1 x i64> %shuffle.i
96 }
97
98 define <1 x i64> @test_vector_copy_dup_dv2D(<1 x i64> %a, <2 x i64> %c) {
99   ;CHECK: test_vector_copy_dup_dv2D
100   ;CHECK: dup {{d[0-9]+}}, {{v[0-9]+}}.d[1]
101   %vget_lane = extractelement <2 x i64> %c, i32 1
102   %vset_lane = insertelement <1 x i64> undef, i64 %vget_lane, i32 0
103   ret <1 x i64> %vset_lane
104 }
105