diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2023-10-21 22:57:43 +0100 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2023-10-21 22:57:43 +0100 |
commit | dcedb70a5ccead41574cf857b369d264c87dd7e0 (patch) | |
tree | 45f4f9eb7a5258fc7ee1e25fbe4edaa05f82093f /src/runtime.h | |
parent | 266b4e4572be015dca986b423896ec6fa14b4318 (diff) | |
download | ovm-dcedb70a5ccead41574cf857b369d264c87dd7e0.tar.gz ovm-dcedb70a5ccead41574cf857b369d264c87dd7e0.tar.bz2 ovm-dcedb70a5ccead41574cf857b369d264c87dd7e0.zip |
Switched from floats to halfword
Registers are now just words, with pushing from and moving to
registers with specified subtypes just pushing those types into the
word registers. That means there are 8 word registers which can act
as 16 half word registers, which themselves can act as 64 byte
registers.
Diffstat (limited to 'src/runtime.h')
-rw-r--r-- | src/runtime.h | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/src/runtime.h b/src/runtime.h index f512992..e588541 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -19,17 +19,13 @@ #include "./base.h" #include "./inst.h" -#define VM_BYTE_REGISTERS 8 -#define VM_WORD_REGISTERS 8 -#define VM_FLOAT_REGISTERS 8 +#define VM_REGISTERS 8 typedef struct { struct Registers { word ret; - byte b[VM_BYTE_REGISTERS]; - word w[VM_WORD_REGISTERS]; - f64 f[VM_FLOAT_REGISTERS]; + word reg[VM_REGISTERS]; } registers; struct Stack { @@ -43,6 +39,10 @@ typedef struct } program; } vm_t; +#define VM_REG_BYTE(REG) ((REG)&0b11111111) +#define VM_REG_HWORD(REG) ((REG)&0b11111111111111111111111111111111) +#define VM_REG_WORD(REG) ((REG)) + void vm_execute(vm_t *); void vm_load_stack(vm_t *, byte *, size_t); @@ -56,47 +56,47 @@ void vm_print_program(vm_t *, FILE *); void vm_print_all(vm_t *, FILE *); void vm_push_byte(vm_t *, data_t); +void vm_push_hword(vm_t *, data_t); void vm_push_word(vm_t *, data_t); -void vm_push_float(vm_t *, data_t); typedef void (*push_f)(vm_t *, data_t); static const push_f PUSH_ROUTINES[] = { [OP_PUSH_BYTE] = vm_push_byte, + [OP_PUSH_HWORD] = vm_push_hword, [OP_PUSH_WORD] = vm_push_word, - [OP_PUSH_FLOAT] = vm_push_float, }; -void vm_push_byte_register(vm_t *, word); -void vm_push_word_register(vm_t *, word); -void vm_push_float_register(vm_t *, word); +void vm_push_byte_register(vm_t *, byte); +void vm_push_hword_register(vm_t *, byte); +void vm_push_word_register(vm_t *, byte); -typedef void (*push_reg_f)(vm_t *, word); +typedef void (*push_reg_f)(vm_t *, byte); static const push_reg_f PUSH_REG_ROUTINES[] = { - [OP_PUSH_BYTE_REGISTER] = vm_push_byte_register, - [OP_PUSH_WORD_REGISTER] = vm_push_word_register, - [OP_PUSH_FLOAT_REGISTER] = vm_push_float_register, + [OP_PUSH_REGISTER_BYTE] = vm_push_byte_register, + [OP_PUSH_REGISTER_HWORD] = vm_push_hword_register, + [OP_PUSH_REGISTER_WORD] = vm_push_word_register, }; -data_t vm_mov_byte(vm_t *, word); -data_t vm_mov_word(vm_t *, word); -data_t vm_mov_float(vm_t *, word); +data_t vm_mov_byte(vm_t *, byte); +data_t vm_mov_hword(vm_t *, byte); +data_t vm_mov_word(vm_t *, byte); -typedef data_t (*mov_f)(vm_t *, word); +typedef data_t (*mov_f)(vm_t *, byte); static const mov_f MOV_ROUTINES[] = { [OP_MOV_BYTE] = vm_mov_byte, + [OP_MOV_HWORD] = vm_mov_hword, [OP_MOV_WORD] = vm_mov_word, - [OP_MOV_FLOAT] = vm_mov_float, }; data_t vm_pop_byte(vm_t *); +data_t vm_pop_hword(vm_t *); data_t vm_pop_word(vm_t *); -data_t vm_pop_float(vm_t *); typedef data_t (*pop_f)(vm_t *); static const pop_f POP_ROUTINES[] = { [OP_POP_BYTE] = vm_pop_byte, + [OP_POP_HWORD] = vm_pop_hword, [OP_POP_WORD] = vm_pop_word, - [OP_POP_FLOAT] = vm_pop_float, }; #endif |