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.tar.gz
rockbox-e77cdd147cf11961a6ee59d3f94c5271c8fe1c1f.zip
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 38587b2adc..dd17e0f5f7 100644
--- a/firmware/target/arm/support-arm.S
+++ b/firmware/target/arm/support-arm.S
@@ -582,7 +582,9 @@
582.ifnc "", "\quotient" 582.ifnc "", "\quotient"
583 mov \quotient, #0 583 mov \quotient, #0
584.endif 584.endif
585.ifnc "", "\remainder"
585 ARM_SDIV32_POST "", \remainder, \sign 586 ARM_SDIV32_POST "", \remainder, \sign
587.endif
586.ifnc "", "\return" 588.ifnc "", "\return"
587 \return 589 \return
588.endif 590.endif
@@ -605,10 +607,10 @@ __div0_wrap:
605 .size __div0_wrap, . - __div0_wrap 607 .size __div0_wrap, . - __div0_wrap
606 608
607#ifndef __ARM_EABI__ 609#ifndef __ARM_EABI__
608#if ARM_ARCH < 5 /* Gigabeat S is crashing on boot with this enabled */
609 .global __divsi3 610 .global __divsi3
610 .type __divsi3,%function 611 .type __divsi3,%function
611#endif 612 .global __udivsi3
613 .type __udivsi3,%function
612 .global __udivsi3 614 .global __udivsi3
613 .type __udivsi3,%function 615 .type __udivsi3,%function
614#else 616#else
@@ -619,14 +621,12 @@ __div0_wrap:
619 .global __aeabi_uidiv 621 .global __aeabi_uidiv
620 .type __aeabi_uidiv,%function 622 .type __aeabi_uidiv,%function
621 .set __aeabi_uidiv,__aeabi_uidivmod 623 .set __aeabi_uidiv,__aeabi_uidivmod
622#if ARM_ARCH < 5 /* Gigabeat S is crashing on boot with this enabled */
623 .global __aeabi_idivmod 624 .global __aeabi_idivmod
624 .type __aeabi_idivmod,%function 625 .type __aeabi_idivmod,%function
625 .global __aeabi_idiv 626 .global __aeabi_idiv
626 .type __aeabi_idiv,%function 627 .type __aeabi_idiv,%function
627 .set __aeabi_idiv,__aeabi_idivmod 628 .set __aeabi_idiv,__aeabi_idivmod
628#endif 629#endif
629#endif
630 630
631 631
632#if ARM_ARCH < 5 632#if ARM_ARCH < 5
@@ -675,23 +675,21 @@ __udivsi3:
675 ARMV5_UDIV32_BODY r0, r1, r0, "", r2, r3, ip, __div0_wrap, 1 675 ARMV5_UDIV32_BODY r0, r1, r0, "", r2, r3, ip, __div0_wrap, 1
676 .size __udivsi3, . - __udivsi3 676 .size __udivsi3, . - __udivsi3
677 677
678#if ARM_ARCH < 5 /* Gigabeat S is crashing on boot with this enabled */
679__divsi3: 678__divsi3:
679 str lr, [sp, #-4]
680 ARMV5_SDIV32_BODY r0, r1, r0, "", r2, lr, ip, r3, __div0_wrap_s, "ldr pc, [sp, #-4]" 680 ARMV5_SDIV32_BODY r0, r1, r0, "", r2, lr, ip, r3, __div0_wrap_s, "ldr pc, [sp, #-4]"
681 .size __divsi3, . - __divsi3 681 .size __divsi3, . - __divsi3
682#endif
683 682
684#else 683#else
685__aeabi_uidivmod: 684__aeabi_uidivmod:
686 ARMV5_UDIV32_BODY r0, r1, r0, r1, r2, r3, ip, __div0_wrap, 1 685 ARMV5_UDIV32_BODY r0, r1, r0, r1, r2, r3, ip, __div0_wrap, 1
687 .size __aeabi_uidivmod, . - __aeabi_uidivmo 686 .size __aeabi_uidivmod, . - __aeabi_uidivmo
688 687
689#if ARM_ARCH < 5 /* Gigabeat S is crashing on boot with this enabled */
690__aeabi_idivmod: 688__aeabi_idivmod:
689 str lr, [sp, #-4]
691 ARMV5_SDIV32_BODY r0, r1, r0, r1, r2, lr, ip, r3, __div0_wrap_s, "ldr pc, [sp, #-4]" 690 ARMV5_SDIV32_BODY r0, r1, r0, r1, r2, lr, ip, r3, __div0_wrap_s, "ldr pc, [sp, #-4]"
692 .size __aeabi_idivmod, . - __aeabi_idivmod 691 .size __aeabi_idivmod, . - __aeabi_idivmod
693#endif 692#endif
694#endif
695 693
696.L_udiv_est_table: 694.L_udiv_est_table:
697 .byte 0xff, 0xfc, 0xf8, 0xf4, 0xf0, 0xed, 0xea, 0xe6 695 .byte 0xff, 0xfc, 0xf8, 0xf4, 0xf0, 0xed, 0xea, 0xe6