compiler

Unnamed Compiled Systems Language Project
git clone http://frotz.net/git/compiler.git
Log | Files | Refs

commit c034c869e4a912a40c969b04d193de50a16b51c8
parent bfc333de1a5fa0062255bbe0e3bb1d348b33aed0
Author: Brian Swetland <swetland@frotz.net>
Date:   Fri, 10 Dec 2021 03:21:43 -0800

compiler2: fix size management in array writes

Diffstat:
MMakefile | 2+-
Msrc/codegen-risc5-simple.c | 15++++++++++++---
2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/Makefile b/Makefile @@ -50,7 +50,7 @@ RISC5EMU_SRC := \ bin/r5e: src/r5e.c src/risc5dis.c $(RISC5EMU_SRC) @mkdir -p bin - $(CC) -o $@ $(CFLAGS) src/r5e.c src/risc5dis.c $(RISC5EMU_SRC) + $(CC) -o $@ $(CFLAGS) -O2 src/r5e.c src/risc5dis.c $(RISC5EMU_SRC) bin/mkinstab: src/mkinstab.c @mkdir -p bin diff --git a/src/codegen-risc5-simple.c b/src/codegen-risc5-simple.c @@ -255,9 +255,12 @@ u32 gen_addr_expr(Ast node) { emit_mem(LDW, r, r, 0); return r; } else if (node->kind == AST_INDEX) { + u32 esz = node->type->size; u32 raddr = gen_addr_expr(node->c0); u32 roff = gen_expr(node->c1); - // MUL BY SIZE + if (esz > 1) { + emit_opi(MUL, roff, roff, esz); + } emit_op(ADD, raddr, raddr, roff); put_reg(roff); return raddr; @@ -289,8 +292,14 @@ u32 gen_assign(Ast lhs, Ast expr) { u32 raddr = gen_addr_expr(lhs); u32 rval = gen_expr(expr); - // WIDTH?! - emit_mem(STW, rval, raddr, 0); + if (lhs->type->size == 4) { + emit_mem(STW, rval, raddr, 0); + } else if (lhs->type->size == 1) { + emit_mem(STB, rval, raddr, 0); + } else { + err_ast = lhs; + error("unexpected size %u store", lhs->type->size); + } put_reg(raddr); return rval; }