Skip to content

Commit

Permalink
fix
Browse files Browse the repository at this point in the history
  • Loading branch information
JonathanWoollett-Light committed Dec 28, 2023
1 parent 498fef2 commit 4012460
Show file tree
Hide file tree
Showing 4 changed files with 321 additions and 203 deletions.
145 changes: 46 additions & 99 deletions src/ast.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use std::iter::once;
/// The AST maps closely to assembly for simplicity.
use std::ptr::NonNull;

Expand Down Expand Up @@ -71,15 +72,18 @@ impl std::fmt::Display for Statement {
},
Op::Special(Special::Unreachable) => write!(f, "unreachable"),
Op::Special(Special::Type) => match self.arg.as_slice() {
[rhs, rhs_type, lhs @ ..] => write!(
[rhs] => write!(f, "{rhs}"),
[rhs, rhs_type] => write!(f, "{rhs} : {rhs_type}"),
[rhs, rhs_type, lhs, tail @ ..] => write!(
f,
"{rhs} : {rhs_type} := {}",
lhs.iter()
once(lhs)
.chain(tail.iter())
.map(|x| x.to_string())
.intersperse(String::from(" "))
.collect::<String>()
),
_ => todo!(),
x @ _ => todo!("{x:?}"),
},
Op::Intrinsic(Intrinsic::Def) => match self.arg.as_slice() {
[x] => write!(f, "def {x}"),
Expand Down Expand Up @@ -219,38 +223,6 @@ pub enum Register {
X29,
X30,
X31,
W0,
W1,
W2,
W3,
W4,
W5,
W6,
W7,
W8,
W9,
W10,
W11,
W12,
W13,
W14,
W15,
W16,
W17,
W18,
W19,
W20,
W21,
W22,
W23,
W24,
W25,
W26,
W27,
W28,
W29,
W30,
W31,
}

impl TryFrom<&Identifier> for Register {
Expand Down Expand Up @@ -296,43 +268,50 @@ impl TryFrom<&[u8]> for Register {
b"x29" => Ok(Self::X29),
b"x30" => Ok(Self::X30),
b"x31" => Ok(Self::X31),
b"w0" => Ok(Self::W0),
b"w1" => Ok(Self::W1),
b"w2" => Ok(Self::W2),
b"w3" => Ok(Self::W3),
b"w4" => Ok(Self::W4),
b"w5" => Ok(Self::W5),
b"w6" => Ok(Self::W6),
b"w7" => Ok(Self::W7),
b"w8" => Ok(Self::W8),
b"w9" => Ok(Self::W9),
b"w10" => Ok(Self::W10),
b"w11" => Ok(Self::W11),
b"w12" => Ok(Self::W12),
b"w13" => Ok(Self::W13),
b"w14" => Ok(Self::W14),
b"w15" => Ok(Self::W15),
b"w16" => Ok(Self::W16),
b"w17" => Ok(Self::W17),
b"w18" => Ok(Self::W18),
b"w19" => Ok(Self::W19),
b"w20" => Ok(Self::W20),
b"w21" => Ok(Self::W21),
b"w22" => Ok(Self::W22),
b"w23" => Ok(Self::W23),
b"w24" => Ok(Self::W24),
b"w25" => Ok(Self::W25),
b"w26" => Ok(Self::W26),
b"w27" => Ok(Self::W27),
b"w28" => Ok(Self::W28),
b"w29" => Ok(Self::W29),
b"w30" => Ok(Self::W30),
b"w31" => Ok(Self::W31),
_ => Err(()),
}
}
}

impl Register {
pub fn w(&self) -> String {
match self {
Self::X0 => String::from("w0"),
Self::X1 => String::from("w1"),
Self::X2 => String::from("w2"),
Self::X3 => String::from("w3"),
Self::X4 => String::from("w4"),
Self::X5 => String::from("w5"),
Self::X6 => String::from("w6"),
Self::X7 => String::from("w7"),
Self::X8 => String::from("w8"),
Self::X9 => String::from("w9"),
Self::X10 => String::from("w10"),
Self::X11 => String::from("w11"),
Self::X12 => String::from("w12"),
Self::X13 => String::from("w13"),
Self::X14 => String::from("w14"),
Self::X15 => String::from("w15"),
Self::X16 => String::from("w16"),
Self::X17 => String::from("w17"),
Self::X18 => String::from("w18"),
Self::X19 => String::from("w19"),
Self::X20 => String::from("w20"),
Self::X21 => String::from("w21"),
Self::X22 => String::from("w22"),
Self::X23 => String::from("w23"),
Self::X24 => String::from("w24"),
Self::X25 => String::from("w25"),
Self::X26 => String::from("w26"),
Self::X27 => String::from("w27"),
Self::X28 => String::from("w28"),
Self::X29 => String::from("w29"),
Self::X30 => String::from("w30"),
Self::X31 => String::from("w31"),
}
}
}

impl std::fmt::Display for Register {
// This trait requires `fmt` with this exact signature.
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
Expand Down Expand Up @@ -369,38 +348,6 @@ impl std::fmt::Display for Register {
Self::X29 => write!(f, "x29"),
Self::X30 => write!(f, "x30"),
Self::X31 => write!(f, "x31"),
Self::W0 => write!(f, "w0"),
Self::W1 => write!(f, "w1"),
Self::W2 => write!(f, "w2"),
Self::W3 => write!(f, "w3"),
Self::W4 => write!(f, "w4"),
Self::W5 => write!(f, "w5"),
Self::W6 => write!(f, "w6"),
Self::W7 => write!(f, "w7"),
Self::W8 => write!(f, "w8"),
Self::W9 => write!(f, "w9"),
Self::W10 => write!(f, "w10"),
Self::W11 => write!(f, "w11"),
Self::W12 => write!(f, "w12"),
Self::W13 => write!(f, "w13"),
Self::W14 => write!(f, "w14"),
Self::W15 => write!(f, "w15"),
Self::W16 => write!(f, "w16"),
Self::W17 => write!(f, "w17"),
Self::W18 => write!(f, "w18"),
Self::W19 => write!(f, "w19"),
Self::W20 => write!(f, "w20"),
Self::W21 => write!(f, "w21"),
Self::W22 => write!(f, "w22"),
Self::W23 => write!(f, "w23"),
Self::W24 => write!(f, "w24"),
Self::W25 => write!(f, "w25"),
Self::W26 => write!(f, "w26"),
Self::W27 => write!(f, "w27"),
Self::W28 => write!(f, "w28"),
Self::W29 => write!(f, "w29"),
Self::W30 => write!(f, "w30"),
Self::W31 => write!(f, "w31"),
}
}
}
Expand Down
52 changes: 52 additions & 0 deletions src/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ pub unsafe fn instruction_from_node(
let statement = &current_ref.statement;
let arg = statement.arg.as_slice();

// eprintln!("type_data: {type_data:?}");
// eprintln!("statement.op: {:?}",statement.op);
// eprintln!("arg: {arg:?}");

match statement.op {
Op::Special(Special::Type) => match arg {
[Value::Variable(Variable { identifier, .. }), Value::Type(value_type)] => {
Expand Down Expand Up @@ -257,6 +261,35 @@ pub unsafe fn instruction_from_node(
.unwrap();
}
}
[Value::Variable(Variable {
addressing: Addressing::Direct,
identifier: lhs_identifier,
index: None,
}), Value::Variable(Variable {
addressing: Addressing::Direct,
identifier: rhs_identifier,
index: None,
})] => {
let rhs_type = type_data.get(rhs_identifier).unwrap();
match rhs_type {
Type::U8 => {
// Load data and store data in new location.
write!(
assembly,
"\
ldr x0, ={rhs_identifier}\n\
ldrb w1, [x0]\n\
ldr x0, ={lhs_identifier}\n\
strb w1, [x0]\n\
"
)
.unwrap();
writeln!(bss, "{lhs_identifier}: .skip 1").unwrap();
}
_ => todo!(),
}
type_data.insert(lhs_identifier.clone(), rhs_type.clone());
}
[Value::Variable(Variable {
addressing: Addressing::Direct,
identifier,
Expand Down Expand Up @@ -400,6 +433,25 @@ pub unsafe fn instruction_from_node(
[Value::Register(register), Value::Literal(Literal::Integer(integer))] => {
writeln!(&mut assembly, "mov {register}, #{integer}").unwrap();
}
[Value::Register(register), Value::Variable(Variable {
addressing: Addressing::Direct,
identifier,
index: None,
})] => match type_data.get(identifier).unwrap() {
Type::U8 => {
// Load data and store data in new location.
write!(
assembly,
"\
ldr x0, ={identifier}\n\
ldrb {}, [x0]\n\
",
register.w()
)
.unwrap();
}
_ => todo!(),
},
[Value::Register(register), Value::Variable(Variable {
addressing: Addressing::Reference,
identifier,
Expand Down
Loading

0 comments on commit 4012460

Please sign in to comment.