deps: update v8 to 4.3.61.21
[platform/upstream/nodejs.git] / deps / v8 / src / compiler / js-typed-lowering.h
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/compiler/graph-reducer.h"
9 #include "src/compiler/simplified-operator.h"
10
11 namespace v8 {
12 namespace internal {
13 namespace compiler {
14
15 // Forward declarations.
16 class CommonOperatorBuilder;
17 class JSGraph;
18 class JSOperatorBuilder;
19 class MachineOperatorBuilder;
20
21
22 // Lowers JS-level operators to simplified operators based on types.
23 class JSTypedLowering FINAL : public Reducer {
24  public:
25   JSTypedLowering(JSGraph* jsgraph, Zone* zone);
26   ~JSTypedLowering() FINAL {}
27
28   Reduction Reduce(Node* node) FINAL;
29
30  private:
31   friend class JSBinopReduction;
32
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);
54
55   Node* ConvertPrimitiveToNumber(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;
67   SimplifiedOperatorBuilder* simplified() { return &simplified_; }
68   MachineOperatorBuilder* machine() const;
69
70   JSGraph* jsgraph_;
71   SimplifiedOperatorBuilder simplified_;
72   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];
77 };
78
79 }  // namespace compiler
80 }  // namespace internal
81 }  // namespace v8
82
83 #endif  // V8_COMPILER_JS_TYPED_LOWERING_H_