DUP implementation is now part of WORD_ROUTINES

As PUSH_REGISTER and MOV have the same signature of taking a word as
input, DUP may as well be part of it.

This leads to a larger discussion about how signatures of functions
matter: I may need to do a cleanup at some point.
This commit is contained in:
2023-11-01 21:14:04 +00:00
parent a5afaee3d0
commit 4e64f1fe23
2 changed files with 12 additions and 19 deletions

View File

@@ -68,10 +68,11 @@ err_t vm_execute(vm_t *vm)
return PUSH_ROUTINES[instruction.opcode](vm, instruction.operand); return PUSH_ROUTINES[instruction.opcode](vm, instruction.operand);
} }
else if (OPCODE_IS_TYPE(instruction.opcode, OP_MOV) || else if (OPCODE_IS_TYPE(instruction.opcode, OP_MOV) ||
OPCODE_IS_TYPE(instruction.opcode, OP_PUSH_REGISTER)) OPCODE_IS_TYPE(instruction.opcode, OP_PUSH_REGISTER) ||
OPCODE_IS_TYPE(instruction.opcode, OP_DUP))
{ {
prog->ptr++; prog->ptr++;
return REG_ROUTINES[instruction.opcode](vm, instruction.operand.as_byte); return WORD_ROUTINES[instruction.opcode](vm, instruction.operand.as_word);
} }
else if (OPCODE_IS_TYPE(instruction.opcode, OP_POP)) else if (OPCODE_IS_TYPE(instruction.opcode, OP_POP))
{ {
@@ -94,11 +95,6 @@ err_t vm_execute(vm_t *vm)
} }
return ERR_OK; return ERR_OK;
} }
else if (OPCODE_IS_TYPE(instruction.opcode, OP_DUP))
{
prog->ptr++;
return DUP_ROUTINES[instruction.opcode](vm, instruction.operand.as_word);
}
else if (OPCODE_IS_TYPE(instruction.opcode, OP_NOT) || else if (OPCODE_IS_TYPE(instruction.opcode, OP_NOT) ||
OPCODE_IS_TYPE(instruction.opcode, OP_OR) || OPCODE_IS_TYPE(instruction.opcode, OP_OR) ||
OPCODE_IS_TYPE(instruction.opcode, OP_AND) || OPCODE_IS_TYPE(instruction.opcode, OP_AND) ||

View File

@@ -96,27 +96,24 @@ err_t vm_mov_byte(vm_t *, word);
err_t vm_mov_hword(vm_t *, word); err_t vm_mov_hword(vm_t *, word);
err_t vm_mov_word(vm_t *, word); err_t vm_mov_word(vm_t *, word);
typedef err_t (*reg_f)(vm_t *, word); err_t vm_dup_byte(vm_t *, word);
static const reg_f REG_ROUTINES[] = { err_t vm_dup_hword(vm_t *, word);
err_t vm_dup_word(vm_t *, word);
typedef err_t (*word_f)(vm_t *, word);
static const word_f WORD_ROUTINES[] = {
[OP_PUSH_REGISTER_BYTE] = vm_push_byte_register, [OP_PUSH_REGISTER_BYTE] = vm_push_byte_register,
[OP_PUSH_REGISTER_HWORD] = vm_push_hword_register, [OP_PUSH_REGISTER_HWORD] = vm_push_hword_register,
[OP_PUSH_REGISTER_WORD] = vm_push_word_register, [OP_PUSH_REGISTER_WORD] = vm_push_word_register,
[OP_MOV_BYTE] = vm_mov_byte, [OP_MOV_BYTE] = vm_mov_byte,
[OP_MOV_HWORD] = vm_mov_hword, [OP_MOV_HWORD] = vm_mov_hword,
[OP_MOV_WORD] = vm_mov_word, [OP_MOV_WORD] = vm_mov_word,
};
err_t vm_dup_byte(vm_t *, word);
err_t vm_dup_hword(vm_t *, word);
err_t vm_dup_word(vm_t *, word);
typedef err_t (*dup_f)(vm_t *, word);
static const dup_f DUP_ROUTINES[] = {
[OP_DUP_BYTE] = vm_dup_byte, [OP_DUP_BYTE] = vm_dup_byte,
[OP_DUP_HWORD] = vm_dup_hword, [OP_DUP_HWORD] = vm_dup_hword,
[OP_DUP_WORD] = vm_dup_word, [OP_DUP_WORD] = vm_dup_word,
}; };
err_t vm_not_byte(vm_t *); err_t vm_not_byte(vm_t *);
err_t vm_not_hword(vm_t *); err_t vm_not_hword(vm_t *);
err_t vm_not_word(vm_t *); err_t vm_not_word(vm_t *);