| Index: src/ia32/lithium-ia32.h
|
| diff --git a/src/ia32/lithium-ia32.h b/src/ia32/lithium-ia32.h
|
| index 4c188c3fe849c0d32cf087138918f189e92ebbb5..80b8b37e90d7e0fcde19847ef3edd50ebd5c92b3 100644
|
| --- a/src/ia32/lithium-ia32.h
|
| +++ b/src/ia32/lithium-ia32.h
|
| @@ -74,6 +74,7 @@ class LCodeGen;
|
| V(ClampDToUint8) \
|
| V(ClampIToUint8) \
|
| V(ClampTToUint8) \
|
| + V(ClampTToUint8NoSSE2) \
|
| V(ClassOfTestAndBranch) \
|
| V(CmpIDAndBranch) \
|
| V(CmpObjectEqAndBranch) \
|
| @@ -167,6 +168,7 @@ class LCodeGen;
|
| V(StringLength) \
|
| V(SubI) \
|
| V(TaggedToI) \
|
| + V(TaggedToINoSSE2) \
|
| V(ThisFunction) \
|
| V(Throw) \
|
| V(ToFastProperties) \
|
| @@ -265,6 +267,9 @@ class LInstruction: public ZoneObject {
|
| virtual bool HasResult() const = 0;
|
| virtual LOperand* result() = 0;
|
|
|
| + bool HasDoubleRegisterResult();
|
| + bool HasDoubleRegisterInput();
|
| +
|
| LOperand* FirstInput() { return InputAt(0); }
|
| LOperand* Output() { return HasResult() ? result() : NULL; }
|
|
|
| @@ -1088,6 +1093,10 @@ 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")
|
| @@ -2018,6 +2027,31 @@ class LTaggedToI: public LTemplateInstruction<1, 1, 1> {
|
| };
|
|
|
|
|
| +// Truncating conversion from a tagged value to an int32.
|
| +class LTaggedToINoSSE2: public LTemplateInstruction<1, 1, 3> {
|
| + public:
|
| + LTaggedToINoSSE2(LOperand* value,
|
| + LOperand* temp1,
|
| + LOperand* temp2,
|
| + LOperand* temp3) {
|
| + inputs_[0] = value;
|
| + temps_[0] = temp1;
|
| + temps_[1] = temp2;
|
| + temps_[2] = temp3;
|
| + }
|
| +
|
| + LOperand* value() { return inputs_[0]; }
|
| + LOperand* scratch() { return temps_[0]; }
|
| + LOperand* scratch2() { return temps_[1]; }
|
| + LOperand* scratch3() { return temps_[2]; }
|
| +
|
| + DECLARE_CONCRETE_INSTRUCTION(TaggedToINoSSE2, "tagged-to-i-nosse2")
|
| + DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
|
| +
|
| + bool truncating() { return hydrogen()->CanTruncateToInt32(); }
|
| +};
|
| +
|
| +
|
| class LSmiTag: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LSmiTag(LOperand* value) {
|
| @@ -2040,6 +2074,10 @@ class LNumberUntagD: public LTemplateInstruction<1, 1, 1> {
|
| LOperand* value() { return inputs_[0]; }
|
| LOperand* temp() { return temps_[0]; }
|
|
|
| + virtual bool ClobbersDoubleRegisters() const {
|
| + return false;
|
| + }
|
| +
|
| DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
|
| DECLARE_HYDROGEN_ACCESSOR(Change);
|
| };
|
| @@ -2380,6 +2418,30 @@ class LClampTToUint8: public LTemplateInstruction<1, 1, 1> {
|
| };
|
|
|
|
|
| +// Truncating conversion from a tagged value to an int32.
|
| +class LClampTToUint8NoSSE2: public LTemplateInstruction<1, 1, 3> {
|
| + public:
|
| + 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* scratch() { return temps_[0]; }
|
| + LOperand* scratch2() { return temps_[1]; }
|
| + LOperand* scratch3() { return temps_[2]; }
|
| +
|
| + DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8NoSSE2,
|
| + "clamp-t-to-uint8-nosse2")
|
| + DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
|
| +};
|
| +
|
| +
|
| class LCheckNonSmi: public LTemplateInstruction<0, 1, 0> {
|
| public:
|
| explicit LCheckNonSmi(LOperand* value) {
|
| @@ -2742,6 +2804,7 @@ class LChunkBuilder BASE_EMBEDDED {
|
| 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
|
| @@ -2827,6 +2890,8 @@ class LChunkBuilder BASE_EMBEDDED {
|
| LInstruction* DoArithmeticT(Token::Value op,
|
| HArithmeticBinaryOperation* instr);
|
|
|
| + LOperand* GetStoreKeyedValueOperand(HStoreKeyed* instr);
|
| +
|
| LPlatformChunk* chunk_;
|
| CompilationInfo* info_;
|
| HGraph* const graph_;
|
|
|