commit 0ad63f35a4b576d857e8b2c5c8535ed7bfcd7834
parent 7d28c912594987b5dc380f51b0647252e30a70ad
Author: Brian Swetland <swetland@frotz.net>
Date: Wed, 11 Mar 2020 00:58:30 -0700
compiler: make iParam items use a pure offset
- decouple parse and codegen a bit
- prepare for wide parameters
- add scripts to save test results and compare generated code
between saved and current results (handy for checking "did
this change cause zero effect on codegen?")
Diffstat:
3 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/compiler.c b/src/compiler.c
@@ -1250,7 +1250,7 @@ Object parse_param(String fname, u32 n, Object first, Object last) {
}
String pname = parse_name("parameter name");
Type ptype = parse_type(false);
- Object param = make_param(pname, ptype, 0, n);
+ Object param = make_param(pname, ptype, 0, 4 + n * 4);
Object obj = first;
while (obj != nil) {
@@ -1582,7 +1582,7 @@ void gen_load_reg(Item x, u32 r) {
} else if (x->kind == iConst) {
emit_mov(r, x->a);
} else if (x->kind == iParam) {
- emit_mem(LDW, r, SP, 4 + x->a * 4);
+ emit_mem(LDW, r, SP, x->a);
} else {
error("gen_load failed");
}
@@ -1607,7 +1607,7 @@ void gen_load(Item x) {
void gen_store(Item val, Item var) {
gen_load(val);
if (var->kind == iParam) {
- emit_mem(STW, val->r, SP, 4 + var->a * 4);
+ emit_mem(STW, val->r, SP, var->a);
put_reg(val->r);
} else {
error("gen_store: invalid target");
diff --git a/tools/diff-codegen b/tools/diff-codegen
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+for TEST in out/test/*.lst; do
+ SAVE=out/save/${TEST#"out/test/"}
+ echo CHECK $SAVE $TEST
+ diff $SAVE $TEST
+done
diff --git a/tools/save-tests b/tools/save-tests
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+rm -rf out/save
+mkdir -p out/save
+cp -vr out/test/* out/save/