From 9702f740ab5532e392fc9c1fd83000d206af4dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigrid=20Solveig=20Hafl=C3=ADnud=C3=B3ttir?= Date: Wed, 10 May 2023 17:01:37 +0000 Subject: 7c, 7l: revert CASE change, fix linker clobbering offset if given the same register twice --- sys/src/cmd/7c/peep.c | 4 +--- sys/src/cmd/7l/asmout.c | 8 +++----- 2 files changed, 4 insertions(+), 8 deletions(-) (limited to 'sys/src') diff --git a/sys/src/cmd/7c/peep.c b/sys/src/cmd/7c/peep.c index d010058c0..0126725e0 100644 --- a/sys/src/cmd/7c/peep.c +++ b/sys/src/cmd/7c/peep.c @@ -1122,6 +1122,7 @@ copyu(Prog *p, Adr *v, Adr *s) case AFABSS: case AFSQRTD: case AFSQRTS: + case ACASE: #ifdef YYY if(p->scond&(C_WBIT|C_PBIT)) if(v->type == D_REG) { @@ -1303,9 +1304,6 @@ copyu(Prog *p, Adr *v, Adr *s) if(v->reg == REGARG) return 3; return 0; - - case ACASE: - return 0; } } diff --git a/sys/src/cmd/7l/asmout.c b/sys/src/cmd/7l/asmout.c index 2c4a98bd5..cc55729a4 100644 --- a/sys/src/cmd/7l/asmout.c +++ b/sys/src/cmd/7l/asmout.c @@ -817,11 +817,9 @@ asmout(Prog *p, Optab *o) o1 = ADR(0, d, p->to.reg); break; - case 62: /* case Rv, Rt -> adr tab, Rt; movw Rt[R<<2], Rl; add Rt, Rl; br (Rl) */ - if(p->from.reg == p->to.reg) - diag("invalid SWITCH\n%P", p); - o1 = ADR(0, 4*4, p->to.reg); /* adr 4(pc), Rt */ - o2 = (2<<30)|(7<<27)|(2<<22)|(1<<21)|(3<<13)|(1<<12)|(2<<10)|(p->from.reg<<16)|(p->to.reg<<5)|REGTMP; /* movw Rt[Rv<<2], REGTMP */ + case 62: /* case Rv, Rt -> adr tab, Rl; movw Rl[R<<2], Rt; add Rt, Rl; br (Rl) */ + o1 = ADR(0, 4*4, REGTMP); /* adr 4(pc), REGTMP */ + o2 = (2<<30)|(7<<27)|(2<<22)|(1<<21)|(3<<13)|(1<<12)|(2<<10)|(p->from.reg<<16)|(REGTMP<<5)|p->to.reg; /* movw REGTMP[Rv<<2], Rt */ o3 = oprrr(AADD) | (p->to.reg<<16) | (REGTMP<<5) | REGTMP; /* add Rt, REGTMP */ o4 = (0x6b<<25)|(0x1F<<16)|(REGTMP<<5); /* br (REGTMP) */ lastcase = p; -- cgit v1.2.3