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