js-typed-lowering.h 3.83 KB
Newer Older
1 2 3 4
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
#ifndef V8_COMPILER_JS_TYPED_LOWERING_H_
#define V8_COMPILER_JS_TYPED_LOWERING_H_
7

8
#include "src/base/compiler-specific.h"
9
#include "src/common/globals.h"
10
#include "src/compiler/graph-reducer.h"
11
#include "src/compiler/opcodes.h"
12 13 14

namespace v8 {
namespace internal {
15 16 17 18

// Forward declarations.
class Factory;

19 20
namespace compiler {

21 22
// Forward declarations.
class CommonOperatorBuilder;
23
class CompilationDependencies;
24 25
class JSGraph;
class JSOperatorBuilder;
26
class SimplifiedOperatorBuilder;
27
class TypeCache;
28

29 30
enum Signedness { kSigned, kUnsigned };

31
// Lowers JS-level operators to simplified operators based on types.
32 33
class V8_EXPORT_PRIVATE JSTypedLowering final
    : public NON_EXPORTED_BASE(AdvancedReducer) {
34
 public:
35 36
  JSTypedLowering(Editor* editor, JSGraph* jsgraph, JSHeapBroker* broker,
                  Zone* zone);
37
  ~JSTypedLowering() final = default;
38

39 40
  const char* reducer_name() const override { return "JSTypedLowering"; }

41
  Reduction Reduce(Node* node) final;
42 43 44 45 46

 private:
  friend class JSBinopReduction;

  Reduction ReduceJSAdd(Node* node);
47
  Reduction ReduceJSBitwiseNot(Node* node);
48 49
  Reduction ReduceJSDecrement(Node* node);
  Reduction ReduceJSIncrement(Node* node);
50
  Reduction ReduceJSNegate(Node* node);
51
  Reduction ReduceJSComparison(Node* node);
52
  Reduction ReduceJSLoadNamed(Node* node);
53
  Reduction ReduceJSHasInPrototypeChain(Node* node);
54
  Reduction ReduceJSOrdinaryHasInstance(Node* node);
55
  Reduction ReduceJSHasContextExtension(Node* node);
56 57
  Reduction ReduceJSLoadContext(Node* node);
  Reduction ReduceJSStoreContext(Node* node);
58 59
  Reduction ReduceJSLoadModule(Node* node);
  Reduction ReduceJSStoreModule(Node* node);
60
  Reduction ReduceJSEqual(Node* node);
61
  Reduction ReduceJSStrictEqual(Node* node);
62
  Reduction ReduceJSToLength(Node* node);
63
  Reduction ReduceJSToName(Node* node);
64 65 66
  Reduction ReduceJSToNumberInput(Node* input);
  Reduction ReduceJSToNumber(Node* node);
  Reduction ReduceJSToNumeric(Node* node);
67
  Reduction ReduceJSToStringInput(Node* input);
68
  Reduction ReduceJSToString(Node* node);
69
  Reduction ReduceJSToObject(Node* node);
70
  Reduction ReduceJSConstructForwardVarargs(Node* node);
71
  Reduction ReduceJSConstruct(Node* node);
72
  Reduction ReduceJSCallForwardVarargs(Node* node);
73
  Reduction ReduceJSCall(Node* node);
74
  Reduction ReduceJSForInNext(Node* node);
75
  Reduction ReduceJSForInPrepare(Node* node);
76 77
  Reduction ReduceJSLoadMessage(Node* node);
  Reduction ReduceJSStoreMessage(Node* node);
78 79
  Reduction ReduceJSGeneratorStore(Node* node);
  Reduction ReduceJSGeneratorRestoreContinuation(Node* node);
80
  Reduction ReduceJSGeneratorRestoreContext(Node* node);
81
  Reduction ReduceJSGeneratorRestoreRegister(Node* node);
82
  Reduction ReduceJSGeneratorRestoreInputOrDebugPos(Node* node);
83 84 85
  Reduction ReduceNumberBinop(Node* node);
  Reduction ReduceInt32Binop(Node* node);
  Reduction ReduceUI32Shift(Node* node, Signedness signedness);
86
  Reduction ReduceObjectIsArray(Node* node);
87
  Reduction ReduceJSParseInt(Node* node);
88
  Reduction ReduceJSResolvePromise(Node* node);
89

90 91 92
  // Helper for ReduceJSLoadModule and ReduceJSStoreModule.
  Node* BuildGetModuleCell(Node* node);

93 94 95
  Factory* factory() const;
  Graph* graph() const;
  JSGraph* jsgraph() const { return jsgraph_; }
96
  JSHeapBroker* broker() const { return broker_; }
97
  CompilationDependencies* dependencies() const;
98
  Isolate* isolate() const;
99 100
  JSOperatorBuilder* javascript() const;
  CommonOperatorBuilder* common() const;
101
  SimplifiedOperatorBuilder* simplified() const;
102 103

  JSGraph* jsgraph_;
104
  JSHeapBroker* broker_;
105
  Type empty_string_type_;
106
  Type pointer_comparable_type_;
107
  TypeCache const* type_cache_;
108
};
109 110 111 112

}  // namespace compiler
}  // namespace internal
}  // namespace v8
113

114
#endif  // V8_COMPILER_JS_TYPED_LOWERING_H_