to make it easy to use normal libraries (such as libdraw, libsec, and libmp) with the kernel, which uses extern register, don't stray into the external register set when allocating values to registers. Reference: /n/sources/patch/applied/6c-extreg Date: Thu Sep 13 16:22:58 CES 2012 Signed-off-by: charles.forsyth@gmail.com --- /sys/src/cmd/6c/reg.c Thu Sep 13 16:22:05 2012 +++ /sys/src/cmd/6c/reg.c Thu Sep 13 16:22:03 2012 @@ -50,6 +50,8 @@ lastr = R; nvar = 0; regbits = RtoB(D_SP) | RtoB(D_AX) | RtoB(D_X0); + if(REGEXT) + regbits |= RtoB(REGEXT) | RtoB(REGEXT-1); for(z=0; z= D_AX && i <= D_R15 && i != D_SP) @@ -101,6 +104,10 @@ if(i >= D_X0 && i <= D_X7) reg[i] = 0; } + /* keep two external registers */ + reg[REGEXT] = 1; + reg[REGEXT-1] = 1; + memmove(resvreg, reg, sizeof(resvreg)); } void @@ -111,10 +118,10 @@ reg[D_SP]--; for(i=D_AX; i<=D_R15; i++) - if(reg[i]) + if(reg[i] && !resvreg[i]) diag(Z, "reg %R left allocated", i); for(i=D_X0; i<=D_X7; i++) - if(reg[i]) + if(reg[i] && !resvreg[i]) diag(Z, "reg %R left allocated", i); while(mnstring) outstring("", 1L); @@ -179,7 +186,7 @@ n = 0; for(i=D_AX; i<=D_R15; i++) - if(reg[i] == 0) + if(reg[i] == 0 && !resvreg[i]) n++; return n; } @@ -337,7 +344,7 @@ goto out; } for(i=D_AX; i<=D_R15; i++) - if(reg[i] == 0) + if(reg[i] == 0 && !resvreg[i]) goto out; diag(tn, "out of fixed registers"); goto err; @@ -350,7 +357,7 @@ goto out; } for(i=D_X0; i<=D_X7; i++) - if(reg[i] == 0) + if(reg[i] == 0 && !resvreg[i]) goto out; diag(tn, "out of float registers"); goto out;