js-typed-lowering.h 3.76 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/compiler/graph-reducer.h"
10
#include "src/compiler/opcodes.h"
11
#include "src/globals.h"
12 13 14

namespace v8 {
namespace internal {
15 16 17 18

// Forward declarations.
class Factory;

19 20
namespace compiler {

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

28
// Lowers JS-level operators to simplified operators based on types.
29 30
class V8_EXPORT_PRIVATE JSTypedLowering final
    : public NON_EXPORTED_BASE(AdvancedReducer) {
31
 public:
32
  JSTypedLowering(Editor* editor, JSGraph* jsgraph, Zone* zone);
33
  ~JSTypedLowering() final {}
34

35 36
  const char* reducer_name() const override { return "JSTypedLowering"; }

37
  Reduction Reduce(Node* node) final;
38 39 40 41 42

 private:
  friend class JSBinopReduction;

  Reduction ReduceJSAdd(Node* node);
43
  Reduction ReduceJSBitwiseNot(Node* node);
44 45
  Reduction ReduceJSDecrement(Node* node);
  Reduction ReduceJSIncrement(Node* node);
46
  Reduction ReduceJSNegate(Node* node);
47
  Reduction ReduceJSComparison(Node* node);
48
  Reduction ReduceJSLoadNamed(Node* node);
49
  Reduction ReduceJSHasInPrototypeChain(Node* node);
50
  Reduction ReduceJSOrdinaryHasInstance(Node* node);
51 52
  Reduction ReduceJSLoadContext(Node* node);
  Reduction ReduceJSStoreContext(Node* node);
53 54
  Reduction ReduceJSLoadModule(Node* node);
  Reduction ReduceJSStoreModule(Node* node);
55
  Reduction ReduceJSEqual(Node* node);
56
  Reduction ReduceJSStrictEqual(Node* node);
57 58
  Reduction ReduceJSToInteger(Node* node);
  Reduction ReduceJSToLength(Node* node);
59
  Reduction ReduceJSToName(Node* node);
60 61
  Reduction ReduceJSToNumberOrNumericInput(Node* input);
  Reduction ReduceJSToNumberOrNumeric(Node* node);
62
  Reduction ReduceJSToStringInput(Node* input);
63
  Reduction ReduceJSToString(Node* node);
64
  Reduction ReduceJSToObject(Node* node);
65
  Reduction ReduceJSConstructForwardVarargs(Node* node);
66
  Reduction ReduceJSConstruct(Node* node);
67
  Reduction ReduceJSCallForwardVarargs(Node* node);
68
  Reduction ReduceJSCall(Node* node);
69
  Reduction ReduceJSForInNext(Node* node);
70
  Reduction ReduceJSForInPrepare(Node* node);
71 72
  Reduction ReduceJSLoadMessage(Node* node);
  Reduction ReduceJSStoreMessage(Node* node);
73 74
  Reduction ReduceJSGeneratorStore(Node* node);
  Reduction ReduceJSGeneratorRestoreContinuation(Node* node);
75
  Reduction ReduceJSGeneratorRestoreContext(Node* node);
76
  Reduction ReduceJSGeneratorRestoreRegister(Node* node);
77
  Reduction ReduceJSGeneratorRestoreInputOrDebugPos(Node* node);
78 79 80
  Reduction ReduceNumberBinop(Node* node);
  Reduction ReduceInt32Binop(Node* node);
  Reduction ReduceUI32Shift(Node* node, Signedness signedness);
81
  Reduction ReduceCreateConsString(Node* node);
82
  Reduction ReduceSpeculativeNumberAdd(Node* node);
83
  Reduction ReduceSpeculativeNumberMultiply(Node* node);
84
  Reduction ReduceSpeculativeNumberBinop(Node* node);
85
  Reduction ReduceSpeculativeNumberComparison(Node* node);
86

87 88 89
  // Helper for ReduceJSLoadModule and ReduceJSStoreModule.
  Node* BuildGetModuleCell(Node* node);

90 91
  // Helpers for ReduceJSCreateConsString.
  Node* BuildGetStringLength(Node* value);
92

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

  JSGraph* jsgraph_;
102
  Type* empty_string_type_;
103
  Type* pointer_comparable_type_;
104
  TypeCache const& type_cache_;
105
};
106 107 108 109

}  // namespace compiler
}  // namespace internal
}  // namespace v8
110

111
#endif  // V8_COMPILER_JS_TYPED_LOWERING_H_