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