use integer assoc consts instead of methods
This commit is contained in:
parent
7a3700c371
commit
6db7e34ab5
@ -818,9 +818,9 @@ pub fn set_range_inbounds(&mut self, start: Size, end: Size, new_state: bool) {
|
||||
// First set all bits except the first `bita`,
|
||||
// then unset the last `64 - bitb` bits.
|
||||
let range = if bitb == 0 {
|
||||
u64::max_value() << bita
|
||||
u64::MAX << bita
|
||||
} else {
|
||||
(u64::max_value() << bita) & (u64::max_value() >> (64 - bitb))
|
||||
(u64::MAX << bita) & (u64::MAX >> (64 - bitb))
|
||||
};
|
||||
if new_state {
|
||||
self.blocks[blocka] |= range;
|
||||
@ -832,21 +832,21 @@ pub fn set_range_inbounds(&mut self, start: Size, end: Size, new_state: bool) {
|
||||
// across block boundaries
|
||||
if new_state {
|
||||
// Set `bita..64` to `1`.
|
||||
self.blocks[blocka] |= u64::max_value() << bita;
|
||||
self.blocks[blocka] |= u64::MAX << bita;
|
||||
// Set `0..bitb` to `1`.
|
||||
if bitb != 0 {
|
||||
self.blocks[blockb] |= u64::max_value() >> (64 - bitb);
|
||||
self.blocks[blockb] |= u64::MAX >> (64 - bitb);
|
||||
}
|
||||
// Fill in all the other blocks (much faster than one bit at a time).
|
||||
for block in (blocka + 1)..blockb {
|
||||
self.blocks[block] = u64::max_value();
|
||||
self.blocks[block] = u64::MAX;
|
||||
}
|
||||
} else {
|
||||
// Set `bita..64` to `0`.
|
||||
self.blocks[blocka] &= !(u64::max_value() << bita);
|
||||
self.blocks[blocka] &= !(u64::MAX << bita);
|
||||
// Set `0..bitb` to `0`.
|
||||
if bitb != 0 {
|
||||
self.blocks[blockb] &= !(u64::max_value() >> (64 - bitb));
|
||||
self.blocks[blockb] &= !(u64::MAX >> (64 - bitb));
|
||||
}
|
||||
// Fill in all the other blocks (much faster than one bit at a time).
|
||||
for block in (blocka + 1)..blockb {
|
||||
|
@ -78,9 +78,9 @@ fn overflowing_offset(&self, val: u64, i: u64) -> (u64, bool) {
|
||||
fn overflowing_signed_offset(&self, val: u64, i: i128) -> (u64, bool) {
|
||||
// FIXME: is it possible to over/underflow here?
|
||||
if i < 0 {
|
||||
// Trickery to ensure that `i64::min_value()` works fine: compute `n = -i`.
|
||||
// Trickery to ensure that `i64::MIN` works fine: compute `n = -i`.
|
||||
// This formula only works for true negative values; it overflows for zero!
|
||||
let n = u64::max_value() - (i as u64) + 1;
|
||||
let n = u64::MAX - (i as u64) + 1;
|
||||
let res = val.overflowing_sub(n);
|
||||
self.truncate_to_ptr(res)
|
||||
} else {
|
||||
|
@ -203,7 +203,7 @@ pub fn emulate_intrinsic(
|
||||
if is_add {
|
||||
// max unsigned
|
||||
Scalar::from_uint(
|
||||
u128::max_value() >> (128 - num_bits),
|
||||
u128::MAX >> (128 - num_bits),
|
||||
Size::from_bits(num_bits),
|
||||
)
|
||||
} else {
|
||||
@ -381,11 +381,11 @@ pub fn exact_div(
|
||||
dest: PlaceTy<'tcx, M::PointerTag>,
|
||||
) -> InterpResult<'tcx> {
|
||||
// Performs an exact division, resulting in undefined behavior where
|
||||
// `x % y != 0` or `y == 0` or `x == T::min_value() && y == -1`.
|
||||
// `x % y != 0` or `y == 0` or `x == T::MIN && y == -1`.
|
||||
// First, check x % y != 0 (or if that computation overflows).
|
||||
let (res, overflow, _ty) = self.overflowing_binary_op(BinOp::Rem, a, b)?;
|
||||
if overflow || res.assert_bits(a.layout.size) != 0 {
|
||||
// Then, check if `b` is -1, which is the "min_value / -1" case.
|
||||
// Then, check if `b` is -1, which is the "MIN / -1" case.
|
||||
let minus1 = Scalar::from_int(-1, dest.layout.size);
|
||||
let b_scalar = b.to_scalar().unwrap();
|
||||
if b_scalar == minus1 {
|
||||
|
@ -463,7 +463,7 @@ fn visit_scalar(
|
||||
let (lo, hi) = valid_range.clone().into_inner();
|
||||
// Determine the allowed range
|
||||
// `max_hi` is as big as the size fits
|
||||
let max_hi = u128::max_value() >> (128 - op.layout.size.bits());
|
||||
let max_hi = u128::MAX >> (128 - op.layout.size.bits());
|
||||
assert!(hi <= max_hi);
|
||||
// We could also write `(hi + 1) % (max_hi + 1) == lo` but `max_hi + 1` overflows for `u128`
|
||||
if (lo == 0 && hi == max_hi) || (hi + 1 == lo) {
|
||||
|
Loading…
Reference in New Issue
Block a user