Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 88ce87dbc264b2411a9d3711d7d95fd0db9759a3..d51594340303fdb1eec360f1c44157a432de9fea 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -87,6 +87,7 @@ class LChunkBuilder; |
V(CheckNonSmi) \ |
V(CheckPrototypeMaps) \ |
V(CheckSmi) \ |
+ V(ClampToUint8) \ |
V(ClassOfTest) \ |
V(Compare) \ |
V(CompareJSObjectEq) \ |
@@ -100,6 +101,7 @@ class LChunkBuilder; |
V(EnterInlined) \ |
V(ExternalArrayLength) \ |
V(FixedArrayLength) \ |
+ V(ForceRepresentation) \ |
V(FunctionLiteral) \ |
V(GetCachedArrayIndex) \ |
V(GlobalObject) \ |
@@ -551,7 +553,6 @@ class HValue: public ZoneObject { |
Representation representation() const { return representation_; } |
void ChangeRepresentation(Representation r) { |
// Representation was already set and is allowed to be changed. |
- ASSERT(!representation_.IsNone()); |
ASSERT(!r.IsNone()); |
ASSERT(CheckFlag(kFlexibleRepresentation)); |
RepresentationChanged(r); |
@@ -1009,6 +1010,25 @@ class HThrow: public HUnaryOperation { |
}; |
+class HForceRepresentation: public HTemplateInstruction<1> { |
+ public: |
+ HForceRepresentation(HValue* value, Representation required_representation) { |
+ SetOperandAt(0, value); |
+ set_representation(required_representation); |
+ } |
+ |
+ HValue* value() { return OperandAt(0); } |
+ |
+ virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
+ |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return representation(); // Same as the output representation. |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) |
+}; |
+ |
+ |
class HChange: public HUnaryOperation { |
public: |
HChange(HValue* value, |
@@ -1054,6 +1074,46 @@ class HChange: public HUnaryOperation { |
}; |
+class HClampToUint8: public HUnaryOperation { |
+ public: |
+ explicit HClampToUint8(HValue* value) |
+ : HUnaryOperation(value), |
+ input_rep_(Representation::None()) { |
+ SetFlag(kFlexibleRepresentation); |
+ set_representation(Representation::Tagged()); |
+ SetFlag(kUseGVN); |
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return input_rep_; |
+ } |
+ |
+ virtual Representation InferredRepresentation() { |
+ // TODO(danno): Inference on input types should happen separately from |
+ // return representation. |
+ Representation new_rep = value()->representation(); |
+ if (input_rep_.IsNone()) { |
+ if (!new_rep.IsNone()) { |
+ input_rep_ = new_rep; |
+ return Representation::Integer32(); |
+ } else { |
+ return Representation::None(); |
+ } |
+ } else { |
+ return Representation::Integer32(); |
+ } |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(ClampToUint8) |
+ |
+ protected: |
+ virtual bool DataEquals(HValue* other) { return true; } |
+ |
+ private: |
+ Representation input_rep_; |
+}; |
+ |
+ |
class HSimulate: public HInstruction { |
public: |
HSimulate(int ast_id, int pop_count) |