[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / ARM / float-helpers.s
blobd5388a372b887a175ea6b502d03c2c9e8c28dcba
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)
13 ; calling convention.
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
29 ; precision only FPU)
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
35 ; section 4.1.2.
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
58 entry:
59 %add = fadd float %a, %b
60 ret float %add
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
81 entry:
82 %div = fdiv float %a, %b
83 ret float %div
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
104 entry:
105 %mul = fmul float %a, %b
106 ret float %mul
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
127 entry:
128 %sub = fsub float %a, %b
129 ret float %sub
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
157 entry:
158 %cmp = fcmp oeq float %a, %b
159 %conv = zext i1 %cmp to i32
160 ret i32 %conv
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
188 entry:
189 %cmp = fcmp olt float %a, %b
190 %conv = zext i1 %cmp to i32
191 ret i32 %conv
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
219 entry:
220 %cmp = fcmp ole float %a, %b
221 %conv = zext i1 %cmp to i32
222 ret i32 %conv
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
250 entry:
251 %cmp = fcmp oge float %a, %b
252 %conv = zext i1 %cmp to i32
253 ret i32 %conv
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
281 entry:
282 %cmp = fcmp ogt float %a, %b
283 %conv = zext i1 %cmp to i32
284 ret i32 %conv
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
312 entry:
313 %cmp = fcmp uno float %a, %b
314 %0 = zext i1 %cmp to i32
315 ret i32 %0
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
346 entry:
347 %add = fadd double %a, %b
348 ret double %add
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
379 entry:
380 %div = fdiv double %a, %b
381 ret double %div
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
412 entry:
413 %mul = fmul double %a, %b
414 ret double %mul
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
445 entry:
446 %sub = fsub double %a, %b
447 ret double %sub
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
486 entry:
487 %cmp = fcmp oeq double %a, %b
488 %conv = zext i1 %cmp to i32
489 ret i32 %conv
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
528 entry:
529 %cmp = fcmp olt double %a, %b
530 %conv = zext i1 %cmp to i32
531 ret i32 %conv
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
570 entry:
571 %cmp = fcmp ole double %a, %b
572 %conv = zext i1 %cmp to i32
573 ret i32 %conv
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
612 entry:
613 %cmp = fcmp oge double %a, %b
614 %conv = zext i1 %cmp to i32
615 ret i32 %conv
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
654 entry:
655 %cmp = fcmp ogt double %a, %b
656 %conv = zext i1 %cmp to i32
657 ret i32 %conv
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
696 entry:
697 %cmp = fcmp uno double %a, %b
698 %0 = zext i1 %cmp to i32
699 ret i32 %0
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
728 entry:
729 %conv = fptosi double %a to i32
730 ret i32 %conv
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
759 entry:
760 %conv = fptoui double %a to i32
761 ret i32 %conv
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
786 entry:
787 %conv = fptosi double %a to i64
788 ret i64 %conv
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
813 entry:
814 %conv = fptoui double %a to i64
815 ret i64 %conv
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
836 entry:
837 %conv = fptosi float %a to i32
838 ret i32 %conv
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
859 entry:
860 %conv = fptoui float %a to i32
861 ret i32 %conv
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
886 entry:
887 %conv = fptosi float %a to i64
888 ret i64 %conv
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
913 entry:
914 %conv = fptoui float %a to i64
915 ret i64 %conv
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
944 entry:
945 %conv = fptrunc double %a to float
946 ret float %conv
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
975 entry:
976 %conv = fpext float %a to double
977 ret double %conv
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
1006 entry:
1007 %conv = sitofp i32 %a to double
1008 ret double %conv
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
1037 entry:
1038 %conv = uitofp i32 %a to double
1039 ret double %conv
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
1064 entry:
1065 %conv = sitofp i64 %a to double
1066 ret double %conv
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
1091 entry:
1092 %conv = uitofp i64 %a to double
1093 ret double %conv
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
1114 entry:
1115 %conv = sitofp i32 %a to float
1116 ret float %conv
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
1137 entry:
1138 %conv = uitofp i32 %a to float
1139 ret float %conv
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
1164 entry:
1165 %conv = sitofp i64 %a to float
1166 ret float %conv
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
1191 entry:
1192 %conv = uitofp i64 %a to float
1193 ret float %conv
1195 attributes #0 = { nounwind }