816defbf58433206fb037a72304692e128020588
[platform/upstream/v8.git] / src / compiler / js-intrinsic-lowering.h
1 // Copyright 2015 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_INTRINSIC_LOWERING_H_
6 #define V8_COMPILER_JS_INTRINSIC_LOWERING_H_
7
8 #include "src/compiler/common-operator.h"
9 #include "src/compiler/graph-reducer.h"
10 #include "src/compiler/simplified-operator.h"
11
12 namespace v8 {
13 namespace internal {
14 namespace compiler {
15
16 // Forward declarations.
17 class CommonOperatorBuilder;
18 class JSOperatorBuilder;
19 class JSGraph;
20 class MachineOperatorBuilder;
21
22
23 // Lowers certain JS-level runtime calls.
24 class JSIntrinsicLowering final : public AdvancedReducer {
25  public:
26   enum DeoptimizationMode { kDeoptimizationEnabled, kDeoptimizationDisabled };
27
28   JSIntrinsicLowering(Editor* editor, JSGraph* jsgraph,
29                       DeoptimizationMode mode);
30   ~JSIntrinsicLowering() final {}
31
32   Reduction Reduce(Node* node) final;
33
34  private:
35   Reduction ReduceConstructDouble(Node* node);
36   Reduction ReduceDateField(Node* node);
37   Reduction ReduceDeoptimizeNow(Node* node);
38   Reduction ReduceDoubleHi(Node* node);
39   Reduction ReduceDoubleLo(Node* node);
40   Reduction ReduceHeapObjectGetMap(Node* node);
41   Reduction ReduceIncrementStatsCounter(Node* node);
42   Reduction ReduceIsMinusZero(Node* node);
43   Reduction ReduceIsInstanceType(Node* node, InstanceType instance_type);
44   Reduction ReduceIsNonNegativeSmi(Node* node);
45   Reduction ReduceIsSmi(Node* node);
46   Reduction ReduceJSValueGetValue(Node* node);
47   Reduction ReduceMapGetInstanceType(Node* node);
48   Reduction ReduceMathClz32(Node* node);
49   Reduction ReduceMathFloor(Node* node);
50   Reduction ReduceMathSqrt(Node* node);
51   Reduction ReduceSeqStringGetChar(Node* node, String::Encoding encoding);
52   Reduction ReduceSeqStringSetChar(Node* node, String::Encoding encoding);
53   Reduction ReduceStringGetLength(Node* node);
54   Reduction ReduceUnLikely(Node* node, BranchHint hint);
55   Reduction ReduceValueOf(Node* node);
56   Reduction ReduceFixedArrayGet(Node* node);
57   Reduction ReduceFixedArraySet(Node* node);
58   Reduction ReduceGetTypeFeedbackVector(Node* node);
59   Reduction ReduceGetCallerJSFunction(Node* node);
60   Reduction ReduceThrowNotDateError(Node* node);
61   Reduction ReduceCallFunction(Node* node);
62
63   Reduction Change(Node* node, const Operator* op);
64   Reduction Change(Node* node, const Operator* op, Node* a, Node* b);
65   Reduction Change(Node* node, const Operator* op, Node* a, Node* b, Node* c);
66   Reduction Change(Node* node, const Operator* op, Node* a, Node* b, Node* c,
67                    Node* d);
68   Reduction ChangeToUndefined(Node* node, Node* effect = nullptr);
69
70   Graph* graph() const;
71   JSGraph* jsgraph() const { return jsgraph_; }
72   CommonOperatorBuilder* common() const;
73   JSOperatorBuilder* javascript() const;
74   MachineOperatorBuilder* machine() const;
75   DeoptimizationMode mode() const { return mode_; }
76   SimplifiedOperatorBuilder* simplified() { return &simplified_; }
77
78   JSGraph* const jsgraph_;
79   DeoptimizationMode const mode_;
80   SimplifiedOperatorBuilder simplified_;
81 };
82
83 }  // namespace compiler
84 }  // namespace internal
85 }  // namespace v8
86
87 #endif  // V8_COMPILER_JS_INTRINSIC_LOWERING_H_