shithub: mc

Download patch

ref: 4403e8080fea47d509fa2ca264feff1cccceefbe
parent: b80ef2f54c86f56f150d97802528bcce75ac05fd
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Jul 23 19:16:18 EDT 2012

Fix conditional ifs a bit.

--- a/8/isel.c
+++ b/8/isel.c
@@ -48,41 +48,6 @@
     [Ole] = {Icmp, Ijle, Isetle}
 };
 
-
-static Loc *loc(Isel *s, Node *n)
-{
-    Loc *l;
-    Node *v;
-    size_t stkoff;
-
-    switch (exprop(n)) {
-        case Ovar:
-            if (hthas(s->locs, n)) {
-                stkoff = (size_t)htget(s->locs, n);
-                l = locmem(-stkoff, locphysreg(Rebp), NULL, ModeL);
-            } else if (hthas(s->globls, n)) {
-                l = locstrlbl(htget(s->globls, n));
-            } else {
-                die("%s (id=%ld) not found", namestr(n->expr.args[0]), n->expr.did);
-            }
-            break;
-        case Olit:
-            v = n->expr.args[0];
-            switch (v->lit.littype) {
-                case Lchr:      l = loclit(v->lit.chrval); break;
-                case Lbool:     l = loclit(v->lit.boolval); break;
-                case Lint:      l = loclit(v->lit.intval); break;
-                default:
-                                die("Literal type %s should be blob", litstr(v->lit.littype));
-            }
-            break;
-        default:
-            die("Node %s not leaf in loc()", opstr(exprop(n)));
-            break;
-    }
-    return l;
-}
-
 static Mode mode(Node *n)
 {
     switch (exprtype(n)->type) {
@@ -96,9 +61,10 @@
             }
             break;
     }
-    dump(n, stdout);
-    die("No mode for node");
-    return ModeNone;
+    /* FIXME: huh. what should the mode for, say, structs
+     * be when we have no intention of loading /through/ the
+     * pointer? */
+    return ModeL;
 }
 
 static Loc *coreg(Reg r, Mode m)
@@ -126,6 +92,40 @@
 
     assert(crtab[r][m] != Rnone);
     return locphysreg(crtab[r][m]);
+}
+
+static Loc *loc(Isel *s, Node *n)
+{
+    Loc *l;
+    Node *v;
+    size_t stkoff;
+
+    switch (exprop(n)) {
+        case Ovar:
+            if (hthas(s->locs, n)) {
+                stkoff = (size_t)htget(s->locs, n);
+                l = locmem(-stkoff, locphysreg(Rebp), NULL, mode(n));
+            } else if (hthas(s->globls, n)) {
+                l = locstrlbl(htget(s->globls, n));
+            } else {
+                die("%s (id=%ld) not found", namestr(n->expr.args[0]), n->expr.did);
+            }
+            break;
+        case Olit:
+            v = n->expr.args[0];
+            switch (v->lit.littype) {
+                case Lchr:      l = loclit(v->lit.chrval); break;
+                case Lbool:     l = loclit(v->lit.boolval); break;
+                case Lint:      l = loclit(v->lit.intval); break;
+                default:
+                                die("Literal type %s should be blob", litstr(v->lit.littype));
+            }
+            break;
+        default:
+            die("Node %s not leaf in loc()", opstr(exprop(n)));
+            break;
+    }
+    return l;
 }
 
 static Insn *mkinsnv(AsmOp op, va_list ap)
--- a/8/simp.c
+++ b/8/simp.c
@@ -633,7 +633,7 @@
     a = rval(s, n->expr.args[0], NULL);
     append(s, store(r, a));
     if (exprop(n) == Oland)
-        cjmp(s, a, next, end);
+        cjmp(s, r, next, end);
     else if (exprop(n) == Olor)
         cjmp(s, a, end, next);
     append(s, next);
--- a/test/tests
+++ b/test/tests
@@ -36,7 +36,7 @@
 B nestfn	E	42
 B closure	E	55
 B loop		E	45
-B condif	E	7
+B condif	E	9
 B fib		E	21
 B float		E	1
 B log-and	E	0
--