Fix external register problems and synchronize a little bit with Plan 9. Reference: /n/patches.lsub.org/patch/compext Date: Thu Sep 13 23:54:30 CES 2012 Signed-off-by: paurea@lsub.org --- /sys/src/cmd/6c/reg.c Thu Apr 12 12:25:19 2012 +++ /sys/src/cmd/6c/reg.c Thu Sep 13 23:20:43 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; --- /sys/src/cmd/cc/pswt.c Thu Apr 12 12:25:26 2012 +++ /sys/src/cmd/cc/pswt.c Thu Sep 13 23:44:05 2012 @@ -35,20 +35,14 @@ isv |= c->isv; nc++; } - if(typev[n->type->etype]) - isv = 1; - else if(isv){ + if(isv && !typev[n->type->etype]) warn(n, "32-bit switch expression with 64-bit case constant"); - isv = 0; - } iq = alloc(nc*sizeof(C1)); q = iq; for(c = cases; c->link != C; c = c->link) { if(c->def) continue; - if(c->isv && !isv) - continue; /* can never match */ q->label = c->label; if(isv) q->val = c->val; @@ -118,7 +112,7 @@ } patch(hsb, pc); if(0){for(int k=0; k