diff options
Diffstat (limited to 'deps/v8/src/ia32/code-stubs-ia32.cc')
-rw-r--r-- | deps/v8/src/ia32/code-stubs-ia32.cc | 295 |
1 files changed, 106 insertions, 189 deletions
diff --git a/deps/v8/src/ia32/code-stubs-ia32.cc b/deps/v8/src/ia32/code-stubs-ia32.cc index 510b58e723..53b35a3a84 100644 --- a/deps/v8/src/ia32/code-stubs-ia32.cc +++ b/deps/v8/src/ia32/code-stubs-ia32.cc @@ -4,9 +4,10 @@ #if V8_TARGET_ARCH_IA32 +#include "src/code-stubs.h" +#include "src/api-arguments.h" #include "src/base/bits.h" #include "src/bootstrapper.h" -#include "src/code-stubs.h" #include "src/codegen.h" #include "src/ia32/code-stubs-ia32.h" #include "src/ia32/frames-ia32.h" @@ -84,6 +85,10 @@ void InternalArrayNoArgumentConstructorStub::InitializeDescriptor( InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, 0); } +void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { + Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; + descriptor->Initialize(eax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); +} void InternalArraySingleArgumentConstructorStub::InitializeDescriptor( CodeStubDescriptor* descriptor) { @@ -275,7 +280,7 @@ void DoubleToIStub::Generate(MacroAssembler* masm) { Immediate(static_cast<uint32_t>(Double::kSignificandMask >> 32))); __ add(result_reg, Immediate(static_cast<uint32_t>(Double::kHiddenBit >> 32))); - __ shrd(result_reg, scratch1); + __ shrd_cl(scratch1, result_reg); __ shr_cl(result_reg); __ test(ecx, Immediate(32)); __ cmov(not_equal, scratch1, result_reg); @@ -553,7 +558,8 @@ void MathPowStub::Generate(MacroAssembler* masm) { __ fstp(1); // 2^X // Bail out to runtime in case of exceptions in the status word. __ fnstsw_ax(); - __ test_b(eax, 0x5F); // We check for all but precision exception. + __ test_b(eax, + Immediate(0x5F)); // We check for all but precision exception. __ j(not_zero, &fast_power_failed, Label::kNear); __ fstp_d(Operand(esp, 0)); __ movsd(double_result, Operand(esp, 0)); @@ -665,34 +671,6 @@ void FunctionPrototypeStub::Generate(MacroAssembler* masm) { } -void LoadIndexedInterceptorStub::Generate(MacroAssembler* masm) { - // Return address is on the stack. - Label slow; - - Register receiver = LoadDescriptor::ReceiverRegister(); - Register key = LoadDescriptor::NameRegister(); - Register scratch = eax; - DCHECK(!scratch.is(receiver) && !scratch.is(key)); - - // Check that the key is an array index, that is Uint32. - __ test(key, Immediate(kSmiTagMask | kSmiSignMask)); - __ j(not_zero, &slow); - - // Everything is fine, call runtime. - __ pop(scratch); - __ push(receiver); // receiver - __ push(key); // key - __ push(scratch); // return address - - // Perform tail call to the entry. - __ TailCallRuntime(Runtime::kLoadElementWithInterceptor); - - __ bind(&slow); - PropertyAccessCompiler::TailCallBuiltin( - masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC)); -} - - void LoadIndexedStringStub::Generate(MacroAssembler* masm) { // Return address is on the stack. Label miss; @@ -1103,7 +1081,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { if (FLAG_debug_code) { // Assert that we do not have a cons or slice (indirect strings) here. // Sequential strings have already been ruled out. - __ test_b(ebx, kIsIndirectStringMask); + __ test_b(ebx, Immediate(kIsIndirectStringMask)); __ Assert(zero, kExternalStringExpectedButNotFound); } __ mov(eax, FieldOperand(eax, ExternalString::kResourceDataOffset)); @@ -1112,7 +1090,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { __ sub(eax, Immediate(SeqTwoByteString::kHeaderSize - kHeapObjectTag)); STATIC_ASSERT(kTwoByteStringTag == 0); // (8) Is the external string one byte? If yes, go to (5). - __ test_b(ebx, kStringEncodingMask); + __ test_b(ebx, Immediate(kStringEncodingMask)); __ j(not_zero, &seq_one_byte_string); // Go to (5). // eax: sequential subject string (or look-alike, external string) @@ -1237,13 +1215,13 @@ void CompareICStub::GenerateGeneric(MacroAssembler* masm) { __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset)); __ movzx_b(ecx, FieldOperand(ecx, Map::kInstanceTypeOffset)); // Call runtime on identical JSObjects. Otherwise return equal. - __ cmpb(ecx, static_cast<uint8_t>(FIRST_JS_RECEIVER_TYPE)); + __ cmpb(ecx, Immediate(FIRST_JS_RECEIVER_TYPE)); __ j(above_equal, &runtime_call, Label::kFar); // Call runtime on identical symbols since we need to throw a TypeError. - __ cmpb(ecx, static_cast<uint8_t>(SYMBOL_TYPE)); + __ cmpb(ecx, Immediate(SYMBOL_TYPE)); __ j(equal, &runtime_call, Label::kFar); // Call runtime on identical SIMD values since we must throw a TypeError. - __ cmpb(ecx, static_cast<uint8_t>(SIMD128_VALUE_TYPE)); + __ cmpb(ecx, Immediate(SIMD128_VALUE_TYPE)); __ j(equal, &runtime_call, Label::kFar); } __ Move(eax, Immediate(Smi::FromInt(EQUAL))); @@ -1389,7 +1367,7 @@ void CompareICStub::GenerateGeneric(MacroAssembler* masm) { // Non-strict equality. Objects are unequal if // they are both JSObjects and not undetectable, // and their pointers are different. - Label return_unequal, undetectable; + Label return_equal, return_unequal, undetectable; // At most one is a smi, so we can test for smi by adding the two. // A smi plus a heap object has the low bit set, a heap object plus // a heap object has the low bit clear. @@ -1397,16 +1375,16 @@ void CompareICStub::GenerateGeneric(MacroAssembler* masm) { STATIC_ASSERT(kSmiTagMask == 1); __ lea(ecx, Operand(eax, edx, times_1, 0)); __ test(ecx, Immediate(kSmiTagMask)); - __ j(not_zero, &runtime_call, Label::kNear); + __ j(not_zero, &runtime_call); __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset)); __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset)); __ test_b(FieldOperand(ebx, Map::kBitFieldOffset), - 1 << Map::kIsUndetectable); + Immediate(1 << Map::kIsUndetectable)); __ j(not_zero, &undetectable, Label::kNear); __ test_b(FieldOperand(ecx, Map::kBitFieldOffset), - 1 << Map::kIsUndetectable); + Immediate(1 << Map::kIsUndetectable)); __ j(not_zero, &return_unequal, Label::kNear); __ CmpInstanceType(ebx, FIRST_JS_RECEIVER_TYPE); @@ -1420,8 +1398,18 @@ void CompareICStub::GenerateGeneric(MacroAssembler* masm) { __ bind(&undetectable); __ test_b(FieldOperand(ecx, Map::kBitFieldOffset), - 1 << Map::kIsUndetectable); + Immediate(1 << Map::kIsUndetectable)); __ j(zero, &return_unequal, Label::kNear); + + // If both sides are JSReceivers, then the result is false according to + // the HTML specification, which says that only comparisons with null or + // undefined are affected by special casing for document.all. + __ CmpInstanceType(ebx, ODDBALL_TYPE); + __ j(zero, &return_equal, Label::kNear); + __ CmpInstanceType(ecx, ODDBALL_TYPE); + __ j(not_zero, &return_unequal, Label::kNear); + + __ bind(&return_equal); __ Move(eax, Immediate(EQUAL)); __ ret(0); // eax, edx were pushed } @@ -1980,8 +1968,9 @@ void JSEntryStub::Generate(MacroAssembler* masm) { // Push marker in two places. int marker = type(); - __ push(Immediate(Smi::FromInt(marker))); // context slot - __ push(Immediate(Smi::FromInt(marker))); // function slot + __ push(Immediate(Smi::FromInt(marker))); // marker + ExternalReference context_address(Isolate::kContextAddress, isolate()); + __ push(Operand::StaticVariable(context_address)); // context // Save callee-saved registers (C calling conventions). __ push(edi); __ push(esi); @@ -2110,9 +2099,14 @@ void InstanceOfStub::Generate(MacroAssembler* masm) { __ CmpObjectType(function, JS_FUNCTION_TYPE, function_map); __ j(not_equal, &slow_case); + // Go to the runtime if the function is not a constructor. + __ test_b(FieldOperand(function_map, Map::kBitFieldOffset), + Immediate(1 << Map::kIsConstructor)); + __ j(zero, &slow_case); + // Ensure that {function} has an instance prototype. __ test_b(FieldOperand(function_map, Map::kBitFieldOffset), - static_cast<uint8_t>(1 << Map::kHasNonInstancePrototype)); + Immediate(1 << Map::kHasNonInstancePrototype)); __ j(not_zero, &slow_case); // Get the "prototype" (or initial map) of the {function}. @@ -2146,7 +2140,7 @@ void InstanceOfStub::Generate(MacroAssembler* masm) { // Check if the object needs to be access checked. __ test_b(FieldOperand(object_map, Map::kBitFieldOffset), - 1 << Map::kIsAccessCheckNeeded); + Immediate(1 << Map::kIsAccessCheckNeeded)); __ j(not_zero, &fast_runtime_fallback, Label::kNear); // Check if the current object is a Proxy. __ CmpInstanceType(object_map, JS_PROXY_TYPE); @@ -2181,7 +2175,8 @@ void InstanceOfStub::Generate(MacroAssembler* masm) { __ Push(object); __ Push(function); __ PushReturnAddressFrom(scratch); - __ TailCallRuntime(Runtime::kInstanceOf); + __ TailCallRuntime(is_es6_instanceof() ? Runtime::kOrdinaryHasInstance + : Runtime::kInstanceOf); } @@ -2493,13 +2488,13 @@ void SubStringStub::Generate(MacroAssembler* masm) { Label two_byte_sequential, runtime_drop_two, sequential_string; STATIC_ASSERT(kExternalStringTag != 0); STATIC_ASSERT(kSeqStringTag == 0); - __ test_b(ebx, kExternalStringTag); + __ test_b(ebx, Immediate(kExternalStringTag)); __ j(zero, &sequential_string); // Handle external string. // Rule out short external strings. STATIC_ASSERT(kShortExternalStringTag != 0); - __ test_b(ebx, kShortExternalStringMask); + __ test_b(ebx, Immediate(kShortExternalStringMask)); __ j(not_zero, &runtime); __ mov(edi, FieldOperand(edi, ExternalString::kResourceDataOffset)); // Move the pointer so that offset-wise, it looks like a sequential string. @@ -2512,7 +2507,7 @@ void SubStringStub::Generate(MacroAssembler* masm) { __ push(edi); __ SmiUntag(ecx); STATIC_ASSERT((kOneByteStringTag & kStringEncodingMask) != 0); - __ test_b(ebx, kStringEncodingMask); + __ test_b(ebx, Immediate(kStringEncodingMask)); __ j(zero, &two_byte_sequential); // Sequential one byte string. Allocate the result. @@ -2601,23 +2596,21 @@ void ToNumberStub::Generate(MacroAssembler* masm) { __ Ret(); __ bind(¬_heap_number); - Label not_string, slow_string; + NonNumberToNumberStub stub(masm->isolate()); + __ TailCallStub(&stub); +} + +void NonNumberToNumberStub::Generate(MacroAssembler* masm) { + // The NonNumberToNumber stub takes one argument in eax. + __ AssertNotNumber(eax); + + Label not_string; __ CmpObjectType(eax, FIRST_NONSTRING_TYPE, edi); // eax: object // edi: object map __ j(above_equal, ¬_string, Label::kNear); - // Check if string has a cached array index. - __ test(FieldOperand(eax, String::kHashFieldOffset), - Immediate(String::kContainsCachedArrayIndexMask)); - __ j(not_zero, &slow_string, Label::kNear); - __ mov(eax, FieldOperand(eax, String::kHashFieldOffset)); - __ IndexFromHash(eax, eax); - __ Ret(); - __ bind(&slow_string); - __ pop(ecx); // Pop return address. - __ push(eax); // Push argument. - __ push(ecx); // Push return address. - __ TailCallRuntime(Runtime::kStringToNumber); + StringToNumberStub stub(masm->isolate()); + __ TailCallStub(&stub); __ bind(¬_string); Label not_oddball; @@ -2633,26 +2626,26 @@ void ToNumberStub::Generate(MacroAssembler* masm) { __ TailCallRuntime(Runtime::kToNumber); } +void StringToNumberStub::Generate(MacroAssembler* masm) { + // The StringToNumber stub takes one argument in eax. + __ AssertString(eax); -void ToLengthStub::Generate(MacroAssembler* masm) { - // The ToLength stub takes on argument in eax. - Label not_smi, positive_smi; - __ JumpIfNotSmi(eax, ¬_smi, Label::kNear); - STATIC_ASSERT(kSmiTag == 0); - __ test(eax, eax); - __ j(greater_equal, &positive_smi, Label::kNear); - __ xor_(eax, eax); - __ bind(&positive_smi); + // Check if string has a cached array index. + Label runtime; + __ test(FieldOperand(eax, String::kHashFieldOffset), + Immediate(String::kContainsCachedArrayIndexMask)); + __ j(not_zero, &runtime, Label::kNear); + __ mov(eax, FieldOperand(eax, String::kHashFieldOffset)); + __ IndexFromHash(eax, eax); __ Ret(); - __ bind(¬_smi); - __ pop(ecx); // Pop return address. - __ push(eax); // Push argument. - __ push(ecx); // Push return address. - __ TailCallRuntime(Runtime::kToLength); + __ bind(&runtime); + __ PopReturnAddressTo(ecx); // Pop return address. + __ Push(eax); // Push argument. + __ PushReturnAddressFrom(ecx); // Push return address. + __ TailCallRuntime(Runtime::kStringToNumber); } - void ToStringStub::Generate(MacroAssembler* masm) { // The ToString stub takes one argument in eax. Label is_number; @@ -2849,44 +2842,6 @@ void StringHelper::GenerateOneByteCharsCompareLoop( } -void StringCompareStub::Generate(MacroAssembler* masm) { - // ----------- S t a t e ------------- - // -- edx : left string - // -- eax : right string - // -- esp[0] : return address - // ----------------------------------- - __ AssertString(edx); - __ AssertString(eax); - - Label not_same; - __ cmp(edx, eax); - __ j(not_equal, ¬_same, Label::kNear); - __ Move(eax, Immediate(Smi::FromInt(EQUAL))); - __ IncrementCounter(isolate()->counters()->string_compare_native(), 1); - __ Ret(); - - __ bind(¬_same); - - // Check that both objects are sequential one-byte strings. - Label runtime; - __ JumpIfNotBothSequentialOneByteStrings(edx, eax, ecx, ebx, &runtime); - - // Compare flat one-byte strings. - __ IncrementCounter(isolate()->counters()->string_compare_native(), 1); - StringHelper::GenerateCompareFlatOneByteStrings(masm, edx, eax, ecx, ebx, - edi); - - // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) - // tagged as a small integer. - __ bind(&runtime); - __ PopReturnAddressTo(ecx); - __ Push(edx); - __ Push(eax); - __ PushReturnAddressFrom(ecx); - __ TailCallRuntime(Runtime::kStringCompare); -} - - void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- edx : left @@ -3217,13 +3172,20 @@ void CompareICStub::GenerateStrings(MacroAssembler* masm) { // Handle more complex cases in runtime. __ bind(&runtime); - __ pop(tmp1); // Return address. - __ push(left); - __ push(right); - __ push(tmp1); if (equality) { - __ TailCallRuntime(Runtime::kStringEquals); + { + FrameScope scope(masm, StackFrame::INTERNAL); + __ Push(left); + __ Push(right); + __ CallRuntime(Runtime::kStringEqual); + } + __ sub(eax, Immediate(masm->isolate()->factory()->true_value())); + __ Ret(); } else { + __ pop(tmp1); // Return address. + __ push(left); + __ push(right); + __ push(tmp1); __ TailCallRuntime(Runtime::kStringCompare); } @@ -3708,7 +3670,7 @@ void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { CEntryStub ces(isolate(), 1, kSaveFPRegs); __ call(ces.GetCode(), RelocInfo::CODE_TARGET); int parameter_count_offset = - StubFailureTrampolineFrame::kCallerStackParameterCountFrameOffset; + StubFailureTrampolineFrameConstants::kArgumentsLengthOffset; __ mov(ebx, MemOperand(ebp, parameter_count_offset)); masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); __ pop(ecx); @@ -4426,7 +4388,7 @@ static void CreateArrayDispatchOneArgument(MacroAssembler* masm, STATIC_ASSERT(FAST_HOLEY_DOUBLE_ELEMENTS == 5); // is the low bit set? If so, we are holey and that is good. - __ test_b(edx, 1); + __ test_b(edx, Immediate(1)); __ j(not_zero, &normal_sequence); } @@ -4875,7 +4837,7 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) { __ bind(&loop); __ mov(edx, Operand(edx, StandardFrameConstants::kCallerFPOffset)); __ bind(&loop_entry); - __ cmp(edi, Operand(edx, StandardFrameConstants::kMarkerOffset)); + __ cmp(edi, Operand(edx, StandardFrameConstants::kFunctionOffset)); __ j(not_equal, &loop); } @@ -4883,7 +4845,7 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) { // arguments adaptor frame below the function frame). Label no_rest_parameters; __ mov(ebx, Operand(edx, StandardFrameConstants::kCallerFPOffset)); - __ cmp(Operand(ebx, StandardFrameConstants::kContextOffset), + __ cmp(Operand(ebx, CommonFrameConstants::kContextOrFrameTypeOffset), Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); __ j(not_equal, &no_rest_parameters, Label::kNear); @@ -5026,7 +4988,7 @@ void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { // Check if the calling frame is an arguments adaptor frame. Label adaptor_frame, try_allocate, runtime; __ mov(ebx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); - __ mov(eax, Operand(ebx, StandardFrameConstants::kContextOffset)); + __ mov(eax, Operand(ebx, CommonFrameConstants::kContextOrFrameTypeOffset)); __ cmp(eax, Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); __ j(equal, &adaptor_frame, Label::kNear); @@ -5263,14 +5225,14 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) { __ bind(&loop); __ mov(edx, Operand(edx, StandardFrameConstants::kCallerFPOffset)); __ bind(&loop_entry); - __ cmp(edi, Operand(edx, StandardFrameConstants::kMarkerOffset)); + __ cmp(edi, Operand(edx, StandardFrameConstants::kFunctionOffset)); __ j(not_equal, &loop); } // Check if we have an arguments adaptor frame below the function frame. Label arguments_adaptor, arguments_done; __ mov(ebx, Operand(edx, StandardFrameConstants::kCallerFPOffset)); - __ cmp(Operand(ebx, StandardFrameConstants::kContextOffset), + __ cmp(Operand(ebx, CommonFrameConstants::kContextOrFrameTypeOffset), Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); __ j(equal, &arguments_adaptor, Label::kNear); { @@ -5570,7 +5532,7 @@ static void CallApiFunctionAndReturn(MacroAssembler* masm, Label profiler_disabled; Label end_profiler_check; __ mov(eax, Immediate(ExternalReference::is_profiling_address(isolate))); - __ cmpb(Operand(eax, 0), 0); + __ cmpb(Operand(eax, 0), Immediate(0)); __ j(zero, &profiler_disabled); // Additional parameter is the address of the actual getter function. @@ -5693,17 +5655,13 @@ static void CallApiFunctionAndReturn(MacroAssembler* masm, __ jmp(&leave_exit_frame); } -static void CallApiFunctionStubHelper(MacroAssembler* masm, - const ParameterCount& argc, - bool return_first_arg, - bool call_data_undefined, bool is_lazy) { +void CallApiCallbackStub::Generate(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- edi : callee // -- ebx : call_data // -- ecx : holder // -- edx : api_function_address // -- esi : context - // -- eax : number of arguments if argc is a register // -- // -- esp[0] : return address // -- esp[4] : last argument @@ -5730,17 +5688,9 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm, STATIC_ASSERT(FCA::kHolderIndex == 0); STATIC_ASSERT(FCA::kArgsLength == 7); - DCHECK(argc.is_immediate() || eax.is(argc.reg())); - - if (argc.is_immediate()) { - __ pop(return_address); - // context save. - __ push(context); - } else { - // pop return address and save context - __ xchg(context, Operand(esp, 0)); - return_address = context; - } + __ pop(return_address); + // context save. + __ push(context); // callee __ push(callee); @@ -5749,7 +5699,7 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm, __ push(call_data); Register scratch = call_data; - if (!call_data_undefined) { + if (!call_data_undefined()) { // return value __ push(Immediate(masm->isolate()->factory()->undefined_value())); // return value default @@ -5770,7 +5720,7 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm, // push return address __ push(return_address); - if (!is_lazy) { + if (!is_lazy()) { // load context from callee __ mov(context, FieldOperand(callee, JSFunction::kContextOffset)); } @@ -5789,27 +5739,13 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm, // FunctionCallbackInfo::implicit_args_. __ mov(ApiParameterOperand(2), scratch); - if (argc.is_immediate()) { - __ add(scratch, - Immediate((argc.immediate() + FCA::kArgsLength - 1) * kPointerSize)); - // FunctionCallbackInfo::values_. - __ mov(ApiParameterOperand(3), scratch); - // FunctionCallbackInfo::length_. - __ Move(ApiParameterOperand(4), Immediate(argc.immediate())); - // FunctionCallbackInfo::is_construct_call_. - __ Move(ApiParameterOperand(5), Immediate(0)); - } else { - __ lea(scratch, Operand(scratch, argc.reg(), times_pointer_size, - (FCA::kArgsLength - 1) * kPointerSize)); - // FunctionCallbackInfo::values_. - __ mov(ApiParameterOperand(3), scratch); - // FunctionCallbackInfo::length_. - __ mov(ApiParameterOperand(4), argc.reg()); - // FunctionCallbackInfo::is_construct_call_. - __ lea(argc.reg(), Operand(argc.reg(), times_pointer_size, - (FCA::kArgsLength + 1) * kPointerSize)); - __ mov(ApiParameterOperand(5), argc.reg()); - } + __ add(scratch, Immediate((argc() + FCA::kArgsLength - 1) * kPointerSize)); + // FunctionCallbackInfo::values_. + __ mov(ApiParameterOperand(3), scratch); + // FunctionCallbackInfo::length_. + __ Move(ApiParameterOperand(4), Immediate(argc())); + // FunctionCallbackInfo::is_construct_call_. + __ Move(ApiParameterOperand(5), Immediate(0)); // v8::InvocationCallback's argument. __ lea(scratch, ApiParameterOperand(2)); @@ -5822,7 +5758,7 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm, (2 + FCA::kContextSaveIndex) * kPointerSize); // Stores return the first js argument int return_value_offset = 0; - if (return_first_arg) { + if (is_store()) { return_value_offset = 2 + FCA::kArgsLength; } else { return_value_offset = 2 + FCA::kReturnValueOffset; @@ -5831,10 +5767,8 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm, int stack_space = 0; Operand is_construct_call_operand = ApiParameterOperand(5); Operand* stack_space_operand = &is_construct_call_operand; - if (argc.is_immediate()) { - stack_space = argc.immediate() + FCA::kArgsLength + 1; - stack_space_operand = nullptr; - } + stack_space = argc() + FCA::kArgsLength + 1; + stack_space_operand = nullptr; CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, ApiParameterOperand(1), stack_space, stack_space_operand, return_value_operand, @@ -5842,23 +5776,6 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm, } -void CallApiFunctionStub::Generate(MacroAssembler* masm) { - bool call_data_undefined = this->call_data_undefined(); - CallApiFunctionStubHelper(masm, ParameterCount(eax), false, - call_data_undefined, false); -} - - -void CallApiAccessorStub::Generate(MacroAssembler* masm) { - bool is_store = this->is_store(); - int argc = this->argc(); - bool call_data_undefined = this->call_data_undefined(); - bool is_lazy = this->is_lazy(); - CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store, - call_data_undefined, is_lazy); -} - - void CallApiGetterStub::Generate(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- esp[0] : return address |