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.
5 #ifndef V8_COMPILER_JS_TYPED_LOWERING_H_
6 #define V8_COMPILER_JS_TYPED_LOWERING_H_
8 #include "src/compiler/graph-reducer.h"
9 #include "src/compiler/simplified-operator.h"
15 // Forward declarations.
16 class CommonOperatorBuilder;
18 class JSOperatorBuilder;
19 class MachineOperatorBuilder;
22 // Lowers JS-level operators to simplified operators based on types.
23 class JSTypedLowering FINAL : public Reducer {
25 JSTypedLowering(JSGraph* jsgraph, Zone* zone);
26 ~JSTypedLowering() FINAL {}
28 Reduction Reduce(Node* node) FINAL;
31 friend class JSBinopReduction;
33 Reduction ReplaceEagerly(Node* old, Node* node);
34 Reduction ReduceJSAdd(Node* node);
35 Reduction ReduceJSBitwiseOr(Node* node);
36 Reduction ReduceJSMultiply(Node* node);
37 Reduction ReduceJSComparison(Node* node);
38 Reduction ReduceJSLoadProperty(Node* node);
39 Reduction ReduceJSStoreProperty(Node* node);
40 Reduction ReduceJSLoadContext(Node* node);
41 Reduction ReduceJSStoreContext(Node* node);
42 Reduction ReduceJSEqual(Node* node, bool invert);
43 Reduction ReduceJSStrictEqual(Node* node, bool invert);
44 Reduction ReduceJSUnaryNot(Node* node);
45 Reduction ReduceJSToBoolean(Node* node);
46 Reduction ReduceJSToNumberInput(Node* input);
47 Reduction ReduceJSToNumber(Node* node);
48 Reduction ReduceJSToStringInput(Node* input);
49 Reduction ReduceJSToString(Node* node);
50 Reduction ReduceNumberBinop(Node* node, const Operator* numberOp);
51 Reduction ReduceInt32Binop(Node* node, const Operator* intOp);
52 Reduction ReduceUI32Shift(Node* node, Signedness left_signedness,
53 const Operator* shift_op);
55 Node* ConvertToNumber(Node* input);
56 template <IrOpcode::Value>
57 Node* FindConversion(Node* input);
58 void InsertConversion(Node* conversion);
60 Node* Word32Shl(Node* const lhs, int32_t const rhs);
62 Factory* factory() const;
64 JSGraph* jsgraph() const { return jsgraph_; }
65 JSOperatorBuilder* javascript() const;
66 CommonOperatorBuilder* common() const;
67 SimplifiedOperatorBuilder* simplified() { return &simplified_; }
68 MachineOperatorBuilder* machine() const;
71 SimplifiedOperatorBuilder simplified_;
72 ZoneVector<Node*> conversions_; // Cache inserted JSToXXX() conversions.
75 Type* zero_thirtyone_range_;
76 Type* shifted_int32_ranges_[4];
79 } // namespace compiler
80 } // namespace internal
83 #endif // V8_COMPILER_JS_TYPED_LOWERING_H_