Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(424)

Unified Diff: src/arm64/code-stubs-arm64.cc

Issue 2645743002: [builtins] Port parameter and argument-related code stubs to CSA (Closed)
Patch Set: Review feedback Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/arm/interface-descriptors-arm.cc ('k') | src/arm64/interface-descriptors-arm64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/arm64/code-stubs-arm64.cc
diff --git a/src/arm64/code-stubs-arm64.cc b/src/arm64/code-stubs-arm64.cc
index a3ab71d61e40c05ff4510b15374492c3641cfc81..acba33f5459ad735d920242a5c678a6ae0cbfda6 100644
--- a/src/arm64/code-stubs-arm64.cc
+++ b/src/arm64/code-stubs-arm64.cc
@@ -3350,581 +3350,6 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
GenerateCase(masm, FAST_ELEMENTS);
}
-void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
- // ----------- S t a t e -------------
- // -- x1 : function
- // -- cp : context
- // -- fp : frame pointer
- // -- lr : return address
- // -----------------------------------
- __ AssertFunction(x1);
-
- // Make x2 point to the JavaScript frame.
- __ Mov(x2, fp);
- if (skip_stub_frame()) {
- // For Ignition we need to skip the handler/stub frame to reach the
- // JavaScript frame for the function.
- __ Ldr(x2, MemOperand(x2, StandardFrameConstants::kCallerFPOffset));
- }
- if (FLAG_debug_code) {
- Label ok;
- __ Ldr(x3, MemOperand(x2, StandardFrameConstants::kFunctionOffset));
- __ Cmp(x3, x1);
- __ B(eq, &ok);
- __ Abort(kInvalidFrameForFastNewRestArgumentsStub);
- __ Bind(&ok);
- }
-
- // Check if we have rest parameters (only possible if we have an
- // arguments adaptor frame below the function frame).
- Label no_rest_parameters;
- __ Ldr(x2, MemOperand(x2, CommonFrameConstants::kCallerFPOffset));
- __ Ldr(x3, MemOperand(x2, CommonFrameConstants::kContextOrFrameTypeOffset));
- __ Cmp(x3, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
- __ B(ne, &no_rest_parameters);
-
- // Check if the arguments adaptor frame contains more arguments than
- // specified by the function's internal formal parameter count.
- Label rest_parameters;
- __ Ldrsw(x0, UntagSmiMemOperand(
- x2, ArgumentsAdaptorFrameConstants::kLengthOffset));
- __ Ldr(x3, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset));
- __ Ldrsw(
- x3, FieldMemOperand(x3, SharedFunctionInfo::kFormalParameterCountOffset));
- __ Subs(x0, x0, x3);
- __ B(gt, &rest_parameters);
-
- // Return an empty rest parameter array.
- __ Bind(&no_rest_parameters);
- {
- // ----------- S t a t e -------------
- // -- cp : context
- // -- lr : return address
- // -----------------------------------
-
- // Allocate an empty rest parameter array.
- Label allocate, done_allocate;
- __ Allocate(JSArray::kSize, x0, x1, x2, &allocate, NO_ALLOCATION_FLAGS);
- __ Bind(&done_allocate);
-
- // Setup the rest parameter array in x0.
- __ LoadNativeContextSlot(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, x1);
- __ Str(x1, FieldMemOperand(x0, JSArray::kMapOffset));
- __ LoadRoot(x1, Heap::kEmptyFixedArrayRootIndex);
- __ Str(x1, FieldMemOperand(x0, JSArray::kPropertiesOffset));
- __ Str(x1, FieldMemOperand(x0, JSArray::kElementsOffset));
- __ Mov(x1, Smi::kZero);
- __ Str(x1, FieldMemOperand(x0, JSArray::kLengthOffset));
- STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize);
- __ Ret();
-
- // Fall back to %AllocateInNewSpace.
- __ Bind(&allocate);
- {
- FrameScope scope(masm, StackFrame::INTERNAL);
- __ Push(Smi::FromInt(JSArray::kSize));
- __ CallRuntime(Runtime::kAllocateInNewSpace);
- }
- __ B(&done_allocate);
- }
-
- __ Bind(&rest_parameters);
- {
- // Compute the pointer to the first rest parameter (skippping the receiver).
- __ Add(x2, x2, Operand(x0, LSL, kPointerSizeLog2));
- __ Add(x2, x2, StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize);
-
- // ----------- S t a t e -------------
- // -- cp : context
- // -- x0 : number of rest parameters
- // -- x1 : function
- // -- x2 : pointer to first rest parameters
- // -- lr : return address
- // -----------------------------------
-
- // Allocate space for the rest parameter array plus the backing store.
- Label allocate, done_allocate;
- __ Mov(x6, JSArray::kSize + FixedArray::kHeaderSize);
- __ Add(x6, x6, Operand(x0, LSL, kPointerSizeLog2));
- __ Allocate(x6, x3, x4, x5, &allocate, NO_ALLOCATION_FLAGS);
- __ Bind(&done_allocate);
-
- // Compute arguments.length in x6.
- __ SmiTag(x6, x0);
-
- // Setup the elements array in x3.
- __ LoadRoot(x1, Heap::kFixedArrayMapRootIndex);
- __ Str(x1, FieldMemOperand(x3, FixedArray::kMapOffset));
- __ Str(x6, FieldMemOperand(x3, FixedArray::kLengthOffset));
- __ Add(x4, x3, FixedArray::kHeaderSize);
- {
- Label loop, done_loop;
- __ Add(x0, x4, Operand(x0, LSL, kPointerSizeLog2));
- __ Bind(&loop);
- __ Cmp(x4, x0);
- __ B(eq, &done_loop);
- __ Ldr(x5, MemOperand(x2, 0 * kPointerSize));
- __ Str(x5, FieldMemOperand(x4, 0 * kPointerSize));
- __ Sub(x2, x2, Operand(1 * kPointerSize));
- __ Add(x4, x4, Operand(1 * kPointerSize));
- __ B(&loop);
- __ Bind(&done_loop);
- }
-
- // Setup the rest parameter array in x0.
- __ LoadNativeContextSlot(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, x1);
- __ Str(x1, FieldMemOperand(x0, JSArray::kMapOffset));
- __ LoadRoot(x1, Heap::kEmptyFixedArrayRootIndex);
- __ Str(x1, FieldMemOperand(x0, JSArray::kPropertiesOffset));
- __ Str(x3, FieldMemOperand(x0, JSArray::kElementsOffset));
- __ Str(x6, FieldMemOperand(x0, JSArray::kLengthOffset));
- STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize);
- __ Ret();
-
- // Fall back to %AllocateInNewSpace (if not too big).
- Label too_big_for_new_space;
- __ Bind(&allocate);
- __ Cmp(x6, Operand(kMaxRegularHeapObjectSize));
- __ B(gt, &too_big_for_new_space);
- {
- FrameScope scope(masm, StackFrame::INTERNAL);
- __ SmiTag(x0);
- __ SmiTag(x6);
- __ Push(x0, x2, x6);
- __ CallRuntime(Runtime::kAllocateInNewSpace);
- __ Mov(x3, x0);
- __ Pop(x2, x0);
- __ SmiUntag(x0);
- }
- __ B(&done_allocate);
-
- // Fall back to %NewRestParameter.
- __ Bind(&too_big_for_new_space);
- __ Push(x1);
- __ TailCallRuntime(Runtime::kNewRestParameter);
- }
-}
-
-
-void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) {
- // ----------- S t a t e -------------
- // -- x1 : function
- // -- cp : context
- // -- fp : frame pointer
- // -- lr : return address
- // -----------------------------------
- __ AssertFunction(x1);
-
- // Make x6 point to the JavaScript frame.
- __ Mov(x6, fp);
- if (skip_stub_frame()) {
- // For Ignition we need to skip the handler/stub frame to reach the
- // JavaScript frame for the function.
- __ Ldr(x6, MemOperand(x6, StandardFrameConstants::kCallerFPOffset));
- }
- if (FLAG_debug_code) {
- Label ok;
- __ Ldr(x3, MemOperand(x6, StandardFrameConstants::kFunctionOffset));
- __ Cmp(x3, x1);
- __ B(eq, &ok);
- __ Abort(kInvalidFrameForFastNewRestArgumentsStub);
- __ Bind(&ok);
- }
-
- // TODO(bmeurer): Cleanup to match the FastNewStrictArgumentsStub.
- __ Ldr(x2, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset));
- __ Ldrsw(
- x2, FieldMemOperand(x2, SharedFunctionInfo::kFormalParameterCountOffset));
- __ Add(x3, x6, Operand(x2, LSL, kPointerSizeLog2));
- __ Add(x3, x3, Operand(StandardFrameConstants::kCallerSPOffset));
- __ SmiTag(x2);
-
- // x1 : function
- // x2 : number of parameters (tagged)
- // x3 : parameters pointer
- // x6 : JavaScript frame pointer
- //
- // Returns pointer to result object in x0.
-
- // Make an untagged copy of the parameter count.
- // Note: arg_count_smi is an alias of param_count_smi.
- Register function = x1;
- Register arg_count_smi = x2;
- Register param_count_smi = x2;
- Register recv_arg = x3;
- Register param_count = x7;
- __ SmiUntag(param_count, param_count_smi);
-
- // Check if the calling frame is an arguments adaptor frame.
- Register caller_fp = x11;
- Register caller_ctx = x12;
- Label runtime;
- Label adaptor_frame, try_allocate;
- __ Ldr(caller_fp, MemOperand(x6, StandardFrameConstants::kCallerFPOffset));
- __ Ldr(
- caller_ctx,
- MemOperand(caller_fp, CommonFrameConstants::kContextOrFrameTypeOffset));
- __ Cmp(caller_ctx, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
- __ B(eq, &adaptor_frame);
-
- // No adaptor, parameter count = argument count.
-
- // x1 function function pointer
- // x2 arg_count_smi number of function arguments (smi)
- // x3 recv_arg pointer to receiver arguments
- // x4 mapped_params number of mapped params, min(params, args) (uninit)
- // x7 param_count number of function parameters
- // x11 caller_fp caller's frame pointer
- // x14 arg_count number of function arguments (uninit)
-
- Register arg_count = x14;
- Register mapped_params = x4;
- __ Mov(arg_count, param_count);
- __ Mov(mapped_params, param_count);
- __ B(&try_allocate);
-
- // We have an adaptor frame. Patch the parameters pointer.
- __ Bind(&adaptor_frame);
- __ Ldr(arg_count_smi,
- MemOperand(caller_fp,
- ArgumentsAdaptorFrameConstants::kLengthOffset));
- __ SmiUntag(arg_count, arg_count_smi);
- __ Add(x10, caller_fp, Operand(arg_count, LSL, kPointerSizeLog2));
- __ Add(recv_arg, x10, StandardFrameConstants::kCallerSPOffset);
-
- // Compute the mapped parameter count = min(param_count, arg_count)
- __ Cmp(param_count, arg_count);
- __ Csel(mapped_params, param_count, arg_count, lt);
-
- __ Bind(&try_allocate);
-
- // x0 alloc_obj pointer to allocated objects: param map, backing
- // store, arguments (uninit)
- // x1 function function pointer
- // x2 arg_count_smi number of function arguments (smi)
- // x3 recv_arg pointer to receiver arguments
- // x4 mapped_params number of mapped parameters, min(params, args)
- // x7 param_count number of function parameters
- // x10 size size of objects to allocate (uninit)
- // x14 arg_count number of function arguments
-
- // Compute the size of backing store, parameter map, and arguments object.
- // 1. Parameter map, has two extra words containing context and backing
- // store.
- const int kParameterMapHeaderSize =
- FixedArray::kHeaderSize + 2 * kPointerSize;
-
- // Calculate the parameter map size, assuming it exists.
- Register size = x10;
- __ Mov(size, Operand(mapped_params, LSL, kPointerSizeLog2));
- __ Add(size, size, kParameterMapHeaderSize);
-
- // If there are no mapped parameters, set the running size total to zero.
- // Otherwise, use the parameter map size calculated earlier.
- __ Cmp(mapped_params, 0);
- __ CzeroX(size, eq);
-
- // 2. Add the size of the backing store and arguments object.
- __ Add(size, size, Operand(arg_count, LSL, kPointerSizeLog2));
- __ Add(size, size, FixedArray::kHeaderSize + JSSloppyArgumentsObject::kSize);
-
- // Do the allocation of all three objects in one go. Assign this to x0, as it
- // will be returned to the caller.
- Register alloc_obj = x0;
- __ Allocate(size, alloc_obj, x11, x12, &runtime, NO_ALLOCATION_FLAGS);
-
- // Get the arguments boilerplate from the current (global) context.
-
- // x0 alloc_obj pointer to allocated objects (param map, backing
- // store, arguments)
- // x1 function function pointer
- // x2 arg_count_smi number of function arguments (smi)
- // x3 recv_arg pointer to receiver arguments
- // x4 mapped_params number of mapped parameters, min(params, args)
- // x7 param_count number of function parameters
- // x11 sloppy_args_map offset to args (or aliased args) map (uninit)
- // x14 arg_count number of function arguments
-
- Register global_ctx = x10;
- Register sloppy_args_map = x11;
- Register aliased_args_map = x10;
- __ Ldr(global_ctx, NativeContextMemOperand());
-
- __ Ldr(sloppy_args_map,
- ContextMemOperand(global_ctx, Context::SLOPPY_ARGUMENTS_MAP_INDEX));
- __ Ldr(
- aliased_args_map,
- ContextMemOperand(global_ctx, Context::FAST_ALIASED_ARGUMENTS_MAP_INDEX));
- __ Cmp(mapped_params, 0);
- __ CmovX(sloppy_args_map, aliased_args_map, ne);
-
- // Copy the JS object part.
- __ Str(sloppy_args_map, FieldMemOperand(alloc_obj, JSObject::kMapOffset));
- __ LoadRoot(x10, Heap::kEmptyFixedArrayRootIndex);
- __ Str(x10, FieldMemOperand(alloc_obj, JSObject::kPropertiesOffset));
- __ Str(x10, FieldMemOperand(alloc_obj, JSObject::kElementsOffset));
-
- // Set up the callee in-object property.
- __ AssertNotSmi(function);
- __ Str(function,
- FieldMemOperand(alloc_obj, JSSloppyArgumentsObject::kCalleeOffset));
-
- // Use the length and set that as an in-object property.
- __ Str(arg_count_smi,
- FieldMemOperand(alloc_obj, JSSloppyArgumentsObject::kLengthOffset));
-
- // Set up the elements pointer in the allocated arguments object.
- // If we allocated a parameter map, "elements" will point there, otherwise
- // it will point to the backing store.
-
- // x0 alloc_obj pointer to allocated objects (param map, backing
- // store, arguments)
- // x1 function function pointer
- // x2 arg_count_smi number of function arguments (smi)
- // x3 recv_arg pointer to receiver arguments
- // x4 mapped_params number of mapped parameters, min(params, args)
- // x5 elements pointer to parameter map or backing store (uninit)
- // x6 backing_store pointer to backing store (uninit)
- // x7 param_count number of function parameters
- // x14 arg_count number of function arguments
-
- Register elements = x5;
- __ Add(elements, alloc_obj, JSSloppyArgumentsObject::kSize);
- __ Str(elements, FieldMemOperand(alloc_obj, JSObject::kElementsOffset));
-
- // Initialize parameter map. If there are no mapped arguments, we're done.
- Label skip_parameter_map;
- __ Cmp(mapped_params, 0);
- // Set up backing store address, because it is needed later for filling in
- // the unmapped arguments.
- Register backing_store = x6;
- __ CmovX(backing_store, elements, eq);
- __ B(eq, &skip_parameter_map);
-
- __ LoadRoot(x10, Heap::kSloppyArgumentsElementsMapRootIndex);
- __ Str(x10, FieldMemOperand(elements, FixedArray::kMapOffset));
- __ Add(x10, mapped_params, 2);
- __ SmiTag(x10);
- __ Str(x10, FieldMemOperand(elements, FixedArray::kLengthOffset));
- __ Str(cp, FieldMemOperand(elements,
- FixedArray::kHeaderSize + 0 * kPointerSize));
- __ Add(x10, elements, Operand(mapped_params, LSL, kPointerSizeLog2));
- __ Add(x10, x10, kParameterMapHeaderSize);
- __ Str(x10, FieldMemOperand(elements,
- FixedArray::kHeaderSize + 1 * kPointerSize));
-
- // Copy the parameter slots and the holes in the arguments.
- // We need to fill in mapped_parameter_count slots. Then index the context,
- // where parameters are stored in reverse order, at:
- //
- // MIN_CONTEXT_SLOTS .. MIN_CONTEXT_SLOTS + parameter_count - 1
- //
- // The mapped parameter thus needs to get indices:
- //
- // MIN_CONTEXT_SLOTS + parameter_count - 1 ..
- // MIN_CONTEXT_SLOTS + parameter_count - mapped_parameter_count
- //
- // We loop from right to left.
-
- // x0 alloc_obj pointer to allocated objects (param map, backing
- // store, arguments)
- // x1 function function pointer
- // x2 arg_count_smi number of function arguments (smi)
- // x3 recv_arg pointer to receiver arguments
- // x4 mapped_params number of mapped parameters, min(params, args)
- // x5 elements pointer to parameter map or backing store (uninit)
- // x6 backing_store pointer to backing store (uninit)
- // x7 param_count number of function parameters
- // x11 loop_count parameter loop counter (uninit)
- // x12 index parameter index (smi, uninit)
- // x13 the_hole hole value (uninit)
- // x14 arg_count number of function arguments
-
- Register loop_count = x11;
- Register index = x12;
- Register the_hole = x13;
- Label parameters_loop, parameters_test;
- __ Mov(loop_count, mapped_params);
- __ Add(index, param_count, static_cast<int>(Context::MIN_CONTEXT_SLOTS));
- __ Sub(index, index, mapped_params);
- __ SmiTag(index);
- __ LoadRoot(the_hole, Heap::kTheHoleValueRootIndex);
- __ Add(backing_store, elements, Operand(loop_count, LSL, kPointerSizeLog2));
- __ Add(backing_store, backing_store, kParameterMapHeaderSize);
-
- __ B(&parameters_test);
-
- __ Bind(&parameters_loop);
- __ Sub(loop_count, loop_count, 1);
- __ Mov(x10, Operand(loop_count, LSL, kPointerSizeLog2));
- __ Add(x10, x10, kParameterMapHeaderSize - kHeapObjectTag);
- __ Str(index, MemOperand(elements, x10));
- __ Sub(x10, x10, kParameterMapHeaderSize - FixedArray::kHeaderSize);
- __ Str(the_hole, MemOperand(backing_store, x10));
- __ Add(index, index, Smi::FromInt(1));
- __ Bind(&parameters_test);
- __ Cbnz(loop_count, &parameters_loop);
-
- __ Bind(&skip_parameter_map);
- // Copy arguments header and remaining slots (if there are any.)
- __ LoadRoot(x10, Heap::kFixedArrayMapRootIndex);
- __ Str(x10, FieldMemOperand(backing_store, FixedArray::kMapOffset));
- __ Str(arg_count_smi, FieldMemOperand(backing_store,
- FixedArray::kLengthOffset));
-
- // x0 alloc_obj pointer to allocated objects (param map, backing
- // store, arguments)
- // x1 function function pointer
- // x2 arg_count_smi number of function arguments (smi)
- // x3 recv_arg pointer to receiver arguments
- // x4 mapped_params number of mapped parameters, min(params, args)
- // x6 backing_store pointer to backing store (uninit)
- // x14 arg_count number of function arguments
-
- Label arguments_loop, arguments_test;
- __ Mov(x10, mapped_params);
- __ Sub(recv_arg, recv_arg, Operand(x10, LSL, kPointerSizeLog2));
- __ B(&arguments_test);
-
- __ Bind(&arguments_loop);
- __ Sub(recv_arg, recv_arg, kPointerSize);
- __ Ldr(x11, MemOperand(recv_arg));
- __ Add(x12, backing_store, Operand(x10, LSL, kPointerSizeLog2));
- __ Str(x11, FieldMemOperand(x12, FixedArray::kHeaderSize));
- __ Add(x10, x10, 1);
-
- __ Bind(&arguments_test);
- __ Cmp(x10, arg_count);
- __ B(lt, &arguments_loop);
-
- __ Ret();
-
- // Do the runtime call to allocate the arguments object.
- __ Bind(&runtime);
- __ Push(function, recv_arg, arg_count_smi);
- __ TailCallRuntime(Runtime::kNewSloppyArguments);
-}
-
-
-void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
- // ----------- S t a t e -------------
- // -- x1 : function
- // -- cp : context
- // -- fp : frame pointer
- // -- lr : return address
- // -----------------------------------
- __ AssertFunction(x1);
-
- // Make x2 point to the JavaScript frame.
- __ Mov(x2, fp);
- if (skip_stub_frame()) {
- // For Ignition we need to skip the handler/stub frame to reach the
- // JavaScript frame for the function.
- __ Ldr(x2, MemOperand(x2, StandardFrameConstants::kCallerFPOffset));
- }
- if (FLAG_debug_code) {
- Label ok;
- __ Ldr(x3, MemOperand(x2, StandardFrameConstants::kFunctionOffset));
- __ Cmp(x3, x1);
- __ B(eq, &ok);
- __ Abort(kInvalidFrameForFastNewRestArgumentsStub);
- __ Bind(&ok);
- }
-
- // Check if we have an arguments adaptor frame below the function frame.
- Label arguments_adaptor, arguments_done;
- __ Ldr(x3, MemOperand(x2, StandardFrameConstants::kCallerFPOffset));
- __ Ldr(x4, MemOperand(x3, CommonFrameConstants::kContextOrFrameTypeOffset));
- __ Cmp(x4, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
- __ B(eq, &arguments_adaptor);
- {
- __ Ldr(x4, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset));
- __ Ldrsw(x0, FieldMemOperand(
- x4, SharedFunctionInfo::kFormalParameterCountOffset));
- __ Add(x2, x2, Operand(x0, LSL, kPointerSizeLog2));
- __ Add(x2, x2, StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize);
- }
- __ B(&arguments_done);
- __ Bind(&arguments_adaptor);
- {
- __ Ldrsw(x0, UntagSmiMemOperand(
- x3, ArgumentsAdaptorFrameConstants::kLengthOffset));
- __ Add(x2, x3, Operand(x0, LSL, kPointerSizeLog2));
- __ Add(x2, x2, StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize);
- }
- __ Bind(&arguments_done);
-
- // ----------- S t a t e -------------
- // -- cp : context
- // -- x0 : number of rest parameters
- // -- x1 : function
- // -- x2 : pointer to first rest parameters
- // -- lr : return address
- // -----------------------------------
-
- // Allocate space for the strict arguments object plus the backing store.
- Label allocate, done_allocate;
- __ Mov(x6, JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize);
- __ Add(x6, x6, Operand(x0, LSL, kPointerSizeLog2));
- __ Allocate(x6, x3, x4, x5, &allocate, NO_ALLOCATION_FLAGS);
- __ Bind(&done_allocate);
-
- // Compute arguments.length in x6.
- __ SmiTag(x6, x0);
-
- // Setup the elements array in x3.
- __ LoadRoot(x1, Heap::kFixedArrayMapRootIndex);
- __ Str(x1, FieldMemOperand(x3, FixedArray::kMapOffset));
- __ Str(x6, FieldMemOperand(x3, FixedArray::kLengthOffset));
- __ Add(x4, x3, FixedArray::kHeaderSize);
- {
- Label loop, done_loop;
- __ Add(x0, x4, Operand(x0, LSL, kPointerSizeLog2));
- __ Bind(&loop);
- __ Cmp(x4, x0);
- __ B(eq, &done_loop);
- __ Ldr(x5, MemOperand(x2, 0 * kPointerSize));
- __ Str(x5, FieldMemOperand(x4, 0 * kPointerSize));
- __ Sub(x2, x2, Operand(1 * kPointerSize));
- __ Add(x4, x4, Operand(1 * kPointerSize));
- __ B(&loop);
- __ Bind(&done_loop);
- }
-
- // Setup the strict arguments object in x0.
- __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, x1);
- __ Str(x1, FieldMemOperand(x0, JSStrictArgumentsObject::kMapOffset));
- __ LoadRoot(x1, Heap::kEmptyFixedArrayRootIndex);
- __ Str(x1, FieldMemOperand(x0, JSStrictArgumentsObject::kPropertiesOffset));
- __ Str(x3, FieldMemOperand(x0, JSStrictArgumentsObject::kElementsOffset));
- __ Str(x6, FieldMemOperand(x0, JSStrictArgumentsObject::kLengthOffset));
- STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize);
- __ Ret();
-
- // Fall back to %AllocateInNewSpace (if not too big).
- Label too_big_for_new_space;
- __ Bind(&allocate);
- __ Cmp(x6, Operand(kMaxRegularHeapObjectSize));
- __ B(gt, &too_big_for_new_space);
- {
- FrameScope scope(masm, StackFrame::INTERNAL);
- __ SmiTag(x0);
- __ SmiTag(x6);
- __ Push(x0, x2, x6);
- __ CallRuntime(Runtime::kAllocateInNewSpace);
- __ Mov(x3, x0);
- __ Pop(x2, x0);
- __ SmiUntag(x0);
- }
- __ B(&done_allocate);
-
- // Fall back to %NewStrictArguments.
- __ Bind(&too_big_for_new_space);
- __ Push(x1);
- __ TailCallRuntime(Runtime::kNewStrictArguments);
-}
-
-
// The number of register that CallApiFunctionAndReturn will need to save on
// the stack. The space for these registers need to be allocated in the
// ExitFrame before calling CallApiFunctionAndReturn.
« no previous file with comments | « src/arm/interface-descriptors-arm.cc ('k') | src/arm64/interface-descriptors-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698