asm: add instruction opcode/operand definition table

This commit is contained in:
2024-12-15 19:30:34 +00:00
parent 9e75e1f16f
commit 10c03c4b74
3 changed files with 75 additions and 10 deletions

View File

@@ -3,6 +3,26 @@
#include <ivy/opcode.h>
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;

37
asm/instr.c Normal file
View File

@@ -0,0 +1,37 @@
#include <ivy/asm/instr.h>
#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 */

View File

@@ -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,