| 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);
|
| }
|
|
|