blob: 59e6f492cd62e73eb431f3393b8a547a13428c29 [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);
66
67 Reduction Change(Node* node, const Operator* op);
68 Reduction Change(Node* node, const Operator* op, Node* a, Node* b);
69 Reduction Change(Node* node, const Operator* op, Node* a, Node* b, Node* c);
70 Reduction Change(Node* node, const Operator* op, Node* a, Node* b, Node* c,
71 Node* d);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000072 Reduction Change(Node* node, Callable const& callable,
73 int stack_parameter_count);
74
75 Graph* graph() const;
76 JSGraph* jsgraph() const { return jsgraph_; }
77 Isolate* isolate() const;
78 CommonOperatorBuilder* common() const;
79 JSOperatorBuilder* javascript() const;
80 MachineOperatorBuilder* machine() const;
81 SimplifiedOperatorBuilder* simplified() const;
82 DeoptimizationMode mode() const { return mode_; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000083
84 JSGraph* const jsgraph_;
85 DeoptimizationMode const mode_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000086};
87
88} // namespace compiler
89} // namespace internal
90} // namespace v8
91
92#endif // V8_COMPILER_JS_INTRINSIC_LOWERING_H_