static void genspill(Symbol r, Node last, Symbol tmp) { Node p, q; Symbol s; unsigned ty; debug(fprint(stderr, "(spilling %s to local %s)\n", r->x.name, tmp->x.name)); debug(fprint(stderr, "(genspill: ")); debug(dumptree(last)); debug(fprint(stderr, ")\n")); ty = opkind(last->op); NEW0(s, FUNC); s->sclass = REGISTER; s->name = s->x.name = r->x.name; s->x.regnode = r->x.regnode; q = newnode(ADDRL+P + sizeop(IR->ptrmetric.size), NULL, NULL, s); q = newnode(INDIR + ty, q, NULL, NULL); p = newnode(ADDRL+P + sizeop(IR->ptrmetric.size), NULL, NULL, tmp); p = newnode(ASGN + ty, p, q, NULL); p->x.spills = 1; rewrite(p); prune(p, &q); q = last->x.next; linearize(p, q); for (p = last->x.next; p != q; p = p->x.next) { ralloc(p); assert(!p->x.listed || !NeedsReg[opindex(p->op)] || !(*IR->x.rmap)(opkind(p->op))); } }
static int doop(int op, int type, const char *sz, const char *opname) { int count = 0; static int last; if (op == LOAD) return 0; if (last != 0 && last != op) printf("\n"); last = op; if (type == B || type == V) { printf(" %s=%d", opname, op + type); count++; } else { int i, done = 0; const char *s; for (i = 0; sz[i] != '\0' && (s = strchr(list, sz[i])) != NULL; i++) { int n = sizes[s-list]; if ((done&(1<<n)) == 0) { printf(" %s%d=%d", opname, n, op + type + sizeop(n)); count++; } done |= 1<<n; } } printf("\n"); return count; }
static void genreload(Node p, Symbol tmp, int i) { Node q; int ty; debug(fprint(stderr, "(replacing %x with a reload from %s)\n", p->x.kids[i], tmp->x.name)); debug(fprint(stderr, "(genreload: ")); debug(dumptree(p->x.kids[i])); debug(fprint(stderr, ")\n")); ty = opkind(p->x.kids[i]->op); q = newnode(ADDRL+P + sizeop(IR->ptrmetric.size), NULL, NULL, tmp); p->x.kids[i] = newnode(INDIR + ty, q, NULL, NULL); rewrite(p->x.kids[i]); prune(p->x.kids[i], &q); reprune(&p->kids[1], reprune(&p->kids[0], 0, i, p), i, p); prune(p, &q); linearize(p->x.kids[i], p); }