prefix register macros
This commit is contained in:
parent
ec5042148e
commit
f6df9e55c5
3 changed files with 15 additions and 15 deletions
10
lisc/emit.c
10
lisc/emit.c
|
@ -35,7 +35,7 @@ static char *rtoa[] = {
|
||||||
[R15D] = "r15d",
|
[R15D] = "r15d",
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { SSHORT, SBYTE };
|
enum { SShort, SByte };
|
||||||
static char *rsub[][2] = {
|
static char *rsub[][2] = {
|
||||||
[RXX] = {"OH GOD!", "OH NO!"},
|
[RXX] = {"OH GOD!", "OH NO!"},
|
||||||
[RAX] = {"ax", "al"},
|
[RAX] = {"ax", "al"},
|
||||||
|
@ -128,7 +128,7 @@ emem(Ref r, Fn *fn, FILE *f)
|
||||||
econ(&fn->con[r.val], f);
|
econ(&fn->con[r.val], f);
|
||||||
break;
|
break;
|
||||||
case RReg:
|
case RReg:
|
||||||
assert(BASE(r.val) == r.val);
|
assert(r.val < EAX);
|
||||||
fprintf(f, "(");
|
fprintf(f, "(");
|
||||||
eref(r, fn, f);
|
eref(r, fn, f);
|
||||||
fprintf(f, ")");
|
fprintf(f, ")");
|
||||||
|
@ -198,7 +198,7 @@ eins(Ins i, Fn *fn, FILE *f)
|
||||||
case OStoreb:
|
case OStoreb:
|
||||||
fprintf(f, "\tmov%s ", stoa[i.op - OStore]);
|
fprintf(f, "\tmov%s ", stoa[i.op - OStore]);
|
||||||
if (rtype(i.arg[0]) == RReg) {
|
if (rtype(i.arg[0]) == RReg) {
|
||||||
r = BASE(i.arg[0].val);
|
r = RBASE(i.arg[0].val);
|
||||||
fprintf(f, "%%%s", rsub[r][i.op - OStores]);
|
fprintf(f, "%%%s", rsub[r][i.op - OStores]);
|
||||||
} else
|
} else
|
||||||
eref(i.arg[0], fn, f);
|
eref(i.arg[0], fn, f);
|
||||||
|
@ -213,7 +213,7 @@ eins(Ins i, Fn *fn, FILE *f)
|
||||||
case OLoadsb:
|
case OLoadsb:
|
||||||
case OLoadub:
|
case OLoadub:
|
||||||
fprintf(f, "\t%s", otoa[i.op]);
|
fprintf(f, "\t%s", otoa[i.op]);
|
||||||
if (BASE(i.to.val) == i.to.val)
|
if (i.to.val < EAX)
|
||||||
fprintf(f, "q ");
|
fprintf(f, "q ");
|
||||||
else
|
else
|
||||||
fprintf(f, "l ");
|
fprintf(f, "l ");
|
||||||
|
@ -248,7 +248,7 @@ eins(Ins i, Fn *fn, FILE *f)
|
||||||
eop("mov $0,", i.to, R, fn, f);
|
eop("mov $0,", i.to, R, fn, f);
|
||||||
fprintf(f, "\tset%s %%%s\n",
|
fprintf(f, "\tset%s %%%s\n",
|
||||||
ctoa[i.op-OXSet],
|
ctoa[i.op-OXSet],
|
||||||
rsub[BASE(i.to.val)][SBYTE]);
|
rsub[RBASE(i.to.val)][SByte]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
diag("emit: unhandled instruction (3)");
|
diag("emit: unhandled instruction (3)");
|
||||||
|
|
|
@ -60,8 +60,8 @@ enum {
|
||||||
NReg = 3 /* for test purposes */
|
NReg = 3 /* for test purposes */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define WORD(r) (r + (EAX-RAX))
|
#define RWORD(r) (r + (EAX-RAX))
|
||||||
#define BASE(r) (r >= EAX ? r - (EAX-RAX) : r)
|
#define RBASE(r) (r < EAX ? r : r - (EAX-RAX))
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NString = 32,
|
NString = 32,
|
||||||
|
|
16
lisc/rega.c
16
lisc/rega.c
|
@ -35,7 +35,7 @@ reg(int r, int t)
|
||||||
default:
|
default:
|
||||||
assert(!"invalid temporary");
|
assert(!"invalid temporary");
|
||||||
case TWord:
|
case TWord:
|
||||||
return REG(WORD(r));
|
return REG(RWORD(r));
|
||||||
case TLong:
|
case TLong:
|
||||||
return REG(r);
|
return REG(r);
|
||||||
}
|
}
|
||||||
|
@ -205,7 +205,7 @@ dopm(Blk *b, Ins *i, RMap *m)
|
||||||
i1 = i+1;
|
i1 = i+1;
|
||||||
if (rtype(i->to) == RReg)
|
if (rtype(i->to) == RReg)
|
||||||
for (;; i--) {
|
for (;; i--) {
|
||||||
r = BASE(i->to.val);
|
r = RBASE(i->to.val);
|
||||||
rt = i->arg[0];
|
rt = i->arg[0];
|
||||||
assert(rtype(rt) == RTmp);
|
assert(rtype(rt) == RTmp);
|
||||||
assert(BGET(m->br, r));
|
assert(BGET(m->br, r));
|
||||||
|
@ -220,7 +220,7 @@ dopm(Blk *b, Ins *i, RMap *m)
|
||||||
}
|
}
|
||||||
else if (rtype(i->arg[0]) == RReg)
|
else if (rtype(i->arg[0]) == RReg)
|
||||||
for (;; i--) {
|
for (;; i--) {
|
||||||
r = BASE(i->arg[0].val);
|
r = RBASE(i->arg[0].val);
|
||||||
assert(req(i->to, R) || i->to.type == RTmp);
|
assert(req(i->to, R) || i->to.type == RTmp);
|
||||||
if (req(i->to, R)) {
|
if (req(i->to, R)) {
|
||||||
if (BGET(m->br, r)) {
|
if (BGET(m->br, r)) {
|
||||||
|
@ -285,10 +285,10 @@ rega(Fn *fn)
|
||||||
continue;
|
continue;
|
||||||
if (rtype(i->arg[0]) == RTmp
|
if (rtype(i->arg[0]) == RTmp
|
||||||
&& rtype(i->to) == RReg)
|
&& rtype(i->to) == RReg)
|
||||||
tmp[i->arg[0].val].hint = BASE(i->to.val);
|
tmp[i->arg[0].val].hint = RBASE(i->to.val);
|
||||||
if (rtype(i->to) == RTmp
|
if (rtype(i->to) == RTmp
|
||||||
&& rtype(i->arg[0]) == RReg)
|
&& rtype(i->arg[0]) == RReg)
|
||||||
tmp[i->to.val].hint = BASE(i->arg[0].val);
|
tmp[i->to.val].hint = RBASE(i->arg[0].val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 2. assign registers backwards */
|
/* 2. assign registers backwards */
|
||||||
|
@ -343,7 +343,7 @@ rega(Fn *fn)
|
||||||
i->to = reg(r, i->to.val);
|
i->to = reg(r, i->to.val);
|
||||||
break;
|
break;
|
||||||
case RReg:
|
case RReg:
|
||||||
r = BASE(i->to.val);
|
r = RBASE(i->to.val);
|
||||||
assert(BGET(cur.br, r));
|
assert(BGET(cur.br, r));
|
||||||
BCLR(cur.br, r);
|
BCLR(cur.br, r);
|
||||||
break;
|
break;
|
||||||
|
@ -363,7 +363,7 @@ rega(Fn *fn)
|
||||||
i->arg[0] = ralloc(&cur, t);
|
i->arg[0] = ralloc(&cur, t);
|
||||||
break;
|
break;
|
||||||
case RReg:
|
case RReg:
|
||||||
BSET(cur.br, BASE(i->arg[0].val));
|
BSET(cur.br, RBASE(i->arg[0].val));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
switch (rtype(i->arg[1])) {
|
switch (rtype(i->arg[1])) {
|
||||||
|
@ -372,7 +372,7 @@ rega(Fn *fn)
|
||||||
i->arg[1] = ralloc(&cur, t);
|
i->arg[1] = ralloc(&cur, t);
|
||||||
break;
|
break;
|
||||||
case RReg:
|
case RReg:
|
||||||
BSET(cur.br, BASE(i->arg[1].val));
|
BSET(cur.br, RBASE(i->arg[1].val));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue