Index: src/x87/lithium-codegen-x87.h |
diff --git a/src/x87/lithium-codegen-x87.h b/src/x87/lithium-codegen-x87.h |
index 080a468292a710d48853ea1c6a0602fe7919ce01..db562129673829f7bfda5523b39bd01778e7a98e 100644 |
--- a/src/x87/lithium-codegen-x87.h |
+++ b/src/x87/lithium-codegen-x87.h |
@@ -5,6 +5,7 @@ |
#ifndef V8_X87_LITHIUM_CODEGEN_X87_H_ |
#define V8_X87_LITHIUM_CODEGEN_X87_H_ |
+#include <map> |
#include "src/x87/lithium-x87.h" |
#include "src/base/logging.h" |
@@ -84,6 +85,8 @@ class LCodeGen: public LCodeGenBase { |
X87OperandType operand = kX87DoubleOperand); |
void X87Mov(Operand src, X87Register reg, |
X87OperandType operand = kX87DoubleOperand); |
+ void X87Mov(X87Register reg, X87Register src, |
+ X87OperandType operand = kX87DoubleOperand); |
void X87PrepareBinaryOp( |
X87Register left, X87Register right, X87Register result); |
@@ -200,7 +203,8 @@ class LCodeGen: public LCodeGenBase { |
void CallRuntime(const Runtime::Function* fun, |
int argc, |
- LInstruction* instr); |
+ LInstruction* instr, |
+ SaveFPRegsMode save_doubles = kDontSaveFPRegs); |
void CallRuntime(Runtime::FunctionId id, |
int argc, |
@@ -376,7 +380,7 @@ class LCodeGen: public LCodeGenBase { |
int osr_pc_offset_; |
bool frame_is_built_; |
- class X87Stack { |
+ class X87Stack : public ZoneObject { |
public: |
explicit X87Stack(MacroAssembler* masm) |
: stack_depth_(0), is_mutable_(true), masm_(masm) { } |
@@ -393,14 +397,23 @@ class LCodeGen: public LCodeGenBase { |
} |
return true; |
} |
+ X87Stack& operator=(const X87Stack& other) { |
+ stack_depth_ = other.stack_depth_; |
+ for (int i = 0; i < stack_depth_; i++) { |
+ stack_[i] = other.stack_[i]; |
+ } |
+ return *this; |
+ } |
bool Contains(X87Register reg); |
void Fxch(X87Register reg, int other_slot = 0); |
void Free(X87Register reg); |
void PrepareToWrite(X87Register reg); |
void CommitWrite(X87Register reg); |
void FlushIfNecessary(LInstruction* instr, LCodeGen* cgen); |
- void LeavingBlock(int current_block_id, LGoto* goto_instr); |
+ void LeavingBlock(int current_block_id, LGoto* goto_instr, LCodeGen* cgen); |
int depth() const { return stack_depth_; } |
+ int GetLayout(); |
+ int st(X87Register reg) { return st2idx(ArrayIndex(reg)); } |
void pop() { |
DCHECK(is_mutable_); |
stack_depth_--; |
@@ -425,6 +438,9 @@ class LCodeGen: public LCodeGenBase { |
MacroAssembler* masm_; |
}; |
X87Stack x87_stack_; |
+ // block_id -> X87Stack*; |
+ typedef std::map<int, X87Stack*> X87StackMap; |
+ X87StackMap x87_stack_map_; |
// Builder that keeps track of safepoints in the code. The table |
// itself is emitted at the end of the generated code. |
@@ -458,6 +474,7 @@ class LCodeGen: public LCodeGenBase { |
friend class LDeferredCode; |
friend class LEnvironment; |
friend class SafepointGenerator; |
+ friend class X87Stack; |
DISALLOW_COPY_AND_ASSIGN(LCodeGen); |
}; |