aboutsummaryrefslogtreecommitdiffhomepage
path: root/regalloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'regalloc.c')
-rw-r--r--regalloc.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/regalloc.c b/regalloc.c
index a49330d..ae81fcf 100644
--- a/regalloc.c
+++ b/regalloc.c
@@ -7,7 +7,7 @@ static regset gpregset, fpregset;
static regset globusage;
#define isfpr(reg) in_range((reg), mctarg->fpr0, mctarg->fpr0 + mctarg->nfpr - 1)
-#define isgpr(reg) (!isfpr(reg))
+#define isgpr(reg) in_range((reg), mctarg->gpr0, mctarg->gpr0 + mctarg->nfpr - 1)
enum { ADEAD, AREG, ASTACK } ;
struct alloc { ushort t : 2, a : 14; };
@@ -125,7 +125,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 (rstest(ra->m.free, hint)) {
+ if (rstest(ra->m.free, hint) && kisflt(insrescls(*ins)) == isfpr(hint)) {
take(ra, reg = hint, mkref(RTMP, var));
assert(ra->m.regs[reg] == var && !rstest(ra->m.free, hint));
}
@@ -301,7 +301,8 @@ use(struct rega *ra, struct block *blk, int curi, enum op op, int hint, union re
/* for '%x = copy Rx', hint %x to use Rx */
hint = ins->l.i;
- if (hint != -1 && !rstest(excl, hint) && rstest(ra->m.free, hint)) {
+ if (hint != -1 && !rstest(excl, hint) && rstest(ra->m.free, hint)
+ && kisflt(insrescls(*ins)) == isfpr(hint)) {
take(ra, hint, *ref);
reg = hint;
} else {
@@ -568,9 +569,9 @@ regalloc(struct function *fn)
/* setup */
if (!fpregset || !gpregset) {
for (int i = 0; i < MAXREGS; ++i) {
- if (in_range(i, mctarg->fpr0, mctarg->fpr0 + mctarg->nfpr - 1))
+ if (isfpr(i))
fpregset = rsset(fpregset, i);
- else if (in_range(i, mctarg->gpr0, mctarg->gpr0 + mctarg->ngpr - 1))
+ else if (isgpr(i))
gpregset = rsset(gpregset, i);
}
}