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:
10
vm/runtime.c
10
vm/runtime.c
@@ -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) ||
|
||||||
|
|||||||
21
vm/runtime.h
21
vm/runtime.h
@@ -96,26 +96,23 @@ 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,
|
||||||
|
[OP_DUP_BYTE] = vm_dup_byte,
|
||||||
|
[OP_DUP_HWORD] = vm_dup_hword,
|
||||||
|
[OP_DUP_WORD] = vm_dup_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_HWORD] = vm_dup_hword,
|
|
||||||
[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 *);
|
||||||
|
|||||||
Reference in New Issue
Block a user