Improved assembler library

This commit is contained in:
Erin 2023-07-11 02:08:55 +02:00 committed by ondra05
parent 447f8b2075
commit 7ca0b1d4eb
3 changed files with 20 additions and 15 deletions

View file

@ -18,16 +18,16 @@ pub struct Assembler {
impl Assembler { impl Assembler {
macros::impl_asm!( macros::impl_asm!(
bbbb(p0: u8, p1: u8, p2: u8, p3: u8) bbbb(p0: u8, p1: u8, p2: u8, p3: u8)
=> [DIR, DIRF], => [DIR, DIRF, FMAF],
bbb(p0: u8, p1: u8, p2: u8) bbb(p0: u8, p1: u8, p2: u8)
=> [ADD, SUB, MUL, AND, OR, XOR, SL, SRS, CMP, CMPU, BRC, ADDF, MULF], => [ADD, SUB, MUL, AND, OR, XOR, SL, SR, SRS, CMP, CMPU, BRC, ADDF, SUBF, MULF],
bbdh(p0: u8, p1: u8, p2: impl Imm, p3: u16) bbdh(p0: u8, p1: u8, p2: impl Imm, p3: u16)
=> [LD, ST], => [LD, ST],
bbd(p0: u8, p1: u8, p2: impl Imm) bbd(p0: u8, p1: u8, p2: impl Imm)
=> [ADDI, MULI, ANDI, ORI, XORI, SLI, SRI, SRSI, CMPI, CMPUI, => [ADDI, MULI, ANDI, ORI, XORI, SLI, SRI, SRSI, CMPI, CMPUI,
JEQ, JNE, JLT, JGT, JLTU, JGTU, ADDFI, MULFI], BMC, JEQ, JNE, JLT, JGT, JLTU, JGTU, ADDFI, MULFI],
bb(p0: u8, p1: u8) bb(p0: u8, p1: u8)
=> [NEG, NOT, CP, SWA], => [NEG, NOT, CP, SWA, NEGF, ITF, FTI],
bd(p0: u8, p1: impl Imm) bd(p0: u8, p1: impl Imm)
=> [LI, JMP], => [LI, JMP],
n() n()
@ -36,21 +36,29 @@ impl Assembler {
} }
pub trait Imm { pub trait Imm {
fn insert(self, asm: &mut Assembler); fn insert(&self, asm: &mut Assembler);
} }
impl Imm for u64 { macro_rules! impl_imm_le_bytes {
($($ty:ty),* $(,)?) => {
$(
impl Imm for $ty {
#[inline(always)] #[inline(always)]
fn insert(self, asm: &mut Assembler) { fn insert(&self, asm: &mut Assembler) {
asm.buf.extend(self.to_le_bytes()); asm.buf.extend(self.to_le_bytes());
} }
} }
)*
};
}
impl_imm_le_bytes!(u64, i64, f64);
#[derive(Clone, Copy, Debug, PartialEq, Eq)] #[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Symbol(pub u64); pub struct Symbol(pub u64);
impl Imm for Symbol { impl Imm for Symbol {
#[inline(always)] #[inline(always)]
fn insert(self, asm: &mut Assembler) { fn insert(&self, asm: &mut Assembler) {
asm.sub.insert(asm.buf.len()); asm.sub.insert(asm.buf.len());
asm.buf.extend(self.0.to_le_bytes()); asm.buf.extend(self.0.to_le_bytes());
} }

View file

@ -33,7 +33,7 @@ macro_rules! gen_impl_asm_insert {
};)* };)*
($self:expr, $id:ident, $_:ty) => { ($self:expr, $id:ident, $_:ty) => {
Imm::insert($id, $self) Imm::insert(&$id, $self)
}; };
} }
}; };

View file

@ -1,6 +1,3 @@
// use std::collections::HashMap;
extern crate alloc; extern crate alloc;
use alloc::vec::Vec; use alloc::vec::Vec;