mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 04:03:39 +00:00
fix overflow in mpz::bitwise_not
This commit is contained in:
parent
c6f9c09d70
commit
a96f5a9b42
|
@ -1460,9 +1460,11 @@ void mpz_manager<SYNCH>::bitwise_xor(mpz const & a, mpz const & b, mpz & c) {
|
||||||
template<bool SYNCH>
|
template<bool SYNCH>
|
||||||
void mpz_manager<SYNCH>::bitwise_not(unsigned sz, mpz const & a, mpz & c) {
|
void mpz_manager<SYNCH>::bitwise_not(unsigned sz, mpz const & a, mpz & c) {
|
||||||
SASSERT(is_nonneg(a));
|
SASSERT(is_nonneg(a));
|
||||||
if (is_small(a) && sz <= 63) {
|
if (is_small(a) && sz <= 64) {
|
||||||
int64_t mask = (static_cast<int64_t>(1) << sz) - static_cast<int64_t>(1);
|
uint64_t v = ~get_uint64(a);
|
||||||
set_i64(c, (~ i64(a)) & mask);
|
unsigned zero_out = 64 - sz;
|
||||||
|
v = (v >> zero_out) << zero_out;
|
||||||
|
set(c, v);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mpz a1, a2, m, tmp;
|
mpz a1, a2, m, tmp;
|
||||||
|
|
Loading…
Reference in a new issue