1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
// 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.
#ifndef V8_REGISTER_ALLOCATOR_VERIFIER_H_
#define V8_REGISTER_ALLOCATOR_VERIFIER_H_
#include "src/zone-containers.h"
namespace v8 {
namespace internal {
namespace compiler {
class InstructionOperand;
class InstructionSequence;
class RegisterAllocatorVerifier final : public ZoneObject {
public:
RegisterAllocatorVerifier(Zone* zone, const RegisterConfiguration* config,
const InstructionSequence* sequence);
void VerifyAssignment();
void VerifyGapMoves();
private:
enum ConstraintType {
kConstant,
kImmediate,
kRegister,
kFixedRegister,
kDoubleRegister,
kFixedDoubleRegister,
kSlot,
kDoubleSlot,
kFixedSlot,
kNone,
kNoneDouble,
kExplicit,
kSameAsFirst,
kRegisterAndSlot
};
struct OperandConstraint {
ConstraintType type_;
int value_; // subkind index when relevant
int spilled_slot_;
int virtual_register_;
};
struct InstructionConstraint {
const Instruction* instruction_;
size_t operand_constaints_size_;
OperandConstraint* operand_constraints_;
};
class BlockMaps;
typedef ZoneVector<InstructionConstraint> Constraints;
Zone* zone() const { return zone_; }
const RegisterConfiguration* config() { return config_; }
const InstructionSequence* sequence() const { return sequence_; }
Constraints* constraints() { return &constraints_; }
static void VerifyInput(const OperandConstraint& constraint);
static void VerifyTemp(const OperandConstraint& constraint);
static void VerifyOutput(const OperandConstraint& constraint);
void BuildConstraint(const InstructionOperand* op,
OperandConstraint* constraint);
void CheckConstraint(const InstructionOperand* op,
const OperandConstraint* constraint);
void VerifyGapMoves(BlockMaps* outgoing_mappings, bool initial_pass);
Zone* const zone_;
const RegisterConfiguration* config_;
const InstructionSequence* const sequence_;
Constraints constraints_;
DISALLOW_COPY_AND_ASSIGN(RegisterAllocatorVerifier);
};
} // namespace compiler
} // namespace internal
} // namespace v8
#endif
|