summaryrefslogtreecommitdiff
path: root/utils/6c/txt.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/6c/txt.c')
-rw-r--r--utils/6c/txt.c18
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;