aboutsummaryrefslogtreecommitdiff
path: root/src/fvm.h
blob: 40c71e2a31120013d3766998b614569c72383c16 (plain)
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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