aboutsummaryrefslogtreecommitdiff
path: root/bcode.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2023-07-09 15:43:10 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2023-07-09 15:43:10 +0300
commit7f1f9ec8e75b3627b795ddecd7e391a5ebe95528 (patch)
tree88efbff4d9d64f6589687a59224d245e00975d0d /bcode.c
parent2432cb953afa8ec3063307e3a788d7126b97318b (diff)
downloadbcgen-7f1f9ec8e75b3627b795ddecd7e391a5ebe95528.tar.gz
bcgen-7f1f9ec8e75b3627b795ddecd7e391a5ebe95528.zip
change so that bcode.h and bcode.c are generated
Diffstat (limited to 'bcode.c')
-rw-r--r--bcode.c116
1 files changed, 0 insertions, 116 deletions
diff --git a/bcode.c b/bcode.c
deleted file mode 100644
index 2f67250..0000000
--- a/bcode.c
+++ /dev/null
@@ -1,116 +0,0 @@
-#include <stdlib.h>
-#include <assert.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-
-#include "bcode.h"
-
-#include "gen/head.inc"
-
-enum bcode_insn {
- END,
-#include "gen/enum.inc"
-};
-
-static void append(struct compile_state *cs, enum bcode_insn label, bcval_t imm)
-{
- assert(cs->labels);
-
- if (cs->pc == cs->size) {
- cs->size *= 2;
- /* better memory checks could be a good idea */
- void *p = realloc(cs->s.op, cs->size * sizeof(*cs->s.op));
- assert(p);
-
- p = realloc(cs->s.imm, cs->size * sizeof(*cs->s.imm));
- assert(p);
- }
-
- struct run_state *s = &cs->s;
- s->op[cs->pc] = cs->labels[label];
- s->imm[cs->pc] = imm;
- cs->pc++;
-}
-
-#define RELOC cs->pc
-#define PUSH_OP(label) append(cs, label, (bcval_t){ .r = 0 })
-#define PUSH_IMM_OP(label, imm) append(cs, label, (bcval_t){ .r = imm })
-#define PUSH_DIMM_OP(label, dimm) append(cs, label, (bcval_t){ .d = dimm })
-
-#include "gen/select.inc"
-#include "gen/macro.inc"
-
-#define IMM s.imm[pc].r
-#define SIMM s.imm[pc].s
-#define FIMM s.imm[pc].f
-#define DIMM s.imm[pc].d
-
-#define NEXT_INSN goto *s.op[++pc]
-#define JUMP(i) goto *s.op[pc = (i)]
-
-static ubcval_t _run(struct compile_state *cs, bool init)
-{
- static void *labels[] = {
- [END] = &&end,
-#include "gen/static.inc"
- };
-
- if (init) {
- cs->labels = labels;
- return 0;
- }
-
-#include "gen/regs.inc"
-#include "gen/extra.inc"
-
- const struct run_state s = cs->s;
- size_t pc = 0;
- JUMP(pc);
-
-#include "gen/body.inc"
-
-end: /* we assume there's always at least one general register */
- return r0;
-}
-
-ubcval_t run(struct compile_state *cs)
-{
- return _run(cs, false);
-}
-
-void init(struct compile_state *cs)
-{
- cs->labels = NULL;
- cs->size = 16;
-
- cs->s.imm = malloc(cs->size * sizeof(*cs->s.imm));
- assert(cs->s.imm);
-
- cs->s.op = malloc(cs->size * sizeof(*cs->s.op));
- assert(cs->s.op);
-
- cs->pc = 0;
- _run(cs, true);
-}
-
-void end(struct compile_state *cs)
-{
- PUSH_OP(END);
-}
-
-bcval_t label(struct compile_state *cs)
-{
- return (bcval_t){.r = cs->pc};
-}
-
-void patch(struct compile_state *cs, bcreloc_t reloc, bcval_t imm)
-{
- cs->s.imm[reloc] = imm;
-}
-
-void destroy(struct compile_state *cs)
-{
- free(cs->s.op);
- free(cs->s.imm);
-}