3 typedef struct Ftab Ftab;
10 typedef struct Gtab Gtab;
38 case OAS: // put cast on rhs
70 if(!isfunct(n->right))
71 prtree(n, "isfunc !");
74 case OCAST: // t f(T) or T f(t)
79 s = f->castfr[t1->etype];
87 s = f->castto[t->etype];
104 * now we rewrite the node
105 * and give diagnostics
109 diag(n, "isfunct op missing %O\n", o);
112 case OADD: // T f(T, T)
127 case OEQ: // int f(T, T)
144 n->right = new(OLIST, n->left, n->right);
147 case OAS: // structure copies done by the compiler
151 case OASADD: // T f(T*, T)
172 n->right = new(OLIST, new(OADDR, n->left, Z), n->right);
186 l = new(ONAME, Z, Z);
189 l->etype = s->type->etype;
190 l->xoffset = s->offset;
196 n->type = l->type->link;
197 if(tcompat(n, T, l->type, tfunct))
199 if(tcoma(n->left, n->right, l->type->down, 1))
207 diag(n, "cant rewrite typestr for op %O\n", o);
208 prtree(n, "isfunct");
214 dclfunct(Type *t, Sym *s)
218 Type *f1, *f2, *f3, *f4;
224 // recognize generated tag of dorm _%d_
227 for(i=0; c = t->tag->name[i]; i++) {
229 if(i == 0 || t->tag->name[i+1] == 0)
233 if(c < '0' || c > '9')
239 f = alloc(sizeof(*f));
240 for(o=0; o<nelem(f->sym); o++)
246 f1->down = copytyp(t);
249 f2 = typ(TFUNC, types[TINT]);
250 f2->down = copytyp(t);
254 f3->down = typ(TIND, t);
264 snprint(symb, NSYMB, "%s_%s_", t->tag->name, ftabinit[i].name);
265 n = new(ONAME, Z, Z);
268 switch(ftabinit[i].typ) {
270 diag(Z, "dclfunct op missing %d\n", ftabinit[i].typ);
273 case 1: // T f(T,T) +
274 dodecl(xdecl, CEXTERN, f1, n);
277 case 2: // int f(T,T) ==
278 dodecl(xdecl, CEXTERN, f2, n);
281 case 3: // void f(T*,T) +=
282 dodecl(xdecl, CEXTERN, f3, n);
286 dodecl(xdecl, CEXTERN, f4, n);
291 o = gtabinit[i].etype;
296 * OCAST types T1 _T2_T1_(T2)
298 snprint(symb, NSYMB, "_%s%s_", gtabinit[i].name, t->tag->name);
299 n = new(ONAME, Z, Z);
301 f->castto[o] = n->sym;
305 dodecl(xdecl, CEXTERN, f1, n);
307 snprint(symb, NSYMB, "%s_%s_", t->tag->name, gtabinit[i].name);
308 n = new(ONAME, Z, Z);
310 f->castfr[o] = n->sym;
312 f1 = typ(TFUNC, types[o]);
314 dodecl(xdecl, CEXTERN, f1, n);
318 diag(Z, "dclfunct bad %T %s\n", t, s->name);
321 Gtab gtabinit[NTYPE] =
338 Ftab ftabinit[OEND] =
368 OASASHL, "asashl", 3,
369 OASASHR, "asashr", 3,
371 OASLDIV, "asldiv", 3,
372 OASLMOD, "aslmod", 3,
373 OASLMUL, "aslmul", 3,
374 OASLSHR, "aslshr", 3,