diff options
Diffstat (limited to 'vm')
-rw-r--r-- | vm/runtime.c | 11 | ||||
-rw-r--r-- | vm/runtime.h | 30 |
2 files changed, 32 insertions, 9 deletions
diff --git a/vm/runtime.c b/vm/runtime.c index 1f5396a..5d5333b 100644 --- a/vm/runtime.c +++ b/vm/runtime.c @@ -60,7 +60,7 @@ const char *err_as_cstr(err_t err) err_t vm_execute(vm_t *vm) { - static_assert(NUMBER_OF_OPCODES == 90, "vm_execute: Out of date"); + static_assert(NUMBER_OF_OPCODES == 96, "vm_execute: Out of date"); struct Program *prog = &vm->program; if (prog->ptr >= prog->max) return ERR_END_OF_PROGRAM; @@ -112,7 +112,9 @@ err_t vm_execute(vm_t *vm) OPCODE_IS_TYPE(instruction.opcode, OP_GT) || OPCODE_IS_TYPE(instruction.opcode, OP_GTE) || OPCODE_IS_TYPE(instruction.opcode, OP_PLUS) || + OPCODE_IS_TYPE(instruction.opcode, OP_SUB) || OPCODE_IS_TYPE(instruction.opcode, OP_MULT) || + OPCODE_IS_TYPE(instruction.opcode, OP_MALLOC_STACK) || OPCODE_IS_TYPE(instruction.opcode, OP_MSET_STACK) || OPCODE_IS_TYPE(instruction.opcode, OP_MGET_STACK) || instruction.opcode == OP_MDELETE || instruction.opcode == OP_MSIZE) @@ -817,6 +819,9 @@ err_t vm_pop_word(vm_t *vm, data_t *ret) return vm_##ACTION##_##TYPE(vm, n.as_word); \ } +VM_MEMORY_STACK_CONSTR(malloc, byte) +VM_MEMORY_STACK_CONSTR(malloc, hword) +VM_MEMORY_STACK_CONSTR(malloc, word) VM_MEMORY_STACK_CONSTR(mset, byte) VM_MEMORY_STACK_CONSTR(mset, hword) VM_MEMORY_STACK_CONSTR(mset, word) @@ -904,6 +909,10 @@ VM_SAME_TYPE(plus, +, byte, BYTE) VM_SAME_TYPE(plus, +, hword, HWORD) VM_SAME_TYPE(plus, +, word, WORD) +VM_SAME_TYPE(sub, -, byte, BYTE) +VM_SAME_TYPE(sub, -, hword, HWORD) +VM_SAME_TYPE(sub, -, word, WORD) + VM_SAME_TYPE(mult, *, byte, BYTE) VM_SAME_TYPE(mult, *, hword, HWORD) VM_SAME_TYPE(mult, *, word, WORD) diff --git a/vm/runtime.h b/vm/runtime.h index 0f8c41e..ce3cb42 100644 --- a/vm/runtime.h +++ b/vm/runtime.h @@ -137,6 +137,10 @@ static const word_f WORD_ROUTINES[] = { [OP_MSET_WORD] = vm_mset_word, }; +err_t vm_malloc_stack_byte(vm_t *); +err_t vm_malloc_stack_hword(vm_t *); +err_t vm_malloc_stack_word(vm_t *); + err_t vm_mset_stack_byte(vm_t *); err_t vm_mset_stack_hword(vm_t *); err_t vm_mset_stack_word(vm_t *); @@ -203,20 +207,27 @@ err_t vm_plus_byte(vm_t *); err_t vm_plus_hword(vm_t *); err_t vm_plus_word(vm_t *); +err_t vm_sub_byte(vm_t *); +err_t vm_sub_hword(vm_t *); +err_t vm_sub_word(vm_t *); + err_t vm_mult_byte(vm_t *); err_t vm_mult_hword(vm_t *); err_t vm_mult_word(vm_t *); typedef err_t (*stack_f)(vm_t *); static const stack_f STACK_ROUTINES[] = { - [OP_MGET_STACK_BYTE] = vm_mget_stack_byte, - [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_HWORD] = vm_mset_stack_hword, - [OP_MSET_STACK_WORD] = vm_mset_stack_word, - [OP_MDELETE] = vm_mdelete, - [OP_MSIZE] = vm_msize, + [OP_MALLOC_STACK_BYTE] = vm_malloc_stack_byte, + [OP_MALLOC_STACK_HWORD] = vm_malloc_stack_hword, + [OP_MALLOC_STACK_WORD] = vm_malloc_stack_word, + [OP_MGET_STACK_BYTE] = vm_mget_stack_byte, + [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_HWORD] = vm_mset_stack_hword, + [OP_MSET_STACK_WORD] = vm_mset_stack_word, + [OP_MDELETE] = vm_mdelete, + [OP_MSIZE] = vm_msize, [OP_NOT_BYTE] = vm_not_byte, [OP_NOT_HWORD] = vm_not_hword, @@ -269,6 +280,9 @@ static const stack_f STACK_ROUTINES[] = { [OP_PLUS_BYTE] = vm_plus_byte, [OP_PLUS_HWORD] = vm_plus_hword, [OP_PLUS_WORD] = vm_plus_word, + [OP_SUB_BYTE] = vm_sub_byte, + [OP_SUB_HWORD] = vm_sub_hword, + [OP_SUB_WORD] = vm_sub_word, [OP_MULT_BYTE] = vm_mult_byte, [OP_MULT_HWORD] = vm_mult_hword, |