nooc

nooc programming language compiler
git clone git://git.nihaljere.xyz/nooc
Log | Files | Refs | LICENSE

commit 0061900f933341976ce447469d0570370bc62f5a
parent 80f83723f1690bf4f9393f3764c6f1f92c6d479b
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Wed, 15 Dec 2021 23:35:12 -0600

only allocate a register when necessary, fix clearreg

Diffstat:
Mmain.c | 8++++++--
Mx64.c | 2+-
2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/main.c b/main.c @@ -452,6 +452,7 @@ genblock(char *buf, struct block *block, bool toplevel) assert(binary->kind == EXPR_BINARY); enum reg reg = getreg(); total += genexpr(buf ? buf + total : NULL, expr->d.cond.cond, reg); + freereg(reg); size_t iflen = genblock(NULL, &expr->d.cond.bif, false) + jmp(NULL, 0); size_t elselen = genblock(NULL, &expr->d.cond.belse, false); switch (binary->d.op) { @@ -475,24 +476,28 @@ genblock(char *buf, struct block *block, bool toplevel) struct decl *decl = &block->decls.data[item->idx]; struct expr *expr = &exprs.data[decl->val]; uint64_t addr; - enum reg reg = getreg(); + enum reg reg; decl->kind = toplevel ? DECL_DATA : DECL_STACK; decl_alloc(block, decl); switch (expr->class) { case C_INT: + reg = getreg(); // FIXME: we can store literals at compile time total += genexpr(buf ? buf + total : NULL, block->decls.data[item->idx].val, reg); total += decl_fromreg(buf ? buf + total : NULL, decl, reg); + freereg(reg); break; // FIXME: we assume that any string is a literal, may break if we add binary operands on strings in the future. case C_STR: + reg = getreg(); if (buf) { addr = data_push(expr->d.v.v.s.data, expr->d.v.v.s.len); } total += mov_r64_imm(buf ? buf + total : NULL, reg, addr); total += decl_fromreg(buf ? buf + total : NULL, decl, reg); + freereg(reg); break; case C_PROC: block->decls.data[item->idx].loc.addr = total + TEXT_OFFSET; @@ -506,7 +511,6 @@ genblock(char *buf, struct block *block, bool toplevel) } decl->declared = true; - freereg(reg); } else if (item->kind == ITEM_ASSGN) { struct expr *expr = &exprs.data[assgns.data[item->idx].val]; struct assgn *assgn = &assgns.data[item->idx]; diff --git a/x64.c b/x64.c @@ -28,7 +28,7 @@ unsigned short used_reg; void clearreg() { - used_reg = RBP | RSP; + used_reg = (1 << RBP) | (1 << RSP); } enum reg