2020-02-03 17:56:32 -05:00
|
|
|
macro_rules! instructions {
|
|
|
|
|
{
|
|
|
|
|
$($variant:ident = $value:expr),* $(,)?
|
|
|
|
|
} => {
|
2020-01-25 19:17:39 -05:00
|
|
|
|
2020-02-03 17:56:32 -05:00
|
|
|
$(
|
|
|
|
|
pub const $variant: InstOp = $value;
|
|
|
|
|
)*
|
2020-02-09 15:43:07 -05:00
|
|
|
|
|
|
|
|
pub fn inst_name(op: InstOp) -> Option<&'static str> {
|
|
|
|
|
match op {
|
|
|
|
|
$(
|
|
|
|
|
$value => Some(stringify!($variant)),
|
|
|
|
|
)*
|
|
|
|
|
_ => None,
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-02-03 17:56:32 -05:00
|
|
|
};
|
2020-01-25 19:17:39 -05:00
|
|
|
}
|
2020-02-09 13:04:56 -05:00
|
|
|
pub type InstOp = u16;
|
|
|
|
|
|
2020-02-03 17:56:32 -05:00
|
|
|
instructions! {
|
|
|
|
|
ADD = 0x0000,
|
|
|
|
|
MUL = 0x0001,
|
|
|
|
|
DIV = 0x0002,
|
|
|
|
|
MOD = 0x0003,
|
|
|
|
|
INEG = 0x0004,
|
|
|
|
|
AND = 0x0005,
|
|
|
|
|
OR = 0x0006,
|
|
|
|
|
INV = 0x0007,
|
|
|
|
|
NOT = 0x0008,
|
|
|
|
|
XOR = 0x0009,
|
|
|
|
|
SHL = 0x000a,
|
|
|
|
|
SHR = 0x000b,
|
|
|
|
|
CMPEQ = 0x1000,
|
|
|
|
|
CMPLT = 0x1001,
|
|
|
|
|
JMP = 0x1100,
|
|
|
|
|
JZ = 0x1101,
|
|
|
|
|
JNZ = 0x1102,
|
|
|
|
|
LOAD = 0x2000,
|
|
|
|
|
REGCOPY = 0x2001,
|
|
|
|
|
STOREIMM64 = 0x2100,
|
|
|
|
|
STOREIMM32 = 0x2101,
|
|
|
|
|
MEMCOPY = 0x2200,
|
|
|
|
|
STORE = 0x2201,
|
|
|
|
|
HALT = 0xF000,
|
|
|
|
|
NOP = 0xF001,
|
|
|
|
|
}
|
2020-02-09 13:04:56 -05:00
|
|
|
|
|
|
|
|
pub fn inst_len(op: InstOp) -> usize {
|
|
|
|
|
match op {
|
|
|
|
|
// 2 bytes
|
2020-02-11 17:49:17 -05:00
|
|
|
HALT | NOP => 2,
|
2020-02-09 13:04:56 -05:00
|
|
|
// 4 bytes
|
2020-02-11 17:49:17 -05:00
|
|
|
ADD | MUL | DIV | INEG | INV | NOT | MOD | AND | OR | XOR | SHL | SHR | CMPEQ | CMPLT
|
|
|
|
|
| JMP | JZ | JNZ | LOAD | REGCOPY | MEMCOPY | STORE => 4,
|
2020-02-09 13:04:56 -05:00
|
|
|
// Immediates - 4+ bytes
|
|
|
|
|
STOREIMM64 => 16,
|
|
|
|
|
STOREIMM32 => 8,
|
|
|
|
|
_ => panic!("unknown instruction op 0x{:04x}", op),
|
|
|
|
|
}
|
|
|
|
|
}
|