1a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden%verify "executed" 2a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden@include "armv6t2/unopWider.S" {"instr":"bl __aeabi_f2lz"} 3a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden%include "armv6t2/unopWider.S" {"instr":"bl f2l_doconv"} 4a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden 5a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden%break 6a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden/* 7a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden * Convert the float in r0 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 McFaddenf2l_doconv: 14a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden stmfd sp!, {r4, lr} 15a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r1, #0x5f000000 @ (float)maxlong 16a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r4, r0 17a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden bl __aeabi_fcmpge @ is arg >= maxlong? 18a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden cmp r0, #0 @ nonzero == yes 19a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mvnne r0, #0 @ return maxlong (7fffffff) 20a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mvnne r1, #0x80000000 21a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden ldmnefd sp!, {r4, pc} 22a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden 23a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r0, r4 @ recover arg 24a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r1, #0xdf000000 @ (float)minlong 25a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden bl __aeabi_fcmple @ is arg <= minlong? 26a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden cmp r0, #0 @ nonzero == yes 27a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden movne r0, #0 @ return minlong (80000000) 28a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden movne r1, #0x80000000 29a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden ldmnefd sp!, {r4, pc} 30a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden 31a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r0, r4 @ recover arg 32a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r1, r4 33a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden bl __aeabi_fcmpeq @ is arg == self? 34a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden cmp r0, #0 @ zero == no 35a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden moveq r1, #0 @ return zero for NaN 36a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden ldmeqfd sp!, {r4, pc} 37a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden 38a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden mov r0, r4 @ recover arg 39a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden bl __aeabi_f2lz @ convert float to long 40a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden ldmfd sp!, {r4, pc} 41