Line data Source code
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
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 395343 : ~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 ReduceArrayIsArray(Node* node);
59 : Reduction ReduceArrayPop(Node* node);
60 : Reduction ReduceArrayPush(Node* node);
61 : Reduction ReduceDateNow(Node* node);
62 : Reduction ReduceDateGetTime(Node* node);
63 : Reduction ReduceGlobalIsFinite(Node* node);
64 : Reduction ReduceGlobalIsNaN(Node* node);
65 : Reduction ReduceMathAbs(Node* node);
66 : Reduction ReduceMathAcos(Node* node);
67 : Reduction ReduceMathAcosh(Node* node);
68 : Reduction ReduceMathAsin(Node* node);
69 : Reduction ReduceMathAsinh(Node* node);
70 : Reduction ReduceMathAtan(Node* node);
71 : Reduction ReduceMathAtanh(Node* node);
72 : Reduction ReduceMathAtan2(Node* node);
73 : Reduction ReduceMathCbrt(Node* node);
74 : Reduction ReduceMathCeil(Node* node);
75 : Reduction ReduceMathClz32(Node* node);
76 : Reduction ReduceMathCos(Node* node);
77 : Reduction ReduceMathCosh(Node* node);
78 : Reduction ReduceMathExp(Node* node);
79 : Reduction ReduceMathExpm1(Node* node);
80 : Reduction ReduceMathFloor(Node* node);
81 : Reduction ReduceMathFround(Node* node);
82 : Reduction ReduceMathImul(Node* node);
83 : Reduction ReduceMathLog(Node* node);
84 : Reduction ReduceMathLog1p(Node* node);
85 : Reduction ReduceMathLog10(Node* node);
86 : Reduction ReduceMathLog2(Node* node);
87 : Reduction ReduceMathMax(Node* node);
88 : Reduction ReduceMathMin(Node* node);
89 : Reduction ReduceMathPow(Node* node);
90 : Reduction ReduceMathRound(Node* node);
91 : Reduction ReduceMathSign(Node* node);
92 : Reduction ReduceMathSin(Node* node);
93 : Reduction ReduceMathSinh(Node* node);
94 : Reduction ReduceMathSqrt(Node* node);
95 : Reduction ReduceMathTan(Node* node);
96 : Reduction ReduceMathTanh(Node* node);
97 : Reduction ReduceMathTrunc(Node* node);
98 : Reduction ReduceNumberIsFinite(Node* node);
99 : Reduction ReduceNumberIsInteger(Node* node);
100 : Reduction ReduceNumberIsNaN(Node* node);
101 : Reduction ReduceNumberIsSafeInteger(Node* node);
102 : Reduction ReduceNumberParseInt(Node* node);
103 : Reduction ReduceObjectCreate(Node* node);
104 : Reduction ReduceStringCharAt(Node* node);
105 : Reduction ReduceStringCharCodeAt(Node* node);
106 : Reduction ReduceStringConcat(Node* node);
107 : Reduction ReduceStringFromCharCode(Node* node);
108 : Reduction ReduceStringIndexOf(Node* node);
109 : Reduction ReduceStringIterator(Node* node);
110 : Reduction ReduceStringIteratorNext(Node* node);
111 : Reduction ReduceArrayBufferViewAccessor(Node* node,
112 : InstanceType instance_type,
113 : FieldAccess const& access);
114 :
115 : Node* ToNumber(Node* value);
116 : Node* ToUint32(Node* value);
117 :
118 : Flags flags() const { return flags_; }
119 : Graph* graph() const;
120 : Factory* factory() const;
121 : JSGraph* jsgraph() const { return jsgraph_; }
122 : Isolate* isolate() const;
123 : Handle<Context> native_context() const { return native_context_; }
124 : CommonOperatorBuilder* common() const;
125 : SimplifiedOperatorBuilder* simplified() const;
126 : JSOperatorBuilder* javascript() const;
127 : CompilationDependencies* dependencies() const { return dependencies_; }
128 :
129 : CompilationDependencies* const dependencies_;
130 : Flags const flags_;
131 : JSGraph* const jsgraph_;
132 : Handle<Context> const native_context_;
133 : TypeCache const& type_cache_;
134 : };
135 :
136 : DEFINE_OPERATORS_FOR_FLAGS(JSBuiltinReducer::Flags)
137 :
138 : } // namespace compiler
139 : } // namespace internal
140 : } // namespace v8
141 :
142 : #endif // V8_COMPILER_JS_BUILTIN_REDUCER_H_
|