AArch64/ARM64: add another set of tests from AArch64
[oota-llvm.git] / test / CodeGen / AArch64 / neon-scalar-fcvt.ll
1 ; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon < %s | FileCheck %s
2
3 ;; Scalar Floating-point Convert
4
5 define float @test_vcvtxn(double %a) {
6 ; CHECK: test_vcvtxn
7 ; CHECK: fcvtxn {{s[0-9]}}, {{d[0-9]}}
8 entry:
9   %vcvtf = call float @llvm.aarch64.neon.fcvtxn(double %a)
10   ret float %vcvtf
11 }
12
13 declare float @llvm.aarch64.neon.fcvtxn(double)
14
15 define i32 @test_vcvtass(float %a) {
16 ; CHECK: test_vcvtass
17 ; CHECK: fcvtas {{s[0-9]}}, {{s[0-9]}}
18 entry:
19   %vcvtas1.i = call <1 x i32> @llvm.aarch64.neon.fcvtas.v1i32.f32(float %a)
20   %0 = extractelement <1 x i32> %vcvtas1.i, i32 0
21   ret i32 %0
22 }
23
24 declare <1 x i32> @llvm.aarch64.neon.fcvtas.v1i32.f32(float)
25
26 define i64 @test_test_vcvtasd(double %a) {
27 ; CHECK: test_test_vcvtasd
28 ; CHECK: fcvtas {{d[0-9]}}, {{d[0-9]}}
29 entry:
30   %vcvtas1.i = call <1 x i64> @llvm.aarch64.neon.fcvtas.v1i64.f64(double %a)
31   %0 = extractelement <1 x i64> %vcvtas1.i, i32 0
32   ret i64 %0
33 }
34
35 declare <1 x i64> @llvm.aarch64.neon.fcvtas.v1i64.f64(double)
36
37 define i32 @test_vcvtaus(float %a) {
38 ; CHECK: test_vcvtaus
39 ; CHECK: fcvtau {{s[0-9]}}, {{s[0-9]}}
40 entry:
41   %vcvtau1.i = call <1 x i32> @llvm.aarch64.neon.fcvtau.v1i32.f32(float %a)
42   %0 = extractelement <1 x i32> %vcvtau1.i, i32 0
43   ret i32 %0
44 }
45
46 declare <1 x i32> @llvm.aarch64.neon.fcvtau.v1i32.f32(float)
47
48 define i64 @test_vcvtaud(double %a) {
49 ; CHECK: test_vcvtaud
50 ; CHECK: fcvtau {{d[0-9]}}, {{d[0-9]}}
51 entry:
52   %vcvtau1.i = call <1 x i64> @llvm.aarch64.neon.fcvtau.v1i64.f64(double %a)
53   %0 = extractelement <1 x i64> %vcvtau1.i, i32 0
54   ret i64 %0
55 }
56
57 declare <1 x i64> @llvm.aarch64.neon.fcvtau.v1i64.f64(double) 
58
59 define i32 @test_vcvtmss(float %a) {
60 ; CHECK: test_vcvtmss
61 ; CHECK: fcvtms {{s[0-9]}}, {{s[0-9]}}
62 entry:
63   %vcvtms1.i = call <1 x i32> @llvm.aarch64.neon.fcvtms.v1i32.f32(float %a)
64   %0 = extractelement <1 x i32> %vcvtms1.i, i32 0
65   ret i32 %0
66 }
67
68 declare <1 x i32> @llvm.aarch64.neon.fcvtms.v1i32.f32(float)
69
70 define i64 @test_vcvtmd_s64_f64(double %a) {
71 ; CHECK: test_vcvtmd_s64_f64
72 ; CHECK: fcvtms {{d[0-9]}}, {{d[0-9]}}
73 entry:
74   %vcvtms1.i = call <1 x i64> @llvm.aarch64.neon.fcvtms.v1i64.f64(double %a)
75   %0 = extractelement <1 x i64> %vcvtms1.i, i32 0
76   ret i64 %0
77 }
78
79 declare <1 x i64> @llvm.aarch64.neon.fcvtms.v1i64.f64(double)
80
81 define i32 @test_vcvtmus(float %a) {
82 ; CHECK: test_vcvtmus
83 ; CHECK: fcvtmu {{s[0-9]}}, {{s[0-9]}}
84 entry:
85   %vcvtmu1.i = call <1 x i32> @llvm.aarch64.neon.fcvtmu.v1i32.f32(float %a)
86   %0 = extractelement <1 x i32> %vcvtmu1.i, i32 0
87   ret i32 %0
88 }
89
90 declare <1 x i32> @llvm.aarch64.neon.fcvtmu.v1i32.f32(float)
91
92 define i64 @test_vcvtmud(double %a) {
93 ; CHECK: test_vcvtmud
94 ; CHECK: fcvtmu {{d[0-9]}}, {{d[0-9]}}
95 entry:
96   %vcvtmu1.i = call <1 x i64> @llvm.aarch64.neon.fcvtmu.v1i64.f64(double %a)
97   %0 = extractelement <1 x i64> %vcvtmu1.i, i32 0
98   ret i64 %0
99 }
100
101 declare <1 x i64> @llvm.aarch64.neon.fcvtmu.v1i64.f64(double)
102
103 define i32 @test_vcvtnss(float %a) {
104 ; CHECK: test_vcvtnss
105 ; CHECK: fcvtns {{s[0-9]}}, {{s[0-9]}}
106 entry:
107   %vcvtns1.i = call <1 x i32> @llvm.aarch64.neon.fcvtns.v1i32.f32(float %a)
108   %0 = extractelement <1 x i32> %vcvtns1.i, i32 0
109   ret i32 %0
110 }
111
112 declare <1 x i32> @llvm.aarch64.neon.fcvtns.v1i32.f32(float)
113
114 define i64 @test_vcvtnd_s64_f64(double %a) {
115 ; CHECK: test_vcvtnd_s64_f64
116 ; CHECK: fcvtns {{d[0-9]}}, {{d[0-9]}}
117 entry:
118   %vcvtns1.i = call <1 x i64> @llvm.aarch64.neon.fcvtns.v1i64.f64(double %a)
119   %0 = extractelement <1 x i64> %vcvtns1.i, i32 0
120   ret i64 %0
121 }
122
123 declare <1 x i64> @llvm.aarch64.neon.fcvtns.v1i64.f64(double)
124
125 define i32 @test_vcvtnus(float %a) {
126 ; CHECK: test_vcvtnus
127 ; CHECK: fcvtnu {{s[0-9]}}, {{s[0-9]}}
128 entry:
129   %vcvtnu1.i = call <1 x i32> @llvm.aarch64.neon.fcvtnu.v1i32.f32(float %a)
130   %0 = extractelement <1 x i32> %vcvtnu1.i, i32 0
131   ret i32 %0
132 }
133
134 declare <1 x i32> @llvm.aarch64.neon.fcvtnu.v1i32.f32(float)
135
136 define i64 @test_vcvtnud(double %a) {
137 ; CHECK: test_vcvtnud
138 ; CHECK: fcvtnu {{d[0-9]}}, {{d[0-9]}}
139 entry:
140   %vcvtnu1.i = call <1 x i64> @llvm.aarch64.neon.fcvtnu.v1i64.f64(double %a)
141   %0 = extractelement <1 x i64> %vcvtnu1.i, i32 0
142   ret i64 %0
143 }
144
145 declare <1 x i64> @llvm.aarch64.neon.fcvtnu.v1i64.f64(double)
146
147 define i32 @test_vcvtpss(float %a) {
148 ; CHECK: test_vcvtpss
149 ; CHECK: fcvtps {{s[0-9]}}, {{s[0-9]}}
150 entry:
151   %vcvtps1.i = call <1 x i32> @llvm.aarch64.neon.fcvtps.v1i32.f32(float %a)
152   %0 = extractelement <1 x i32> %vcvtps1.i, i32 0
153   ret i32 %0
154 }
155
156 declare <1 x i32> @llvm.aarch64.neon.fcvtps.v1i32.f32(float)
157
158 define i64 @test_vcvtpd_s64_f64(double %a) {
159 ; CHECK: test_vcvtpd_s64_f64
160 ; CHECK: fcvtps {{d[0-9]}}, {{d[0-9]}}
161 entry:
162   %vcvtps1.i = call <1 x i64> @llvm.aarch64.neon.fcvtps.v1i64.f64(double %a)
163   %0 = extractelement <1 x i64> %vcvtps1.i, i32 0
164   ret i64 %0
165 }
166
167 declare <1 x i64> @llvm.aarch64.neon.fcvtps.v1i64.f64(double)
168
169 define i32 @test_vcvtpus(float %a) {
170 ; CHECK: test_vcvtpus
171 ; CHECK: fcvtpu {{s[0-9]}}, {{s[0-9]}}
172 entry:
173   %vcvtpu1.i = call <1 x i32> @llvm.aarch64.neon.fcvtpu.v1i32.f32(float %a)
174   %0 = extractelement <1 x i32> %vcvtpu1.i, i32 0
175   ret i32 %0
176 }
177
178 declare <1 x i32> @llvm.aarch64.neon.fcvtpu.v1i32.f32(float)
179
180 define i64 @test_vcvtpud(double %a) {
181 ; CHECK: test_vcvtpud
182 ; CHECK: fcvtpu {{d[0-9]}}, {{d[0-9]}}
183 entry:
184   %vcvtpu1.i = call <1 x i64> @llvm.aarch64.neon.fcvtpu.v1i64.f64(double %a)
185   %0 = extractelement <1 x i64> %vcvtpu1.i, i32 0
186   ret i64 %0
187 }
188
189 declare <1 x i64> @llvm.aarch64.neon.fcvtpu.v1i64.f64(double)
190
191 define i32 @test_vcvtss(float %a) {
192 ; CHECK: test_vcvtss
193 ; CHECK: fcvtzs {{s[0-9]}}, {{s[0-9]}}
194 entry:
195   %vcvtzs1.i = call <1 x i32> @llvm.aarch64.neon.fcvtzs.v1i32.f32(float %a)
196   %0 = extractelement <1 x i32> %vcvtzs1.i, i32 0
197   ret i32 %0
198 }
199
200 declare <1 x i32> @llvm.aarch64.neon.fcvtzs.v1i32.f32(float)
201
202 define i64 @test_vcvtd_s64_f64(double %a) {
203 ; CHECK: test_vcvtd_s64_f64
204 ; CHECK: fcvtzs {{d[0-9]}}, {{d[0-9]}}
205 entry:
206   %vcvzs1.i = call <1 x i64> @llvm.aarch64.neon.fcvtzs.v1i64.f64(double %a)
207   %0 = extractelement <1 x i64> %vcvzs1.i, i32 0
208   ret i64 %0
209 }
210
211 declare <1 x i64> @llvm.aarch64.neon.fcvtzs.v1i64.f64(double)
212
213 define i32 @test_vcvtus(float %a) {
214 ; CHECK: test_vcvtus
215 ; CHECK: fcvtzu {{s[0-9]}}, {{s[0-9]}}
216 entry:
217   %vcvtzu1.i = call <1 x i32> @llvm.aarch64.neon.fcvtzu.v1i32.f32(float %a)
218   %0 = extractelement <1 x i32> %vcvtzu1.i, i32 0
219   ret i32 %0
220 }
221
222 declare <1 x i32> @llvm.aarch64.neon.fcvtzu.v1i32.f32(float)
223
224 define i64 @test_vcvtud(double %a) {
225 ; CHECK: test_vcvtud
226 ; CHECK: fcvtzu {{d[0-9]}}, {{d[0-9]}}
227 entry:
228   %vcvtzu1.i = call <1 x i64> @llvm.aarch64.neon.fcvtzu.v1i64.f64(double %a)
229   %0 = extractelement <1 x i64> %vcvtzu1.i, i32 0
230   ret i64 %0
231 }
232
233 declare <1 x i64> @llvm.aarch64.neon.fcvtzu.v1i64.f64(double)