shithub: mc

Download patch

ref: 16e00fd06c5471c9a6b03372e281665df9f8a37c
parent: 64cab738d5b6c540182c0812eeb4a6046a2908de
author: Ori Bernstein <[email protected]>
date: Tue Jun 5 13:03:47 EDT 2012

Fix struct tests.

--- a/8/isel.c
+++ b/8/isel.c
@@ -220,10 +220,26 @@
         die("Not enough registers. Please split your expression and try again (FIXME: implement spilling)");
     for (i = 0; i < Nmode; i++)
         s->rtaken[reginterferes[l.reg][i]] = 1;
+    printf("Got reg %s\n", regnames[l.reg]);
 
     return l;
 }
 
+void freereg(Isel *s, Reg r)
+{
+    int i;
+    return;
+    printf("Freed reg %s\n", regnames[r]);
+    for (i = 0; i < Nmode; i++)
+        s->rtaken[reginterferes[r][i]] = 0;
+}
+
+void freeloc(Isel *s, Loc l)
+{
+    if (l.type == Locreg)
+        freereg(s, l.reg);
+}
+
 Loc claimreg(Isel *s, Reg r)
 {
     Loc l;
@@ -365,12 +381,13 @@
     b = selexpr(s, y);
     a = inr(s, a);
     g(s, op, &b, &a, NULL);
+    freeloc(s, b);
     return a;
 }
 
 Loc selexpr(Isel *s, Node *n)
 {
-    Loc a, b, c, r;
+    Loc a, b, c, r, t;
     Node **args;
 
     args = n->expr.args;
@@ -429,8 +446,12 @@
             r = b;
             break;
         case Oload: /* mem -> reg */
-            a = selexpr(s, args[0]);
-            b = getreg(s, a.mode);
+            t = selexpr(s, args[0]);
+            b = getreg(s, t.mode);
+            if (t.type == Locreg)
+                locmem(&a, 0, t.reg, Rnone, t.mode);
+            else
+                a = t;
             /* load() doesn't always do the mov */
             g(s, Imov, &a, &b, NULL);
             r = b;
--- a/a.s
+++ /dev/null
@@ -1,25 +1,0 @@
-.globl main
-main:
-	pushl %ebp
-	movl %esp,%ebp
-	subl $12,%esp
-	leal (%esp),%eax
-	addl $0,%eax
-	movl $12,(%eax)
-	leal (%esp),%eax
-	addl $4,%eax
-	movl $30,(%eax)
-	leal (%esp),%eax
-	addl $0,%eax
-	movl %eax,%ecx
-	leal (%esp),%edx
-	addl $4,%edx
-	movl %edx,%ebx
-	addl %ebx,%ecx
-	movl %ecx,8(%esp)
-	jmp .L0
-.L0:
-	movl 8(%esp),%eax
-	movl %ebp,%esp
-	popl %ebp
-	ret