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/base/compiler-specific.h"
9#include "src/compiler/common-operator.h"
10#include "src/compiler/graph-reducer.h"
11#include "src/globals.h"
12
13namespace v8 {
14namespace internal {
15
16// Forward declarations.
17class Callable;
18
19
20namespace compiler {
21
22// Forward declarations.
23class CommonOperatorBuilder;
24struct FieldAccess;
25class JSOperatorBuilder;
26class JSGraph;
27class SimplifiedOperatorBuilder;
28
29
30// Lowers certain JS-level runtime calls.
31class V8_EXPORT_PRIVATE JSIntrinsicLowering final
32    : public NON_EXPORTED_BASE(AdvancedReducer) {
33 public:
34  enum DeoptimizationMode { kDeoptimizationEnabled, kDeoptimizationDisabled };
35
36  JSIntrinsicLowering(Editor* editor, JSGraph* jsgraph,
37                      DeoptimizationMode mode);
38  ~JSIntrinsicLowering() final {}
39
40  Reduction Reduce(Node* node) final;
41
42 private:
43  Reduction ReduceCreateIterResultObject(Node* node);
44  Reduction ReduceDebugIsActive(Node* node);
45  Reduction ReduceDeoptimizeNow(Node* node);
46  Reduction ReduceGeneratorClose(Node* node);
47  Reduction ReduceGeneratorGetContext(Node* node);
48  Reduction ReduceGeneratorGetInputOrDebugPos(Node* node);
49  Reduction ReduceGeneratorGetResumeMode(Node* node);
50  Reduction ReduceIsInstanceType(Node* node, InstanceType instance_type);
51  Reduction ReduceIsJSReceiver(Node* node);
52  Reduction ReduceIsSmi(Node* node);
53  Reduction ReduceFixedArrayGet(Node* node);
54  Reduction ReduceFixedArraySet(Node* node);
55  Reduction ReduceSubString(Node* node);
56  Reduction ReduceToInteger(Node* node);
57  Reduction ReduceToLength(Node* node);
58  Reduction ReduceToNumber(Node* node);
59  Reduction ReduceToObject(Node* node);
60  Reduction ReduceToString(Node* node);
61  Reduction ReduceCall(Node* node);
62  Reduction ReduceGetSuperConstructor(Node* node);
63
64  // TODO(turbofan): typedarray.js support; drop once TypedArrays are
65  // converted to proper CodeStubAssembler based builtins.
66  Reduction ReduceArrayBufferViewField(Node* node, FieldAccess const& access);
67  Reduction ReduceMaxSmi(Node* node);
68  Reduction ReduceTypedArrayMaxSizeInHeap(Node* node);
69
70  // TODO(turbofan): collection.js support; drop once Maps and Sets are
71  // converted to proper CodeStubAssembler based builtins.
72  Reduction ReduceJSCollectionGetTable(Node* node);
73  Reduction ReduceStringGetRawHashField(Node* node);
74  Reduction ReduceTheHole(Node* node);
75
76  // TODO(turbofan): JavaScript builtins support; drop once all uses of
77  // %_ClassOf in JavaScript builtins are eliminated.
78  Reduction ReduceClassOf(Node* node);
79
80  Reduction Change(Node* node, const Operator* op);
81  Reduction Change(Node* node, const Operator* op, Node* a, Node* b);
82  Reduction Change(Node* node, const Operator* op, Node* a, Node* b, Node* c);
83  Reduction Change(Node* node, const Operator* op, Node* a, Node* b, Node* c,
84                   Node* d);
85  Reduction Change(Node* node, Callable const& callable,
86                   int stack_parameter_count);
87
88  Graph* graph() const;
89  JSGraph* jsgraph() const { return jsgraph_; }
90  Isolate* isolate() const;
91  CommonOperatorBuilder* common() const;
92  JSOperatorBuilder* javascript() const;
93  SimplifiedOperatorBuilder* simplified() const;
94  DeoptimizationMode mode() const { return mode_; }
95
96  JSGraph* const jsgraph_;
97  DeoptimizationMode const mode_;
98};
99
100}  // namespace compiler
101}  // namespace internal
102}  // namespace v8
103
104#endif  // V8_COMPILER_JS_INTRINSIC_LOWERING_H_
105