shithub: mc

Download patch

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);