summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Schilder <mschilder@google.com>2016-10-10 19:28:49 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-11-02 09:20:18 -0700
commitd4bff62d36cf42e7b28929baff64b0d99bf95362 (patch)
treec2d1b43de3db20899270672d292a9fe97af8e31b
parent180ac77e16e1e5a57769a2a20411b6e37d649107 (diff)
downloadchrome-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>
-rw-r--r--core/cortex-m/uldivmod.S60
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