Better checking of opcode types
Introduced an enum (opcode_type_t) for the masks and values of each opcode, which allows defining a single enum which checks an opcode by a opcode_type_t.
This commit is contained in:
14
src/inst.h
14
src/inst.h
@@ -39,10 +39,16 @@ typedef enum
|
||||
OP_HALT,
|
||||
} opcode_t;
|
||||
|
||||
#define OPCODE_IS_PUSH(OPCODE) (((OPCODE)&0b1) == 0b1)
|
||||
#define OPCODE_IS_PUSH_REG(OPCODE) (((OPCODE)&0b10) == 0b10)
|
||||
#define OPCODE_IS_POP(OPCODE) (((OPCODE)&0b100) == 0b100)
|
||||
#define OPCODE_IS_MOV(OPCODE) (((OPCODE)&0b1000) == 0b1000)
|
||||
// Masks and values to check if an opcode is of a type
|
||||
typedef enum
|
||||
{
|
||||
OP_TYPE_PUSH = 0b1,
|
||||
OP_TYPE_PUSH_REGISTER = 0b10,
|
||||
OP_TYPE_POP = 0b100,
|
||||
OP_TYPE_MOV = 0b1000,
|
||||
} opcode_type_t;
|
||||
|
||||
#define OPCODE_IS_TYPE(OPCODE, TYPE) ((OPCODE & TYPE) == TYPE)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
||||
@@ -23,26 +23,26 @@ void vm_execute(vm_t *vm)
|
||||
return;
|
||||
inst_t instruction = prog->instructions[prog->ptr];
|
||||
|
||||
if (OPCODE_IS_PUSH(instruction.opcode))
|
||||
if (OPCODE_IS_TYPE(instruction.opcode, OP_TYPE_PUSH))
|
||||
{
|
||||
PUSH_ROUTINES[instruction.opcode](vm, instruction.operand);
|
||||
vm->registers.ret = instruction.operand.as_word;
|
||||
prog->ptr++;
|
||||
}
|
||||
else if (OPCODE_IS_PUSH_REG(instruction.opcode))
|
||||
else if (OPCODE_IS_TYPE(instruction.opcode, OP_TYPE_PUSH_REGISTER))
|
||||
{
|
||||
PUSH_REG_ROUTINES[instruction.opcode](vm, instruction.reg);
|
||||
vm->registers.ret = instruction.operand.as_word;
|
||||
prog->ptr++;
|
||||
}
|
||||
else if (OPCODE_IS_POP(instruction.opcode))
|
||||
else if (OPCODE_IS_TYPE(instruction.opcode, OP_TYPE_POP))
|
||||
{
|
||||
// NOTE: We use the `ret` register for the result of this pop
|
||||
data_t d = POP_ROUTINES[instruction.opcode](vm);
|
||||
vm->registers.ret = d.as_word;
|
||||
prog->ptr++;
|
||||
}
|
||||
else if (OPCODE_IS_MOV(instruction.opcode))
|
||||
else if (OPCODE_IS_TYPE(instruction.opcode, OP_TYPE_MOV))
|
||||
{
|
||||
MOV_ROUTINES[instruction.opcode](vm, instruction.operand, instruction.reg);
|
||||
vm->registers.ret = instruction.operand.as_word;
|
||||
|
||||
Reference in New Issue
Block a user