Chromium Code Reviews| 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; |
| }; |