зеркало из https://github.com/mozilla/gecko-dev.git
Bug 514110 - nanojit: avoid getresv() because it has a redundant test. r=gal.
This commit is contained in:
Родитель
08626ce345
Коммит
e760d49457
|
@ -158,8 +158,7 @@ namespace nanojit
|
||||||
LIns* vic = findVictim(regs, allow);
|
LIns* vic = findVictim(regs, allow);
|
||||||
NanoAssert(vic);
|
NanoAssert(vic);
|
||||||
|
|
||||||
Reservation* resv = getresv(vic);
|
Reservation* resv = vic->resvUsed();
|
||||||
NanoAssert(resv);
|
|
||||||
|
|
||||||
// restore vic
|
// restore vic
|
||||||
Register r = resv->reg;
|
Register r = resv->reg;
|
||||||
|
@ -238,8 +237,7 @@ namespace nanojit
|
||||||
ins = ar.entry[i];
|
ins = ar.entry[i];
|
||||||
if ( !ins )
|
if ( !ins )
|
||||||
continue;
|
continue;
|
||||||
Reservation *r = getresv(ins);
|
Reservation *r = ins->resvUsed();
|
||||||
NanoAssert(r != 0);
|
|
||||||
if (r->arIndex) {
|
if (r->arIndex) {
|
||||||
if (ins->isop(LIR_alloc)) {
|
if (ins->isop(LIR_alloc)) {
|
||||||
int j=i+1;
|
int j=i+1;
|
||||||
|
@ -281,8 +279,7 @@ namespace nanojit
|
||||||
{
|
{
|
||||||
LIns* ins = regs->getActive(r);
|
LIns* ins = regs->getActive(r);
|
||||||
// @todo we should be able to check across RegAlloc's somehow (to include savedGP...)
|
// @todo we should be able to check across RegAlloc's somehow (to include savedGP...)
|
||||||
Reservation *v = getresv(ins);
|
Reservation *v = ins->resvUsed();
|
||||||
NanoAssert(v != 0);
|
|
||||||
NanoAssertMsg( regs->getActive(v->reg)==ins, "Register record mismatch");
|
NanoAssertMsg( regs->getActive(v->reg)==ins, "Register record mismatch");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -299,23 +296,23 @@ namespace nanojit
|
||||||
if (ia == ib)
|
if (ia == ib)
|
||||||
{
|
{
|
||||||
findRegFor(ia, allow);
|
findRegFor(ia, allow);
|
||||||
resva = resvb = getresv(ia);
|
resva = resvb = ia->resvUsed();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
resvb = getresv(ib);
|
resvb = ib->resv();
|
||||||
bool rbDone = (resvb && resvb->reg != UnknownReg && (allow & rmask(resvb->reg)));
|
bool rbDone = (resvb->used && resvb->reg != UnknownReg && (allow & rmask(resvb->reg)));
|
||||||
if (rbDone) {
|
if (rbDone) {
|
||||||
// ib already assigned to an allowable reg, keep that one
|
// ib already assigned to an allowable reg, keep that one
|
||||||
allow &= ~rmask(resvb->reg);
|
allow &= ~rmask(resvb->reg);
|
||||||
}
|
}
|
||||||
Register ra = findRegFor(ia, allow);
|
Register ra = findRegFor(ia, allow);
|
||||||
resva = getresv(ia);
|
resva = ia->resv();
|
||||||
NanoAssert(error() || (resva != 0 && ra != UnknownReg));
|
NanoAssert(error() || (resva->used && ra != UnknownReg));
|
||||||
if (!rbDone) {
|
if (!rbDone) {
|
||||||
allow &= ~rmask(ra);
|
allow &= ~rmask(ra);
|
||||||
findRegFor(ib, allow);
|
findRegFor(ib, allow);
|
||||||
resvb = getresv(ib);
|
resvb = ib->resvUsed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -402,9 +399,9 @@ namespace nanojit
|
||||||
|
|
||||||
int Assembler::findMemFor(LIns *i)
|
int Assembler::findMemFor(LIns *i)
|
||||||
{
|
{
|
||||||
Reservation* resv = getresv(i);
|
Reservation* resv = i->resv();
|
||||||
if (!resv)
|
if (!resv->used)
|
||||||
(resv = i->resv())->init();
|
resv->init();
|
||||||
if (!resv->arIndex) {
|
if (!resv->arIndex) {
|
||||||
resv->arIndex = arReserve(i);
|
resv->arIndex = arReserve(i);
|
||||||
NanoAssert(resv->arIndex <= _activation.highwatermark);
|
NanoAssert(resv->arIndex <= _activation.highwatermark);
|
||||||
|
@ -414,8 +411,8 @@ namespace nanojit
|
||||||
|
|
||||||
Register Assembler::prepResultReg(LIns *i, RegisterMask allow)
|
Register Assembler::prepResultReg(LIns *i, RegisterMask allow)
|
||||||
{
|
{
|
||||||
Reservation* resv = getresv(i);
|
Reservation* resv = i->resv();
|
||||||
const bool pop = !resv || resv->reg == UnknownReg;
|
const bool pop = !resv->used || resv->reg == UnknownReg;
|
||||||
Register rr = findRegFor(i, allow);
|
Register rr = findRegFor(i, allow);
|
||||||
freeRsrcOf(i, pop);
|
freeRsrcOf(i, pop);
|
||||||
return rr;
|
return rr;
|
||||||
|
@ -438,7 +435,7 @@ namespace nanojit
|
||||||
// detailed description.
|
// detailed description.
|
||||||
void Assembler::freeRsrcOf(LIns *i, bool pop)
|
void Assembler::freeRsrcOf(LIns *i, bool pop)
|
||||||
{
|
{
|
||||||
Reservation* resv = getresv(i);
|
Reservation* resv = i->resvUsed();
|
||||||
int index = resv->arIndex;
|
int index = resv->arIndex;
|
||||||
Register rr = resv->reg;
|
Register rr = resv->reg;
|
||||||
|
|
||||||
|
@ -469,8 +466,8 @@ namespace nanojit
|
||||||
// Get vic's resv, check r matches.
|
// Get vic's resv, check r matches.
|
||||||
NanoAssert(!_allocator.isFree(r));
|
NanoAssert(!_allocator.isFree(r));
|
||||||
NanoAssert(vic == _allocator.getActive(r));
|
NanoAssert(vic == _allocator.getActive(r));
|
||||||
Reservation* resv = getresv(vic);
|
Reservation* resv = vic->resvUsed();
|
||||||
NanoAssert(resv && r == resv->reg);
|
NanoAssert(r == resv->reg);
|
||||||
|
|
||||||
// Free r.
|
// Free r.
|
||||||
_allocator.retire(r);
|
_allocator.retire(r);
|
||||||
|
@ -758,8 +755,7 @@ namespace nanojit
|
||||||
if (i)
|
if (i)
|
||||||
{
|
{
|
||||||
// clear reg allocation, preserve stack allocation.
|
// clear reg allocation, preserve stack allocation.
|
||||||
Reservation* resv = getresv(i);
|
Reservation* resv = i->resvUsed();
|
||||||
NanoAssert(resv != 0);
|
|
||||||
_allocator.retire(r);
|
_allocator.retire(r);
|
||||||
if (r == resv->reg)
|
if (r == resv->reg)
|
||||||
resv->reg = UnknownReg;
|
resv->reg = UnknownReg;
|
||||||
|
@ -917,7 +913,7 @@ namespace nanojit
|
||||||
// is the address of the stack space.
|
// is the address of the stack space.
|
||||||
case LIR_alloc: {
|
case LIR_alloc: {
|
||||||
countlir_alloc();
|
countlir_alloc();
|
||||||
Reservation *resv = getresv(ins);
|
Reservation *resv = ins->resvUsed();
|
||||||
NanoAssert(resv->arIndex != 0);
|
NanoAssert(resv->arIndex != 0);
|
||||||
Register r = resv->reg;
|
Register r = resv->reg;
|
||||||
if (r != UnknownReg) {
|
if (r != UnknownReg) {
|
||||||
|
|
|
@ -677,6 +677,12 @@ namespace nanojit
|
||||||
uint64_t imm64() const;
|
uint64_t imm64() const;
|
||||||
double imm64f() const;
|
double imm64f() const;
|
||||||
Reservation* resv() { return &lastWord; }
|
Reservation* resv() { return &lastWord; }
|
||||||
|
// Like resv(), but asserts that the Reservation is used.
|
||||||
|
Reservation* resvUsed() {
|
||||||
|
Reservation* r = resv();
|
||||||
|
NanoAssert(r->used);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
void* payload() const;
|
void* payload() const;
|
||||||
inline int32_t size() const {
|
inline int32_t size() const {
|
||||||
NanoAssert(isop(LIR_alloc));
|
NanoAssert(isop(LIR_alloc));
|
||||||
|
|
|
@ -330,7 +330,7 @@ namespace nanojit
|
||||||
LIns* lo = ins->oprnd1();
|
LIns* lo = ins->oprnd1();
|
||||||
LIns* hi = ins->oprnd2();
|
LIns* hi = ins->oprnd2();
|
||||||
|
|
||||||
Reservation *resv = getresv(ins);
|
Reservation *resv = ins->resvUsed();
|
||||||
Register rr = resv->reg;
|
Register rr = resv->reg;
|
||||||
|
|
||||||
if (rr != UnknownReg && (rmask(rr) & FpRegs))
|
if (rr != UnknownReg && (rmask(rr) & FpRegs))
|
||||||
|
@ -460,7 +460,7 @@ namespace nanojit
|
||||||
{
|
{
|
||||||
LIns* base = ins->oprnd1();
|
LIns* base = ins->oprnd1();
|
||||||
int db = ins->disp();
|
int db = ins->disp();
|
||||||
Reservation *resv = getresv(ins);
|
Reservation *resv = ins->resvUsed();
|
||||||
Register rr = resv->reg;
|
Register rr = resv->reg;
|
||||||
|
|
||||||
if (rr != UnknownReg && rmask(rr) & XmmRegs)
|
if (rr != UnknownReg && rmask(rr) & XmmRegs)
|
||||||
|
@ -560,9 +560,9 @@ namespace nanojit
|
||||||
|
|
||||||
// if value already in a reg, use that, otherwise
|
// if value already in a reg, use that, otherwise
|
||||||
// try to get it into XMM regs before FPU regs.
|
// try to get it into XMM regs before FPU regs.
|
||||||
Reservation* rA = getresv(value);
|
Reservation* rA = value->resv();
|
||||||
Register rv;
|
Register rv;
|
||||||
int pop = !rA || rA->reg==UnknownReg;
|
int pop = !rA->used || rA->reg==UnknownReg;
|
||||||
if (pop) {
|
if (pop) {
|
||||||
rv = findRegFor(value, config.sse2 ? XmmRegs : FpRegs);
|
rv = findRegFor(value, config.sse2 ? XmmRegs : FpRegs);
|
||||||
} else {
|
} else {
|
||||||
|
@ -813,10 +813,10 @@ namespace nanojit
|
||||||
}
|
}
|
||||||
|
|
||||||
Register rr = prepResultReg(ins, allow);
|
Register rr = prepResultReg(ins, allow);
|
||||||
Reservation* rA = getresv(lhs);
|
Reservation* rA = lhs->resv();
|
||||||
Register ra;
|
Register ra;
|
||||||
// if this is last use of lhs in reg, we can re-use result reg
|
// if this is last use of lhs in reg, we can re-use result reg
|
||||||
if (rA == 0 || (ra = rA->reg) == UnknownReg)
|
if (!rA->used || (ra = rA->reg) == UnknownReg)
|
||||||
ra = findSpecificRegFor(lhs, rr);
|
ra = findSpecificRegFor(lhs, rr);
|
||||||
// else, rA already has a register assigned.
|
// else, rA already has a register assigned.
|
||||||
|
|
||||||
|
@ -912,10 +912,10 @@ namespace nanojit
|
||||||
Register rr = prepResultReg(ins, GpRegs);
|
Register rr = prepResultReg(ins, GpRegs);
|
||||||
|
|
||||||
LIns* lhs = ins->oprnd1();
|
LIns* lhs = ins->oprnd1();
|
||||||
Reservation *rA = getresv(lhs);
|
Reservation *rA = lhs->resv();
|
||||||
// if this is last use of lhs in reg, we can re-use result reg
|
// if this is last use of lhs in reg, we can re-use result reg
|
||||||
Register ra;
|
Register ra;
|
||||||
if (rA == 0 || (ra=rA->reg) == UnknownReg)
|
if (!rA->used || (ra=rA->reg) == UnknownReg)
|
||||||
ra = findSpecificRegFor(lhs, rr);
|
ra = findSpecificRegFor(lhs, rr);
|
||||||
// else, rA already has a register assigned.
|
// else, rA already has a register assigned.
|
||||||
|
|
||||||
|
@ -965,21 +965,21 @@ namespace nanojit
|
||||||
}
|
}
|
||||||
|
|
||||||
Register rleft;
|
Register rleft;
|
||||||
Reservation *rL = getresv(lhs);
|
Reservation *rL = lhs->resv();
|
||||||
|
|
||||||
/* Does LHS have a register yet? If not, re-use the result reg.
|
/* Does LHS have a register yet? If not, re-use the result reg.
|
||||||
* @todo -- If LHS is const, we could eliminate a register use.
|
* @todo -- If LHS is const, we could eliminate a register use.
|
||||||
*/
|
*/
|
||||||
if (rL == NULL || rL->reg == UnknownReg)
|
if (!rL->used || rL->reg == UnknownReg)
|
||||||
rleft = findSpecificRegFor(lhs, rr);
|
rleft = findSpecificRegFor(lhs, rr);
|
||||||
else
|
else
|
||||||
rleft = rL->reg;
|
rleft = rL->reg;
|
||||||
|
|
||||||
Register rright = UnknownReg;
|
Register rright = UnknownReg;
|
||||||
Reservation *rR = getresv(rhs);
|
Reservation *rR = rhs->resv();
|
||||||
|
|
||||||
/* Does RHS have a register yet? If not, try to re-use the result reg. */
|
/* Does RHS have a register yet? If not, try to re-use the result reg. */
|
||||||
if (rr != rleft && (rR == NULL || rR->reg == UnknownReg))
|
if (rr != rleft && (!rR->used || rR->reg == UnknownReg))
|
||||||
rright = findSpecificRegFor(rhs, rr);
|
rright = findSpecificRegFor(rhs, rr);
|
||||||
if (rright == UnknownReg)
|
if (rright == UnknownReg)
|
||||||
rright = findRegFor(rhs, GpRegs & ~(rmask(rleft)));
|
rright = findRegFor(rhs, GpRegs & ~(rmask(rleft)));
|
||||||
|
@ -1085,7 +1085,7 @@ namespace nanojit
|
||||||
|
|
||||||
void Assembler::asm_quad(LInsp ins)
|
void Assembler::asm_quad(LInsp ins)
|
||||||
{
|
{
|
||||||
Reservation *rR = getresv(ins);
|
Reservation *rR = ins->resvUsed();
|
||||||
Register rr = rR->reg;
|
Register rr = rR->reg;
|
||||||
if (rr != UnknownReg)
|
if (rr != UnknownReg)
|
||||||
{
|
{
|
||||||
|
@ -1145,7 +1145,7 @@ namespace nanojit
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Reservation *resv = getresv(ins);
|
Reservation *resv = ins->resvUsed();
|
||||||
Register rr = resv->reg;
|
Register rr = resv->reg;
|
||||||
if (rr == UnknownReg) {
|
if (rr == UnknownReg) {
|
||||||
// store quad in spill loc
|
// store quad in spill loc
|
||||||
|
@ -1168,11 +1168,11 @@ namespace nanojit
|
||||||
LIns *lhs = ins->oprnd1();
|
LIns *lhs = ins->oprnd1();
|
||||||
|
|
||||||
Register rr = prepResultReg(ins, XmmRegs);
|
Register rr = prepResultReg(ins, XmmRegs);
|
||||||
Reservation *rA = getresv(lhs);
|
Reservation *rA = lhs->resv();
|
||||||
Register ra;
|
Register ra;
|
||||||
|
|
||||||
// if this is last use of lhs in reg, we can re-use result reg
|
// if this is last use of lhs in reg, we can re-use result reg
|
||||||
if (rA == 0 || (ra = rA->reg) == UnknownReg) {
|
if (!rA->used || (ra = rA->reg) == UnknownReg) {
|
||||||
ra = findSpecificRegFor(lhs, rr);
|
ra = findSpecificRegFor(lhs, rr);
|
||||||
} else if ((rmask(ra) & XmmRegs) == 0) {
|
} else if ((rmask(ra) & XmmRegs) == 0) {
|
||||||
/* We need this case on AMD64, because it's possible that
|
/* We need this case on AMD64, because it's possible that
|
||||||
|
@ -1203,13 +1203,13 @@ namespace nanojit
|
||||||
LIns* lhs = ins->oprnd1();
|
LIns* lhs = ins->oprnd1();
|
||||||
|
|
||||||
// lhs into reg, prefer same reg as result
|
// lhs into reg, prefer same reg as result
|
||||||
Reservation* rA = getresv(lhs);
|
Reservation* rA = lhs->resv();
|
||||||
// if this is last use of lhs in reg, we can re-use result reg
|
// if this is last use of lhs in reg, we can re-use result reg
|
||||||
if (rA == 0 || rA->reg == UnknownReg)
|
if (!rA->used || rA->reg == UnknownReg)
|
||||||
findSpecificRegFor(lhs, rr);
|
findSpecificRegFor(lhs, rr);
|
||||||
// else, rA already has a different reg assigned
|
// else, rA already has a different reg assigned
|
||||||
|
|
||||||
NanoAssert(getresv(lhs)!=0 && getresv(lhs)->reg==FST0);
|
NanoAssert(rA->used && rA->reg==FST0);
|
||||||
// assume that the lhs is in ST(0) and rhs is on stack
|
// assume that the lhs is in ST(0) and rhs is on stack
|
||||||
FCHS();
|
FCHS();
|
||||||
|
|
||||||
|
@ -1241,8 +1241,8 @@ namespace nanojit
|
||||||
if (p->isconst()) {
|
if (p->isconst()) {
|
||||||
LDi(r, p->imm32());
|
LDi(r, p->imm32());
|
||||||
} else {
|
} else {
|
||||||
Reservation* rA = getresv(p);
|
Reservation* rA = p->resv();
|
||||||
if (rA) {
|
if (rA->used) {
|
||||||
if (rA->reg == UnknownReg) {
|
if (rA->reg == UnknownReg) {
|
||||||
// load it into the arg reg
|
// load it into the arg reg
|
||||||
int d = findMemFor(p);
|
int d = findMemFor(p);
|
||||||
|
@ -1277,13 +1277,13 @@ namespace nanojit
|
||||||
void Assembler::asm_pusharg(LInsp p)
|
void Assembler::asm_pusharg(LInsp p)
|
||||||
{
|
{
|
||||||
// arg goes on stack
|
// arg goes on stack
|
||||||
Reservation* rA = getresv(p);
|
Reservation* rA = p->resv();
|
||||||
if (rA == 0 && p->isconst())
|
if (!rA->used && p->isconst())
|
||||||
{
|
{
|
||||||
// small const we push directly
|
// small const we push directly
|
||||||
PUSHi(p->imm32());
|
PUSHi(p->imm32());
|
||||||
}
|
}
|
||||||
else if (rA == 0 || p->isop(LIR_alloc))
|
else if (!rA->used || p->isop(LIR_alloc))
|
||||||
{
|
{
|
||||||
Register ra = findRegFor(p, GpRegs);
|
Register ra = findRegFor(p, GpRegs);
|
||||||
PUSHr(ra);
|
PUSHr(ra);
|
||||||
|
@ -1331,11 +1331,11 @@ namespace nanojit
|
||||||
}
|
}
|
||||||
|
|
||||||
Register rr = prepResultReg(ins, allow);
|
Register rr = prepResultReg(ins, allow);
|
||||||
Reservation *rA = getresv(lhs);
|
Reservation *rA = lhs->resv();
|
||||||
Register ra;
|
Register ra;
|
||||||
|
|
||||||
// if this is last use of lhs in reg, we can re-use result reg
|
// if this is last use of lhs in reg, we can re-use result reg
|
||||||
if (rA == 0 || (ra = rA->reg) == UnknownReg) {
|
if (!rA->used || (ra = rA->reg) == UnknownReg) {
|
||||||
ra = findSpecificRegFor(lhs, rr);
|
ra = findSpecificRegFor(lhs, rr);
|
||||||
} else if ((rmask(ra) & XmmRegs) == 0) {
|
} else if ((rmask(ra) & XmmRegs) == 0) {
|
||||||
/* We need this case on AMD64, because it's possible that
|
/* We need this case on AMD64, because it's possible that
|
||||||
|
@ -1376,13 +1376,13 @@ namespace nanojit
|
||||||
int db = findMemFor(rhs);
|
int db = findMemFor(rhs);
|
||||||
|
|
||||||
// lhs into reg, prefer same reg as result
|
// lhs into reg, prefer same reg as result
|
||||||
Reservation* rA = getresv(lhs);
|
Reservation* rA = lhs->resv();
|
||||||
// last use of lhs in reg, can reuse rr
|
// last use of lhs in reg, can reuse rr
|
||||||
if (rA == 0 || rA->reg == UnknownReg)
|
if (!rA->used || rA->reg == UnknownReg)
|
||||||
findSpecificRegFor(lhs, rr);
|
findSpecificRegFor(lhs, rr);
|
||||||
// else, rA already has a different reg assigned
|
// else, rA already has a different reg assigned
|
||||||
|
|
||||||
NanoAssert(getresv(lhs)!=0 && getresv(lhs)->reg==FST0);
|
NanoAssert(rA->used && rA->reg==FST0);
|
||||||
// assume that the lhs is in ST(0) and rhs is on stack
|
// assume that the lhs is in ST(0) and rhs is on stack
|
||||||
if (op == LIR_fadd)
|
if (op == LIR_fadd)
|
||||||
{ FADD(db, FP); }
|
{ FADD(db, FP); }
|
||||||
|
@ -1455,9 +1455,9 @@ namespace nanojit
|
||||||
|
|
||||||
SSE_CVTSI2SD(rr, gr);
|
SSE_CVTSI2SD(rr, gr);
|
||||||
|
|
||||||
Reservation* resv = getresv(ins->oprnd1());
|
Reservation* resv = ins->oprnd1()->resv();
|
||||||
Register xr;
|
Register xr;
|
||||||
if (resv && (xr = resv->reg) != UnknownReg && (rmask(xr) & GpRegs))
|
if (resv->used && (xr = resv->reg) != UnknownReg && (rmask(xr) & GpRegs))
|
||||||
{
|
{
|
||||||
LEA(gr, 0x80000000, xr);
|
LEA(gr, 0x80000000, xr);
|
||||||
}
|
}
|
||||||
|
@ -1627,8 +1627,8 @@ namespace nanojit
|
||||||
{
|
{
|
||||||
// compare two different numbers
|
// compare two different numbers
|
||||||
int d = findMemFor(rhs);
|
int d = findMemFor(rhs);
|
||||||
rA = getresv(lhs);
|
rA = lhs->resv();
|
||||||
int pop = !rA || rA->reg == UnknownReg;
|
int pop = !rA->used || rA->reg == UnknownReg;
|
||||||
findSpecificRegFor(lhs, FST0);
|
findSpecificRegFor(lhs, FST0);
|
||||||
// lhs is in ST(0) and rhs is on stack
|
// lhs is in ST(0) and rhs is on stack
|
||||||
FCOM(pop, d, FP);
|
FCOM(pop, d, FP);
|
||||||
|
@ -1636,8 +1636,8 @@ namespace nanojit
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// compare n to itself, this is a NaN test.
|
// compare n to itself, this is a NaN test.
|
||||||
rA = getresv(lhs);
|
rA = lhs->resv();
|
||||||
int pop = !rA || rA->reg == UnknownReg;
|
int pop = !rA->used || rA->reg == UnknownReg;
|
||||||
findSpecificRegFor(lhs, FST0);
|
findSpecificRegFor(lhs, FST0);
|
||||||
// value in ST(0)
|
// value in ST(0)
|
||||||
if (pop)
|
if (pop)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче