diff --git a/asm/include/ivy/asm/instr.h b/asm/include/ivy/asm/instr.h index af9ac31..8541ab2 100644 --- a/asm/include/ivy/asm/instr.h +++ b/asm/include/ivy/asm/instr.h @@ -3,6 +3,26 @@ #include +enum ivy_instr_operand_type { + IVY_OPERAND_NONE = 0, + IVY_INSTR_OPERAND_CONST, + IVY_INSTR_OPERAND_REGISTER, + IVY_INSTR_OPERAND_SELF_INDEX_REG, + IVY_INSTR_OPERAND_SELF_INDEX_CONST, + IVY_INSTR_OPERAND_POOL_INDEX_REG, + IVY_INSTR_OPERAND_POOL_INDEX_CONST, + IVY_INSTR_OPERAND_SP_INDEX_REG, + IVY_INSTR_OPERAND_SP_INDEX_CONST, + IVY_INSTR_OPERAND_BP_INDEX_REG, + IVY_INSTR_OPERAND_BP_INDEX_CONST, +}; + +struct ivy_instr_definition { + enum ivy_instr_id i_id; + enum ivy_opcopde i_opcode; + enum ivy_instr_operand_type i_operand[3]; +}; + struct ivy_instr { enum ivy_opcode i_op; long i_a0; diff --git a/asm/instr.c b/asm/instr.c new file mode 100644 index 0000000..3b2f511 --- /dev/null +++ b/asm/instr.c @@ -0,0 +1,37 @@ +#include + +#define INSTR(id, op, ...) \ + [op] = { .i_id = (id), .i_opcode = (op), .i_operand = { __VA_ARGS__ }} + +/* clang-format off */ +static const struct ivy_instr_definition instructions[] = { + INSTR(IVY_INSTR_LDR, IVY_OP_LDR_SP_REG, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_SP_INDEX_REG), + INSTR(IVY_INSTR_LDR, IVY_OP_LDR_SP_CONST, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_SP_INDEX_CONST), + INSTR(IVY_INSTR_LDR, IVY_OP_LDR_BP_REG, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_BP_INDEX_REG), + INSTR(IVY_INSTR_LDR, IVY_OP_LDR_BP_CONST, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_BP_INDEX_CONST), + INSTR(IVY_INSTR_LDR, IVY_OP_LDR_SELF_REG, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_SELF_INDEX_REG), + INSTR(IVY_INSTR_LDR, IVY_OP_LDR_SELF_CONST, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_SELF_INDEX_CONST), + INSTR(IVY_INSTR_LDR, IVY_OP_LDR_POOL_REG, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_POOL_INDEX_REG), + INSTR(IVY_INSTR_LDR, IVY_OP_LDR_POOL_CONST, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_POOL_INDEX_CONST), + + INSTR(IVY_INSTR_STR, IVY_OP_LDR_SP_REG, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_SP_INDEX_REG), + INSTR(IVY_INSTR_STR, IVY_OP_LDR_SP_CONST, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_SP_INDEX_CONST), + INSTR(IVY_INSTR_STR, IVY_OP_LDR_BP_REG, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_BP_INDEX_REG), + INSTR(IVY_INSTR_STR, IVY_OP_LDR_BP_CONST, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_BP_INDEX_CONST), + INSTR(IVY_INSTR_STR, IVY_OP_LDR_SELF_REG, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_SELF_INDEX_REG), + INSTR(IVY_INSTR_STR, IVY_OP_LDR_SELF_CONST, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_SELF_INDEX_CONST), + + INSTR(IVY_INSTR_PUSH, IVY_OP_PUSH_REG, IVY_INSTR_OPERAND_REGISTER), + INSTR(IVY_INSTR_PUSH, IVY_OP_PUSH_CONST, IVY_INSTR_OPERAND_CONST), + INSTR(IVY_INSTR_POP, IVY_OP_POP, IVY_INSTR_OPERAND_REGISTER), + + INSTR(IVY_INSTR_MSG, IVY_OP_MSG_REG, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER), + INSTR(IVY_INSTR_MSG, IVY_OP_MSG_CONST, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_CONST), + + INSTR(IVY_INSTR_ADD, IVY_OP_ADD, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER), + INSTR(IVY_INSTR_SUB, IVY_OP_SUB, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER), + INSTR(IVY_INSTR_MUL, IVY_OP_MUL, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER), + INSTR(IVY_INSTR_DIV, IVY_OP_DIV, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER, IVY_INSTR_OPERAND_REGISTER), + +}; +/* clang-format on */ \ No newline at end of file diff --git a/common/include/ivy/opcode.h b/common/include/ivy/opcode.h index fec7415..db7d94b 100644 --- a/common/include/ivy/opcode.h +++ b/common/include/ivy/opcode.h @@ -41,21 +41,29 @@ enum ivy_instr_id { enum ivy_opcode { IVY_OP_NONE = 0, - IVY_OP_LDR_SP, - IVY_OP_LDR_BP, - IVY_OP_LDR_SELF, + IVY_OP_LDR_SP_REG, + IVY_OP_LDR_SP_CONST, + IVY_OP_LDR_BP_REG, + IVY_OP_LDR_BP_CONST, + IVY_OP_LDR_SELF_REG, + IVY_OP_LDR_SELF_CONST, + IVY_OP_LDR_POOL_REG, + IVY_OP_LDR_POOL_CONST, IVY_OP_LDR_IMM, - IVY_OP_LDR_POOL, - IVY_OP_STR_SP, - IVY_OP_STR_BP, - IVY_OP_STR_SELF, + IVY_OP_STR_SP_REG, + IVY_OP_STR_SP_CONST, + IVY_OP_STR_BP_REG, + IVY_OP_STR_BP_CONST, + IVY_OP_STR_SELF_REG, + IVY_OP_STR_SELF_CONST, - IVY_OP_PUSH, + IVY_OP_PUSH_REG, + IVY_OP_PUSH_CONST, IVY_OP_POP, - IVY_OP_MSG_R, - IVY_OP_MSG_I, + IVY_OP_MSG_REG, + IVY_OP_MSG_CONST, IVY_OP_ADD, IVY_OP_SUB,