This commit is contained in:
2026-07-19 02:59:17 -04:00
parent 3cbd50e619
commit 1944683dc5
+19 -20
View File
@@ -11,15 +11,6 @@ pub struct Encoder<'a> {
pub vars: VarMap, pub vars: VarMap,
} }
#[derive(Clone, Copy)]
pub struct RegUse {
pos: usize,
// required var, if any
var: Option<VarId>,
}
pub type VarUses = HashMap<VarId, VecDeque<usize>>;
pub type RegUses = [VecDeque<RegUse>; 16];
pub fn compile(p: &Program<X86_64>) -> Result<LinkedProgram<u64>, CompilerMsg> { pub fn compile(p: &Program<X86_64>) -> Result<LinkedProgram<u64>, CompilerMsg> {
let mut encoder = Encoder::new(p); let mut encoder = Encoder::new(p);
@@ -78,8 +69,15 @@ pub fn compile(p: &Program<X86_64>) -> Result<LinkedProgram<u64>, CompilerMsg> {
#[derive(Default)] #[derive(Default)]
pub struct SegUses { pub struct SegUses {
var: VarUses, var: HashMap<VarId, VecDeque<usize>>,
reg: RegUses, reg: [VecDeque<RegUse>; 16],
}
#[derive(Clone, Copy)]
pub struct RegUse {
pos: usize,
// required var, if any
var: Option<VarId>,
} }
pub fn calc_uses( pub fn calc_uses(
@@ -90,14 +88,16 @@ pub fn calc_uses(
let mut pos = 0; let mut pos = 0;
let seg_i = segments.len(); let seg_i = segments.len();
segments.push(Default::default()); segments.push(Default::default());
let mut vars = VarUses::default(); let mut uses = SegUses::default();
let mut regs = RegUses::default();
macro_rules! push { macro_rules! push {
($var:ident) => { ($var:ident) => {
push!($var, 0) push!($var, 0)
}; };
($var:ident, $pos:expr) => { ($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 { for instr in body {
@@ -108,12 +108,12 @@ pub fn calc_uses(
push!(dst); push!(dst);
for &reg in conv.scratch() { for &reg 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() { for (i, &arg) in args.iter().enumerate() {
push!(arg); push!(arg);
if let Some(&reg) = conv.param().get(i) { if let Some(&reg) = 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 { for &(reg, var) in &asm.args {
push!(var); push!(var);
used.remove(&reg); used.remove(&reg);
regs[reg as usize].push_back(RegUse { uses.reg[reg as usize].push_back(RegUse {
pos, pos,
var: Some(var), var: Some(var),
}); });
} }
for reg in used { 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; pos += 1;
} }
segments[seg_i].var = vars; segments[seg_i] = uses;
segments[seg_i].reg = regs;
return (seg_i, pos); return (seg_i, pos);
} }