1 ; NOTE
: Assertions have been autogenerated by utils
/update_llc_test_checks.py
2 ; RUN
: llc
-asm-verbose
=false
-mattr
=-vfp2
-mtriple
=arm-eabi
< %s | FileCheck
%s
-check-prefix
=CHECK-SOFT
3 ; RUN
: llc
-asm-verbose
=false
-mattr
=-vfp2
-mtriple
=arm-eabi
-meabi
=gnu
< %s | FileCheck
%s
-check-prefix
=CHECK-SOFT
4 ; RUN
: llc
-asm-verbose
=false
-mattr
=+vfp3
-mtriple
=arm-eabi
< %s | FileCheck
%s
-check-prefix
=CHECK-SOFTFP
5 ; RUN
: llc
-asm-verbose
=false
-mattr
=+vfp3
-meabi
=gnu
-mtriple
=arm-eabi
< %s | FileCheck
%s
-check-prefix
=CHECK-SOFTFP
6 ; RUN
: llc
-asm-verbose
=false
-mattr
=+vfp3
-float-abi
=hard
-mtriple
=arm-eabi
< %s | FileCheck
%s
-check-prefix
=CHECK-HARDFP-SP
-check-prefix
=CHECK-HARDFP-DP
7 ; RUN
: llc
-asm-verbose
=false
-mattr
=+vfp3
-float-abi
=hard
-meabi
=gnu
-mtriple
=arm-eabi
< %s | FileCheck
%s
-check-prefix
=CHECK-HARDFP-SP
-check-prefix
=CHECK-HARDFP-DP
8 ; RUN
: llc
-asm-verbose
=false
-mattr
=+vfp3
,-fp64
-float-abi
=hard
-mtriple
=arm-eabi
< %s | FileCheck
%s
-check-prefix
=CHECK-HARDFP-SP
-check-prefix
=CHECK-HARDFP-SPONLY
9 ; RUN
: llc
-asm-verbose
=false
-mattr
=+vfp3
,-fp64
-float-abi
=hard
-mtriple
=arm-eabi
-meabi
=gnu
< %s | FileCheck
%s
-check-prefix
=CHECK-HARDFP-SP
-check-prefix
=CHECK-HARDFP-SPONLY
11 ; The Runtime ABI for the ARM Architecture IHI0043 section
4.1.2 The
12 ; floating-point helper functions to always use the base AAPCS
(soft-float
)
15 ; In this test we cover the following configurations
:
16 ; CHECK-SOFT
-mfloat-abi
=soft
17 ;
* expect no use of floating point instructions
18 ;
* expect to use __aeabi_ helper function in each function
19 ; CHECK-SOFTFP
-mfloat-abi
=softfp
20 ;
* all functions use base AAPCS
21 ;
* floating point instructions permitted
, so __aeabi_ helpers only
22 ; expected when there is no available instruction.
23 ; CHECK-HARDFP-SP
-mfloat-abi
=hardfp
(single precision instructions
)
24 ;
* all non Runtime ABI helper functions use AAPCS VFP
25 ;
* floating point instructions permitted
, so __aeabi_ helpers only
26 ; expected when there is no available instruction.
27 ; CHECK-HARDFP-DP
-mfloat-abi
=hardfp
(double precision instructions
)
28 ; CHECK-HARDFP-SPONLY
-mfloat-abi
=hardfp
(double precision but single
30 ;
* as CHECK-HARDFP-SP
, but we split up the double precision helper
31 ; functions so we can test
a single precision only FPU
, which has to use
32 ; helper function for all double precision operations.
34 ; In all cases we must use base AAPCS when calling
a helper function from
37 target datalayout
= "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
38 target triple
= "arm-eabi"
40 define float @
fadd(float
%a, float
%b) #0 {
41 ; CHECK-SOFT-LABEL
: fadd:
42 ; CHECK-SOFT
: .save {r11, lr}
43 ; CHECK-SOFT-NEXT
: push
{r11, lr}
44 ; CHECK-SOFT-NEXT
: bl __aeabi_fadd
45 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
46 ; CHECK-SOFT-NEXT
: mov pc
, lr
48 ; CHECK-SOFTFP-LABEL
: fadd:
49 ; CHECK-SOFTFP
: vmov s0
, r1
50 ; CHECK-SOFTFP-NEXT
: vmov s2
, r0
51 ; CHECK-SOFTFP-NEXT
: vadd.f32 s0
, s2
, s0
52 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
53 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
55 ; CHECK-HARDFP-SP-LABEL
: fadd:
56 ; CHECK-HARDFP-SP
: vadd.f32 s0
, s0
, s1
57 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
59 %add = fadd float
%a, %b
63 define float @
fdiv(float
%a, float
%b) #0 {
64 ; CHECK-SOFT-LABEL
: fdiv:
65 ; CHECK-SOFT
: .save {r11, lr}
66 ; CHECK-SOFT-NEXT
: push
{r11, lr}
67 ; CHECK-SOFT-NEXT
: bl __aeabi_fdiv
68 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
69 ; CHECK-SOFT-NEXT
: mov pc
, lr
71 ; CHECK-SOFTFP-LABEL
: fdiv:
72 ; CHECK-SOFTFP
: vmov s0
, r1
73 ; CHECK-SOFTFP-NEXT
: vmov s2
, r0
74 ; CHECK-SOFTFP-NEXT
: vdiv.f32 s0
, s2
, s0
75 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
76 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
78 ; CHECK-HARDFP-SP-LABEL
: fdiv:
79 ; CHECK-HARDFP-SP
: vdiv.f32 s0
, s0
, s1
80 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
82 %div = fdiv float
%a, %b
86 define float @
fmul(float
%a, float
%b) #0 {
87 ; CHECK-SOFT-LABEL
: fmul:
88 ; CHECK-SOFT
: .save {r11, lr}
89 ; CHECK-SOFT-NEXT
: push
{r11, lr}
90 ; CHECK-SOFT-NEXT
: bl __aeabi_fmul
91 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
92 ; CHECK-SOFT-NEXT
: mov pc
, lr
94 ; CHECK-SOFTFP-LABEL
: fmul:
95 ; CHECK-SOFTFP
: vmov s0
, r1
96 ; CHECK-SOFTFP-NEXT
: vmov s2
, r0
97 ; CHECK-SOFTFP-NEXT
: vmul.f32 s0
, s2
, s0
98 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
99 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
101 ; CHECK-HARDFP-SP-LABEL
: fmul:
102 ; CHECK-HARDFP-SP
: vmul.f32 s0
, s0
, s1
103 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
105 %mul = fmul float
%a, %b
109 define float @
fsub(float
%a, float
%b) #0 {
110 ; CHECK-SOFT-LABEL
: fsub:
111 ; CHECK-SOFT
: .save {r11, lr}
112 ; CHECK-SOFT-NEXT
: push
{r11, lr}
113 ; CHECK-SOFT-NEXT
: bl __aeabi_fsub
114 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
115 ; CHECK-SOFT-NEXT
: mov pc
, lr
117 ; CHECK-SOFTFP-LABEL
: fsub:
118 ; CHECK-SOFTFP
: vmov s0
, r1
119 ; CHECK-SOFTFP-NEXT
: vmov s2
, r0
120 ; CHECK-SOFTFP-NEXT
: vsub.f32 s0
, s2
, s0
121 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
122 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
124 ; CHECK-HARDFP-SP-LABEL
: fsub:
125 ; CHECK-HARDFP-SP
: vsub.f32 s0
, s0
, s1
126 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
128 %sub = fsub float
%a, %b
132 define i32 @fcmpeq
(float
%a, float
%b) #0 {
133 ; CHECK-SOFT-LABEL
: fcmpeq
:
134 ; CHECK-SOFT
: .save {r11, lr}
135 ; CHECK-SOFT-NEXT
: push
{r11, lr}
136 ; CHECK-SOFT-NEXT
: bl __aeabi_fcmpeq
137 ; CHECK-SOFT-NEXT
: cmp r0, #0
138 ; CHECK-SOFT-NEXT
: movne
r0, #1
139 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
140 ; CHECK-SOFT-NEXT
: mov pc
, lr
142 ; CHECK-SOFTFP-LABEL
: fcmpeq
:
143 ; CHECK-SOFTFP
: vmov s2
, r0
144 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
145 ; CHECK-SOFTFP-NEXT
: vmov s0
, r1
146 ; CHECK-SOFTFP-NEXT
: vcmp.f32 s2
, s0
147 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
148 ; CHECK-SOFTFP-NEXT
: moveq
r0, #1
149 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
151 ; CHECK-HARDFP-SP-LABEL
: fcmpeq
:
152 ; CHECK-HARDFP-SP
: vcmp.f32 s0
, s1
153 ; CHECK-HARDFP-SP-NEXT
: mov
r0, #0
154 ; CHECK-HARDFP-SP-NEXT
: vmrs APSR_nzcv
, fpscr
155 ; CHECK-HARDFP-SP-NEXT
: moveq
r0, #1
156 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
158 %cmp = fcmp oeq float
%a, %b
159 %conv
= zext i1
%cmp to i32
163 define i32 @fcmplt
(float
%a, float
%b) #0 {
164 ; CHECK-SOFT-LABEL
: fcmplt
:
165 ; CHECK-SOFT
: .save {r11, lr}
166 ; CHECK-SOFT-NEXT
: push
{r11, lr}
167 ; CHECK-SOFT-NEXT
: bl __aeabi_fcmplt
168 ; CHECK-SOFT-NEXT
: cmp r0, #0
169 ; CHECK-SOFT-NEXT
: movne
r0, #1
170 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
171 ; CHECK-SOFT-NEXT
: mov pc
, lr
173 ; CHECK-SOFTFP-LABEL
: fcmplt
:
174 ; CHECK-SOFTFP
: vmov s2
, r0
175 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
176 ; CHECK-SOFTFP-NEXT
: vmov s0
, r1
177 ; CHECK-SOFTFP-NEXT
: vcmpe.f32 s2
, s0
178 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
179 ; CHECK-SOFTFP-NEXT
: movmi
r0, #1
180 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
182 ; CHECK-HARDFP-SP-LABEL
: fcmplt
:
183 ; CHECK-HARDFP-SP
: vcmpe.f32 s0
, s1
184 ; CHECK-HARDFP-SP-NEXT
: mov
r0, #0
185 ; CHECK-HARDFP-SP-NEXT
: vmrs APSR_nzcv
, fpscr
186 ; CHECK-HARDFP-SP-NEXT
: movmi
r0, #1
187 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
189 %cmp = fcmp olt float
%a, %b
190 %conv
= zext i1
%cmp to i32
194 define i32 @fcmple
(float
%a, float
%b) #0 {
195 ; CHECK-SOFT-LABEL
: fcmple
:
196 ; CHECK-SOFT
: .save {r11, lr}
197 ; CHECK-SOFT-NEXT
: push
{r11, lr}
198 ; CHECK-SOFT-NEXT
: bl __aeabi_fcmple
199 ; CHECK-SOFT-NEXT
: cmp r0, #0
200 ; CHECK-SOFT-NEXT
: movne
r0, #1
201 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
202 ; CHECK-SOFT-NEXT
: mov pc
, lr
204 ; CHECK-SOFTFP-LABEL
: fcmple
:
205 ; CHECK-SOFTFP
: vmov s2
, r0
206 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
207 ; CHECK-SOFTFP-NEXT
: vmov s0
, r1
208 ; CHECK-SOFTFP-NEXT
: vcmpe.f32 s2
, s0
209 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
210 ; CHECK-SOFTFP-NEXT
: movls
r0, #1
211 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
213 ; CHECK-HARDFP-SP-LABEL
: fcmple
:
214 ; CHECK-HARDFP-SP
: vcmpe.f32 s0
, s1
215 ; CHECK-HARDFP-SP-NEXT
: mov
r0, #0
216 ; CHECK-HARDFP-SP-NEXT
: vmrs APSR_nzcv
, fpscr
217 ; CHECK-HARDFP-SP-NEXT
: movls
r0, #1
218 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
220 %cmp = fcmp ole float
%a, %b
221 %conv
= zext i1
%cmp to i32
225 define i32 @fcmpge
(float
%a, float
%b) #0 {
226 ; CHECK-SOFT-LABEL
: fcmpge
:
227 ; CHECK-SOFT
: .save {r11, lr}
228 ; CHECK-SOFT-NEXT
: push
{r11, lr}
229 ; CHECK-SOFT-NEXT
: bl __aeabi_fcmpge
230 ; CHECK-SOFT-NEXT
: cmp r0, #0
231 ; CHECK-SOFT-NEXT
: movne
r0, #1
232 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
233 ; CHECK-SOFT-NEXT
: mov pc
, lr
235 ; CHECK-SOFTFP-LABEL
: fcmpge
:
236 ; CHECK-SOFTFP
: vmov s2
, r0
237 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
238 ; CHECK-SOFTFP-NEXT
: vmov s0
, r1
239 ; CHECK-SOFTFP-NEXT
: vcmpe.f32 s2
, s0
240 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
241 ; CHECK-SOFTFP-NEXT
: movge
r0, #1
242 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
244 ; CHECK-HARDFP-SP-LABEL
: fcmpge
:
245 ; CHECK-HARDFP-SP
: vcmpe.f32 s0
, s1
246 ; CHECK-HARDFP-SP-NEXT
: mov
r0, #0
247 ; CHECK-HARDFP-SP-NEXT
: vmrs APSR_nzcv
, fpscr
248 ; CHECK-HARDFP-SP-NEXT
: movge
r0, #1
249 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
251 %cmp = fcmp oge float
%a, %b
252 %conv
= zext i1
%cmp to i32
256 define i32 @fcmpgt
(float
%a, float
%b) #0 {
257 ; CHECK-SOFT-LABEL
: fcmpgt
:
258 ; CHECK-SOFT
: .save {r11, lr}
259 ; CHECK-SOFT-NEXT
: push
{r11, lr}
260 ; CHECK-SOFT-NEXT
: bl __aeabi_fcmpgt
261 ; CHECK-SOFT-NEXT
: cmp r0, #0
262 ; CHECK-SOFT-NEXT
: movne
r0, #1
263 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
264 ; CHECK-SOFT-NEXT
: mov pc
, lr
266 ; CHECK-SOFTFP-LABEL
: fcmpgt
:
267 ; CHECK-SOFTFP
: vmov s2
, r0
268 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
269 ; CHECK-SOFTFP-NEXT
: vmov s0
, r1
270 ; CHECK-SOFTFP-NEXT
: vcmpe.f32 s2
, s0
271 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
272 ; CHECK-SOFTFP-NEXT
: movgt
r0, #1
273 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
275 ; CHECK-HARDFP-SP-LABEL
: fcmpgt
:
276 ; CHECK-HARDFP-SP
: vcmpe.f32 s0
, s1
277 ; CHECK-HARDFP-SP-NEXT
: mov
r0, #0
278 ; CHECK-HARDFP-SP-NEXT
: vmrs APSR_nzcv
, fpscr
279 ; CHECK-HARDFP-SP-NEXT
: movgt
r0, #1
280 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
282 %cmp = fcmp ogt float
%a, %b
283 %conv
= zext i1
%cmp to i32
287 define i32 @fcmpun
(float
%a, float
%b) #0 {
288 ; CHECK-SOFT-LABEL
: fcmpun
:
289 ; CHECK-SOFT
: .save {r11, lr}
290 ; CHECK-SOFT-NEXT
: push
{r11, lr}
291 ; CHECK-SOFT-NEXT
: bl __aeabi_fcmpun
292 ; CHECK-SOFT-NEXT
: cmp r0, #0
293 ; CHECK-SOFT-NEXT
: movne
r0, #1
294 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
295 ; CHECK-SOFT-NEXT
: mov pc
, lr
297 ; CHECK-SOFTFP-LABEL
: fcmpun
:
298 ; CHECK-SOFTFP
: vmov s2
, r0
299 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
300 ; CHECK-SOFTFP-NEXT
: vmov s0
, r1
301 ; CHECK-SOFTFP-NEXT
: vcmpe.f32 s2
, s0
302 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
303 ; CHECK-SOFTFP-NEXT
: movvs
r0, #1
304 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
306 ; CHECK-HARDFP-SP-LABEL
: fcmpun
:
307 ; CHECK-HARDFP-SP
: vcmpe.f32 s0
, s1
308 ; CHECK-HARDFP-SP-NEXT
: mov
r0, #0
309 ; CHECK-HARDFP-SP-NEXT
: vmrs APSR_nzcv
, fpscr
310 ; CHECK-HARDFP-SP-NEXT
: movvs
r0, #1
311 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
313 %cmp = fcmp uno float
%a, %b
314 %0 = zext i1
%cmp to i32
318 define double @dadd
(double
%a, double
%b) #0 {
319 ; CHECK-SOFT-LABEL
: dadd
:
320 ; CHECK-SOFT
: .save {r11, lr}
321 ; CHECK-SOFT-NEXT
: push
{r11, lr}
322 ; CHECK-SOFT-NEXT
: bl __aeabi_dadd
323 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
324 ; CHECK-SOFT-NEXT
: mov pc
, lr
326 ; CHECK-SOFTFP-LABEL
: dadd
:
327 ; CHECK-SOFTFP
: vmov d16
, r2, r3
328 ; CHECK-SOFTFP-NEXT
: vmov d17
, r0, r1
329 ; CHECK-SOFTFP-NEXT
: vadd.f64 d16
, d17
, d16
330 ; CHECK-SOFTFP-NEXT
: vmov
r0, r1, d16
331 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
333 ; CHECK-HARDFP-DP-LABEL
: dadd
:
334 ; CHECK-HARDFP-DP
: vadd.f64 d0
, d0
, d1
335 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
337 ; CHECK-HARDFP-SPONLY-LABEL
: dadd
:
338 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
339 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
340 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
341 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r2, r3, d1
342 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_dadd
343 ; CHECK-HARDFP-SPONLY-NEXT
: vmov d0
, r0, r1
344 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
345 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
347 %add = fadd double
%a, %b
351 define double @ddiv
(double
%a, double
%b) #0 {
352 ; CHECK-SOFT-LABEL
: ddiv
:
353 ; CHECK-SOFT
: .save {r11, lr}
354 ; CHECK-SOFT-NEXT
: push
{r11, lr}
355 ; CHECK-SOFT-NEXT
: bl __aeabi_ddiv
356 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
357 ; CHECK-SOFT-NEXT
: mov pc
, lr
359 ; CHECK-SOFTFP-LABEL
: ddiv
:
360 ; CHECK-SOFTFP
: vmov d16
, r2, r3
361 ; CHECK-SOFTFP-NEXT
: vmov d17
, r0, r1
362 ; CHECK-SOFTFP-NEXT
: vdiv.f64 d16
, d17
, d16
363 ; CHECK-SOFTFP-NEXT
: vmov
r0, r1, d16
364 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
366 ; CHECK-HARDFP-DP-LABEL
: ddiv
:
367 ; CHECK-HARDFP-DP
: vdiv.f64 d0
, d0
, d1
368 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
370 ; CHECK-HARDFP-SPONLY-LABEL
: ddiv
:
371 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
372 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
373 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
374 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r2, r3, d1
375 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_ddiv
376 ; CHECK-HARDFP-SPONLY-NEXT
: vmov d0
, r0, r1
377 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
378 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
380 %div = fdiv double
%a, %b
384 define double @dmul
(double
%a, double
%b) #0 {
385 ; CHECK-SOFT-LABEL
: dmul
:
386 ; CHECK-SOFT
: .save {r11, lr}
387 ; CHECK-SOFT-NEXT
: push
{r11, lr}
388 ; CHECK-SOFT-NEXT
: bl __aeabi_dmul
389 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
390 ; CHECK-SOFT-NEXT
: mov pc
, lr
392 ; CHECK-SOFTFP-LABEL
: dmul
:
393 ; CHECK-SOFTFP
: vmov d16
, r2, r3
394 ; CHECK-SOFTFP-NEXT
: vmov d17
, r0, r1
395 ; CHECK-SOFTFP-NEXT
: vmul.f64 d16
, d17
, d16
396 ; CHECK-SOFTFP-NEXT
: vmov
r0, r1, d16
397 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
399 ; CHECK-HARDFP-DP-LABEL
: dmul
:
400 ; CHECK-HARDFP-DP
: vmul.f64 d0
, d0
, d1
401 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
403 ; CHECK-HARDFP-SPONLY-LABEL
: dmul
:
404 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
405 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
406 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
407 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r2, r3, d1
408 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_dmul
409 ; CHECK-HARDFP-SPONLY-NEXT
: vmov d0
, r0, r1
410 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
411 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
413 %mul = fmul double
%a, %b
417 define double @dsub
(double
%a, double
%b) #0 {
418 ; CHECK-SOFT-LABEL
: dsub
:
419 ; CHECK-SOFT
: .save {r11, lr}
420 ; CHECK-SOFT-NEXT
: push
{r11, lr}
421 ; CHECK-SOFT-NEXT
: bl __aeabi_dsub
422 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
423 ; CHECK-SOFT-NEXT
: mov pc
, lr
425 ; CHECK-SOFTFP-LABEL
: dsub
:
426 ; CHECK-SOFTFP
: vmov d16
, r2, r3
427 ; CHECK-SOFTFP-NEXT
: vmov d17
, r0, r1
428 ; CHECK-SOFTFP-NEXT
: vsub.f64 d16
, d17
, d16
429 ; CHECK-SOFTFP-NEXT
: vmov
r0, r1, d16
430 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
432 ; CHECK-HARDFP-DP-LABEL
: dsub
:
433 ; CHECK-HARDFP-DP
: vsub.f64 d0
, d0
, d1
434 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
436 ; CHECK-HARDFP-SPONLY-LABEL
: dsub
:
437 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
438 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
439 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
440 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r2, r3, d1
441 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_dsub
442 ; CHECK-HARDFP-SPONLY-NEXT
: vmov d0
, r0, r1
443 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
444 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
446 %sub = fsub double
%a, %b
450 define i32 @dcmpeq
(double
%a, double
%b) #0 {
451 ; CHECK-SOFT-LABEL
: dcmpeq
:
452 ; CHECK-SOFT
: .save {r11, lr}
453 ; CHECK-SOFT-NEXT
: push
{r11, lr}
454 ; CHECK-SOFT-NEXT
: bl __aeabi_dcmpeq
455 ; CHECK-SOFT-NEXT
: cmp r0, #0
456 ; CHECK-SOFT-NEXT
: movne
r0, #1
457 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
458 ; CHECK-SOFT-NEXT
: mov pc
, lr
460 ; CHECK-SOFTFP-LABEL
: dcmpeq
:
461 ; CHECK-SOFTFP
: vmov d16
, r2, r3
462 ; CHECK-SOFTFP-NEXT
: vmov d17
, r0, r1
463 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
464 ; CHECK-SOFTFP-NEXT
: vcmp.f64 d17
, d16
465 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
466 ; CHECK-SOFTFP-NEXT
: moveq
r0, #1
467 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
469 ; CHECK-HARDFP-DP-LABEL
: dcmpeq
:
470 ; CHECK-HARDFP-DP
: vcmp.f64 d0
, d1
471 ; CHECK-HARDFP-DP-NEXT
: mov
r0, #0
472 ; CHECK-HARDFP-DP-NEXT
: vmrs APSR_nzcv
, fpscr
473 ; CHECK-HARDFP-DP-NEXT
: moveq
r0, #1
474 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
476 ; CHECK-HARDFP-SPONLY-LABEL
: dcmpeq
:
477 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
478 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
479 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
480 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r2, r3, d1
481 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_dcmpeq
482 ; CHECK-HARDFP-SPONLY-NEXT
: cmp r0, #0
483 ; CHECK-HARDFP-SPONLY-NEXT
: movne
r0, #1
484 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
485 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
487 %cmp = fcmp oeq double
%a, %b
488 %conv
= zext i1
%cmp to i32
492 define i32 @dcmplt
(double
%a, double
%b) #0 {
493 ; CHECK-SOFT-LABEL
: dcmplt
:
494 ; CHECK-SOFT
: .save {r11, lr}
495 ; CHECK-SOFT-NEXT
: push
{r11, lr}
496 ; CHECK-SOFT-NEXT
: bl __aeabi_dcmplt
497 ; CHECK-SOFT-NEXT
: cmp r0, #0
498 ; CHECK-SOFT-NEXT
: movne
r0, #1
499 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
500 ; CHECK-SOFT-NEXT
: mov pc
, lr
502 ; CHECK-SOFTFP-LABEL
: dcmplt
:
503 ; CHECK-SOFTFP
: vmov d16
, r2, r3
504 ; CHECK-SOFTFP-NEXT
: vmov d17
, r0, r1
505 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
506 ; CHECK-SOFTFP-NEXT
: vcmpe.f64 d17
, d16
507 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
508 ; CHECK-SOFTFP-NEXT
: movmi
r0, #1
509 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
511 ; CHECK-HARDFP-DP-LABEL
: dcmplt
:
512 ; CHECK-HARDFP-DP
: vcmpe.f64 d0
, d1
513 ; CHECK-HARDFP-DP-NEXT
: mov
r0, #0
514 ; CHECK-HARDFP-DP-NEXT
: vmrs APSR_nzcv
, fpscr
515 ; CHECK-HARDFP-DP-NEXT
: movmi
r0, #1
516 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
518 ; CHECK-HARDFP-SPONLY-LABEL
: dcmplt
:
519 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
520 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
521 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
522 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r2, r3, d1
523 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_dcmplt
524 ; CHECK-HARDFP-SPONLY-NEXT
: cmp r0, #0
525 ; CHECK-HARDFP-SPONLY-NEXT
: movne
r0, #1
526 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
527 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
529 %cmp = fcmp olt double
%a, %b
530 %conv
= zext i1
%cmp to i32
534 define i32 @dcmple
(double
%a, double
%b) #0 {
535 ; CHECK-SOFT-LABEL
: dcmple
:
536 ; CHECK-SOFT
: .save {r11, lr}
537 ; CHECK-SOFT-NEXT
: push
{r11, lr}
538 ; CHECK-SOFT-NEXT
: bl __aeabi_dcmple
539 ; CHECK-SOFT-NEXT
: cmp r0, #0
540 ; CHECK-SOFT-NEXT
: movne
r0, #1
541 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
542 ; CHECK-SOFT-NEXT
: mov pc
, lr
544 ; CHECK-SOFTFP-LABEL
: dcmple
:
545 ; CHECK-SOFTFP
: vmov d16
, r2, r3
546 ; CHECK-SOFTFP-NEXT
: vmov d17
, r0, r1
547 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
548 ; CHECK-SOFTFP-NEXT
: vcmpe.f64 d17
, d16
549 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
550 ; CHECK-SOFTFP-NEXT
: movls
r0, #1
551 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
553 ; CHECK-HARDFP-DP-LABEL
: dcmple
:
554 ; CHECK-HARDFP-DP
: vcmpe.f64 d0
, d1
555 ; CHECK-HARDFP-DP-NEXT
: mov
r0, #0
556 ; CHECK-HARDFP-DP-NEXT
: vmrs APSR_nzcv
, fpscr
557 ; CHECK-HARDFP-DP-NEXT
: movls
r0, #1
558 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
560 ; CHECK-HARDFP-SPONLY-LABEL
: dcmple
:
561 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
562 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
563 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
564 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r2, r3, d1
565 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_dcmple
566 ; CHECK-HARDFP-SPONLY-NEXT
: cmp r0, #0
567 ; CHECK-HARDFP-SPONLY-NEXT
: movne
r0, #1
568 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
569 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
571 %cmp = fcmp ole double
%a, %b
572 %conv
= zext i1
%cmp to i32
576 define i32 @dcmpge
(double
%a, double
%b) #0 {
577 ; CHECK-SOFT-LABEL
: dcmpge
:
578 ; CHECK-SOFT
: .save {r11, lr}
579 ; CHECK-SOFT-NEXT
: push
{r11, lr}
580 ; CHECK-SOFT-NEXT
: bl __aeabi_dcmpge
581 ; CHECK-SOFT-NEXT
: cmp r0, #0
582 ; CHECK-SOFT-NEXT
: movne
r0, #1
583 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
584 ; CHECK-SOFT-NEXT
: mov pc
, lr
586 ; CHECK-SOFTFP-LABEL
: dcmpge
:
587 ; CHECK-SOFTFP
: vmov d16
, r2, r3
588 ; CHECK-SOFTFP-NEXT
: vmov d17
, r0, r1
589 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
590 ; CHECK-SOFTFP-NEXT
: vcmpe.f64 d17
, d16
591 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
592 ; CHECK-SOFTFP-NEXT
: movge
r0, #1
593 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
595 ; CHECK-HARDFP-DP-LABEL
: dcmpge
:
596 ; CHECK-HARDFP-DP
: vcmpe.f64 d0
, d1
597 ; CHECK-HARDFP-DP-NEXT
: mov
r0, #0
598 ; CHECK-HARDFP-DP-NEXT
: vmrs APSR_nzcv
, fpscr
599 ; CHECK-HARDFP-DP-NEXT
: movge
r0, #1
600 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
602 ; CHECK-HARDFP-SPONLY-LABEL
: dcmpge
:
603 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
604 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
605 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
606 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r2, r3, d1
607 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_dcmpge
608 ; CHECK-HARDFP-SPONLY-NEXT
: cmp r0, #0
609 ; CHECK-HARDFP-SPONLY-NEXT
: movne
r0, #1
610 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
611 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
613 %cmp = fcmp oge double
%a, %b
614 %conv
= zext i1
%cmp to i32
618 define i32 @dcmpgt
(double
%a, double
%b) #0 {
619 ; CHECK-SOFT-LABEL
: dcmpgt
:
620 ; CHECK-SOFT
: .save {r11, lr}
621 ; CHECK-SOFT-NEXT
: push
{r11, lr}
622 ; CHECK-SOFT-NEXT
: bl __aeabi_dcmpgt
623 ; CHECK-SOFT-NEXT
: cmp r0, #0
624 ; CHECK-SOFT-NEXT
: movne
r0, #1
625 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
626 ; CHECK-SOFT-NEXT
: mov pc
, lr
628 ; CHECK-SOFTFP-LABEL
: dcmpgt
:
629 ; CHECK-SOFTFP
: vmov d16
, r2, r3
630 ; CHECK-SOFTFP-NEXT
: vmov d17
, r0, r1
631 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
632 ; CHECK-SOFTFP-NEXT
: vcmpe.f64 d17
, d16
633 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
634 ; CHECK-SOFTFP-NEXT
: movgt
r0, #1
635 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
637 ; CHECK-HARDFP-DP-LABEL
: dcmpgt
:
638 ; CHECK-HARDFP-DP
: vcmpe.f64 d0
, d1
639 ; CHECK-HARDFP-DP-NEXT
: mov
r0, #0
640 ; CHECK-HARDFP-DP-NEXT
: vmrs APSR_nzcv
, fpscr
641 ; CHECK-HARDFP-DP-NEXT
: movgt
r0, #1
642 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
644 ; CHECK-HARDFP-SPONLY-LABEL
: dcmpgt
:
645 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
646 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
647 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
648 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r2, r3, d1
649 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_dcmpgt
650 ; CHECK-HARDFP-SPONLY-NEXT
: cmp r0, #0
651 ; CHECK-HARDFP-SPONLY-NEXT
: movne
r0, #1
652 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
653 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
655 %cmp = fcmp ogt double
%a, %b
656 %conv
= zext i1
%cmp to i32
660 define i32 @dcmpun
(double
%a, double
%b) #0 {
661 ; CHECK-SOFT-LABEL
: dcmpun
:
662 ; CHECK-SOFT
: .save {r11, lr}
663 ; CHECK-SOFT-NEXT
: push
{r11, lr}
664 ; CHECK-SOFT-NEXT
: bl __aeabi_dcmpun
665 ; CHECK-SOFT-NEXT
: cmp r0, #0
666 ; CHECK-SOFT-NEXT
: movne
r0, #1
667 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
668 ; CHECK-SOFT-NEXT
: mov pc
, lr
670 ; CHECK-SOFTFP-LABEL
: dcmpun
:
671 ; CHECK-SOFTFP
: vmov d16
, r2, r3
672 ; CHECK-SOFTFP-NEXT
: vmov d17
, r0, r1
673 ; CHECK-SOFTFP-NEXT
: mov
r0, #0
674 ; CHECK-SOFTFP-NEXT
: vcmpe.f64 d17
, d16
675 ; CHECK-SOFTFP-NEXT
: vmrs APSR_nzcv
, fpscr
676 ; CHECK-SOFTFP-NEXT
: movvs
r0, #1
677 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
679 ; CHECK-HARDFP-DP-LABEL
: dcmpun
:
680 ; CHECK-HARDFP-DP
: vcmpe.f64 d0
, d1
681 ; CHECK-HARDFP-DP-NEXT
: mov
r0, #0
682 ; CHECK-HARDFP-DP-NEXT
: vmrs APSR_nzcv
, fpscr
683 ; CHECK-HARDFP-DP-NEXT
: movvs
r0, #1
684 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
686 ; CHECK-HARDFP-SPONLY-LABEL
: dcmpun
:
687 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
688 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
689 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
690 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r2, r3, d1
691 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_dcmpun
692 ; CHECK-HARDFP-SPONLY-NEXT
: cmp r0, #0
693 ; CHECK-HARDFP-SPONLY-NEXT
: movne
r0, #1
694 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
695 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
697 %cmp = fcmp uno double
%a, %b
698 %0 = zext i1
%cmp to i32
702 define i32 @d2iz
(double
%a) #0 {
703 ; CHECK-SOFT-LABEL
: d2iz
:
704 ; CHECK-SOFT
: .save {r11, lr}
705 ; CHECK-SOFT-NEXT
: push
{r11, lr}
706 ; CHECK-SOFT-NEXT
: bl __aeabi_d2iz
707 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
708 ; CHECK-SOFT-NEXT
: mov pc
, lr
710 ; CHECK-SOFTFP-LABEL
: d2iz
:
711 ; CHECK-SOFTFP
: vmov d16
, r0, r1
712 ; CHECK-SOFTFP-NEXT
: vcvt.s32.f64 s0
, d16
713 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
714 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
716 ; CHECK-HARDFP-DP-LABEL
: d2iz
:
717 ; CHECK-HARDFP-DP
: vcvt.s32.f64 s0
, d0
718 ; CHECK-HARDFP-DP-NEXT
: vmov
r0, s0
719 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
721 ; CHECK-HARDFP-SPONLY-LABEL
: d2iz
:
722 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
723 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
724 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
725 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_d2iz
726 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
727 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
729 %conv
= fptosi double
%a to i32
733 define i32 @d2uiz
(double
%a) #0 {
734 ; CHECK-SOFT-LABEL
: d2uiz
:
735 ; CHECK-SOFT
: .save {r11, lr}
736 ; CHECK-SOFT-NEXT
: push
{r11, lr}
737 ; CHECK-SOFT-NEXT
: bl __aeabi_d2uiz
738 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
739 ; CHECK-SOFT-NEXT
: mov pc
, lr
741 ; CHECK-SOFTFP-LABEL
: d2uiz
:
742 ; CHECK-SOFTFP
: vmov d16
, r0, r1
743 ; CHECK-SOFTFP-NEXT
: vcvt.u32.f64 s0
, d16
744 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
745 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
747 ; CHECK-HARDFP-DP-LABEL
: d2uiz
:
748 ; CHECK-HARDFP-DP
: vcvt.u32.f64 s0
, d0
749 ; CHECK-HARDFP-DP-NEXT
: vmov
r0, s0
750 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
752 ; CHECK-HARDFP-SPONLY-LABEL
: d2uiz
:
753 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
754 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
755 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
756 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_d2uiz
757 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
758 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
760 %conv
= fptoui double
%a to i32
764 define i64 @d2lz
(double
%a) #0 {
765 ; CHECK-SOFT-LABEL
: d2lz
:
766 ; CHECK-SOFT
: .save {r11, lr}
767 ; CHECK-SOFT-NEXT
: push
{r11, lr}
768 ; CHECK-SOFT-NEXT
: bl __aeabi_d2lz
769 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
770 ; CHECK-SOFT-NEXT
: mov pc
, lr
772 ; CHECK-SOFTFP-LABEL
: d2lz
:
773 ; CHECK-SOFTFP
: .save {r11, lr}
774 ; CHECK-SOFTFP-NEXT
: push
{r11, lr}
775 ; CHECK-SOFTFP-NEXT
: bl __aeabi_d2lz
776 ; CHECK-SOFTFP-NEXT
: pop
{r11, lr}
777 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
779 ; CHECK-HARDFP-SP-LABEL
: d2lz
:
780 ; CHECK-HARDFP-SP
: .save {r11, lr}
781 ; CHECK-HARDFP-SP-NEXT
: push
{r11, lr}
782 ; CHECK-HARDFP-SP-NEXT
: vmov
r0, r1, d0
783 ; CHECK-HARDFP-SP-NEXT
: bl __aeabi_d2lz
784 ; CHECK-HARDFP-SP-NEXT
: pop
{r11, lr}
785 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
787 %conv
= fptosi double
%a to i64
791 define i64 @d2ulz
(double
%a) #0 {
792 ; CHECK-SOFT-LABEL
: d2ulz
:
793 ; CHECK-SOFT
: .save {r11, lr}
794 ; CHECK-SOFT-NEXT
: push
{r11, lr}
795 ; CHECK-SOFT-NEXT
: bl __aeabi_d2ulz
796 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
797 ; CHECK-SOFT-NEXT
: mov pc
, lr
799 ; CHECK-SOFTFP-LABEL
: d2ulz
:
800 ; CHECK-SOFTFP
: .save {r11, lr}
801 ; CHECK-SOFTFP-NEXT
: push
{r11, lr}
802 ; CHECK-SOFTFP-NEXT
: bl __aeabi_d2ulz
803 ; CHECK-SOFTFP-NEXT
: pop
{r11, lr}
804 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
806 ; CHECK-HARDFP-SP-LABEL
: d2ulz
:
807 ; CHECK-HARDFP-SP
: .save {r11, lr}
808 ; CHECK-HARDFP-SP-NEXT
: push
{r11, lr}
809 ; CHECK-HARDFP-SP-NEXT
: vmov
r0, r1, d0
810 ; CHECK-HARDFP-SP-NEXT
: bl __aeabi_d2ulz
811 ; CHECK-HARDFP-SP-NEXT
: pop
{r11, lr}
812 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
814 %conv
= fptoui double
%a to i64
818 define i32 @f2iz
(float
%a) #0 {
819 ; CHECK-SOFT-LABEL
: f2iz
:
820 ; CHECK-SOFT
: .save {r11, lr}
821 ; CHECK-SOFT-NEXT
: push
{r11, lr}
822 ; CHECK-SOFT-NEXT
: bl __aeabi_f2iz
823 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
824 ; CHECK-SOFT-NEXT
: mov pc
, lr
826 ; CHECK-SOFTFP-LABEL
: f2iz
:
827 ; CHECK-SOFTFP
: vmov s0
, r0
828 ; CHECK-SOFTFP-NEXT
: vcvt.s32.f32 s0
, s0
829 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
830 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
832 ; CHECK-HARDFP-SP-LABEL
: f2iz
:
833 ; CHECK-HARDFP-SP
: vcvt.s32.f32 s0
, s0
834 ; CHECK-HARDFP-SP-NEXT
: vmov
r0, s0
835 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
837 %conv
= fptosi float
%a to i32
841 define i32 @f2uiz
(float
%a) #0 {
842 ; CHECK-SOFT-LABEL
: f2uiz
:
843 ; CHECK-SOFT
: .save {r11, lr}
844 ; CHECK-SOFT-NEXT
: push
{r11, lr}
845 ; CHECK-SOFT-NEXT
: bl __aeabi_f2uiz
846 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
847 ; CHECK-SOFT-NEXT
: mov pc
, lr
849 ; CHECK-SOFTFP-LABEL
: f2uiz
:
850 ; CHECK-SOFTFP
: vmov s0
, r0
851 ; CHECK-SOFTFP-NEXT
: vcvt.u32.f32 s0
, s0
852 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
853 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
855 ; CHECK-HARDFP-SP-LABEL
: f2uiz
:
856 ; CHECK-HARDFP-SP
: vcvt.u32.f32 s0
, s0
857 ; CHECK-HARDFP-SP-NEXT
: vmov
r0, s0
858 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
860 %conv
= fptoui float
%a to i32
864 define i64 @f2lz
(float
%a) #0 {
865 ; CHECK-SOFT-LABEL
: f2lz
:
866 ; CHECK-SOFT
: .save {r11, lr}
867 ; CHECK-SOFT-NEXT
: push
{r11, lr}
868 ; CHECK-SOFT-NEXT
: bl __aeabi_f2lz
869 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
870 ; CHECK-SOFT-NEXT
: mov pc
, lr
872 ; CHECK-SOFTFP-LABEL
: f2lz
:
873 ; CHECK-SOFTFP
: .save {r11, lr}
874 ; CHECK-SOFTFP-NEXT
: push
{r11, lr}
875 ; CHECK-SOFTFP-NEXT
: bl __aeabi_f2lz
876 ; CHECK-SOFTFP-NEXT
: pop
{r11, lr}
877 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
879 ; CHECK-HARDFP-SP-LABEL
: f2lz
:
880 ; CHECK-HARDFP-SP
: .save {r11, lr}
881 ; CHECK-HARDFP-SP-NEXT
: push
{r11, lr}
882 ; CHECK-HARDFP-SP-NEXT
: vmov
r0, s0
883 ; CHECK-HARDFP-SP-NEXT
: bl __aeabi_f2lz
884 ; CHECK-HARDFP-SP-NEXT
: pop
{r11, lr}
885 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
887 %conv
= fptosi float
%a to i64
891 define i64 @f2ulz
(float
%a) #0 {
892 ; CHECK-SOFT-LABEL
: f2ulz
:
893 ; CHECK-SOFT
: .save {r11, lr}
894 ; CHECK-SOFT-NEXT
: push
{r11, lr}
895 ; CHECK-SOFT-NEXT
: bl __aeabi_f2ulz
896 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
897 ; CHECK-SOFT-NEXT
: mov pc
, lr
899 ; CHECK-SOFTFP-LABEL
: f2ulz
:
900 ; CHECK-SOFTFP
: .save {r11, lr}
901 ; CHECK-SOFTFP-NEXT
: push
{r11, lr}
902 ; CHECK-SOFTFP-NEXT
: bl __aeabi_f2ulz
903 ; CHECK-SOFTFP-NEXT
: pop
{r11, lr}
904 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
906 ; CHECK-HARDFP-SP-LABEL
: f2ulz
:
907 ; CHECK-HARDFP-SP
: .save {r11, lr}
908 ; CHECK-HARDFP-SP-NEXT
: push
{r11, lr}
909 ; CHECK-HARDFP-SP-NEXT
: vmov
r0, s0
910 ; CHECK-HARDFP-SP-NEXT
: bl __aeabi_f2ulz
911 ; CHECK-HARDFP-SP-NEXT
: pop
{r11, lr}
912 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
914 %conv
= fptoui float
%a to i64
918 define float @d2f
(double
%a) #0 {
919 ; CHECK-SOFT-LABEL
: d2f
:
920 ; CHECK-SOFT
: .save {r11, lr}
921 ; CHECK-SOFT-NEXT
: push
{r11, lr}
922 ; CHECK-SOFT-NEXT
: bl __aeabi_d2f
923 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
924 ; CHECK-SOFT-NEXT
: mov pc
, lr
926 ; CHECK-SOFTFP-LABEL
: d2f
:
927 ; CHECK-SOFTFP
: vmov d16
, r0, r1
928 ; CHECK-SOFTFP-NEXT
: vcvt.f32.f64 s0
, d16
929 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
930 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
932 ; CHECK-HARDFP-DP-LABEL
: d2f
:
933 ; CHECK-HARDFP-DP
: vcvt.f32.f64 s0
, d0
934 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
936 ; CHECK-HARDFP-SPONLY-LABEL
: d2f
:
937 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
938 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
939 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, r1, d0
940 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_d2f
941 ; CHECK-HARDFP-SPONLY-NEXT
: vmov s0
, r0
942 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
943 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
945 %conv
= fptrunc double
%a to float
949 define double @f2d
(float
%a) #0 {
950 ; CHECK-SOFT-LABEL
: f2d
:
951 ; CHECK-SOFT
: .save {r11, lr}
952 ; CHECK-SOFT-NEXT
: push
{r11, lr}
953 ; CHECK-SOFT-NEXT
: bl __aeabi_f2d
954 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
955 ; CHECK-SOFT-NEXT
: mov pc
, lr
957 ; CHECK-SOFTFP-LABEL
: f2d
:
958 ; CHECK-SOFTFP
: vmov s0
, r0
959 ; CHECK-SOFTFP-NEXT
: vcvt.f64.f32 d16
, s0
960 ; CHECK-SOFTFP-NEXT
: vmov
r0, r1, d16
961 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
963 ; CHECK-HARDFP-DP-LABEL
: f2d
:
964 ; CHECK-HARDFP-DP
: vcvt.f64.f32 d0
, s0
965 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
967 ; CHECK-HARDFP-SPONLY-LABEL
: f2d
:
968 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
969 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
970 ; CHECK-HARDFP-SPONLY-NEXT
: vmov
r0, s0
971 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_f2d
972 ; CHECK-HARDFP-SPONLY-NEXT
: vmov d0
, r0, r1
973 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
974 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
976 %conv
= fpext float
%a to double
980 define double @i2d
(i32
%a) #0 {
981 ; CHECK-SOFT-LABEL
: i2d
:
982 ; CHECK-SOFT
: .save {r11, lr}
983 ; CHECK-SOFT-NEXT
: push
{r11, lr}
984 ; CHECK-SOFT-NEXT
: bl __aeabi_i2d
985 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
986 ; CHECK-SOFT-NEXT
: mov pc
, lr
988 ; CHECK-SOFTFP-LABEL
: i2d
:
989 ; CHECK-SOFTFP
: vmov s0
, r0
990 ; CHECK-SOFTFP-NEXT
: vcvt.f64.s32 d16
, s0
991 ; CHECK-SOFTFP-NEXT
: vmov
r0, r1, d16
992 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
994 ; CHECK-HARDFP-DP-LABEL
: i2d
:
995 ; CHECK-HARDFP-DP
: vmov s0
, r0
996 ; CHECK-HARDFP-DP-NEXT
: vcvt.f64.s32 d0
, s0
997 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
999 ; CHECK-HARDFP-SPONLY-LABEL
: i2d
:
1000 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
1001 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
1002 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_i2d
1003 ; CHECK-HARDFP-SPONLY-NEXT
: vmov d0
, r0, r1
1004 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
1005 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
1007 %conv
= sitofp i32
%a to double
1011 define double @ui2d
(i32
%a) #0 {
1012 ; CHECK-SOFT-LABEL
: ui2d
:
1013 ; CHECK-SOFT
: .save {r11, lr}
1014 ; CHECK-SOFT-NEXT
: push
{r11, lr}
1015 ; CHECK-SOFT-NEXT
: bl __aeabi_ui2d
1016 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
1017 ; CHECK-SOFT-NEXT
: mov pc
, lr
1019 ; CHECK-SOFTFP-LABEL
: ui2d
:
1020 ; CHECK-SOFTFP
: vmov s0
, r0
1021 ; CHECK-SOFTFP-NEXT
: vcvt.f64.u32 d16
, s0
1022 ; CHECK-SOFTFP-NEXT
: vmov
r0, r1, d16
1023 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
1025 ; CHECK-HARDFP-DP-LABEL
: ui2d
:
1026 ; CHECK-HARDFP-DP
: vmov s0
, r0
1027 ; CHECK-HARDFP-DP-NEXT
: vcvt.f64.u32 d0
, s0
1028 ; CHECK-HARDFP-DP-NEXT
: mov pc
, lr
1030 ; CHECK-HARDFP-SPONLY-LABEL
: ui2d
:
1031 ; CHECK-HARDFP-SPONLY
: .save {r11, lr}
1032 ; CHECK-HARDFP-SPONLY-NEXT
: push
{r11, lr}
1033 ; CHECK-HARDFP-SPONLY-NEXT
: bl __aeabi_ui2d
1034 ; CHECK-HARDFP-SPONLY-NEXT
: vmov d0
, r0, r1
1035 ; CHECK-HARDFP-SPONLY-NEXT
: pop
{r11, lr}
1036 ; CHECK-HARDFP-SPONLY-NEXT
: mov pc
, lr
1038 %conv
= uitofp i32
%a to double
1042 define double @l2d
(i64
%a) #0 {
1043 ; CHECK-SOFT-LABEL
: l2d
:
1044 ; CHECK-SOFT
: .save {r11, lr}
1045 ; CHECK-SOFT-NEXT
: push
{r11, lr}
1046 ; CHECK-SOFT-NEXT
: bl __aeabi_l2d
1047 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
1048 ; CHECK-SOFT-NEXT
: mov pc
, lr
1050 ; CHECK-SOFTFP-LABEL
: l2d
:
1051 ; CHECK-SOFTFP
: .save {r11, lr}
1052 ; CHECK-SOFTFP-NEXT
: push
{r11, lr}
1053 ; CHECK-SOFTFP-NEXT
: bl __aeabi_l2d
1054 ; CHECK-SOFTFP-NEXT
: pop
{r11, lr}
1055 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
1057 ; CHECK-HARDFP-SP-LABEL
: l2d
:
1058 ; CHECK-HARDFP-SP
: .save {r11, lr}
1059 ; CHECK-HARDFP-SP-NEXT
: push
{r11, lr}
1060 ; CHECK-HARDFP-SP-NEXT
: bl __aeabi_l2d
1061 ; CHECK-HARDFP-SP-NEXT
: vmov d0
, r0, r1
1062 ; CHECK-HARDFP-SP-NEXT
: pop
{r11, lr}
1063 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
1065 %conv
= sitofp i64
%a to double
1069 define double @ul2d
(i64
%a) #0 {
1070 ; CHECK-SOFT-LABEL
: ul2d
:
1071 ; CHECK-SOFT
: .save {r11, lr}
1072 ; CHECK-SOFT-NEXT
: push
{r11, lr}
1073 ; CHECK-SOFT-NEXT
: bl __aeabi_ul2d
1074 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
1075 ; CHECK-SOFT-NEXT
: mov pc
, lr
1077 ; CHECK-SOFTFP-LABEL
: ul2d
:
1078 ; CHECK-SOFTFP
: .save {r11, lr}
1079 ; CHECK-SOFTFP-NEXT
: push
{r11, lr}
1080 ; CHECK-SOFTFP-NEXT
: bl __aeabi_ul2d
1081 ; CHECK-SOFTFP-NEXT
: pop
{r11, lr}
1082 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
1084 ; CHECK-HARDFP-SP-LABEL
: ul2d
:
1085 ; CHECK-HARDFP-SP
: .save {r11, lr}
1086 ; CHECK-HARDFP-SP-NEXT
: push
{r11, lr}
1087 ; CHECK-HARDFP-SP-NEXT
: bl __aeabi_ul2d
1088 ; CHECK-HARDFP-SP-NEXT
: vmov d0
, r0, r1
1089 ; CHECK-HARDFP-SP-NEXT
: pop
{r11, lr}
1090 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
1092 %conv
= uitofp i64
%a to double
1096 define float @i2f
(i32
%a) #0 {
1097 ; CHECK-SOFT-LABEL
: i2f
:
1098 ; CHECK-SOFT
: .save {r11, lr}
1099 ; CHECK-SOFT-NEXT
: push
{r11, lr}
1100 ; CHECK-SOFT-NEXT
: bl __aeabi_i2f
1101 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
1102 ; CHECK-SOFT-NEXT
: mov pc
, lr
1104 ; CHECK-SOFTFP-LABEL
: i2f
:
1105 ; CHECK-SOFTFP
: vmov s0
, r0
1106 ; CHECK-SOFTFP-NEXT
: vcvt.f32.s32 s0
, s0
1107 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
1108 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
1110 ; CHECK-HARDFP-SP-LABEL
: i2f
:
1111 ; CHECK-HARDFP-SP
: vmov s0
, r0
1112 ; CHECK-HARDFP-SP-NEXT
: vcvt.f32.s32 s0
, s0
1113 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
1115 %conv
= sitofp i32
%a to float
1119 define float @ui2f
(i32
%a) #0 {
1120 ; CHECK-SOFT-LABEL
: ui2f
:
1121 ; CHECK-SOFT
: .save {r11, lr}
1122 ; CHECK-SOFT-NEXT
: push
{r11, lr}
1123 ; CHECK-SOFT-NEXT
: bl __aeabi_ui2f
1124 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
1125 ; CHECK-SOFT-NEXT
: mov pc
, lr
1127 ; CHECK-SOFTFP-LABEL
: ui2f
:
1128 ; CHECK-SOFTFP
: vmov s0
, r0
1129 ; CHECK-SOFTFP-NEXT
: vcvt.f32.u32 s0
, s0
1130 ; CHECK-SOFTFP-NEXT
: vmov
r0, s0
1131 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
1133 ; CHECK-HARDFP-SP-LABEL
: ui2f
:
1134 ; CHECK-HARDFP-SP
: vmov s0
, r0
1135 ; CHECK-HARDFP-SP-NEXT
: vcvt.f32.u32 s0
, s0
1136 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
1138 %conv
= uitofp i32
%a to float
1142 define float @l2f
(i64
%a) #0 {
1143 ; CHECK-SOFT-LABEL
: l2f
:
1144 ; CHECK-SOFT
: .save {r11, lr}
1145 ; CHECK-SOFT-NEXT
: push
{r11, lr}
1146 ; CHECK-SOFT-NEXT
: bl __aeabi_l2f
1147 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
1148 ; CHECK-SOFT-NEXT
: mov pc
, lr
1150 ; CHECK-SOFTFP-LABEL
: l2f
:
1151 ; CHECK-SOFTFP
: .save {r11, lr}
1152 ; CHECK-SOFTFP-NEXT
: push
{r11, lr}
1153 ; CHECK-SOFTFP-NEXT
: bl __aeabi_l2f
1154 ; CHECK-SOFTFP-NEXT
: pop
{r11, lr}
1155 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
1157 ; CHECK-HARDFP-SP-LABEL
: l2f
:
1158 ; CHECK-HARDFP-SP
: .save {r11, lr}
1159 ; CHECK-HARDFP-SP-NEXT
: push
{r11, lr}
1160 ; CHECK-HARDFP-SP-NEXT
: bl __aeabi_l2f
1161 ; CHECK-HARDFP-SP-NEXT
: vmov s0
, r0
1162 ; CHECK-HARDFP-SP-NEXT
: pop
{r11, lr}
1163 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
1165 %conv
= sitofp i64
%a to float
1169 define float @ul2f
(i64
%a) #0 {
1170 ; CHECK-SOFT-LABEL
: ul2f
:
1171 ; CHECK-SOFT
: .save {r11, lr}
1172 ; CHECK-SOFT-NEXT
: push
{r11, lr}
1173 ; CHECK-SOFT-NEXT
: bl __aeabi_ul2f
1174 ; CHECK-SOFT-NEXT
: pop
{r11, lr}
1175 ; CHECK-SOFT-NEXT
: mov pc
, lr
1177 ; CHECK-SOFTFP-LABEL
: ul2f
:
1178 ; CHECK-SOFTFP
: .save {r11, lr}
1179 ; CHECK-SOFTFP-NEXT
: push
{r11, lr}
1180 ; CHECK-SOFTFP-NEXT
: bl __aeabi_ul2f
1181 ; CHECK-SOFTFP-NEXT
: pop
{r11, lr}
1182 ; CHECK-SOFTFP-NEXT
: mov pc
, lr
1184 ; CHECK-HARDFP-SP-LABEL
: ul2f
:
1185 ; CHECK-HARDFP-SP
: .save {r11, lr}
1186 ; CHECK-HARDFP-SP-NEXT
: push
{r11, lr}
1187 ; CHECK-HARDFP-SP-NEXT
: bl __aeabi_ul2f
1188 ; CHECK-HARDFP-SP-NEXT
: vmov s0
, r0
1189 ; CHECK-HARDFP-SP-NEXT
: pop
{r11, lr}
1190 ; CHECK-HARDFP-SP-NEXT
: mov pc
, lr
1192 %conv
= uitofp i64
%a to float
1195 attributes
#0 = { nounwind }