diff options
-rw-r--r-- | amd64/include/u.h | 2 | ||||
-rw-r--r-- | sys/src/cmd/6c/reg.c | 2 | ||||
-rw-r--r-- | sys/src/cmd/6c/txt.c | 17 | ||||
-rw-r--r-- | sys/src/cmd/6l/span.c | 3 |
4 files changed, 18 insertions, 6 deletions
diff --git a/amd64/include/u.h b/amd64/include/u.h index feb121703..8dce5066f 100644 --- a/amd64/include/u.h +++ b/amd64/include/u.h @@ -10,7 +10,7 @@ typedef unsigned long long uintptr; typedef unsigned long usize; typedef ushort Rune; typedef union FPdbleword FPdbleword; -typedef uvlong jmp_buf[2]; +typedef uintptr jmp_buf[2]; #define JMPBUFSP 0 #define JMPBUFPC 1 #define JMPBUFDPC 0 diff --git a/sys/src/cmd/6c/reg.c b/sys/src/cmd/6c/reg.c index 32b9abf5d..43e21a4f3 100644 --- a/sys/src/cmd/6c/reg.c +++ b/sys/src/cmd/6c/reg.c @@ -50,6 +50,8 @@ regopt(Prog *p) 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<BITS; z++) { externs.b[z] = 0; params.b[z] = 0; diff --git a/sys/src/cmd/6c/txt.c b/sys/src/cmd/6c/txt.c index 24ac1db46..e3b9a9ee5 100644 --- a/sys/src/cmd/6c/txt.c +++ b/sys/src/cmd/6c/txt.c @@ -1,5 +1,7 @@ #include "gc.h" +static int resvreg[nelem(reg)]; + void ginit(void) { @@ -94,6 +96,7 @@ ginit(void) if(0) com64init(); + memset(reg, 0, sizeof(reg)); for(i=0; i<nelem(reg); i++) { reg[i] = 1; if(i >= D_AX && i <= D_R15 && i != D_SP) @@ -101,6 +104,10 @@ ginit(void) 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 @@ gclean(void) 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 @@ nareg(void) 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 @@ regalloc(Node *n, Node *tn, Node *o) 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 @@ regalloc(Node *n, Node *tn, Node *o) 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; diff --git a/sys/src/cmd/6l/span.c b/sys/src/cmd/6l/span.c index 78399a2b3..ec36e1490 100644 --- a/sys/src/cmd/6l/span.c +++ b/sys/src/cmd/6l/span.c @@ -668,6 +668,9 @@ asmandsz(Adr *a, int r, int rex, int m64) rex &= (0x40 | Rxr); v = a->offset; + if ((vlong)v != a->offset) + print("asmandsz: Trying to emit %#ullx and 32 bits is not sufficient\n", + a->offset); t = a->type; if(a->index != D_NONE) { if(t >= D_INDIR) { |