Chromium Code Reviews| Index: src/hydrogen-instructions.cc |
| =================================================================== |
| --- src/hydrogen-instructions.cc (revision 15052) |
| +++ src/hydrogen-instructions.cc (working copy) |
| @@ -285,16 +285,8 @@ |
| } |
| -int32_t Range::Mask() const { |
| - if (lower_ == upper_) return lower_; |
| - if (lower_ >= 0) { |
| - int32_t res = 1; |
| - while (res < upper_) { |
| - res = (res << 1) | 1; |
| - } |
| - return res; |
| - } |
| - return 0xffffffff; |
| +void Range::ToBitRange(BitRange* bits) const { |
| + BitRange::SetFromRange(bits, lower_, upper_); |
| } |
| @@ -2347,6 +2339,7 @@ |
| Range* HBitwise::InferRange(Zone* zone) { |
| + /* |
| if (op() == Token::BIT_XOR) { |
| if (left()->HasRange() && right()->HasRange()) { |
| // The maximum value has the high bit, and all bits below, set: |
| @@ -2391,6 +2384,37 @@ |
| return (result_mask >= 0) |
| ? new(zone) Range(0, result_mask) |
| : HValue::InferRange(zone); |
| + */ |
|
fschneider
2013/06/11 10:22:37
Remove commented code.
sra1
2013/06/12 00:12:24
Done.
|
| + if (representation().IsInteger32()) { |
| + BitRange left_bits, right_bits; |
| + |
| + if (left()->range() != NULL) |
|
Toon Verwaest
2013/06/11 12:47:46
if (left()->HasRange()) {
...
}
sra1
2013/06/12 00:12:24
Done.
|
| + left()->range()->ToBitRange(&left_bits); |
| + |
| + if (right()->range() != NULL) |
| + right()->range()->ToBitRange(&right_bits); |
| + |
| + BitRange result; |
| + switch (op()) { |
| + case Token::BIT_AND: |
| + result = BitRange::And(left_bits, right_bits); |
| + break; |
| + case Token::BIT_OR: |
| + result = BitRange::Or(left_bits, right_bits); |
| + break; |
| + case Token::BIT_XOR: |
| + result = BitRange::Xor(left_bits, right_bits); |
| + break; |
| + default: |
| + UNREACHABLE(); |
| + } |
| + |
| + int32_t lower = kMaxInt, upper = kMinInt; // 'empty' range. |
| + result.ExtendRange(&lower, &upper); |
| + return new(zone) Range(lower, upper); |
| + } else { |
| + return HValue::InferRange(zone); |
| + } |
| } |