aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/big.c
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2018-12-17 16:03:36 +0100
committerSverker Eriksson <[email protected]>2018-12-17 16:47:41 +0100
commitc8d3bff46adbff3205eaf76de8a634557cbd4af4 (patch)
tree561b2ff0e426ca7d4b1687e9f8090f33634db429 /erts/emulator/beam/big.c
parentabc4fd372d476821448dfb949bea4e28ab82ac26 (diff)
downloadotp-c8d3bff46adbff3205eaf76de8a634557cbd4af4.tar.gz
otp-c8d3bff46adbff3205eaf76de8a634557cbd4af4.tar.bz2
otp-c8d3bff46adbff3205eaf76de8a634557cbd4af4.zip
erts: Fix bug in 'band' of two negative numbers, one big
Similar bug as for bxor fixed by abc4fd372d476821448dfb9 Ex: 1> io:format("~.16B\n", [-16#1110000000000000000 band (-1)]). -1120000000000000000 Wrong result for (-X bsl WS) band -Y. where X is any positive integer WS is erlang:system_info(wordsize)*8*N where N is 1 or larger Y is any positive integer smaller than (1 bsl WS) 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.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/erts/emulator/beam/big.c b/erts/emulator/beam/big.c
index 323cd6c518..6497089419 100644
--- a/erts/emulator/beam/big.c
+++ b/erts/emulator/beam/big.c
@@ -1139,8 +1139,11 @@ static dsize_t I_band(ErtsDigit* x, dsize_t xl, short xsgn,
*r++ = ~c1 & ~c2;
x++; y++;
}
- while(xl--)
- *r++ = ~*x++;
+ while(xl--) {
+ DSUBb(*x,0,b1,c1);
+ *r++ = ~c1;
+ x++;
+ }
}
}
return I_btrail(r0, r, sign);