ref: 552e5b33111a9bfd408073b8eebaf0bd979199cb
parent: d3b280a74ae0b5b1d6e4eb498d25fbc4767a8694
author: Ori Bernstein <[email protected]>
date: Mon Jul 30 21:02:56 EDT 2012
Don't check node sizes; Check the 'stacktype' property.
--- a/8/asm.h
+++ b/8/asm.h
@@ -195,5 +195,7 @@
/* useful functions */
size_t tysize(Type *t);
size_t size(Node *n);
+int stacktype(Type *t);
+int stacknode(Node *n);
void breakhere();
void dumpasm(Isel *s, FILE *fd);
--- a/8/isel.c
+++ b/8/isel.c
@@ -51,12 +51,6 @@
[Ole] = {Icmp, Ijle, Isetle}
};
-static int stacktype(Type *t)
-{
- /* the types are arranged in types.def such that this is true */
- return t->type >= Tyslice;
-}
-
static Mode mode(Node *n)
{
Type *t;
@@ -388,7 +382,7 @@
argoff = 0;
for (i = 1; i < n->expr.nargs; i++) {
arg = selexpr(s, n->expr.args[i]);
- if (size(n->expr.args[i]) > Ptrsz) {
+ if (stacknode(n->expr.args[i])) {
dst = locreg(ModeQ);
src = locreg(ModeQ);
g(s, Ilea, arg, src, NULL);
--- a/8/simp.c
+++ b/8/simp.c
@@ -209,6 +209,20 @@
return s;
}
+int stacktype(Type *t)
+{
+ /* the types are arranged in types.def such that this is true */
+ return t->type >= Tyslice;
+}
+
+int stacknode(Node *n)
+{
+ if (n->type == Nexpr)
+ return stacktype(n->expr.type);
+ else
+ return stacktype(n->decl.type);
+}
+
size_t tysize(Type *t)
{
size_t sz;
@@ -801,7 +815,7 @@
for (i = 0; i < lhs->expr.nargs; i++) {
lv = lval(s, args[i]);
prv = add(addr(rhs, exprtype(args[i])), disp(rhs->line, off));
- if (size(args[i]) > Ptrsz) {
+ if (stacknode(args[i])) {
sz = disp(lhs->line, size(lv));
plv = addr(lv, exprtype(lv));
stor = mkexpr(lhs->line, Oblit, plv, prv, sz, NULL);
@@ -829,7 +843,7 @@
* so we know our work is done. */
if (u == t) {
r = t;
- } else if (size(lhs) > Ptrsz) {
+ } else if (stacknode(lhs)) {
t = addr(t, exprtype(lhs));
u = addr(u, exprtype(lhs));
v = disp(lhs->line, size(lhs));
@@ -858,7 +872,7 @@
for (i = 0; i < n->expr.nargs; i++) {
val = rval(s, args[i], NULL);
pdst = add(r, disp(n->line, off));
- if (size(args[i]) > Ptrsz) {
+ if (stacknode(args[i])) {
sz = disp(n->line, size(val));
pval = addr(val, exprtype(val));
stor = mkexpr(n->line, Oblit, pdst, pval, sz, NULL);
@@ -903,7 +917,7 @@
elt = rval(s, n->expr.args[1], NULL);
u = addk(u, Ptrsz);
- if (tysize(uc->etype) > Ptrsz) {
+ if (stacktype(uc->etype)) {
elt = addr(elt, uc->etype);
sz = disp(n->line, tysize(uc->utype));
r = mkexpr(n->line, Oblit, u, elt, sz, NULL);
@@ -1154,7 +1168,7 @@
assert(f->type == Nfunc);
ty = f->func.type->sub[0];
- if (ty->type != Tyvoid && tysize(ty) > Ptrsz) {
+ if (stacktype(ty)) {
s->isbigret = 1;
s->ret = gentemp(s, f, mktyptr(f->line, ty), &dcl);
declarearg(s, dcl);