Add OP_GET_PC to implement coroutines/yield in stdlib later.

This commit is contained in:
zongor 2025-08-31 10:14:32 -07:00
parent aa16b6b348
commit 744f2d526b
2 changed files with 53 additions and 49 deletions

View File

@ -5,7 +5,8 @@
typedef enum { typedef enum {
OP_HALT, /* halt : terminate execution */ OP_HALT, /* halt : terminate execution */
OP_JMP, /* jump : jump to address src1 unconditionally */ OP_JMP, /* jump : jump to address dest unconditionally */
OP_GET_PC, /* pc : dest = current program counter */
OP_CALL, /* call : creates a new frame */ OP_CALL, /* call : creates a new frame */
OP_RETURN, /* retn : returns from a frame to the parent frame */ OP_RETURN, /* retn : returns from a frame to the parent frame */
OP_LOAD, /* load : dest = &[next memory location] */ OP_LOAD, /* load : dest = &[next memory location] */

View File

@ -1,5 +1,4 @@
#include "vm.h" #include "vm.h"
#include "debug.h"
#include <string.h> #include <string.h>
/* no inline fn in ANSI C :( */ /* no inline fn in ANSI C :( */
@ -221,6 +220,10 @@ bool step_vm(VM *vm) {
vm->pc = vm->frames[vm->fp].registers[dest].u; /* Jump to address */ vm->pc = vm->frames[vm->fp].registers[dest].u; /* Jump to address */
return true; return true;
} }
case OP_GET_PC: {
vm->frames[vm->fp].registers[dest].u = vm->pc;
return true;
}
case OP_JEQ_UINT: { case OP_JEQ_UINT: {
COMPARE_AND_JUMP(uint32_t, u, ==); COMPARE_AND_JUMP(uint32_t, u, ==);
} }