diff options
author | Marius Schilder <mschilder@google.com> | 2016-10-10 19:28:49 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-11-02 09:20:18 -0700 |
commit | d4bff62d36cf42e7b28929baff64b0d99bf95362 (patch) | |
tree | c2d1b43de3db20899270672d292a9fe97af8e31b /core | |
parent | 180ac77e16e1e5a57769a2a20411b6e37d649107 (diff) | |
download | chrome-ec-d4bff62d36cf42e7b28929baff64b0d99bf95362.tar.gz |
Fix bugs.
L_fallback_32bits: section did not compute remainder correctly.
L_sub_loop1: section did not track r6 correctly.
Also correctly annotate which instructions need to set the flags.
BRANCH=none
BUG=none
TEST=now passes the tests in
http://www.hackersdelight.org/hdcodetxt/divmnu64.c.txt
Change-Id: Ib55a3bbbcee35c7f21dc67f51038783ea1d26f6c
Reviewed-on: https://chromium-review.googlesource.com/396397
Commit-Ready: Marius Schilder <mschilder@chromium.org>
Tested-by: Marius Schilder <mschilder@chromium.org>
Reviewed-by: Marius Schilder <mschilder@chromium.org>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'core')
-rw-r--r-- | core/cortex-m/uldivmod.S | 60 |
1 files changed, 30 insertions, 30 deletions
diff --git a/core/cortex-m/uldivmod.S b/core/cortex-m/uldivmod.S index 256023e9cc..423036f790 100644 --- a/core/cortex-m/uldivmod.S +++ b/core/cortex-m/uldivmod.S @@ -68,7 +68,7 @@ __aeabi_uldivmod: blo L_upper_result L_denom_shift_loop1: - lsls r5, #1 + lsl r5, #1 lsls r7, #1 bmi L_upper_result @ dont shift if overflow cmp r1, r7 @@ -77,23 +77,26 @@ L_denom_shift_loop1: L_upper_result: mov r3, r1 mov r2, r0 - movs r1, #0 @ upper result = 0 + mov r1, #0 @ upper result = 0 + mov r6, #0 L_sub_loop1: - cmp r3, r7 - bcc L_dont_sub1 @ if (num>denom) + orr r1, r5 @ result(r7:r6) |= bitmask(r5) + subs r2, r6 @ num -= denom + sbcs r3, r7 + bhs L_done_sub1 - subs r3, r7 @ num -= denom - orrs r1, r5 @ result(r7:r6) |= bitmask(r5) -L_dont_sub1: + eor r1, r5 @ undo add mask + adds r2, r6 @ undo subtract + adc r3, r7 +L_done_sub1: lsrs r7, #1 @ denom(r7:r6) >>= 1 + rrx r6, r6 lsrs r5, #1 @ bitmask(r5) >>= 1 bne L_sub_loop1 - movs r5, #1 - lsls r5, #31 - movs r6, #0 + rrx r5, r5 b L_lower_result @@ -113,9 +116,9 @@ L_fallback_32bits: mov r1, r0 udiv r0, r2 @ r0 = quotient mul r3, r0, r2 @ r3 = quotient * divisor - subs r2, r3, r2 @ r2 = remainder - movs r1, #0 - movs r3, #0 + sub r2, r1, r3 @ r2 = remainder + mov r1, #0 + mov r3, #0 bx lr @@ -133,18 +136,17 @@ L_large_denom: @ Shift left the denominator until it is greater than the numerator - movs r1, #0 @ high word of result is 0 - movs r5, #1 @ bitmask + mov r1, #0 @ high word of result is 0 + mov r5, #1 @ bitmask adds r7, #0 @ dont shift if denominator would overflow bmi L_lower_result cmp r3, r7 blo L_lower_result L_denom_shift_loop4: - lsls r5, #1 - lsls r7, #1 - lsls r6, #1 - adcs r7, r1 @ r1=0 + lsl r5, #1 + lsls r6, #1 @ denom(r7:r6) <<= 1 + adcs r7, r7 bmi L_lower_result @ dont shift if overflow cmp r3, r7 bhs L_denom_shift_loop4 @@ -155,20 +157,18 @@ L_lower_result: movs r0, #0 L_sub_loop4: - mov r4, r3 - cmp r2, r6 - sbcs r4, r7 - bcc L_dont_sub4 @ if (num>denom) - + orr r0, r5 @ result(r1:r0) |= bitmask(r5) subs r2, r6 @ numerator -= denom sbcs r3, r7 - orrs r0, r5 @ result(r1:r0) |= bitmask(r5) -L_dont_sub4: + bhs L_done_sub4 + + eor r0, r5 @ undo add mask + adds r2, r6 @ undo subtract + adc r3, r7 - lsls r4, r7, #31 @ denom(r7:r6) >>= 1 - lsrs r6, #1 - lsrs r7, #1 - orrs r6, r4 +L_done_sub4: + lsrs r7, #1 @ denom(r7:r6) >>= 1 + rrx r6, r6 lsrs r5, #1 @ bitmask(r5) >>= 1 bne L_sub_loop4 |