Index: src/x64/macro-assembler-x64.h |
=================================================================== |
--- src/x64/macro-assembler-x64.h (revision 5846) |
+++ src/x64/macro-assembler-x64.h (working copy) |
@@ -155,17 +155,23 @@ |
// debug mode. Expects the number of arguments in register rax and |
// sets up the number of arguments in register rdi and the pointer |
// to the first argument in register rsi. |
- void EnterExitFrame(int result_size = 1); |
+ // |
+ // Allocates arg_stack_space * kPointerSize memory (not GCed) on the stack |
+ // accessible via StackSpaceOperand. |
+ void EnterExitFrame(int arg_stack_space = 0); |
- void EnterApiExitFrame(int stack_space, |
- int argc, |
- int result_size = 1); |
+ // Enter specific kind of exit frame. Allocates arg_stack_space * kPointerSize |
+ // memory (not GCed) on the stack accessible via StackSpaceOperand. |
+ void EnterApiExitFrame(int arg_stack_space); |
// Leave the current exit frame. Expects/provides the return value in |
// register rax:rdx (untouched) and the pointer to the first |
// argument in register rsi. |
- void LeaveExitFrame(int result_size = 1); |
+ void LeaveExitFrame(); |
+ // Leave the current exit frame. Expects/provides the return value in |
+ // register rax (untouched). |
+ void LeaveApiExitFrame(); |
// --------------------------------------------------------------------------- |
// JavaScript invokes |
@@ -813,22 +819,38 @@ |
int num_arguments, |
int result_size); |
+ MUST_USE_RESULT MaybeObject* TryTailCallExternalReference( |
+ const ExternalReference& ext, int num_arguments, int result_size); |
+ |
// Convenience function: tail call a runtime routine (jump). |
void TailCallRuntime(Runtime::FunctionId fid, |
int num_arguments, |
int result_size); |
+ MUST_USE_RESULT MaybeObject* TryTailCallRuntime(Runtime::FunctionId fid, |
+ int num_arguments, |
+ int result_size); |
+ |
// Jump to a runtime routine. |
void JumpToExternalReference(const ExternalReference& ext, int result_size); |
+ // Jump to a runtime routine. |
+ MaybeObject* TryJumpToExternalReference(const ExternalReference& ext, |
+ int result_size); |
+ |
// Prepares stack to put arguments (aligns and so on). |
- // Uses calle-saved esi to restore stack state after call. |
- void PrepareCallApiFunction(int stack_space); |
+ // WIN64 calling convention requires to put the pointer to the return value |
+ // slot into rcx (rcx must be preserverd until TryCallApiFunctionAndReturn). |
+ // Saves context (rsi). Clobbers rax. Allocates arg_stack_space * kPointerSize |
+ // inside the exit frame (not GCed) accessible via StackSpaceOperand. |
+ void PrepareCallApiFunction(int arg_stack_space); |
- // Tail call an API function (jump). Allocates HandleScope, extracts |
- // returned value from handle and propogates exceptions. |
- // Clobbers ebx, edi and caller-save registers. |
- void CallApiFunctionAndReturn(ApiFunction* function); |
+ // Calls an API function. Allocates HandleScope, extracts |
+ // returned value from handle and propagates exceptions. |
+ // Clobbers r12, r14, rbx and caller-save registers. Restores context. |
+ // On return removes stack_space * kPointerSize (GCed). |
+ MUST_USE_RESULT MaybeObject* TryCallApiFunctionAndReturn( |
+ ApiFunction* function, int stack_space); |
// Before calling a C-function from generated code, align arguments on stack. |
// After aligning the frame, arguments must be stored in esp[0], esp[4], |
@@ -919,8 +941,13 @@ |
void LeaveFrame(StackFrame::Type type); |
void EnterExitFramePrologue(bool save_rax); |
- void EnterExitFrameEpilogue(int result_size, int argc); |
+ // Allocates arg_stack_space * kPointerSize memory (not GCed) on the stack |
+ // accessible via StackSpaceOperand. |
+ void EnterExitFrameEpilogue(int arg_stack_space); |
+ |
+ void LeaveExitFrameEpilogue(); |
+ |
// Allocation support helpers. |
// Loads the top of new-space into the result register. |
// If flags contains RESULT_CONTAINS_TOP then result_end is valid and |
@@ -982,6 +1009,28 @@ |
} |
+static inline Operand ContextOperand(Register context, int index) { |
+ return Operand(context, Context::SlotOffset(index)); |
+} |
+ |
+ |
+static inline Operand GlobalObjectOperand() { |
+ return ContextOperand(rsi, Context::GLOBAL_INDEX); |
+} |
+ |
+ |
+// Provides access to exit frame stack space (not GCed). |
+static inline Operand StackSpaceOperand(int index) { |
+#ifdef _WIN64 |
+ const int kShaddowSpace = 4; |
+ return Operand(rsp, (index + kShaddowSpace) * kPointerSize); |
+#else |
+ return Operand(rsp, index * kPointerSize); |
+#endif |
+} |
+ |
+ |
+ |
#ifdef GENERATED_CODE_COVERAGE |
extern void LogGeneratedCodeCoverage(const char* file_line); |
#define CODE_COVERAGE_STRINGIFY(x) #x |