reserve two registers for extern register use, and ensure that neither they nor any other special register can be allocated to temporaries or variables also use temporary registers cyclically even though `strongarm does register forwarding' because it will forward without that, and not all arms are strongarms. Reference: /n/sources/patch/applied/5c-extreg Date: Wed Jul 4 17:53:21 CES 2007 Signed-off-by: forsyth@terzarima.net --- /sys/src/cmd/5c/txt.c Wed Jul 4 17:50:04 2007 +++ /sys/src/cmd/5c/txt.c Wed Jul 4 17:50:00 2007 @@ -1,5 +1,7 @@ #include "gc.h" +static char resvreg[nelem(reg)]; + void ginit(void) { @@ -80,6 +82,16 @@ com64init(); memset(reg, 0, sizeof(reg)); + /* don't allocate */ + reg[REGTMP] = 1; + reg[REGSB] = 1; + reg[REGSP] = 1; + reg[REGLINK] = 1; + reg[REGPC] = 1; + /* keep two external registers */ + reg[REGEXT] = 1; + reg[REGEXT-1] = 1; + memmove(resvreg, reg, sizeof(reg)); } void @@ -89,10 +101,10 @@ Sym *s; for(i=0; i= NREG) j = REGRET+1; - if(reg[j] == 0) { + if(reg[j] == 0 && resvreg[j] == 0) { i = j; goto out; } @@ -319,7 +331,7 @@ return; out: reg[i]++; -/* lasti++; *** StrongARM does register forwarding */ + lasti++; if(lasti >= 5) lasti = 0; nodreg(n, tn, i); @@ -1184,9 +1196,12 @@ long o; if(typechlp[t->etype]) { - if(exregoffset <= REGEXT-4) + if(exregoffset <= REGEXT-2) return 0; o = exregoffset; + if(reg[o] && !resvreg[o]) + return 0; + resvreg[o] = reg[o] = 1; exregoffset--; return o; } @@ -1194,6 +1209,9 @@ if(exfregoffset <= NFREG-1) return 0; o = exfregoffset + NREG; + if(reg[o] && !resvreg[o]) + return 0; + resvreg[o] = reg[o] = 1; exfregoffset--; return o; }