1
0
Fork 0
forked from koniifer/ableos
ableos-framebuffer/hbasm/src/lib.rs

51 lines
1.1 KiB
Rust
Raw Normal View History

2023-06-26 05:18:14 -05:00
#![no_std]
extern crate alloc;
2023-07-10 16:18:23 -05:00
mod macros;
2023-07-10 16:18:23 -05:00
use {alloc::vec::Vec, hashbrown::HashSet};
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-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)
=> [ADD, SUB, MUL, AND, OR, XOR, SL, SR, SRS, CMP, CMPU, BRC, ADDF, SUBF, MULF],
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,
BMC, JEQ, JNE, JLT, JGT, JLTU, JGTU, ADDFI, MULFI],
bb(p0: R, p1: R)
=> [NEG, NOT, CP, SWA, NEGF, ITF, FTI],
bd(p0: R, p1: I)
=> [LI, JMP],
n()
=> [NOP, ECALL],
);
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-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-07-10 19:08:55 -05:00
impl_imm_le_bytes!(u64, i64, f64);