aboutsummaryrefslogtreecommitdiff
path: root/executor/executor.h
diff options
context:
space:
mode:
Diffstat (limited to 'executor/executor.h')
-rw-r--r--executor/executor.h46
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