[JAEGER] Keep track of which operations result in numbers.

This commit is contained in:
David Anderson 2010-07-22 17:34:29 -07:00
parent 60ca899930
commit a872d66e6e
5 changed files with 57 additions and 12 deletions

View File

@ -96,11 +96,16 @@ class FrameEntry
return v_.s.payload.u32;
}
bool isCachedNumber() const {
return isNumber;
}
private:
void setType(JSValueType type_) {
type.setConstant();
v_.s.tag = JSVAL_TYPE_TO_TAG(type_);
knownType = type_;
JS_ASSERT(!isNumber);
}
void track(uint32 index) {
@ -111,6 +116,7 @@ class FrameEntry
void clear() {
copied = false;
copy = NULL;
isNumber = false;
}
uint32 trackerIndex() {
@ -195,7 +201,8 @@ class FrameEntry
uint32 index_;
FrameEntry *copy;
bool copied;
char padding[3];
bool isNumber;
char padding[2];
};
} /* namespace mjit */

View File

@ -296,6 +296,28 @@ FrameState::pushTypedPayload(JSValueType type, RegisterID payload)
regstate[payload] = RegisterState(fe, RematInfo::DATA);
}
inline void
FrameState::pushNumber(MaybeRegisterID payload)
{
JS_ASSERT_IF(payload.isSet(), !freeRegs.hasReg(payload.reg()));
FrameEntry *fe = rawPush();
fe->clear();
JS_ASSERT(!fe->isNumber);
fe->type.setMemory();
fe->isNumber = true;
if (payload.isSet()) {
fe->data.unsync();
fe->data.setRegister(payload.reg());
regstate[payload.reg()] = RegisterState(fe, RematInfo::DATA);
} else {
fe->data.setMemory();
}
}
inline void
FrameState::pushUntypedPayload(JSValueType type, RegisterID payload,
bool popGuaranteed, bool fastType)
@ -478,6 +500,9 @@ FrameState::learnType(FrameEntry *fe, JSValueType type)
{
if (fe->type.inRegister())
forgetReg(fe->type.reg());
#ifdef DEBUG
fe->isNumber = false;
#endif
fe->setType(type);
}
@ -727,20 +752,20 @@ FrameState::giveOwnRegs(FrameEntry *fe)
inline void
FrameState::loadDouble(FrameEntry *fe, FPRegisterID fpReg, Assembler &masm) const
{
if (fe->type.synced() && fe->data.synced()) {
masm.loadDouble(addressOf(fe), fpReg);
return;
}
if (fe->isCopy()) {
FrameEntry *backing = fe->copyOf();
if (backing->type.synced() && backing->data.synced()) {
if (backing->isCachedNumber() || (backing->type.synced() && backing->data.synced())) {
masm.loadDouble(addressOf(backing), fpReg);
return;
}
fe = backing;
}
if ((fe->type.synced() && fe->data.synced()) || fe->isCachedNumber()) {
masm.loadDouble(addressOf(fe), fpReg);
return;
}
Address address = addressOf(fe);
do {
if (!fe->data.synced()) {

View File

@ -714,6 +714,7 @@ FrameState::pushCopyOf(uint32 index)
fe->setType(backing->getKnownType());
else
fe->type.invalidate();
fe->isNumber = backing->isNumber;
fe->data.invalidate();
if (backing->isCopy()) {
backing = backing->copyOf();
@ -872,6 +873,7 @@ FrameState::storeLocal(uint32 n, bool popGuaranteed, bool typeChange)
else
localFe->type.invalidate();
localFe->data.invalidate();
localFe->isNumber = backing->isNumber;
return;
}
@ -938,6 +940,7 @@ FrameState::storeLocal(uint32 n, bool popGuaranteed, bool typeChange)
backing->type.invalidate();
backing->data.invalidate();
backing->setCopyOf(localFe);
backing->isNumber = localFe->isNumber;
localFe->setCopied();
JS_ASSERT(top->copyOf() == localFe);

View File

@ -246,6 +246,11 @@ class FrameState
bool popGuaranteed = false,
bool fastTyped = false);
/*
* Pushes a number onto the operation stack.
*/
inline void pushNumber(MaybeRegisterID payload);
/*
* Pops a value off the operation stack, freeing any of its resources.
*/

View File

@ -242,7 +242,7 @@ mjit::Compiler::loadDouble(FrameEntry *fe, FPRegisterID fpReg)
if (fe->isConstant()) {
slowLoadConstantDouble(masm, fe, fpReg);
} else if (!fe->isTypeKnown()) {
//frame.tempRegForType(fe);
frame.tempRegForType(fe);
Jump j = frame.testDouble(Assembler::Equal, fe);
notNumber = frame.testInt32(Assembler::NotEqual, fe);
frame.convertInt32ToDouble(masm, fe, fpReg);
@ -251,6 +251,7 @@ mjit::Compiler::loadDouble(FrameEntry *fe, FPRegisterID fpReg)
frame.loadDouble(fe, fpReg, masm);
converted.linkTo(masm.label(), &masm);
} else if (fe->getKnownType() == JSVAL_TYPE_INT32) {
frame.tempRegForData(fe);
frame.convertInt32ToDouble(masm, fe, fpReg);
} else {
JS_ASSERT(fe->getKnownType() == JSVAL_TYPE_DOUBLE);
@ -290,7 +291,7 @@ mjit::Compiler::jsop_binary_double(FrameEntry *lhs, FrameEntry *rhs, JSOp op, Vo
stubcc.call(stub);
frame.popn(2);
frame.pushSynced();
frame.pushNumber(MaybeRegisterID());
stubcc.rejoin(Changes(1));
}
@ -308,7 +309,7 @@ mjit::Compiler::jsop_binary_full_simple(FrameEntry *fe, JSOp op, VoidStub stub)
loadDouble(fe, FPRegisters::First);
EmitDoubleOp(op, FPRegisters::First, FPRegisters::First, masm);
frame.popn(2);
frame.pushSynced();
frame.pushNumber(MaybeRegisterID());
return;
}
@ -394,9 +395,11 @@ mjit::Compiler::jsop_binary_full_simple(FrameEntry *fe, JSOp op, VoidStub stub)
stubcc.leave();
stubcc.call(stub);
masm.storeTypeTag(ImmType(JSVAL_TYPE_INT32), frame.addressOf(lhs));
/* Finish up stack operations. */
frame.popn(2);
frame.pushUntypedPayload(JSVAL_TYPE_INT32, regs.result);
frame.pushNumber(regs.result);
/* Merge back OOL double paths. */
if (doublePathDone.isSet())
@ -644,9 +647,11 @@ mjit::Compiler::jsop_binary_full(FrameEntry *lhs, FrameEntry *rhs, JSOp op, Void
stubcc.leave();
stubcc.call(stub);
masm.storeTypeTag(ImmType(JSVAL_TYPE_INT32), frame.addressOf(lhs));
/* Finish up stack operations. */
frame.popn(2);
frame.pushUntypedPayload(JSVAL_TYPE_INT32, regs.result);
frame.pushNumber(regs.result);
/* Merge back OOL double paths. */
if (doublePathDone.isSet())