blob: 838085e40c6cd4417adaa6de4f8318f1b4f8093b [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
8#include "src/compiler/graph-reducer.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00009#include "src/compiler/simplified-operator.h"
10
11namespace v8 {
12namespace internal {
13namespace compiler {
14
Emily Bernierd0a1eb72015-03-24 16:35:39 -040015// Forward declarations.
16class CommonOperatorBuilder;
17class JSGraph;
18class JSOperatorBuilder;
19class MachineOperatorBuilder;
20
21
Ben Murdochb8a8cc12014-11-26 15:28:44 +000022// Lowers JS-level operators to simplified operators based on types.
23class JSTypedLowering FINAL : public Reducer {
24 public:
Emily Bernierd0a1eb72015-03-24 16:35:39 -040025 JSTypedLowering(JSGraph* jsgraph, Zone* zone);
26 ~JSTypedLowering() FINAL {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000027
Emily Bernierd0a1eb72015-03-24 16:35:39 -040028 Reduction Reduce(Node* node) FINAL;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000029
30 private:
31 friend class JSBinopReduction;
32
33 Reduction ReplaceEagerly(Node* old, Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000034 Reduction ReduceJSAdd(Node* node);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040035 Reduction ReduceJSBitwiseOr(Node* node);
36 Reduction ReduceJSMultiply(Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000037 Reduction ReduceJSComparison(Node* node);
38 Reduction ReduceJSLoadProperty(Node* node);
39 Reduction ReduceJSStoreProperty(Node* node);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040040 Reduction ReduceJSLoadContext(Node* node);
41 Reduction ReduceJSStoreContext(Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000042 Reduction ReduceJSEqual(Node* node, bool invert);
43 Reduction ReduceJSStrictEqual(Node* node, bool invert);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040044 Reduction ReduceJSUnaryNot(Node* node);
45 Reduction ReduceJSToBoolean(Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000046 Reduction ReduceJSToNumberInput(Node* input);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040047 Reduction ReduceJSToNumber(Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048 Reduction ReduceJSToStringInput(Node* input);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040049 Reduction ReduceJSToString(Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000050 Reduction ReduceNumberBinop(Node* node, const Operator* numberOp);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040051 Reduction ReduceInt32Binop(Node* node, const Operator* intOp);
52 Reduction ReduceUI32Shift(Node* node, Signedness left_signedness,
53 const Operator* shift_op);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000054
Emily Bernierd0a1eb72015-03-24 16:35:39 -040055 Node* ConvertToNumber(Node* input);
56 template <IrOpcode::Value>
57 Node* FindConversion(Node* input);
58 void InsertConversion(Node* conversion);
59
60 Node* Word32Shl(Node* const lhs, int32_t const rhs);
61
62 Factory* factory() const;
63 Graph* graph() const;
64 JSGraph* jsgraph() const { return jsgraph_; }
65 JSOperatorBuilder* javascript() const;
66 CommonOperatorBuilder* common() const;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000067 SimplifiedOperatorBuilder* simplified() { return &simplified_; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040068 MachineOperatorBuilder* machine() const;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000069
70 JSGraph* jsgraph_;
71 SimplifiedOperatorBuilder simplified_;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040072 ZoneVector<Node*> conversions_; // Cache inserted JSToXXX() conversions.
73 Type* zero_range_;
74 Type* one_range_;
75 Type* zero_thirtyone_range_;
76 Type* shifted_int32_ranges_[4];
Ben Murdochb8a8cc12014-11-26 15:28:44 +000077};
78
79} // namespace compiler
80} // namespace internal
81} // namespace v8
82
83#endif // V8_COMPILER_JS_TYPED_LOWERING_H_