Index: src/x64/macro-assembler-x64.h |
diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h |
index b2d085f9050603cea10da75c20b28b77548cd0ef..35369118751d8ff4faca4577305cd0f101e9a296 100644 |
--- a/src/x64/macro-assembler-x64.h |
+++ b/src/x64/macro-assembler-x64.h |
@@ -152,7 +152,7 @@ class MacroAssembler: public Assembler { |
// |
// Allocates arg_stack_space * kPointerSize memory (not GCed) on the stack |
// accessible via StackSpaceOperand. |
- void EnterExitFrame(int arg_stack_space = 0); |
+ void EnterExitFrame(int arg_stack_space = 0, bool save_doubles = false); |
// Enter specific kind of exit frame. Allocates arg_stack_space * kPointerSize |
// memory (not GCed) on the stack accessible via StackSpaceOperand. |
@@ -161,20 +161,20 @@ class MacroAssembler: public Assembler { |
// 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(); |
+ void LeaveExitFrame(bool save_doubles = false); |
// Leave the current exit frame. Expects/provides the return value in |
// register rax (untouched). |
void LeaveApiExitFrame(); |
// Push and pop the registers that can hold pointers. |
- void PushSafepointRegisters() { UNIMPLEMENTED(); } |
- void PopSafepointRegisters() { UNIMPLEMENTED(); } |
+ void PushSafepointRegisters() { Pushad(); } |
+ void PopSafepointRegisters() { Popad(); } |
static int SafepointRegisterStackIndex(int reg_code) { |
- UNIMPLEMENTED(); |
- return 0; |
+ return kSafepointPushRegisterIndices[reg_code]; |
} |
+ |
// --------------------------------------------------------------------------- |
// JavaScript invokes |
@@ -301,6 +301,11 @@ class MacroAssembler: public Assembler { |
// conversion to a smi. |
Condition CheckUInteger32ValidSmiValue(Register src); |
+ // Check whether src is a Smi, and set dst to zero if it is a smi, |
+ // and to one if it isn't. |
+ void CheckSmiToIndicator(Register dst, Register src); |
+ void CheckSmiToIndicator(Register dst, const Operand& src); |
+ |
// Test-and-jump functions. Typically combines a check function |
// above with a conditional jump. |
@@ -597,6 +602,9 @@ class MacroAssembler: public Assembler { |
// (kScratchRegister, kSmiConstantRegister, kRootRegister). |
void Pushad(); |
void Popad(); |
+ // Sets the stack as after performing Popad, without actually loading the |
+ // registers. |
+ void Dropad(); |
// Compare object type for heap object. |
// Always use unsigned comparisons: above and below, not less and greater. |
@@ -812,6 +820,9 @@ class MacroAssembler: public Assembler { |
// Call a runtime routine. |
void CallRuntime(Runtime::Function* f, int num_arguments); |
+ // Call a runtime function and save the value of XMM registers. |
+ void CallRuntimeSaveDoubles(Runtime::FunctionId id); |
+ |
// Call a runtime function, returning the CodeStub object called. |
// Try to generate the stub code if necessary. Do not perform a GC |
// but instead return a retry after GC failure. |
@@ -931,6 +942,9 @@ class MacroAssembler: public Assembler { |
bool allow_stub_calls() { return allow_stub_calls_; } |
private: |
+ // Order general registers are pushed by Pushad. |
+ // rax, rcx, rdx, rbx, rsi, rdi, r8, r9, r11, r12, r14. |
+ static int kSafepointPushRegisterIndices[Register::kNumRegisters]; |
bool generating_stub_; |
bool allow_stub_calls_; |
@@ -961,7 +975,7 @@ class MacroAssembler: public Assembler { |
// Allocates arg_stack_space * kPointerSize memory (not GCed) on the stack |
// accessible via StackSpaceOperand. |
- void EnterExitFrameEpilogue(int arg_stack_space); |
+ void EnterExitFrameEpilogue(int arg_stack_space, bool save_doubles); |
void LeaveExitFrameEpilogue(); |