[AArch64] Add support for NEON scalar floating-point to integer convert
[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.i = insertelement <1 x double> undef, double %a, i32 0
10   %vcvtf1.i = tail call <1 x float> @llvm.aarch64.neon.fcvtxn.v1f32.v1f64(<1 x double> %vcvtf.i)
11   %0 = extractelement <1 x float> %vcvtf1.i, i32 0
12   ret float %0
13 }
14
15 declare <1 x float> @llvm.aarch64.neon.fcvtxn.v1f32.v1f64(<1 x double>)
16
17 define i32 @test_vcvtass(float %a) {
18 ; CHECK: test_vcvtass
19 ; CHECK: fcvtas {{s[0-9]}}, {{s[0-9]}}
20 entry:
21   %vcvtas.i = insertelement <1 x float> undef, float %a, i32 0
22   %vcvtas1.i = tail call <1 x i32> @llvm.aarch64.neon.fcvtas.v1i32.v1f32(<1 x float> %vcvtas.i)
23   %0 = extractelement <1 x i32> %vcvtas1.i, i32 0
24   ret i32 %0
25 }
26
27 declare <1 x i32> @llvm.aarch64.neon.fcvtas.v1i32.v1f32(<1 x float>)
28
29 define i64 @test_test_vcvtasd(double %a) {
30 ; CHECK: test_test_vcvtasd
31 ; CHECK: fcvtas {{d[0-9]}}, {{d[0-9]}}
32 entry:
33   %vcvtas.i = insertelement <1 x double> undef, double %a, i32 0
34   %vcvtas1.i = tail call <1 x i64> @llvm.aarch64.neon.fcvtas.v1i64.v1f64(<1 x double> %vcvtas.i)
35   %0 = extractelement <1 x i64> %vcvtas1.i, i32 0
36   ret i64 %0
37 }
38
39 declare <1 x i64> @llvm.aarch64.neon.fcvtas.v1i64.v1f64(<1 x double>)
40
41 define i32 @test_vcvtaus(float %a) {
42 ; CHECK: test_vcvtaus
43 ; CHECK: fcvtau {{s[0-9]}}, {{s[0-9]}}
44 entry:
45   %vcvtau.i = insertelement <1 x float> undef, float %a, i32 0
46   %vcvtau1.i = tail call <1 x i32> @llvm.aarch64.neon.fcvtau.v1i32.v1f32(<1 x float> %vcvtau.i)
47   %0 = extractelement <1 x i32> %vcvtau1.i, i32 0
48   ret i32 %0
49 }
50
51 declare <1 x i32> @llvm.aarch64.neon.fcvtau.v1i32.v1f32(<1 x float>)
52
53 define i64 @test_vcvtaud(double %a) {
54 ; CHECK: test_vcvtaud
55 ; CHECK: fcvtau {{d[0-9]}}, {{d[0-9]}}
56 entry:
57   %vcvtau.i = insertelement <1 x double> undef, double %a, i32 0
58   %vcvtau1.i = tail call <1 x i64> @llvm.aarch64.neon.fcvtau.v1i64.v1f64(<1 x double> %vcvtau.i)
59   %0 = extractelement <1 x i64> %vcvtau1.i, i32 0
60   ret i64 %0
61 }
62
63 declare <1 x i64> @llvm.aarch64.neon.fcvtau.v1i64.v1f64(<1 x double>) 
64
65 define i32 @test_vcvtmss(float %a) {
66 ; CHECK: test_vcvtmss
67 ; CHECK: fcvtms {{s[0-9]}}, {{s[0-9]}}
68 entry:
69   %vcvtms.i = insertelement <1 x float> undef, float %a, i32 0
70   %vcvtms1.i = tail call <1 x i32> @llvm.aarch64.neon.fcvtms.v1i32.v1f32(<1 x float> %vcvtms.i)
71   %0 = extractelement <1 x i32> %vcvtms1.i, i32 0
72   ret i32 %0
73 }
74
75 declare <1 x i32> @llvm.aarch64.neon.fcvtms.v1i32.v1f32(<1 x float>)
76
77 define i64 @test_vcvtmd_s64_f64(double %a) {
78 ; CHECK: test_vcvtmd_s64_f64
79 ; CHECK: fcvtms {{d[0-9]}}, {{d[0-9]}}
80 entry:
81   %vcvtms.i = insertelement <1 x double> undef, double %a, i32 0
82   %vcvtms1.i = tail call <1 x i64> @llvm.aarch64.neon.fcvtms.v1i64.v1f64(<1 x double> %vcvtms.i)
83   %0 = extractelement <1 x i64> %vcvtms1.i, i32 0
84   ret i64 %0
85 }
86
87 declare <1 x i64> @llvm.aarch64.neon.fcvtms.v1i64.v1f64(<1 x double>)
88
89 define i32 @test_vcvtmus(float %a) {
90 ; CHECK: test_vcvtmus
91 ; CHECK: fcvtmu {{s[0-9]}}, {{s[0-9]}}
92 entry:
93   %vcvtmu.i = insertelement <1 x float> undef, float %a, i32 0
94   %vcvtmu1.i = tail call <1 x i32> @llvm.aarch64.neon.fcvtmu.v1i32.v1f32(<1 x float> %vcvtmu.i)
95   %0 = extractelement <1 x i32> %vcvtmu1.i, i32 0
96   ret i32 %0
97 }
98
99 declare <1 x i32> @llvm.aarch64.neon.fcvtmu.v1i32.v1f32(<1 x float>)
100
101 define i64 @test_vcvtmud(double %a) {
102 ; CHECK: test_vcvtmud
103 ; CHECK: fcvtmu {{d[0-9]}}, {{d[0-9]}}
104 entry:
105   %vcvtmu.i = insertelement <1 x double> undef, double %a, i32 0
106   %vcvtmu1.i = tail call <1 x i64> @llvm.aarch64.neon.fcvtmu.v1i64.v1f64(<1 x double> %vcvtmu.i)
107   %0 = extractelement <1 x i64> %vcvtmu1.i, i32 0
108   ret i64 %0
109 }
110
111 declare <1 x i64> @llvm.aarch64.neon.fcvtmu.v1i64.v1f64(<1 x double>)
112
113 define i32 @test_vcvtnss(float %a) {
114 ; CHECK: test_vcvtnss
115 ; CHECK: fcvtns {{s[0-9]}}, {{s[0-9]}}
116 entry:
117   %vcvtns.i = insertelement <1 x float> undef, float %a, i32 0
118   %vcvtns1.i = tail call <1 x i32> @llvm.aarch64.neon.fcvtns.v1i32.v1f32(<1 x float> %vcvtns.i)
119   %0 = extractelement <1 x i32> %vcvtns1.i, i32 0
120   ret i32 %0
121 }
122
123 declare <1 x i32> @llvm.aarch64.neon.fcvtns.v1i32.v1f32(<1 x float>)
124
125 define i64 @test_vcvtnd_s64_f64(double %a) {
126 ; CHECK: test_vcvtnd_s64_f64
127 ; CHECK: fcvtns {{d[0-9]}}, {{d[0-9]}}
128 entry:
129   %vcvtns.i = insertelement <1 x double> undef, double %a, i32 0
130   %vcvtns1.i = tail call <1 x i64> @llvm.aarch64.neon.fcvtns.v1i64.v1f64(<1 x double> %vcvtns.i)
131   %0 = extractelement <1 x i64> %vcvtns1.i, i32 0
132   ret i64 %0
133 }
134
135 declare <1 x i64> @llvm.aarch64.neon.fcvtns.v1i64.v1f64(<1 x double>)
136
137 define i32 @test_vcvtnus(float %a) {
138 ; CHECK: test_vcvtnus
139 ; CHECK: fcvtnu {{s[0-9]}}, {{s[0-9]}}
140 entry:
141   %vcvtnu.i = insertelement <1 x float> undef, float %a, i32 0
142   %vcvtnu1.i = tail call <1 x i32> @llvm.aarch64.neon.fcvtnu.v1i32.v1f32(<1 x float> %vcvtnu.i)
143   %0 = extractelement <1 x i32> %vcvtnu1.i, i32 0
144   ret i32 %0
145 }
146
147 declare <1 x i32> @llvm.aarch64.neon.fcvtnu.v1i32.v1f32(<1 x float>)
148
149 define i64 @test_vcvtnud(double %a) {
150 ; CHECK: test_vcvtnud
151 ; CHECK: fcvtnu {{d[0-9]}}, {{d[0-9]}}
152 entry:
153   %vcvtnu.i = insertelement <1 x double> undef, double %a, i32 0
154   %vcvtnu1.i = tail call <1 x i64> @llvm.aarch64.neon.fcvtnu.v1i64.v1f64(<1 x double> %vcvtnu.i)
155   %0 = extractelement <1 x i64> %vcvtnu1.i, i32 0
156   ret i64 %0
157 }
158
159 declare <1 x i64> @llvm.aarch64.neon.fcvtnu.v1i64.v1f64(<1 x double>)
160
161 define i32 @test_vcvtpss(float %a) {
162 ; CHECK: test_vcvtpss
163 ; CHECK: fcvtps {{s[0-9]}}, {{s[0-9]}}
164 entry:
165   %vcvtps.i = insertelement <1 x float> undef, float %a, i32 0
166   %vcvtps1.i = tail call <1 x i32> @llvm.aarch64.neon.fcvtps.v1i32.v1f32(<1 x float> %vcvtps.i)
167   %0 = extractelement <1 x i32> %vcvtps1.i, i32 0
168   ret i32 %0
169 }
170
171 declare <1 x i32> @llvm.aarch64.neon.fcvtps.v1i32.v1f32(<1 x float>)
172
173 define i64 @test_vcvtpd_s64_f64(double %a) {
174 ; CHECK: test_vcvtpd_s64_f64
175 ; CHECK: fcvtps {{d[0-9]}}, {{d[0-9]}}
176 entry:
177   %vcvtps.i = insertelement <1 x double> undef, double %a, i32 0
178   %vcvtps1.i = tail call <1 x i64> @llvm.aarch64.neon.fcvtps.v1i64.v1f64(<1 x double> %vcvtps.i)
179   %0 = extractelement <1 x i64> %vcvtps1.i, i32 0
180   ret i64 %0
181 }
182
183 declare <1 x i64> @llvm.aarch64.neon.fcvtps.v1i64.v1f64(<1 x double>)
184
185 define i32 @test_vcvtpus(float %a) {
186 ; CHECK: test_vcvtpus
187 ; CHECK: fcvtpu {{s[0-9]}}, {{s[0-9]}}
188 entry:
189   %vcvtpu.i = insertelement <1 x float> undef, float %a, i32 0
190   %vcvtpu1.i = tail call <1 x i32> @llvm.aarch64.neon.fcvtpu.v1i32.v1f32(<1 x float> %vcvtpu.i)
191   %0 = extractelement <1 x i32> %vcvtpu1.i, i32 0
192   ret i32 %0
193 }
194
195 declare <1 x i32> @llvm.aarch64.neon.fcvtpu.v1i32.v1f32(<1 x float>)
196
197 define i64 @test_vcvtpud(double %a) {
198 ; CHECK: test_vcvtpud
199 ; CHECK: fcvtpu {{d[0-9]}}, {{d[0-9]}}
200 entry:
201   %vcvtpu.i = insertelement <1 x double> undef, double %a, i32 0
202   %vcvtpu1.i = tail call <1 x i64> @llvm.aarch64.neon.fcvtpu.v1i64.v1f64(<1 x double> %vcvtpu.i)
203   %0 = extractelement <1 x i64> %vcvtpu1.i, i32 0
204   ret i64 %0
205 }
206
207 declare <1 x i64> @llvm.aarch64.neon.fcvtpu.v1i64.v1f64(<1 x double>)
208
209 define i32 @test_vcvtss(float %a) {
210 ; CHECK: test_vcvtss
211 ; CHECK: fcvtzs {{s[0-9]}}, {{s[0-9]}}
212 entry:
213   %vcvtzs.i = insertelement <1 x float> undef, float %a, i32 0
214   %vcvtzs1.i = tail call <1 x i32> @llvm.aarch64.neon.fcvtzs.v1i32.v1f32(<1 x float> %vcvtzs.i)
215   %0 = extractelement <1 x i32> %vcvtzs1.i, i32 0
216   ret i32 %0
217 }
218
219 declare <1 x i32> @llvm.aarch64.neon.fcvtzs.v1i32.v1f32(<1 x float>)
220
221 define i64 @test_vcvtd_s64_f64(double %a) {
222 ; CHECK: test_vcvtd_s64_f64
223 ; CHECK: fcvtzs {{d[0-9]}}, {{d[0-9]}}
224 entry:
225   %vcvzs.i = insertelement <1 x double> undef, double %a, i32 0
226   %vcvzs1.i = tail call <1 x i64> @llvm.aarch64.neon.fcvtzs.v1i64.v1f64(<1 x double> %vcvzs.i)
227   %0 = extractelement <1 x i64> %vcvzs1.i, i32 0
228   ret i64 %0
229 }
230
231 declare <1 x i64> @llvm.aarch64.neon.fcvtzs.v1i64.v1f64(<1 x double>)
232
233 define i32 @test_vcvtus(float %a) {
234 ; CHECK: test_vcvtus
235 ; CHECK: fcvtzu {{s[0-9]}}, {{s[0-9]}}
236 entry:
237   %vcvtzu.i = insertelement <1 x float> undef, float %a, i32 0
238   %vcvtzu1.i = tail call <1 x i32> @llvm.aarch64.neon.fcvtzu.v1i32.v1f32(<1 x float> %vcvtzu.i)
239   %0 = extractelement <1 x i32> %vcvtzu1.i, i32 0
240   ret i32 %0
241 }
242
243 declare <1 x i32> @llvm.aarch64.neon.fcvtzu.v1i32.v1f32(<1 x float>)
244
245 define i64 @test_vcvtud(double %a) {
246 ; CHECK: test_vcvtud
247 ; CHECK: fcvtzu {{d[0-9]}}, {{d[0-9]}}
248 entry:
249   %vcvtzu.i = insertelement <1 x double> undef, double %a, i32 0
250   %vcvtzu1.i = tail call <1 x i64> @llvm.aarch64.neon.fcvtzu.v1i64.v1f64(<1 x double> %vcvtzu.i)
251   %0 = extractelement <1 x i64> %vcvtzu1.i, i32 0
252   ret i64 %0
253 }
254
255 declare <1 x i64> @llvm.aarch64.neon.fcvtzu.v1i64.v1f64(<1 x double>)