This graph shows which files directly or indirectly include this file:

Go to the source code of this file.
Data Structures | |
| struct | Env |
| struct | Regnode |
| struct | Xinterface |
| struct | Xnode |
| struct | Xsymbol |
Defines | |
| #define | debug(x) (void)(dflag&&((x),0)) |
| #define | LBURG_MAX SHRT_MAX |
Enumerations | |
| enum | { RX = 2 } |
| enum | { VREG = (44<<4) } |
| enum | { IREG = 0, FREG = 1 } |
Functions | |
| int | askregvar (Symbol, Symbol) |
| void | blkcopy (int, int, int, int, int, int[]) |
| void | blockbeg (Env *) |
| void | blockend (Env *) |
| void | emit (Node) |
| unsigned | emitbin (Node, int) |
| Node | gen (Node) |
| int | getregnum (Node) |
| int | mayrecalc (Node) |
| int | mkactual (int, int) |
| void | mkauto (Symbol) |
| Symbol | mkreg (char *, int, int, int) |
| int | move (Node) |
| int | notarget (Node) |
| void | parseflags (int, char **) |
| int | range (Node, int, int) |
| unsigned | regloc (Symbol) |
| void | rtarget (Node, int, Symbol) |
| void | setreg (Node, Symbol) |
| void | spill (unsigned, int, Node) |
| int | widens (Node) |
Variables | |
| int | argoffset |
| int | bflag |
| int | dalign |
| int | dflag |
| int | framesize |
| unsigned | freemask [] |
| int | maxargoffset |
| int | maxoffset |
| Symbol | mkwildcard (Symbol *) |
| int | offset |
| int | salign |
| int | swap |
| unsigned | tmask [] |
| unsigned | usedmask [] |
| unsigned | vmask [] |
|
|
Definition at line 101 of file config.h. Referenced by askregvar(), genreload(), genspill(), linearize(), prune(), putreg(), ralloc(), reduce(), reprune(), requate(), rewrite(), rtarget(), and yylook(). |
|
|
|
|
|
Definition at line 80 of file config.h. 00080 { RX=2 };
|
|
|
Definition at line 88 of file config.h. 00088 { VREG=(44<<4) };
|
|
|
Definition at line 70 of file config.h.
|
|
||||||||||||
|
Definition at line 572 of file gen.c. References askreg(), assert, debug, dumpregs(), isscalar, Xsymbol::name, symbol::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 104 of file gen.c. References e, Env::freemask, 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, freemask, Env::freemask, maxoffset, offset, and Env::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 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 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, interface::x, node::x, and symbol::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 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 219 of file gen.c. References ADDRF, ADDRG, assert, CNST, symbol::cse, generic, Xnode::mayrecalc, Node, op, node::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, offset, Xsymbol::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 Regnode::mask, mask, n, symbol::name, Xsymbol::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 525 of file gen.c. References Node, p, node::syms, Xsymbol::wildcard, and symbol::x. 00525 {
00526 return p->syms[RX]->x.wildcard ? 0 : LBURG_MAX;
00527 }
|
|
||||||||||||
|
|
|
||||||||||||||||
|
Definition at line 253 of file gen.c. References ADDRF, ADDRL, symbol::c, ck, CNST, I, value::i, Node, Xsymbol::offset, node::op, p, P, value::p, s, specific, Symbol, node::syms, symbol::u, U, value::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 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 452 of file gen.c. References assert, symbol::cse, debug, fprint(), node::kids, Xnode::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, symbol::x, and node::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(). 00449 {
00450 p->syms[RX] = r;
00451 }
|
|
||||||||||||||||
|
Definition at line 788 of file gen.c. References assert, freemask, i, Xnode::kids, mask, Regnode::mask, n, NELEMS, Xnode::next, Node, NULL, p, r, Xnode::registered, Xsymbol::regnode, RX, Regnode::set, spillr(), Xnode::spills, Symbol, node::syms, usedmask, node::x, and symbol::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 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 42 of file gen.c. Referenced by blockend(). |
|
|
|
|
|
|
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