use regalloc::{RealRegUniverse, Reg, RegClass, RegClassInfo, Writable, NUM_REG_CLASSES};
use std::string::ToString;
pub fn rreg(num: u8) -> Reg {
assert!(num < 16);
Reg::new_real(RegClass::I32, num, num)
}
pub fn writable_rreg(num: u8) -> Writable<Reg> {
Writable::from_reg(rreg(num))
}
pub fn pc_reg() -> Reg {
rreg(15)
}
pub fn writable_pc_reg() -> Writable<Reg> {
Writable::from_reg(pc_reg())
}
pub fn lr_reg() -> Reg {
rreg(14)
}
pub fn writable_lr_reg() -> Writable<Reg> {
Writable::from_reg(lr_reg())
}
pub fn sp_reg() -> Reg {
rreg(13)
}
pub fn writable_sp_reg() -> Writable<Reg> {
Writable::from_reg(sp_reg())
}
pub fn ip_reg() -> Reg {
rreg(12)
}
pub fn writable_ip_reg() -> Writable<Reg> {
Writable::from_reg(ip_reg())
}
pub fn fp_reg() -> Reg {
rreg(11)
}
pub fn writable_fp_reg() -> Writable<Reg> {
Writable::from_reg(fp_reg())
}
pub fn tmp2_reg() -> Reg {
rreg(10)
}
pub fn writable_tmp2_reg() -> Writable<Reg> {
Writable::from_reg(tmp2_reg())
}
pub fn create_reg_universe() -> RealRegUniverse {
let mut regs = vec![];
let mut allocable_by_class = [None; NUM_REG_CLASSES];
let r_reg_base = 0u8;
let r_reg_count = 10; for i in 0..r_reg_count {
let reg = Reg::new_real(
RegClass::I32,
i,
r_reg_base + i,
)
.to_real_reg();
let name = format!("r{}", i);
regs.push((reg, name));
}
let r_reg_last = r_reg_base + r_reg_count - 1;
allocable_by_class[RegClass::I32.rc_to_usize()] = Some(RegClassInfo {
first: r_reg_base as usize,
last: r_reg_last as usize,
suggested_scratch: None,
});
let allocable = regs.len();
regs.push((tmp2_reg().to_real_reg(), "r10".to_string()));
regs.push((fp_reg().to_real_reg(), "fp".to_string()));
regs.push((ip_reg().to_real_reg(), "ip".to_string()));
regs.push((sp_reg().to_real_reg(), "sp".to_string()));
regs.push((lr_reg().to_real_reg(), "lr".to_string()));
regs.push((pc_reg().to_real_reg(), "pc".to_string()));
for (i, reg) in regs.iter().enumerate() {
assert_eq!(i, reg.0.get_index());
}
RealRegUniverse {
regs,
allocable,
allocable_by_class,
}
}