Started implementing an operation queue.
This commit is contained in:
parent
dd1bc0b478
commit
fba9dded42
|
@ -1,16 +1,19 @@
|
||||||
|
use std::rc::Rc;
|
||||||
use crate::parse::ast::*;
|
use crate::parse::ast::*;
|
||||||
use skylang::temp;
|
use skylang::temp;
|
||||||
|
|
||||||
const REGISTERS: [&str; 9] = ["r10", "r11", "r12", "r13", "r14", "r15", "rax", "rdi", "rsi"];
|
const REGISTERS: [&str; 9] = ["r10", "r11", "r12", "r13", "r14", "r15", "rax", "rdi", "rsi"];
|
||||||
|
|
||||||
pub struct FasmCodegen {
|
pub struct FasmCodegen {
|
||||||
register_counter: usize
|
register_counter: usize,
|
||||||
|
operation_queue: Vec<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FasmCodegen {
|
impl FasmCodegen {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
FasmCodegen {
|
FasmCodegen {
|
||||||
register_counter: 0,
|
register_counter: 0,
|
||||||
|
operation_queue: Vec::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,6 +57,10 @@ impl FasmCodegen {
|
||||||
match expr {
|
match expr {
|
||||||
// If the expression is a math expression.
|
// If the expression is a math expression.
|
||||||
Expr::MathExpr(e) => {
|
Expr::MathExpr(e) => {
|
||||||
|
if let Expr::MathExpr(m) = e.right.as_ref() {
|
||||||
|
let codegen = fasm_codegen!(fun: &vec![Expr::MathExpr(m.clone())]);
|
||||||
|
self.operation_queue.push(codegen);
|
||||||
|
}
|
||||||
unwrap!(e.left);
|
unwrap!(e.left);
|
||||||
self.register_counter += 1;
|
self.register_counter += 1;
|
||||||
asm_start.push_str(format!("\tmov {}, rax\n", REGISTERS[self.register_counter]).as_str());
|
asm_start.push_str(format!("\tmov {}, rax\n", REGISTERS[self.register_counter]).as_str());
|
||||||
|
|
Loading…
Reference in a new issue