holey-bytes/hbbytecode/src/lib.rs
2023-06-09 01:55:09 +02:00

86 lines
2.7 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#![no_std]
macro_rules! constmod {
($vis:vis $mname:ident($repr:ty) { $($cname:ident = $val:expr),* $(,)? }) => {
$vis mod $mname {
$(pub const $cname: $repr = $val;)*
}
};
}
constmod!(pub opcode(u8) {
NOP = 0, // N; Do nothing
ADD = 1, // RRR; #0 ← #1 + #2
SUB = 2, // RRR; #0 ← #1 - #2
MUL = 3, // RRR; #0 ← #1 × #2
DIV = 4, // RRR; #0 ← #1 ÷ #2
REM = 5, // RRR; #0 ← #1 % #2
AND = 6, // RRR; #0 ← #1 & #2
OR = 7, // RRR; #0 ← #1 | #2
XOR = 8, // RRR; #0 ← #1 ^ #2
SL = 9, // RRR; #0 ← #1 « #2
SR = 10, // RRR; #0 ← #1 » #2
SRS = 11, // RRR; #0 ← #1 » #2 (signed)
NOT = 12, // RR; #0 ← !#1
ADDF = 13, // RRR; #0 ← #1 +. #2
SUBF = 14, // RRR; #0 ← #1 +. #2
MULF = 15, // RRR; #0 ← #1 +. #2
DIVF = 16, // RRR; #0 ← #1 +. #2
ADDI = 17, // RRI; #0 ← #1 + imm #2
MULI = 18, // RRI; #0 ← #1 × imm #2
REMI = 19, // RRI; #0 ← #1 % imm #2
ANDI = 20, // RRI; #0 ← #1 & imm #2
ORI = 21, // RRI; #0 ← #1 | imm #2
XORI = 22, // RRI; #0 ← #1 ^ imm #2
SLI = 23, // RRI; #0 ← #1 « imm #2
SRI = 24, // RRI; #0 ← #1 » imm #2
SRSI = 25, // RRI; #0 ← #1 » imm #2 (signed)
ADDFI = 26, // RRI; #0 ← #1 +. imm #2
MULFI = 27, // RRI; #0 ← #1 *. imm #2
CP = 28, // RR; Copy #0 ← #1
LI = 29, // RI; Load immediate, #0 ← imm #1
LB = 30, // RRI; Load byte (8 bits), #0 ← [#1 + imm #2]
LD = 31, // RRI; Load doublet (16 bits)
LQ = 32, // RRI; Load quadlet (32 bits)
LO = 33, // RRI; Load octlet (64 bits)
SB = 34, // RRI; Store byte, [#1 + imm #2] ← #0
SD = 35, // RRI; Store doublet
SQ = 36, // RRI; Store quadlet
SO = 37, // RRI; Store octlet
JMP = 38, // RI; Unconditional jump [#0 + imm #1]
JEQ = 39, // RRI; if #0 = #1 → jump imm #2
JNE = 40, // RRI; if #0 ≠ #1 → jump imm #2
JLT = 41, // RRI; if #0 < #1 → jump imm #2
JGT = 52, // RRI; if #0 > #1 → jump imm #2
JLTU = 53, // RRI; if #0 < #1 → jump imm #2 (unsigned)
JGTU = 54, // RRI; if #0 > #1 → jump imm #2 (unsigned)
RET = 55, // N; Return
ECALL = 56, // N; Issue system call
});
#[repr(packed)]
pub struct ParamRRR(pub u8, pub u8, pub u8);
#[repr(packed)]
pub struct ParamRRI(pub u8, pub u8, pub u64);
#[repr(packed)]
pub struct ParamRR(pub u8, pub u8);
#[repr(packed)]
pub struct ParamRI(pub u8, pub u64);
/// # Safety
/// TODO.
pub unsafe trait OpParam {}
unsafe impl OpParam for ParamRRR {}
unsafe impl OpParam for ParamRRI {}
unsafe impl OpParam for ParamRR {}
unsafe impl OpParam for ParamRI {}
unsafe impl OpParam for u64 {}
unsafe impl OpParam for () {}