IT WORKS HELL YEAH.
This commit is contained in:
+43
-11
@@ -29,7 +29,14 @@ fn try_expand(
|
||||
match node.opcode() {
|
||||
Opcode::Push => expand_push(node.clone(), result)?,
|
||||
Opcode::Pop => expand_pop(node.clone(), result)?,
|
||||
Opcode::Ldb | Opcode::Ldh | Opcode::Ldw => expand_ldx(node.clone(), result)?,
|
||||
Opcode::Ldb
|
||||
| Opcode::Ldbs
|
||||
| Opcode::Ldh
|
||||
| Opcode::Ldhs
|
||||
| Opcode::Ldw
|
||||
| Opcode::Stb
|
||||
| Opcode::Sth
|
||||
| Opcode::Stw => expand_ldx(node.clone(), result)?,
|
||||
Opcode::Lwi => expand_lwi(node.clone(), result)?,
|
||||
Opcode::Resb | Opcode::Resh | Opcode::Resw => expand_resx(node.clone(), result)?,
|
||||
Opcode::Db | Opcode::Dh | Opcode::Dw => expand_dx(node.clone(), result)?,
|
||||
@@ -43,8 +50,20 @@ fn expand_push(current: Node, nodes: &mut Vec<Node>) -> Result<(), AssembleError
|
||||
let reg = expect_type!(current.arg(0).unwrap(), Register)?;
|
||||
|
||||
nodes.extend(vec![
|
||||
node!(label, Opcode::Iadd, reg.clone(), Token::Immediate(4)),
|
||||
node!(None, Opcode::Stw, reg, Token::Register(Register::Spr)),
|
||||
node!(
|
||||
label,
|
||||
Opcode::Iadd,
|
||||
reg.clone(),
|
||||
Token::Immediate(4),
|
||||
reg.clone()
|
||||
),
|
||||
node!(
|
||||
None,
|
||||
Opcode::Stw,
|
||||
reg,
|
||||
Token::Register(Register::Spr),
|
||||
Token::Immediate(0)
|
||||
),
|
||||
]);
|
||||
|
||||
Ok(())
|
||||
@@ -55,8 +74,20 @@ fn expand_pop(current: Node, nodes: &mut Vec<Node>) -> Result<(), AssembleError>
|
||||
let reg = expect_type!(current.arg(0).unwrap(), Register)?;
|
||||
|
||||
nodes.extend(vec![
|
||||
node!(label, Opcode::Isub, reg.clone(), Token::Immediate(4)),
|
||||
node!(None, Opcode::Ldw, reg, Token::Register(Register::Spr)),
|
||||
node!(
|
||||
label,
|
||||
Opcode::Isub,
|
||||
reg.clone(),
|
||||
Token::Immediate(4),
|
||||
reg.clone()
|
||||
),
|
||||
node!(
|
||||
None,
|
||||
Opcode::Ldw,
|
||||
reg,
|
||||
Token::Register(Register::Spr),
|
||||
Token::Immediate(0)
|
||||
),
|
||||
]);
|
||||
|
||||
Ok(())
|
||||
@@ -65,24 +96,25 @@ fn expand_pop(current: Node, nodes: &mut Vec<Node>) -> Result<(), AssembleError>
|
||||
fn expand_ldx(current: Node, nodes: &mut Vec<Node>) -> Result<(), AssembleError> {
|
||||
let opcode = current.opcode();
|
||||
let name = expect_type!(current.arg(0).unwrap(), Symbol)?;
|
||||
let reg = expect_type!(current.arg(2).unwrap(), Register)?;
|
||||
let reg = expect_type!(current.arg(1).unwrap(), Register)?;
|
||||
let offset = expect_type!(current.arg(2).unwrap(), Immediate)?;
|
||||
|
||||
nodes.extend(vec![
|
||||
node!(current.label(), Opcode::Lli, name.clone(), reg.clone()),
|
||||
node!(None, Opcode::Lui, name.clone(), reg.clone()),
|
||||
node!(None, opcode, reg.clone(), Token::Immediate(0), reg),
|
||||
node!(None, opcode, reg.clone(), reg, offset),
|
||||
]);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn expand_lwi(current: Node, nodes: &mut Vec<Node>) -> Result<(), AssembleError> {
|
||||
let reg = expect_type!(current.arg(0).unwrap(), Register)?;
|
||||
let name = expect_type!(current.arg(1).unwrap(), Symbol)?;
|
||||
let val = expect_type!(current.arg(0).unwrap(), Symbol, Immediate)?;
|
||||
let reg = expect_type!(current.arg(1).unwrap(), Register)?;
|
||||
|
||||
nodes.extend(vec![
|
||||
node!(current.label(), Opcode::Lli, name.clone(), reg.clone()),
|
||||
node!(None, Opcode::Lui, name.clone(), reg.clone()),
|
||||
node!(current.label(), Opcode::Lli, val.clone(), reg.clone()),
|
||||
node!(None, Opcode::Lui, val.clone(), reg.clone()),
|
||||
]);
|
||||
|
||||
Ok(())
|
||||
|
||||
Reference in New Issue
Block a user