| Index: src/arm/lithium-arm.cc
|
| ===================================================================
|
| --- src/arm/lithium-arm.cc (revision 7683)
|
| +++ src/arm/lithium-arm.cc (working copy)
|
| @@ -858,22 +858,20 @@
|
|
|
| // Shift operations can only deoptimize if we do a logical shift
|
| // by 0 and the result cannot be truncated to int32.
|
| - bool can_deopt = (op == Token::SHR && constant_value == 0);
|
| - if (can_deopt) {
|
| - bool can_truncate = true;
|
| - for (int i = 0; i < instr->uses()->length(); i++) {
|
| - if (!instr->uses()->at(i)->CheckFlag(HValue::kTruncatingToInt32)) {
|
| - can_truncate = false;
|
| + bool may_deopt = (op == Token::SHR && constant_value == 0);
|
| + bool does_deopt = false;
|
| + if (may_deopt) {
|
| + for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) {
|
| + if (!it.value()->CheckFlag(HValue::kTruncatingToInt32)) {
|
| + does_deopt = true;
|
| break;
|
| }
|
| }
|
| - can_deopt = !can_truncate;
|
| }
|
|
|
| LInstruction* result =
|
| - DefineSameAsFirst(new LShiftI(op, left, right, can_deopt));
|
| - if (can_deopt) AssignEnvironment(result);
|
| - return result;
|
| + DefineSameAsFirst(new LShiftI(op, left, right, does_deopt));
|
| + return does_deopt ? AssignEnvironment(result) : result;
|
| }
|
|
|
|
|
| @@ -1856,8 +1854,11 @@
|
| HLoadKeyedSpecializedArrayElement* instr) {
|
| ExternalArrayType array_type = instr->array_type();
|
| Representation representation(instr->representation());
|
| - ASSERT((representation.IsInteger32() && array_type != kExternalFloatArray) ||
|
| - (representation.IsDouble() && array_type == kExternalFloatArray));
|
| + ASSERT(
|
| + (representation.IsInteger32() && (array_type != kExternalFloatArray &&
|
| + array_type != kExternalDoubleArray)) ||
|
| + (representation.IsDouble() && (array_type == kExternalFloatArray ||
|
| + array_type == kExternalDoubleArray)));
|
| ASSERT(instr->key()->representation().IsInteger32());
|
| LOperand* external_pointer = UseRegister(instr->external_pointer());
|
| LOperand* key = UseRegister(instr->key());
|
| @@ -1904,8 +1905,11 @@
|
| HStoreKeyedSpecializedArrayElement* instr) {
|
| Representation representation(instr->value()->representation());
|
| ExternalArrayType array_type = instr->array_type();
|
| - ASSERT((representation.IsInteger32() && array_type != kExternalFloatArray) ||
|
| - (representation.IsDouble() && array_type == kExternalFloatArray));
|
| + ASSERT(
|
| + (representation.IsInteger32() && (array_type != kExternalFloatArray &&
|
| + array_type != kExternalDoubleArray)) ||
|
| + (representation.IsDouble() && (array_type == kExternalFloatArray ||
|
| + array_type == kExternalDoubleArray)));
|
| ASSERT(instr->external_pointer()->representation().IsExternal());
|
| ASSERT(instr->key()->representation().IsInteger32());
|
|
|
| @@ -2138,4 +2142,12 @@
|
| }
|
|
|
|
|
| +LInstruction* LChunkBuilder::DoIn(HIn* instr) {
|
| + LOperand* key = UseRegisterAtStart(instr->key());
|
| + LOperand* object = UseRegisterAtStart(instr->object());
|
| + LIn* result = new LIn(key, object);
|
| + return MarkAsCall(DefineFixed(result, r0), instr);
|
| +}
|
| +
|
| +
|
| } } // namespace v8::internal
|
|
|