blob: 79a95dc195a0d4abd302838d752c11022c4d40ac [file] [log] [blame]
Ben Murdoch097c5b22016-05-18 11:27:45 +01001// Copyright 2014 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_INT64_REDUCER_H_
6#define V8_COMPILER_INT64_REDUCER_H_
7
8#include "src/compiler/common-operator.h"
9#include "src/compiler/graph.h"
10#include "src/compiler/machine-operator.h"
11#include "src/compiler/node-marker.h"
12#include "src/zone-containers.h"
13
14namespace v8 {
15namespace internal {
16namespace compiler {
17
18class Int64Lowering {
19 public:
20 Int64Lowering(Graph* graph, MachineOperatorBuilder* machine,
21 CommonOperatorBuilder* common, Zone* zone,
22 Signature<MachineRepresentation>* signature);
23
24 void LowerGraph();
25
26 private:
27 enum class State : uint8_t { kUnvisited, kOnStack, kInputsPushed, kVisited };
28
29 struct Replacement {
30 Node* low;
31 Node* high;
32 };
33
34 Zone* zone() const { return zone_; }
35 Graph* graph() const { return graph_; }
36 MachineOperatorBuilder* machine() const { return machine_; }
37 CommonOperatorBuilder* common() const { return common_; }
38 Signature<MachineRepresentation>* signature() const { return signature_; }
39
40 void LowerNode(Node* node);
41 bool DefaultLowering(Node* node);
42
43 void ReplaceNode(Node* old, Node* new_low, Node* new_high);
44 bool HasReplacementLow(Node* node);
45 Node* GetReplacementLow(Node* node);
46 bool HasReplacementHigh(Node* node);
47 Node* GetReplacementHigh(Node* node);
48
49 Zone* zone_;
50 Graph* const graph_;
51 MachineOperatorBuilder* machine_;
52 CommonOperatorBuilder* common_;
53 NodeMarker<State> state_;
54 ZoneStack<Node*> stack_;
55 Replacement* replacements_;
56 Signature<MachineRepresentation>* signature_;
57};
58
59} // namespace compiler
60} // namespace internal
61} // namespace v8
62
63#endif // V8_COMPILER_INT64_REDUCER_H_