Index: src/arm/lithium-arm.cc |
diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc |
index 84959397b6515024c32e813fc98dc4fff5a8c1c2..02250349362b859eb94b6abf8e00eb6666376736 100644 |
--- a/src/arm/lithium-arm.cc |
+++ b/src/arm/lithium-arm.cc |
@@ -391,6 +391,12 @@ void LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { |
} |
+void LTransitionElementsKind::PrintDataTo(StringStream* stream) { |
+ object()->PrintTo(stream); |
+ stream->Add(" %p -> %p", *original_map(), *transitioned_map()); |
+} |
+ |
+ |
LChunk::LChunk(CompilationInfo* info, HGraph* graph) |
: spill_slot_count_(0), |
info_(info), |
@@ -1970,6 +1976,26 @@ LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { |
} |
+LInstruction* LChunkBuilder::DoTransitionElementsKind( |
+ HTransitionElementsKind* instr) { |
+ if (instr->original_map()->elements_kind() == FAST_SMI_ONLY_ELEMENTS && |
+ instr->transitioned_map()->elements_kind() == FAST_ELEMENTS) { |
+ LOperand* object = UseRegister(instr->object()); |
+ LOperand* new_map_reg = TempRegister(); |
+ LTransitionElementsKind* result = |
+ new LTransitionElementsKind(object, new_map_reg, NULL); |
+ return DefineSameAsFirst(result); |
+ } else { |
+ LOperand* object = UseFixed(instr->object(), r0); |
+ LOperand* fixed_object_reg = FixedTemp(r2); |
+ LOperand* new_map_reg = FixedTemp(r3); |
+ LTransitionElementsKind* result = |
+ new LTransitionElementsKind(object, new_map_reg, fixed_object_reg); |
+ return MarkAsCall(DefineFixed(result, r0), instr); |
+ } |
+} |
+ |
+ |
LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { |
bool needs_write_barrier = instr->NeedsWriteBarrier(); |