diff options
Diffstat (limited to 'compiler/optimizing/nodes.h')
| -rw-r--r-- | compiler/optimizing/nodes.h | 61 | 
1 files changed, 59 insertions, 2 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index 7d52d7d221..f562113e6e 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -42,6 +42,9 @@ static const int kDefaultNumberOfPredecessors = 2;  static const int kDefaultNumberOfDominatedBlocks = 1;  static const int kDefaultNumberOfBackEdges = 1; +static constexpr uint32_t kMaxIntShiftValue = 0x1f; +static constexpr uint64_t kMaxLongShiftValue = 0x3f; +  enum IfCondition {    kCondEQ,    kCondNE, @@ -233,7 +236,7 @@ class HLoopInformation : public ArenaObject<kArenaAllocMisc> {      return false;    } -  int NumberOfBackEdges() const { +  size_t NumberOfBackEdges() const {      return back_edges_.Size();    } @@ -521,9 +524,11 @@ class HBasicBlock : public ArenaObject<kArenaAllocMisc> {    M(ParallelMove, Instruction)                                          \    M(ParameterValue, Instruction)                                        \    M(Phi, Instruction)                                                   \ -  M(Rem, BinaryOperation)                                             \ +  M(Rem, BinaryOperation)                                               \    M(Return, Instruction)                                                \    M(ReturnVoid, Instruction)                                            \ +  M(Shl, BinaryOperation)                                               \ +  M(Shr, BinaryOperation)                                               \    M(StaticFieldGet, Instruction)                                        \    M(StaticFieldSet, Instruction)                                        \    M(StoreLocal, Instruction)                                            \ @@ -532,6 +537,7 @@ class HBasicBlock : public ArenaObject<kArenaAllocMisc> {    M(Temporary, Instruction)                                             \    M(Throw, Instruction)                                                 \    M(TypeConversion, Instruction)                                        \ +  M(UShr, BinaryOperation)                                              \    M(Xor, BinaryOperation)                                               \  #define FOR_EACH_INSTRUCTION(M)                                         \ @@ -1831,6 +1837,57 @@ class HDivZeroCheck : public HExpression<1> {    DISALLOW_COPY_AND_ASSIGN(HDivZeroCheck);  }; +class HShl : public HBinaryOperation { + public: +  HShl(Primitive::Type result_type, HInstruction* left, HInstruction* right) +      : HBinaryOperation(result_type, left, right) {} + +  int32_t Evaluate(int32_t x, int32_t y) const OVERRIDE { return x << (y & kMaxIntShiftValue); } +  int64_t Evaluate(int64_t x, int64_t y) const OVERRIDE { return x << (y & kMaxLongShiftValue); } + +  DECLARE_INSTRUCTION(Shl); + + private: +  DISALLOW_COPY_AND_ASSIGN(HShl); +}; + +class HShr : public HBinaryOperation { + public: +  HShr(Primitive::Type result_type, HInstruction* left, HInstruction* right) +      : HBinaryOperation(result_type, left, right) {} + +  int32_t Evaluate(int32_t x, int32_t y) const OVERRIDE { return x >> (y & kMaxIntShiftValue); } +  int64_t Evaluate(int64_t x, int64_t y) const OVERRIDE { return x >> (y & kMaxLongShiftValue); } + +  DECLARE_INSTRUCTION(Shr); + + private: +  DISALLOW_COPY_AND_ASSIGN(HShr); +}; + +class HUShr : public HBinaryOperation { + public: +  HUShr(Primitive::Type result_type, HInstruction* left, HInstruction* right) +      : HBinaryOperation(result_type, left, right) {} + +  int32_t Evaluate(int32_t x, int32_t y) const OVERRIDE { +    uint32_t ux = static_cast<uint32_t>(x); +    uint32_t uy = static_cast<uint32_t>(y) & kMaxIntShiftValue; +    return static_cast<int32_t>(ux >> uy); +  } + +  int64_t Evaluate(int64_t x, int64_t y) const OVERRIDE { +    uint64_t ux = static_cast<uint64_t>(x); +    uint64_t uy = static_cast<uint64_t>(y) & kMaxLongShiftValue; +    return static_cast<int64_t>(ux >> uy); +  } + +  DECLARE_INSTRUCTION(UShr); + + private: +  DISALLOW_COPY_AND_ASSIGN(HUShr); +}; +  class HAnd : public HBinaryOperation {   public:    HAnd(Primitive::Type result_type, HInstruction* left, HInstruction* right)  |