Skip to main content

sass_assembler/
lib.rs

1pub mod instructions;
2pub mod program;
3
4use crate::{instructions::SassInstruction, program::SassProgram};
5use gaia_types::Result;
6
7/// SASS 汇编器/写入器
8pub struct SassWriter {}
9
10impl SassWriter {
11    pub fn new() -> Self {
12        Self {}
13    }
14
15    pub fn write(&self, program: &SassProgram) -> Result<Vec<u8>> {
16        let mut code = String::new();
17        for kernel in &program.kernels {
18            code.push_str(&format!(".section .text.{}\n.global {}\n{}:\n", kernel.name, kernel.name, kernel.name));
19            for inst in &kernel.instructions {
20                code.push_str("    ");
21                code.push_str(&self.format_instruction(inst));
22                code.push('\n');
23            }
24        }
25
26        // 模拟生成二进制 (ELF Magic + 汇编内容)
27        let mut binary = Vec::from("\x7fELF".as_bytes());
28        binary.extend_from_slice(code.as_bytes());
29        Ok(binary)
30    }
31
32    fn format_instruction(&self, inst: &SassInstruction) -> String {
33        match inst {
34            SassInstruction::FAdd { dst, src0, src1 } => format!("FADD {}, {}, {}", dst, src0, src1),
35            SassInstruction::FMul { dst, src0, src1 } => format!("FMUL {}, {}, {}", dst, src0, src1),
36            SassInstruction::Imma { dst, src0, src1, src2 } => {
37                format!("IMMA.16.16.16.F32 {}, {}, {}, {}", dst, src0, src1, src2)
38            }
39            SassInstruction::Ldg { dst, addr } => format!("LDG.E {}, [{}]", dst, addr),
40            SassInstruction::Stg { addr, src } => format!("STG.E [{}], {}", addr, src),
41            SassInstruction::Exit => "EXIT".to_string(),
42            SassInstruction::Nop => "NOP".to_string(),
43        }
44    }
45}