summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/ia32/builtins-ia32.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/builtins/ia32/builtins-ia32.cc')
-rw-r--r--deps/v8/src/builtins/ia32/builtins-ia32.cc219
1 files changed, 118 insertions, 101 deletions
diff --git a/deps/v8/src/builtins/ia32/builtins-ia32.cc b/deps/v8/src/builtins/ia32/builtins-ia32.cc
index 589b5741b7..5e8ba2dee6 100644
--- a/deps/v8/src/builtins/ia32/builtins-ia32.cc
+++ b/deps/v8/src/builtins/ia32/builtins-ia32.cc
@@ -45,6 +45,8 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) {
namespace {
+constexpr int kReceiverOnStackSize = kSystemPointerSize;
+
enum class ArgumentsElementType {
kRaw, // Push arguments as they are.
kHandle // Dereference arguments before pushing.
@@ -99,7 +101,7 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
// InvokeFunction.
// Set up pointer to first argument (skip receiver).
- __ lea(esi, Operand(ebp, StandardFrameConstants::kCallerSPOffset +
+ __ lea(esi, Operand(ebp, StandardFrameConstants::kFixedFrameSizeAboveFp +
kSystemPointerSize));
// Copy arguments to the expression stack.
// esi: Pointer to start of arguments.
@@ -125,8 +127,8 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
}
// Remove caller arguments from the stack and return.
- __ DropArguments(edx, ecx, TurboAssembler::kCountIsSmi,
- TurboAssembler::kCountIncludesReceiver);
+ __ DropArguments(edx, ecx, MacroAssembler::kCountIsSmi,
+ MacroAssembler::kCountIncludesReceiver);
__ ret(0);
__ bind(&stack_overflow);
@@ -215,7 +217,7 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ movd(xmm0, eax);
// Set up pointer to first argument (skip receiver).
- __ lea(edi, Operand(ebp, StandardFrameConstants::kCallerSPOffset +
+ __ lea(edi, Operand(ebp, StandardFrameConstants::kFixedFrameSizeAboveFp +
kSystemPointerSize));
// Restore argument count.
@@ -280,8 +282,8 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ LeaveFrame(StackFrame::CONSTRUCT);
// Remove caller arguments from the stack and return.
- __ DropArguments(edx, ecx, TurboAssembler::kCountIsSmi,
- TurboAssembler::kCountIncludesReceiver);
+ __ DropArguments(edx, ecx, MacroAssembler::kCountIsSmi,
+ MacroAssembler::kCountIncludesReceiver);
__ ret(0);
// Otherwise we do a smi check and fall through to check if the return value
@@ -369,8 +371,8 @@ void Generate_JSEntryVariant(MacroAssembler* masm, StackFrame::Type type,
// Clear c_entry_fp, now we've pushed its previous value to the stack.
// If the c_entry_fp is not already zero and we don't clear it, the
- // SafeStackFrameIterator will assume we are executing C++ and miss the JS
- // frames on top.
+ // StackFrameIteratorForProfiler will assume we are executing C++ and miss the
+ // JS frames on top.
__ mov(__ ExternalReferenceAsOperand(c_entry_fp, edi), Immediate(0));
// Store the context address in the previously-reserved slot.
@@ -573,7 +575,8 @@ static void GetSharedFunctionInfoBytecodeOrBaseline(MacroAssembler* masm,
Label done;
__ LoadMap(scratch1, sfi_data);
- __ CmpInstanceType(scratch1, CODET_TYPE);
+#ifndef V8_JITLESS
+ __ CmpInstanceType(scratch1, CODE_TYPE);
if (v8_flags.debug_code) {
Label not_baseline;
__ j(not_equal, &not_baseline);
@@ -583,6 +586,7 @@ static void GetSharedFunctionInfoBytecodeOrBaseline(MacroAssembler* masm,
} else {
__ j(equal, is_baseline);
}
+#endif // !V8_JITLESS
__ CmpInstanceType(scratch1, INTERPRETER_DATA_TYPE);
__ j(not_equal, &done, Label::kNear);
@@ -689,7 +693,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ bind(&is_baseline);
__ Pop(eax);
- __ CmpObjectType(ecx, CODET_TYPE, ecx);
+ __ CmpObjectType(ecx, CODE_TYPE, ecx);
__ Assert(equal, AbortReason::kMissingBytecodeArray);
__ bind(&ok);
@@ -768,8 +772,8 @@ static void LeaveInterpreterFrame(MacroAssembler* masm, Register scratch1,
__ leave();
// Drop receiver + arguments.
- __ DropArguments(params_size, scratch2, TurboAssembler::kCountIsBytes,
- TurboAssembler::kCountIncludesReceiver);
+ __ DropArguments(params_size, scratch2, MacroAssembler::kCountIsBytes,
+ MacroAssembler::kCountIncludesReceiver);
}
// Advance the current bytecode offset. This simulates what all bytecode
@@ -893,8 +897,6 @@ void ResetFeedbackVectorOsrUrgency(MacroAssembler* masm,
// frame-constants.h for its layout.
void Builtins::Generate_InterpreterEntryTrampoline(
MacroAssembler* masm, InterpreterEntryTrampolineMode mode) {
- Register closure = edi;
-
__ movd(xmm0, eax); // Spill actual argument count.
// The bytecode array could have been flushed from the shared function info,
@@ -909,6 +911,8 @@ void Builtins::Generate_InterpreterEntryTrampoline(
__ CmpObjectType(ecx, BYTECODE_ARRAY_TYPE, eax);
__ j(not_equal, &compile_lazy);
+#ifndef V8_JITLESS
+ Register closure = edi;
Register feedback_vector = ecx;
Label push_stack_frame;
// Load feedback vector and check if it is valid. If valid, check for
@@ -946,6 +950,12 @@ void Builtins::Generate_InterpreterEntryTrampoline(
// MANUAL indicates that the scope shouldn't actually generate code to set
// up the frame (that is done below).
__ bind(&push_stack_frame);
+#else
+ // Note: By omitting the above code in jitless mode we also disable:
+ // - kFlagsLogNextExecution: only used for logging/profiling; and
+ // - kInvocationCountOffset: only used for tiering heuristics and code
+ // coverage.
+#endif // !V8_JITLESS
FrameScope frame_scope(masm, StackFrame::MANUAL);
__ push(ebp); // Caller's frame pointer.
__ mov(ebp, esp);
@@ -1107,6 +1117,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
__ jmp(&after_stack_check_interrupt);
+#ifndef V8_JITLESS
__ bind(&flags_need_processing);
{
// Restore actual argument count.
@@ -1154,6 +1165,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
__ movd(eax, xmm0); // Recover argument count.
__ GenerateTailCallToReturnedCode(Runtime::kInstallBaselineCode);
}
+#endif // !V8_JITLESS
__ bind(&stack_overflow);
__ CallRuntime(Runtime::kThrowStackOverflow);
@@ -1419,7 +1431,7 @@ static void Generate_InterpreterEnterBytecode(MacroAssembler* masm) {
__ mov(scratch,
FieldOperand(scratch, InterpreterData::kInterpreterTrampolineOffset));
- __ add(scratch, Immediate(Code::kHeaderSize - kHeapObjectTag));
+ __ LoadCodeEntry(scratch, scratch);
__ jmp(&trampoline_loaded, Label::kNear);
__ bind(&builtin_trampoline);
@@ -1525,6 +1537,7 @@ void Builtins::Generate_InterpreterEnterAtNextBytecode(MacroAssembler* masm) {
void Builtins::Generate_InterpreterEnterAtBytecode(MacroAssembler* masm) {
Generate_InterpreterEnterBytecode(masm);
}
+
// static
void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
auto descriptor =
@@ -1810,8 +1823,8 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
}
__ bind(&no_this_arg);
__ DropArgumentsAndPushNewReceiver(eax, edi, ecx,
- TurboAssembler::kCountIsInteger,
- TurboAssembler::kCountIncludesReceiver);
+ MacroAssembler::kCountIsInteger,
+ MacroAssembler::kCountIncludesReceiver);
// Restore receiver to edi.
__ movd(edi, xmm0);
@@ -1919,8 +1932,8 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) {
__ movd(xmm0, edx);
__ DropArgumentsAndPushNewReceiver(eax, ecx, edx,
- TurboAssembler::kCountIsInteger,
- TurboAssembler::kCountIncludesReceiver);
+ MacroAssembler::kCountIsInteger,
+ MacroAssembler::kCountIncludesReceiver);
// Restore argumentsList.
__ movd(edx, xmm0);
@@ -1978,8 +1991,8 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) {
__ DropArgumentsAndPushNewReceiver(
eax, masm->RootAsOperand(RootIndex::kUndefinedValue), ecx,
- TurboAssembler::kCountIsInteger,
- TurboAssembler::kCountIncludesReceiver);
+ MacroAssembler::kCountIsInteger,
+ MacroAssembler::kCountIncludesReceiver);
// Restore argumentsList.
__ movd(ecx, xmm0);
@@ -2052,7 +2065,8 @@ void Generate_AllocateSpaceAndShiftExistingArguments(
} // namespace
// static
-// TODO(v8:11615): Observe Code::kMaxArguments in CallOrConstructVarargs
+// TODO(v8:11615): Observe InstructionStream::kMaxArguments in
+// CallOrConstructVarargs
void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
Handle<Code> code) {
// ----------- S t a t e -------------
@@ -2683,8 +2697,8 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
Label jump_to_optimized_code;
{
// If maybe_target_code is not null, no need to call into runtime. A
- // precondition here is: if maybe_target_code is a Code object, it must NOT
- // be marked_for_deoptimization (callers must ensure this).
+ // precondition here is: if maybe_target_code is a InstructionStream object,
+ // it must NOT be marked_for_deoptimization (callers must ensure this).
__ cmp(maybe_target_code, Immediate(0));
__ j(not_equal, &jump_to_optimized_code, Label::kNear);
}
@@ -2737,8 +2751,10 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
kHeapObjectTag));
__ SmiUntag(ecx);
- // Compute the target address = code_obj + header_size + osr_offset
- __ lea(eax, Operand(eax, ecx, times_1, Code::kHeaderSize - kHeapObjectTag));
+ __ LoadCodeEntry(eax, eax);
+
+ // Compute the target address = code_entry + osr_offset
+ __ add(eax, ecx);
Generate_OSREntry(masm, eax);
}
@@ -3004,8 +3020,11 @@ void Builtins::Generate_WasmOnStackReplace(MacroAssembler* masm) {
#endif // V8_ENABLE_WEBASSEMBLY
void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
- SaveFPRegsMode save_doubles, ArgvMode argv_mode,
- bool builtin_exit_frame) {
+ ArgvMode argv_mode, bool builtin_exit_frame) {
+ CHECK(result_size == 1 || result_size == 2);
+
+ using ER = ExternalReference;
+
// eax: number of arguments including receiver
// edx: pointer to C function
// ebp: frame pointer (restored after C call)
@@ -3026,32 +3045,27 @@ void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
kRuntimeCallFunctionRegister, kContextRegister,
kJSFunctionRegister, kRootRegister));
- // Reserve space on the stack for the three arguments passed to the call. If
- // result size is greater than can be returned in registers, also reserve
- // space for the hidden argument for the result location, and space for the
- // result itself.
- int arg_stack_space = 3;
+ static constexpr int kReservedStackSlots = 3;
+ __ EnterExitFrame(
+ kReservedStackSlots,
+ builtin_exit_frame ? StackFrame::BUILTIN_EXIT : StackFrame::EXIT, edi);
- // Enter the exit frame that transitions from JavaScript to C++.
+ // Set up argv in a callee-saved register. It is reused below so it must be
+ // retained across the C call.
+ static constexpr Register kArgvRegister = edi;
if (argv_mode == ArgvMode::kRegister) {
- DCHECK(save_doubles == SaveFPRegsMode::kIgnore);
- DCHECK(!builtin_exit_frame);
- __ EnterApiExitFrame(arg_stack_space, edi);
-
- // Move argc and argv into the correct registers.
- __ mov(esi, ecx);
- __ mov(edi, eax);
+ __ mov(kArgvRegister, ecx);
} else {
- __ EnterExitFrame(
- arg_stack_space, save_doubles == SaveFPRegsMode::kSave,
- builtin_exit_frame ? StackFrame::BUILTIN_EXIT : StackFrame::EXIT);
+ int offset =
+ StandardFrameConstants::kFixedFrameSizeAboveFp - kReceiverOnStackSize;
+ __ lea(kArgvRegister, Operand(ebp, eax, times_system_pointer_size, offset));
}
// edx: pointer to C function
// ebp: frame pointer (restored after C call)
// esp: stack pointer (restored after C call)
- // edi: number of arguments including receiver (C callee-saved)
- // esi: pointer to the first argument (C callee-saved)
+ // eax: number of arguments including receiver
+ // edi: pointer to the first argument (C callee-saved)
// Result returned in eax, or eax+edx if result size is 2.
@@ -3060,9 +3074,10 @@ void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
__ CheckStackAlignment();
}
// Call C function.
- __ mov(Operand(esp, 0 * kSystemPointerSize), edi); // argc.
- __ mov(Operand(esp, 1 * kSystemPointerSize), esi); // argv.
- __ Move(ecx, Immediate(ExternalReference::isolate_address(masm->isolate())));
+ static_assert(kReservedStackSlots == 3);
+ __ mov(Operand(esp, 0 * kSystemPointerSize), eax); // argc.
+ __ mov(Operand(esp, 1 * kSystemPointerSize), kArgvRegister); // argv.
+ __ Move(ecx, Immediate(ER::isolate_address(masm->isolate())));
__ mov(Operand(esp, 2 * kSystemPointerSize), ecx);
__ call(kRuntimeCallFunctionRegister);
@@ -3079,8 +3094,8 @@ void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
__ push(edx);
__ LoadRoot(edx, RootIndex::kTheHoleValue);
Label okay;
- ExternalReference pending_exception_address = ExternalReference::Create(
- IsolateAddressId::kPendingExceptionAddress, masm->isolate());
+ ER pending_exception_address =
+ ER::Create(IsolateAddressId::kPendingExceptionAddress, masm->isolate());
__ cmp(edx, __ ExternalReferenceAsOperand(pending_exception_address, ecx));
// Cannot use check here as it attempts to generate call into runtime.
__ j(equal, &okay, Label::kNear);
@@ -3089,35 +3104,37 @@ void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
__ pop(edx);
}
- // Exit the JavaScript to C++ exit frame.
- __ LeaveExitFrame(save_doubles == SaveFPRegsMode::kSave,
- argv_mode == ArgvMode::kStack);
+ __ LeaveExitFrame(esi);
+ if (argv_mode == ArgvMode::kStack) {
+ // Drop arguments and the receiver from the caller stack.
+ DCHECK(!AreAliased(esi, kArgvRegister));
+ __ PopReturnAddressTo(ecx);
+ __ lea(esp, Operand(kArgvRegister, kReceiverOnStackSize));
+ __ PushReturnAddressFrom(ecx);
+ }
__ ret(0);
// Handling of exception.
__ bind(&exception_returned);
- ExternalReference pending_handler_context_address = ExternalReference::Create(
+ ER pending_handler_context_address = ER::Create(
IsolateAddressId::kPendingHandlerContextAddress, masm->isolate());
- ExternalReference pending_handler_entrypoint_address =
- ExternalReference::Create(
- IsolateAddressId::kPendingHandlerEntrypointAddress, masm->isolate());
- ExternalReference pending_handler_fp_address = ExternalReference::Create(
- IsolateAddressId::kPendingHandlerFPAddress, masm->isolate());
- ExternalReference pending_handler_sp_address = ExternalReference::Create(
- IsolateAddressId::kPendingHandlerSPAddress, masm->isolate());
+ ER pending_handler_entrypoint_address = ER::Create(
+ IsolateAddressId::kPendingHandlerEntrypointAddress, masm->isolate());
+ ER pending_handler_fp_address =
+ ER::Create(IsolateAddressId::kPendingHandlerFPAddress, masm->isolate());
+ ER pending_handler_sp_address =
+ ER::Create(IsolateAddressId::kPendingHandlerSPAddress, masm->isolate());
// Ask the runtime for help to determine the handler. This will set eax to
// contain the current pending exception, don't clobber it.
- ExternalReference find_handler =
- ExternalReference::Create(Runtime::kUnwindAndFindExceptionHandler);
+ ER find_handler = ER::Create(Runtime::kUnwindAndFindExceptionHandler);
{
FrameScope scope(masm, StackFrame::MANUAL);
__ PrepareCallCFunction(3, eax);
__ mov(Operand(esp, 0 * kSystemPointerSize), Immediate(0)); // argc.
__ mov(Operand(esp, 1 * kSystemPointerSize), Immediate(0)); // argv.
- __ Move(esi,
- Immediate(ExternalReference::isolate_address(masm->isolate())));
+ __ Move(esi, Immediate(ER::isolate_address(masm->isolate())));
__ mov(Operand(esp, 2 * kSystemPointerSize), esi);
__ CallCFunction(find_handler, 3);
}
@@ -3137,8 +3154,8 @@ void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
__ bind(&skip);
// Clear c_entry_fp, like we do in `LeaveExitFrame`.
- ExternalReference c_entry_fp_address = ExternalReference::Create(
- IsolateAddressId::kCEntryFPAddress, masm->isolate());
+ ER c_entry_fp_address =
+ ER::Create(IsolateAddressId::kCEntryFPAddress, masm->isolate());
__ mov(__ ExternalReferenceAsOperand(c_entry_fp_address, esi), Immediate(0));
// Compute the handler entry address and jump to it.
@@ -3249,6 +3266,12 @@ Operand ApiParameterOperand(int index) {
return Operand(esp, index * kSystemPointerSize);
}
+Operand ExitFrameCallerStackSlotOperand(int index) {
+ return Operand(ebp,
+ (BuiltinExitFrameConstants::kFixedSlotCountAboveFp + index) *
+ kSystemPointerSize);
+}
+
// Prepares stack to put arguments (aligns and so on). Reserves
// space for return value if needed (assumes the return value is a handle).
// Arguments must be stored in ApiParameterOperand(0), ApiParameterOperand(1)
@@ -3256,7 +3279,7 @@ Operand ApiParameterOperand(int index) {
// stores the pointer to the reserved slot into esi.
void PrepareCallApiFunction(MacroAssembler* masm, int argc, Register scratch) {
ASM_CODE_COMMENT(masm);
- __ EnterApiExitFrame(argc, scratch);
+ __ EnterExitFrame(argc, StackFrame::EXIT, scratch);
if (v8_flags.debug_code) {
__ mov(esi, Immediate(base::bit_cast<int32_t>(kZapValue)));
}
@@ -3322,7 +3345,7 @@ void CallApiFunctionAndReturn(MacroAssembler* masm, Register function_address,
DCHECK_EQ(stack_space, 0);
__ mov(edx, *stack_space_operand);
}
- __ LeaveApiExitFrame();
+ __ LeaveExitFrame(esi);
// Check if the function scheduled an exception.
ExternalReference scheduled_exception_address =
@@ -3437,7 +3460,7 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
static_assert(FCA::kArgsLength == 6);
static_assert(FCA::kNewTargetIndex == 5);
static_assert(FCA::kDataIndex == 4);
- static_assert(FCA::kReturnValueOffset == 3);
+ static_assert(FCA::kReturnValueIndex == 3);
static_assert(FCA::kReturnValueDefaultValueIndex == 2);
static_assert(FCA::kIsolateIndex == 1);
static_assert(FCA::kHolderIndex == 0);
@@ -3509,14 +3532,8 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
__ mov(ApiParameterOperand(0), scratch);
ExternalReference thunk_ref = ExternalReference::invoke_function_callback();
-
- // There are two stack slots above the arguments we constructed on the stack:
- // the stored ebp (pushed by EnterApiExitFrame), and the return address.
- static constexpr int kStackSlotsAboveFCA = 2;
- Operand return_value_operand(
- ebp,
- (kStackSlotsAboveFCA + FCA::kReturnValueOffset) * kSystemPointerSize);
-
+ Operand return_value_operand =
+ ExitFrameCallerStackSlotOperand(FCA::kReturnValueIndex);
static constexpr int kUseStackSpaceOperand = 0;
Operand stack_space_operand = ApiParameterOperand(kApiArgc + 3);
CallApiFunctionAndReturn(masm, api_function_address, thunk_ref,
@@ -3527,14 +3544,15 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
void Builtins::Generate_CallApiGetter(MacroAssembler* masm) {
// Build v8::PropertyCallbackInfo::args_ array on the stack and push property
// name below the exit frame to make GC aware of them.
- static_assert(PropertyCallbackArguments::kShouldThrowOnErrorIndex == 0);
- static_assert(PropertyCallbackArguments::kHolderIndex == 1);
- static_assert(PropertyCallbackArguments::kIsolateIndex == 2);
- static_assert(PropertyCallbackArguments::kReturnValueDefaultValueIndex == 3);
- static_assert(PropertyCallbackArguments::kReturnValueOffset == 4);
- static_assert(PropertyCallbackArguments::kDataIndex == 5);
- static_assert(PropertyCallbackArguments::kThisIndex == 6);
- static_assert(PropertyCallbackArguments::kArgsLength == 7);
+ using PCA = PropertyCallbackArguments;
+ static_assert(PCA::kShouldThrowOnErrorIndex == 0);
+ static_assert(PCA::kHolderIndex == 1);
+ static_assert(PCA::kIsolateIndex == 2);
+ static_assert(PCA::kReturnValueDefaultValueIndex == 3);
+ static_assert(PCA::kReturnValueIndex == 4);
+ static_assert(PCA::kDataIndex == 5);
+ static_assert(PCA::kThisIndex == 6);
+ static_assert(PCA::kArgsLength == 7);
Register receiver = ApiGetterDescriptor::ReceiverRegister();
Register holder = ApiGetterDescriptor::HolderRegister();
@@ -3555,7 +3573,8 @@ void Builtins::Generate_CallApiGetter(MacroAssembler* masm) {
__ push(scratch); // Restore return address.
// v8::PropertyCallbackInfo::args_ array and name handle.
- const int kStackUnwindSpace = PropertyCallbackArguments::kArgsLength + 1;
+ const int kNameHandleStackSize = 1;
+ const int kStackUnwindSpace = PCA::kArgsLength + kNameHandleStackSize;
// Allocate v8::PropertyCallbackInfo object, arguments for callback and
// space for optional callback address parameter (in case CPU profiler is
@@ -3581,16 +3600,13 @@ void Builtins::Generate_CallApiGetter(MacroAssembler* masm) {
// Reserve space for optional callback address parameter.
Operand thunk_last_arg = ApiParameterOperand(2);
- ExternalReference thunk_ref =
- ExternalReference::invoke_accessor_getter_callback();
-
Register function_address = edx;
__ mov(function_address,
FieldOperand(callback, AccessorInfo::kMaybeRedirectedGetterOffset));
- // +3 is to skip prolog, return address and name handle.
- Operand return_value_operand(
- ebp,
- (PropertyCallbackArguments::kReturnValueOffset + 3) * kSystemPointerSize);
+ ExternalReference thunk_ref =
+ ExternalReference::invoke_accessor_getter_callback();
+ Operand return_value_operand = ExitFrameCallerStackSlotOperand(
+ PCA::kReturnValueIndex + kNameHandleStackSize);
Operand* const kUseStackSpaceConstant = nullptr;
CallApiFunctionAndReturn(masm, function_address, thunk_ref, thunk_last_arg,
kStackUnwindSpace, kUseStackSpaceConstant,
@@ -4036,7 +4052,8 @@ void Generate_DeoptimizationEntry(MacroAssembler* masm,
__ mov(Operand(esp, 0 * kSystemPointerSize), eax); // Function.
__ mov(Operand(esp, 1 * kSystemPointerSize),
Immediate(static_cast<int>(deopt_kind)));
- __ mov(Operand(esp, 2 * kSystemPointerSize), ecx); // Code address or 0.
+ __ mov(Operand(esp, 2 * kSystemPointerSize),
+ ecx); // InstructionStream address or 0.
__ mov(Operand(esp, 3 * kSystemPointerSize), edx); // Fp-to-sp delta.
__ Move(Operand(esp, 4 * kSystemPointerSize),
Immediate(ExternalReference::isolate_address(masm->isolate())));
@@ -4198,7 +4215,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
Register closure = eax;
__ mov(closure, MemOperand(ebp, StandardFrameConstants::kFunctionOffset));
- // Get the Code object from the shared function info.
+ // Get the InstructionStream object from the shared function info.
Register code_obj = esi;
__ mov(code_obj,
FieldOperand(closure, JSFunction::kSharedFunctionInfoOffset));
@@ -4209,7 +4226,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
// always have baseline code.
if (!is_osr) {
Label start_with_baseline;
- __ CmpObjectType(code_obj, CODET_TYPE, kInterpreterBytecodeOffsetRegister);
+ __ CmpObjectType(code_obj, CODE_TYPE, kInterpreterBytecodeOffsetRegister);
__ j(equal, &start_with_baseline);
// Start with bytecode as there is no baseline code.
@@ -4222,7 +4239,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
__ bind(&start_with_baseline);
} else if (v8_flags.debug_code) {
- __ CmpObjectType(code_obj, CODET_TYPE, kInterpreterBytecodeOffsetRegister);
+ __ CmpObjectType(code_obj, CODE_TYPE, kInterpreterBytecodeOffsetRegister);
__ Assert(equal, AbortReason::kExpectedBaselineData);
}
@@ -4294,8 +4311,8 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
kInterpreterBytecodeArrayRegister);
__ CallCFunction(get_baseline_pc, 3);
}
- __ lea(code_obj,
- FieldOperand(code_obj, kReturnRegister0, times_1, Code::kHeaderSize));
+ __ LoadCodeEntry(code_obj, code_obj);
+ __ add(code_obj, kReturnRegister0);
__ pop(kInterpreterAccumulatorRegister);
if (is_osr) {