blob: d8e1102afaab7dc67259b3877effc586d505c429 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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
11namespace v8 {
12namespace internal {
13
14// Forward declarations.
15class Callable;
16class TypeCache;
17
18
19namespace compiler {
20
21// Forward declarations.
22class CommonOperatorBuilder;
23class JSOperatorBuilder;
24class JSGraph;
25class MachineOperatorBuilder;
26class SimplifiedOperatorBuilder;
27
28
29// Lowers certain JS-level runtime calls.
30class JSIntrinsicLowering final : public AdvancedReducer {
31 public:
32 enum DeoptimizationMode { kDeoptimizationEnabled, kDeoptimizationDisabled };
33
34 JSIntrinsicLowering(Editor* editor, JSGraph* jsgraph,
35 DeoptimizationMode mode);
36 ~JSIntrinsicLowering() final {}
37
38 Reduction Reduce(Node* node) final;
39
40 private:
41 Reduction ReduceConstructDouble(Node* node);
42 Reduction ReduceCreateIterResultObject(Node* node);
43 Reduction ReduceDeoptimizeNow(Node* node);
44 Reduction ReduceDoubleHi(Node* node);
45 Reduction ReduceDoubleLo(Node* node);
46 Reduction ReduceIncrementStatsCounter(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000047 Reduction ReduceIsInstanceType(Node* node, InstanceType instance_type);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000048 Reduction ReduceIsJSReceiver(Node* node);
49 Reduction ReduceIsSmi(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000050 Reduction ReduceMathClz32(Node* node);
51 Reduction ReduceMathFloor(Node* node);
52 Reduction ReduceMathSqrt(Node* node);
53 Reduction ReduceValueOf(Node* node);
54 Reduction ReduceFixedArrayGet(Node* node);
55 Reduction ReduceFixedArraySet(Node* node);
56 Reduction ReduceRegExpConstructResult(Node* node);
57 Reduction ReduceRegExpExec(Node* node);
58 Reduction ReduceRegExpFlags(Node* node);
59 Reduction ReduceRegExpSource(Node* node);
60 Reduction ReduceSubString(Node* node);
61 Reduction ReduceToInteger(Node* node);
62 Reduction ReduceToLength(Node* node);
63 Reduction ReduceToName(Node* node);
64 Reduction ReduceToNumber(Node* node);
65 Reduction ReduceToObject(Node* node);
66 Reduction ReduceToPrimitive(Node* node);
67 Reduction ReduceToString(Node* node);
68 Reduction ReduceCall(Node* node);
69 Reduction ReduceTailCall(Node* node);
70 Reduction ReduceGetSuperConstructor(Node* node);
71
72 Reduction Change(Node* node, const Operator* op);
73 Reduction Change(Node* node, const Operator* op, Node* a, Node* b);
74 Reduction Change(Node* node, const Operator* op, Node* a, Node* b, Node* c);
75 Reduction Change(Node* node, const Operator* op, Node* a, Node* b, Node* c,
76 Node* d);
77 Reduction ChangeToUndefined(Node* node, Node* effect = nullptr);
78 Reduction Change(Node* node, Callable const& callable,
79 int stack_parameter_count);
80
81 Graph* graph() const;
82 JSGraph* jsgraph() const { return jsgraph_; }
83 Isolate* isolate() const;
84 CommonOperatorBuilder* common() const;
85 JSOperatorBuilder* javascript() const;
86 MachineOperatorBuilder* machine() const;
87 SimplifiedOperatorBuilder* simplified() const;
88 DeoptimizationMode mode() const { return mode_; }
89 TypeCache const& type_cache() const { return type_cache_; }
90
91 JSGraph* const jsgraph_;
92 DeoptimizationMode const mode_;
93 TypeCache const& type_cache_;
94};
95
96} // namespace compiler
97} // namespace internal
98} // namespace v8
99
100#endif // V8_COMPILER_JS_INTRINSIC_LOWERING_H_