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