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_TYPED_LOWERING_H_
6 : #define V8_COMPILER_JS_TYPED_LOWERING_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/compiler/opcodes.h"
12 : #include "src/globals.h"
13 :
14 : namespace v8 {
15 : namespace internal {
16 :
17 : // Forward declarations.
18 : class CompilationDependencies;
19 : class Factory;
20 :
21 : namespace compiler {
22 :
23 : // Forward declarations.
24 : class CommonOperatorBuilder;
25 : class JSGraph;
26 : class JSOperatorBuilder;
27 : class SimplifiedOperatorBuilder;
28 : class TypeCache;
29 :
30 : // Lowers JS-level operators to simplified operators based on types.
31 : class V8_EXPORT_PRIVATE JSTypedLowering final
32 : : public NON_EXPORTED_BASE(AdvancedReducer) {
33 : public:
34 : // Flags that control the mode of operation.
35 : enum Flag {
36 : kNoFlags = 0u,
37 : kDeoptimizationEnabled = 1u << 0,
38 : };
39 : typedef base::Flags<Flag> Flags;
40 :
41 : JSTypedLowering(Editor* editor, CompilationDependencies* dependencies,
42 : Flags flags, JSGraph* jsgraph, Zone* zone);
43 395343 : ~JSTypedLowering() final {}
44 :
45 : Reduction Reduce(Node* node) final;
46 :
47 : private:
48 : friend class JSBinopReduction;
49 :
50 : Reduction ReduceJSAdd(Node* node);
51 : Reduction ReduceJSComparison(Node* node);
52 : Reduction ReduceJSLoadNamed(Node* node);
53 : Reduction ReduceJSLoadProperty(Node* node);
54 : Reduction ReduceJSStoreProperty(Node* node);
55 : Reduction ReduceJSOrdinaryHasInstance(Node* node);
56 : Reduction ReduceJSLoadContext(Node* node);
57 : Reduction ReduceJSStoreContext(Node* node);
58 : Reduction ReduceJSLoadModule(Node* node);
59 : Reduction ReduceJSStoreModule(Node* node);
60 : Reduction ReduceJSEqual(Node* node);
61 : Reduction ReduceJSStrictEqual(Node* node);
62 : Reduction ReduceJSToBoolean(Node* node);
63 : Reduction ReduceJSToInteger(Node* node);
64 : Reduction ReduceJSToLength(Node* node);
65 : Reduction ReduceJSToName(Node* node);
66 : Reduction ReduceJSToNumberInput(Node* input);
67 : Reduction ReduceJSToNumber(Node* node);
68 : Reduction ReduceJSToStringInput(Node* input);
69 : Reduction ReduceJSToString(Node* node);
70 : Reduction ReduceJSToObject(Node* node);
71 : Reduction ReduceJSConvertReceiver(Node* node);
72 : Reduction ReduceJSConstruct(Node* node);
73 : Reduction ReduceJSCallForwardVarargs(Node* node);
74 : Reduction ReduceJSCall(Node* node);
75 : Reduction ReduceJSForInNext(Node* node);
76 : Reduction ReduceJSLoadMessage(Node* node);
77 : Reduction ReduceJSStoreMessage(Node* node);
78 : Reduction ReduceJSGeneratorStore(Node* node);
79 : Reduction ReduceJSGeneratorRestoreContinuation(Node* node);
80 : Reduction ReduceJSGeneratorRestoreRegister(Node* node);
81 : Reduction ReduceJSTypeOf(Node* node);
82 : Reduction ReduceNumberBinop(Node* node);
83 : Reduction ReduceInt32Binop(Node* node);
84 : Reduction ReduceUI32Shift(Node* node, Signedness signedness);
85 : Reduction ReduceCreateConsString(Node* node);
86 : Reduction ReduceSpeculativeNumberAdd(Node* node);
87 : Reduction ReduceSpeculativeNumberMultiply(Node* node);
88 : Reduction ReduceSpeculativeNumberBinop(Node* node);
89 : Reduction ReduceSpeculativeNumberComparison(Node* node);
90 :
91 : Factory* factory() const;
92 : Graph* graph() const;
93 : JSGraph* jsgraph() const { return jsgraph_; }
94 : Isolate* isolate() const;
95 : JSOperatorBuilder* javascript() const;
96 : CommonOperatorBuilder* common() const;
97 : SimplifiedOperatorBuilder* simplified() const;
98 : CompilationDependencies* dependencies() const;
99 : Flags flags() const { return flags_; }
100 :
101 : CompilationDependencies* dependencies_;
102 : Flags flags_;
103 : JSGraph* jsgraph_;
104 : Type* shifted_int32_ranges_[4];
105 : Type* pointer_comparable_type_;
106 : TypeCache const& type_cache_;
107 : };
108 :
109 : DEFINE_OPERATORS_FOR_FLAGS(JSTypedLowering::Flags)
110 :
111 : } // namespace compiler
112 : } // namespace internal
113 : } // namespace v8
114 :
115 : #endif // V8_COMPILER_JS_TYPED_LOWERING_H_
|