| Index: src/x87/lithium-x87.h
|
| diff --git a/src/ia32/lithium-ia32.h b/src/x87/lithium-x87.h
|
| similarity index 97%
|
| copy from src/ia32/lithium-ia32.h
|
| copy to src/x87/lithium-x87.h
|
| index 20b4a29cd85180b2757e2b9552e9e55560a5c177..b2c3f65a6d66da8e15edb344cf09a305c7d4713b 100644
|
| --- a/src/ia32/lithium-ia32.h
|
| +++ b/src/x87/lithium-x87.h
|
| @@ -2,8 +2,8 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#ifndef V8_IA32_LITHIUM_IA32_H_
|
| -#define V8_IA32_LITHIUM_IA32_H_
|
| +#ifndef V8_X87_LITHIUM_X87_H_
|
| +#define V8_X87_LITHIUM_X87_H_
|
|
|
| #include "hydrogen.h"
|
| #include "lithium-allocator.h"
|
| @@ -45,8 +45,9 @@ class LCodeGen;
|
| V(CheckValue) \
|
| V(ClampDToUint8) \
|
| V(ClampIToUint8) \
|
| - V(ClampTToUint8) \
|
| + V(ClampTToUint8NoSSE2) \
|
| V(ClassOfTestAndBranch) \
|
| + V(ClobberDoubles) \
|
| V(CompareMinusZeroAndBranch) \
|
| V(CompareNumericAndBranch) \
|
| V(CmpObjectEqAndBranch) \
|
| @@ -238,7 +239,10 @@ class LInstruction : public ZoneObject {
|
| bool ClobbersTemps() const { return IsCall(); }
|
| bool ClobbersRegisters() const { return IsCall(); }
|
| virtual bool ClobbersDoubleRegisters(Isolate* isolate) const {
|
| - return IsCall();
|
| + return IsCall() ||
|
| + // We only have rudimentary X87Stack tracking, thus in general
|
| + // cannot handle phi-nodes.
|
| + (IsControl());
|
| }
|
|
|
| virtual bool HasResult() const = 0;
|
| @@ -246,6 +250,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; }
|
| @@ -370,6 +375,18 @@ class LInstructionGap V8_FINAL : public LGap {
|
| };
|
|
|
|
|
| +class LClobberDoubles V8_FINAL : public LTemplateInstruction<0, 0, 0> {
|
| + public:
|
| + explicit LClobberDoubles(Isolate* isolate) { }
|
| +
|
| + virtual bool ClobbersDoubleRegisters(Isolate* isolate) const V8_OVERRIDE {
|
| + return true;
|
| + }
|
| +
|
| + DECLARE_CONCRETE_INSTRUCTION(ClobberDoubles, "clobber-d")
|
| +};
|
| +
|
| +
|
| class LGoto V8_FINAL : public LTemplateInstruction<0, 0, 0> {
|
| public:
|
| explicit LGoto(HBasicBlock* block) : block_(block) { }
|
| @@ -841,15 +858,13 @@ class LMathFloor V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
| };
|
|
|
|
|
| -class LMathRound V8_FINAL : public LTemplateInstruction<1, 1, 1> {
|
| +class LMathRound V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| - LMathRound(LOperand* value, LOperand* temp) {
|
| + explicit LMathRound(LOperand* value) {
|
| inputs_[0] = value;
|
| - temps_[0] = temp;
|
| }
|
|
|
| LOperand* value() { return inputs_[0]; }
|
| - LOperand* temp() { return temps_[0]; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(MathRound, "math-round")
|
| DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
|
| @@ -1976,12 +1991,11 @@ class LCallRuntime V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
| DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
|
|
|
| virtual bool ClobbersDoubleRegisters(Isolate* isolate) const V8_OVERRIDE {
|
| - return save_doubles() == kDontSaveFPRegs;
|
| + return true;
|
| }
|
|
|
| const Runtime::Function* function() const { return hydrogen()->function(); }
|
| int arity() const { return hydrogen()->argument_count(); }
|
| - SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); }
|
| };
|
|
|
|
|
| @@ -1999,13 +2013,11 @@ class LInteger32ToDouble V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
|
|
| class LUint32ToDouble V8_FINAL : public LTemplateInstruction<1, 1, 1> {
|
| public:
|
| - explicit LUint32ToDouble(LOperand* value, LOperand* temp) {
|
| + explicit LUint32ToDouble(LOperand* value) {
|
| inputs_[0] = value;
|
| - temps_[0] = temp;
|
| }
|
|
|
| LOperand* value() { return inputs_[0]; }
|
| - LOperand* temp() { return temps_[0]; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(Uint32ToDouble, "uint32-to-double")
|
| };
|
| @@ -2025,17 +2037,15 @@ class LNumberTagI V8_FINAL : public LTemplateInstruction<1, 1, 1> {
|
| };
|
|
|
|
|
| -class LNumberTagU V8_FINAL : public LTemplateInstruction<1, 1, 2> {
|
| +class LNumberTagU V8_FINAL : public LTemplateInstruction<1, 1, 1> {
|
| public:
|
| - LNumberTagU(LOperand* value, LOperand* temp1, LOperand* temp2) {
|
| + LNumberTagU(LOperand* value, LOperand* temp) {
|
| inputs_[0] = value;
|
| - temps_[0] = temp1;
|
| - temps_[1] = temp2;
|
| + temps_[0] = temp;
|
| }
|
|
|
| LOperand* value() { return inputs_[0]; }
|
| - LOperand* temp1() { return temps_[0]; }
|
| - LOperand* temp2() { return temps_[1]; }
|
| + LOperand* temp() { return temps_[0]; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(NumberTagU, "number-tag-u")
|
| };
|
| @@ -2057,15 +2067,13 @@ class LNumberTagD V8_FINAL : public LTemplateInstruction<1, 1, 1> {
|
|
|
|
|
| // Sometimes truncating conversion from a tagged value to an int32.
|
| -class LDoubleToI V8_FINAL : public LTemplateInstruction<1, 1, 1> {
|
| +class LDoubleToI V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| - LDoubleToI(LOperand* value, LOperand* temp) {
|
| + explicit LDoubleToI(LOperand* value) {
|
| inputs_[0] = value;
|
| - temps_[0] = temp;
|
| }
|
|
|
| LOperand* value() { return inputs_[0]; }
|
| - LOperand* temp() { return temps_[0]; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
|
| DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
|
| @@ -2088,15 +2096,13 @@ class LDoubleToSmi V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
|
|
|
|
| // Truncating conversion from a tagged value to an int32.
|
| -class LTaggedToI V8_FINAL : public LTemplateInstruction<1, 1, 1> {
|
| +class LTaggedToI V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| - LTaggedToI(LOperand* value, LOperand* temp) {
|
| + explicit LTaggedToI(LOperand* value) {
|
| inputs_[0] = value;
|
| - temps_[0] = temp;
|
| }
|
|
|
| LOperand* value() { return inputs_[0]; }
|
| - LOperand* temp() { return temps_[0]; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
|
| DECLARE_HYDROGEN_ACCESSOR(Change)
|
| @@ -2442,17 +2448,27 @@ class LClampIToUint8 V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
| };
|
|
|
|
|
| -class LClampTToUint8 V8_FINAL : public LTemplateInstruction<1, 1, 1> {
|
| +// Truncating conversion from a tagged value to an int32.
|
| +class LClampTToUint8NoSSE2 V8_FINAL : public LTemplateInstruction<1, 1, 3> {
|
| public:
|
| - LClampTToUint8(LOperand* value, LOperand* temp_xmm) {
|
| - inputs_[0] = value;
|
| - temps_[0] = temp_xmm;
|
| + LClampTToUint8NoSSE2(LOperand* unclamped,
|
| + LOperand* temp1,
|
| + LOperand* temp2,
|
| + LOperand* temp3) {
|
| + inputs_[0] = unclamped;
|
| + temps_[0] = temp1;
|
| + temps_[1] = temp2;
|
| + temps_[2] = temp3;
|
| }
|
|
|
| LOperand* unclamped() { return inputs_[0]; }
|
| - LOperand* temp_xmm() { return temps_[0]; }
|
| + LOperand* scratch() { return temps_[0]; }
|
| + LOperand* scratch2() { return temps_[1]; }
|
| + LOperand* scratch3() { return temps_[2]; }
|
|
|
| - DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8, "clamp-t-to-uint8")
|
| + DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8NoSSE2,
|
| + "clamp-t-to-uint8-nosse2")
|
| + DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
|
| };
|
|
|
|
|
| @@ -2749,13 +2765,11 @@ class LChunkBuilder V8_FINAL : public LChunkBuilderBase {
|
|
|
| // Methods for getting operands for Use / Define / Temp.
|
| LUnallocated* ToUnallocated(Register reg);
|
| - LUnallocated* ToUnallocated(XMMRegister 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);
|
|
|
| // A value that is guaranteed to be allocated to a register.
|
| // Operand created by UseRegister is guaranteed to be live until the end of
|
| @@ -2797,7 +2811,6 @@ class LChunkBuilder V8_FINAL : public LChunkBuilderBase {
|
| // Temporary operand that must be in a register.
|
| MUST_USE_RESULT LUnallocated* TempRegister();
|
| MUST_USE_RESULT LOperand* FixedTemp(Register reg);
|
| - MUST_USE_RESULT LOperand* FixedTemp(XMMRegister reg);
|
|
|
| // Methods for setting up define-use relationships.
|
| // Return the same instruction that they are passed.
|
| @@ -2809,8 +2822,7 @@ class LChunkBuilder V8_FINAL : public LChunkBuilderBase {
|
| LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr);
|
| LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr,
|
| Register reg);
|
| - LInstruction* DefineFixedDouble(LTemplateResultInstruction<1>* instr,
|
| - XMMRegister reg);
|
| + LInstruction* DefineX87TOS(LTemplateResultInstruction<1>* instr);
|
| // Assigns an environment to an instruction. An instruction which can
|
| // deoptimize must have an environment.
|
| LInstruction* AssignEnvironment(LInstruction* instr);
|
| @@ -2859,4 +2871,4 @@ class LChunkBuilder V8_FINAL : public LChunkBuilderBase {
|
|
|
| } } // namespace v8::internal
|
|
|
| -#endif // V8_IA32_LITHIUM_IA32_H_
|
| +#endif // V8_X87_LITHIUM_X87_H_
|
|
|