• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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