Home | History | Annotate | Download | only in compiler
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_COMPILER_MACHINE_OPERATOR_REDUCER_H_
      6 #define V8_COMPILER_MACHINE_OPERATOR_REDUCER_H_
      7 
      8 #include "src/base/compiler-specific.h"
      9 #include "src/compiler/graph-reducer.h"
     10 #include "src/compiler/machine-operator.h"
     11 #include "src/globals.h"
     12 
     13 namespace v8 {
     14 namespace internal {
     15 namespace compiler {
     16 
     17 // Forward declarations.
     18 class CommonOperatorBuilder;
     19 class JSGraph;
     20 
     21 
     22 // Performs constant folding and strength reduction on nodes that have
     23 // machine operators.
     24 class V8_EXPORT_PRIVATE MachineOperatorReducer final
     25     : public NON_EXPORTED_BASE(Reducer) {
     26  public:
     27   explicit MachineOperatorReducer(JSGraph* jsgraph);
     28   ~MachineOperatorReducer();
     29 
     30   Reduction Reduce(Node* node) override;
     31 
     32  private:
     33   Node* Float32Constant(volatile float value);
     34   Node* Float64Constant(volatile double value);
     35   Node* Int32Constant(int32_t value);
     36   Node* Int64Constant(int64_t value);
     37   Node* Uint32Constant(uint32_t value) {
     38     return Int32Constant(bit_cast<int32_t>(value));
     39   }
     40   Node* Uint64Constant(uint64_t value) {
     41     return Int64Constant(bit_cast<int64_t>(value));
     42   }
     43   Node* Float64Mul(Node* lhs, Node* rhs);
     44   Node* Float64PowHalf(Node* value);
     45   Node* Word32And(Node* lhs, Node* rhs);
     46   Node* Word32And(Node* lhs, uint32_t rhs) {
     47     return Word32And(lhs, Uint32Constant(rhs));
     48   }
     49   Node* Word32Sar(Node* lhs, uint32_t rhs);
     50   Node* Word32Shr(Node* lhs, uint32_t rhs);
     51   Node* Word32Equal(Node* lhs, Node* rhs);
     52   Node* Int32Add(Node* lhs, Node* rhs);
     53   Node* Int32Sub(Node* lhs, Node* rhs);
     54   Node* Int32Mul(Node* lhs, Node* rhs);
     55   Node* Int32Div(Node* dividend, int32_t divisor);
     56   Node* Uint32Div(Node* dividend, uint32_t divisor);
     57 
     58   Reduction ReplaceBool(bool value) { return ReplaceInt32(value ? 1 : 0); }
     59   Reduction ReplaceFloat32(volatile float value) {
     60     return Replace(Float32Constant(value));
     61   }
     62   Reduction ReplaceFloat64(volatile double value) {
     63     return Replace(Float64Constant(value));
     64   }
     65   Reduction ReplaceInt32(int32_t value) {
     66     return Replace(Int32Constant(value));
     67   }
     68   Reduction ReplaceUint32(uint32_t value) {
     69     return Replace(Uint32Constant(value));
     70   }
     71   Reduction ReplaceInt64(int64_t value) {
     72     return Replace(Int64Constant(value));
     73   }
     74 
     75   Reduction ReduceInt32Add(Node* node);
     76   Reduction ReduceInt64Add(Node* node);
     77   Reduction ReduceInt32Sub(Node* node);
     78   Reduction ReduceInt64Sub(Node* node);
     79   Reduction ReduceInt32Div(Node* node);
     80   Reduction ReduceUint32Div(Node* node);
     81   Reduction ReduceInt32Mod(Node* node);
     82   Reduction ReduceUint32Mod(Node* node);
     83   Reduction ReduceStore(Node* node);
     84   Reduction ReduceProjection(size_t index, Node* node);
     85   Reduction ReduceWord32Shifts(Node* node);
     86   Reduction ReduceWord32Shl(Node* node);
     87   Reduction ReduceWord64Shl(Node* node);
     88   Reduction ReduceWord32Shr(Node* node);
     89   Reduction ReduceWord64Shr(Node* node);
     90   Reduction ReduceWord32Sar(Node* node);
     91   Reduction ReduceWord64Sar(Node* node);
     92   Reduction ReduceWord32And(Node* node);
     93   Reduction TryMatchWord32Ror(Node* node);
     94   Reduction ReduceWord32Or(Node* node);
     95   Reduction ReduceWord32Xor(Node* node);
     96   Reduction ReduceFloat64InsertLowWord32(Node* node);
     97   Reduction ReduceFloat64InsertHighWord32(Node* node);
     98   Reduction ReduceFloat64Compare(Node* node);
     99 
    100   Graph* graph() const;
    101   JSGraph* jsgraph() const { return jsgraph_; }
    102   CommonOperatorBuilder* common() const;
    103   MachineOperatorBuilder* machine() const;
    104 
    105   JSGraph* jsgraph_;
    106 };
    107 
    108 }  // namespace compiler
    109 }  // namespace internal
    110 }  // namespace v8
    111 
    112 #endif  // V8_COMPILER_MACHINE_OPERATOR_REDUCER_H_
    113