blob: a43ed01166997428f89cf4547c0c98951f50b9e5 [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;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000016
17
18namespace compiler {
19
20// Forward declarations.
21class CommonOperatorBuilder;
22class JSOperatorBuilder;
23class JSGraph;
24class MachineOperatorBuilder;
25class SimplifiedOperatorBuilder;
26
27
28// Lowers certain JS-level runtime calls.
29class JSIntrinsicLowering final : public AdvancedReducer {
30 public:
31 enum DeoptimizationMode { kDeoptimizationEnabled, kDeoptimizationDisabled };
32
33 JSIntrinsicLowering(Editor* editor, JSGraph* jsgraph,
34 DeoptimizationMode mode);
35 ~JSIntrinsicLowering() final {}
36
37 Reduction Reduce(Node* node) final;
38
39 private:
40 Reduction ReduceConstructDouble(Node* node);
41 Reduction ReduceCreateIterResultObject(Node* node);
42 Reduction ReduceDeoptimizeNow(Node* node);
43 Reduction ReduceDoubleHi(Node* node);
44 Reduction ReduceDoubleLo(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000045 Reduction ReduceIsInstanceType(Node* node, InstanceType instance_type);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046 Reduction ReduceIsJSReceiver(Node* node);
47 Reduction ReduceIsSmi(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000048 Reduction ReduceValueOf(Node* node);
49 Reduction ReduceFixedArrayGet(Node* node);
50 Reduction ReduceFixedArraySet(Node* node);
51 Reduction ReduceRegExpConstructResult(Node* node);
52 Reduction ReduceRegExpExec(Node* node);
53 Reduction ReduceRegExpFlags(Node* node);
54 Reduction ReduceRegExpSource(Node* node);
55 Reduction ReduceSubString(Node* node);
56 Reduction ReduceToInteger(Node* node);
57 Reduction ReduceToLength(Node* node);
58 Reduction ReduceToName(Node* node);
59 Reduction ReduceToNumber(Node* node);
60 Reduction ReduceToObject(Node* node);
61 Reduction ReduceToPrimitive(Node* node);
62 Reduction ReduceToString(Node* node);
63 Reduction ReduceCall(Node* node);
Ben Murdochda12d292016-06-02 14:46:10 +010064 Reduction ReduceNewObject(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000065 Reduction ReduceGetSuperConstructor(Node* node);
Ben Murdochda12d292016-06-02 14:46:10 +010066 Reduction ReduceGetOrdinaryHasInstance(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000067
68 Reduction Change(Node* node, const Operator* op);
69 Reduction Change(Node* node, const Operator* op, Node* a, Node* b);
70 Reduction Change(Node* node, const Operator* op, Node* a, Node* b, Node* c);
71 Reduction Change(Node* node, const Operator* op, Node* a, Node* b, Node* c,
72 Node* d);
73 Reduction ChangeToUndefined(Node* node, Node* effect = nullptr);
74 Reduction Change(Node* node, Callable const& callable,
75 int stack_parameter_count);
76
77 Graph* graph() const;
78 JSGraph* jsgraph() const { return jsgraph_; }
79 Isolate* isolate() const;
80 CommonOperatorBuilder* common() const;
81 JSOperatorBuilder* javascript() const;
82 MachineOperatorBuilder* machine() const;
83 SimplifiedOperatorBuilder* simplified() const;
84 DeoptimizationMode mode() const { return mode_; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000085
86 JSGraph* const jsgraph_;
87 DeoptimizationMode const mode_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000088};
89
90} // namespace compiler
91} // namespace internal
92} // namespace v8
93
94#endif // V8_COMPILER_JS_INTRINSIC_LOWERING_H_