Index: src/x64/lithium-x64.cc |
diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc |
index 4153417473e24e4dfc2d915799b294dc3c4413d5..d6f05c0a2df80bf90531fda2ed89aae021f9c442 100644 |
--- a/src/x64/lithium-x64.cc |
+++ b/src/x64/lithium-x64.cc |
@@ -717,9 +717,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(), rdx); |
LOperand* right = UseFixed(instr->right(), rax); |
@@ -727,9 +727,9 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op, |
return MarkAsCall(DefineFixed(result, rax), 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(); |
@@ -1562,9 +1562,9 @@ LInstruction* LChunkBuilder::DoAdd(HAdd* instr) { |
LInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { |
LOperand* left = NULL; |
LOperand* right = NULL; |
- if (instr->representation().IsSmiOrInteger32()) { |
- ASSERT(instr->left()->representation().Equals(instr->representation())); |
- ASSERT(instr->right()->representation().Equals(instr->representation())); |
+ if (instr->representation().IsInteger32()) { |
+ ASSERT(instr->left()->representation().IsInteger32()); |
+ ASSERT(instr->right()->representation().IsInteger32()); |
left = UseRegisterAtStart(instr->BetterLeftOperand()); |
right = UseOrConstantAtStart(instr->BetterRightOperand()); |
} else { |
@@ -1997,8 +1997,6 @@ LInstruction* LChunkBuilder::DoConstant(HConstant* instr) { |
} else if (r.IsDouble()) { |
LOperand* temp = TempRegister(); |
return DefineAsRegister(new(zone()) LConstantD(temp)); |
- } else if (r.IsExternal()) { |
- return DefineAsRegister(new(zone()) LConstantE); |
} else if (r.IsTagged()) { |
return DefineAsRegister(new(zone()) LConstantT); |
} else { |
@@ -2076,10 +2074,6 @@ LInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { |
LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { |
- if (instr->access().IsExternalMemory() && instr->access().offset() == 0) { |
- LOperand* obj = UseRegisterOrConstantAtStart(instr->object()); |
- return DefineFixed(new(zone()) LLoadNamedField(obj), rax); |
- } |
LOperand* obj = UseRegisterAtStart(instr->object()); |
return DefineAsRegister(new(zone()) LLoadNamedField(obj)); |
} |
@@ -2235,10 +2229,19 @@ LInstruction* LChunkBuilder::DoTransitionElementsKind( |
LTransitionElementsKind* result = |
new(zone()) LTransitionElementsKind(object, new_map_reg, temp_reg); |
return result; |
- } else { |
+ } else if (FLAG_compiled_transitions) { |
LTransitionElementsKind* result = |
new(zone()) LTransitionElementsKind(object, NULL, NULL); |
return AssignPointerMap(result); |
+ } else { |
+ LOperand* object = UseFixed(instr->object(), rax); |
+ LOperand* fixed_object_reg = FixedTemp(rdx); |
+ LOperand* new_map_reg = FixedTemp(rbx); |
+ LTransitionElementsKind* result = |
+ new(zone()) LTransitionElementsKind(object, |
+ new_map_reg, |
+ fixed_object_reg); |
+ return MarkAsCall(result, instr); |
} |
} |
@@ -2255,8 +2258,6 @@ LInstruction* LChunkBuilder::DoTrapAllocationMemento( |
LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { |
bool is_in_object = instr->access().IsInobject(); |
- bool is_external_location = instr->access().IsExternalMemory() && |
- instr->access().offset() == 0; |
bool needs_write_barrier = instr->NeedsWriteBarrier(); |
bool needs_write_barrier_for_map = !instr->transition().is_null() && |
instr->NeedsWriteBarrierForMap(); |
@@ -2266,11 +2267,6 @@ LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { |
obj = is_in_object |
? UseRegister(instr->object()) |
: UseTempRegister(instr->object()); |
- } else if (is_external_location) { |
- ASSERT(!is_in_object); |
- ASSERT(!needs_write_barrier); |
- ASSERT(!needs_write_barrier_for_map); |
- obj = UseRegisterOrConstant(instr->object()); |
} else { |
obj = needs_write_barrier_for_map |
? UseRegister(instr->object()) |
@@ -2284,8 +2280,6 @@ LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { |
LOperand* val; |
if (needs_write_barrier) { |
val = UseTempRegister(instr->value()); |
- } else if (is_external_location) { |
- val = UseFixed(instr->value(), rax); |
} else if (can_be_constant) { |
val = UseRegisterOrConstant(instr->value()); |
} else if (FLAG_track_fields && instr->field_representation().IsSmi()) { |