1a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden%verify "executed" 2a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden@include "armv6t2/unopWide.S" {"instr":"bl __aeabi_d2lz"} 3a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden%include "armv6t2/unopWide.S" {"instr":"bl d2l_doconv"} 4a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden 5a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden%break 6a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden/* 7a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden * Convert the double in r0/r1 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 McFaddend2l_doconv: 14a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden stmfd sp!, {r4, r5, lr} @ save regs 155162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r3, #0x43000000 @ maxlong, as a double (high word) 165162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden add r3, #0x00e00000 @ 0x43e00000 175162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0 @ maxlong, as a double (low word) 18a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden sub sp, sp, #4 @ align for EABI 195162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r4, r0 @ save a copy of r0 20a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r5, r1 @ and r1 21a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden bl __aeabi_dcmpge @ is arg >= maxlong? 22a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden cmp r0, #0 @ nonzero == yes 23a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mvnne r0, #0 @ return maxlong (7fffffffffffffff) 24a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mvnne r1, #0x80000000 25a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden bne 1f 26a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden 27a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r0, r4 @ recover arg 28a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r1, r5 295162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r3, #0xc3000000 @ minlong, as a double (high word) 305162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden add r3, #0x00e00000 @ 0xc3e00000 315162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0 @ minlong, as a double (low word) 32a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden bl __aeabi_dcmple @ is arg <= minlong? 33a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden cmp r0, #0 @ nonzero == yes 34a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden movne r0, #0 @ return minlong (8000000000000000) 35a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden movne r1, #0x80000000 36a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden bne 1f 37a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden 38a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r0, r4 @ recover arg 39a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r1, r5 40a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r2, r4 @ compare against self 41a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r3, r5 42a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden bl __aeabi_dcmpeq @ is arg == self? 43a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden cmp r0, #0 @ zero == no 44a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden moveq r1, #0 @ return zero for NaN 45a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden beq 1f 46a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden 47a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r0, r4 @ recover arg 48a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r1, r5 49a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden bl __aeabi_d2lz @ convert double to long 50a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden 51a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden1: 52a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden add sp, sp, #4 53a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden ldmfd sp!, {r4, r5, pc} 54