1%verify "executed"
2/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3%include "armv6t2/unop.S" {"instr":"bl      __aeabi_f2iz"}
4
5#if 0
6@include "armv6t2/unop.S" {"instr":"bl      f2i_doconv"}
7@break
8/*
9 * Convert the float in r0 to an int in r0.
10 *
11 * We have to clip values to int min/max per the specification.  The
12 * expected common case is a "reasonable" value that converts directly
13 * to modest integer.  The EABI convert function isn't doing this for us.
14 */
15f2i_doconv:
16    stmfd   sp!, {r4, lr}
17    mov     r1, #0x4f000000             @ (float)maxint
18    mov     r4, r0
19    bl      __aeabi_fcmpge              @ is arg >= maxint?
20    cmp     r0, #0                      @ nonzero == yes
21    mvnne   r0, #0x80000000             @ return maxint (7fffffff)
22    ldmnefd sp!, {r4, pc}
23
24    mov     r0, r4                      @ recover arg
25    mov     r1, #0xcf000000             @ (float)minint
26    bl      __aeabi_fcmple              @ is arg <= minint?
27    cmp     r0, #0                      @ nonzero == yes
28    movne   r0, #0x80000000             @ return minint (80000000)
29    ldmnefd sp!, {r4, pc}
30
31    mov     r0, r4                      @ recover arg
32    mov     r1, r4
33    bl      __aeabi_fcmpeq              @ is arg == self?
34    cmp     r0, #0                      @ zero == no
35    ldmeqfd sp!, {r4, pc}               @ return zero for NaN
36
37    mov     r0, r4                      @ recover arg
38    bl      __aeabi_f2iz                @ convert float to int
39    ldmfd   sp!, {r4, pc}
40#endif
41