Index: src/mips/lithium-mips.cc |
diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc |
index 5cfca0001004e7140e4fd47dbdd8fc7732053deb..b03cea44cbfa5dfc64d0e93fcdb074bb5cc0b9a8 100644 |
--- a/src/mips/lithium-mips.cc |
+++ b/src/mips/lithium-mips.cc |
@@ -713,9 +713,9 @@ LInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { |
LInstruction* LChunkBuilder::DoShift(Token::Value op, |
HBitwiseBinaryOperation* instr) { |
- if (instr->representation().IsTagged()) { |
- ASSERT(instr->left()->representation().IsTagged()); |
- ASSERT(instr->right()->representation().IsTagged()); |
+ if (instr->representation().IsSmiOrTagged()) { |
+ ASSERT(instr->left()->representation().IsSmiOrTagged()); |
+ ASSERT(instr->right()->representation().IsSmiOrTagged()); |
LOperand* left = UseFixed(instr->left(), a1); |
LOperand* right = UseFixed(instr->right(), a0); |
@@ -723,35 +723,25 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op, |
return MarkAsCall(DefineFixed(result, v0), instr); |
} |
- ASSERT(instr->representation().IsSmiOrInteger32()); |
- ASSERT(instr->left()->representation().Equals(instr->representation())); |
- ASSERT(instr->right()->representation().Equals(instr->representation())); |
+ ASSERT(instr->representation().IsInteger32()); |
+ ASSERT(instr->left()->representation().IsInteger32()); |
+ ASSERT(instr->right()->representation().IsInteger32()); |
LOperand* left = UseRegisterAtStart(instr->left()); |
HValue* right_value = instr->right(); |
LOperand* right = NULL; |
int constant_value = 0; |
- bool does_deopt = false; |
if (right_value->IsConstant()) { |
HConstant* constant = HConstant::cast(right_value); |
right = chunk_->DefineConstantOperand(constant); |
constant_value = constant->Integer32Value() & 0x1f; |
- // Left shifts can deoptimize if we shift by > 0 and the result cannot be |
- // truncated to smi. |
- if (instr->representation().IsSmi() && constant_value > 0) { |
- for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { |
- if (!it.value()->CheckFlag(HValue::kTruncatingToSmi)) { |
- does_deopt = true; |
- break; |
- } |
- } |
- } |
} else { |
right = UseRegisterAtStart(right_value); |
} |
- // Shift operations can deoptimize if we do a logical shift |
+ // Shift operations can only deoptimize if we do a logical shift |
// by 0 and the result cannot be truncated to int32. |
+ bool does_deopt = false; |
if (op == Token::SHR && constant_value == 0) { |
if (FLAG_opt_safe_uint32_operations) { |
does_deopt = !instr->CheckFlag(HInstruction::kUint32); |
@@ -2017,8 +2007,6 @@ LInstruction* LChunkBuilder::DoConstant(HConstant* instr) { |
return DefineAsRegister(new(zone()) LConstantI); |
} else if (r.IsDouble()) { |
return DefineAsRegister(new(zone()) LConstantD); |
- } else if (r.IsExternal()) { |
- return DefineAsRegister(new(zone()) LConstantE); |
} else if (r.IsTagged()) { |
return DefineAsRegister(new(zone()) LConstantT); |
} else { |
@@ -2247,12 +2235,21 @@ LInstruction* LChunkBuilder::DoTransitionElementsKind( |
if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { |
LOperand* new_map_reg = TempRegister(); |
LTransitionElementsKind* result = |
- new(zone()) LTransitionElementsKind(object, new_map_reg); |
+ new(zone()) LTransitionElementsKind(object, new_map_reg, NULL); |
return result; |
- } else { |
+ } else if (FLAG_compiled_transitions) { |
LTransitionElementsKind* result = |
- new(zone()) LTransitionElementsKind(object, NULL); |
+ new(zone()) LTransitionElementsKind(object, NULL, NULL); |
return AssignPointerMap(result); |
+ } else { |
+ LOperand* object = UseFixed(instr->object(), a0); |
+ LOperand* fixed_object_reg = FixedTemp(a2); |
+ LOperand* new_map_reg = FixedTemp(a3); |
+ LTransitionElementsKind* result = |
+ new(zone()) LTransitionElementsKind(object, |
+ new_map_reg, |
+ fixed_object_reg); |
+ return MarkAsCall(result, instr); |
} |
} |