Chromium Code Reviews| Index: src/ia32/lithium-ia32.h |
| diff --git a/src/ia32/lithium-ia32.h b/src/ia32/lithium-ia32.h |
| index 4c188c3fe849c0d32cf087138918f189e92ebbb5..1fce101f2fc3dbf3d715a7f943d4a0cea492e26d 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,8 @@ class LInstruction: public ZoneObject { |
| virtual bool HasResult() const = 0; |
| virtual LOperand* result() = 0; |
| + bool HasDoubleRegisterResult(); |
| + |
| LOperand* FirstInput() { return InputAt(0); } |
| LOperand* Output() { return HasResult() ? result() : NULL; } |
| @@ -1088,6 +1092,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") |
| @@ -1397,6 +1405,7 @@ class LReturn: public LTemplateInstruction<0, 3, 0> { |
| LOperand* parameter_count() { return inputs_[2]; } |
| DECLARE_CONCRETE_INSTRUCTION(Return, "return") |
| + DECLARE_HYDROGEN_ACCESSOR(Return) |
|
danno
2013/04/08 12:57:27
Unrelated change?
|
| }; |
| @@ -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); |
|
danno
2013/04/08 12:57:27
Is this change related?
|
| + |
| LPlatformChunk* chunk_; |
| CompilationInfo* info_; |
| HGraph* const graph_; |