this repo has no description
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
2#include "register-state.h"
3
4#include <cstring>
5
6namespace py {
7namespace x64 {
8
9RegisterState::RegisterState() { memset(assignment_, 0, sizeof(assignment_)); }
10
11void RegisterState::assign(VirtualRegister* vreg, Register reg) {
12 VirtualRegister* previous_assignment = assignment_[reg];
13 if (previous_assignment != nullptr) {
14 previous_assignment->free();
15 }
16 assignment_[reg] = vreg;
17 vreg->assign(reg);
18}
19
20void RegisterState::free(VirtualRegister* vreg) {
21 Register reg = static_cast<Register>(*vreg);
22 CHECK(reg != kNoRegister, "no register assigned");
23 CHECK(assignment_[reg] == vreg, "inconsistent assignment");
24 vreg->free();
25 assignment_[reg] = nullptr;
26}
27
28void RegisterState::allocate(VirtualRegister* vreg, View<Register> candidates) {
29 for (Register reg : candidates) {
30 if (assignment_[reg] == nullptr) {
31 assign(vreg, reg);
32 return;
33 }
34 }
35 UNREACHABLE("no free register left");
36}
37
38void RegisterState::clobber(View<Register> registers) {
39 for (Register reg : registers) {
40 VirtualRegister* vreg = assignment_[reg];
41 if (vreg != nullptr) {
42 vreg->free();
43 assignment_[reg] = nullptr;
44 }
45 }
46}
47
48void RegisterState::reset() {
49 for (word i = 0; i < kNumRegisters; i++) {
50 VirtualRegister* vreg = assignment_[i];
51 if (vreg != nullptr) {
52 vreg->free();
53 assignment_[i] = nullptr;
54 }
55 }
56}
57
58void RegisterState::resetTo(View<RegisterAssignment> assignment) {
59 reset();
60 for (word i = 0, length = assignment.length(); i < length; i++) {
61 VirtualRegister* vreg = assignment.get(i).vreg;
62 assign(vreg, assignment.get(i).reg);
63 }
64}
65
66void RegisterState::check(View<RegisterAssignment> assignment) {
67 for (word i = 0, length = assignment.length(); i < length; i++) {
68 VirtualRegister* vreg = assignment.get(i).vreg;
69 CHECK(static_cast<Register>(*vreg) == assignment.get(i).reg,
70 "unexpected assignment");
71 }
72}
73
74} // namespace x64
75} // namespace py