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