ref: 8a41392deeff765bda28b910e1d5d62397fe8d32
parent: c2d507cdfe2d67c5d3bb4cc01cec2f0614421599
author: Ori Bernstein <[email protected]>
date: Wed Aug 1 21:08:49 EDT 2012
Convert array sizes. Since we decided to make 'len' generic, we need to do the right conversions to make it work.
--- a/6/isel.c
+++ b/6/isel.c
@@ -154,7 +154,6 @@
g(s, Imovz, src, dst, NULL);
}
-
static void load(Isel *s, Loc *a, Loc *b)
{
Loc *l;
@@ -584,6 +583,7 @@
break;
case Ozwiden:
a = selexpr(s, args[0]);
+ a = inr(s, a);
b = locreg(mode(n));
movz(s, a, b);
r = b;
@@ -590,6 +590,7 @@
break;
case Oswiden:
a = selexpr(s, args[0]);
+ a = inr(s, a);
b = locreg(mode(n));
g(s, Imovs, a, b, NULL);
r = b;
--- a/6/simp.c
+++ b/6/simp.c
@@ -711,9 +711,8 @@
return t;
}
-static Node *simpcast(Simp *s, Node *n)
+static Node *simpcast(Simp *s, Node *val, Type *to)
{
- Node **args;
Node *sz;
Node *r;
Type *t;
@@ -722,22 +721,21 @@
issigned = 0;
r = NULL;
- args = n->expr.args;
- switch (tybase(exprtype(n))->type) {
+ switch (tybase(to)->type) {
case Tyint8: case Tyint16: case Tyint32: case Tyint64:
case Tyuint8: case Tyuint16: case Tyuint32: case Tyuint64:
case Tyint: case Tyuint: case Tylong: case Tyulong:
case Tychar: case Tybyte:
case Typtr:
- t = tybase(exprtype(args[0]));
+ t = tybase(exprtype(val));
switch (t->type) {
case Tyslice:
if (t->type == Typtr)
- fatal(n->line, "Bad cast from %s to %s",
- tystr(exprtype(args[0])), tystr(exprtype(n)));
- sz = mkintlit(n->line, Ptrsz);
- sz->expr.type = exprtype(args[0]);
- r = slicebase(s, args[0], sz);
+ fatal(val->line, "Bad cast from %s to %s",
+ tystr(exprtype(val)), tystr(to));
+ sz = mkintlit(val->line, Ptrsz);
+ sz->expr.type = exprtype(val);
+ r = slicebase(s, val, sz);
break;
case Tyint8: case Tyint16: case Tyint32: case Tyint64:
case Tyint: case Tylong:
@@ -745,27 +743,27 @@
case Tyuint8: case Tyuint16: case Tyuint32: case Tyuint64:
case Tyuint: case Tyulong: case Tychar: case Tybyte:
case Typtr:
- fromsz = size(args[0]);
- tosz = size(n);
- r = rval(s, args[0], NULL);
+ fromsz = size(val);
+ tosz = tysize(to);
+ r = rval(s, val, NULL);
if (fromsz > tosz) {
- r = mkexpr(n->line, Otrunc, r, NULL);
+ r = mkexpr(val->line, Otrunc, r, NULL);
} else if (tosz > fromsz) {
if (issigned)
- r = mkexpr(n->line, Oswiden, r, NULL);
+ r = mkexpr(val->line, Oswiden, r, NULL);
else
- r = mkexpr(n->line, Ozwiden, r, NULL);
+ r = mkexpr(val->line, Ozwiden, r, NULL);
}
- r->expr.type = n->expr.type;
+ r->expr.type = to;
break;
default:
- fatal(n->line, "Bad cast from %s to %s",
- tystr(exprtype(args[0])), tystr(exprtype(n)));
+ fatal(val->line, "Bad cast from %s to %s",
+ tystr(exprtype(val)), tystr(to));
}
break;
default:
- fatal(n->line, "Bad cast from %s to %s",
- tystr(exprtype(args[0])), tystr(exprtype(n)));
+ fatal(val->line, "Bad cast from %s to %s",
+ tystr(exprtype(val)), tystr(to));
}
return r;
}
@@ -962,10 +960,12 @@
case Omemb:
if (exprtype(args[0])->type == Tyslice) {
assert(!strcmp(namestr(args[1]), "len"));
- r = slicelen(s, args[0]);
+ t = slicelen(s, args[0]);
+ r = simpcast(s, t, exprtype(n));
} else if (exprtype(args[0])->type == Tyarray) {
assert(!strcmp(namestr(args[1]), "len"));
- r = exprtype(args[0])->asize;
+ t = exprtype(args[0])->asize;
+ r = simpcast(s, t, exprtype(n));
} else {
t = membaddr(s, n);
r = load(t);
@@ -978,8 +978,7 @@
r = simptup(s, n, dst);
break;
case Ocast:
- /* slice -> ptr cast */
- r = simpcast(s, n);
+ r = simpcast(s, args[0], exprtype(n));
break;
/* fused ops: