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_; |