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
--
⑨