aboutsummaryrefslogtreecommitdiffhomepage
path: root/regalloc.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2023-06-22 21:54:08 +0200
committerlemon <lsof@mailbox.org>2023-06-22 21:54:08 +0200
commitd313c6e49bfb32ae24745e90eebe833da20efa1a (patch)
tree73f950f515b4442a800ecc4e35c346b0cc263a89 /regalloc.c
parent836f91535f421be4cba2840aed55aba3c5f72f1b (diff)
change RMORE -> RADDR; use RXXX (RNONE) for special args,also undef
Diffstat (limited to 'regalloc.c')
-rw-r--r--regalloc.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/regalloc.c b/regalloc.c
index 19df61c..7202e68 100644
--- a/regalloc.c
+++ b/regalloc.c
@@ -69,7 +69,7 @@ def(struct rega *ra, struct instr *ins, struct block *blk, int curi)
if ((ins->op == Ocopy || ins->inplace) && ins->l.t == RREG) {
int hint = ins->l.i;
- if (!ra->regs[hint].t) {
+ if (!ra->regs[hint].bits) {
take(ra, reg = hint, mkref(RTMP, var));
assert(ra->regs[reg].bits == mkref(RTMP, var).bits);
}
@@ -104,7 +104,7 @@ def(struct rega *ra, struct instr *ins, struct block *blk, int curi)
static void
take(struct rega *ra, int reg, union ref ref) {
DBG("-- take %s for %c%d\n", mctarg->rnames[reg], "R%"[ref.t==RTMP], ref.i);
- assert(!ra->regs[reg].t && "taken");
+ assert(!ra->regs[reg].bits && "taken");
if (ref.t == RTMP)
ra->allocs[ref.i] = areg(reg);
ra->regs[reg] = ref;
@@ -129,7 +129,7 @@ allocreg(struct rega *ra, enum irclass cls, union ref ref, uvlong excl)
} else assert(0);
for (reg = r0; reg < rend; ++reg) {
if (bstest(mctarg->rglob, reg)) continue;
- if (!(excl >> reg & 1) && !ra->regs[reg].t) {
+ if (!(excl >> reg & 1) && !ra->regs[reg].bits) {
take(ra, reg, ref);
return reg;
}
@@ -158,9 +158,9 @@ spill(struct rega *ra, int reg, struct block *blk, int curi) {
int var, s;
struct instr load;
- if (!ra->regs[reg].t) return;
+ if (!ra->regs[reg].bits) return;
var = ra->regs[reg].i;
- assert(ra->regs[reg].t == RTMP && *(ushort *)&ra->allocs[var] == *(ushort *)&areg(reg));
+ assert(ra->regs[reg].bits == RTMP && *(ushort *)&ra->allocs[var] == *(ushort *)&areg(reg));
s = allocstk(ra, var);
DBG("-- spill %%%d %s -> s%d\n", var, mctarg->rnames[reg], s);
instrtab[var].reg = 0;
@@ -179,11 +179,11 @@ forcetake(struct rega *ra, int reg, union ref ref, struct block *blk, int curi)
struct alloc *alloc;
if (ra->regs[reg].bits == ref.bits) return;
- if (!ra->regs[reg].t) {
+ if (!ra->regs[reg].bits) {
take(ra, reg, ref);
return;
}
- assert(ra->regs[reg].t == RTMP);
+ assert(ra->regs[reg].bits == RTMP);
var = ra->regs[reg].i;
alloc = &ra->allocs[var];
assert(alloc->a == reg);
@@ -217,10 +217,10 @@ use(struct rega *ra, struct block *blk, int curi, enum op op, int hint, union re
struct instr *ins;
uvlong excl = other.t == RREG ? 1ull<<other.i : 0;
- if (ref->t == RMORE) {
+ if (ref->t == RADDR) {
struct addr addr = addrht[ref->i];
- if (addr.base.t) use(ra, blk, curi, 0, hint, &addr.base, addr.index);
- if (addr.index.t) use(ra, blk, curi, 0, hint, &addr.index, NOREF);
+ if (addr.base.bits) use(ra, blk, curi, 0, hint, &addr.base, addr.index);
+ if (addr.index.bits) use(ra, blk, curi, 0, hint, &addr.index, NOREF);
*ref = mkaddr(addr);
return;
} else if (ref->t == RREG) {
@@ -238,10 +238,10 @@ use(struct rega *ra, struct block *blk, int curi, enum op op, int hint, union re
assert(ins->op != Ocall);
if (ins->r.t == RREG && ins->inplace) excl |= 1ull<<ins->r.i;
- if ((hint == -1 || ra->regs[hint].t) && ins->op == Ocopy && ins->l.t == RREG)
+ if ((hint == -1 || ra->regs[hint].bits) && ins->op == Ocopy && ins->l.t == RREG)
/* for '%x = copy Rx', hint %x to use Rx */
hint = ins->l.i;
- if (hint != -1 && !(excl >> hint & 1) && !ra->regs[hint].t) {
+ if (hint != -1 && !(excl >> hint & 1) && !ra->regs[hint].bits) {
take(ra, hint, *ref);
ins->reg = hint + 1;
} else {
@@ -294,7 +294,7 @@ regalloc(struct function *fn)
blk = last;
do {
for (int i = 0; i < 2; ++i) {
- if (!blk->jmp.arg[i].t) break;
+ if (!blk->jmp.arg[i].bits) break;
/* do not allocate a reg for a cmp op used a branch argument, since it's a pseudo op */
if (blk->jmp.t == Jb && blk->jmp.arg[i].t == RTMP && oiscmp(instrtab[blk->jmp.arg[i].i].op))
break;
@@ -324,8 +324,8 @@ regalloc(struct function *fn)
use(&ra, blk, i, ins->op, hint0, &ins->r, NOREF);
use(&ra, blk, i, ins->op, hint0, &ins->l, ins->r);
} else {
- if (ins->l.t) use(&ra, blk, i, ins->op, hint0, &ins->l, ins->r);
- if (ins->r.t) use(&ra, blk, i, ins->op, hint1, &ins->r, NOREF);
+ if (ins->l.bits) use(&ra, blk, i, ins->op, hint0, &ins->l, ins->r);
+ if (ins->r.bits) use(&ra, blk, i, ins->op, hint1, &ins->r, NOREF);
}
}
} else {