Removed m*_stack_* opcodes, make them default behaviour
Memory operations used operands to encode positional/size arguments, with stack variants in case the user wanted to programmatically do so. In most large scale cases I don't see the non-stack variants being used; many cases require using the stack for additions and subtractions to create values such as indexes or sizes. Therefore, it's better to be stack-first. One counter point is inline optimisation of code at runtime: if an compile-time-known object is pushed then immediately used in an operation, we can instead encode the value directly into an operand based instruction which will speed up execution time because it's slower to pop the value off the stack than have it available as part of the instruction.
This commit is contained in:
172
vm/runtime.h
172
vm/runtime.h
@@ -85,21 +85,6 @@ err_t vm_dup_short(vm_t *, word_t);
|
||||
err_t vm_dup_hword(vm_t *, word_t);
|
||||
err_t vm_dup_word(vm_t *, word_t);
|
||||
|
||||
err_t vm_malloc_byte(vm_t *, word_t);
|
||||
err_t vm_malloc_short(vm_t *, word_t);
|
||||
err_t vm_malloc_hword(vm_t *, word_t);
|
||||
err_t vm_malloc_word(vm_t *, word_t);
|
||||
|
||||
err_t vm_mset_byte(vm_t *, word_t);
|
||||
err_t vm_mset_short(vm_t *, word_t);
|
||||
err_t vm_mset_hword(vm_t *, word_t);
|
||||
err_t vm_mset_word(vm_t *, word_t);
|
||||
|
||||
err_t vm_mget_byte(vm_t *, word_t);
|
||||
err_t vm_mget_short(vm_t *, word_t);
|
||||
err_t vm_mget_hword(vm_t *, word_t);
|
||||
err_t vm_mget_word(vm_t *, word_t);
|
||||
|
||||
typedef err_t (*word_f)(vm_t *, word_t);
|
||||
static const word_f WORD_ROUTINES[] = {
|
||||
[OP_PUSH_REGISTER_BYTE] = vm_push_byte_register,
|
||||
@@ -116,38 +101,23 @@ static const word_f WORD_ROUTINES[] = {
|
||||
[OP_DUP_SHORT] = vm_dup_short,
|
||||
[OP_DUP_HWORD] = vm_dup_hword,
|
||||
[OP_DUP_WORD] = vm_dup_word,
|
||||
|
||||
[OP_MALLOC_BYTE] = vm_malloc_byte,
|
||||
[OP_MALLOC_SHORT] = vm_malloc_short,
|
||||
[OP_MALLOC_HWORD] = vm_malloc_hword,
|
||||
[OP_MALLOC_WORD] = vm_malloc_word,
|
||||
|
||||
[OP_MGET_BYTE] = vm_mget_byte,
|
||||
[OP_MGET_SHORT] = vm_mget_short,
|
||||
[OP_MGET_HWORD] = vm_mget_hword,
|
||||
[OP_MGET_WORD] = vm_mget_word,
|
||||
|
||||
[OP_MSET_BYTE] = vm_mset_byte,
|
||||
[OP_MSET_SHORT] = vm_mset_short,
|
||||
[OP_MSET_HWORD] = vm_mset_hword,
|
||||
[OP_MSET_WORD] = vm_mset_word,
|
||||
};
|
||||
|
||||
/* Operations that take input from the stack */
|
||||
err_t vm_malloc_stack_byte(vm_t *);
|
||||
err_t vm_malloc_stack_short(vm_t *);
|
||||
err_t vm_malloc_stack_hword(vm_t *);
|
||||
err_t vm_malloc_stack_word(vm_t *);
|
||||
err_t vm_malloc_byte(vm_t *);
|
||||
err_t vm_malloc_short(vm_t *);
|
||||
err_t vm_malloc_hword(vm_t *);
|
||||
err_t vm_malloc_word(vm_t *);
|
||||
|
||||
err_t vm_mset_stack_byte(vm_t *);
|
||||
err_t vm_mset_stack_short(vm_t *);
|
||||
err_t vm_mset_stack_hword(vm_t *);
|
||||
err_t vm_mset_stack_word(vm_t *);
|
||||
err_t vm_mset_byte(vm_t *);
|
||||
err_t vm_mset_short(vm_t *);
|
||||
err_t vm_mset_hword(vm_t *);
|
||||
err_t vm_mset_word(vm_t *);
|
||||
|
||||
err_t vm_mget_stack_byte(vm_t *);
|
||||
err_t vm_mget_stack_short(vm_t *);
|
||||
err_t vm_mget_stack_hword(vm_t *);
|
||||
err_t vm_mget_stack_word(vm_t *);
|
||||
err_t vm_mget_byte(vm_t *);
|
||||
err_t vm_mget_short(vm_t *);
|
||||
err_t vm_mget_hword(vm_t *);
|
||||
err_t vm_mget_word(vm_t *);
|
||||
|
||||
err_t vm_mdelete(vm_t *);
|
||||
err_t vm_msize(vm_t *);
|
||||
@@ -234,97 +204,59 @@ err_t vm_mult_word(vm_t *);
|
||||
|
||||
typedef err_t (*stack_f)(vm_t *);
|
||||
static const stack_f STACK_ROUTINES[] = {
|
||||
[OP_MALLOC_STACK_BYTE] = vm_malloc_stack_byte,
|
||||
[OP_MALLOC_STACK_SHORT] = vm_malloc_stack_short,
|
||||
[OP_MALLOC_STACK_HWORD] = vm_malloc_stack_hword,
|
||||
[OP_MALLOC_STACK_WORD] = vm_malloc_stack_word,
|
||||
[OP_MALLOC_BYTE] = vm_malloc_byte, [OP_MALLOC_SHORT] = vm_malloc_short,
|
||||
[OP_MALLOC_HWORD] = vm_malloc_hword, [OP_MALLOC_WORD] = vm_malloc_word,
|
||||
|
||||
[OP_MGET_STACK_BYTE] = vm_mget_stack_byte,
|
||||
[OP_MGET_STACK_SHORT] = vm_mget_stack_short,
|
||||
[OP_MGET_STACK_HWORD] = vm_mget_stack_hword,
|
||||
[OP_MGET_STACK_WORD] = vm_mget_stack_word,
|
||||
[OP_MSET_STACK_BYTE] = vm_mset_stack_byte,
|
||||
[OP_MSET_STACK_SHORT] = vm_mset_stack_short,
|
||||
[OP_MSET_STACK_HWORD] = vm_mset_stack_hword,
|
||||
[OP_MSET_STACK_WORD] = vm_mset_stack_word,
|
||||
[OP_MGET_BYTE] = vm_mget_byte, [OP_MGET_SHORT] = vm_mget_short,
|
||||
[OP_MGET_HWORD] = vm_mget_hword, [OP_MGET_WORD] = vm_mget_word,
|
||||
|
||||
[OP_MDELETE] = vm_mdelete,
|
||||
[OP_MSIZE] = vm_msize,
|
||||
[OP_MSET_BYTE] = vm_mset_byte, [OP_MSET_SHORT] = vm_mset_short,
|
||||
[OP_MSET_HWORD] = vm_mset_hword, [OP_MSET_WORD] = vm_mset_word,
|
||||
|
||||
[OP_NOT_BYTE] = vm_not_byte,
|
||||
[OP_NOT_SHORT] = vm_not_short,
|
||||
[OP_NOT_HWORD] = vm_not_hword,
|
||||
[OP_NOT_WORD] = vm_not_word,
|
||||
[OP_MDELETE] = vm_mdelete, [OP_MSIZE] = vm_msize,
|
||||
|
||||
[OP_OR_BYTE] = vm_or_byte,
|
||||
[OP_OR_SHORT] = vm_or_short,
|
||||
[OP_OR_HWORD] = vm_or_hword,
|
||||
[OP_OR_WORD] = vm_or_word,
|
||||
[OP_NOT_BYTE] = vm_not_byte, [OP_NOT_SHORT] = vm_not_short,
|
||||
[OP_NOT_HWORD] = vm_not_hword, [OP_NOT_WORD] = vm_not_word,
|
||||
|
||||
[OP_AND_BYTE] = vm_and_byte,
|
||||
[OP_AND_SHORT] = vm_and_short,
|
||||
[OP_AND_HWORD] = vm_and_hword,
|
||||
[OP_AND_WORD] = vm_and_word,
|
||||
[OP_OR_BYTE] = vm_or_byte, [OP_OR_SHORT] = vm_or_short,
|
||||
[OP_OR_HWORD] = vm_or_hword, [OP_OR_WORD] = vm_or_word,
|
||||
|
||||
[OP_XOR_BYTE] = vm_xor_byte,
|
||||
[OP_XOR_SHORT] = vm_xor_short,
|
||||
[OP_XOR_HWORD] = vm_xor_hword,
|
||||
[OP_XOR_WORD] = vm_xor_word,
|
||||
[OP_AND_BYTE] = vm_and_byte, [OP_AND_SHORT] = vm_and_short,
|
||||
[OP_AND_HWORD] = vm_and_hword, [OP_AND_WORD] = vm_and_word,
|
||||
|
||||
[OP_EQ_BYTE] = vm_eq_byte,
|
||||
[OP_EQ_SHORT] = vm_eq_short,
|
||||
[OP_EQ_HWORD] = vm_eq_hword,
|
||||
[OP_EQ_WORD] = vm_eq_word,
|
||||
[OP_XOR_BYTE] = vm_xor_byte, [OP_XOR_SHORT] = vm_xor_short,
|
||||
[OP_XOR_HWORD] = vm_xor_hword, [OP_XOR_WORD] = vm_xor_word,
|
||||
|
||||
[OP_LT_BYTE] = vm_lt_byte,
|
||||
[OP_LT_SBYTE] = vm_lt_sbyte,
|
||||
[OP_LT_SHORT] = vm_lt_short,
|
||||
[OP_LT_SSHORT] = vm_lt_sshort,
|
||||
[OP_LT_SHWORD] = vm_lt_shword,
|
||||
[OP_LT_HWORD] = vm_lt_hword,
|
||||
[OP_LT_SWORD] = vm_lt_sword,
|
||||
[OP_LT_WORD] = vm_lt_word,
|
||||
[OP_EQ_BYTE] = vm_eq_byte, [OP_EQ_SHORT] = vm_eq_short,
|
||||
[OP_EQ_HWORD] = vm_eq_hword, [OP_EQ_WORD] = vm_eq_word,
|
||||
|
||||
[OP_LTE_BYTE] = vm_lte_byte,
|
||||
[OP_LTE_SBYTE] = vm_lte_sbyte,
|
||||
[OP_LTE_SHORT] = vm_lte_short,
|
||||
[OP_LTE_SSHORT] = vm_lte_sshort,
|
||||
[OP_LTE_SHWORD] = vm_lte_shword,
|
||||
[OP_LTE_HWORD] = vm_lte_hword,
|
||||
[OP_LTE_SWORD] = vm_lte_sword,
|
||||
[OP_LTE_WORD] = vm_lte_word,
|
||||
[OP_LT_BYTE] = vm_lt_byte, [OP_LT_SBYTE] = vm_lt_sbyte,
|
||||
[OP_LT_SHORT] = vm_lt_short, [OP_LT_SSHORT] = vm_lt_sshort,
|
||||
[OP_LT_SHWORD] = vm_lt_shword, [OP_LT_HWORD] = vm_lt_hword,
|
||||
[OP_LT_SWORD] = vm_lt_sword, [OP_LT_WORD] = vm_lt_word,
|
||||
|
||||
[OP_GT_BYTE] = vm_gt_byte,
|
||||
[OP_GT_SBYTE] = vm_gt_sbyte,
|
||||
[OP_GT_SHORT] = vm_gt_short,
|
||||
[OP_GT_SSHORT] = vm_gt_sshort,
|
||||
[OP_GT_SHWORD] = vm_gt_shword,
|
||||
[OP_GT_HWORD] = vm_gt_hword,
|
||||
[OP_GT_SWORD] = vm_gt_sword,
|
||||
[OP_GT_WORD] = vm_gt_word,
|
||||
[OP_LTE_BYTE] = vm_lte_byte, [OP_LTE_SBYTE] = vm_lte_sbyte,
|
||||
[OP_LTE_SHORT] = vm_lte_short, [OP_LTE_SSHORT] = vm_lte_sshort,
|
||||
[OP_LTE_SHWORD] = vm_lte_shword, [OP_LTE_HWORD] = vm_lte_hword,
|
||||
[OP_LTE_SWORD] = vm_lte_sword, [OP_LTE_WORD] = vm_lte_word,
|
||||
|
||||
[OP_GTE_BYTE] = vm_gte_byte,
|
||||
[OP_GTE_SBYTE] = vm_gte_sbyte,
|
||||
[OP_GTE_SHORT] = vm_gte_short,
|
||||
[OP_GTE_SSHORT] = vm_gte_sshort,
|
||||
[OP_GTE_SHWORD] = vm_gte_shword,
|
||||
[OP_GTE_HWORD] = vm_gte_hword,
|
||||
[OP_GTE_SWORD] = vm_gte_sword,
|
||||
[OP_GTE_WORD] = vm_gte_word,
|
||||
[OP_GT_BYTE] = vm_gt_byte, [OP_GT_SBYTE] = vm_gt_sbyte,
|
||||
[OP_GT_SHORT] = vm_gt_short, [OP_GT_SSHORT] = vm_gt_sshort,
|
||||
[OP_GT_SHWORD] = vm_gt_shword, [OP_GT_HWORD] = vm_gt_hword,
|
||||
[OP_GT_SWORD] = vm_gt_sword, [OP_GT_WORD] = vm_gt_word,
|
||||
|
||||
[OP_PLUS_BYTE] = vm_plus_byte,
|
||||
[OP_PLUS_SHORT] = vm_plus_short,
|
||||
[OP_PLUS_HWORD] = vm_plus_hword,
|
||||
[OP_PLUS_WORD] = vm_plus_word,
|
||||
[OP_SUB_BYTE] = vm_sub_byte,
|
||||
[OP_SUB_SHORT] = vm_sub_short,
|
||||
[OP_SUB_HWORD] = vm_sub_hword,
|
||||
[OP_SUB_WORD] = vm_sub_word,
|
||||
[OP_GTE_BYTE] = vm_gte_byte, [OP_GTE_SBYTE] = vm_gte_sbyte,
|
||||
[OP_GTE_SHORT] = vm_gte_short, [OP_GTE_SSHORT] = vm_gte_sshort,
|
||||
[OP_GTE_SHWORD] = vm_gte_shword, [OP_GTE_HWORD] = vm_gte_hword,
|
||||
[OP_GTE_SWORD] = vm_gte_sword, [OP_GTE_WORD] = vm_gte_word,
|
||||
|
||||
[OP_MULT_BYTE] = vm_mult_byte,
|
||||
[OP_MULT_SHORT] = vm_mult_short,
|
||||
[OP_MULT_HWORD] = vm_mult_hword,
|
||||
[OP_MULT_WORD] = vm_mult_word,
|
||||
[OP_PLUS_BYTE] = vm_plus_byte, [OP_PLUS_SHORT] = vm_plus_short,
|
||||
[OP_PLUS_HWORD] = vm_plus_hword, [OP_PLUS_WORD] = vm_plus_word,
|
||||
[OP_SUB_BYTE] = vm_sub_byte, [OP_SUB_SHORT] = vm_sub_short,
|
||||
[OP_SUB_HWORD] = vm_sub_hword, [OP_SUB_WORD] = vm_sub_word,
|
||||
|
||||
[OP_MULT_BYTE] = vm_mult_byte, [OP_MULT_SHORT] = vm_mult_short,
|
||||
[OP_MULT_HWORD] = vm_mult_hword, [OP_MULT_WORD] = vm_mult_word,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user