ref: 4974f11f7c2e917de605d02d5c07ad87c241ff80
dir: /spirvd.c/
#include <u.h>
#include <libc.h>
#include "vm.h"
#include "ops.h"
int debug = 0;
int disassemble = 1;
u32int magic = 0x07230203;
u32int testprog[2048];
Frame stack;
u32int
runinst(u32int *ptr)
{
u32int len, opcode;
void (*func)(Frame*,u32int);
opcode = (*ptr) & 0x0000ffff;
len = ((*ptr) & 0xffff0000) >> 16;
if (oplookup(opcode, &func)) {
func(&stack, len);
// if (func) changes pc, ignore it
if (ptr == stack.pc) {
stack.pc += len;
}
return len;
}
fprint(2, "error: %r\n");
return 0;
}
void
dasm(u32int *ptr)
{
stack.pc = ptr;
stack.next = nil;
while (runinst(stack.pc)) {
;
}
}
void
main(int argc, char **argv)
{
int r = 0;
ARGBEGIN{
case 'd':
debug++;
break;
}ARGEND;
if (argc) {
r = open(argv[0], OREAD);
}
read(r, testprog, 2048);
if (*testprog != magic) {
fprint(2, "bad magic! got: %x\n", *testprog);
return;
}
dasm(testprog+1);
}