diff options
Diffstat (limited to 'executor/executor.h')
-rw-r--r-- | executor/executor.h | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/executor/executor.h b/executor/executor.h new file mode 100644 index 0000000..fdf6e67 --- /dev/null +++ b/executor/executor.h @@ -0,0 +1,46 @@ +#ifndef AMAL_EXECUTOR_H +#define AMAL_EXECUTOR_H + +#include "../include/std/misc.h" +#include "../include/std/types.h" +#include "../include/std/buffer_view.h" + +/*doc(Execution backend) +Amalgam supports multiple execution backend and they can be implemented with minimal +effort. The only requirement is implementation of all the functions in executor/executor.h +and adding the source file with the implementation to the build script. See executor/interpreter/executor.c +as an example.\ +These functions are then called by amalgam as amalgam parses the amalgam bytecode when `amal_program_run` is called. +*/ + +struct amal_executor_impl; +typedef struct amal_executor amal_executor; + +CHECK_RESULT int amal_executor_init(amal_executor **self); +void amal_executor_deinit(amal_executor *self); +CHECK_RESULT int amal_executor_run(amal_executor *self); + +CHECK_RESULT int amal_exec_nop(amal_executor *self); +CHECK_RESULT int amal_exec_setz(amal_executor *self, u8 dst_reg); +CHECK_RESULT int amal_exec_mov(amal_executor *self, u8 dst_reg, u8 src_reg); +CHECK_RESULT int amal_exec_movi(amal_executor *self, u8 dst_reg, i64 imm); +CHECK_RESULT int amal_exec_movd(amal_executor *self, u8 dst_reg, BufferView data); +CHECK_RESULT int amal_exec_add(amal_executor *self, u8 dst_reg, u8 src_reg1, u8 src_reg2); +CHECK_RESULT int amal_exec_sub(amal_executor *self, u8 dst_reg, u8 src_reg1, u8 src_reg2); +CHECK_RESULT int amal_exec_imul(amal_executor *self, u8 dst_reg, u8 src_reg1, u8 src_reg2); +CHECK_RESULT int amal_exec_mul(amal_executor *self, u8 dst_reg, u8 src_reg1, u8 src_reg2); +CHECK_RESULT int amal_exec_idiv(amal_executor *self, u8 dst_reg, u8 src_reg1, u8 src_reg2); +CHECK_RESULT int amal_exec_div(amal_executor *self, u8 dst_reg, u8 src_reg1, u8 src_reg2); +CHECK_RESULT int amal_exec_push(amal_executor *self, u8 reg); +CHECK_RESULT int amal_exec_pushi(amal_executor *self, i64 imm); +CHECK_RESULT int amal_exec_pushd(amal_executor *self, BufferView data); +/*CHECK_RESULT int amal_exec_call(u8 dst_reg, BufferView data); +CHECK_RESULT int amal_exec_callr(u8 dst_reg, BufferView data);*/ +CHECK_RESULT int amal_exec_cmp(amal_executor *self, u8 dst_reg, u8 src_reg1, u8 src_reg2); +CHECK_RESULT int amal_exec_jz(amal_executor *self, u8 dst_reg, i16 offset); +CHECK_RESULT int amal_exec_jmp(amal_executor *self, i16 offset); +CHECK_RESULT int amal_exec_ret(amal_executor *self); +CHECK_RESULT int amal_exec_func_start(amal_executor *self, u16 num_regs); +CHECK_RESULT int amal_exec_func_end(amal_executor *self); + +#endif |