Bill Coffman <[EMAIL PROTECTED]> wrote: > On Wed, 17 Nov 2004 14:14:18 +0100, Leopold Toetsch <[EMAIL PROTECTED]> wrote: >> I've now (locally here) extended Bill Coffman's register allocator by >> one subroutine that actually decides to use non-volatiles or volatiles >> according to pdd03. All variables that are live around a subroutine call >> are e.g. allocated from R16..R31.
> Interesting. I'd like to see it. See below, you know where it's called from ;) > Regarding pdd03, I am still not clear how it should be interpreted. All registers are preserved, but some of these registers are used, either by implict opcodes or as return values. > * If the subroutine being allocated is a leaf (with no sub calls), > then all registers should be available. Yep. > * Registers P4, S1-S4, N0-N4 are free for allocation, regardless. I've included P3 (see below). If it's used it interfers. > * It seems like it would be simple enough to provide a "compiler > hint", to let the allocator know if the subs it calls are using the > parrot convention or not, or how many of the R5-R15 it will need. The register allocator is only supporting pdd03, nothing else. The amount of needed R5 - R15 is unknown, as these are return results. > ... This can then be used as part of a static analysis, > and can be incorporated into the unit data structure, or passed as a > separate parameter to imc_reg_alloc(). Yep and it's working. > ~Bill leo /* * find available color for register #x in available colors */ static int ig_find_color(Interp* interpreter, IMC_Unit *unit, int x, char *avail) { int c, t; SymReg *r; static const char types[] = "ISPN"; static const char assignable[4][5] = { /* 0 1 2 3 4 */ { 0, 0, 0, 0, 0, }, /* I */ { 0, 1, 1, 1, 1, }, /* S */ { 0, 0, 0, 1, 1, }, /* P */ { 1, 1, 1, 1, 1, }, /* N */ }; UNUSED(interpreter); r = unit->reglist[x]; t = strchr(types, r->set) - types; /* please note: c is starting at 1 for R0 */ if (!(r->usage & U_NON_VOLATILE)) { /* 0) 5-15 volatile range */ for (c = 6; c <= 16; c++) if (avail[c]) return c; } /* 1) try upper non-volatiles, 16...31 */ for (c = 17; c <= 32; c++) if (avail[c]) return c; /* some lower regs are preserved too 0...4 */ for (c = 1; c <= 5; c++) if (avail[c] && assignable[t][c - 1]) return c; /* no chance, force high range with possible spilling */ for (c = 33; ; c++) if (avail[c]) return c; assert(0); return 0; }