diff options
Diffstat (limited to 'bcode.c')
| -rw-r--r-- | bcode.c | 62 |
1 files changed, 62 insertions, 0 deletions
@@ -0,0 +1,62 @@ +#include <stdbool.h> +#include "bcode.h" + +enum bcode_insn { + END, +#include "gen/enum.inc" +}; + +static void append(struct compile_state *cs, enum bcode_insn label, breg_t imm) +{ +} + +#define RELOC cs->pc +#define PUSH_OP(label) append(cs, label, (breg_t){ .g = 0 }) +#define PUSH_IMM_OP(label, imm) append(cs, label, (breg_t){ .g = imm }) +#define PUSH_DIMM_OP(label, dimm) append(cs, label, (breg_t){ .f = dimm }) + +#include "gen/select.inc" +#include "gen/macro.inc" + +#define IMM s.imm[pc].g +#define DIMM s.imm[pc].f +#define NEXT_INSN goto *s.op[pc++] +#define JUMP(i) goto *s.op[pc = (i)] + +static void _run(struct compile_state *cs, bool init) +{ + static void *labels[] = { + [END] = &&end, +#include "gen/static.inc" + }; + + if (init) { + cs->labels = labels; + return; + } + +#include "gen/head.inc" +#include "gen/regs.inc" + + const struct run_state s = cs->s; + size_t pc = 0; + JUMP(pc); +#include "gen/body.inc" + +end: + return; +} + +void run(struct compile_state *cs) +{ + _run(cs, false); +} + +void init(struct compile_state *cs) +{ + _run(cs, true); +} + +void destroy(struct compile_state *cs) +{ +} |
