aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/big.c
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2017-07-12 17:09:10 +0200
committerSverker Eriksson <[email protected]>2017-07-12 17:09:10 +0200
commitabc4fd372d476821448dfb949bea4e28ab82ac26 (patch)
tree8691172836707b2e08343704350340e9c1872c23 /erts/emulator/beam/big.c
parent6d4001de141a00b3bf37b8f7b24c5bde2b4f4015 (diff)
downloadotp-abc4fd372d476821448dfb949bea4e28ab82ac26.tar.gz
otp-abc4fd372d476821448dfb949bea4e28ab82ac26.tar.bz2
otp-abc4fd372d476821448dfb949bea4e28ab82ac26.zip
erts: Fix bug in bxor of a big negative number
Wrong result for (X bsl WS) bxor Y. where X is any negative integer Y is any integer that does not require more words than X WS is erlang:system_info(wordsize) or larger Fix: The subtraction of 1 (for 2-complement conversion) must be carried along all the way to the last words.
Diffstat (limited to 'erts/emulator/beam/big.c')
-rw-r--r--erts/emulator/beam/big.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/erts/emulator/beam/big.c b/erts/emulator/beam/big.c
index d1e46e3063..323cd6c518 100644
--- a/erts/emulator/beam/big.c
+++ b/erts/emulator/beam/big.c
@@ -1273,8 +1273,11 @@ static dsize_t I_bxor(ErtsDigit* x, dsize_t xl, short xsgn,
*r++ = ~c ^ *y++;
x++;
}
- while(xl--)
- *r++ = ~*x++;
+ while(xl--) {
+ DSUBb(*x,0,b,c);
+ *r++ = ~c;
+ x++;
+ }
}
else {
ErtsDigit b1, b2;
@@ -1292,7 +1295,9 @@ static dsize_t I_bxor(ErtsDigit* x, dsize_t xl, short xsgn,
x++; y++;
}
while(xl--) {
- *r++ = *x++;
+ DSUBb(*x,0,b1,c1);
+ *r++ = c1;
+ x++;
}
}
}