static void prelabel(Node p) { if (p == NULL) return; prelabel(p->kids[0]); prelabel(p->kids[1]); if (NeedsReg[opindex(p->op)]) setreg(p, (*IR->x.rmap)(opkind(p->op))); switch (generic(p->op)) { case ADDRF: case ADDRL: if (p->syms[0]->sclass == REGISTER) p->op = VREG+P; break; case INDIR: if (p->kids[0]->op == VREG+P) setreg(p, p->kids[0]->syms[0]); break; case ASGN: if (p->kids[0]->op == VREG+P) rtarget(p, 1, p->kids[0]->syms[0]); break; case CVI: case CVU: case CVP: if (optype(p->op) != F && opsize(p->op) <= p->syms[0]->u.c.v.i) p->op = LOAD + opkind(p->op); break; } (IR->x.target)(p); }
static void target(Node p) { /* debug({ fprintf(stderr, "target called on %x (%s)\n", p, opname(p->op)); if (p->syms[RX]) fprintf(stderr, " sclass: %d, name: %s\n", p->syms[RX]->sclass, p->syms[RX]->name); if (p->kids[0]) { fprintf(stderr, " %x (%s)\n", p->kids[0], opname(p->kids[0]->op)); if (p->kids[0]->syms[RX]) fprintf(stderr, " sclass: %d, name: %s\n", p->kids[0]->syms[RX]->sclass, p->kids[0]->syms[RX]->name); } if (p->kids[1]) { fprintf(stderr, " %x (%s)\n", p->kids[1], opname(p->kids[1]->op)); if (p->kids[1]->syms[RX]) fprintf(stderr, " sclass: %d, name: %s\n", p->kids[1]->syms[RX]->sclass, p->kids[1]->syms[RX]->name); } }); */ assert(p); switch (specific(p->op)) { case RET + F: case RET + I: case RET + U: case RET + P: rtarget(p, 0, reg[RGA]); break; case CALL + F: case CALL + I: case CALL + U: case CALL + P: setreg(p, reg[RGA]); break; case ARG + F: case ARG + I: case ARG + U: case ARG + P: switch (p->x.argno) { case 0: debug( fprintf(stderr, "target called on ARG with argno = %d, targetting A\n", p->x.argno)); spill(1 << RGA, IREG, p); rtarget(p, 0, reg[RGA]); break; case 1: debug( fprintf(stderr, "target called on ARG with argno = %d, targetting B\n", p->x.argno)); spill(1 << RGB, IREG, p); rtarget(p, 0, reg[RGB]); break; case 2: debug( fprintf(stderr, "target called on ARG with argno = %d, targetting C\n", p->x.argno)); spill(1 << RGC, IREG, p); rtarget(p, 0, reg[RGC]); break; default: debug( fprintf(stderr, "target called on ARG with argno = %d, skipping\n", p->x.argno)); } break; } /* debug({ fprintf(stderr, "target returning on %x (%s)\n", p, opname(p->op)); if (p->syms[RX]) fprintf(stderr, " sclass: %d, name: %s\n", p->syms[RX]->sclass, p->syms[RX]->name); if (p->kids[0]) { fprintf(stderr, " %x (%s)\n", p->kids[0], opname(p->kids[0]->op)); if (p->kids[0]->syms[RX]) fprintf(stderr, " sclass: %d, name: %s\n", p->kids[0]->syms[RX]->sclass, p->kids[0]->syms[RX]->name); } if (p->kids[1]) { fprintf(stderr, " %x (%s)\n", p->kids[1], opname(p->kids[1]->op)); if (p->kids[1]->syms[RX]) fprintf(stderr, " sclass: %d, name: %s\n", p->kids[1]->syms[RX]->sclass, p->kids[1]->syms[RX]->name); } }); */ }