| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 void EnterInternalFrame() { EnterFrame(StackFrame::INTERNAL); } | 148 void EnterInternalFrame() { EnterFrame(StackFrame::INTERNAL); } |
| 149 void LeaveInternalFrame() { LeaveFrame(StackFrame::INTERNAL); } | 149 void LeaveInternalFrame() { LeaveFrame(StackFrame::INTERNAL); } |
| 150 | 150 |
| 151 void EnterConstructFrame() { EnterFrame(StackFrame::CONSTRUCT); } | 151 void EnterConstructFrame() { EnterFrame(StackFrame::CONSTRUCT); } |
| 152 void LeaveConstructFrame() { LeaveFrame(StackFrame::CONSTRUCT); } | 152 void LeaveConstructFrame() { LeaveFrame(StackFrame::CONSTRUCT); } |
| 153 | 153 |
| 154 // Enter specific kind of exit frame; either in normal or | 154 // Enter specific kind of exit frame; either in normal or |
| 155 // debug mode. Expects the number of arguments in register rax and | 155 // debug mode. Expects the number of arguments in register rax and |
| 156 // sets up the number of arguments in register rdi and the pointer | 156 // sets up the number of arguments in register rdi and the pointer |
| 157 // to the first argument in register rsi. | 157 // to the first argument in register rsi. |
| 158 void EnterExitFrame(int result_size = 1); | 158 // |
| 159 // Allocates arg_stack_space * kPointerSize memory (not GCed) on the stack |
| 160 // accessible via StackSpaceOperand. |
| 161 void EnterExitFrame(int arg_stack_space = 0); |
| 159 | 162 |
| 160 void EnterApiExitFrame(int stack_space, | 163 // Enter specific kind of exit frame. Allocates arg_stack_space * kPointerSize |
| 161 int argc, | 164 // memory (not GCed) on the stack accessible via StackSpaceOperand. |
| 162 int result_size = 1); | 165 void EnterApiExitFrame(int arg_stack_space); |
| 163 | 166 |
| 164 // Leave the current exit frame. Expects/provides the return value in | 167 // Leave the current exit frame. Expects/provides the return value in |
| 165 // register rax:rdx (untouched) and the pointer to the first | 168 // register rax:rdx (untouched) and the pointer to the first |
| 166 // argument in register rsi. | 169 // argument in register rsi. |
| 167 void LeaveExitFrame(int result_size = 1); | 170 void LeaveExitFrame(); |
| 168 | 171 |
| 172 // Leave the current exit frame. Expects/provides the return value in |
| 173 // register rax (untouched). |
| 174 void LeaveApiExitFrame(); |
| 169 | 175 |
| 170 // --------------------------------------------------------------------------- | 176 // --------------------------------------------------------------------------- |
| 171 // JavaScript invokes | 177 // JavaScript invokes |
| 172 | 178 |
| 173 // Invoke the JavaScript function code by either calling or jumping. | 179 // Invoke the JavaScript function code by either calling or jumping. |
| 174 void InvokeCode(Register code, | 180 void InvokeCode(Register code, |
| 175 const ParameterCount& expected, | 181 const ParameterCount& expected, |
| 176 const ParameterCount& actual, | 182 const ParameterCount& actual, |
| 177 InvokeFlag flag); | 183 InvokeFlag flag); |
| 178 | 184 |
| (...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 806 void CallExternalReference(const ExternalReference& ext, | 812 void CallExternalReference(const ExternalReference& ext, |
| 807 int num_arguments); | 813 int num_arguments); |
| 808 | 814 |
| 809 // Tail call of a runtime routine (jump). | 815 // Tail call of a runtime routine (jump). |
| 810 // Like JumpToExternalReference, but also takes care of passing the number | 816 // Like JumpToExternalReference, but also takes care of passing the number |
| 811 // of parameters. | 817 // of parameters. |
| 812 void TailCallExternalReference(const ExternalReference& ext, | 818 void TailCallExternalReference(const ExternalReference& ext, |
| 813 int num_arguments, | 819 int num_arguments, |
| 814 int result_size); | 820 int result_size); |
| 815 | 821 |
| 822 MUST_USE_RESULT MaybeObject* TryTailCallExternalReference( |
| 823 const ExternalReference& ext, int num_arguments, int result_size); |
| 824 |
| 816 // Convenience function: tail call a runtime routine (jump). | 825 // Convenience function: tail call a runtime routine (jump). |
| 817 void TailCallRuntime(Runtime::FunctionId fid, | 826 void TailCallRuntime(Runtime::FunctionId fid, |
| 818 int num_arguments, | 827 int num_arguments, |
| 819 int result_size); | 828 int result_size); |
| 820 | 829 |
| 830 MUST_USE_RESULT MaybeObject* TryTailCallRuntime(Runtime::FunctionId fid, |
| 831 int num_arguments, |
| 832 int result_size); |
| 833 |
| 821 // Jump to a runtime routine. | 834 // Jump to a runtime routine. |
| 822 void JumpToExternalReference(const ExternalReference& ext, int result_size); | 835 void JumpToExternalReference(const ExternalReference& ext, int result_size); |
| 823 | 836 |
| 837 // Jump to a runtime routine. |
| 838 MaybeObject* TryJumpToExternalReference(const ExternalReference& ext, |
| 839 int result_size); |
| 840 |
| 824 // Prepares stack to put arguments (aligns and so on). | 841 // Prepares stack to put arguments (aligns and so on). |
| 825 // Uses calle-saved esi to restore stack state after call. | 842 // WIN64 calling convention requires to put the pointer to the return value |
| 826 void PrepareCallApiFunction(int stack_space); | 843 // slot into rcx (rcx must be preserverd until TryCallApiFunctionAndReturn). |
| 844 // Saves context (rsi). Clobbers rax. Allocates arg_stack_space * kPointerSize |
| 845 // inside the exit frame (not GCed) accessible via StackSpaceOperand. |
| 846 void PrepareCallApiFunction(int arg_stack_space); |
| 827 | 847 |
| 828 // Tail call an API function (jump). Allocates HandleScope, extracts | 848 // Calls an API function. Allocates HandleScope, extracts |
| 829 // returned value from handle and propogates exceptions. | 849 // returned value from handle and propagates exceptions. |
| 830 // Clobbers ebx, edi and caller-save registers. | 850 // Clobbers r12, r14, rbx and caller-save registers. Restores context. |
| 831 void CallApiFunctionAndReturn(ApiFunction* function); | 851 // On return removes stack_space * kPointerSize (GCed). |
| 852 MUST_USE_RESULT MaybeObject* TryCallApiFunctionAndReturn( |
| 853 ApiFunction* function, int stack_space); |
| 832 | 854 |
| 833 // Before calling a C-function from generated code, align arguments on stack. | 855 // Before calling a C-function from generated code, align arguments on stack. |
| 834 // After aligning the frame, arguments must be stored in esp[0], esp[4], | 856 // After aligning the frame, arguments must be stored in esp[0], esp[4], |
| 835 // etc., not pushed. The argument count assumes all arguments are word sized. | 857 // etc., not pushed. The argument count assumes all arguments are word sized. |
| 836 // The number of slots reserved for arguments depends on platform. On Windows | 858 // The number of slots reserved for arguments depends on platform. On Windows |
| 837 // stack slots are reserved for the arguments passed in registers. On other | 859 // stack slots are reserved for the arguments passed in registers. On other |
| 838 // platforms stack slots are only reserved for the arguments actually passed | 860 // platforms stack slots are only reserved for the arguments actually passed |
| 839 // on the stack. | 861 // on the stack. |
| 840 void PrepareCallCFunction(int num_arguments); | 862 void PrepareCallCFunction(int num_arguments); |
| 841 | 863 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 912 Handle<Code> code_constant, | 934 Handle<Code> code_constant, |
| 913 Register code_register, | 935 Register code_register, |
| 914 LabelType* done, | 936 LabelType* done, |
| 915 InvokeFlag flag); | 937 InvokeFlag flag); |
| 916 | 938 |
| 917 // Activation support. | 939 // Activation support. |
| 918 void EnterFrame(StackFrame::Type type); | 940 void EnterFrame(StackFrame::Type type); |
| 919 void LeaveFrame(StackFrame::Type type); | 941 void LeaveFrame(StackFrame::Type type); |
| 920 | 942 |
| 921 void EnterExitFramePrologue(bool save_rax); | 943 void EnterExitFramePrologue(bool save_rax); |
| 922 void EnterExitFrameEpilogue(int result_size, int argc); | 944 |
| 945 // Allocates arg_stack_space * kPointerSize memory (not GCed) on the stack |
| 946 // accessible via StackSpaceOperand. |
| 947 void EnterExitFrameEpilogue(int arg_stack_space); |
| 948 |
| 949 void LeaveExitFrameEpilogue(); |
| 923 | 950 |
| 924 // Allocation support helpers. | 951 // Allocation support helpers. |
| 925 // Loads the top of new-space into the result register. | 952 // Loads the top of new-space into the result register. |
| 926 // If flags contains RESULT_CONTAINS_TOP then result_end is valid and | 953 // If flags contains RESULT_CONTAINS_TOP then result_end is valid and |
| 927 // already contains the top of new-space, and scratch is invalid. | 954 // already contains the top of new-space, and scratch is invalid. |
| 928 // Otherwise the address of the new-space top is loaded into scratch (if | 955 // Otherwise the address of the new-space top is loaded into scratch (if |
| 929 // scratch is valid), and the new-space top is loaded into result. | 956 // scratch is valid), and the new-space top is loaded into result. |
| 930 void LoadAllocationTopHelper(Register result, | 957 void LoadAllocationTopHelper(Register result, |
| 931 Register result_end, | 958 Register result_end, |
| 932 Register scratch, | 959 Register scratch, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 | 1002 |
| 976 // Generate an Operand for loading an indexed field from an object. | 1003 // Generate an Operand for loading an indexed field from an object. |
| 977 static inline Operand FieldOperand(Register object, | 1004 static inline Operand FieldOperand(Register object, |
| 978 Register index, | 1005 Register index, |
| 979 ScaleFactor scale, | 1006 ScaleFactor scale, |
| 980 int offset) { | 1007 int offset) { |
| 981 return Operand(object, index, scale, offset - kHeapObjectTag); | 1008 return Operand(object, index, scale, offset - kHeapObjectTag); |
| 982 } | 1009 } |
| 983 | 1010 |
| 984 | 1011 |
| 1012 static inline Operand ContextOperand(Register context, int index) { |
| 1013 return Operand(context, Context::SlotOffset(index)); |
| 1014 } |
| 1015 |
| 1016 |
| 1017 static inline Operand GlobalObjectOperand() { |
| 1018 return ContextOperand(rsi, Context::GLOBAL_INDEX); |
| 1019 } |
| 1020 |
| 1021 |
| 1022 // Provides access to exit frame stack space (not GCed). |
| 1023 static inline Operand StackSpaceOperand(int index) { |
| 1024 #ifdef _WIN64 |
| 1025 const int kShaddowSpace = 4; |
| 1026 return Operand(rsp, (index + kShaddowSpace) * kPointerSize); |
| 1027 #else |
| 1028 return Operand(rsp, index * kPointerSize); |
| 1029 #endif |
| 1030 } |
| 1031 |
| 1032 |
| 1033 |
| 985 #ifdef GENERATED_CODE_COVERAGE | 1034 #ifdef GENERATED_CODE_COVERAGE |
| 986 extern void LogGeneratedCodeCoverage(const char* file_line); | 1035 extern void LogGeneratedCodeCoverage(const char* file_line); |
| 987 #define CODE_COVERAGE_STRINGIFY(x) #x | 1036 #define CODE_COVERAGE_STRINGIFY(x) #x |
| 988 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x) | 1037 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x) |
| 989 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) | 1038 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) |
| 990 #define ACCESS_MASM(masm) { \ | 1039 #define ACCESS_MASM(masm) { \ |
| 991 byte* x64_coverage_function = \ | 1040 byte* x64_coverage_function = \ |
| 992 reinterpret_cast<byte*>(FUNCTION_ADDR(LogGeneratedCodeCoverage)); \ | 1041 reinterpret_cast<byte*>(FUNCTION_ADDR(LogGeneratedCodeCoverage)); \ |
| 993 masm->pushfd(); \ | 1042 masm->pushfd(); \ |
| 994 masm->pushad(); \ | 1043 masm->pushad(); \ |
| (...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1691 Jump(adaptor, RelocInfo::CODE_TARGET); | 1740 Jump(adaptor, RelocInfo::CODE_TARGET); |
| 1692 } | 1741 } |
| 1693 bind(&invoke); | 1742 bind(&invoke); |
| 1694 } | 1743 } |
| 1695 } | 1744 } |
| 1696 | 1745 |
| 1697 | 1746 |
| 1698 } } // namespace v8::internal | 1747 } } // namespace v8::internal |
| 1699 | 1748 |
| 1700 #endif // V8_X64_MACRO_ASSEMBLER_X64_H_ | 1749 #endif // V8_X64_MACRO_ASSEMBLER_X64_H_ |
| OLD | NEW |