summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2016-08-28 12:00:25 +0200
committeraiju <devnull@localhost>2016-08-28 12:00:25 +0200
commit43bb71c8cca061a705689be27906207329c3b5f7 (patch)
treec6a8bae4021125c3a2f7edb94699964174382321 /sys
parent344ff48512561b57022c1f686005b3283da07cc5 (diff)
mpdiv: negative divisor has to flip sign of quotient
Diffstat (limited to 'sys')
-rw-r--r--sys/src/libmp/port/mpdiv.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/src/libmp/port/mpdiv.c b/sys/src/libmp/port/mpdiv.c
index 54b943862..8ee1d2ae5 100644
--- a/sys/src/libmp/port/mpdiv.c
+++ b/sys/src/libmp/port/mpdiv.c
@@ -24,9 +24,12 @@ mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder)
if(divisor->top == 1 && (divisor->p[0] & divisor->p[0]-1) == 0){
vlong r = (vlong)dividend->sign * (dividend->p[0] & divisor->p[0]-1);
if(quotient != nil){
+ sign = divisor->sign;
for(s = 0; ((divisor->p[0] >> s) & 1) == 0; s++)
;
mpright(dividend, s, quotient);
+ if(sign < 0 && quotient->top != 0)
+ quotient->sign ^= -2;
}
if(remainder != nil){
remainder->flags |= dividend->flags & MPtimesafe;