3 #include "interpreter.h"
5 namespace interpreter12
11 unsigned int negative:16;
16 int32_t regs[16] = {0};
17 uint32_t final_cycle_count = 0;
21 register CpuState *state asm("r4");
22 register uint8_t *pc asm("r5");
23 register Flags flags asm("r6");
24 register uint32_t cycle_count asm("r7");
26 register CpuState *state asm("r12");
27 register uint8_t *pc asm("r13");
28 register Flags flags asm("r14");
29 register uint32_t cycle_count asm("rbx");
31 static CpuState *state;
34 static uint32_t cycle_count;
37 extern void (*dispatch_table[])();
42 state->final_cycle_count = cycle_count;
49 uint8_t dest = reg>>4, src = reg & 0xf;
51 int32_t v = state->regs[dest];
52 v += state->regs[src];
54 flags.zero = (v == 0);
55 flags.negative = (v < 0);
56 state->regs[dest] = v;
59 uint8_t opcode = *pc++;
60 dispatch_table[opcode]();
66 uint8_t dest = reg>>4, src = reg & 0xf;
68 int32_t v = state->regs[dest];
69 v -= state->regs[src];
71 flags.zero = (v == 0);
72 flags.negative = (v < 0);
73 state->regs[dest] = v;
76 uint8_t opcode = *pc++;
77 dispatch_table[opcode]();
83 uint8_t dest = reg>>4, src = reg & 0xf;
85 state->regs[dest] = state->regs[src];
88 uint8_t opcode = *pc++;
89 dispatch_table[opcode]();
95 uint8_t dest = reg>>4;
97 int32_t imm = *(int32_t *)pc;
100 state->regs[dest] = imm;
103 uint8_t opcode = *pc++;
104 dispatch_table[opcode]();
113 uint8_t opcode = *pc++;
114 dispatch_table[opcode]();
126 uint8_t opcode = *pc++;
127 dispatch_table[opcode]();
130 void (*dispatch_table[])() =
141 std::pair<int32_t, uint32_t> interpreter_run(uint8_t *program, int32_t param)
143 // Save the previous value of our locked registers.
144 CpuState *save_state = state;
145 uint8_t *save_pc = pc;
146 Flags save_flags = {flags.zero, flags.negative};
147 uint32_t save_cycle_count = cycle_count;
149 CpuState local_state;
150 state = &local_state;
152 state->regs[X0] = param;
154 flags.zero = flags.negative = 0;
156 uint8_t opcode = *pc++;
157 dispatch_table[opcode]();
159 auto ret = std::make_pair(state->regs[X0], state->final_cycle_count);
161 // Restore locked registers. (Note that on 64-bit platforms, this will
162 // corrupt the high 32 bits of flags and cycle_count, so this is really
163 // only safe on 32-bit as it stands.)
166 flags.zero = save_flags.zero;
167 flags.negative = save_flags.negative;
168 cycle_count = save_cycle_count;