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:
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;
}