shithub: gpufs

ref: 747cddf7870c548043f44adec04b62440e5abd21
dir: /vm.c/

View raw version
#include <u.h>
#include <libc.h>
#include "vm.h"
#include "ops.h"

extern int debug;

Frame *stack = nil;

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
runstack(u32int *ptr)
{
	Frame *n = malloc(sizeof(Frame));
	
	n->next = stack;
	stack = n;
	stack->pc = ptr;
	
	while (runinst(stack->pc)) {
		;
	}
}

void
retstack(void)
{
	Frame *p, *c;
	
	p = stack->next;
	c = stack;
	
	if (!p)
		goto fin;
	
	stack = p;

fin:
	free(c);
}

void
vmrun(u32int *ptr)
{
	stack = nil; // TODO clean stack
	runstack(ptr);
}