diff options
Diffstat (limited to 'compiler/optimizing/nodes.h')
-rw-r--r-- | compiler/optimizing/nodes.h | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index b012cef3da..10d471c049 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -1007,6 +1007,15 @@ class HBinaryOperation : public HExpression<2> { virtual bool CanBeMoved() const { return true; } virtual bool InstructionDataEquals(HInstruction* other) const { return true; } + // Try to statically evaluate `operation` and return an HConstant + // containing the result of this evaluation. If `operation` cannot + // be evaluated as a constant, return nullptr. + HConstant* TryStaticEvaluation(ArenaAllocator* allocator) const; + + // Apply this operation to `x` and `y`. + virtual int32_t Evaluate(int32_t x, int32_t y) const = 0; + virtual int64_t Evaluate(int64_t x, int64_t y) const = 0; + DECLARE_INSTRUCTION(BinaryOperation); private: @@ -1035,6 +1044,9 @@ class HEqual : public HCondition { HEqual(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x == y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x == y; } + DECLARE_INSTRUCTION(Equal); virtual IfCondition GetCondition() const { @@ -1050,6 +1062,9 @@ class HNotEqual : public HCondition { HNotEqual(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x != y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x != y; } + DECLARE_INSTRUCTION(NotEqual); virtual IfCondition GetCondition() const { @@ -1065,6 +1080,9 @@ class HLessThan : public HCondition { HLessThan(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x < y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x < y; } + DECLARE_INSTRUCTION(LessThan); virtual IfCondition GetCondition() const { @@ -1080,6 +1098,9 @@ class HLessThanOrEqual : public HCondition { HLessThanOrEqual(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x <= y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x <= y; } + DECLARE_INSTRUCTION(LessThanOrEqual); virtual IfCondition GetCondition() const { @@ -1095,6 +1116,9 @@ class HGreaterThan : public HCondition { HGreaterThan(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x > y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x > y; } + DECLARE_INSTRUCTION(GreaterThan); virtual IfCondition GetCondition() const { @@ -1110,6 +1134,9 @@ class HGreaterThanOrEqual : public HCondition { HGreaterThanOrEqual(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x >= y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x >= y; } + DECLARE_INSTRUCTION(GreaterThanOrEqual); virtual IfCondition GetCondition() const { @@ -1131,6 +1158,19 @@ class HCompare : public HBinaryOperation { DCHECK_EQ(type, second->GetType()); } + virtual int32_t Evaluate(int32_t x, int32_t y) const { + return + x == y ? 0 : + x > y ? 1 : + -1; + } + virtual int64_t Evaluate(int64_t x, int64_t y) const { + return + x == y ? 0 : + x > y ? 1 : + -1; + } + DECLARE_INSTRUCTION(Compare); private: @@ -1347,6 +1387,9 @@ class HAdd : public HBinaryOperation { virtual bool IsCommutative() { return true; } + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x + y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x + y; } + DECLARE_INSTRUCTION(Add); private: @@ -1360,6 +1403,9 @@ class HSub : public HBinaryOperation { virtual bool IsCommutative() { return false; } + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x + y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x + y; } + DECLARE_INSTRUCTION(Sub); private: |