diff --git a/src/arch/x86_64/compile.rs b/src/arch/x86_64/compile.rs index f393e7c..8ed4591 100644 --- a/src/arch/x86_64/compile.rs +++ b/src/arch/x86_64/compile.rs @@ -11,15 +11,6 @@ pub struct Encoder<'a> { pub vars: VarMap, } -#[derive(Clone, Copy)] -pub struct RegUse { - pos: usize, - // required var, if any - var: Option, -} -pub type VarUses = HashMap>; -pub type RegUses = [VecDeque; 16]; - pub fn compile(p: &Program) -> Result, CompilerMsg> { let mut encoder = Encoder::new(p); @@ -78,8 +69,15 @@ pub fn compile(p: &Program) -> Result, CompilerMsg> { #[derive(Default)] pub struct SegUses { - var: VarUses, - reg: RegUses, + var: HashMap>, + reg: [VecDeque; 16], +} + +#[derive(Clone, Copy)] +pub struct RegUse { + pos: usize, + // required var, if any + var: Option, } pub fn calc_uses( @@ -90,14 +88,16 @@ pub fn calc_uses( let mut pos = 0; let seg_i = segments.len(); segments.push(Default::default()); - let mut vars = VarUses::default(); - let mut regs = RegUses::default(); + let mut uses = SegUses::default(); macro_rules! push { ($var:ident) => { push!($var, 0) }; ($var:ident, $pos:expr) => { - vars.entry($var.clone()).or_default().push_back(pos + $pos) + uses.var + .entry($var.clone()) + .or_default() + .push_back(pos + $pos) }; } for instr in body { @@ -108,12 +108,12 @@ pub fn calc_uses( push!(dst); for ® in conv.scratch() { - regs[reg as usize].push_back(RegUse { pos, var: None }); + uses.reg[reg as usize].push_back(RegUse { pos, var: None }); } for (i, &arg) in args.iter().enumerate() { push!(arg); if let Some(®) = conv.param().get(i) { - regs[reg as usize].back_mut().unwrap().var = Some(arg); + uses.reg[reg as usize].back_mut().unwrap().var = Some(arg); } } } @@ -181,20 +181,19 @@ pub fn calc_uses( for &(reg, var) in &asm.args { push!(var); used.remove(®); - regs[reg as usize].push_back(RegUse { + uses.reg[reg as usize].push_back(RegUse { pos, var: Some(var), }); } for reg in used { - regs[reg as usize].push_back(RegUse { pos, var: None }); + uses.reg[reg as usize].push_back(RegUse { pos, var: None }); } } } pos += 1; } - segments[seg_i].var = vars; - segments[seg_i].reg = regs; + segments[seg_i] = uses; return (seg_i, pos); }