1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#![allow(missing_docs)] use crate::typedef::*; use rand_derive::Rand; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Copy, Clone, Debug, Rand)] pub enum Instruction { Add(IntegerType), Sub(IntegerType), Mul(IntegerType), Div(IntegerType), Shr(IntegerType), Shl(IntegerType), And(IntegerType), Or(IntegerType), Xor(IntegerType), Not(IntegerType), Neg(IntegerType), Cmp(IntegerType), Inc(IntegerType), Dec(IntegerType), U8Promote, U16Demote, I8Promote, I16Demote, PushConstU8(u8), PushConstU16(u16), PushConstI8(i8), PushConstI16(i16), LoadReg(Register), Load(IntegerType, Address), LoadIndirect(IntegerType), Store(IntegerType, Address), StoreIndirect(IntegerType), Dup(IntegerType), Drop(IntegerType), SysCall(u16), Call(Address), Ret, Alloc(u16), Free, Jmp(bool, u16), Jeq(bool, u16), Jneq(bool, u16), Jlt(bool, u16), JltEq(bool, u16), Jgt(bool, u16), JgtEq(bool, u16), } #[derive(Serialize, Deserialize, Copy, Clone, Debug, Rand)] pub enum IntegerType { U8, U16, I8, I16, } #[derive(Serialize, Deserialize, Copy, Clone, Debug, Rand)] pub enum Register { StackPtr, BasePtr, } #[cfg(test)] mod tests { use super::*; use std::mem::size_of; #[test] fn instruction_size() { let size = size_of::<Instruction>(); assert_eq!(size, 4); } #[test] fn register_size() { let size = size_of::<Register>(); assert_eq!(size, 1); } #[test] fn type_size() { let size = size_of::<IntegerType>(); assert_eq!(size, 1); } }