2023-06-26 05:18:14 -05:00
|
|
|
#![no_std]
|
|
|
|
|
|
|
|
extern crate alloc;
|
|
|
|
|
2023-07-10 16:18:23 -05:00
|
|
|
mod macros;
|
2023-06-20 19:07:48 -05:00
|
|
|
|
2023-07-10 16:18:23 -05:00
|
|
|
use {alloc::vec::Vec, hashbrown::HashSet};
|
2023-06-20 19:07:48 -05:00
|
|
|
|
2023-07-10 16:18:23 -05:00
|
|
|
#[derive(Default)]
|
|
|
|
pub struct Assembler {
|
|
|
|
pub buf: Vec<u8>,
|
2023-07-11 19:16:23 -05:00
|
|
|
pub sub: HashSet<usize>,
|
2023-06-20 19:07:48 -05:00
|
|
|
}
|
|
|
|
|
2023-07-11 19:16:23 -05:00
|
|
|
macros::impl_both!(
|
|
|
|
bbbb(p0: R, p1: R, p2: R, p3: R)
|
|
|
|
=> [DIR, DIRF, FMAF],
|
|
|
|
bbb(p0: R, p1: R, p2: R)
|
2023-07-11 19:23:47 -05:00
|
|
|
=> [ADD, SUB, MUL, AND, OR, XOR, SL, SR, SRS, CMP, CMPU, /*BRC,*/ ADDF, SUBF, MULF],
|
2023-07-11 19:16:23 -05:00
|
|
|
bbdh(p0: R, p1: R, p2: I, p3: u16)
|
|
|
|
=> [LD, ST],
|
|
|
|
bbd(p0: R, p1: R, p2: I)
|
|
|
|
=> [ADDI, MULI, ANDI, ORI, XORI, SLI, SRI, SRSI, CMPI, CMPUI,
|
2023-07-12 05:45:50 -05:00
|
|
|
BMC, JAL, JEQ, JNE, JLT, JGT, JLTU, JGTU, ADDFI, MULFI],
|
2023-07-11 19:16:23 -05:00
|
|
|
bb(p0: R, p1: R)
|
|
|
|
=> [NEG, NOT, CP, SWA, NEGF, ITF, FTI],
|
|
|
|
bd(p0: R, p1: I)
|
2023-07-12 05:45:50 -05:00
|
|
|
=> [LI],
|
2023-07-11 19:16:23 -05:00
|
|
|
n()
|
2023-07-13 04:05:41 -05:00
|
|
|
=> [UN, NOP, ECALL],
|
2023-07-11 19:16:23 -05:00
|
|
|
);
|
2023-06-20 19:07:48 -05:00
|
|
|
|
2023-07-11 19:23:47 -05:00
|
|
|
impl Assembler {
|
|
|
|
// Special-cased
|
|
|
|
#[inline(always)]
|
|
|
|
pub fn i_brc(&mut self, p0: u8, p1: u8, p2: u8) {
|
|
|
|
self.i_param_bbb(hbbytecode::opcode::BRC, p0, p1, p2)
|
|
|
|
}
|
2023-07-13 04:05:41 -05:00
|
|
|
|
|
|
|
/// Append 12 zeroes (UN) at the end
|
|
|
|
pub fn finalise(&mut self) {
|
|
|
|
self.buf.extend([0; 12]);
|
|
|
|
}
|
2023-07-11 19:23:47 -05:00
|
|
|
}
|
|
|
|
|
2023-07-10 16:18:23 -05:00
|
|
|
pub trait Imm {
|
2023-07-10 19:08:55 -05:00
|
|
|
fn insert(&self, asm: &mut Assembler);
|
2023-06-20 19:07:48 -05:00
|
|
|
}
|
|
|
|
|
2023-07-10 19:08:55 -05:00
|
|
|
macro_rules! impl_imm_le_bytes {
|
|
|
|
($($ty:ty),* $(,)?) => {
|
|
|
|
$(
|
|
|
|
impl Imm for $ty {
|
|
|
|
#[inline(always)]
|
|
|
|
fn insert(&self, asm: &mut Assembler) {
|
|
|
|
asm.buf.extend(self.to_le_bytes());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)*
|
|
|
|
};
|
2023-06-20 19:07:48 -05:00
|
|
|
}
|
|
|
|
|
2023-07-10 19:08:55 -05:00
|
|
|
impl_imm_le_bytes!(u64, i64, f64);
|