| Index: src/hydrogen-instructions.cc
|
| ===================================================================
|
| --- src/hydrogen-instructions.cc (revision 6042)
|
| +++ src/hydrogen-instructions.cc (working copy)
|
| @@ -64,69 +64,34 @@
|
| }
|
|
|
|
|
| -static int32_t AddAssertNoOverflow(int32_t a, int32_t b) {
|
| - ASSERT(static_cast<int64_t>(a + b) == (static_cast<int64_t>(a) +
|
| - static_cast<int64_t>(b)));
|
| - return a + b;
|
| -}
|
| -
|
| -
|
| -static int32_t SubAssertNoOverflow(int32_t a, int32_t b) {
|
| - ASSERT(static_cast<int64_t>(a - b) == (static_cast<int64_t>(a) -
|
| - static_cast<int64_t>(b)));
|
| - return a - b;
|
| -}
|
| -
|
| -
|
| -static int32_t MulAssertNoOverflow(int32_t a, int32_t b) {
|
| - ASSERT(static_cast<int64_t>(a * b) == (static_cast<int64_t>(a) *
|
| - static_cast<int64_t>(b)));
|
| - return a * b;
|
| -}
|
| -
|
| -
|
| -static int32_t AddWithoutOverflow(int32_t a, int32_t b) {
|
| - if (b > 0) {
|
| - if (a <= kMaxInt - b) return AddAssertNoOverflow(a, b);
|
| +static int32_t ConvertAndSetOverflow(int64_t result, bool* overflow) {
|
| + if (result > kMaxInt) {
|
| + *overflow = true;
|
| return kMaxInt;
|
| - } else {
|
| - if (a >= kMinInt - b) return AddAssertNoOverflow(a, b);
|
| + }
|
| + if (result < kMinInt) {
|
| + *overflow = true;
|
| return kMinInt;
|
| }
|
| + return static_cast<int32_t>(result);
|
| }
|
|
|
|
|
| -static int32_t SubWithoutOverflow(int32_t a, int32_t b) {
|
| - if (b < 0) {
|
| - if (a <= kMaxInt + b) return SubAssertNoOverflow(a, b);
|
| - return kMaxInt;
|
| - } else {
|
| - if (a >= kMinInt + b) return SubAssertNoOverflow(a, b);
|
| - return kMinInt;
|
| - }
|
| +static int32_t AddWithoutOverflow(int32_t a, int32_t b, bool* overflow) {
|
| + int64_t result = static_cast<int64_t>(a) + static_cast<int64_t>(b);
|
| + return ConvertAndSetOverflow(result, overflow);
|
| }
|
|
|
|
|
| -static int32_t MulWithoutOverflow(int32_t a, int32_t b, bool* overflow) {
|
| - if (b == 0 || a == 0) return 0;
|
| - if (a == 1) return b;
|
| - if (b == 1) return a;
|
| +static int32_t SubWithoutOverflow(int32_t a, int32_t b, bool* overflow) {
|
| + int64_t result = static_cast<int64_t>(a) - static_cast<int64_t>(b);
|
| + return ConvertAndSetOverflow(result, overflow);
|
| +}
|
|
|
| - int sign = 1;
|
| - if ((a < 0 && b > 0) || (a > 0 && b < 0)) sign = -1;
|
| - if (a < 0) a = -a;
|
| - if (b < 0) b = -b;
|
|
|
| - if (kMaxInt / b > a && a != kMinInt && b != kMinInt) {
|
| - return MulAssertNoOverflow(a, b) * sign;
|
| - }
|
| -
|
| - *overflow = true;
|
| - if (sign == 1) {
|
| - return kMaxInt;
|
| - } else {
|
| - return kMinInt;
|
| - }
|
| +static int32_t MulWithoutOverflow(int32_t a, int32_t b, bool* overflow) {
|
| + int64_t result = static_cast<int64_t>(a) * static_cast<int64_t>(b);
|
| + return ConvertAndSetOverflow(result, overflow);
|
| }
|
|
|
|
|
| @@ -143,39 +108,32 @@
|
| }
|
|
|
|
|
| -void Range::Add(int32_t value) {
|
| +void Range::AddConstant(int32_t value) {
|
| if (value == 0) return;
|
| - lower_ = AddWithoutOverflow(lower_, value);
|
| - upper_ = AddWithoutOverflow(upper_, value);
|
| + bool may_overflow = false; // Overflow is ignored here.
|
| + lower_ = AddWithoutOverflow(lower_, value, &may_overflow);
|
| + upper_ = AddWithoutOverflow(upper_, value, &may_overflow);
|
| Verify();
|
| }
|
|
|
|
|
| -// Returns whether the add may overflow.
|
| bool Range::AddAndCheckOverflow(Range* other) {
|
| - int old_lower = lower_;
|
| - int old_upper = upper_;
|
| - lower_ = AddWithoutOverflow(lower_, other->lower());
|
| - upper_ = AddWithoutOverflow(upper_, other->upper());
|
| - bool r = (old_lower + other->lower() != lower_ ||
|
| - old_upper + other->upper() != upper_);
|
| + bool may_overflow = false;
|
| + lower_ = AddWithoutOverflow(lower_, other->lower(), &may_overflow);
|
| + upper_ = AddWithoutOverflow(upper_, other->upper(), &may_overflow);
|
| KeepOrder();
|
| Verify();
|
| - return r;
|
| + return may_overflow;
|
| }
|
|
|
|
|
| -// Returns whether the sub may overflow.
|
| bool Range::SubAndCheckOverflow(Range* other) {
|
| - int old_lower = lower_;
|
| - int old_upper = upper_;
|
| - lower_ = SubWithoutOverflow(lower_, other->lower());
|
| - upper_ = SubWithoutOverflow(upper_, other->upper());
|
| - bool r = (old_lower - other->lower() != lower_ ||
|
| - old_upper - other->upper() != upper_);
|
| + bool may_overflow = false;
|
| + lower_ = SubWithoutOverflow(lower_, other->upper(), &may_overflow);
|
| + upper_ = SubWithoutOverflow(upper_, other->lower(), &may_overflow);
|
| KeepOrder();
|
| Verify();
|
| - return r;
|
| + return may_overflow;
|
| }
|
|
|
|
|
| @@ -193,7 +151,6 @@
|
| }
|
|
|
|
|
| -// Returns whether the mul may overflow.
|
| bool Range::MulAndCheckOverflow(Range* other) {
|
| bool may_overflow = false;
|
| int v1 = MulWithoutOverflow(lower_, other->lower(), &may_overflow);
|
|
|