use std::fmt::{Display, Formatter, Result};
use num_enum::TryFromPrimitive;
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, PartialEq, TryFromPrimitive)]
#[repr(u8)]
pub enum V1OPCode {
NONE,
LOAD_PRI,
LOAD_ALT,
LOAD_S_PRI,
LOAD_S_ALT,
UNGEN_LREF_PRI,
UNGEN_LREF_ALT,
LREF_S_PRI,
LREF_S_ALT,
LOAD_I,
LODB_I,
CONST_PRI,
CONST_ALT,
ADDR_PRI,
ADDR_ALT,
STOR_PRI,
STOR_ALT,
STOR_S_PRI,
STOR_S_ALT,
UNGEN_SREF_PRI,
UNGEN_SREF_ALT,
SREF_S_PRI,
SREF_S_ALT,
STOR_I,
STRB_I,
LIDX,
LIDX_B,
IDXADDR,
IDXADDR_B,
UNGEN_ALIGN_PRI,
UNGEN_ALIGN_ALT,
UNGEN_LCTRL,
UNGEN_SCTRL,
MOVE_PRI,
MOVE_ALT,
XCHG,
PUSH_PRI,
PUSH_ALT,
UNGEN_PUSH_R,
PUSH_C,
PUSH,
PUSH_S,
POP_PRI,
POP_ALT,
STACK,
HEAP,
PROC,
UNGEN_RET,
RETN,
CALL,
UNGEN_CALL_PRI,
JUMP,
UNGEN_JREL,
JZER,
JNZ,
JEQ,
JNEQ,
UNGEN_JLESS,
UNGEN_JLEQ,
UNGEN_JGRTR,
UNGEN_JGEQ,
JSLESS,
JSLEQ,
JSGRTR,
JSGEQ,
SHL,
SHR,
SSHR,
SHL_C_PRI,
SHL_C_ALT,
SHR_C_PRI,
SHR_C_ALT,
SMUL,
SDIV,
SDIV_ALT,
UNGEN_UMUL,
UNGEN_UDIV,
UNGEN_UDIV_ALT,
ADD,
SUB,
SUB_ALT,
AND,
OR,
XOR,
NOT,
NEG,
INVERT,
ADD_C,
SMUL_C,
ZERO_PRI,
ZERO_ALT,
ZERO,
ZERO_S,
UNGEN_SIGN_PRI,
UNGEN_SIGN_ALT,
EQ,
NEQ,
UNGEN_LESS,
UNGEN_LEQ,
UNGEN_GRTR,
UNGEN_GEQ,
SLESS,
SLEQ,
SGRTR,
SGEQ,
EQ_C_PRI,
EQ_C_ALT,
INC_PRI,
INC_ALT,
INC,
INC_S,
INC_I,
DEC_PRI,
DEC_ALT,
DEC,
DEC_S,
DEC_I,
MOVS,
UNGEN_CMPS,
FILL,
HALT,
BOUNDS,
UNGEN_SYSREQ_PRI,
SYSREQ_C,
UNGEN_FILE,
UNGEN_LINE,
UNGEN_SYMBOL,
UNGEN_SRANGE,
UNGEN_JUMP_PRI,
SWITCH,
CASETBL,
SWAP_PRI,
SWAP_ALT,
PUSH_ADR,
NOP,
SYSREQ_N,
UNGEN_SYMTAG,
BREAK,
PUSH2_C,
PUSH2,
PUSH2_S,
PUSH2_ADR,
PUSH3_C,
PUSH3,
PUSH3_S,
PUSH3_ADR,
PUSH4_C,
PUSH4,
PUSH4_S,
PUSH4_ADR,
PUSH5_C,
PUSH5,
PUSH5_S,
PUSH5_ADR,
LOAD_BOTH,
LOAD_S_BOTH,
CONST,
CONST_S,
UNGEN_SYSREQ_D,
UNGEB_SYSREQ_ND,
TRACKER_PUSH_C,
TRACKER_POP_SETHEAP,
GENARRAY,
GENARRAY_Z,
STRADJUST_PRI,
UNGEN_STKADJUST,
ENDPROC,
LDGFN_PRI,
REBASE,
FABS,
FLOAT,
FLOATADD,
FLOATSUB,
FLOATMUL,
FLOATDIV,
RND_TO_NEAREST,
RND_TO_FLOOR,
RND_TO_CEIL,
RND_TO_ZERO,
FLOATCMP,
FLOAT_GT,
FLOAT_GE,
FLOAT_LT,
FLOAT_LE,
FLOAT_NE,
FLOAT_EQ,
FLOAT_NOT,
TOTAL_OPCODES
}
impl Default for V1OPCode {
fn default() -> Self { V1OPCode::TOTAL_OPCODES }
}
impl Display for V1OPCode {
fn fmt(&self, f: &mut Formatter) -> Result {
write!(f, "{:?}", self)
}
}