wip bytecode format specification in rust
This commit is contained in:
parent
5ebb404276
commit
d65bef661e
|
@ -0,0 +1 @@
|
|||
build.target-dir = "_build/native"
|
|
@ -0,0 +1,7 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "spicei"
|
||||
version = "0.1.0"
|
|
@ -0,0 +1,3 @@
|
|||
[workspace]
|
||||
members = ["native"]
|
||||
resolver = "2"
|
|
@ -0,0 +1,6 @@
|
|||
[package]
|
||||
name = "spicei"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
|
@ -0,0 +1 @@
|
|||
pub mod opcodes;
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
fn main() {}
|
|
@ -0,0 +1,166 @@
|
|||
use std::fmt;
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
||||
#[repr(transparent)]
|
||||
pub struct Reg(pub u16);
|
||||
|
||||
impl fmt::Display for Reg {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "R{}", self.0)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
|
||||
#[repr(transparent)]
|
||||
pub struct ConstIdx(pub u16);
|
||||
|
||||
impl fmt::Display for ConstIdx {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "({})", self.0)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub enum ArgV {
|
||||
R(Reg),
|
||||
K(ConstIdx),
|
||||
}
|
||||
|
||||
impl fmt::Display for ArgV {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
Self::R(r) => r.fmt(f),
|
||||
Self::K(k) => k.fmt(f),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub enum ArgL {
|
||||
SubI(Reg, i16),
|
||||
SubR(Reg, Reg),
|
||||
}
|
||||
|
||||
impl fmt::Display for ArgL {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
Self::SubI(r, l) => write!(f, "{r}[{l}]"),
|
||||
Self::SubR(r, l) => write!(f, "{r}[{l}]"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub enum Ins {
|
||||
O(InsO, i32),
|
||||
V(InsV, ArgV),
|
||||
RV(InsRV, Reg, ArgV),
|
||||
RL(InsRL, Reg, ArgL),
|
||||
LV(InsLV, ArgL, ArgV),
|
||||
RRK(InsRRK, Reg, Reg, ConstIdx),
|
||||
}
|
||||
|
||||
impl fmt::Display for Ins {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
Self::O(InsO::JMP, o) => write!(f, "jmp {o:+}"),
|
||||
Self::V(InsV::RET, v) => write!(f, "ret {v}"),
|
||||
Self::V(InsV::BTR, v) => write!(f, "btr {v}"),
|
||||
Self::RV(InsRV::Op(opr), r, v) => write!(f, "{opr} {r}, {v}"),
|
||||
Self::RV(InsRV::Br(cmp), r, v) => write!(f, "b{cmp} {r}, {v}"),
|
||||
Self::RL(InsRL::Get(opr), r, l) => write!(f, "{opr} {r}, {l}"),
|
||||
Self::RL(InsRL::CAL(n), r, l) => write!(f, "cal {r}, {l}({r},...{n})"),
|
||||
Self::RL(InsRL::RETCAL(n), r, l) => write!(f, "ret cal {l}({r},...{n})"),
|
||||
Self::LV(InsLV::Set(opr), l, v) => write!(f, "{opr} {l}, {v}"),
|
||||
Self::RRK(InsRRK::LOC, r, v, k) => write!(f, "loc {r}, {v}, {k}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub enum InsV {
|
||||
RET,
|
||||
BTR,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub enum InsRV {
|
||||
Op(Opr),
|
||||
Br(Cmp),
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub enum InsRL {
|
||||
Get(Opr),
|
||||
CAL(u16),
|
||||
RETCAL(u16),
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub enum InsLV {
|
||||
Set(Opr),
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub enum InsRRK {
|
||||
LOC,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub enum InsO {
|
||||
JMP,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
|
||||
pub enum Opr {
|
||||
MOV,
|
||||
CON,
|
||||
NOT,
|
||||
NEG,
|
||||
ADD,
|
||||
SUB,
|
||||
MUL,
|
||||
DIV,
|
||||
MOD,
|
||||
Cmp(Cmp),
|
||||
}
|
||||
|
||||
impl fmt::Display for Opr {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
Self::MOV => write!(f, "mov"),
|
||||
Self::CON => write!(f, "con"),
|
||||
Self::NOT => write!(f, "not"),
|
||||
Self::NEG => write!(f, "neg"),
|
||||
Self::ADD => write!(f, "add"),
|
||||
Self::SUB => write!(f, "sub"),
|
||||
Self::MUL => write!(f, "mul"),
|
||||
Self::DIV => write!(f, "div"),
|
||||
Self::MOD => write!(f, "mod"),
|
||||
Self::Cmp(cmp) => write!(f, "c{cmp}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
|
||||
pub enum Cmp {
|
||||
EQ,
|
||||
NE,
|
||||
LT,
|
||||
GT,
|
||||
LE,
|
||||
GE,
|
||||
}
|
||||
|
||||
impl fmt::Display for Cmp {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
Self::EQ => write!(f, "eq"),
|
||||
Self::NE => write!(f, "ne"),
|
||||
Self::LT => write!(f, "lt"),
|
||||
Self::GT => write!(f, "gt"),
|
||||
Self::LE => write!(f, "le"),
|
||||
Self::GE => write!(f, "ge"),
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue