Implemented OP_MALLOC_STACK and OP_SUB in the runtime
This commit is contained in:
11
vm/runtime.c
11
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)
|
||||
|
||||
30
vm/runtime.h
30
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,
|
||||
|
||||
Reference in New Issue
Block a user