11452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee@include "arm/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
21452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee%include "arm/unopWide.S" {"instr":"bl      d2l_doconv"}
31452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee
41452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee%break
51452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee/*
61452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee * Convert the double in r0/r1 to a long in r0/r1.
71452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee *
81452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee * We have to clip values to long min/max per the specification.  The
91452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee * expected common case is a "reasonable" value that converts directly
101452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee * to modest integer.  The EABI convert function isn't doing this for us.
111452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee */
121452bee8f06b9f76a333ddf4760e4beaa82f8099buzbeed2l_doconv:
131452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    stmfd   sp!, {r4, r5, lr}           @ save regs
141452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r3, #0x43000000             @ maxlong, as a double (high word)
151452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    add     r3, #0x00e00000             @  0x43e00000
161452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r2, #0                      @ maxlong, as a double (low word)
171452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    sub     sp, sp, #4                  @ align for EABI
181452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r4, r0                      @ save a copy of r0
191452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r5, r1                      @  and r1
201452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    bl      __aeabi_dcmpge              @ is arg >= maxlong?
211452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    cmp     r0, #0                      @ nonzero == yes
221452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
231452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mvnne   r1, #0x80000000
241452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    bne     1f
251452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee
261452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r0, r4                      @ recover arg
271452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r1, r5
281452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r3, #0xc3000000             @ minlong, as a double (high word)
291452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    add     r3, #0x00e00000             @  0xc3e00000
301452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r2, #0                      @ minlong, as a double (low word)
311452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    bl      __aeabi_dcmple              @ is arg <= minlong?
321452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    cmp     r0, #0                      @ nonzero == yes
331452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    movne   r0, #0                      @ return minlong (8000000000000000)
341452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    movne   r1, #0x80000000
351452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    bne     1f
361452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee
371452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r0, r4                      @ recover arg
381452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r1, r5
391452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r2, r4                      @ compare against self
401452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r3, r5
411452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    bl      __aeabi_dcmpeq              @ is arg == self?
421452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    cmp     r0, #0                      @ zero == no
431452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    moveq   r1, #0                      @ return zero for NaN
441452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    beq     1f
451452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee
461452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r0, r4                      @ recover arg
471452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r1, r5
481452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    bl      __aeabi_d2lz                @ convert double to long
491452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee
501452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee1:
511452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    add     sp, sp, #4
521452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    ldmfd   sp!, {r4, r5, pc}
53