Index: src/mips/macro-assembler-mips.h |
diff --git a/src/mips/macro-assembler-mips.h b/src/mips/macro-assembler-mips.h |
index d4da96fa7f4d91160552d5ee0d7ee9fb818f54d6..7be3e4ab5863d3d1a858c5d28c21b90ecf174504 100644 |
--- a/src/mips/macro-assembler-mips.h |
+++ b/src/mips/macro-assembler-mips.h |
@@ -207,9 +207,28 @@ DECLARE_NOTARGET_PROTOTYPE(Ret) |
void Swap(Register reg1, Register reg2, Register scratch = no_reg); |
void Call(Label* target); |
- // May do nothing if the registers are identical. |
- void Move(Register dst, Register src); |
+ inline void Move(Register dst, Register src) { |
+ if (!dst.is(src)) { |
Søren Thygesen Gjesse
2011/05/24 07:21:00
Indentation.
|
+ mov(dst, src); |
+ } |
+ } |
+ |
+ inline void Move(FPURegister dst, FPURegister src) { |
+ if (!dst.is(src)) { |
+ mov_d(dst, src); |
+ } |
+ } |
+ |
+ inline void Move(Register dst_low, Register dst_high, FPURegister src) { |
+ mfc1(dst_low, src); |
+ mfc1(dst_high, FPURegister::from_code(src.code() + 1)); |
+ } |
+ |
+ inline void Move(FPURegister dst, Register src_low, Register src_high) { |
+ mtc1(src_low, dst); |
+ mtc1(src_high, FPURegister::from_code(dst.code() + 1)); |
+ } |
// Jump unconditionally to given label. |
// We NEED a nop in the branch delay slot, as it used by v8, for example in |
@@ -509,34 +528,19 @@ DECLARE_NOTARGET_PROTOTYPE(Ret) |
Addu(sp, sp, Operand(count * kPointerSize)); |
} |
- // --------------------------------------------------------------------------- |
- // These functions are only used by crankshaft, so they are currently |
- // unimplemented. |
- |
// Push and pop the registers that can hold pointers, as defined by the |
// RegList constant kSafepointSavedRegisters. |
- void PushSafepointRegisters() { |
- UNIMPLEMENTED_MIPS(); |
- } |
- |
- void PopSafepointRegisters() { |
- UNIMPLEMENTED_MIPS(); |
- } |
- |
- void PushSafepointRegistersAndDoubles() { |
- UNIMPLEMENTED_MIPS(); |
- } |
- |
- void PopSafepointRegistersAndDoubles() { |
- UNIMPLEMENTED_MIPS(); |
- } |
- |
- static int SafepointRegisterStackIndex(int reg_code) { |
- UNIMPLEMENTED_MIPS(); |
- return 0; |
- } |
- |
- // --------------------------------------------------------------------------- |
+ void PushSafepointRegisters(); |
+ void PopSafepointRegisters(); |
+ void PushSafepointRegistersAndDoubles(); |
+ void PopSafepointRegistersAndDoubles(); |
+ // Store value in register src in the safepoint stack slot for |
+ // register dst. |
+ void StoreToSafepointRegisterSlot(Register src, Register dst); |
+ void StoreToSafepointRegistersAndDoublesSlot(Register src, Register dst); |
+ // Load the value of the src register from its safepoint stack slot |
+ // into register dst. |
+ void LoadFromSafepointRegisterSlot(Register dst, Register src); |
// MIPS32 R2 instruction macro. |
void Ins(Register rt, Register rs, uint16_t pos, uint16_t size); |
@@ -881,6 +885,14 @@ DECLARE_NOTARGET_PROTOTYPE(Ret) |
void CallCFunction(Register function, Register scratch, int num_arguments); |
void GetCFunctionDoubleResult(const DoubleRegister dst); |
+ // There are two ways of passing double arguments on MIPS, depending on |
+ // whether soft or hard floating point ABI is used. These functions |
+ // abstract parameter passing for the three different ways we call |
+ // C functions from generated code. |
+ void SetCallCDoubleArguments(DoubleRegister dreg); |
+ void SetCallCDoubleArguments(DoubleRegister dreg1, DoubleRegister dreg2); |
+ void SetCallCDoubleArguments(DoubleRegister dreg, Register reg); |
+ |
// Calls an API function. Allocates HandleScope, extracts returned value |
// from handle and propagates exceptions. Restores context. |
MaybeObject* TryCallApiFunctionAndReturn(ExternalReference function, |
@@ -1060,6 +1072,8 @@ DECLARE_NOTARGET_PROTOTYPE(Ret) |
Register scratch2, |
Label* failure); |
+ void LoadInstanceDescriptors(Register map, Register descriptors); |
+ |
private: |
void CallCFunctionHelper(Register function, |
ExternalReference function_reference, |
@@ -1100,11 +1114,19 @@ DECLARE_NOTARGET_PROTOTYPE(Ret) |
Register scratch1, |
Register scratch2); |
+ // Compute memory operands for safepoint stack slots. |
+ static int SafepointRegisterStackIndex(int reg_code); |
+ MemOperand SafepointRegisterSlot(Register reg); |
+ MemOperand SafepointRegistersAndDoublesSlot(Register reg); |
bool generating_stub_; |
bool allow_stub_calls_; |
// This handle will be patched with the code object on installation. |
Handle<Object> code_object_; |
+ |
+ // Needs access to SafepointRegisterStackIndex for optimized frame |
+ // traversal. |
+ friend class OptimizedFrame; |
}; |