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
#include "gc.h"
+static int resvreg[nelem(reg)];
+
void
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)
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
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);
n = 0;
for(i=D_AX; i<=D_R15; i++)
- if(reg[i] == 0)
+ if(reg[i] == 0 && !resvreg[i])
n++;
return n;
}
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;
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;