Index: src/ia32/lithium-codegen-ia32.h |
diff --git a/src/ia32/lithium-codegen-ia32.h b/src/ia32/lithium-codegen-ia32.h |
index 7e66ac226be49179cec4783464c5b6a1bf072cf5..1cbe4fe543a3bf556a339649426c362bf807dd9b 100644 |
--- a/src/ia32/lithium-codegen-ia32.h |
+++ b/src/ia32/lithium-codegen-ia32.h |
@@ -105,7 +105,7 @@ class LCodeGen BASE_EMBEDDED { |
Operand ToOperand(LOperand* op) const; |
Register ToRegister(LOperand* op) const; |
XMMRegister ToDoubleRegister(LOperand* op) const; |
- bool IsX87TopOfStack(LOperand* op) const; |
+ X87Register ToX87Register(LOperand* op) const; |
bool IsInteger32(LConstantOperand* op) const; |
bool IsSmi(LConstantOperand* op) const; |
@@ -118,14 +118,20 @@ class LCodeGen BASE_EMBEDDED { |
double ToDouble(LConstantOperand* op) const; |
// Support for non-sse2 (x87) floating point stack handling. |
- // These functions maintain the depth of the stack (either 0 or 1) |
- void PushX87DoubleOperand(Operand src); |
- void PushX87FloatOperand(Operand src); |
- void ReadX87Operand(Operand dst); |
- bool X87StackNonEmpty() const { return x87_stack_depth_ > 0; } |
- void PopX87(); |
- void CurrentInstructionReturnsX87Result(); |
- void FlushX87StackIfNecessary(LInstruction* instr); |
+ // These functions maintain the mapping of physical stack registers to our |
+ // virtual registers between instructions. |
+ enum X87OperandType { kX87DoubleOperand, kX87FloatOperand, kX87IntOperand }; |
+ |
+ void X87Mov(X87Register reg, Operand src, |
+ X87OperandType operand = kX87DoubleOperand); |
+ void X87Mov(Operand src, X87Register reg); |
+ |
+ void X87PrepareBinaryOp( |
+ X87Register left, X87Register right, X87Register result); |
+ |
+ void X87LoadForUsage(X87Register reg); |
+ void X87PrepareToWrite(X87Register reg); |
+ void X87CommitWrite(X87Register reg); |
Handle<Object> ToHandle(LConstantOperand* op) const; |
@@ -292,6 +298,7 @@ class LCodeGen BASE_EMBEDDED { |
Register ToRegister(int index) const; |
XMMRegister ToDoubleRegister(int index) const; |
+ X87Register ToX87Register(int index) const; |
int ToInteger32(LConstantOperand* op) const; |
Operand BuildFastArrayOperand(LOperand* elements_pointer, |
@@ -331,6 +338,7 @@ class LCodeGen BASE_EMBEDDED { |
void EmitNumberUntagDNoSSE2( |
Register input, |
Register temp, |
+ X87Register res_reg, |
bool allow_undefined_as_nan, |
bool deoptimize_on_minus_zero, |
LEnvironment* env, |
@@ -392,6 +400,16 @@ class LCodeGen BASE_EMBEDDED { |
// register, or a stack slot operand. |
void EmitPushTaggedOperand(LOperand* operand); |
+ void X87Fxch(X87Register reg, int other_slot = 0); |
+ void X87Fld(Operand src, X87OperandType opts); |
+ void X87Free(X87Register reg); |
+ |
+ void FlushX87StackIfNecessary(LInstruction* instr); |
+ void EmitFlushX87ForDeopt(); |
+ bool X87StackContains(X87Register reg); |
+ int X87ArrayIndex(X87Register reg); |
+ int x87_st2idx(int pos); |
+ |
Zone* zone_; |
LPlatformChunk* const chunk_; |
MacroAssembler* const masm_; |
@@ -413,6 +431,7 @@ class LCodeGen BASE_EMBEDDED { |
int osr_pc_offset_; |
int last_lazy_deopt_pc_; |
bool frame_is_built_; |
+ X87Register x87_stack_[X87Register::kNumAllocatableRegisters]; |
int x87_stack_depth_; |
// Builder that keeps track of safepoints in the code. The table |