OLD | NEW |
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 Loading... |
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 static void CallApiFunctionStubHelper(MacroAssembler* masm, | 5546 void CallApiCallbackStub::Generate(MacroAssembler* masm) { |
5547 const ParameterCount& argc, | |
5548 bool return_first_arg, | |
5549 bool call_data_undefined, bool is_lazy) { | |
5550 // ----------- S t a t e ------------- | 5547 // ----------- S t a t e ------------- |
5551 // -- r2 : callee | 5548 // -- r2 : callee |
5552 // -- r6 : call_data | 5549 // -- r6 : call_data |
5553 // -- r4 : holder | 5550 // -- r4 : holder |
5554 // -- r3 : api_function_address | 5551 // -- r3 : api_function_address |
5555 // -- r5 : number of arguments if argc is a register | |
5556 // -- cp : context | 5552 // -- cp : context |
5557 // -- | 5553 // -- |
5558 // -- sp[0] : last argument | 5554 // -- sp[0] : last argument |
5559 // -- ... | 5555 // -- ... |
5560 // -- sp[(argc - 1)* 4] : first argument | 5556 // -- sp[(argc - 1)* 4] : first argument |
5561 // -- sp[argc * 4] : receiver | 5557 // -- sp[argc * 4] : receiver |
5562 // ----------------------------------- | 5558 // ----------------------------------- |
5563 | 5559 |
5564 Register callee = r2; | 5560 Register callee = r2; |
5565 Register call_data = r6; | 5561 Register call_data = r6; |
5566 Register holder = r4; | 5562 Register holder = r4; |
5567 Register api_function_address = r3; | 5563 Register api_function_address = r3; |
5568 Register context = cp; | 5564 Register context = cp; |
5569 | 5565 |
5570 typedef FunctionCallbackArguments FCA; | 5566 typedef FunctionCallbackArguments FCA; |
5571 | 5567 |
5572 STATIC_ASSERT(FCA::kContextSaveIndex == 6); | 5568 STATIC_ASSERT(FCA::kContextSaveIndex == 6); |
5573 STATIC_ASSERT(FCA::kCalleeIndex == 5); | 5569 STATIC_ASSERT(FCA::kCalleeIndex == 5); |
5574 STATIC_ASSERT(FCA::kDataIndex == 4); | 5570 STATIC_ASSERT(FCA::kDataIndex == 4); |
5575 STATIC_ASSERT(FCA::kReturnValueOffset == 3); | 5571 STATIC_ASSERT(FCA::kReturnValueOffset == 3); |
5576 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); | 5572 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); |
5577 STATIC_ASSERT(FCA::kIsolateIndex == 1); | 5573 STATIC_ASSERT(FCA::kIsolateIndex == 1); |
5578 STATIC_ASSERT(FCA::kHolderIndex == 0); | 5574 STATIC_ASSERT(FCA::kHolderIndex == 0); |
5579 STATIC_ASSERT(FCA::kArgsLength == 7); | 5575 STATIC_ASSERT(FCA::kArgsLength == 7); |
5580 | 5576 |
5581 DCHECK(argc.is_immediate() || r2.is(argc.reg())); | |
5582 | |
5583 // context save | 5577 // context save |
5584 __ push(context); | 5578 __ push(context); |
5585 if (!is_lazy) { | 5579 if (!is_lazy) { |
5586 // load context from callee | 5580 // load context from callee |
5587 __ LoadP(context, FieldMemOperand(callee, JSFunction::kContextOffset)); | 5581 __ LoadP(context, FieldMemOperand(callee, JSFunction::kContextOffset)); |
5588 } | 5582 } |
5589 | 5583 |
5590 // callee | 5584 // callee |
5591 __ push(callee); | 5585 __ push(callee); |
5592 | 5586 |
5593 // call data | 5587 // call data |
5594 __ push(call_data); | 5588 __ push(call_data); |
5595 | 5589 |
5596 Register scratch = call_data; | 5590 Register scratch = call_data; |
5597 if (!call_data_undefined) { | 5591 if (!call_data_undefined()) { |
5598 __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); | 5592 __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); |
5599 } | 5593 } |
5600 // return value | 5594 // return value |
5601 __ push(scratch); | 5595 __ push(scratch); |
5602 // return value default | 5596 // return value default |
5603 __ push(scratch); | 5597 __ push(scratch); |
5604 // isolate | 5598 // isolate |
5605 __ mov(scratch, Operand(ExternalReference::isolate_address(masm->isolate()))); | 5599 __ mov(scratch, Operand(ExternalReference::isolate_address(masm->isolate()))); |
5606 __ push(scratch); | 5600 __ push(scratch); |
5607 // holder | 5601 // holder |
(...skipping 15 matching lines...) Expand all Loading... |
5623 | 5617 |
5624 FrameScope frame_scope(masm, StackFrame::MANUAL); | 5618 FrameScope frame_scope(masm, StackFrame::MANUAL); |
5625 __ EnterExitFrame(false, kApiStackSpace); | 5619 __ EnterExitFrame(false, kApiStackSpace); |
5626 | 5620 |
5627 DCHECK(!api_function_address.is(r2) && !scratch.is(r2)); | 5621 DCHECK(!api_function_address.is(r2) && !scratch.is(r2)); |
5628 // r2 = FunctionCallbackInfo& | 5622 // r2 = FunctionCallbackInfo& |
5629 // Arguments is after the return address. | 5623 // Arguments is after the return address. |
5630 __ AddP(r2, sp, Operand(kFunctionCallbackInfoOffset)); | 5624 __ AddP(r2, sp, Operand(kFunctionCallbackInfoOffset)); |
5631 // FunctionCallbackInfo::implicit_args_ | 5625 // FunctionCallbackInfo::implicit_args_ |
5632 __ StoreP(scratch, MemOperand(r2, 0 * kPointerSize)); | 5626 __ StoreP(scratch, MemOperand(r2, 0 * kPointerSize)); |
5633 if (argc.is_immediate()) { | 5627 // FunctionCallbackInfo::values_ |
5634 // FunctionCallbackInfo::values_ | 5628 __ AddP(ip, scratch, Operand((FCA::kArgsLength - 1 + argc()) * kPointerSize)); |
5635 __ AddP(ip, scratch, | 5629 __ StoreP(ip, MemOperand(r2, 1 * kPointerSize)); |
5636 Operand((FCA::kArgsLength - 1 + argc.immediate()) * kPointerSize)); | 5630 // FunctionCallbackInfo::length_ = argc |
5637 __ StoreP(ip, MemOperand(r2, 1 * kPointerSize)); | 5631 __ LoadImmP(ip, Operand(argc())); |
5638 // FunctionCallbackInfo::length_ = argc | 5632 __ StoreW(ip, MemOperand(r2, 2 * kPointerSize)); |
5639 __ LoadImmP(ip, Operand(argc.immediate())); | 5633 // FunctionCallbackInfo::is_construct_call_ = 0 |
5640 __ StoreW(ip, MemOperand(r2, 2 * kPointerSize)); | 5634 __ LoadImmP(ip, Operand::Zero()); |
5641 // FunctionCallbackInfo::is_construct_call_ = 0 | 5635 __ StoreW(ip, MemOperand(r2, 2 * kPointerSize + kIntSize)); |
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 } | |
5655 | 5636 |
5656 ExternalReference thunk_ref = | 5637 ExternalReference thunk_ref = |
5657 ExternalReference::invoke_function_callback(masm->isolate()); | 5638 ExternalReference::invoke_function_callback(masm->isolate()); |
5658 | 5639 |
5659 AllowExternalCallThatCantCauseGC scope(masm); | 5640 AllowExternalCallThatCantCauseGC scope(masm); |
5660 MemOperand context_restore_operand( | 5641 MemOperand context_restore_operand( |
5661 fp, (2 + FCA::kContextSaveIndex) * kPointerSize); | 5642 fp, (2 + FCA::kContextSaveIndex) * kPointerSize); |
5662 // Stores return the first js argument | 5643 // Stores return the first js argument |
5663 int return_value_offset = 0; | 5644 int return_value_offset = 0; |
5664 if (return_first_arg) { | 5645 if (is_store()) { |
5665 return_value_offset = 2 + FCA::kArgsLength; | 5646 return_value_offset = 2 + FCA::kArgsLength; |
5666 } else { | 5647 } else { |
5667 return_value_offset = 2 + FCA::kReturnValueOffset; | 5648 return_value_offset = 2 + FCA::kReturnValueOffset; |
5668 } | 5649 } |
5669 MemOperand return_value_operand(fp, return_value_offset * kPointerSize); | 5650 MemOperand return_value_operand(fp, return_value_offset * kPointerSize); |
5670 int stack_space = 0; | 5651 int stack_space = 0; |
5671 MemOperand is_construct_call_operand = | 5652 MemOperand is_construct_call_operand = |
5672 MemOperand(sp, kFunctionCallbackInfoOffset + 2 * kPointerSize + kIntSize); | 5653 MemOperand(sp, kFunctionCallbackInfoOffset + 2 * kPointerSize + kIntSize); |
5673 MemOperand* stack_space_operand = &is_construct_call_operand; | 5654 MemOperand* stack_space_operand = &is_construct_call_operand; |
5674 if (argc.is_immediate()) { | 5655 stack_space = argc() + FCA::kArgsLength + 1; |
5675 stack_space = argc.immediate() + FCA::kArgsLength + 1; | 5656 stack_space_operand = NULL; |
5676 stack_space_operand = NULL; | |
5677 } | |
5678 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, stack_space, | 5657 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, stack_space, |
5679 stack_space_operand, return_value_operand, | 5658 stack_space_operand, return_value_operand, |
5680 &context_restore_operand); | 5659 &context_restore_operand); |
5681 } | 5660 } |
5682 | 5661 |
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 | |
5698 void CallApiGetterStub::Generate(MacroAssembler* masm) { | 5662 void CallApiGetterStub::Generate(MacroAssembler* masm) { |
5699 // ----------- S t a t e ------------- | 5663 // ----------- S t a t e ------------- |
5700 // -- sp[0] : name | 5664 // -- sp[0] : name |
5701 // -- sp[4 .. (4 + kArgsLength*4)] : v8::PropertyCallbackInfo::args_ | 5665 // -- sp[4 .. (4 + kArgsLength*4)] : v8::PropertyCallbackInfo::args_ |
5702 // -- ... | 5666 // -- ... |
5703 // -- r4 : api_function_address | 5667 // -- r4 : api_function_address |
5704 // ----------------------------------- | 5668 // ----------------------------------- |
5705 | 5669 |
5706 Register api_function_address = ApiGetterDescriptor::function_address(); | 5670 Register api_function_address = ApiGetterDescriptor::function_address(); |
5707 int arg0Slot = 0; | 5671 int arg0Slot = 0; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5761 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 5725 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
5762 kStackUnwindSpace, NULL, return_value_operand, NULL); | 5726 kStackUnwindSpace, NULL, return_value_operand, NULL); |
5763 } | 5727 } |
5764 | 5728 |
5765 #undef __ | 5729 #undef __ |
5766 | 5730 |
5767 } // namespace internal | 5731 } // namespace internal |
5768 } // namespace v8 | 5732 } // namespace v8 |
5769 | 5733 |
5770 #endif // V8_TARGET_ARCH_S390 | 5734 #endif // V8_TARGET_ARCH_S390 |
OLD | NEW |