Index: src/x64/macro-assembler-x64.cc |
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc |
index 684ec15b254cd0c96f08545a515519d01b9b28f6..670bd05028430688aaa6c23d92175b0d76069f34 100644 |
--- a/src/x64/macro-assembler-x64.cc |
+++ b/src/x64/macro-assembler-x64.cc |
@@ -4034,27 +4034,41 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) { |
} |
-void MacroAssembler::LoadGlobalInitialConstructedArrayMap( |
+void MacroAssembler::LoadTransitionedArrayMapConditional( |
+ ElementsKind expected_kind, |
+ ElementsKind transitioned_kind, |
+ Register map_in_out, |
+ Register scratch, |
+ Label* no_map_match) { |
+ // Load the global or builtins object from the current context. |
+ movq(scratch, Operand(rsi, Context::SlotOffset(Context::GLOBAL_INDEX))); |
+ movq(scratch, FieldOperand(scratch, GlobalObject::kGlobalContextOffset)); |
+ |
+ // Check that the function's map is the same as the expected cached map. |
+ int expected_index = |
+ Context::GetContextMapIndexFromElementsKind(expected_kind); |
+ cmpq(map_in_out, Operand(scratch, Context::SlotOffset(expected_index))); |
+ j(not_equal, no_map_match); |
+ |
+ // Use the transitioned cached map. |
+ int trans_index = |
+ Context::GetContextMapIndexFromElementsKind(transitioned_kind); |
+ movq(map_in_out, Operand(scratch, Context::SlotOffset(trans_index))); |
+} |
+ |
+ |
+void MacroAssembler::LoadInitialArrayMap( |
Register function_in, Register scratch, Register map_out) { |
ASSERT(!function_in.is(map_out)); |
Label done; |
movq(map_out, FieldOperand(function_in, |
JSFunction::kPrototypeOrInitialMapOffset)); |
if (!FLAG_smi_only_arrays) { |
- // Load the global or builtins object from the current context. |
- movq(scratch, Operand(rsi, Context::SlotOffset(Context::GLOBAL_INDEX))); |
- movq(scratch, FieldOperand(scratch, GlobalObject::kGlobalContextOffset)); |
- |
- // Check that the function's map is same as the cached map. |
- cmpq(map_out, |
- Operand(scratch, |
- Context::SlotOffset(Context::SMI_JS_ARRAY_MAP_INDEX))); |
- j(not_equal, &done); |
- |
- // Use the cached transitioned map. |
- movq(map_out, |
- Operand(scratch, |
- Context::SlotOffset(Context::OBJECT_JS_ARRAY_MAP_INDEX))); |
+ LoadTransitionedArrayMapConditional(FAST_SMI_ONLY_ELEMENTS, |
+ FAST_ELEMENTS, |
+ map_out, |
+ scratch, |
+ &done); |
} |
bind(&done); |
} |