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];
32 /* printf(" %d/%d:\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\n", */
34 /* stack[0], stack[1], stack[2], stack[3], */
35 /* stack[4], stack[5], stack[6], stack[7]); */
52 case 'I': /* immediate */
53 stack[sp] = bytes_to_int(insns[pc+1], insns[pc+2], insns[pc+3], insns[pc+4]);
58 stack[sp] = stack[sp-1];
61 case 'X': /* exchange */
63 stack[sp-1] = stack[sp-2];
71 stack[sp-1] = stack[sp-1] + stack[sp];
73 case '-': /* subtract */
75 stack[sp-1] = stack[sp-1] - stack[sp];
77 case '*': /* multiply */
79 stack[sp-1] = stack[sp-1] * stack[sp];
82 stack[sp-1] = ~stack[sp-1];
84 case '<': /* less than */
86 stack[sp-1] = stack[sp-1] < stack[sp] ? -1 : 0;
88 case 'J': /* jump if true */
91 pc += (int8_t)insns[pc+1];
97 /* ignore everything else */
103 /* printf(" %d/%d:\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\n", */
105 /* stack[0], stack[1], stack[2], stack[3], */
106 /* stack[4], stack[5], stack[6], stack[7]); */
113 /* BENCHMARK START */
114 /* you don't need to understand that code, the answer is '6' */