this repo has no description
at trunk 75 lines 2.0 kB view raw
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