From 0e5324f0b0cb01f624bd28ff5b8a646000d33c96 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 13 Feb 2025 22:40:13 +0200 Subject: feat(assembler): Add instruction collapse code gen step --- assembler/src/parser/code_gen.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'assembler/src/parser/code_gen.rs') diff --git a/assembler/src/parser/code_gen.rs b/assembler/src/parser/code_gen.rs index 375a8cb..dd1b872 100644 --- a/assembler/src/parser/code_gen.rs +++ b/assembler/src/parser/code_gen.rs @@ -1,4 +1,4 @@ -use super::{ Program, Address }; +use super::{ Program, Address, Instruction }; impl Program { pub(crate) fn remove_definition_addresses(&mut self) { @@ -10,4 +10,24 @@ impl Program { } } } + + pub(crate) fn collapse_instructions(&mut self) { + let mut collapsed = Vec::new(); + let mut update_addrs = Vec::new(); + + for instr in &mut self.instructions { + update_addrs.push(collapsed.len()); + collapsed.extend(instr.collapse()); + } + + for instr in &mut self.instructions { + for arg in &mut instr.args { + if let Address::Instruction(num) = arg { + *arg = Address::Instruction(update_addrs[*num]); + } + } + } + + self.instructions = collapsed; + } } -- cgit v1.3.1-26-gb76a