#![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) CMP = 12, // RRR; #0 ← #1 <=> #2 CMPU = 13, // RRR; #0 ← #1 <=> #2 (unsigned) NOT = 14, // RR; #0 ← !#1 ADDF = 15, // RRR; #0 ← #1 +. #2 SUBF = 16, // RRR; #0 ← #1 +. #2 MULF = 17, // RRR; #0 ← #1 +. #2 DIVF = 18, // RRR; #0 ← #1 +. #2 ADDI = 19, // RRI; #0 ← #1 + imm #2 MULI = 20, // RRI; #0 ← #1 × imm #2 REMI = 21, // RRI; #0 ← #1 % imm #2 ANDI = 22, // RRI; #0 ← #1 & imm #2 ORI = 23, // RRI; #0 ← #1 | imm #2 XORI = 24, // RRI; #0 ← #1 ^ imm #2 SLI = 25, // RRI; #0 ← #1 « imm #2 SRI = 26, // RRI; #0 ← #1 » imm #2 SRSI = 27, // RRI; #0 ← #1 » imm #2 (signed) CMPI = 28, // RRI; #0 ← #1 <=> imm #2 CMPUI = 29, // RRI; #0 ← #1 <=> imm #2 (unsigned) ADDFI = 30, // RRI; #0 ← #1 +. imm #2 MULFI = 31, // RRI; #0 ← #1 *. imm #2 CP = 32, // RR; Copy #0 ← #1 LI = 33, // RI; Load immediate, #0 ← imm #1 LB = 34, // RRI; Load byte (8 bits), #0 ← [#1 + imm #2] LD = 35, // RRI; Load doublet (16 bits) LQ = 36, // RRI; Load quadlet (32 bits) LO = 37, // RRI; Load octlet (64 bits) SB = 38, // RRI; Store byte, [#1 + imm #2] ← #0 SD = 39, // RRI; Store doublet SQ = 40, // RRI; Store quadlet SO = 41, // RRI; Store octlet JMP = 42, // RI; Unconditional jump [#0 + imm #1] JEQ = 43, // RRI; if #0 = #1 → jump imm #2 JNE = 44, // RRI; if #0 ≠ #1 → jump imm #2 JLT = 45, // RRI; if #0 < #1 → jump imm #2 JGT = 46, // RRI; if #0 > #1 → jump imm #2 JLTU = 47, // RRI; if #0 < #1 → jump imm #2 (unsigned) JGTU = 48, // RRI; if #0 > #1 → jump imm #2 (unsigned) RET = 49, // N; Return ECALL = 50, // 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 () {}