summaryrefslogtreecommitdiff
path: root/digital/avr/modules/math/fixed/fixed_div_f824.avr.S
diff options
context:
space:
mode:
authorNicolas Schodet2009-08-24 21:27:30 +0200
committerNicolas Schodet2009-08-24 21:27:30 +0200
commit7bf92a1ee80c988f736d4f3f1a5a8edbca74456e (patch)
tree441643baab65dae35ab31618f2969e0015113c81 /digital/avr/modules/math/fixed/fixed_div_f824.avr.S
parent6ed931bd5a6978bf69303d4eb69eab406983fbf1 (diff)
* digital/avr/modules/math/fixed:
- round division result (closes #96). - changed macros to inlined.
Diffstat (limited to 'digital/avr/modules/math/fixed/fixed_div_f824.avr.S')
-rw-r--r--digital/avr/modules/math/fixed/fixed_div_f824.avr.S19
1 files changed, 17 insertions, 2 deletions
diff --git a/digital/avr/modules/math/fixed/fixed_div_f824.avr.S b/digital/avr/modules/math/fixed/fixed_div_f824.avr.S
index 43f4e0c3..b231ac23 100644
--- a/digital/avr/modules/math/fixed/fixed_div_f824.avr.S
+++ b/digital/avr/modules/math/fixed/fixed_div_f824.avr.S
@@ -24,8 +24,8 @@
; }}}
; Perfs:
-; 1186 cycles in worse case
-; 843 per second, per MHz
+; 1199 cycles in worse case
+; 834 per second, per MHz
#define dd3 r25
#define dd2 r24
@@ -150,6 +150,21 @@ fixed_div_f824:
rol dd1
rol dd2
rol dd3
+; Rounding.
+ lsl rem0 ; shift rem
+ rol rem1
+ rol rem2
+ rol rem3
+ cp rem0, dv0 ; rem -= dv
+ cpc rem1, dv1
+ cpc rem2, dv2
+ cpc rem3, dv3
+ brcs 2f ; if positive or equal, round up
+ subi dd0, 0xff
+ sbci dd1, 0xff
+ sbci dd2, 0xff
+ sbci dd3, 0xff
+2: ; else, nothing, round down
; Restore sign.
sbrs __tmp_reg__, 7
rjmp 1f