Don't clobber compared FP registers when syncing before a double comparison, bug 716119. r=dvander

This commit is contained in:
Brian Hackett 2012-01-13 13:18:51 -08:00
Родитель ca69f1d59f
Коммит 03bf17a000
4 изменённых файлов: 16 добавлений и 4 удалений

Просмотреть файл

@ -1432,13 +1432,24 @@ mjit::Compiler::jsop_relational_double(JSOp op, BoolStub stub, jsbytecode *targe
stubcc.leave();
OOL_STUBCALL(stub, REJOIN_BRANCH);
if (!allocateLeft)
frame.pinReg(fpLeft);
if (!allocateRight)
frame.pinReg(fpRight);
frame.syncAndKillEverything();
Jump j = masm.branchDouble(dblCond, fpLeft, fpRight);
if (allocateLeft)
frame.freeReg(fpLeft);
else
frame.unpinKilledReg(fpLeft);
if (allocateRight)
frame.freeReg(fpRight);
else
frame.unpinKilledReg(fpRight);
frame.popn(2);

Просмотреть файл

@ -1282,7 +1282,7 @@ FrameState::getCallee()
}
inline void
FrameState::unpinKilledReg(RegisterID reg)
FrameState::unpinKilledReg(AnyRegisterID reg)
{
regstate(reg).unpinUnsafe();
freeRegs.putReg(reg);

Просмотреть файл

@ -1498,10 +1498,11 @@ FrameState::syncAndKill(Registers kill, Uses uses, Uses ignore)
if (!fe || deadEntry(fe, ignore.nuses))
continue;
JS_ASSERT(fe->isTracked() && !fe->isType(JSVAL_TYPE_DOUBLE));
JS_ASSERT(fe->isTracked());
if (regstate(reg).type() == RematInfo::DATA) {
JS_ASSERT(fe->data.reg() == reg.reg());
JS_ASSERT_IF(reg.isFPReg(), fe->data.fpreg() == reg.fpreg());
JS_ASSERT_IF(!reg.isFPReg(), fe->data.reg() == reg.reg());
JS_ASSERT(fe->data.synced());
fe->data.setMemory();
} else {

Просмотреть файл

@ -806,7 +806,7 @@ class FrameState
/*
* Same as unpinReg(), but does not restore the FrameEntry.
*/
inline void unpinKilledReg(RegisterID reg);
inline void unpinKilledReg(AnyRegisterID reg);
/* Pins a data or type register if one exists. */
MaybeRegisterID maybePinData(FrameEntry *fe);