mirror of
https://github.com/azur1s/bobbylisp.git
synced 2024-10-16 02:37:40 -05:00
feat: math intrinsic
This commit is contained in:
parent
3d02755095
commit
5a65ee2fc7
1
example/math.blsp
Normal file
1
example/math.blsp
Normal file
|
@ -0,0 +1 @@
|
||||||
|
(print (/ (+ 345 345) 10))
|
7
math.bbb
Normal file
7
math.bbb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
STORE r1 $345
|
||||||
|
STORE r2 $345
|
||||||
|
IADD r1 r2 r3
|
||||||
|
STORE r4 $10
|
||||||
|
IDIV r3 r4 r5
|
||||||
|
STORE r6 $1
|
||||||
|
CALL r6 r5
|
|
@ -85,7 +85,9 @@ impl Compiler {
|
||||||
value: Type::String(s.to_string()),
|
value: Type::String(s.to_string()),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
_ => return Err(format!("Expected atom, got {:?}", atom)),
|
_ => {
|
||||||
|
result.append(&mut self.compile(atom.clone())?);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(result)
|
Ok(result)
|
||||||
|
@ -110,7 +112,71 @@ impl Compiler {
|
||||||
address: call_register,
|
address: call_register,
|
||||||
args: arg_pointer,
|
args: arg_pointer,
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
|
"add" | "+" => {
|
||||||
|
let mut lhs = self.compile_atom(&args[0])?;
|
||||||
|
let lhs_pointer = self.current_pointer();
|
||||||
|
result.append(&mut lhs);
|
||||||
|
|
||||||
|
let mut rhs = self.compile_atom(&args[1])?;
|
||||||
|
let rhs_pointer = self.current_pointer();
|
||||||
|
result.append(&mut rhs);
|
||||||
|
|
||||||
|
let result_register = self.next_register();
|
||||||
|
result.push(Instr::IAdd {
|
||||||
|
lhs: lhs_pointer,
|
||||||
|
rhs: rhs_pointer,
|
||||||
|
to: result_register,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
"sub" | "-" => {
|
||||||
|
let mut lhs = self.compile_atom(&args[0])?;
|
||||||
|
let lhs_pointer = self.current_pointer();
|
||||||
|
result.append(&mut lhs);
|
||||||
|
|
||||||
|
let mut rhs = self.compile_atom(&args[1])?;
|
||||||
|
let rhs_pointer = self.current_pointer();
|
||||||
|
result.append(&mut rhs);
|
||||||
|
|
||||||
|
let result_register = self.next_register();
|
||||||
|
result.push(Instr::ISub {
|
||||||
|
lhs: lhs_pointer,
|
||||||
|
rhs: rhs_pointer,
|
||||||
|
to: result_register,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
"mul" | "*" => {
|
||||||
|
let mut lhs = self.compile_atom(&args[0])?;
|
||||||
|
let lhs_pointer = self.current_pointer();
|
||||||
|
result.append(&mut lhs);
|
||||||
|
|
||||||
|
let mut rhs = self.compile_atom(&args[1])?;
|
||||||
|
let rhs_pointer = self.current_pointer();
|
||||||
|
result.append(&mut rhs);
|
||||||
|
|
||||||
|
let result_register = self.next_register();
|
||||||
|
result.push(Instr::IMul {
|
||||||
|
lhs: lhs_pointer,
|
||||||
|
rhs: rhs_pointer,
|
||||||
|
to: result_register,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
"div" | "/" => {
|
||||||
|
let mut lhs = self.compile_atom(&args[0])?;
|
||||||
|
let lhs_pointer = self.current_pointer();
|
||||||
|
result.append(&mut lhs);
|
||||||
|
|
||||||
|
let mut rhs = self.compile_atom(&args[1])?;
|
||||||
|
let rhs_pointer = self.current_pointer();
|
||||||
|
result.append(&mut rhs);
|
||||||
|
|
||||||
|
let result_register = self.next_register();
|
||||||
|
result.push(Instr::IDiv {
|
||||||
|
lhs: lhs_pointer,
|
||||||
|
rhs: rhs_pointer,
|
||||||
|
to: result_register,
|
||||||
|
});
|
||||||
|
},
|
||||||
_ => return Err(format!("Unknown intrinsic: {}", intrinsic)),
|
_ => return Err(format!("Unknown intrinsic: {}", intrinsic)),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,8 +38,6 @@ pub enum Instr {
|
||||||
Store { address: Register, value: Type, },
|
Store { address: Register, value: Type, },
|
||||||
// Call intrinsic function.
|
// Call intrinsic function.
|
||||||
Call { address: Register, args: Register },
|
Call { address: Register, args: Register },
|
||||||
// Stack arithmetic.
|
|
||||||
Add, Sub, Mul, Div,
|
|
||||||
// Immediate arithmetic.
|
// Immediate arithmetic.
|
||||||
IAdd { lhs: Register, rhs: Register, to: Register, },
|
IAdd { lhs: Register, rhs: Register, to: Register, },
|
||||||
ISub { lhs: Register, rhs: Register, to: Register, },
|
ISub { lhs: Register, rhs: Register, to: Register, },
|
||||||
|
@ -53,10 +51,6 @@ impl Display for Instr {
|
||||||
Instr::Load { address } => write!(f, "LOAD {}", address),
|
Instr::Load { address } => write!(f, "LOAD {}", address),
|
||||||
Instr::Store { address, value } => write!(f, "STORE {} {}", address, value),
|
Instr::Store { address, value } => write!(f, "STORE {} {}", address, value),
|
||||||
Instr::Call { address, args } => write!(f, "CALL {} {}", address, args),
|
Instr::Call { address, args } => write!(f, "CALL {} {}", address, args),
|
||||||
Instr::Add => write!(f, "ADD"),
|
|
||||||
Instr::Sub => write!(f, "SUB"),
|
|
||||||
Instr::Mul => write!(f, "MUL"),
|
|
||||||
Instr::Div => write!(f, "DIV"),
|
|
||||||
Instr::IAdd { lhs, rhs, to } => write!(f, "IADD {} {} {}", lhs, rhs, to),
|
Instr::IAdd { lhs, rhs, to } => write!(f, "IADD {} {} {}", lhs, rhs, to),
|
||||||
Instr::ISub { lhs, rhs, to } => write!(f, "ISUB {} {} {}", lhs, rhs, to),
|
Instr::ISub { lhs, rhs, to } => write!(f, "ISUB {} {} {}", lhs, rhs, to),
|
||||||
Instr::IMul { lhs, rhs, to } => write!(f, "IMUL {} {} {}", lhs, rhs, to),
|
Instr::IMul { lhs, rhs, to } => write!(f, "IMUL {} {} {}", lhs, rhs, to),
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
|
/// Contains the definition of instructions and register.
|
||||||
pub mod lib;
|
pub mod lib;
|
||||||
|
/// Contains the compiler.
|
||||||
pub mod compile;
|
pub mod compile;
|
Loading…
Reference in a new issue