1 /* a ridiculously simplified "virtual machine" */
6 /* convert four int8_t values into a single int32_t value */
7 static int32_t bytes_to_int(int8_t a, int8_t b, int8_t c, int8_t d) {
9 (((int32_t)a & 0xff) << 0)
10 | (((int32_t)b & 0xff) << 8)
11 | (((int32_t)c & 0xff) << 16)
12 | (((int32_t)d & 0xff) << 24);
15 /* the stack of the virtual machine */
18 /* the interpreter for the vm */
19 /* FREESTYLE OPTIMIZATIONS */
20 int vm(const char *insns)
25 while (insns[pc] != '\0')
27 int8_t op = insns[pc];
30 printf("pc: %d op: %c\n", pc, op);
33 /* printf(" %d/%d:\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\n", */
35 /* stack[0], stack[1], stack[2], stack[3], */
36 /* stack[4], stack[5], stack[6], stack[7]); */
53 case 'I': /* immediate */
54 stack[sp] = bytes_to_int(insns[pc+1], insns[pc+2], insns[pc+3], insns[pc+4]);
59 stack[sp] = stack[sp-1];
62 case 'X': /* exchange */
64 stack[sp-1] = stack[sp-2];
72 stack[sp-1] = stack[sp-1] + stack[sp];
74 case '-': /* subtract */
76 stack[sp-1] = stack[sp-1] - stack[sp];
78 case '*': /* multiply */
80 stack[sp-1] = stack[sp-1] * stack[sp];
83 stack[sp-1] = ~stack[sp-1];
85 case '<': /* less than */
87 stack[sp-1] = stack[sp-1] < stack[sp] ? -1 : 0;
89 case 'J': /* jump if true */
92 pc += (int8_t)insns[pc+1];
98 /* ignore everything else */
104 /* printf(" %d/%d:\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\n", */
106 /* stack[0], stack[1], stack[2], stack[3], */
107 /* stack[4], stack[5], stack[6], stack[7]); */
114 /* BENCHMARK START */
115 /* you don't need to understand that code, the answer is '6' */