static NODE * moveargs(NODE *p, int *regp) { NODE *r, **rp; int reg; if (p->n_op == CM) { p->n_left = moveargs(p->n_left, regp); r = p->n_right; rp = &p->n_right; } else { r = p; rp = &p; } reg = *regp; if (reg > R3 && r->n_op != STARG) { *rp = pusharg(r, regp); } else if (r->n_op == STARG) { *rp = movearg_struct(r, regp); } else if (DEUNSIGN(r->n_type) == LONGLONG) { *rp = movearg_64bit(r, regp); } else if (r->n_type == DOUBLE || r->n_type == LDOUBLE) { *rp = movearg_double(r, regp); } else if (r->n_type == FLOAT) { *rp = movearg_float(r, regp); } else { *rp = movearg_32bit(r, regp); } return straighten(p); }
// called by v4pPolygonTransformClone() PolygonP v4pRecPolygonTransformClone(Boolean estSub, PolygonP p, PolygonP c, Coord dx, Coord dy, ILayer dz) { PointP sp, sc; Coord x, y, x2, y2; c->miny = JUMPCOORD; // invalidate computed boundaries c->z = c->z+dz; sp = p->point1; sc = c->point1; while (sp) { x = sp->x; y = sp->y; if ((x & y) != JUMPCOORD) { straighten(x, y, &x2, &y2); x2+= dx; y2+= dy; sc->x = x2; sc->y = y2; } else { sc->x = JUMPCOORD; sc->y = JUMPCOORD; } sp = sp->next; sc = sc->next; } v4pPolygonChanged(c); if (estSub && p->next) v4pRecPolygonTransformClone(true, p->next, c->next, dx, dy, dz); if (p->sub1) v4pRecPolygonTransformClone(true, p->sub1, c->sub1, dx, dy, dz); return c ; }
/* called from moveargs() */ static NODE * movearg_64bit(NODE *p, int *regp) { int reg = *regp; NODE *q, *r; #if ALLONGLONG == 64 /* alignment */ ++reg; reg &= ~1; *regp = reg; #endif if (reg > R3) { q = pusharg(p, regp); } else if (reg == R3) { /* half in and half out of the registers */ r = tcopy(p); if (!features(FEATURE_BIGENDIAN)) { q = block(SCONV, p, NIL, INT, 0, 0); q = movearg_32bit(q, regp); /* little-endian */ r = buildtree(RS, r, bcon(32)); r = block(SCONV, r, NIL, INT, 0, 0); r = pusharg(r, regp); /* little-endian */ } else { q = buildtree(RS, p, bcon(32)); q = block(SCONV, q, NIL, INT, 0, 0); q = movearg_32bit(q, regp); /* big-endian */ r = block(SCONV, r, NIL, INT, 0, 0); r = pusharg(r, regp); /* big-endian */ } q = straighten(block(CM, q, r, p->n_type, p->n_df, p->n_ap)); } else { q = block(REG, NIL, NIL, p->n_type, p->n_df, p->n_ap); regno(q) = R0R1 + (reg - R0); q = buildtree(ASSIGN, q, p); *regp = reg + 2; } return q; }