mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
[JAEGER] Keep track of which operations result in numbers.
This commit is contained in:
parent
60ca899930
commit
a872d66e6e
@ -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 */
|
||||
|
@ -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()) {
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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())
|
||||
|
Loading…
Reference in New Issue
Block a user