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

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

Issue 1775933005: Revert of Rework CallApi*Stubs. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 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
« no previous file with comments | « src/ppc/interface-descriptors-ppc.cc ('k') | src/s390/interface-descriptors-s390.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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_S390 5 #if V8_TARGET_ARCH_S390
6 6
7 #include "src/code-stubs.h" 7 #include "src/code-stubs.h"
8 #include "src/base/bits.h" 8 #include "src/base/bits.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 5525 matching lines...) Expand 10 before | Expand all | Expand 10 after
5536 __ StoreP(r7, MemOperand(r9, kLimitOffset)); 5536 __ StoreP(r7, MemOperand(r9, kLimitOffset));
5537 __ LoadRR(r6, r2); 5537 __ LoadRR(r6, r2);
5538 __ PrepareCallCFunction(1, r7); 5538 __ PrepareCallCFunction(1, r7);
5539 __ mov(r2, Operand(ExternalReference::isolate_address(isolate))); 5539 __ mov(r2, Operand(ExternalReference::isolate_address(isolate)));
5540 __ CallCFunction(ExternalReference::delete_handle_scope_extensions(isolate), 5540 __ CallCFunction(ExternalReference::delete_handle_scope_extensions(isolate),
5541 1); 5541 1);
5542 __ LoadRR(r2, r6); 5542 __ LoadRR(r2, r6);
5543 __ b(&leave_exit_frame, Label::kNear); 5543 __ b(&leave_exit_frame, Label::kNear);
5544 } 5544 }
5545 5545
5546 void CallApiCallbackStub::Generate(MacroAssembler* masm) { 5546 static void CallApiFunctionStubHelper(MacroAssembler* masm,
5547 const ParameterCount& argc,
5548 bool return_first_arg,
5549 bool call_data_undefined, bool is_lazy) {
5547 // ----------- S t a t e ------------- 5550 // ----------- S t a t e -------------
5548 // -- r2 : callee 5551 // -- r2 : callee
5549 // -- r6 : call_data 5552 // -- r6 : call_data
5550 // -- r4 : holder 5553 // -- r4 : holder
5551 // -- r3 : api_function_address 5554 // -- r3 : api_function_address
5555 // -- r5 : number of arguments if argc is a register
5552 // -- cp : context 5556 // -- cp : context
5553 // -- 5557 // --
5554 // -- sp[0] : last argument 5558 // -- sp[0] : last argument
5555 // -- ... 5559 // -- ...
5556 // -- sp[(argc - 1)* 4] : first argument 5560 // -- sp[(argc - 1)* 4] : first argument
5557 // -- sp[argc * 4] : receiver 5561 // -- sp[argc * 4] : receiver
5558 // ----------------------------------- 5562 // -----------------------------------
5559 5563
5560 Register callee = r2; 5564 Register callee = r2;
5561 Register call_data = r6; 5565 Register call_data = r6;
5562 Register holder = r4; 5566 Register holder = r4;
5563 Register api_function_address = r3; 5567 Register api_function_address = r3;
5564 Register context = cp; 5568 Register context = cp;
5565 5569
5566 typedef FunctionCallbackArguments FCA; 5570 typedef FunctionCallbackArguments FCA;
5567 5571
5568 STATIC_ASSERT(FCA::kContextSaveIndex == 6); 5572 STATIC_ASSERT(FCA::kContextSaveIndex == 6);
5569 STATIC_ASSERT(FCA::kCalleeIndex == 5); 5573 STATIC_ASSERT(FCA::kCalleeIndex == 5);
5570 STATIC_ASSERT(FCA::kDataIndex == 4); 5574 STATIC_ASSERT(FCA::kDataIndex == 4);
5571 STATIC_ASSERT(FCA::kReturnValueOffset == 3); 5575 STATIC_ASSERT(FCA::kReturnValueOffset == 3);
5572 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); 5576 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2);
5573 STATIC_ASSERT(FCA::kIsolateIndex == 1); 5577 STATIC_ASSERT(FCA::kIsolateIndex == 1);
5574 STATIC_ASSERT(FCA::kHolderIndex == 0); 5578 STATIC_ASSERT(FCA::kHolderIndex == 0);
5575 STATIC_ASSERT(FCA::kArgsLength == 7); 5579 STATIC_ASSERT(FCA::kArgsLength == 7);
5576 5580
5581 DCHECK(argc.is_immediate() || r2.is(argc.reg()));
5582
5577 // context save 5583 // context save
5578 __ push(context); 5584 __ push(context);
5579 if (!is_lazy) { 5585 if (!is_lazy) {
5580 // load context from callee 5586 // load context from callee
5581 __ LoadP(context, FieldMemOperand(callee, JSFunction::kContextOffset)); 5587 __ LoadP(context, FieldMemOperand(callee, JSFunction::kContextOffset));
5582 } 5588 }
5583 5589
5584 // callee 5590 // callee
5585 __ push(callee); 5591 __ push(callee);
5586 5592
5587 // call data 5593 // call data
5588 __ push(call_data); 5594 __ push(call_data);
5589 5595
5590 Register scratch = call_data; 5596 Register scratch = call_data;
5591 if (!call_data_undefined()) { 5597 if (!call_data_undefined) {
5592 __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); 5598 __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex);
5593 } 5599 }
5594 // return value 5600 // return value
5595 __ push(scratch); 5601 __ push(scratch);
5596 // return value default 5602 // return value default
5597 __ push(scratch); 5603 __ push(scratch);
5598 // isolate 5604 // isolate
5599 __ mov(scratch, Operand(ExternalReference::isolate_address(masm->isolate()))); 5605 __ mov(scratch, Operand(ExternalReference::isolate_address(masm->isolate())));
5600 __ push(scratch); 5606 __ push(scratch);
5601 // holder 5607 // holder
(...skipping 15 matching lines...) Expand all
5617 5623
5618 FrameScope frame_scope(masm, StackFrame::MANUAL); 5624 FrameScope frame_scope(masm, StackFrame::MANUAL);
5619 __ EnterExitFrame(false, kApiStackSpace); 5625 __ EnterExitFrame(false, kApiStackSpace);
5620 5626
5621 DCHECK(!api_function_address.is(r2) && !scratch.is(r2)); 5627 DCHECK(!api_function_address.is(r2) && !scratch.is(r2));
5622 // r2 = FunctionCallbackInfo& 5628 // r2 = FunctionCallbackInfo&
5623 // Arguments is after the return address. 5629 // Arguments is after the return address.
5624 __ AddP(r2, sp, Operand(kFunctionCallbackInfoOffset)); 5630 __ AddP(r2, sp, Operand(kFunctionCallbackInfoOffset));
5625 // FunctionCallbackInfo::implicit_args_ 5631 // FunctionCallbackInfo::implicit_args_
5626 __ StoreP(scratch, MemOperand(r2, 0 * kPointerSize)); 5632 __ StoreP(scratch, MemOperand(r2, 0 * kPointerSize));
5627 // FunctionCallbackInfo::values_ 5633 if (argc.is_immediate()) {
5628 __ AddP(ip, scratch, Operand((FCA::kArgsLength - 1 + argc()) * kPointerSize)); 5634 // FunctionCallbackInfo::values_
5629 __ StoreP(ip, MemOperand(r2, 1 * kPointerSize)); 5635 __ AddP(ip, scratch,
5630 // FunctionCallbackInfo::length_ = argc 5636 Operand((FCA::kArgsLength - 1 + argc.immediate()) * kPointerSize));
5631 __ LoadImmP(ip, Operand(argc())); 5637 __ StoreP(ip, MemOperand(r2, 1 * kPointerSize));
5632 __ StoreW(ip, MemOperand(r2, 2 * kPointerSize)); 5638 // FunctionCallbackInfo::length_ = argc
5633 // FunctionCallbackInfo::is_construct_call_ = 0 5639 __ LoadImmP(ip, Operand(argc.immediate()));
5634 __ LoadImmP(ip, Operand::Zero()); 5640 __ StoreW(ip, MemOperand(r2, 2 * kPointerSize));
5635 __ StoreW(ip, MemOperand(r2, 2 * kPointerSize + kIntSize)); 5641 // FunctionCallbackInfo::is_construct_call_ = 0
5642 __ LoadImmP(ip, Operand::Zero());
5643 __ StoreW(ip, MemOperand(r2, 2 * kPointerSize + kIntSize));
5644 } else {
5645 __ ShiftLeftP(ip, argc.reg(), Operand(kPointerSizeLog2));
5646 __ AddP(ip, ip, Operand((FCA::kArgsLength - 1) * kPointerSize));
5647 // FunctionCallbackInfo::values_
5648 __ AddP(r0, scratch, ip);
5649 __ StoreP(r0, MemOperand(r2, 1 * kPointerSize));
5650 // FunctionCallbackInfo::length_ = argc
5651 __ StoreW(argc.reg(), MemOperand(r2, 2 * kPointerSize));
5652 // FunctionCallbackInfo::is_construct_call_
5653 __ StoreW(ip, MemOperand(r2, 2 * kPointerSize + kIntSize));
5654 }
5636 5655
5637 ExternalReference thunk_ref = 5656 ExternalReference thunk_ref =
5638 ExternalReference::invoke_function_callback(masm->isolate()); 5657 ExternalReference::invoke_function_callback(masm->isolate());
5639 5658
5640 AllowExternalCallThatCantCauseGC scope(masm); 5659 AllowExternalCallThatCantCauseGC scope(masm);
5641 MemOperand context_restore_operand( 5660 MemOperand context_restore_operand(
5642 fp, (2 + FCA::kContextSaveIndex) * kPointerSize); 5661 fp, (2 + FCA::kContextSaveIndex) * kPointerSize);
5643 // Stores return the first js argument 5662 // Stores return the first js argument
5644 int return_value_offset = 0; 5663 int return_value_offset = 0;
5645 if (is_store()) { 5664 if (return_first_arg) {
5646 return_value_offset = 2 + FCA::kArgsLength; 5665 return_value_offset = 2 + FCA::kArgsLength;
5647 } else { 5666 } else {
5648 return_value_offset = 2 + FCA::kReturnValueOffset; 5667 return_value_offset = 2 + FCA::kReturnValueOffset;
5649 } 5668 }
5650 MemOperand return_value_operand(fp, return_value_offset * kPointerSize); 5669 MemOperand return_value_operand(fp, return_value_offset * kPointerSize);
5651 int stack_space = 0; 5670 int stack_space = 0;
5652 MemOperand is_construct_call_operand = 5671 MemOperand is_construct_call_operand =
5653 MemOperand(sp, kFunctionCallbackInfoOffset + 2 * kPointerSize + kIntSize); 5672 MemOperand(sp, kFunctionCallbackInfoOffset + 2 * kPointerSize + kIntSize);
5654 MemOperand* stack_space_operand = &is_construct_call_operand; 5673 MemOperand* stack_space_operand = &is_construct_call_operand;
5655 stack_space = argc() + FCA::kArgsLength + 1; 5674 if (argc.is_immediate()) {
5656 stack_space_operand = NULL; 5675 stack_space = argc.immediate() + FCA::kArgsLength + 1;
5676 stack_space_operand = NULL;
5677 }
5657 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, stack_space, 5678 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, stack_space,
5658 stack_space_operand, return_value_operand, 5679 stack_space_operand, return_value_operand,
5659 &context_restore_operand); 5680 &context_restore_operand);
5660 } 5681 }
5661 5682
5683 void CallApiFunctionStub::Generate(MacroAssembler* masm) {
5684 bool call_data_undefined = this->call_data_undefined();
5685 CallApiFunctionStubHelper(masm, ParameterCount(r6), false,
5686 call_data_undefined, false);
5687 }
5688
5689 void CallApiAccessorStub::Generate(MacroAssembler* masm) {
5690 bool is_store = this->is_store();
5691 int argc = this->argc();
5692 bool call_data_undefined = this->call_data_undefined();
5693 bool is_lazy = this->is_lazy();
5694 CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
5695 call_data_undefined, is_lazy);
5696 }
5697
5662 void CallApiGetterStub::Generate(MacroAssembler* masm) { 5698 void CallApiGetterStub::Generate(MacroAssembler* masm) {
5663 // ----------- S t a t e ------------- 5699 // ----------- S t a t e -------------
5664 // -- sp[0] : name 5700 // -- sp[0] : name
5665 // -- sp[4 .. (4 + kArgsLength*4)] : v8::PropertyCallbackInfo::args_ 5701 // -- sp[4 .. (4 + kArgsLength*4)] : v8::PropertyCallbackInfo::args_
5666 // -- ... 5702 // -- ...
5667 // -- r4 : api_function_address 5703 // -- r4 : api_function_address
5668 // ----------------------------------- 5704 // -----------------------------------
5669 5705
5670 Register api_function_address = ApiGetterDescriptor::function_address(); 5706 Register api_function_address = ApiGetterDescriptor::function_address();
5671 int arg0Slot = 0; 5707 int arg0Slot = 0;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
5725 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, 5761 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref,
5726 kStackUnwindSpace, NULL, return_value_operand, NULL); 5762 kStackUnwindSpace, NULL, return_value_operand, NULL);
5727 } 5763 }
5728 5764
5729 #undef __ 5765 #undef __
5730 5766
5731 } // namespace internal 5767 } // namespace internal
5732 } // namespace v8 5768 } // namespace v8
5733 5769
5734 #endif // V8_TARGET_ARCH_S390 5770 #endif // V8_TARGET_ARCH_S390
OLDNEW
« no previous file with comments | « src/ppc/interface-descriptors-ppc.cc ('k') | src/s390/interface-descriptors-s390.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698