// n is a multi-value function call. Add t1, t2, .. = n to out // and return the list t1, t2, ... static NodeList* copyret(Node *n, NodeList **out) { Type *t; Node *tmp, *as; NodeList *l1, *l2; Iter tl; if(n->type->etype != TSTRUCT || !n->type->funarg) fatal("copyret %T %d", n->type, n->left->type->outtuple); l1 = nil; l2 = nil; for(t=structfirst(&tl, &n->type); t; t=structnext(&tl)) { tmp = temp(t->type); l1 = list(l1, tmp); l2 = list(l2, tmp); } as = nod(OAS2, N, N); as->list = l1; as->rlist = list1(n); typecheck(&as, Etop); orderstmt(as, out); return l2; }
/* * compute total size of f's in/out arguments. */ int argsize(Type *t) { Iter save; Type *fp; int64 w, x; w = 0; fp = structfirst(&save, getoutarg(t)); while(fp != T) { x = fp->width + fp->type->width; if(x > w) w = x; fp = structnext(&save); } fp = funcfirst(&save, t); while(fp != T) { x = fp->width + fp->type->width; if(x > w) w = x; fp = funcnext(&save); } w = (w+widthptr-1) & ~(widthptr-1); if((int)w != w) fatal("argsize too big"); return w; }
/* * compute total size of f's in/out arguments. */ int argsize(Type *t) { Iter save; Type *fp; int w, x; w = 0; fp = structfirst(&save, getoutarg(t)); while(fp != T) { x = fp->width + fp->type->width; if(x > w) w = x; fp = structnext(&save); } fp = funcfirst(&save, t); while(fp != T) { x = fp->width + fp->type->width; if(x > w) w = x; fp = funcnext(&save); } w = (w+7) & ~7; return w; }
static void setoutvar(void) { Type *t; Node *n; Addr a; Iter save; Bits bit; int z; t = structfirst(&save, getoutarg(curfn->type)); while(t != T) { n = nodarg(t, 1); a = zprog.from; naddr(n, &a, 0); bit = mkvar(R, &a); for(z=0; z<BITS; z++) ovar.b[z] |= bit.b[z]; t = structnext(&save); } //if(bany(&ovar)) //print("ovars = %Q\n", ovar); }