ref: d27c8ba011dde550e4af1c2ccea34810386761a5
parent: 5683fabf488d8e1a8e6beeff31e732cf8dcf590b
author: Ori Bernstein <[email protected]>
date: Sun Jun 17 17:27:16 EDT 2012
Carry through types correctly(?) when reducing. Now, expressions don't have NULL types, which means that we should actually be able to correctly take their mode.
--- a/8/isel.c
+++ b/8/isel.c
@@ -85,7 +85,14 @@
static Mode mode(Node *n)
{
- return ModeL;
+ switch (size(n)) {
+ case 1: return ModeB; break;
+ case 2: return ModeS; break;
+ case 4: return ModeL; break;
+ }
+ dump(n, stdout);
+ die("No mode for node");
+ return ModeNone;
}
static Loc *coreg(Reg r, Mode m)
@@ -494,7 +501,7 @@
break;
case Ostor: /* reg -> mem */
b = selexpr(s, args[1]);
- a = memloc(s, args[0], mode(n));
+ a = memloc(s, args[0], mode(args[0]));
b = inri(s, b);
g(s, Imov, b, a, NULL);
r = b;
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -54,7 +54,81 @@
/* useful constants */
static Node *one;
static Node *ptrsz;
+static Type *tyword;
+Type *base(Type *t)
+{
+ assert(t->nsub == 1);
+ return t->sub[0];
+}
+
+Node *add(Node *a, Node *b)
+{
+ Node *n;
+
+ n = mkexpr(a->line, Oadd, a, b, NULL);
+ n->expr.type = a->expr.type;
+ return n;
+}
+
+Node *sub(Node *a, Node *b)
+{
+ Node *n;
+
+ n = mkexpr(a->line, Osub, a, b, NULL);
+ n->expr.type = a->expr.type;
+ return n;
+}
+
+Node *mul(Node *a, Node *b)
+{
+ Node *n;
+
+ n = mkexpr(a->line, Omul, a, b, NULL);
+ n->expr.type = a->expr.type;
+ return n;
+}
+
+Node *addr(Node *a, Type *bt)
+{
+ Node *n;
+
+ n = mkexpr(a->line, Oaddr, a, NULL);
+ if (!bt)
+ n->expr.type = mktyptr(a->line, a->expr.type);
+ else
+ n->expr.type = mktyptr(a->line, bt);
+ return n;
+}
+
+Node *load(Node *a)
+{
+ Node *n;
+
+ n = mkexpr(a->line, Oload, a, NULL);
+ assert(a->expr.type->type == Typtr);
+ n->expr.type = base(a->expr.type);
+ return n;
+}
+
+Node *store(Node *a, Node *b)
+{
+ Node *n;
+
+ n = mkexpr(a->line, Ostor, a, b, NULL);
+ n->expr.type = b->expr.type;
+ return n;
+}
+
+Node *word(int line, uint v)
+{
+ Node *n;
+ n = mkintlit(line, v);
+ n->expr.type = tyword;
+ return n;
+}
+
+
static size_t did(Node *n)
{
if (n->type == Ndecl) {
@@ -189,6 +263,7 @@
t = mkdecl(e->line, n, e->expr.type);
declarelocal(simp, t);
r = mkexpr(e->line, Ovar, t, NULL);
+ r->expr.type = t->decl.type;
r->expr.did = t->decl.did;
return r;
}
@@ -198,11 +273,6 @@
append(s, mkexpr(lbl->line, Ojmp, lbl, NULL));
}
-static Node *store(Node *dst, Node *src)
-{
- return mkexpr(dst->line, Ostor, dst, src, NULL);
-}
-
static void cjmp(Simp *s, Node *cond, Node *iftrue, Node *iffalse)
{
Node *jmp;
@@ -279,6 +349,7 @@
r = mkexpr(lit->line, Ovar, t, NULL);
t->decl.init = lit;
r->expr.did = t->decl.did;
+ r->expr.type = t->expr.type;
htput(s->globls, t, strdup(lbl));
lappend(&s->blobs, &s->nblobs, t);
return r;
@@ -313,12 +384,15 @@
Node **args;
args = n->expr.args;
- if (n->expr.type->type != Typtr)
- t = mkexpr(n->line, Oaddr, args[0], NULL);
- else
+ if (n->expr.type->type == Typtr) {
t = args[0];
- u = mkintlit(n->line, offsetof(args[0], args[1]));
- r = mkexpr(n->line, Oadd, t, u, NULL);
+ t->expr.type = mktyptr(n->line, exprtype(n));
+ } else {
+ t = addr(args[0], exprtype(n));
+ }
+ u = word(n->line, offsetof(args[0], args[1]));
+ r = add(t, u);
+ r->expr.type = mktyptr(n->line, n->expr.type);
return r;
}
@@ -331,16 +405,17 @@
assert(exprop(n) == Oidx);
args = n->expr.args;
- if (args[0]->expr.type->type == Tyarray)
- t = mkexpr(n->line, Oaddr, args[0], NULL);
+ if (exprtype(args[0])->type == Tyarray)
+ t = addr(args[0], exprtype(n));
else if (args[0]->expr.type->type == Tyslice)
- t = mkexpr(n->line, Oload, mkexpr(n->line, Oaddr, args[0], NULL), NULL);
+ t = load(addr(args[0], mktyptr(n->line, exprtype(n))));
else
die("Can't index type %s\n", tystr(n->expr.type));
+ assert(t->expr.type->type == Typtr);
u = rval(s, args[1]);
sz = size(n);
- v = mkexpr(n->line, Omul, u, mkintlit(n->line, sz), NULL);
- r = mkexpr(n->line, Oadd, t, v, NULL);
+ v = mul(u, word(n->line, sz));
+ r = add(t, v);
return r;
}
@@ -351,26 +426,22 @@
t = rval(s, n);
u = NULL;
- switch (n->expr.type->type) {
- case Typtr: u = n;
- case Tyarray: u = mkexpr(n->line, Oaddr, t, NULL); break;
- case Tyslice: u = mkexpr(n->line, Oslbase, t, NULL); break;
+ switch (exprtype(n)->type) {
+ case Typtr: u = n; break;
+ case Tyarray: u = addr(t, base(exprtype(n))); break;
+ case Tyslice: u = load(addr(t, mktyptr(n->line, base(exprtype(n))))); break;
default: die("Unslicable type %s", tystr(n->expr.type));
}
/* safe: all types we allow here have a sub[0] that we want to grab */
sz = tysize(n->expr.type->sub[0]);
- v = mkexpr(n->line, Omul, off, mkintlit(n->line, sz), NULL);
- return mkexpr(n->line, Oadd, u, v, NULL);
+ v = mul(off, word(n->line, sz));
+ return add(u, v);
}
static Node *slicelen(Simp *s, Node *sl)
{
- Node *base, *memb, *load;
-
- base = mkexpr(sl->line, Oaddr, sl, NULL);
- memb = mkexpr(sl->line, Oadd, base, ptrsz, NULL);
- load = mkexpr(sl->line, Oload, memb, NULL);
- return load;
+ /* *(&sl + 4) */
+ return load(add(addr(sl, tyword), ptrsz));
}
Node *lval(Simp *s, Node *n)
@@ -418,11 +489,11 @@
t = temp(s, n);
/* *(&slice) = (void*)base + off*sz */
base = slicebase(s, n->expr.args[0], n->expr.args[1]);
- len = mkexpr(n->line, Osub, n->expr.args[2], n->expr.args[1], NULL);
- stbase = mkexpr(n->line, Ostor, mkexpr(n->line, Oaddr, t, NULL), base, NULL);
+ len = sub(n->expr.args[2], n->expr.args[1]);
+ stbase = store(addr(t, tyword), base);
/* *(&slice + ptrsz) = len */
- sz = mkexpr(n->line, Oadd, mkexpr(n->line, Oaddr, t, NULL), ptrsz, NULL);
- stlen = mkexpr(n->line, Ostor, sz, len, NULL);
+ sz = add(addr(t, tyword), ptrsz);
+ stlen = store(sz, len);
append(s, stbase);
append(s, stlen);
return t;
@@ -447,8 +518,6 @@
};
- if (!one)
- one = mkintlit(-1, 1);
r = NULL;
args = n->expr.args;
switch (exprop(n)) {
@@ -458,7 +527,7 @@
simplazy(s, n, r);
break;
case Osize:
- r = mkintlit(n->line, size(args[0]));
+ r = word(n->line, size(args[0]));
break;
case Oslice:
r = lowerslice(s, n);
@@ -465,7 +534,7 @@
break;
case Oidx:
t = idxaddr(s, n);
- r = mkexpr(n->line, Oload, t, NULL);
+ r = load(t);
break;
case Omemb:
if (exprtype(args[0])->type == Tyslice) {
@@ -476,7 +545,7 @@
r = exprtype(n)->asize;
} else {
t = membaddr(s, n);
- r = mkexpr(n->line, Oload, t, NULL);
+ r = load(t);
}
break;
@@ -490,7 +559,8 @@
u = rval(s, args[0]);
v = rval(s, args[1]);
v = mkexpr(n->line, fusedmap[exprop(n)], u, v, NULL);
- r = mkexpr(n->line, Ostor, u, v, NULL);
+ v->expr.type = u->expr.type;
+ r = store(u, v);
break;
/* ++expr(x)
@@ -498,14 +568,12 @@
* expr(x) */
case Opreinc:
t = lval(s, args[0]);
- v = mkexpr(n->line, Oadd, one, t, NULL);
- r = mkexpr(n->line, Ostor, t, v, NULL);
+ r = store(t, add(t, one));
lappend(&s->incqueue, &s->nqueue, t);
break;
case Opredec:
t = lval(s, args[0]);
- v = mkexpr(n->line, Osub, one, t, NULL);
- r = mkexpr(n->line, Ostor, t, v, NULL);
+ r = store(t, sub(t, one));
lappend(&s->incqueue, &s->nqueue, t);
break;
@@ -516,14 +584,12 @@
*/
case Opostinc:
r = lval(s, args[0]);
- v = mkexpr(n->line, Oadd, one, r, NULL);
- t = mkexpr(n->line, Ostor, r, v, NULL);
+ t = store(r, add(one, r));
lappend(&s->incqueue, &s->nqueue, t);
break;
case Opostdec:
r = lval(s, args[0]);
- v = mkexpr(n->line, Osub, one, args[0], NULL);
- t = mkexpr(n->line, Ostor, r, v, NULL);
+ t = store(r, sub(one, r));
lappend(&s->incqueue, &s->nqueue, t);
break;
case Olit:
@@ -557,12 +623,12 @@
t = lval(s, args[0]);
u = rval(s, args[1]);
if (size(n) > 4) {
- t = mkexpr(n->line, Oaddr, t, NULL);
- u = mkexpr(n->line, Oaddr, u, NULL);
- v = mkintlit(n->line, size(n));
+ t = addr(t, exprtype(n));
+ u = addr(u, exprtype(n));
+ v = word(n->line, size(n));
r = mkexpr(n->line, Oblit, t, u, v, NULL);
} else {
- r = mkexpr(n->line, Ostor, t, u, NULL);
+ r = store(t, u);
}
break;
default:
@@ -627,12 +693,12 @@
r = n;
break;
case Ndecl:
- /* Should already have happened */
declarelocal(s, n);
if (n->decl.init) {
v = rval(s, n->decl.init);
r = mkexpr(n->line, Ovar, n, NULL);
r->expr.did = n->decl.did;
+ r->expr.type = n->decl.type;
append(s, store(r, v));
}
break;
@@ -772,8 +838,9 @@
FILE *fd;
/* declare useful constants */
- one = mkintlit(-1, 1);
- ptrsz = mkintlit(-1, 4);
+ tyword = mkty(-1, Tyint);
+ one = word(-1, 1);
+ ptrsz = word(-1, 4);
fn = NULL;
nfn = 0;
--- a/parse/type.c
+++ b/parse/type.c
@@ -137,6 +137,7 @@
Type *t;
t = mkty(line, Typtr);
+ t->nsub = 1;
t->sub = xalloc(sizeof(Type*));
t->sub[0] = base;
return t;