1%verify "executed" 2/* EABI appears to have Java-style conversions of +inf/-inf/NaN */ 3%include "armv6t2/unop.S" {"instr":"bl __aeabi_f2iz"} 4 5#if 0 6@include "armv6t2/unop.S" {"instr":"bl f2i_doconv"} 7@break 8/* 9 * Convert the float in r0 to an int in r0. 10 * 11 * We have to clip values to int min/max per the specification. The 12 * expected common case is a "reasonable" value that converts directly 13 * to modest integer. The EABI convert function isn't doing this for us. 14 */ 15f2i_doconv: 16 stmfd sp!, {r4, lr} 17 mov r1, #0x4f000000 @ (float)maxint 18 mov r4, r0 19 bl __aeabi_fcmpge @ is arg >= maxint? 20 cmp r0, #0 @ nonzero == yes 21 mvnne r0, #0x80000000 @ return maxint (7fffffff) 22 ldmnefd sp!, {r4, pc} 23 24 mov r0, r4 @ recover arg 25 mov r1, #0xcf000000 @ (float)minint 26 bl __aeabi_fcmple @ is arg <= minint? 27 cmp r0, #0 @ nonzero == yes 28 movne r0, #0x80000000 @ return minint (80000000) 29 ldmnefd sp!, {r4, pc} 30 31 mov r0, r4 @ recover arg 32 mov r1, r4 33 bl __aeabi_fcmpeq @ is arg == self? 34 cmp r0, #0 @ zero == no 35 ldmeqfd sp!, {r4, pc} @ return zero for NaN 36 37 mov r0, r4 @ recover arg 38 bl __aeabi_f2iz @ convert float to int 39 ldmfd sp!, {r4, pc} 40#endif 41