OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 __ pushq(RBX); // Element type. | 686 __ pushq(RBX); // Element type. |
687 __ CallRuntime(kAllocateArrayRuntimeEntry, 2); | 687 __ CallRuntime(kAllocateArrayRuntimeEntry, 2); |
688 __ popq(RAX); // Pop element type argument. | 688 __ popq(RAX); // Pop element type argument. |
689 __ popq(R10); // Pop array length argument. | 689 __ popq(R10); // Pop array length argument. |
690 __ popq(RAX); // Pop return value from return slot. | 690 __ popq(RAX); // Pop return value from return slot. |
691 __ LeaveStubFrame(); | 691 __ LeaveStubFrame(); |
692 __ ret(); | 692 __ ret(); |
693 } | 693 } |
694 | 694 |
695 | 695 |
696 // Input parameters: | |
697 // R10: Arguments descriptor array. | |
698 // Note: The closure object is the first argument to the function being | |
699 // called, the stub accesses the closure from this location directly | |
700 // when trying to resolve the call. | |
701 void StubCode::GenerateCallClosureFunctionStub(Assembler* assembler) { | |
702 // Load num_args. | |
703 __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset())); | |
704 // Load closure object in R13. | |
705 __ movq(R13, Address(RSP, RAX, TIMES_4, 0)); // RAX is a Smi. | |
706 | |
707 __ LoadObject(R12, Object::null_object(), PP); | |
708 | |
709 // Verify that R13 is a closure by checking its class. | |
710 Label not_closure; | |
711 __ cmpq(R13, R12); | |
712 // Not a closure, but null object. | |
713 __ j(EQUAL, ¬_closure); | |
714 __ testq(R13, Immediate(kSmiTagMask)); | |
715 __ j(ZERO, ¬_closure); // Not a closure, but a smi. | |
716 // Verify that the class of the object is a closure class by checking that | |
717 // class.signature_function() is not null. | |
718 __ LoadClass(RAX, R13); | |
719 __ movq(RAX, FieldAddress(RAX, Class::signature_function_offset())); | |
720 __ cmpq(RAX, R12); | |
721 // Actual class is not a closure class. | |
722 __ j(EQUAL, ¬_closure, Assembler::kNearJump); | |
723 | |
724 // RAX is just the signature function. Load the actual closure function. | |
725 __ movq(RAX, FieldAddress(R13, Closure::function_offset())); | |
726 | |
727 // Load closure context in CTX; note that CTX has already been preserved. | |
728 __ movq(CTX, FieldAddress(R13, Closure::context_offset())); | |
729 | |
730 // Load closure function code in RAX. | |
731 __ movq(RCX, FieldAddress(RAX, Function::code_offset())); | |
732 | |
733 // RAX: Function. | |
734 // R10: Arguments descriptor array. | |
735 // RBX: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value). | |
736 __ xorq(RBX, RBX); | |
737 __ movq(RCX, FieldAddress(RCX, Code::instructions_offset())); | |
738 __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); | |
739 __ jmp(RCX); | |
740 | |
741 __ Bind(¬_closure); | |
742 // Call runtime to attempt to resolve and invoke a call method on a | |
743 // non-closure object, passing the non-closure object and its arguments array, | |
744 // returning here. | |
745 // If no call method exists, throw a NoSuchMethodError. | |
746 // R13: non-closure object. | |
747 // R10: arguments descriptor array. | |
748 | |
749 // Create a stub frame as we are pushing some objects on the stack before | |
750 // calling into the runtime. | |
751 __ EnterStubFrame(); | |
752 // Setup space on stack for result from call. | |
753 __ pushq(R12); | |
754 __ pushq(R10); // Arguments descriptor. | |
755 // Load smi-tagged arguments array length, including the non-closure. | |
756 __ movq(R10, FieldAddress(R10, ArgumentsDescriptor::count_offset())); | |
757 PushArgumentsArray(assembler); | |
758 | |
759 __ CallRuntime(kInvokeNonClosureRuntimeEntry, 2); | |
760 | |
761 // Remove arguments. | |
762 __ Drop(2); | |
763 __ popq(RAX); // Get result into RAX. | |
764 | |
765 // Remove the stub frame as we are about to return. | |
766 __ LeaveStubFrame(); | |
767 __ ret(); | |
768 } | |
769 | |
770 | |
771 // Called when invoking Dart code from C++ (VM code). | 696 // Called when invoking Dart code from C++ (VM code). |
772 // Input parameters: | 697 // Input parameters: |
773 // RSP : points to return address. | 698 // RSP : points to return address. |
774 // RDI : entrypoint of the Dart function to call. | 699 // RDI : entrypoint of the Dart function to call. |
775 // RSI : arguments descriptor array. | 700 // RSI : arguments descriptor array. |
776 // RDX : arguments array. | 701 // RDX : arguments array. |
777 // RCX : new context containing the current isolate pointer. | 702 // RCX : new context containing the current isolate pointer. |
778 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) { | 703 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) { |
779 // Save frame pointer coming in. | 704 // Save frame pointer coming in. |
780 __ EnterFrame(0); | 705 __ EnterFrame(0); |
(...skipping 1137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1918 | 1843 |
1919 __ movq(left, Address(RSP, 2 * kWordSize)); | 1844 __ movq(left, Address(RSP, 2 * kWordSize)); |
1920 __ movq(right, Address(RSP, 1 * kWordSize)); | 1845 __ movq(right, Address(RSP, 1 * kWordSize)); |
1921 GenerateIdenticalWithNumberCheckStub(assembler, left, right); | 1846 GenerateIdenticalWithNumberCheckStub(assembler, left, right); |
1922 __ ret(); | 1847 __ ret(); |
1923 } | 1848 } |
1924 | 1849 |
1925 } // namespace dart | 1850 } // namespace dart |
1926 | 1851 |
1927 #endif // defined TARGET_ARCH_X64 | 1852 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |