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_JS_BUILTIN_REDUCER_H_ 6 #define V8_COMPILER_JS_BUILTIN_REDUCER_H_ 7 8 #include "src/base/compiler-specific.h" 9 #include "src/base/flags.h" 10 #include "src/compiler/graph-reducer.h" 11 #include "src/globals.h" 12 13 namespace v8 { 14 namespace internal { 15 16 // Forward declarations. 17 class CompilationDependencies; 18 class Factory; 19 20 namespace compiler { 21 22 // Forward declarations. 23 class CommonOperatorBuilder; 24 struct FieldAccess; 25 class JSGraph; 26 class JSOperatorBuilder; 27 class SimplifiedOperatorBuilder; 28 class TypeCache; 29 30 class V8_EXPORT_PRIVATE JSBuiltinReducer final NON_EXPORTED_BASE(AdvancedReducer)31 : public NON_EXPORTED_BASE(AdvancedReducer) { 32 public: 33 // Flags that control the mode of operation. 34 enum Flag { 35 kNoFlags = 0u, 36 kDeoptimizationEnabled = 1u << 0, 37 }; 38 typedef base::Flags<Flag> Flags; 39 40 JSBuiltinReducer(Editor* editor, JSGraph* jsgraph, Flags flags, 41 CompilationDependencies* dependencies, 42 Handle<Context> native_context); 43 ~JSBuiltinReducer() final {} 44 45 Reduction Reduce(Node* node) final; 46 47 private: 48 Reduction ReduceArrayIterator(Node* node, IterationKind kind); 49 Reduction ReduceTypedArrayIterator(Node* node, IterationKind kind); 50 Reduction ReduceArrayIterator(Handle<Map> receiver_map, Node* node, 51 IterationKind kind, 52 ArrayIteratorKind iter_kind); 53 Reduction ReduceArrayIteratorNext(Node* node); 54 Reduction ReduceFastArrayIteratorNext(Handle<Map> iterator_map, Node* node, 55 IterationKind kind); 56 Reduction ReduceTypedArrayIteratorNext(Handle<Map> iterator_map, Node* node, 57 IterationKind kind); 58 Reduction ReduceArrayPop(Node* node); 59 Reduction ReduceArrayPush(Node* node); 60 Reduction ReduceDateNow(Node* node); 61 Reduction ReduceDateGetTime(Node* node); 62 Reduction ReduceGlobalIsFinite(Node* node); 63 Reduction ReduceGlobalIsNaN(Node* node); 64 Reduction ReduceMathAbs(Node* node); 65 Reduction ReduceMathAcos(Node* node); 66 Reduction ReduceMathAcosh(Node* node); 67 Reduction ReduceMathAsin(Node* node); 68 Reduction ReduceMathAsinh(Node* node); 69 Reduction ReduceMathAtan(Node* node); 70 Reduction ReduceMathAtanh(Node* node); 71 Reduction ReduceMathAtan2(Node* node); 72 Reduction ReduceMathCbrt(Node* node); 73 Reduction ReduceMathCeil(Node* node); 74 Reduction ReduceMathClz32(Node* node); 75 Reduction ReduceMathCos(Node* node); 76 Reduction ReduceMathCosh(Node* node); 77 Reduction ReduceMathExp(Node* node); 78 Reduction ReduceMathExpm1(Node* node); 79 Reduction ReduceMathFloor(Node* node); 80 Reduction ReduceMathFround(Node* node); 81 Reduction ReduceMathImul(Node* node); 82 Reduction ReduceMathLog(Node* node); 83 Reduction ReduceMathLog1p(Node* node); 84 Reduction ReduceMathLog10(Node* node); 85 Reduction ReduceMathLog2(Node* node); 86 Reduction ReduceMathMax(Node* node); 87 Reduction ReduceMathMin(Node* node); 88 Reduction ReduceMathPow(Node* node); 89 Reduction ReduceMathRound(Node* node); 90 Reduction ReduceMathSign(Node* node); 91 Reduction ReduceMathSin(Node* node); 92 Reduction ReduceMathSinh(Node* node); 93 Reduction ReduceMathSqrt(Node* node); 94 Reduction ReduceMathTan(Node* node); 95 Reduction ReduceMathTanh(Node* node); 96 Reduction ReduceMathTrunc(Node* node); 97 Reduction ReduceNumberIsFinite(Node* node); 98 Reduction ReduceNumberIsInteger(Node* node); 99 Reduction ReduceNumberIsNaN(Node* node); 100 Reduction ReduceNumberIsSafeInteger(Node* node); 101 Reduction ReduceNumberParseInt(Node* node); 102 Reduction ReduceObjectCreate(Node* node); 103 Reduction ReduceStringCharAt(Node* node); 104 Reduction ReduceStringCharCodeAt(Node* node); 105 Reduction ReduceStringFromCharCode(Node* node); 106 Reduction ReduceStringIndexOf(Node* node); 107 Reduction ReduceStringIterator(Node* node); 108 Reduction ReduceStringIteratorNext(Node* node); 109 Reduction ReduceArrayBufferViewAccessor(Node* node, 110 InstanceType instance_type, 111 FieldAccess const& access); 112 113 Node* ToNumber(Node* value); 114 Node* ToUint32(Node* value); 115 116 Flags flags() const { return flags_; } 117 Graph* graph() const; 118 Factory* factory() const; 119 JSGraph* jsgraph() const { return jsgraph_; } 120 Isolate* isolate() const; 121 Handle<Context> native_context() const { return native_context_; } 122 CommonOperatorBuilder* common() const; 123 SimplifiedOperatorBuilder* simplified() const; 124 JSOperatorBuilder* javascript() const; 125 CompilationDependencies* dependencies() const { return dependencies_; } 126 127 CompilationDependencies* const dependencies_; 128 Flags const flags_; 129 JSGraph* const jsgraph_; 130 Handle<Context> const native_context_; 131 TypeCache const& type_cache_; 132 }; 133 134 DEFINE_OPERATORS_FOR_FLAGS(JSBuiltinReducer::Flags) 135 136 } // namespace compiler 137 } // namespace internal 138 } // namespace v8 139 140 #endif // V8_COMPILER_JS_BUILTIN_REDUCER_H_ 141