aboutsummaryrefslogtreecommitdiff
path: root/bcode.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2023-07-04 23:37:51 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2023-07-04 23:37:51 +0300
commite82c73d2b57e58894d8c93fc720559df6392d58b (patch)
tree3a637c10d0334e21ba3a75fbf5854d0f43efe07e /bcode.c
parent703e37ac56883f9a54b35960fde438c7cfba4592 (diff)
downloadbcgen-e82c73d2b57e58894d8c93fc720559df6392d58b.tar.gz
bcgen-e82c73d2b57e58894d8c93fc720559df6392d58b.zip
add loop example
Diffstat (limited to 'bcode.c')
-rw-r--r--bcode.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/bcode.c b/bcode.c
index b4f4231..1b0cba2 100644
--- a/bcode.c
+++ b/bcode.c
@@ -41,7 +41,7 @@ static void append(struct compile_state *cs, enum bcode_insn label, breg_t imm)
#define IMM s.imm[pc].g
#define DIMM s.imm[pc].f
-#define NEXT_INSN goto *s.op[pc++]
+#define NEXT_INSN goto *s.op[++pc]
#define JUMP(i) goto *s.op[pc = (i)]
static gbreg_t _run(struct compile_state *cs, bool init)
@@ -62,6 +62,7 @@ static gbreg_t _run(struct compile_state *cs, bool init)
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 */
@@ -76,13 +77,33 @@ gbreg_t run(struct compile_state *cs)
void init(struct compile_state *cs)
{
cs->labels = NULL;
- cs->s.imm = NULL;
- cs->s.op = NULL;
- cs->size = 0;
+ 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);
+}
+
+breg_t label(struct compile_state *cs)
+{
+ return (breg_t){.g = cs->pc};
+}
+
+void patch(struct compile_state *cs, breloc_t reloc, breg_t imm)
+{
+ cs->s.imm[reloc] = imm;
+}
+
void destroy(struct compile_state *cs)
{
free(cs->s.op);