| Index: src/ia32/lithium-ia32.h
|
| diff --git a/src/ia32/lithium-ia32.h b/src/ia32/lithium-ia32.h
|
| index 4efde2e0d80badb798dffd24a629db00069f8aab..56c968838998fb45826337b8810de7d928cda266 100644
|
| --- a/src/ia32/lithium-ia32.h
|
| +++ b/src/ia32/lithium-ia32.h
|
| @@ -141,7 +141,6 @@ class LCodeGen;
|
| V(MathTan) \
|
| V(ModI) \
|
| V(MulI) \
|
| - V(NegateNoSSE2D) \
|
| V(NumberTagD) \
|
| V(NumberTagI) \
|
| V(NumberTagU) \
|
| @@ -265,7 +264,11 @@ class LInstruction: public ZoneObject {
|
| bool ClobbersTemps() const { return is_call_; }
|
| bool ClobbersRegisters() const { return is_call_; }
|
| virtual bool ClobbersDoubleRegisters() const {
|
| - return is_call_ || !CpuFeatures::IsSupported(SSE2);
|
| + return is_call_ ||
|
| + (!CpuFeatures::IsSupported(SSE2) &&
|
| + // We only have rudimentary X87Stack tracking, thus in general
|
| + // cannot handle deoptimization nor phi-nodes.
|
| + (HasEnvironment() || IsControl()));
|
| }
|
|
|
| virtual bool HasResult() const = 0;
|
| @@ -273,6 +276,7 @@ class LInstruction: public ZoneObject {
|
|
|
| bool HasDoubleRegisterResult();
|
| bool HasDoubleRegisterInput();
|
| + bool IsDoubleInput(X87Register reg, LCodeGen* cgen);
|
|
|
| LOperand* FirstInput() { return InputAt(0); }
|
| LOperand* Output() { return HasResult() ? result() : NULL; }
|
| @@ -377,7 +381,6 @@ class LGap: public LTemplateInstruction<0, 0, 0> {
|
| class LInstructionGap: public LGap {
|
| public:
|
| explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
|
| - virtual bool ClobbersDoubleRegisters() const { return false; }
|
|
|
| virtual bool HasInterestingComment(LCodeGen* gen) const {
|
| return !IsRedundant();
|
| @@ -659,18 +662,6 @@ class LMathFloorOfDiv: public LTemplateInstruction<1, 2, 1> {
|
| };
|
|
|
|
|
| -class LNegateNoSSE2D: public LTemplateInstruction<1, 1, 0> {
|
| - public:
|
| - explicit LNegateNoSSE2D(LOperand* value) {
|
| - inputs_[0] = value;
|
| - }
|
| -
|
| - LOperand* value() { return inputs_[0]; }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(NegateNoSSE2D, "negate-no-sse2-d")
|
| -};
|
| -
|
| -
|
| class LMulI: public LTemplateInstruction<1, 2, 1> {
|
| public:
|
| LMulI(LOperand* left, LOperand* right, LOperand* temp) {
|
| @@ -1222,10 +1213,6 @@ class LConstantD: public LTemplateInstruction<1, 0, 1> {
|
| temps_[0] = temp;
|
| }
|
|
|
| - virtual bool ClobbersDoubleRegisters() const {
|
| - return false;
|
| - }
|
| -
|
| LOperand* temp() { return temps_[0]; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d")
|
| @@ -2206,9 +2193,7 @@ class LNumberUntagD: public LTemplateInstruction<1, 1, 1> {
|
| LOperand* value() { return inputs_[0]; }
|
| LOperand* temp() { return temps_[0]; }
|
|
|
| - virtual bool ClobbersDoubleRegisters() const {
|
| - return false;
|
| - }
|
| + virtual bool ClobbersDoubleRegisters() const { return false; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
|
| DECLARE_HYDROGEN_ACCESSOR(Change);
|
| @@ -2852,14 +2837,13 @@ class LChunkBuilder BASE_EMBEDDED {
|
| // Methods for getting operands for Use / Define / Temp.
|
| LUnallocated* ToUnallocated(Register reg);
|
| LUnallocated* ToUnallocated(XMMRegister reg);
|
| - LUnallocated* ToUnallocated(X87TopOfStackRegister reg);
|
| + LUnallocated* ToUnallocated(X87Register reg);
|
|
|
| // Methods for setting up define-use relationships.
|
| MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
|
| MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
|
| MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
|
| XMMRegister fixed_register);
|
| - MUST_USE_RESULT LOperand* UseX87TopOfStack(HValue* value);
|
|
|
| // A value that is guaranteed to be allocated to a register.
|
| // Operand created by UseRegister is guaranteed to be live until the end of
|
|
|