diff options
Diffstat (limited to 'utils/6c/txt.c')
| -rw-r--r-- | utils/6c/txt.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/utils/6c/txt.c b/utils/6c/txt.c index 9d9c86b1..e3b9a9ee 100644 --- a/utils/6c/txt.c +++ b/utils/6c/txt.c @@ -1,5 +1,7 @@ #include "gc.h" +static int resvreg[nelem(reg)]; + void ginit(void) { @@ -23,6 +25,7 @@ ginit(void) tfield = types[TINT]; typeword = typechlvp; + typeswitch = typechlv; typecmplx = typesu; /* TO DO */ @@ -93,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) @@ -100,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 @@ -110,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); @@ -178,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; } @@ -336,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; @@ -349,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; |
