ref: f4d54a5bc70ba219402c1b20a16423bce1704ed9
parent: 3065ee64d255b9eca94efd48269cd291960d6c4e
author: Ori Bernstein <[email protected]>
date: Tue Jun 5 21:07:32 EDT 2012
Add loop generation test.
--- a/8/asm.h
+++ b/8/asm.h
@@ -89,3 +89,4 @@
/* useful functions */
size_t size(Node *n);
+void breakhere();
--- a/8/insns.def
+++ b/8/insns.def
@@ -35,12 +35,12 @@
Insn(Ipop, "\tpop%t %r\n", 0)
/* branch instructions */
-Insn(Isetz, "\tsetz\n", 0)
-Insn(Isetnz, "\tsetnz\n", 0)
-Insn(Isetlt, "\tsetlt\n", 0)
-Insn(Isetle, "\tsetle\n", 0)
-Insn(Isetgt, "\tsetgt\n", 0)
-Insn(Isetge, "\tsetge\n", 0)
+Insn(Isetz, "\tsetz %v\n", 0)
+Insn(Isetnz, "\tsetnz %v\n", 0)
+Insn(Isetlt, "\tsetlt %v\n", 0)
+Insn(Isetle, "\tsetle %v\n", 0)
+Insn(Isetgt, "\tsetgt %v\n", 0)
+Insn(Isetge, "\tsetge %v\n", 0)
/* branch instructions */
Insn(Icall, "\tcall %v\n", 0)
--- a/8/isel.c
+++ b/8/isel.c
@@ -152,7 +152,7 @@
case Ovar:
if (hthas(s->locs, (void*)n->expr.did)) {
stkoff = (size_t)htget(s->locs, (void*)n->expr.did);
- locmem(&l, stkoff, Resp, Rnone, ModeL);
+ locmem(&l, -stkoff, Resp, Rnone, ModeL);
} else if (hthas(s->globls, (void*)n->expr.did)) {
locstrlbl(&l, htget(s->globls, (void*)n->expr.did));
} else {
@@ -269,6 +269,8 @@
n = 0;
i = malloc(sizeof(Insn));
i->op = op;
+ if (op == Isetnz)
+ breakhere();
while ((l = va_arg(ap, Loc*)) != NULL)
i->args[n++] = *l;
i->narg = n;
@@ -429,7 +431,7 @@
Loc gencall(Isel *s, Node *n)
{
- int argsz;
+ int argsz, argoff;
int i;
Loc eax, esp; /* hard-coded registers */
Loc stkbump; /* calculated stack offset */
@@ -451,13 +453,13 @@
g(s, Isub, &stkbump, &esp, NULL);
/* Now, we can evaluate the arguments */
- argsz = 0;
+ argoff = 0;
for (i = 1; i < n->expr.nargs; i++) {
- argsz += size(n->expr.args[i]);
arg = selexpr(s, n->expr.args[i]);
arg = inri(s, arg);
- locmem(&dst, argsz, Resp, Rnone, arg.mode);
+ locmem(&dst, argoff, Resp, Rnone, arg.mode);
stor(s, &arg, &dst);
+ argsz += size(n->expr.args[i]);
}
fn = selexpr(s, n->expr.args[0]);
g(s, Icall, &fn, NULL);
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -452,7 +452,7 @@
{
assert(n->type == Ndecl);
if (debug)
- printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.sym->id, -s->argsz);
+ printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.sym->id, -(s->argsz + 8));
htput(s->locs, (void*)n->decl.sym->id, (void*)-s->argsz);
s->argsz += size(n);
}
--- a/test/build.sh
+++ b/test/build.sh
@@ -16,6 +16,7 @@
build struct
build array
build call
+build loop
build fib
exit 0
--- a/test/fib.myr
+++ b/test/fib.myr
@@ -1,5 +1,5 @@
const fib = {n
- if n == 0
+ if n <= 0
-> 0
elif n == 1
-> 1
@@ -9,6 +9,6 @@
}
const main = {
- -> fib(4)
+ -> fib(2)
}
--- a/test/test.sh
+++ b/test/test.sh
@@ -24,4 +24,5 @@
returns struct 42
returns array 7
returns call 42
+returns loop 45
returns fib 8