aboutsummaryrefslogtreecommitdiff
path: root/src/fvm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/fvm.h')
-rw-r--r--src/fvm.h116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/fvm.h b/src/fvm.h
new file mode 100644
index 0000000..40c71e2
--- /dev/null
+++ b/src/fvm.h
@@ -0,0 +1,116 @@
+#ifndef FVM_H_
+#define FVM_H_
+
+#include <stdint.h>
+
+typedef int64_t fvm_word_t;
+typedef double fvm_float_t;;
+
+struct fvm;
+
+// return non-zero if vm should be suspended
+typedef int64_t (*fvm_syscall_fn_t)(struct fvm* vm);
+
+struct fvm {
+ fvm_word_t sp;
+ fvm_word_t bp;
+ fvm_word_t pc;
+ fvm_syscall_fn_t *syscall_table;
+};
+
+enum fvm_op {
+ FVM_OP_SP,
+ FVM_OP_SSP,
+ FVM_OP_BP,
+ FVM_OP_SBP,
+ FVM_OP_PC,
+
+ FVM_OP_IMM,
+
+ FVM_OP_LD8,
+ FVM_OP_LD16,
+ FVM_OP_LD32,
+ FVM_OP_LD,
+ FVM_OP_ST8,
+ FVM_OP_ST16,
+ FVM_OP_ST32,
+ FVM_OP_ST,
+
+ FVM_OP_DUP,
+ FVM_OP_POP,
+ FVM_OP_SWAP,
+ FVM_OP_OVER,
+ FVM_OP_ROT,
+
+ FVM_OP_ADD,
+ FVM_OP_SUB,
+ FVM_OP_DIV,
+ FVM_OP_MUL,
+ FVM_OP_MOD,
+
+ FVM_OP_SHR,
+ FVM_OP_SHL,
+ FVM_OP_SAR,
+
+ FVM_OP_AND,
+ FVM_OP_OR,
+ FVM_OP_NOT,
+
+ FVM_OP_BITAND,
+ FVM_OP_BITOR,
+ FVM_OP_XOR,
+ FVM_OP_INVERT,
+
+ FVM_OP_GT,
+ FVM_OP_LT,
+ FVM_OP_GE,
+ FVM_OP_LE,
+ FVM_OP_EQ,
+ FVM_OP_NEQ,
+
+ FVM_OP_JMP,
+ FVM_OP_JZ,
+ FVM_OP_JNZ,
+
+ FVM_OP_RET,
+ FVM_OP_CALL,
+ FVM_OP_SYSCALL,
+
+ FVM_OP_FADD,
+ FVM_OP_FSUB,
+ FVM_OP_FMUL,
+ FVM_OP_FDIV,
+
+ FVM_OP_FGE,
+ FVM_OP_FGT,
+ FVM_OP_FLE,
+ FVM_OP_FLT,
+ FVM_OP_FEQ,
+ FVM_OP_FNEQ,
+
+ FVM_OP_FTI,
+ FVM_OP_ITF,
+};
+
+int fvm_init(struct fvm *vm, void *code, int64_t stack_size);
+int fvm_execute(struct fvm *vm);
+
+void fvm_push(struct fvm *vm, fvm_word_t value);
+int64_t fvm_pop(struct fvm *vm);
+
+fvm_float_t fvm_loadf(struct fvm *vm, fvm_word_t addr);
+void fvm_storef(struct fvm *vm, fvm_word_t addr, fvm_float_t val);
+
+fvm_word_t fvm_load(struct fvm *vm, fvm_word_t addr);
+void fvm_store(struct fvm *vm, fvm_word_t addr, int64_t value);
+
+int32_t fvm_load32(struct fvm *vm, fvm_word_t addr);
+void fvm_store32(struct fvm *vm, fvm_word_t addr, int32_t value);
+
+int16_t fvm_load16(struct fvm *vm, fvm_word_t addr);
+void fvm_store16(struct fvm *vm, fvm_word_t addr, int16_t value);
+
+int8_t fvm_load8(struct fvm *vm, fvm_word_t addr);
+void fvm_store8(struct fvm *vm, fvm_word_t addr, int8_t value);
+
+#endif