#include "c.h"
Include dependency graph for gen.c:

Go to the source code of this file.
Defines | |
| #define | ck(i) return (i) ? 0 : LBURG_MAX |
| #define | readsreg(p) (generic((p)->op)==INDIR && (p)->kids[0]->op==VREG+P) |
| #define | relink(a, b) ((b)->x.prev = (a), (a)->x.next = (b)) |
| #define | setsrc(d) |
Functions | |
| Symbol | askfixedreg (Symbol) |
| Symbol | askreg (Symbol rs, unsigned rmask[]) |
| Symbol | askreg (Symbol, unsigned *) |
| int | askregvar (Symbol p, Symbol regs) |
| void | blkcopy (int dreg, int doff, int sreg, int soff, int size, int tmp[]) |
| void | blkunroll (int, int, int, int, int, int, int[]) |
| void | blockbeg (Env *e) |
| void | blockend (Env *e) |
| void | docall (Node) |
| void | dumpcover (Node, int, int) |
| void | dumpregs (char *, char *, char *) |
| void | dumprule (int) |
| void | dumptree (Node) |
| void | emit (Node p) |
| unsigned | emitasm (Node, int) |
| Node | gen (Node forest) |
| void | genreload (Node, Symbol, int) |
| void | genspill (Symbol, Node, Symbol) |
| Symbol | getreg (Symbol s, unsigned mask[], Node p) |
| Symbol | getreg (Symbol, unsigned *, Node) |
| int | getregnum (Node p) |
| int | getrule (Node, int) |
| void | linearize (Node, Node) |
| int | mayrecalc (Node p) |
| int | mkactual (int align, int size) |
| void | mkauto (Symbol p) |
| Symbol | mkreg (char *fmt, int n, int mask, int set) |
| Symbol | mkwildcard (Symbol *syms) |
| int | move (Node p) |
| int | moveself (Node) |
| int | notarget (Node p) |
| void | parseflags (int argc, char *argv[]) |
| void | prelabel (Node) |
| Node * | prune (Node p, Node pp[]) |
| Node * | prune (Node, Node *) |
| void | putreg (Symbol) |
| void | ralloc (Node) |
| int | range (Node p, int lo, int hi) |
| void | reduce (Node, int) |
| unsigned | regloc (Symbol p) |
| int | reprune (Node *, int, int, Node) |
| int | requate (Node) |
| Node | reuse (Node, int) |
| void | rewrite (Node) |
| void | rtarget (Node p, int n, Symbol r) |
| void | setreg (Node p, Symbol r) |
| void | spill (unsigned mask, int n, Node here) |
| Symbol | spillee (Symbol, unsigned mask[], Node) |
| void | spillr (Symbol, Node) |
| int | uses (Node, Regnode) |
Variables | |
| int | argoffset |
| int | bflag = 0 |
| int | dalign |
| int | dflag = 0 |
| unsigned(* | emitter )(Node, int) = emitasm |
| int | framesize |
| unsigned | freemask [2] |
| Node | head |
| int | maxargoffset |
| int | maxoffset |
| char | NeedsReg [] |
| int | offset |
| int | salign |
| int | swap |
| unsigned | tmask [2] |
| unsigned | usedmask [2] |
| unsigned | vmask [2] |
|
|
Definition at line 251 of file gen.c. Referenced by range(). |
|
|
|
|
|
Definition at line 10 of file gen.c. Referenced by AAS_UpdateEntity(), gen(), and linearize(). |
|
|
Value: ((d) && (d)->x.regnode && \
(d)->x.regnode->set == src->x.regnode->set && \
(d)->x.regnode->mask&src->x.regnode->mask)
Definition at line 6 of file gen.c. Referenced by requate(). |
|
|
Definition at line 533 of file gen.c. References freemask, Regnode::mask, n, r, Xsymbol::regnode, s, Regnode::set, Symbol, usedmask, and symbol::x. Referenced by askreg(). 00533 {
00534 Regnode r = s->x.regnode;
00535 int n = r->set;
00536
00537 if (r->mask&~freemask[n])
00538 return NULL;
00539 else {
00540 freemask[n] &= ~r->mask;
00541 usedmask[n] |= r->mask;
00542 return s;
00543 }
00544 }
|
|
||||||||||||
|
Definition at line 545 of file gen.c. References askfixedreg(), i, Regnode::mask, NULL, r, Xsymbol::regnode, Regnode::set, Symbol, Xsymbol::wildcard, and symbol::x. Referenced by askregvar(), and getreg(). 00545 {
00546 int i;
00547
00548 if (rs->x.wildcard == NULL)
00549 return askfixedreg(rs);
00550 for (i = 31; i >= 0; i--) {
00551 Symbol r = rs->x.wildcard[i];
00552 if (r != NULL
00553 && !(r->x.regnode->mask&~rmask[r->x.regnode->set])
00554 && askfixedreg(r))
00555 return r;
00556 }
00557 return NULL;
00558 }
|
Here is the call graph for this function:

|
||||||||||||
|
|
|
||||||||||||
|
Definition at line 572 of file gen.c. References askreg(), assert, debug, dumpregs(), isscalar, symbol::name, Xsymbol::name, p, r, Xsymbol::regnode, symbol::sclass, Symbol, symbol::temporary, symbol::type, Regnode::vbl, vmask, and symbol::x. 00572 {
00573 Symbol r;
00574
00575 assert(p);
00576 if (p->sclass != REGISTER)
00577 return 0;
00578 else if (!isscalar(p->type)) {
00579 p->sclass = AUTO;
00580 return 0;
00581 }
00582 else if (p->temporary) {
00583 p->x.name = "?";
00584 return 1;
00585 }
00586 else if ((r = askreg(regs, vmask)) != NULL) {
00587 p->x.regnode = r->x.regnode;
00588 p->x.regnode->vbl = p;
00589 p->x.name = r->x.name;
00590 debug(dumpregs("(allocating %s to symbol %s)\n", p->x.name, p->name));
00591 return 1;
00592 }
00593 else {
00594 p->sclass = AUTO;
00595 return 0;
00596 }
00597 }
|
Here is the call graph for this function:

|
||||||||||||||||||||||||||||
|
Definition at line 129 of file gen.c. References assert, Xinterface::blkloop, blkunroll(), IR, and interface::x. 00129 {
00130 assert(size >= 0);
00131 if (size == 0)
00132 return;
00133 else if (size <= 2)
00134 blkunroll(size, dreg, doff, sreg, soff, size, tmp);
00135 else if (size == 3) {
00136 blkunroll(2, dreg, doff, sreg, soff, 2, tmp);
00137 blkunroll(1, dreg, doff+2, sreg, soff+2, 1, tmp);
00138 }
00139 else if (size <= 16) {
00140 blkunroll(4, dreg, doff, sreg, soff, size&~3, tmp);
00141 blkcopy(dreg, doff+(size&~3),
00142 sreg, soff+(size&~3), size&3, tmp);
00143 }
00144 else
00145 (*IR->x.blkloop)(dreg, doff, sreg, soff, size, tmp);
00146 }
|
Here is the call graph for this function:

|
||||||||||||||||||||||||||||||||
|
Definition at line 147 of file gen.c. References assert, Xinterface::blkfetch, Xinterface::blkstore, i, IR, k, Xinterface::max_unaligned_load, salign, and interface::x. Referenced by blkcopy(). 00147 {
00148 int i;
00149
00150 assert(IR->x.max_unaligned_load);
00151 if (k > IR->x.max_unaligned_load
00152 && (k > salign || k > dalign))
00153 k = IR->x.max_unaligned_load;
00154 for (i = 0; i+k < size; i += 2*k) {
00155 (*IR->x.blkfetch)(k, soff+i, sreg, tmp[0]);
00156 (*IR->x.blkfetch)(k, soff+i+k, sreg, tmp[1]);
00157 (*IR->x.blkstore)(k, doff+i, dreg, tmp[0]);
00158 (*IR->x.blkstore)(k, doff+i+k, dreg, tmp[1]);
00159 }
00160 if (i < size) {
00161 (*IR->x.blkfetch)(k, i+soff, sreg, tmp[0]);
00162 (*IR->x.blkstore)(k, i+doff, dreg, tmp[0]);
00163 }
00164 }
|
|
|
Definition at line 104 of file gen.c. References e, freemask, Env::freemask, and Env::offset. Referenced by asdl_init(). 00104 {
00105 e->offset = offset;
00106 e->freemask[IREG] = freemask[IREG];
00107 e->freemask[FREG] = freemask[FREG];
00108 }
|
|
|
Definition at line 109 of file gen.c. References e, Env::freemask, freemask, maxoffset, Env::offset, and offset. Referenced by asdl_init(). 00109 {
00110 if (offset > maxoffset)
00111 maxoffset = offset;
00112 offset = e->offset;
00113 freemask[IREG] = e->freemask[IREG];
00114 freemask[FREG] = e->freemask[FREG];
00115 }
|
|
|
Definition at line 122 of file gen.c. References argoffset, intconst(), maxargoffset, Node, p, and node::syms. Referenced by gen(). 00122 {
00123 p->syms[1] = p->syms[0];
00124 p->syms[0] = intconst(argoffset);
00125 if (argoffset > maxargoffset)
00126 maxargoffset = argoffset;
00127 argoffset = 0;
00128 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 307 of file gen.c. References Xinterface::_kids, Xinterface::_nts, dumprule(), fprint(), getrule(), i, in, IR, Node, p, reuse(), stderr, and interface::x. Referenced by rewrite(). 00307 {
00308 int rulenum, i;
00309 short *nts;
00310 Node kids[10];
00311
00312 p = reuse(p, nt);
00313 rulenum = getrule(p, nt);
00314 nts = IR->x._nts[rulenum];
00315 fprint(stderr, "dumpcover(%x) = ", p);
00316 for (i = 0; i < in; i++)
00317 fprint(stderr, " ");
00318 dumprule(rulenum);
00319 (*IR->x._kids)(p, rulenum, kids);
00320 for (i = 0; nts[i]; i++)
00321 dumpcover(kids[i], nts[i], in+1);
00322 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 814 of file gen.c. References a, b, fprint(), freemask, and stderr. Referenced by askregvar(), putreg(), and ralloc(). 00814 {
00815 fprint(stderr, msg, a, b);
00816 fprint(stderr, "(free[0]=%x)\n", freemask[0]);
00817 fprint(stderr, "(free[1]=%x)\n", freemask[1]);
00818 }
|
Here is the call graph for this function:

|
|
Definition at line 324 of file gen.c. References Xinterface::_isinstruction, Xinterface::_string, Xinterface::_templates, assert, fprint(), IR, stderr, and interface::x. Referenced by dumpcover(). 00324 {
00325 assert(rulenum);
00326 fprint(stderr, "%s / %s", IR->x._string[rulenum],
00327 IR->x._templates[rulenum]);
00328 if (!IR->x._isinstruction[rulenum])
00329 fprint(stderr, "\n");
00330 }
|
Here is the call graph for this function:

|
|
Definition at line 265 of file gen.c. References ADD, ADDRF, ADDRG, ADDRL, ARG, ASGN, assert, BAND, BCOM, BOR, BXOR, CALL, CNST, CVF, CVI, CVP, CVU, DIV, EQ, fprint(), GE, generic, GT, INDIR, JUMP, node::kids, LABEL, LE, LSH, LT, MOD, MUL, symbol::name, NE, NEG, Node, node::op, opname(), optype, P, p, RET, RSH, stderr, SUB, node::syms, and VREG. Referenced by dumptree(), genreload(), genspill(), and rewrite(). 00265 {
00266 if (p->op == VREG+P && p->syms[0]) {
00267 fprint(stderr, "VREGP(%s)", p->syms[0]->name);
00268 return;
00269 } else if (generic(p->op) == LOAD) {
00270 fprint(stderr, "LOAD(");
00271 dumptree(p->kids[0]);
00272 fprint(stderr, ")");
00273 return;
00274 }
00275 fprint(stderr, "%s(", opname(p->op));
00276 switch (generic(p->op)) {
00277 case CNST: case LABEL:
00278 case ADDRG: case ADDRF: case ADDRL:
00279 if (p->syms[0])
00280 fprint(stderr, "%s", p->syms[0]->name);
00281 break;
00282 case RET:
00283 if (p->kids[0])
00284 dumptree(p->kids[0]);
00285 break;
00286 case CVF: case CVI: case CVP: case CVU: case JUMP:
00287 case ARG: case BCOM: case NEG: case INDIR:
00288 dumptree(p->kids[0]);
00289 break;
00290 case CALL:
00291 if (optype(p->op) != B) {
00292 dumptree(p->kids[0]);
00293 break;
00294 }
00295 /* else fall thru */
00296 case EQ: case NE: case GT: case GE: case LE: case LT:
00297 case ASGN: case BOR: case BAND: case BXOR: case RSH: case LSH:
00298 case ADD: case SUB: case DIV: case MUL: case MOD:
00299 dumptree(p->kids[0]);
00300 fprint(stderr, ", ");
00301 dumptree(p->kids[1]);
00302 break;
00303 default: assert(0);
00304 }
00305 fprint(stderr, ")");
00306 }
|
Here is the call graph for this function:

|
|
Definition at line 368 of file gen.c. References assert, Xnode::equatable, Xnode::inst, moveself(), Xnode::next, Node, p, Xnode::registered, requate(), and node::x. Referenced by asdl_init(). 00368 {
00369 for (; p; p = p->x.next) {
00370 assert(p->x.registered);
00371 if (p->x.equatable && requate(p) || moveself(p))
00372 ;
00373 else
00374 (*emitter)(p, p->x.inst);
00375 p->x.emitted = 1;
00376 }
00377 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 331 of file gen.c. References Xinterface::_isinstruction, Xinterface::_kids, Xinterface::_nts, Xinterface::_templates, assert, Xinterface::emit2, Xnode::emitted, fputs(), framesize, getrule(), IR, Xnode::kids, node::kids, Xsymbol::name, NELEMS, Node, p, print(), putchar, reuse(), RX, stdout, node::syms, symbol::x, node::x, and interface::x. 00331 {
00332 int rulenum;
00333 short *nts;
00334 char *fmt;
00335 Node kids[10];
00336
00337 p = reuse(p, nt);
00338 rulenum = getrule(p, nt);
00339 nts = IR->x._nts[rulenum];
00340 fmt = IR->x._templates[rulenum];
00341 assert(fmt);
00342 if (IR->x._isinstruction[rulenum] && p->x.emitted)
00343 print("%s", p->syms[RX]->x.name);
00344 else if (*fmt == '#')
00345 (*IR->x.emit2)(p);
00346 else {
00347 if (*fmt == '?') {
00348 fmt++;
00349 assert(p->kids[0]);
00350 if (p->syms[RX] == p->x.kids[0]->syms[RX])
00351 while (*fmt++ != '\n')
00352 ;
00353 }
00354 for ((*IR->x._kids)(p, rulenum, kids); *fmt; fmt++)
00355 if (*fmt != '%')
00356 (void)putchar(*fmt);
00357 else if (*++fmt == 'F')
00358 print("%d", framesize);
00359 else if (*fmt >= '0' && *fmt <= '9')
00360 emitasm(kids[*fmt - '0'], nts[*fmt - '0']);
00361 else if (*fmt >= 'a' && *fmt < 'a' + NELEMS(p->syms))
00362 fputs(p->syms[*fmt - 'a']->x.name, stdout);
00363 else
00364 (void)putchar(*fmt);
00365 }
00366 return 0;
00367 }
|
Here is the call graph for this function:

|
|
Definition at line 479 of file gen.c. References ASGN, assert, CALL, Xinterface::doarg, docall(), generic, head, i, IR, Xnode::kids, Xsymbol::lastuse, linearize(), node::link, Xnode::listed, LOAD, NeedsReg, NELEMS, Xnode::next, Node, opindex, opkind, p, Xnode::prev, Xnode::prevuse, prune(), putreg(), ralloc(), relink, rewrite(), Xinterface::rmap, RX, node::syms, symbol::x, node::x, and interface::x. Referenced by asdl_init(). 00479 {
00480 int i;
00481 struct node sentinel;
00482 Node dummy, p;
00483
00484 head = forest;
00485 for (p = forest; p; p = p->link) {
00486 assert(p->count == 0);
00487 if (generic(p->op) == CALL)
00488 docall(p);
00489 else if ( generic(p->op) == ASGN
00490 && generic(p->kids[1]->op) == CALL)
00491 docall(p->kids[1]);
00492 else if (generic(p->op) == ARG)
00493 (*IR->x.doarg)(p);
00494 rewrite(p);
00495 p->x.listed = 1;
00496 }
00497 for (p = forest; p; p = p->link)
00498 prune(p, &dummy);
00499 relink(&sentinel, &sentinel);
00500 for (p = forest; p; p = p->link)
00501 linearize(p, &sentinel);
00502 forest = sentinel.x.next;
00503 assert(forest);
00504 sentinel.x.next->x.prev = NULL;
00505 sentinel.x.prev->x.next = NULL;
00506 for (p = forest; p; p = p->x.next)
00507 for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) {
00508 assert(p->x.kids[i]->syms[RX]);
00509 if (p->x.kids[i]->syms[RX]->temporary) {
00510 p->x.kids[i]->x.prevuse =
00511 p->x.kids[i]->syms[RX]->x.lastuse;
00512 p->x.kids[i]->syms[RX]->x.lastuse = p->x.kids[i];
00513 }
00514 }
00515 for (p = forest; p; p = p->x.next) {
00516 ralloc(p);
00517 if (p->x.listed && NeedsReg[opindex(p->op)]
00518 && (*IR->x.rmap)(opkind(p->op))) {
00519 assert(generic(p->op) == CALL || generic(p->op) == LOAD);
00520 putreg(p->syms[RX]);
00521 }
00522 }
00523 return forest;
00524 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 755 of file gen.c. References ADDRL, debug, dumptree(), fprint(), i, INDIR, IR, node::kids, Xnode::kids, linearize(), Xsymbol::name, newnode(), Node, NULL, node::op, opkind, P, p, prune(), interface::ptrmetric, q, reprune(), rewrite(), metrics::size, sizeop, stderr, Symbol, symbol::x, and node::x. Referenced by spillr(). 00755 {
00756 Node q;
00757 int ty;
00758
00759 debug(fprint(stderr, "(replacing %x with a reload from %s)\n", p->x.kids[i], tmp->x.name));
00760 debug(fprint(stderr, "(genreload: "));
00761 debug(dumptree(p->x.kids[i]));
00762 debug(fprint(stderr, ")\n"));
00763 ty = opkind(p->x.kids[i]->op);
00764 q = newnode(ADDRL+P + sizeop(IR->ptrmetric.size), NULL, NULL, tmp);
00765 p->x.kids[i] = newnode(INDIR + ty, q, NULL, NULL);
00766 rewrite(p->x.kids[i]);
00767 prune(p->x.kids[i], &q);
00768 reprune(&p->kids[1], reprune(&p->kids[0], 0, i, p), i, p);
00769 prune(p, &q);
00770 linearize(p->x.kids[i], p);
00771 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 726 of file gen.c. References ADDRL, ASGN, assert, debug, dumptree(), fprint(), FUNC, INDIR, IR, linearize(), Xnode::listed, symbol::name, Xsymbol::name, NeedsReg, NEW0, newnode(), Xnode::next, Node, NULL, node::op, opindex, opkind, p, P, prune(), interface::ptrmetric, q, r, ralloc(), Xsymbol::regnode, rewrite(), Xinterface::rmap, s, symbol::sclass, metrics::size, sizeop, Xnode::spills, stderr, Symbol, interface::x, node::x, and symbol::x. Referenced by spillr(). 00726 {
00727 Node p, q;
00728 Symbol s;
00729 unsigned ty;
00730
00731 debug(fprint(stderr, "(spilling %s to local %s)\n", r->x.name, tmp->x.name));
00732 debug(fprint(stderr, "(genspill: "));
00733 debug(dumptree(last));
00734 debug(fprint(stderr, ")\n"));
00735 ty = opkind(last->op);
00736 NEW0(s, FUNC);
00737 s->sclass = REGISTER;
00738 s->name = s->x.name = r->x.name;
00739 s->x.regnode = r->x.regnode;
00740 q = newnode(ADDRL+P + sizeop(IR->ptrmetric.size), NULL, NULL, s);
00741 q = newnode(INDIR + ty, q, NULL, NULL);
00742 p = newnode(ADDRL+P + sizeop(IR->ptrmetric.size), NULL, NULL, tmp);
00743 p = newnode(ASGN + ty, p, q, NULL);
00744 p->x.spills = 1;
00745 rewrite(p);
00746 prune(p, &q);
00747 q = last->x.next;
00748 linearize(p, q);
00749 for (p = last->x.next; p != q; p = p->x.next) {
00750 ralloc(p);
00751 assert(!p->x.listed || !NeedsReg[opindex(p->op)] || !(*IR->x.rmap)(opkind(p->op)));
00752 }
00753 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 560 of file gen.c. References askreg(), assert, Regnode::mask, mask, Node, p, r, Xsymbol::regnode, s, Regnode::set, spill(), spillee(), Symbol, Regnode::vbl, and symbol::x. Referenced by ralloc(). 00560 {
00561 Symbol r = askreg(s, mask);
00562 if (r == NULL) {
00563 r = spillee(s, mask, p);
00564 assert(r && r->x.regnode);
00565 spill(r->x.regnode->mask, r->x.regnode->set, p);
00566 r = askreg(s, mask);
00567 }
00568 assert(r && r->x.regnode);
00569 r->x.regnode->vbl = NULL;
00570 return r;
00571 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
|
|
|
Definition at line 820 of file gen.c. References assert, Node, Regnode::number, p, Xsymbol::regnode, RX, node::syms, and symbol::x. 00820 {
00821 assert(p && p->syms[RX] && p->syms[RX]->x.regnode);
00822 return p->syms[RX]->x.regnode->number;
00823 }
|
|
||||||||||||
|
Definition at line 174 of file gen.c. References Xinterface::_rule, assert, fprint(), IR, Node, node::op, opname(), p, src, Xnode::state, stderr, node::x, and interface::x. Referenced by dumpcover(), emitasm(), ralloc(), and reduce(). 00174 {
00175 int rulenum;
00176
00177 assert(p);
00178 rulenum = (*IR->x._rule)(p->x.state, nt);
00179 if (!rulenum) {
00180 fprint(stderr, "(%x->op=%s at %w is corrupt.)\n", p, opname(p->op), &src);
00181 assert(0);
00182 }
00183 return rulenum;
00184 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 598 of file gen.c. References debug, fprint(), i, Xnode::kids, NELEMS, next, Node, p, Xnode::prev, relink, stderr, and node::x. Referenced by gen(), genreload(), and genspill(). 00598 {
00599 int i;
00600
00601 for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++)
00602 linearize(p->x.kids[i], next);
00603 relink(next->x.prev, p);
00604 relink(p, next);
00605 debug(fprint(stderr, "(listing %x)\n", p));
00606 }
|
Here is the call graph for this function:

|
|
Definition at line 219 of file gen.c. References ADDRF, ADDRG, assert, CNST, symbol::cse, generic, Xnode::mayrecalc, Node, node::op, op, p, RX, node::syms, symbol::t, symbol::u, and node::x. 00219 {
00220 int op;
00221
00222 assert(p && p->syms[RX]);
00223 if (p->syms[RX]->u.t.cse == NULL)
00224 return 0;
00225 op = generic(p->syms[RX]->u.t.cse->op);
00226 if (op == CNST || op == ADDRF || op == ADDRG || op == ADDRL) {
00227 p->x.mayrecalc = 1;
00228 return 1;
00229 } else
00230 return 0;
00231 }
|
|
||||||||||||
|
Definition at line 116 of file gen.c. References argoffset, n, and roundup. 00116 {
00117 int n = roundup(argoffset, align);
00118
00119 argoffset = n + size;
00120 return n;
00121 }
|
|
|
Definition at line 98 of file gen.c. References type::align, assert, Xsymbol::name, Xsymbol::offset, offset, p, roundup, symbol::sclass, type::size, stringd(), Symbol, symbol::type, and symbol::x. 00098 {
00099 assert(p->sclass == AUTO);
00100 offset = roundup(offset + p->type->size, p->type->align);
00101 p->x.offset = -offset;
00102 p->x.name = stringd(-offset);
00103 }
|
Here is the call graph for this function:

|
||||||||||||||||||||
|
Definition at line 79 of file gen.c. References mask, Regnode::mask, n, Xsymbol::name, symbol::name, NEW0, Regnode::number, p, PERM, Xsymbol::regnode, Regnode::set, stringf(), Symbol, and symbol::x. 00079 {
00080 Symbol p;
00081
00082 NEW0(p, PERM);
00083 p->name = p->x.name = stringf(fmt, n);
00084 NEW0(p->x.regnode, PERM);
00085 p->x.regnode->number = n;
00086 p->x.regnode->mask = mask<<n;
00087 p->x.regnode->set = set;
00088 return p;
00089 }
|
Here is the call graph for this function:

|
|
Definition at line 90 of file gen.c. References Xsymbol::name, symbol::name, NEW0, p, PERM, Symbol, Xsymbol::wildcard, and symbol::x. 00090 {
00091 Symbol p;
00092
00093 NEW0(p, PERM);
00094 p->name = p->x.name = "wildcard";
00095 p->x.wildcard = syms;
00096 return p;
00097 }
|
|
|
|
Definition at line 378 of file gen.c. References Xnode::copy, Xnode::kids, Xsymbol::name, Node, p, node::syms, symbol::x, and node::x. Referenced by emit(), and requate(). 00378 {
00379 return p->x.copy
00380 && p->syms[RX]->x.name == p->x.kids[0]->syms[RX]->x.name;
00381 }
|
|
|
Definition at line 525 of file gen.c. References Node, p, node::syms, Xsymbol::wildcard, and symbol::x.
|
|
||||||||||||
|
Definition at line 165 of file gen.c. References argv, bflag, dflag, i, and strcmp(). 00165 {
00166 int i;
00167
00168 for (i = 0; i < argc; i++)
00169 if (strcmp(argv[i], "-d") == 0)
00170 dflag = 1;
00171 else if (strcmp(argv[i], "-b") == 0) /* omit */
00172 bflag = 1; /* omit */
00173 }
|
Here is the call graph for this function:

|
|
Definition at line 421 of file gen.c. References ADDRF, ADDRL, ASGN, symbol::c, CVI, CVP, CVU, F, generic, value::i, INDIR, IR, node::kids, LOAD, NeedsReg, Node, node::op, opindex, opkind, opsize, optype, p, Xinterface::rmap, rtarget(), symbol::sclass, setreg(), node::syms, Xinterface::target, symbol::u, symbol::v, VREG, and interface::x. Referenced by rewrite(). 00421 {
00422 if (p == NULL)
00423 return;
00424 prelabel(p->kids[0]);
00425 prelabel(p->kids[1]);
00426 if (NeedsReg[opindex(p->op)])
00427 setreg(p, (*IR->x.rmap)(opkind(p->op)));
00428 switch (generic(p->op)) {
00429 case ADDRF: case ADDRL:
00430 if (p->syms[0]->sclass == REGISTER)
00431 p->op = VREG+P;
00432 break;
00433 case INDIR:
00434 if (p->kids[0]->op == VREG+P)
00435 setreg(p, p->kids[0]->syms[0]);
00436 break;
00437 case ASGN:
00438 if (p->kids[0]->op == VREG+P)
00439 rtarget(p, 1, p->kids[0]->syms[0]);
00440 break;
00441 case CVI: case CVU: case CVP:
00442 if (optype(p->op) != F
00443 && opsize(p->op) <= p->syms[0]->u.c.v.i)
00444 p->op = LOAD + opkind(p->op);
00445 break;
00446 }
00447 (IR->x.target)(p);
00448 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 232 of file gen.c. References debug, fprint(), Xnode::inst, node::kids, Xnode::kids, symbol::name, Node, p, prune(), RX, stderr, node::syms, symbol::temporary, Xsymbol::usecount, symbol::x, and node::x. Referenced by gen(), gencode(), genreload(), and genspill(). 00232 {
00233 if (p == NULL)
00234 return pp;
00235 p->x.kids[0] = p->x.kids[1] = p->x.kids[2] = NULL;
00236 if (p->x.inst == 0)
00237 return prune(p->kids[1], prune(p->kids[0], pp));
00238 else if (p->syms[RX] && p->syms[RX]->temporary
00239 && p->syms[RX]->x.usecount < 2) {
00240 p->x.inst = 0;
00241 debug(fprint(stderr, "(clobbering %s)\n", p->syms[RX]->name));
00242 return prune(p->kids[1], prune(p->kids[0], pp));
00243 }
00244 else {
00245 prune(p->kids[1], prune(p->kids[0], &p->x.kids[0]));
00246 *pp = p;
00247 return pp + 1;
00248 }
00249 }
|
Here is the call graph for this function:

|
||||||||||||
|
Referenced by prune(). |
|
|
Definition at line 528 of file gen.c. References assert, debug, dumpregs(), freemask, Regnode::mask, Xsymbol::name, NULL, r, Xsymbol::regnode, Regnode::set, Symbol, and symbol::x. Referenced by gen(), ralloc(), and spillr(). 00528 {
00529 assert(r && r->x.regnode);
00530 freemask[r->x.regnode->set] |= r->x.regnode->mask;
00531 debug(dumpregs("(freeing %s)\n", r->x.name, NULL));
00532 }
|
Here is the call graph for this function:

|
|
Definition at line 607 of file gen.c. References Xinterface::_templates, assert, Xinterface::clobber, Xnode::copy, symbol::cse, debug, dumpregs(), Xnode::equatable, fprint(), getreg(), getrule(), i, Xnode::inst, IR, Xnode::kids, Xsymbol::lastuse, Regnode::mask, mask, Xsymbol::name, NeedsReg, NELEMS, Node, node::op, opindex, opkind, p, Xnode::prevuse, putreg(), q, r, Xnode::registered, Xsymbol::regnode, Xinterface::rmap, symbol::sclass, stderr, Symbol, node::syms, symbol::t, symbol::temporary, tmask, symbol::u, Xsymbol::wildcard, interface::x, symbol::x, and node::x. Referenced by gen(), and genspill(). 00607 {
00608 int i;
00609 unsigned mask[2];
00610
00611 mask[0] = tmask[0];
00612 mask[1] = tmask[1];
00613 assert(p);
00614 debug(fprint(stderr, "(rallocing %x)\n", p));
00615 for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) {
00616 Node kid = p->x.kids[i];
00617 Symbol r = kid->syms[RX];
00618 assert(r && kid->x.registered);
00619 if (r->sclass != REGISTER && r->x.lastuse == kid)
00620 putreg(r);
00621 }
00622 if (!p->x.registered && NeedsReg[opindex(p->op)]
00623 && (*IR->x.rmap)(opkind(p->op))) {
00624 Symbol sym = p->syms[RX], set = sym;
00625 assert(sym);
00626 if (sym->temporary)
00627 set = (*IR->x.rmap)(opkind(p->op));
00628 assert(set);
00629 if (set->sclass != REGISTER) {
00630 Symbol r;
00631 if (*IR->x._templates[getrule(p, p->x.inst)] == '?')
00632 for (i = 1; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) {
00633 Symbol r = p->x.kids[i]->syms[RX];
00634 assert(p->x.kids[i]->x.registered);
00635 assert(r && r->x.regnode);
00636 assert(sym->x.wildcard || sym != r);
00637 mask[r->x.regnode->set] &= ~r->x.regnode->mask;
00638 }
00639 r = getreg(set, mask, p);
00640 if (sym->temporary) {
00641 Node q;
00642 r->x.lastuse = sym->x.lastuse;
00643 for (q = sym->x.lastuse; q; q = q->x.prevuse) {
00644 q->syms[RX] = r;
00645 q->x.registered = 1;
00646 if (sym->u.t.cse && q->x.copy)
00647 q->x.equatable = 1;
00648 }
00649 } else {
00650 p->syms[RX] = r;
00651 r->x.lastuse = p;
00652 }
00653 debug(dumpregs("(allocating %s to node %x)\n", r->x.name, (char *) p));
00654 }
00655 }
00656 p->x.registered = 1;
00657 (*IR->x.clobber)(p);
00658 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 253 of file gen.c. References ADDRF, ADDRL, symbol::c, ck, CNST, value::i, I, Node, Xsymbol::offset, node::op, value::p, P, p, s, specific, Symbol, node::syms, value::u, U, symbol::u, symbol::v, and symbol::x. 00253 {
00254 Symbol s = p->syms[0];
00255
00256 switch (specific(p->op)) {
00257 case ADDRF+P:
00258 case ADDRL+P: ck(s->x.offset >= lo && s->x.offset <= hi);
00259 case CNST+I: ck(s->u.c.v.i >= lo && s->u.c.v.i <= hi);
00260 case CNST+U: ck(s->u.c.v.u >= lo && s->u.c.v.u <= hi);
00261 case CNST+P: ck(s->u.c.v.p == 0 && lo <= 0 && hi >= 0);
00262 }
00263 return LBURG_MAX;
00264 }
|
|
||||||||||||
|
Definition at line 185 of file gen.c. References Xinterface::_isinstruction, Xinterface::_kids, Xinterface::_nts, assert, debug, fprint(), getrule(), i, Xnode::inst, IR, symbol::name, Node, p, reuse(), RX, stderr, node::syms, symbol::temporary, Xsymbol::usecount, symbol::x, node::x, and interface::x. Referenced by rewrite(). 00185 {
00186 int rulenum, i;
00187 short *nts;
00188 Node kids[10];
00189
00190 p = reuse(p, nt);
00191 rulenum = getrule(p, nt);
00192 nts = IR->x._nts[rulenum];
00193 (*IR->x._kids)(p, rulenum, kids);
00194 for (i = 0; nts[i]; i++)
00195 reduce(kids[i], nts[i]);
00196 if (IR->x._isinstruction[rulenum]) {
00197 assert(p->x.inst == 0 || p->x.inst == nt);
00198 p->x.inst = nt;
00199 if (p->syms[RX] && p->syms[RX]->temporary) {
00200 debug(fprint(stderr, "(using %s)\n", p->syms[RX]->name));
00201 p->syms[RX]->x.usecount++;
00202 }
00203 }
00204 }
|
Here is the call graph for this function:

|
|
Definition at line 826 of file gen.c. References assert, Regnode::number, p, Xsymbol::regnode, symbol::sclass, Regnode::set, Symbol, and symbol::x. 00826 {
00827 assert(p && p->sclass == REGISTER && p->sclass == REGISTER && p->x.regnode);
00828 return p->x.regnode->set<<8 | p->x.regnode->number;
00829 }
|
|
||||||||||||||||||||
|
Definition at line 772 of file gen.c. References debug, fprint(), Xnode::inst, IR, k, Xnode::kids, node::kids, n, Node, NULL, p, q, reprune(), stderr, Xinterface::target, interface::x, node::x, and x. Referenced by genreload(), and reprune(). 00772 {
00773 struct node x, *q = *pp;
00774
00775 if (q == NULL || k > n)
00776 return k;
00777 else if (q->x.inst == 0)
00778 return reprune(&q->kids[1],
00779 reprune(&q->kids[0], k, n, p), n, p);
00780 if (k == n) {
00781 debug(fprint(stderr, "(reprune changes %x from %x to %x)\n", pp, *pp, p->x.kids[n]));
00782 *pp = p->x.kids[n];
00783 x = *p;
00784 (IR->x.target)(&x);
00785 }
00786 return k + 1;
00787 }
|
Here is the call graph for this function:

|
|
Definition at line 386 of file gen.c. References assert, CALL, Xnode::copy, debug, fprint(), generic, Xnode::kids, LABEL, moveself(), n, Xsymbol::name, Xnode::next, Node, node::op, p, q, readsreg, RX, setsrc, Xnode::spills, src, stderr, Symbol, node::syms, V, coord::x, symbol::x, and node::x. Referenced by emit(). 00386 {
00387 Symbol src = q->x.kids[0]->syms[RX];
00388 Symbol tmp = q->syms[RX];
00389 Node p;
00390 int n = 0;
00391
00392 debug(fprint(stderr, "(requate(%x): tmp=%s src=%s)\n", q, tmp->x.name, src->x.name));
00393 for (p = q->x.next; p; p = p->x.next)
00394 if (p->x.copy && p->syms[RX] == src
00395 && p->x.kids[0]->syms[RX] == tmp)
00396 debug(fprint(stderr, "(requate arm 0 at %x)\n", p)),
00397 p->syms[RX] = tmp;
00398 else if (setsrc(p->syms[RX]) && !moveself(p) && !readsreg(p))
00399 return 0;
00400 else if (p->x.spills)
00401 return 0;
00402 else if (generic(p->op) == CALL && p->x.next)
00403 return 0;
00404 else if (p->op == LABEL+V && p->x.next)
00405 return 0;
00406 else if (p->syms[RX] == tmp && readsreg(p))
00407 debug(fprint(stderr, "(requate arm 5 at %x)\n", p)),
00408 n++;
00409 else if (p->syms[RX] == tmp)
00410 break;
00411 debug(fprint(stderr, "(requate arm 7 at %x)\n", p));
00412 assert(n > 0);
00413 for (p = q->x.next; p; p = p->x.next)
00414 if (p->syms[RX] == tmp && readsreg(p)) {
00415 p->syms[RX] = src;
00416 if (--n <= 0)
00417 break;
00418 }
00419 return 1;
00420 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 205 of file gen.c. References symbol::cse, generic, INDIR, node::kids, Xnode::mayrecalc, Node, node::op, P, p, r, Xnode::state, Symbol, node::syms, symbol::t, symbol::u, VREG, and node::x. Referenced by dumpcover(), emitasm(), and reduce(). 00205 {
00206 struct _state {
00207 short cost[1];
00208 };
00209 Symbol r = p->syms[RX];
00210
00211 if (generic(p->op) == INDIR && p->kids[0]->op == VREG+P
00212 && r->u.t.cse && p->x.mayrecalc
00213 && ((struct _state*)r->u.t.cse->x.state)->cost[nt] == 0)
00214 return r->u.t.cse;
00215 else
00216 return p;
00217 }
|
|
|
Definition at line 470 of file gen.c. References Xinterface::_label, assert, debug, dumpcover(), dumptree(), fprint(), Xnode::inst, IR, Node, p, prelabel(), reduce(), stderr, interface::x, and node::x. Referenced by gen(), genreload(), and genspill(). 00470 {
00471 assert(p->x.inst == 0);
00472 prelabel(p);
00473 debug(dumptree(p));
00474 debug(fprint(stderr, "\n"));
00475 (*IR->x._label)(p);
00476 debug(dumpcover(p, 1, 0));
00477 reduce(p, 1);
00478 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 452 of file gen.c. References assert, symbol::cse, debug, fprint(), Xnode::kids, node::kids, LOAD, n, Xsymbol::name, newnode(), Node, NULL, node::op, opkind, p, q, r, RX, symbol::sclass, setreg(), stderr, Symbol, node::syms, symbol::t, symbol::u, Xsymbol::wildcard, node::x, and symbol::x. Referenced by prelabel(). 00452 {
00453 Node q = p->kids[n];
00454
00455 assert(q);
00456 assert(r);
00457 assert(r->sclass == REGISTER || !r->x.wildcard);
00458 assert(q->syms[RX]);
00459 if (r != q->syms[RX] && !q->syms[RX]->x.wildcard) {
00460 q = newnode(LOAD + opkind(q->op),
00461 q, NULL, q->syms[0]);
00462 if (r->u.t.cse == p->kids[n])
00463 r->u.t.cse = q;
00464 p->kids[n] = p->x.kids[n] = q;
00465 q->x.kids[0] = q->kids[0];
00466 }
00467 setreg(q, r);
00468 debug(fprint(stderr, "(targeting %x->x.kids[%d]=%x to %s)\n", p, n, p->kids[n], r->x.name));
00469 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 449 of file gen.c. References Node, p, Symbol, and node::syms. Referenced by prelabel(), and rtarget().
|
|
||||||||||||||||
|
Definition at line 788 of file gen.c. References assert, freemask, i, Xnode::kids, Regnode::mask, mask, n, NELEMS, Xnode::next, Node, NULL, p, r, Xnode::registered, Xsymbol::regnode, RX, Regnode::set, spillr(), Xnode::spills, Symbol, node::syms, usedmask, symbol::x, and node::x. Referenced by getreg(). 00788 {
00789 int i;
00790 Node p;
00791
00792 here->x.spills = 1;
00793 usedmask[n] |= mask;
00794 if (mask&~freemask[n]) {
00795
00796 assert( /* It makes no sense for a node to clobber() its target. */
00797 here->x.registered == 0 || /* call isn't coming through clobber() */
00798 here->syms[RX] == NULL ||
00799 here->syms[RX]->x.regnode == NULL ||
00800 here->syms[RX]->x.regnode->set != n ||
00801 (here->syms[RX]->x.regnode->mask&mask) == 0
00802 );
00803
00804 for (p = here; p; p = p->x.next)
00805 for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) {
00806 Symbol r = p->x.kids[i]->syms[RX];
00807 assert(r);
00808 if (p->x.kids[i]->x.registered && r->x.regnode->set == n
00809 && r->x.regnode->mask&mask)
00810 spillr(r, here);
00811 }
00812 }
00813 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 659 of file gen.c. References assert, i, mask, Xnode::next, Node, NULL, q, Xsymbol::regnode, ri, Symbol, tmask, uses(), Regnode::vbl, Xsymbol::wildcard, node::x, and symbol::x. Referenced by getreg(). 00659 {
00660 Symbol bestreg = NULL;
00661 int bestdist = -1, i;
00662
00663 assert(set);
00664 if (!set->x.wildcard)
00665 bestreg = set;
00666 else {
00667 for (i = 31; i >= 0; i--) {
00668 Symbol ri = set->x.wildcard[i];
00669 if (
00670 ri != NULL &&
00671 ri->x.lastuse &&
00672 (ri->x.regnode->mask&tmask[ri->x.regnode->set]&mask[ri->x.regnode->set])
00673 ) {
00674 Regnode rn = ri->x.regnode;
00675 Node q = here;
00676 int dist = 0;
00677 for (; q && !uses(q, rn); q = q->x.next)
00678 dist++;
00679 if (q && dist > bestdist) {
00680 bestdist = dist;
00681 bestreg = ri;
00682 }
00683 }
00684 }
00685 }
00686 assert(bestreg); /* Must be able to spill something. Reconfigure the register allocator
00687 to ensure that we can allocate a register for all nodes without spilling
00688 the node's necessary input regs. */
00689 assert(bestreg->x.regnode->vbl == NULL); /* Can't spill register variables because
00690 the reload site might be in other blocks. Reconfigure the register allocator
00691 to ensure that this register is never allocated to a variable. */
00692 return bestreg;
00693 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 707 of file gen.c. References assert, genreload(), genspill(), i, k, Xnode::kids, Xsymbol::lastuse, NELEMS, newtemp(), Xnode::next, Node, node::op, opsize, optype, p, Xnode::prevuse, putreg(), r, readsreg, Xnode::registered, RX, Symbol, node::syms, node::x, and symbol::x. Referenced by spill(). 00707 {
00708 int i;
00709 Symbol tmp;
00710 Node p = r->x.lastuse;
00711 assert(p);
00712 while (p->x.prevuse)
00713 assert(r == p->syms[RX]),
00714 p = p->x.prevuse;
00715 assert(p->x.registered && !readsreg(p));
00716 tmp = newtemp(AUTO, optype(p->op), opsize(p->op));
00717 genspill(r, p, tmp);
00718 for (p = here->x.next; p; p = p->x.next)
00719 for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) {
00720 Node k = p->x.kids[i];
00721 if (k->x.registered && k->syms[RX] == r)
00722 genreload(p, tmp, i);
00723 }
00724 putreg(r);
00725 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 694 of file gen.c. References i, Xnode::kids, Regnode::mask, NELEMS, Node, p, Xnode::registered, Xsymbol::regnode, Regnode::set, node::syms, symbol::x, and node::x. Referenced by spillee(). 00694 {
00695 int i;
00696
00697 for (i = 0; i < NELEMS(p->x.kids); i++)
00698 if (
00699 p->x.kids[i] &&
00700 p->x.kids[i]->x.registered &&
00701 rn->set == p->x.kids[i]->syms[RX]->x.regnode->set &&
00702 (rn->mask&p->x.kids[i]->syms[RX]->x.regnode->mask)
00703 )
00704 return 1;
00705 return 0;
00706 }
|
|
|
Definition at line 45 of file gen.c. Referenced by docall(), gen02(), and mkactual(). |
|
|
Definition at line 50 of file gen.c. Referenced by parseflags(). |
|
|
|
|
|
Definition at line 51 of file gen.c. Referenced by parseflags(). |
|
|
|
|
|
Definition at line 44 of file gen.c. Referenced by emitasm(). |
|
|
Definition at line 75 of file gen.c. Referenced by askfixedreg(), blockbeg(), blockend(), dumpregs(), putreg(), and spill(). |
|
|
Definition at line 73 of file gen.c. Referenced by CG_Player(), CG_PlayerAngles(), ChopBrushes(), gen(), Heading(), Info_NextPair(), Map_RestoreBetween(), S_Respatialize(), swstmt(), UI_DrawPlayer(), UI_DrawPlayerModel(), UI_OpponentLeaderModel(), and UI_PlayerAngles(). |
|
|
|
|
|
Definition at line 42 of file gen.c. Referenced by blockend(). |
|
|
Initial value: {
0,
1,
0, 0,
1,
0, 0, 1, 1,
1, 0, 1, 1,
1,
1,
0,
1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1,
1, 1,
0, 0, 0, 0, 0, 0,
0, 0
}
Definition at line 56 of file gen.c. Referenced by gen(), genspill(), prelabel(), and ralloc(). |
|
|
|
Definition at line 49 of file gen.c. Referenced by blkunroll(). |
|
|
|
|
|
|
|
|
Definition at line 76 of file gen.c. Referenced by askfixedreg(), and spill(). |
|
|
Definition at line 78 of file gen.c. Referenced by askregvar(). |
1.3.9.1