let mut if_block_count = 0;
let mut if_stack = vec![];
+ let mut loop_count = 0;
+ let mut loop_stack = vec![];
let mut seen_else = HashSet::new();
let mut last_label = "";
seen_else.remove(&if_counter);
}
stack.pop();
- }
+ },
+ IR::Loop => { // keep looping as long as top of stack is true/0
+ self.label(format!("_loop_{}:", loop_count));
+ self.pop_to("t0");
+ self.line(format!("bnez t0, _endloop_{}", loop_count));
+ loop_stack.push(loop_count);
+ loop_count += 1;
+ },
+ IR::EndLoop => {
+ let stack = &mut loop_stack;
+ let loop_counter = stack.last().unwrap().clone();
+ self.line(format!("j _loop_{}", loop_counter));
+ self.label(format!("_endloop_{}:", loop_counter));
+ stack.pop();
+ },
_ => bail!("not implemented yet"),
}
}