| Index: src/ia32/lithium-ia32.h
|
| diff --git a/src/ia32/lithium-ia32.h b/src/ia32/lithium-ia32.h
|
| index 7b332d2948129c4f8c97dbc9c1b1533a5d4d3d2c..a045fbb798a95e7536a8ede8d2cd4062d111f0f8 100644
|
| --- a/src/ia32/lithium-ia32.h
|
| +++ b/src/ia32/lithium-ia32.h
|
| @@ -143,7 +143,6 @@ class LCodeGen;
|
| V(MathTan) \
|
| V(ModI) \
|
| V(MulI) \
|
| - V(NegateNoSSE2D) \
|
| V(NumberTagD) \
|
| V(NumberTagI) \
|
| V(NumberTagU) \
|
| @@ -267,7 +266,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;
|
| @@ -275,6 +278,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; }
|
| @@ -379,7 +383,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();
|
| @@ -661,18 +664,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) {
|
| @@ -1224,10 +1215,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")
|
| @@ -2208,9 +2195,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);
|
| @@ -2886,14 +2871,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
|
|
|