aboutsummaryrefslogtreecommitdiff
path: root/rega.c
diff options
context:
space:
mode:
Diffstat (limited to 'rega.c')
-rw-r--r--rega.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/rega.c b/rega.c
index 3d83327..02429a6 100644
--- a/rega.c
+++ b/rega.c
@@ -8,8 +8,8 @@
typedef struct RMap RMap;
struct RMap {
- int t[NIReg+NFReg];
- int r[NIReg+NFReg];
+ int t[Tmp0];
+ int r[Tmp0];
BSet b[1];
int n;
};
@@ -78,10 +78,12 @@ static void
radd(RMap *m, int t, int r)
{
assert((t >= Tmp0 || t == r) && "invalid temporary");
- assert(((RAX <= r && r < RAX + NIReg) || (XMM0 <= r && r < XMM0 + NFReg)) && "invalid register");
+ assert(((T.gpr0 <= r && r < T.gpr0 + T.ngpr)
+ || (T.fpr0 <= r && r < T.fpr0 + T.nfpr))
+ && "invalid register");
assert(!bshas(m->b, t) && "temporary has mapping");
assert(!bshas(m->b, r) && "register already allocated");
- assert(m->n <= NIReg+NFReg && "too many mappings");
+ assert(m->n <= T.ngpr+T.nfpr && "too many mappings");
bsset(m->b, t);
bsset(m->b, r);
m->t[m->n] = t;
@@ -110,11 +112,11 @@ ralloc(RMap *m, int t)
regs = tmp[phicls(t, tmp)].hint.m;
regs |= m->b->t[0];
if (KBASE(tmp[t].cls) == 0) {
- r0 = RAX;
- r1 = RAX + NIReg;
+ r0 = T.gpr0;
+ r1 = r0 + T.ngpr;
} else {
- r0 = XMM0;
- r1 = XMM0 + NFReg;
+ r0 = T.fpr0;
+ r1 = r0 + T.nfpr;
}
for (r=r0; r<r1; r++)
if (!(regs & BIT(r)))
@@ -135,7 +137,7 @@ rfree(RMap *m, int t)
{
int i, r;
- assert(t >= Tmp0 || !(BIT(t) & RGLOB));
+ assert(t >= Tmp0 || !(BIT(t) & T.rglob));
if (!bshas(m->b, t))
return -1;
for (i=0; m->t[i] != t; i++)
@@ -295,10 +297,10 @@ dopm(Blk *b, Ins *i, RMap *m)
} while (i != b->ins && regcpy(i-1));
assert(m0.n <= m->n);
if (i != b->ins && (i-1)->op == Ocall) {
- def = retregs((i-1)->arg[1], 0);
- for (r=0; r<NRSave; r++)
- if (!(BIT(rsave[r]) & def))
- move(rsave[r], R, m);
+ def = T.retregs((i-1)->arg[1], 0) | T.rglob;
+ for (r=0; T.rsave[r]>=0; r++)
+ if (!(BIT(T.rsave[r]) & def))
+ move(T.rsave[r], R, m);
}
for (npm=0, n=0; n<m->n; n++) {
t = m->t[n];
@@ -370,10 +372,10 @@ doblk(Blk *b, RMap *cur)
for (i=&b->ins[b->nins]; i!=b->ins;) {
switch ((--i)->op) {
case Ocall:
- rs = argregs(i->arg[1], 0);
- for (r=0; r<NRSave; r++)
- if (!(BIT(rsave[r]) & rs))
- rfree(cur, rsave[r]);
+ rs = T.argregs(i->arg[1], 0) | T.rglob;
+ for (r=0; T.rsave[r]>=0; r++)
+ if (!(BIT(T.rsave[r]) & rs))
+ rfree(cur, T.rsave[r]);
break;
case Ocopy:
if (isreg(i->arg[0])) {
@@ -388,7 +390,7 @@ doblk(Blk *b, RMap *cur)
if (!req(i->to, R)) {
assert(rtype(i->to) == RTmp);
r = i->to.val;
- if (r >= Tmp0 || !(BIT(r) & RGLOB))
+ if (r >= Tmp0 || !(BIT(r) & T.rglob))
r = rfree(cur, r);
if (r == -1) {
assert(!isreg(i->to));