use crate::util::{ArrayMap};
use super::{NUM_REGISTERS, all_registers};
use super::{Register};
#[derive(Debug)]
#[allow(clippy::module_name_repetitions)]
pub struct RegisterPool {
dirty: ArrayMap<Register, bool>,
clean: Vec<Register>,
}
impl RegisterPool {
pub fn new(dirty: ArrayMap<Register, bool>) -> Self {
let mut clean = Vec::with_capacity(NUM_REGISTERS);
for reg in all_registers() {
if !dirty[reg] {
clean.push(reg);
}
}
RegisterPool {dirty, clean}
}
pub fn is_clean(&self, reg: Register) -> bool {
!self.dirty[reg]
}
pub fn num_clean(&self) -> usize { self.clean.len() }
pub fn allocate(&mut self) -> Register {
let reg = self.clean.pop().expect("No register is clean");
assert!(!self.dirty[reg]);
self.dirty[reg] = true;
reg
}
pub fn free(&mut self, reg: Register) {
assert!(self.dirty[reg]);
self.dirty[reg] = false;
self.clean.push(reg);
}
}