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); |
+ } |
} |