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

Side by Side Diff: src/arm64/code-stubs-arm64.cc

Issue 1696043002: [runtime] Unify and simplify how frames are marked (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix merge problems Created 4 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_ARM64 5 #if V8_TARGET_ARCH_ARM64
6 6
7 #include "src/bootstrapper.h" 7 #include "src/bootstrapper.h"
8 #include "src/code-stubs.h" 8 #include "src/code-stubs.h"
9 #include "src/codegen.h" 9 #include "src/codegen.h"
10 #include "src/ic/handler-compiler.h" 10 #include "src/ic/handler-compiler.h"
(...skipping 1306 matching lines...) Expand 10 before | Expand all | Expand 10 after
1317 __ Fmov(fp_zero, 0.0); 1317 __ Fmov(fp_zero, 0.0);
1318 1318
1319 // Build an entry frame (see layout below). 1319 // Build an entry frame (see layout below).
1320 int marker = type(); 1320 int marker = type();
1321 int64_t bad_frame_pointer = -1L; // Bad frame pointer to fail if it is used. 1321 int64_t bad_frame_pointer = -1L; // Bad frame pointer to fail if it is used.
1322 __ Mov(x13, bad_frame_pointer); 1322 __ Mov(x13, bad_frame_pointer);
1323 __ Mov(x12, Smi::FromInt(marker)); 1323 __ Mov(x12, Smi::FromInt(marker));
1324 __ Mov(x11, ExternalReference(Isolate::kCEntryFPAddress, isolate())); 1324 __ Mov(x11, ExternalReference(Isolate::kCEntryFPAddress, isolate()));
1325 __ Ldr(x10, MemOperand(x11)); 1325 __ Ldr(x10, MemOperand(x11));
1326 1326
1327 __ Push(x13, xzr, x12, x10); 1327 __ Push(x13, x12, xzr, x10);
1328 // Set up fp. 1328 // Set up fp.
1329 __ Sub(fp, jssp, EntryFrameConstants::kCallerFPOffset); 1329 __ Sub(fp, jssp, EntryFrameConstants::kCallerFPOffset);
1330 1330
1331 // Push the JS entry frame marker. Also set js_entry_sp if this is the 1331 // Push the JS entry frame marker. Also set js_entry_sp if this is the
1332 // outermost JS call. 1332 // outermost JS call.
1333 Label non_outermost_js, done; 1333 Label non_outermost_js, done;
1334 ExternalReference js_entry_sp(Isolate::kJSEntrySPAddress, isolate()); 1334 ExternalReference js_entry_sp(Isolate::kJSEntrySPAddress, isolate());
1335 __ Mov(x10, ExternalReference(js_entry_sp)); 1335 __ Mov(x10, ExternalReference(js_entry_sp));
1336 __ Ldr(x11, MemOperand(x10)); 1336 __ Ldr(x11, MemOperand(x10));
1337 __ Cbnz(x11, &non_outermost_js); 1337 __ Cbnz(x11, &non_outermost_js);
(...skipping 2319 matching lines...) Expand 10 before | Expand all | Expand 10 after
3657 3657
3658 __ Bind(&skip_to_incremental_compacting); 3658 __ Bind(&skip_to_incremental_compacting);
3659 GenerateIncremental(masm, INCREMENTAL_COMPACTION); 3659 GenerateIncremental(masm, INCREMENTAL_COMPACTION);
3660 } 3660 }
3661 3661
3662 3662
3663 void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { 3663 void StubFailureTrampolineStub::Generate(MacroAssembler* masm) {
3664 CEntryStub ces(isolate(), 1, kSaveFPRegs); 3664 CEntryStub ces(isolate(), 1, kSaveFPRegs);
3665 __ Call(ces.GetCode(), RelocInfo::CODE_TARGET); 3665 __ Call(ces.GetCode(), RelocInfo::CODE_TARGET);
3666 int parameter_count_offset = 3666 int parameter_count_offset =
3667 StubFailureTrampolineFrame::kCallerStackParameterCountFrameOffset; 3667 StubFailureTrampolineFrameConstants::kArgumentsLengthOffset;
3668 __ Ldr(x1, MemOperand(fp, parameter_count_offset)); 3668 __ Ldr(x1, MemOperand(fp, parameter_count_offset));
3669 if (function_mode() == JS_FUNCTION_STUB_MODE) { 3669 if (function_mode() == JS_FUNCTION_STUB_MODE) {
3670 __ Add(x1, x1, 1); 3670 __ Add(x1, x1, 1);
3671 } 3671 }
3672 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); 3672 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE);
3673 __ Drop(x1); 3673 __ Drop(x1);
3674 // Return to IC Miss stub, continuation still on stack. 3674 // Return to IC Miss stub, continuation still on stack.
3675 __ Ret(); 3675 __ Ret();
3676 } 3676 }
3677 3677
(...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after
4947 // we reach the JavaScript frame for the function (similar to what the 4947 // we reach the JavaScript frame for the function (similar to what the
4948 // runtime fallback implementation does). So make x2 point to that 4948 // runtime fallback implementation does). So make x2 point to that
4949 // JavaScript frame. 4949 // JavaScript frame.
4950 { 4950 {
4951 Label loop, loop_entry; 4951 Label loop, loop_entry;
4952 __ Mov(x2, fp); 4952 __ Mov(x2, fp);
4953 __ B(&loop_entry); 4953 __ B(&loop_entry);
4954 __ Bind(&loop); 4954 __ Bind(&loop);
4955 __ Ldr(x2, MemOperand(x2, StandardFrameConstants::kCallerFPOffset)); 4955 __ Ldr(x2, MemOperand(x2, StandardFrameConstants::kCallerFPOffset));
4956 __ Bind(&loop_entry); 4956 __ Bind(&loop_entry);
4957 __ Ldr(x3, MemOperand(x2, StandardFrameConstants::kMarkerOffset)); 4957 __ Ldr(x3, MemOperand(x2, StandardFrameConstants::kFunctionOffset));
4958 __ Cmp(x3, x1); 4958 __ Cmp(x3, x1);
4959 __ B(ne, &loop); 4959 __ B(ne, &loop);
4960 } 4960 }
4961 4961
4962 // Check if we have rest parameters (only possible if we have an 4962 // Check if we have rest parameters (only possible if we have an
4963 // arguments adaptor frame below the function frame). 4963 // arguments adaptor frame below the function frame).
4964 Label no_rest_parameters; 4964 Label no_rest_parameters;
4965 __ Ldr(x2, MemOperand(x2, StandardFrameConstants::kCallerFPOffset)); 4965 __ Ldr(x2, MemOperand(x2, CommonFrameConstants::kCallerFPOffset));
4966 __ Ldr(x3, MemOperand(x2, StandardFrameConstants::kContextOffset)); 4966 __ Ldr(x3, MemOperand(x2, CommonFrameConstants::kContextOrFrameTypeOffset));
4967 __ Cmp(x3, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); 4967 __ Cmp(x3, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
4968 __ B(ne, &no_rest_parameters); 4968 __ B(ne, &no_rest_parameters);
4969 4969
4970 // Check if the arguments adaptor frame contains more arguments than 4970 // Check if the arguments adaptor frame contains more arguments than
4971 // specified by the function's internal formal parameter count. 4971 // specified by the function's internal formal parameter count.
4972 Label rest_parameters; 4972 Label rest_parameters;
4973 __ Ldrsw(x0, UntagSmiMemOperand( 4973 __ Ldrsw(x0, UntagSmiMemOperand(
4974 x2, ArgumentsAdaptorFrameConstants::kLengthOffset)); 4974 x2, ArgumentsAdaptorFrameConstants::kLengthOffset));
4975 __ Ldr(x1, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset)); 4975 __ Ldr(x1, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset));
4976 __ Ldrsw( 4976 __ Ldrsw(
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
5112 Register recv_arg = x3; 5112 Register recv_arg = x3;
5113 Register param_count = x7; 5113 Register param_count = x7;
5114 __ SmiUntag(param_count, param_count_smi); 5114 __ SmiUntag(param_count, param_count_smi);
5115 5115
5116 // Check if the calling frame is an arguments adaptor frame. 5116 // Check if the calling frame is an arguments adaptor frame.
5117 Register caller_fp = x11; 5117 Register caller_fp = x11;
5118 Register caller_ctx = x12; 5118 Register caller_ctx = x12;
5119 Label runtime; 5119 Label runtime;
5120 Label adaptor_frame, try_allocate; 5120 Label adaptor_frame, try_allocate;
5121 __ Ldr(caller_fp, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); 5121 __ Ldr(caller_fp, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
5122 __ Ldr(caller_ctx, MemOperand(caller_fp, 5122 __ Ldr(
5123 StandardFrameConstants::kContextOffset)); 5123 caller_ctx,
5124 MemOperand(caller_fp, CommonFrameConstants::kContextOrFrameTypeOffset));
5124 __ Cmp(caller_ctx, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); 5125 __ Cmp(caller_ctx, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
5125 __ B(eq, &adaptor_frame); 5126 __ B(eq, &adaptor_frame);
5126 5127
5127 // No adaptor, parameter count = argument count. 5128 // No adaptor, parameter count = argument count.
5128 5129
5129 // x1 function function pointer 5130 // x1 function function pointer
5130 // x2 arg_count_smi number of function arguments (smi) 5131 // x2 arg_count_smi number of function arguments (smi)
5131 // x3 recv_arg pointer to receiver arguments 5132 // x3 recv_arg pointer to receiver arguments
5132 // x4 mapped_params number of mapped params, min(params, args) (uninit) 5133 // x4 mapped_params number of mapped params, min(params, args) (uninit)
5133 // x7 param_count number of function parameters 5134 // x7 param_count number of function parameters
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
5376 // we reach the JavaScript frame for the function (similar to what the 5377 // we reach the JavaScript frame for the function (similar to what the
5377 // runtime fallback implementation does). So make x2 point to that 5378 // runtime fallback implementation does). So make x2 point to that
5378 // JavaScript frame. 5379 // JavaScript frame.
5379 { 5380 {
5380 Label loop, loop_entry; 5381 Label loop, loop_entry;
5381 __ Mov(x2, fp); 5382 __ Mov(x2, fp);
5382 __ B(&loop_entry); 5383 __ B(&loop_entry);
5383 __ Bind(&loop); 5384 __ Bind(&loop);
5384 __ Ldr(x2, MemOperand(x2, StandardFrameConstants::kCallerFPOffset)); 5385 __ Ldr(x2, MemOperand(x2, StandardFrameConstants::kCallerFPOffset));
5385 __ Bind(&loop_entry); 5386 __ Bind(&loop_entry);
5386 __ Ldr(x3, MemOperand(x2, StandardFrameConstants::kMarkerOffset)); 5387 __ Ldr(x3, MemOperand(x2, StandardFrameConstants::kFunctionOffset));
5387 __ Cmp(x3, x1); 5388 __ Cmp(x3, x1);
5388 __ B(ne, &loop); 5389 __ B(ne, &loop);
5389 } 5390 }
5390 5391
5391 // Check if we have an arguments adaptor frame below the function frame. 5392 // Check if we have an arguments adaptor frame below the function frame.
5392 Label arguments_adaptor, arguments_done; 5393 Label arguments_adaptor, arguments_done;
5393 __ Ldr(x3, MemOperand(x2, StandardFrameConstants::kCallerFPOffset)); 5394 __ Ldr(x3, MemOperand(x2, StandardFrameConstants::kCallerFPOffset));
5394 __ Ldr(x4, MemOperand(x3, StandardFrameConstants::kContextOffset)); 5395 __ Ldr(x4, MemOperand(x3, CommonFrameConstants::kContextOrFrameTypeOffset));
5395 __ Cmp(x4, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); 5396 __ Cmp(x4, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
5396 __ B(eq, &arguments_adaptor); 5397 __ B(eq, &arguments_adaptor);
5397 { 5398 {
5398 __ Ldr(x1, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset)); 5399 __ Ldr(x1, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset));
5399 __ Ldrsw(x0, FieldMemOperand( 5400 __ Ldrsw(x0, FieldMemOperand(
5400 x1, SharedFunctionInfo::kFormalParameterCountOffset)); 5401 x1, SharedFunctionInfo::kFormalParameterCountOffset));
5401 __ Add(x2, x2, Operand(x0, LSL, kPointerSizeLog2)); 5402 __ Add(x2, x2, Operand(x0, LSL, kPointerSizeLog2));
5402 __ Add(x2, x2, StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize); 5403 __ Add(x2, x2, StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize);
5403 } 5404 }
5404 __ B(&arguments_done); 5405 __ B(&arguments_done);
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after
5973 return_value_operand, NULL); 5974 return_value_operand, NULL);
5974 } 5975 }
5975 5976
5976 5977
5977 #undef __ 5978 #undef __
5978 5979
5979 } // namespace internal 5980 } // namespace internal
5980 } // namespace v8 5981 } // namespace v8
5981 5982
5982 #endif // V8_TARGET_ARCH_ARM64 5983 #endif // V8_TARGET_ARCH_ARM64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698