1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed" 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */ 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%include "armv5te/unopNarrower.S" {"instr":"bl __aeabi_d2iz"} 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopNarrower.S" {"instr":"bl d2i_doconv"} 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to an int in r0. 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification. The 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer. The EABI convert function isn't doing this for us. 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2i_doconv: 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r4, r5, lr} @ save regs 175162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0x80000000 @ maxint, as a double (low word) 185162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, r2, asr #9 @ 0xffc00000 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub sp, sp, #4 @ align for EABI 205162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mvn r3, #0xbe000000 @ maxint, as a double (high word) 215162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden sub r3, r3, #0x00200000 @ 0x41dfffff 225162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r4, r0 @ save a copy of r0 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r5, r1 @ and r1 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpge @ is arg >= maxint? 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 265162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mvnne r0, #0x80000000 @ return maxint (0x7fffffff) 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 315162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r3, #0xc1000000 @ minint, as a double (high word) 325162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden add r3, r3, #0x00e00000 @ 0xc1e00000 335162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0 @ minint, as a double (low word) 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmple @ is arg <= minint? 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, #0x80000000 @ return minint (80000000) 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r4 @ compare against self 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r5 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpeq @ is arg == self? 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ zero == no 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f @ return zero for NaN 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_d2iz @ convert double to int 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #4 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r4, r5, pc} 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 55