Index: runtime/vm/intermediate_language.cc |
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc |
index c0a4f039a25d4b5e34924d59808fd7a33b2e1c88..fbc492221942fa0a6d9e85cae6f73b59a8f3280c 100644 |
--- a/runtime/vm/intermediate_language.cc |
+++ b/runtime/vm/intermediate_language.cc |
@@ -1260,11 +1260,41 @@ bool BinaryIntegerOpInstr::RightIsPowerOfTwoConstant() const { |
} |
+static intptr_t RepresentationBits(Representation r) { |
+ switch (r) { |
+ case kTagged: |
+ return kBitsPerWord - 1; |
+ case kUnboxedInt32: |
+ case kUnboxedUint32: |
+ return 32; |
+ case kUnboxedMint: |
+ return 64; |
+ default: |
+ UNREACHABLE(); |
+ return 0; |
+ } |
+} |
+ |
+ |
+static int64_t RepresentationMask(Representation r) { |
+ return static_cast<int64_t>( |
+ static_cast<uint64_t>(-1) >> (64 - RepresentationBits(r))); |
+} |
+ |
+ |
static bool ToIntegerConstant(Value* value, int64_t* result) { |
if (!value->BindsToConstant()) { |
UnboxInstr* unbox = value->definition()->AsUnbox(); |
- if ((unbox != NULL) && (unbox->representation() == kUnboxedDouble)) { |
- return ToIntegerConstant(unbox->value(), result); |
+ if (unbox != NULL) { |
+ if (unbox->representation() == kUnboxedDouble) { |
+ return ToIntegerConstant(unbox->value(), result); |
+ } else if (unbox->representation() == kUnboxedUint32) { |
Florian Schneider
2014/11/10 16:10:47
Why are kUnboxedInt32 and kInboxedMint not handled
|
+ if (ToIntegerConstant(unbox->value(), result)) { |
+ *result &= RepresentationMask(kUnboxedUint32); |
+ return true; |
+ } |
+ return false; |
+ } |
} |
return false; |
} |
@@ -1392,28 +1422,6 @@ static bool IsCommutative(Token::Kind op) { |
} |
-static intptr_t RepresentationBits(Representation r) { |
- switch (r) { |
- case kTagged: |
- return kBitsPerWord - 1; |
- case kUnboxedInt32: |
- case kUnboxedUint32: |
- return 32; |
- case kUnboxedMint: |
- return 64; |
- default: |
- UNREACHABLE(); |
- return 0; |
- } |
-} |
- |
- |
-static int64_t RepresentationMask(Representation r) { |
- return static_cast<int64_t>( |
- static_cast<uint64_t>(-1) >> (64 - RepresentationBits(r))); |
-} |
- |
- |
UnaryIntegerOpInstr* UnaryIntegerOpInstr::Make(Representation representation, |
Token::Kind op_kind, |
Value* value, |