Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 4ed0187eaee4853bd6267698997c76f305176b25..d7899ace2ca6165adebd7e6aef4ad4572c37958b 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -92,6 +92,7 @@ class LChunkBuilder; |
V(CheckInstanceType) \ |
V(CheckMaps) \ |
V(CheckNonSmi) \ |
+ V(CheckSmi) \ |
V(CheckPrototypeMaps) \ |
V(ClampToUint8) \ |
V(ClassOfTestAndBranch) \ |
@@ -129,6 +130,7 @@ class LChunkBuilder; |
V(InvokeFunction) \ |
V(IsConstructCallAndBranch) \ |
V(IsObjectAndBranch) \ |
+ V(IsNumberAndBranch) \ |
V(IsStringAndBranch) \ |
V(IsSmiAndBranch) \ |
V(IsUndetectableAndBranch) \ |
@@ -2948,6 +2950,49 @@ class HCheckInstanceType: public HUnaryOperation { |
}; |
+class HCheckSmi: public HUnaryOperation { |
+ public: |
+ explicit HCheckSmi(HValue* value) : HUnaryOperation(value) { |
+ set_representation(Representation::Smi()); |
+ SetFlag(kUseGVN); |
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) { |
+ return Representation::Tagged(); |
+ } |
+ |
+ virtual HType CalculateInferredType(); |
+ |
+ virtual HValue* Canonicalize() { |
+ HType value_type = value()->type(); |
+ if (value_type.IsSmi()) { |
+ return NULL; |
+ } |
+ return this; |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(CheckSmi) |
+ |
+ protected: |
+ virtual bool DataEquals(HValue* other) { return true; } |
+}; |
+ |
+ |
+class HIsNumberAndBranch: public HUnaryControlInstruction { |
+ public: |
+ explicit HIsNumberAndBranch(HValue* value) |
+ : HUnaryControlInstruction(value, NULL, NULL) { |
+ SetFlag(kFlexibleRepresentation); |
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) { |
+ return Representation::None(); |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(IsNumberAndBranch) |
+}; |
+ |
+ |
class HCheckNonSmi: public HUnaryOperation { |
public: |
explicit HCheckNonSmi(HValue* value) : HUnaryOperation(value) { |