Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -393,10 +393,24 @@ ]) AC_MSG_RESULT($fp_endianess) AS_IF([test x"$fp_endianess" = x"unknown"], [ AC_MSG_ERROR( [Floating point implementation does not conform to IEEE 754!])]) + +case "$host" in + arm*) + AC_MSG_CHECKING(if VFP2 or above is available) + AC_TRY_COMPILE([], [ + __asm__("fstmfdd sp!, {d0-d7}"); + ], [ + AC_DEFINE(HAVE_VFP2, 1, [Whether we have VFP2 or above]) + AC_MSG_RESULT(yes) + ], [ + AC_MSG_RESULT(no) + ]) + ;; +esac AC_CHECK_LIB(m, fmod, LIBS="$LIBS -lm") AC_CHECK_FUNC(asprintf, [ case "$host" in Index: src/forwarding/forwarding-arm-elf.S ================================================================== --- src/forwarding/forwarding-arm-elf.S +++ src/forwarding/forwarding-arm-elf.S @@ -19,12 +19,14 @@ .globl of_forward .globl of_forward_stret .section .text of_forward: - stmfd sp!, {r0-r4, lr} +#ifdef HAVE_VFP2 fstmfdd sp!, {d0-d7} +#endif + stmfd sp!, {r0-r4, lr} ldr r4, sel_forwardingTargetForSelector_$indirect_.L0 .L0: add r4, pc @@ -34,46 +36,52 @@ bl class_respondsToSelector(PLT) cmp r0, #0 beq 0f - ldr r0, [sp, #64] + ldr r0, [sp, #0] mov r1, r4 bl objc_msg_lookup(PLT) mov r12, r0 - ldr r0, [sp, #64] + ldr r0, [sp, #0] mov r1, r4 - ldr r2, [sp, #68] + ldr r2, [sp, #4] blx r12 cmp r0, #0 beq 0f - ldr r1, [sp, #64] + ldr r1, [sp, #0] cmp r0, r1 beq 0f - str r0, [sp, #64] - ldr r1, [sp, #68] + str r0, [sp, #0] + ldr r1, [sp, #4] bl objc_msg_lookup(PLT) mov r12, r0 - fldmfdd sp!, {d0-d7} ldmfd sp!, {r0-r4, lr} +#ifdef HAVE_VFP2 + fldmfdd sp!, {d0-d7} +#endif bx r12 0: - fldmfdd sp!, {d0-d7} ldmfd sp!, {r0-r4, lr} +#ifdef HAVE_VFP2 + fldmfdd sp!, {d0-d7} +#endif b of_method_not_found(PLT) .type of_forward, %function .size of_forward, .-of_forward of_forward_stret: - stmfd sp!, {r0-r4, lr} +#ifdef HAVE_VFP2 fstmfdd sp!, {d0-d7} +#endif + stmfd sp!, {r0-r4, lr} ldr r4, sel_forwardingTargetForSelector_$indirect_.L1 .L1: add r4, pc @@ -84,39 +92,43 @@ bl class_respondsToSelector(PLT) cmp r0, #0 beq 0f - ldr r0, [sp, #68] + ldr r0, [sp, #4] mov r1, r4 bl objc_msg_lookup(PLT) mov r12, r0 - ldr r0, [sp, #68] + ldr r0, [sp, #4] mov r1, r4 - ldr r2, [sp, #72] + ldr r2, [sp, #8] blx r12 cmp r0, #0 beq 0f - ldr r1, [sp, #68] + ldr r1, [sp, #4] cmp r0, r1 beq 0f - str r0, [sp, #68] - ldr r1, [sp, #72] + str r0, [sp, #4] + ldr r1, [sp, #8] bl objc_msg_lookup_stret(PLT) mov r12, r0 - fldmfdd sp!, {d0-d7} ldmfd sp!, {r0-r4, lr} +#ifdef HAVE_VFP2 + fldmfdd sp!, {d0-d7} +#endif bx r12 0: - fldmfdd sp!, {d0-d7} ldmfd sp!, {r0-r4, lr} +#ifdef HAVE_VFP2 + fldmfdd sp!, {d0-d7} +#endif b of_method_not_found_stret(PLT) .type of_forward_stret, %function .size of_forward_stret, .-of_forward_stret init: