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/compiler/graph-reducer.h"
10 : #include "src/compiler/opcodes.h"
11 : #include "src/globals.h"
12 :
13 : namespace v8 {
14 : namespace internal {
15 :
16 : // Forward declarations.
17 : class Factory;
18 :
19 : namespace compiler {
20 :
21 : // Forward declarations.
22 : class CommonOperatorBuilder;
23 : class JSGraph;
24 : class JSOperatorBuilder;
25 : class SimplifiedOperatorBuilder;
26 : class TypeCache;
27 :
28 : // Lowers JS-level operators to simplified operators based on types.
29 : class V8_EXPORT_PRIVATE JSTypedLowering final
30 : : public NON_EXPORTED_BASE(AdvancedReducer) {
31 : public:
32 : JSTypedLowering(Editor* editor, JSGraph* jsgraph, Zone* zone);
33 462957 : ~JSTypedLowering() final {}
34 :
35 0 : const char* reducer_name() const override { return "JSTypedLowering"; }
36 :
37 : Reduction Reduce(Node* node) final;
38 :
39 : private:
40 : friend class JSBinopReduction;
41 :
42 : Reduction ReduceJSAdd(Node* node);
43 : Reduction ReduceJSComparison(Node* node);
44 : Reduction ReduceJSLoadNamed(Node* node);
45 : Reduction ReduceJSHasInPrototypeChain(Node* node);
46 : Reduction ReduceJSOrdinaryHasInstance(Node* node);
47 : Reduction ReduceJSLoadContext(Node* node);
48 : Reduction ReduceJSStoreContext(Node* node);
49 : Reduction ReduceJSLoadModule(Node* node);
50 : Reduction ReduceJSStoreModule(Node* node);
51 : Reduction ReduceJSEqual(Node* node);
52 : Reduction ReduceJSStrictEqual(Node* node);
53 : Reduction ReduceJSToInteger(Node* node);
54 : Reduction ReduceJSToLength(Node* node);
55 : Reduction ReduceJSToName(Node* node);
56 : Reduction ReduceJSToNumberInput(Node* input);
57 : Reduction ReduceJSToNumber(Node* node);
58 : Reduction ReduceJSToStringInput(Node* input);
59 : Reduction ReduceJSToString(Node* node);
60 : Reduction ReduceJSToObject(Node* node);
61 : Reduction ReduceJSConvertReceiver(Node* node);
62 : Reduction ReduceJSConstructForwardVarargs(Node* node);
63 : Reduction ReduceJSConstruct(Node* node);
64 : Reduction ReduceJSCallForwardVarargs(Node* node);
65 : Reduction ReduceJSCall(Node* node);
66 : Reduction ReduceJSForInNext(Node* node);
67 : Reduction ReduceJSForInPrepare(Node* node);
68 : Reduction ReduceJSLoadMessage(Node* node);
69 : Reduction ReduceJSStoreMessage(Node* node);
70 : Reduction ReduceJSGeneratorStore(Node* node);
71 : Reduction ReduceJSGeneratorRestoreContinuation(Node* node);
72 : Reduction ReduceJSGeneratorRestoreRegister(Node* node);
73 : Reduction ReduceNumberBinop(Node* node);
74 : Reduction ReduceInt32Binop(Node* node);
75 : Reduction ReduceUI32Shift(Node* node, Signedness signedness);
76 : Reduction ReduceCreateConsString(Node* node);
77 : Reduction ReduceSpeculativeNumberAdd(Node* node);
78 : Reduction ReduceSpeculativeNumberMultiply(Node* node);
79 : Reduction ReduceSpeculativeNumberBinop(Node* node);
80 : Reduction ReduceSpeculativeNumberComparison(Node* node);
81 :
82 : // Helper for ReduceJSLoadModule and ReduceJSStoreModule.
83 : Node* BuildGetModuleCell(Node* node);
84 :
85 : // Helpers for ReduceJSCreateConsString and ReduceJSStringConcat.
86 : Node* BuildGetStringLength(Node* value, Node** effect, Node* control);
87 :
88 : Factory* factory() const;
89 : Graph* graph() const;
90 : JSGraph* jsgraph() const { return jsgraph_; }
91 : Isolate* isolate() const;
92 : JSOperatorBuilder* javascript() const;
93 : CommonOperatorBuilder* common() const;
94 : SimplifiedOperatorBuilder* simplified() const;
95 :
96 : JSGraph* jsgraph_;
97 : Type* empty_string_type_;
98 : Type* pointer_comparable_type_;
99 : TypeCache const& type_cache_;
100 : };
101 :
102 : } // namespace compiler
103 : } // namespace internal
104 : } // namespace v8
105 :
106 : #endif // V8_COMPILER_JS_TYPED_LOWERING_H_
|