summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Mahone <andrew.mahone@gmail.com>2010-02-02 15:55:10 +0000
committerAndrew Mahone <andrew.mahone@gmail.com>2010-02-02 15:55:10 +0000
commite77cdd147cf11961a6ee59d3f94c5271c8fe1c1f (patch)
treeb1b03af38efb8a552bcd7d54aa55adb2267a3477
parentff6053e4c31e646c9a6d966335fcc69142ed71f4 (diff)
downloadrockbox-e77cdd147cf11961a6ee59d3f94c5271c8fe1c1f.zip
rockbox-e77cdd147cf11961a6ee59d3f94c5271c8fe1c1f.tar.gz
rockbox-e77cdd147cf11961a6ee59d3f94c5271c8fe1c1f.tar.bz2
rockbox-e77cdd147cf11961a6ee59d3f94c5271c8fe1c1f.tar.xz
Correct ARMv5/6 signed divider, which was not saving return address to stack before using lr for calculation.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24457 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/support-arm.S14
1 files changed, 6 insertions, 8 deletions
diff --git a/firmware/target/arm/support-arm.S b/firmware/target/arm/support-arm.S
index 38587b2..dd17e0f 100644
--- a/firmware/target/arm/support-arm.S
+++ b/firmware/target/arm/support-arm.S
@@ -582,7 +582,9 @@
.ifnc "", "\quotient"
mov \quotient, #0
.endif
+.ifnc "", "\remainder"
ARM_SDIV32_POST "", \remainder, \sign
+.endif
.ifnc "", "\return"
\return
.endif
@@ -605,10 +607,10 @@ __div0_wrap:
.size __div0_wrap, . - __div0_wrap
#ifndef __ARM_EABI__
-#if ARM_ARCH < 5 /* Gigabeat S is crashing on boot with this enabled */
.global __divsi3
.type __divsi3,%function
-#endif
+ .global __udivsi3
+ .type __udivsi3,%function
.global __udivsi3
.type __udivsi3,%function
#else
@@ -619,14 +621,12 @@ __div0_wrap:
.global __aeabi_uidiv
.type __aeabi_uidiv,%function
.set __aeabi_uidiv,__aeabi_uidivmod
-#if ARM_ARCH < 5 /* Gigabeat S is crashing on boot with this enabled */
.global __aeabi_idivmod
.type __aeabi_idivmod,%function
.global __aeabi_idiv
.type __aeabi_idiv,%function
.set __aeabi_idiv,__aeabi_idivmod
#endif
-#endif
#if ARM_ARCH < 5
@@ -675,23 +675,21 @@ __udivsi3:
ARMV5_UDIV32_BODY r0, r1, r0, "", r2, r3, ip, __div0_wrap, 1
.size __udivsi3, . - __udivsi3
-#if ARM_ARCH < 5 /* Gigabeat S is crashing on boot with this enabled */
__divsi3:
+ str lr, [sp, #-4]
ARMV5_SDIV32_BODY r0, r1, r0, "", r2, lr, ip, r3, __div0_wrap_s, "ldr pc, [sp, #-4]"
.size __divsi3, . - __divsi3
-#endif
#else
__aeabi_uidivmod:
ARMV5_UDIV32_BODY r0, r1, r0, r1, r2, r3, ip, __div0_wrap, 1
.size __aeabi_uidivmod, . - __aeabi_uidivmo
-#if ARM_ARCH < 5 /* Gigabeat S is crashing on boot with this enabled */
__aeabi_idivmod:
+ str lr, [sp, #-4]
ARMV5_SDIV32_BODY r0, r1, r0, r1, r2, lr, ip, r3, __div0_wrap_s, "ldr pc, [sp, #-4]"
.size __aeabi_idivmod, . - __aeabi_idivmod
#endif
-#endif
.L_udiv_est_table:
.byte 0xff, 0xfc, 0xf8, 0xf4, 0xf0, 0xed, 0xea, 0xe6