asm: add instruction opcode/operand definition table
This commit is contained in:
@@ -3,6 +3,26 @@
|
|||||||
|
|
||||||
#include <ivy/opcode.h>
|
#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 {
|
struct ivy_instr {
|
||||||
enum ivy_opcode i_op;
|
enum ivy_opcode i_op;
|
||||||
long i_a0;
|
long i_a0;
|
||||||
|
|||||||
37
asm/instr.c
Normal file
37
asm/instr.c
Normal 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 */
|
||||||
@@ -41,21 +41,29 @@ enum ivy_instr_id {
|
|||||||
enum ivy_opcode {
|
enum ivy_opcode {
|
||||||
IVY_OP_NONE = 0,
|
IVY_OP_NONE = 0,
|
||||||
|
|
||||||
IVY_OP_LDR_SP,
|
IVY_OP_LDR_SP_REG,
|
||||||
IVY_OP_LDR_BP,
|
IVY_OP_LDR_SP_CONST,
|
||||||
IVY_OP_LDR_SELF,
|
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_IMM,
|
||||||
IVY_OP_LDR_POOL,
|
|
||||||
|
|
||||||
IVY_OP_STR_SP,
|
IVY_OP_STR_SP_REG,
|
||||||
IVY_OP_STR_BP,
|
IVY_OP_STR_SP_CONST,
|
||||||
IVY_OP_STR_SELF,
|
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_POP,
|
||||||
|
|
||||||
IVY_OP_MSG_R,
|
IVY_OP_MSG_REG,
|
||||||
IVY_OP_MSG_I,
|
IVY_OP_MSG_CONST,
|
||||||
|
|
||||||
IVY_OP_ADD,
|
IVY_OP_ADD,
|
||||||
IVY_OP_SUB,
|
IVY_OP_SUB,
|
||||||
|
|||||||
Reference in New Issue
Block a user