OP_DOUBLE_TO_INT.S revision f6c387128427e121477c1b32ad35cdcaa5101ba3
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 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, .L${opcode}_maxlo @ (double)maxint, lo 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, .L${opcode}_maxhi @ (double)maxint, hi 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub sp, sp, #4 @ align for EABI 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r4, r0 @ save r0 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r5, r1 @ and r1 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpge @ is arg >= maxint? 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r0, #0x80000000 @ return maxint (7fffffff) 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, .L${opcode}_min @ (double)minint, hi 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ (double)minint, lo 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmple @ is arg <= minint? 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, #0x80000000 @ return minint (80000000) 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r4 @ compare against self 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r5 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpeq @ is arg == self? 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ zero == no 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f @ return zero for NaN 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_d2iz @ convert double to int 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #4 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r4, r5, pc} 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_maxlo: 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word 0xffc00000 @ maxint, as a double (low word) 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_maxhi: 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word 0x41dfffff @ maxint, as a double (high word) 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_min: 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word 0xc1e00000 @ minint, as a double (high word) 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 60