shithub: mc

Download patch

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