blob: a370b7a02ae05969da1e5d99ad2ec885d6e417cd [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008#include "src/base/flags.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00009#include "src/compiler/graph-reducer.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010#include "src/compiler/opcodes.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011
12namespace v8 {
13namespace internal {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000014
15// Forward declarations.
16class CompilationDependencies;
17class Factory;
18class TypeCache;
19
20
Ben Murdochb8a8cc12014-11-26 15:28:44 +000021namespace compiler {
22
Emily Bernierd0a1eb72015-03-24 16:35:39 -040023// Forward declarations.
24class CommonOperatorBuilder;
25class JSGraph;
26class JSOperatorBuilder;
27class MachineOperatorBuilder;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028class SimplifiedOperatorBuilder;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040029
30
Ben Murdochb8a8cc12014-11-26 15:28:44 +000031// Lowers JS-level operators to simplified operators based on types.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000032class JSTypedLowering final : public AdvancedReducer {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000033 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000034 // Flags that control the mode of operation.
35 enum Flag {
36 kNoFlags = 0u,
37 kDeoptimizationEnabled = 1u << 0,
38 kDisableBinaryOpReduction = 1u << 1,
Ben Murdoch61f157c2016-09-16 13:49:30 +010039 kTypeFeedbackEnabled = 1u << 2,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000040 };
41 typedef base::Flags<Flag> Flags;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000042
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000043 JSTypedLowering(Editor* editor, CompilationDependencies* dependencies,
44 Flags flags, JSGraph* jsgraph, Zone* zone);
45 ~JSTypedLowering() final {}
46
47 Reduction Reduce(Node* node) final;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048
49 private:
50 friend class JSBinopReduction;
51
Ben Murdochb8a8cc12014-11-26 15:28:44 +000052 Reduction ReduceJSAdd(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000053 Reduction ReduceJSModulus(Node* node);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040054 Reduction ReduceJSBitwiseOr(Node* node);
55 Reduction ReduceJSMultiply(Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000056 Reduction ReduceJSComparison(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000057 Reduction ReduceJSLoadNamed(Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000058 Reduction ReduceJSLoadProperty(Node* node);
59 Reduction ReduceJSStoreProperty(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000060 Reduction ReduceJSInstanceOf(Node* node);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040061 Reduction ReduceJSLoadContext(Node* node);
62 Reduction ReduceJSStoreContext(Node* node);
Ben Murdochc5610432016-08-08 18:44:38 +010063 Reduction ReduceJSEqualTypeOf(Node* node, bool invert);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000064 Reduction ReduceJSEqual(Node* node, bool invert);
65 Reduction ReduceJSStrictEqual(Node* node, bool invert);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040066 Reduction ReduceJSToBoolean(Node* node);
Ben Murdochda12d292016-06-02 14:46:10 +010067 Reduction ReduceJSToInteger(Node* node);
68 Reduction ReduceJSToLength(Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000069 Reduction ReduceJSToNumberInput(Node* input);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040070 Reduction ReduceJSToNumber(Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000071 Reduction ReduceJSToStringInput(Node* input);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040072 Reduction ReduceJSToString(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000073 Reduction ReduceJSToObject(Node* node);
74 Reduction ReduceJSConvertReceiver(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000075 Reduction ReduceJSCallConstruct(Node* node);
76 Reduction ReduceJSCallFunction(Node* node);
77 Reduction ReduceJSForInDone(Node* node);
78 Reduction ReduceJSForInNext(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000079 Reduction ReduceJSForInStep(Node* node);
Ben Murdoch61f157c2016-09-16 13:49:30 +010080 Reduction ReduceJSGeneratorStore(Node* node);
81 Reduction ReduceJSGeneratorRestoreContinuation(Node* node);
82 Reduction ReduceJSGeneratorRestoreRegister(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000083 Reduction ReduceSelect(Node* node);
Ben Murdoch61f157c2016-09-16 13:49:30 +010084 Reduction ReduceJSSubtract(Node* node);
85 Reduction ReduceJSDivide(Node* node);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040086 Reduction ReduceInt32Binop(Node* node, const Operator* intOp);
87 Reduction ReduceUI32Shift(Node* node, Signedness left_signedness,
88 const Operator* shift_op);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040089
90 Node* Word32Shl(Node* const lhs, int32_t const rhs);
91
Ben Murdoch61f157c2016-09-16 13:49:30 +010092 Node* EmptyFrameState();
93
Emily Bernierd0a1eb72015-03-24 16:35:39 -040094 Factory* factory() const;
95 Graph* graph() const;
96 JSGraph* jsgraph() const { return jsgraph_; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000097 Isolate* isolate() const;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040098 JSOperatorBuilder* javascript() const;
99 CommonOperatorBuilder* common() const;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000100 SimplifiedOperatorBuilder* simplified() const;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400101 MachineOperatorBuilder* machine() const;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000102 CompilationDependencies* dependencies() const;
103 Flags flags() const { return flags_; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000104
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000105 CompilationDependencies* dependencies_;
106 Flags flags_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000107 JSGraph* jsgraph_;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400108 Type* shifted_int32_ranges_[4];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000109 Type* const true_type_;
110 Type* const false_type_;
111 Type* const the_hole_type_;
112 TypeCache const& type_cache_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000113};
114
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000115DEFINE_OPERATORS_FOR_FLAGS(JSTypedLowering::Flags)
116
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000117} // namespace compiler
118} // namespace internal
119} // namespace v8
120
121#endif // V8_COMPILER_JS_TYPED_LOWERING_H_