[JAEGER] Convert FrameState to use types, not tags.

This commit is contained in:
David Anderson 2010-07-01 01:17:42 -07:00
parent 88a1f5a480
commit 3d36343449
12 changed files with 179 additions and 151 deletions

View File

@ -3425,12 +3425,22 @@ class Value
return data.asBits;
}
JSValueType extractNonDoubleObjectType() const {
return JSVAL_EXTRACT_NON_DOUBLE_OBJECT_TYPE_IMPL(data);
JSValueType extractNonDoubleType() const {
return JSVAL_EXTRACT_TYPE_IMPL(data);
}
JSValueTag extractNonDoubleObjectTag() const {
return JSVAL_EXTRACT_NON_DOUBLE_OBJECT_TAG_IMPL(data);
JSValueTag extractNonDoubleTag() const {
return JSVAL_EXTRACT_TAG_IMPL(data);
}
JSValueType extractNonDoubleObjectTraceType() const {
JS_ASSERT(!isObject());
return JSVAL_EXTRACT_TYPE_IMPL(data);
}
JSValueTag extractNonDoubleObjectTraceTag() const {
JS_ASSERT(!isObject());
return JSVAL_EXTRACT_TAG_IMPL(data);
}
void unboxNonDoubleTo(uint64 *out) const {

View File

@ -600,18 +600,18 @@ JSVAL_SAME_TYPE_IMPL(jsval_layout lhs, jsval_layout rhs)
}
static JS_ALWAYS_INLINE JSValueType
JSVAL_EXTRACT_NON_DOUBLE_OBJECT_TYPE_IMPL(jsval_layout l)
JSVAL_EXTRACT_TYPE_IMPL(jsval_layout l)
{
uint32 type = l.s.tag & 0xF;
JS_ASSERT(type > JSVAL_TYPE_DOUBLE && type < JSVAL_TYPE_OBJECT);
JS_ASSERT(type > JSVAL_TYPE_DOUBLE && type <= JSVAL_TYPE_OBJECT);
return (JSValueType)type;
}
static JS_ALWAYS_INLINE JSValueTag
JSVAL_EXTRACT_NON_DOUBLE_OBJECT_TAG_IMPL(jsval_layout l)
JSVAL_EXTRACT_TAG_IMPL(jsval_layout l)
{
JSValueTag tag = l.s.tag;
JS_ASSERT(tag >= JSVAL_TAG_INT32 && tag != JSVAL_TAG_OBJECT);
JS_ASSERT(tag >= JSVAL_TAG_INT32);
return tag;
}

View File

@ -1043,7 +1043,7 @@ GetPromotedType(const Value &v)
return JSVAL_TYPE_DOUBLE;
if (v.isObject())
return v.asObject().isFunction() ? JSVAL_TYPE_FUNOBJ : JSVAL_TYPE_NONFUNOBJ;
return v.extractNonDoubleObjectType();
return v.extractNonDoubleObjectTraceType();
}
/* Return JSVAL_TYPE_INT32 for all whole numbers that fit into signed 32-bit and the tag otherwise. */
@ -1058,7 +1058,7 @@ getCoercedType(const Value &v)
}
if (v.isObject())
return v.asObject().isFunction() ? JSVAL_TYPE_FUNOBJ : JSVAL_TYPE_NONFUNOBJ;
return v.extractNonDoubleObjectType();
return v.extractNonDoubleObjectTraceType();
}
/* Constant seed and accumulate step borrowed from the DJB hash. */
@ -3820,7 +3820,7 @@ TraceRecorder::determineSlotType(Value* vp)
if (vp->isObject())
return vp->asObject().isFunction() ? JSVAL_TYPE_FUNOBJ : JSVAL_TYPE_NONFUNOBJ;
return vp->extractNonDoubleObjectType();
return vp->extractNonDoubleObjectTraceType();
}
class DetermineTypesVisitor : public SlotVisitorBase
@ -9452,7 +9452,7 @@ TraceRecorder::unbox_value(const Value &v, LIns *vaddr_ins, ptrdiff_t offset, VM
return unbox_object(vaddr_ins, offset, tag_ins, type, exit, accSet);
}
JSValueType type = v.extractNonDoubleObjectType();
JSValueType type = v.extractNonDoubleObjectTraceType();
return unbox_non_double_object(vaddr_ins, offset, tag_ins, type, exit, accSet);
}
@ -9500,7 +9500,7 @@ TraceRecorder::box_value_into(const Value &v, LIns *v_ins, LIns *dstaddr_ins, pt
} else if (v.isNull()) {
box_null_into(dstaddr_ins, offset, accSet);
} else {
JSValueTag tag = v.isObject() ? JSVAL_TAG_OBJECT : v.extractNonDoubleObjectTag();
JSValueTag tag = v.isObject() ? JSVAL_TAG_OBJECT : v.extractNonDoubleObjectTraceTag();
lir->insStore(INS_CONSTU(tag), dstaddr_ins, offset + sTagOffset, ACC_OTHER);
lir->insStore(v_ins, dstaddr_ins, offset + sPayloadOffset, ACC_OTHER);
}

View File

@ -967,7 +967,7 @@ mjit::Compiler::generateMethod()
stubCall(stubs::NewInitObject, Uses(0), Defs(1));
}
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_OBJECT, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, Registers::ReturnReg);
}
END_CASE(JSOP_NEWINIT)
@ -1099,7 +1099,7 @@ mjit::Compiler::generateMethod()
masm.move(ImmPtr(fun), Registers::ArgReg1);
stubCall(stubs::Lambda, Uses(0), Defs(1));
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_OBJECT, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, Registers::ReturnReg);
}
END_CASE(JSOP_LAMBDA)
@ -1135,7 +1135,7 @@ mjit::Compiler::generateMethod()
masm.move(ImmPtr(fun), Registers::ArgReg1);
stubCall(stubs::DefLocalFun, Uses(0), Defs(0));
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_OBJECT, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, Registers::ReturnReg);
frame.storeLocal(slot);
frame.pop();
}
@ -1163,7 +1163,7 @@ mjit::Compiler::generateMethod()
masm.move(ImmPtr(regex), Registers::ArgReg1);
stubCall(stubs::RegExp, Uses(0), Defs(1));
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_OBJECT, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, Registers::ReturnReg);
}
END_CASE(JSOP_REGEXP)
@ -1255,7 +1255,7 @@ mjit::Compiler::generateMethod()
stubCall(stubs::NewArray, Uses(len), Defs(1));
frame.popn(len);
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_OBJECT, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, Registers::ReturnReg);
}
END_CASE(JSOP_NEWARRAY)
@ -1266,7 +1266,7 @@ mjit::Compiler::generateMethod()
masm.move(ImmPtr(fun), Registers::ArgReg1);
stubCall(stubs::FlatLambda, Uses(0), Defs(1));
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_OBJECT, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, Registers::ReturnReg);
}
END_CASE(JSOP_LAMBDA_FC)
@ -1294,7 +1294,7 @@ mjit::Compiler::generateMethod()
stubCall(stubs::ConcatN, Uses(argc), Defs(1));
frame.popn(argc);
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_STRING, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_STRING, Registers::ReturnReg);
}
END_CASE(JSOP_CONCATN)
@ -1567,7 +1567,7 @@ mjit::Compiler::inlineCallHelper(uint32 argc, bool callingNew)
FrameEntry *fe = frame.peek(-int(argc + 2));
bool typeKnown = fe->isTypeKnown();
if (typeKnown && fe->getTypeTag() != JSVAL_TAG_OBJECT) {
if (typeKnown && fe->getKnownType() != JSVAL_TYPE_OBJECT) {
VoidPtrStubUInt32 stub = callingNew ? stubs::SlowNew : stubs::SlowCall;
masm.move(Imm32(argc), Registers::ArgReg1);
masm.stubCall(stub, PC, frame.stackDepth() + script->nfixed);
@ -1801,7 +1801,7 @@ mjit::Compiler::emitStubCmpOp(BoolStub stub, jsbytecode *target, JSOp fused)
if (!target) {
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, Registers::ReturnReg);
} else {
JS_ASSERT(fused == JSOP_IFEQ || fused == JSOP_IFNE);
@ -1851,7 +1851,7 @@ mjit::Compiler::jsop_length()
{
FrameEntry *top = frame.peek(-1);
if (top->isTypeKnown() && top->getTypeTag() == JSVAL_TAG_STRING) {
if (top->isTypeKnown() && top->getKnownType() == JSVAL_TYPE_STRING) {
if (top->isConstant()) {
JSString *str = top->getValue().asString();
Value v;
@ -1862,7 +1862,7 @@ mjit::Compiler::jsop_length()
RegisterID str = frame.ownRegForData(top);
masm.loadPtr(Address(str, offsetof(JSString, mLength)), str);
frame.pop();
frame.pushTypedPayload(JSVAL_TAG_INT32, str);
frame.pushTypedPayload(JSVAL_TYPE_INT32, str);
}
return;
}
@ -1884,9 +1884,9 @@ mjit::Compiler::jsop_getprop(JSAtom *atom, bool doTypeCheck)
FrameEntry *top = frame.peek(-1);
/* If the incoming type will never PIC, take slow path. */
if (top->isTypeKnown() && top->getTypeTag() != JSVAL_TAG_OBJECT) {
if (top->isTypeKnown() && top->getKnownType() != JSVAL_TYPE_OBJECT) {
JS_ASSERT_IF(atom == cx->runtime->atomState.lengthAtom,
top->getTypeTag() != JSVAL_TAG_STRING);
top->getKnownType() != JSVAL_TYPE_STRING);
jsop_getprop_slow();
return;
}
@ -2068,7 +2068,7 @@ mjit::Compiler::jsop_callprop_str(JSAtom *atom)
/* Force into a register because getprop won't expect a constant. */
RegisterID reg = frame.allocReg();
masm.move(ImmPtr(obj), reg);
frame.pushTypedPayload(JSVAL_TAG_OBJECT, reg);
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, reg);
/* Get the property. */
jsop_getprop(atom);
@ -2116,7 +2116,7 @@ mjit::Compiler::jsop_callprop_obj(JSAtom *atom)
PICGenInfo pic(ic::PICInfo::CALL);
JS_ASSERT(top->isTypeKnown());
JS_ASSERT(top->getTypeTag() == JSVAL_TAG_OBJECT);
JS_ASSERT(top->getKnownType() == JSVAL_TYPE_OBJECT);
pic.hotPathBegin = masm.label();
pic.hasTypeCheck = false;
@ -2178,8 +2178,8 @@ mjit::Compiler::jsop_callprop(JSAtom *atom)
FrameEntry *top = frame.peek(-1);
/* If the incoming type will never PIC, take slow path. */
if (top->isTypeKnown() && top->getTypeTag() != JSVAL_TAG_OBJECT) {
if (top->getTypeTag() == JSVAL_TAG_STRING)
if (top->isTypeKnown() && top->getKnownType() != JSVAL_TYPE_OBJECT) {
if (top->getKnownType() == JSVAL_TYPE_STRING)
return jsop_callprop_str(atom);
return jsop_callprop_slow(atom);
}
@ -2196,7 +2196,7 @@ mjit::Compiler::jsop_setprop(JSAtom *atom)
FrameEntry *rhs = frame.peek(-1);
/* If the incoming type will never PIC, take slow path. */
if (lhs->isTypeKnown() && lhs->getTypeTag() != JSVAL_TAG_OBJECT) {
if (lhs->isTypeKnown() && lhs->getKnownType() != JSVAL_TYPE_OBJECT) {
jsop_setprop_slow(atom);
return;
}
@ -2212,7 +2212,7 @@ mjit::Compiler::jsop_setprop(JSAtom *atom)
/* Start the hot path where it's easy to patch it. */
pic.hotPathBegin = masm.label();
Jump j = masm.branch32(Assembler::NotEqual, reg, ImmTag(JSVAL_TAG_OBJECT));
Jump j = masm.testObject(Assembler::NotEqual, reg);
pic.typeCheck = stubcc.masm.label();
stubcc.linkExit(j);
@ -2240,7 +2240,7 @@ mjit::Compiler::jsop_setprop(JSAtom *atom)
vr.isConstant = false;
vr.u.s.isTypeKnown = rhs->isTypeKnown();
if (vr.u.s.isTypeKnown) {
vr.u.s.type.tag = rhs->getTypeTag();
vr.u.s.type.tag = rhs->getKnownTag();
} else {
vr.u.s.type.reg = frame.tempRegForType(rhs);
frame.pinReg(vr.u.s.type.reg);
@ -2351,7 +2351,7 @@ mjit::Compiler::jsop_this()
RegisterID reg = frame.allocReg();
masm.loadData32(thisvAddr, reg);
frame.pushTypedPayload(JSVAL_TAG_OBJECT, reg);
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, reg);
} else {
frame.push(thisvAddr);
Jump null = frame.testNull(Assembler::Equal, frame.peek(-1));
@ -2507,7 +2507,7 @@ mjit::Compiler::iterNext()
stubcc.leave();
stubcc.call(stubs::IterNext);
frame.pushUntypedPayload(JSVAL_TAG_STRING, T3);
frame.pushUntypedPayload(JSVAL_TYPE_STRING, T3);
/* Join with the stub call. */
stubcc.rejoin(1);
@ -2588,7 +2588,7 @@ mjit::Compiler::jsop_bindgname()
prepareStubCall();
stubCall(stubs::BindGlobalName, Uses(0), Defs(1));
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_OBJECT, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, Registers::ReturnReg);
}
void
@ -2598,7 +2598,7 @@ mjit::Compiler::jsop_getgname(uint32 index)
jsop_bindgname();
FrameEntry *fe = frame.peek(-1);
JS_ASSERT(fe->isTypeKnown() && fe->getTypeTag() == JSVAL_TAG_OBJECT);
JS_ASSERT(fe->isTypeKnown() && fe->getKnownType() == JSVAL_TYPE_OBJECT);
MICGenInfo mic;
RegisterID objReg;
@ -2674,7 +2674,7 @@ mjit::Compiler::jsop_setgname(uint32 index)
{
#if ENABLE_MIC
FrameEntry *objFe = frame.peek(-2);
JS_ASSERT_IF(objFe->isTypeKnown(), objFe->getTypeTag() == JSVAL_TAG_OBJECT);
JS_ASSERT_IF(objFe->isTypeKnown(), objFe->getKnownType() == JSVAL_TYPE_OBJECT);
MICGenInfo mic;
RegisterID objReg;
@ -2718,7 +2718,7 @@ mjit::Compiler::jsop_setgname(uint32 index)
Value v;
RegisterID typeReg = Registers::ReturnReg;
RegisterID dataReg = Registers::ReturnReg;
JSValueTag typeTag = JSVAL_TAG_INT32;
JSValueType typeTag = JSVAL_TYPE_INT32;
mic.typeConst = fe->isTypeKnown();
mic.dataConst = fe->isConstant();
@ -2729,7 +2729,7 @@ mjit::Compiler::jsop_setgname(uint32 index)
if (!mic.typeConst)
typeReg = frame.ownRegForType(fe);
else
typeTag = fe->getTypeTag();
typeTag = fe->getKnownType();
} else {
v = fe->getValue();
}
@ -2742,7 +2742,7 @@ mjit::Compiler::jsop_setgname(uint32 index)
masm.storeValue(v, address);
} else {
if (mic.typeConst)
masm.storeTypeTag(ImmTag(typeTag), address);
masm.storeTypeTag(ImmType(typeTag), address);
else
masm.storeTypeTag(typeReg, address);
masm.storeData32(dataReg, address);
@ -2803,12 +2803,12 @@ mjit::Compiler::jsop_instanceof()
* thus have fun_instanceOf, which we're inlining.
*/
if (rhs->isTypeKnown() && rhs->getTypeTag() != JSVAL_TAG_OBJECT) {
if (rhs->isTypeKnown() && rhs->getKnownType() != JSVAL_TYPE_OBJECT) {
prepareStubCall();
stubCall(stubs::InstanceOf, Uses(2), Defs(1));
frame.popn(2);
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, Registers::ReturnReg);
return;
}
@ -2873,7 +2873,7 @@ mjit::Compiler::jsop_instanceof()
stubcc.call(stubs::FastInstanceOf);
frame.popn(3);
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, temp);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, temp);
firstSlow.linkTo(stubcc.masm.label(), &stubcc.masm);
stubcc.rejoin(1);

View File

@ -72,19 +72,25 @@ class FrameEntry
return type.isConstant();
}
JSValueTag getTypeTag() const {
JSValueTag getKnownTag() const {
return v_.s.tag;
}
JSValueType getKnownType() const {
JS_ASSERT(isTypeKnown());
return knownType;
}
uint32 getPayload32() const {
//JS_ASSERT(!Valueify(v_.asBits).isDouble() || type.synced());
return v_.s.payload.u32;
}
private:
void setTypeTag(JSValueTag u32) {
void setType(JSValueType type_) {
type.setConstant();
v_.s.tag = u32;
v_.s.tag = JSVAL_TYPE_TO_TAG(type_);
knownType = type_;
}
void track(uint32 index) {
@ -133,6 +139,11 @@ class FrameEntry
type.setConstant();
data.setConstant();
v_.asBits = JSVAL_BITS(v);
Value cv = Valueify(v);
if (cv.isDouble())
knownType = JSVAL_TYPE_DOUBLE;
else
knownType = cv.extractNonDoubleType();
}
bool isCopied() const {
@ -167,13 +178,14 @@ class FrameEntry
}
private:
JSValueType knownType;
jsval_layout v_;
RematInfo type;
RematInfo data;
uint32 index_;
FrameEntry *copy;
bool copied;
char padding[7];
char padding[3];
};
} /* namespace mjit */

View File

@ -216,23 +216,23 @@ FrameState::pushSynced()
}
inline void
FrameState::pushSyncedType(JSValueTag tag)
FrameState::pushSyncedType(JSValueType type)
{
FrameEntry *fe = rawPush();
fe->resetSynced();
fe->setTypeTag(tag);
fe->setType(type);
}
inline void
FrameState::pushSynced(JSValueTag tag, RegisterID reg)
FrameState::pushSynced(JSValueType type, RegisterID reg)
{
FrameEntry *fe = rawPush();
fe->resetUnsynced();
fe->type.sync();
fe->data.sync();
fe->setTypeTag(tag);
fe->setType(type);
fe->data.setRegister(reg);
regstate[reg] = RegisterState(fe, RematInfo::DATA);
}
@ -278,20 +278,20 @@ FrameState::pushRegs(RegisterID type, RegisterID data)
}
inline void
FrameState::pushTypedPayload(JSValueTag tag, RegisterID payload)
FrameState::pushTypedPayload(JSValueType type, RegisterID payload)
{
JS_ASSERT(!freeRegs.hasReg(payload));
FrameEntry *fe = rawPush();
fe->resetUnsynced();
fe->setTypeTag(tag);
fe->setType(type);
fe->data.setRegister(payload);
regstate[payload] = RegisterState(fe, RematInfo::DATA);
}
inline void
FrameState::pushUntypedPayload(JSValueTag tag, RegisterID payload,
FrameState::pushUntypedPayload(JSValueType type, RegisterID payload,
bool popGuaranteed, bool fastType)
{
JS_ASSERT(!freeRegs.hasReg(payload));
@ -308,10 +308,10 @@ FrameState::pushUntypedPayload(JSValueTag tag, RegisterID payload,
* consuming values, so the value has been properly initialized.
*/
if (popGuaranteed) {
fe->setTypeTag(tag);
fe->setType(type);
} else {
if (!fastType || !fe->type.synced())
masm.storeTypeTag(ImmTag(tag), addressOf(fe));
masm.storeTypeTag(ImmType(type), addressOf(fe));
/* The forceful type sync will assert otherwise. */
#ifdef DEBUG
@ -450,7 +450,7 @@ FrameState::syncType(const FrameEntry *fe, Address to, Assembler &masm) const
if (fe->type.isConstant()) {
JS_ASSERT(fe->isTypeKnown());
masm.storeTypeTag(ImmTag(fe->getTypeTag()), to);
masm.storeTypeTag(ImmTag(fe->getKnownTag()), to);
} else {
masm.storeTypeTag(fe->type.reg(), to);
}
@ -483,11 +483,11 @@ FrameState::forgetType(FrameEntry *fe)
}
inline void
FrameState::learnType(FrameEntry *fe, JSValueTag tag)
FrameState::learnType(FrameEntry *fe, JSValueType type)
{
if (fe->type.inRegister())
forgetReg(fe->type.reg());
fe->setTypeTag(tag);
fe->setType(type);
}
inline JSC::MacroAssembler::Address

View File

@ -226,7 +226,7 @@ FrameState::storeTo(FrameEntry *fe, Address address, bool popped)
}
if (fe->isTypeKnown()) {
masm.storeTypeTag(ImmTag(fe->getTypeTag()), address);
masm.storeTypeTag(ImmTag(fe->getKnownTag()), address);
} else if (fe->type.inRegister()) {
masm.storeTypeTag(fe->type.reg(), address);
} else {
@ -341,7 +341,7 @@ FrameState::sync(Assembler &masm) const
/* :TODO: we can do better, the type is learned for all copies. */
if (fe->isTypeKnown()) {
//JS_ASSERT(fe->getTypeTag() == backing->getTypeTag());
masm.storeTypeTag(ImmTag(fe->getTypeTag()), address);
masm.storeTypeTag(ImmTag(fe->getKnownTag()), address);
} else {
masm.storeTypeTag(backing->type.reg(), address);
}
@ -676,7 +676,7 @@ FrameState::pushCopyOf(uint32 index)
fe->setConstant(Jsvalify(backing->getValue()));
} else {
if (backing->isTypeKnown())
fe->setTypeTag(backing->getTypeTag());
fe->setType(backing->getKnownType());
else
fe->type.invalidate();
fe->data.invalidate();
@ -755,7 +755,7 @@ FrameState::uncopy(FrameEntry *original)
moveOwnership(fe->type.reg(), fe);
} else {
JS_ASSERT(fe->isTypeKnown());
JS_ASSERT(fe->getTypeTag() == original->getTypeTag());
JS_ASSERT(fe->getKnownTag() == original->getKnownTag());
}
if (original->data.inMemory() && !fe->data.synced())
tempRegForData(original);
@ -833,7 +833,7 @@ FrameState::storeLocal(uint32 n, bool popGuaranteed, bool typeChange)
localFe->setNotCopied();
localFe->setCopyOf(backing);
if (backing->isTypeKnown())
localFe->setTypeTag(backing->getTypeTag());
localFe->setType(backing->getKnownType());
else
localFe->type.invalidate();
localFe->data.invalidate();
@ -887,7 +887,7 @@ FrameState::storeLocal(uint32 n, bool popGuaranteed, bool typeChange)
if (typeChange) {
if (backing->isTypeKnown()) {
localFe->setTypeTag(backing->getTypeTag());
localFe->setType(backing->getKnownType());
} else {
RegisterID reg = tempRegForType(backing);
localFe->type.setRegister(reg);
@ -895,7 +895,7 @@ FrameState::storeLocal(uint32 n, bool popGuaranteed, bool typeChange)
}
} else {
if (!wasSynced)
masm.storeTypeTag(ImmTag(backing->getTypeTag()), addressOf(localFe));
masm.storeTypeTag(ImmTag(backing->getKnownTag()), addressOf(localFe));
localFe->type.setMemory();
}

View File

@ -160,12 +160,12 @@ class FrameState
/*
* Pushes a slot that has a known, synced type and payload.
*/
inline void pushSyncedType(JSValueTag tag);
inline void pushSyncedType(JSValueType type);
/*
* Pushes a slot that has a known, synced type and payload.
*/
inline void pushSynced(JSValueTag tag, RegisterID reg);
inline void pushSynced(JSValueType type, RegisterID reg);
/*
* Pushes a constant value.
@ -180,7 +180,7 @@ class FrameState
/*
* Pushes a known type and allocated payload onto the operation stack.
*/
inline void pushTypedPayload(JSValueTag tag, RegisterID payload);
inline void pushTypedPayload(JSValueType type, RegisterID payload);
/*
* Pushes a type register and data register pair.
@ -196,7 +196,7 @@ class FrameState
* the value it replaces on the stack had the same tag if the fast-path
* was taken.
*/
inline void pushUntypedPayload(JSValueTag tag, RegisterID payload,
inline void pushUntypedPayload(JSValueType type, RegisterID payload,
bool popGuaranteed = false,
bool fastTyped = false);
@ -416,7 +416,7 @@ class FrameState
/*
* Mark an existing slot with a type.
*/
inline void learnType(FrameEntry *fe, JSValueTag tag);
inline void learnType(FrameEntry *fe, JSValueType type);
/*
* Forget a type, syncing in the process.

View File

@ -203,7 +203,7 @@ ImmutableSync::syncCopy(FrameEntry *fe)
if (fe->isTypeKnown() && !e.learnedType) {
e.learnedType = true;
e.typeTag = fe->getTypeTag();
e.typeTag = fe->getKnownTag();
}
if (!fe->data.synced())
@ -226,7 +226,7 @@ ImmutableSync::syncNormal(FrameEntry *fe)
if (fe->isTypeKnown()) {
e.learnedType = true;
e.typeTag = fe->getTypeTag();
e.typeTag = fe->getKnownTag();
}
if (!fe->data.synced() && !e.dataSynced) {

View File

@ -53,6 +53,13 @@ class ImmTag : public JSC::MacroAssembler::Imm32
{ }
};
struct ImmType : ImmTag
{
ImmType(JSValueType type)
: ImmTag(JSVAL_TYPE_TO_TAG(type))
{ }
};
class Assembler : public BaseAssembler
{
static const uint32 PAYLOAD_OFFSET = 0;

View File

@ -229,7 +229,7 @@ mjit::Compiler::slowLoadConstantDouble(Assembler &masm,
FrameEntry *fe, FPRegisterID fpreg)
{
jsdpun u;
if (fe->getTypeTag() == JSVAL_TAG_INT32)
if (fe->getKnownType() == JSVAL_TYPE_INT32)
u.d = (double)fe->getValue().asInt32();
else
u.d = fe->getValue().asDouble();
@ -248,7 +248,7 @@ mjit::Compiler::maybeJumpIfNotInt32(Assembler &masm, MaybeJump &mj, FrameEntry *
mj.setJump(masm.testInt32(Assembler::NotEqual, mreg.getReg()));
else
mj.setJump(masm.testInt32(Assembler::NotEqual, frame.addressOf(fe)));
} else if (fe->getTypeTag() != JSVAL_TAG_INT32) {
} else if (fe->getKnownType() != JSVAL_TYPE_INT32) {
mj.setJump(masm.jump());
}
}
@ -262,7 +262,7 @@ mjit::Compiler::maybeJumpIfNotDouble(Assembler &masm, MaybeJump &mj, FrameEntry
mj.setJump(masm.testDouble(Assembler::NotEqual, mreg.getReg()));
else
mj.setJump(masm.testDouble(Assembler::NotEqual, frame.addressOf(fe)));
} else if (fe->getTypeTag() >= JSVAL_TAG_CLEAR) {
} else if (fe->getKnownType() != JSVAL_TYPE_DOUBLE) {
mj.setJump(masm.jump());
}
}
@ -283,21 +283,21 @@ mjit::Compiler::jsop_binary(JSOp op, VoidStub stub)
* This is temporary while ops are still being implemented.
*/
if ((op == JSOP_MOD) ||
(lhs->isTypeKnown() && (lhs->getTypeTag() > JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET)) ||
(rhs->isTypeKnown() && (rhs->getTypeTag() > JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET))
(lhs->isTypeKnown() && (lhs->getKnownType() > JSVAL_UPPER_INCL_TYPE_OF_NUMBER_SET)) ||
(rhs->isTypeKnown() && (rhs->getKnownType() > JSVAL_UPPER_INCL_TYPE_OF_NUMBER_SET))
#if defined(JS_CPU_ARM)
/* ARM cannot detect integer overflow with multiplication. */
|| op == JSOP_MUL
#endif /* JS_CPU_ARM */
) {
bool isStringResult = (op == JSOP_ADD) &&
((lhs->isTypeKnown() && lhs->getTypeTag() == JSVAL_TAG_STRING) ||
(rhs->isTypeKnown() && rhs->getTypeTag() == JSVAL_TAG_STRING));
((lhs->isTypeKnown() && lhs->getKnownType() == JSVAL_TYPE_STRING) ||
(rhs->isTypeKnown() && rhs->getKnownType() == JSVAL_TYPE_STRING));
prepareStubCall();
stubCall(stub, Uses(2), Defs(1));
frame.popn(2);
if (isStringResult)
frame.pushSyncedType(JSVAL_TAG_STRING);
frame.pushSyncedType(JSVAL_TYPE_STRING);
else
frame.pushSynced();
return;
@ -305,8 +305,8 @@ mjit::Compiler::jsop_binary(JSOp op, VoidStub stub)
/* Can do int math iff there is no double constant and the op is not division. */
bool canDoIntMath = op != JSOP_DIV &&
!((rhs->isTypeKnown() && rhs->getTypeTag() < JSVAL_TAG_CLEAR) ||
(lhs->isTypeKnown() && lhs->getTypeTag() < JSVAL_TAG_CLEAR));
!((rhs->isTypeKnown() && rhs->getKnownType() == JSVAL_TYPE_DOUBLE) ||
(lhs->isTypeKnown() && lhs->getKnownType() == JSVAL_TYPE_DOUBLE));
frame.syncAllRegs(Registers::AvailRegs);
@ -369,7 +369,7 @@ mjit::Compiler::jsop_binary(JSOp op, VoidStub stub)
Label lblCvtPath2 = stubcc.masm.label();
{
/* Don't bother emitting double conversion for a known double. */
if (!lhs->isTypeKnown() || lhs->getTypeTag() >= JSVAL_TAG_CLEAR) {
if (!lhs->isTypeKnown() || lhs->getKnownType() != JSVAL_TYPE_DOUBLE) {
maybeJumpIfNotInt32(stubcc.masm, jmpCvtPath2NotInt, lhs, lhsTypeReg);
if (!lhs->isConstant())
@ -390,7 +390,7 @@ mjit::Compiler::jsop_binary(JSOp op, VoidStub stub)
Label lblCvtPath3 = stubcc.masm.label();
{
/* Don't bother emitting double checking code for a known int. */
if (!lhs->isTypeKnown() || lhs->getTypeTag() != JSVAL_TAG_INT32) {
if (!lhs->isTypeKnown() || lhs->getKnownType() != JSVAL_TYPE_INT32) {
maybeJumpIfNotDouble(stubcc.masm, jmpCvtPath3NotDbl, lhs, lhsTypeReg);
if (!rhs->isConstant())
@ -545,7 +545,7 @@ mjit::Compiler::jsop_binary(JSOp op, VoidStub stub)
frame.popn(2);
if (canDoIntMath)
frame.pushUntypedPayload(JSVAL_TAG_INT32, returnReg);
frame.pushUntypedPayload(JSVAL_TYPE_INT32, returnReg);
else
frame.pushSynced();
@ -560,7 +560,7 @@ mjit::Compiler::jsop_neg()
{
FrameEntry *fe = frame.peek(-1);
if (fe->isTypeKnown() && fe->getTypeTag() > JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET) {
if (fe->isTypeKnown() && fe->getKnownType() > JSVAL_UPPER_INCL_TYPE_OF_NUMBER_SET) {
prepareStubCall();
stubCall(stubs::Neg, Uses(1), Defs(1));
frame.pop();

View File

@ -65,7 +65,7 @@ mjit::Compiler::jsop_bindname(uint32 index)
stubcc.leave();
stubcc.call(stubs::BindName);
frame.pushTypedPayload(JSVAL_TAG_OBJECT, reg);
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, reg);
stubcc.rejoin(1);
}
@ -76,11 +76,11 @@ mjit::Compiler::jsop_bitnot()
FrameEntry *top = frame.peek(-1);
/* We only want to handle integers here. */
if (top->isTypeKnown() && top->getTypeTag() != JSVAL_TAG_INT32) {
if (top->isTypeKnown() && top->getKnownType() != JSVAL_TYPE_INT32) {
prepareStubCall();
stubCall(stubs::BitNot, Uses(1), Defs(1));
frame.pop();
frame.pushSyncedType(JSVAL_TAG_INT32);
frame.pushSyncedType(JSVAL_TYPE_INT32);
return;
}
@ -89,7 +89,7 @@ mjit::Compiler::jsop_bitnot()
if (!top->isTypeKnown()) {
Jump intFail = frame.testInt32(Assembler::NotEqual, top);
stubcc.linkExit(intFail);
frame.learnType(top, JSVAL_TAG_INT32);
frame.learnType(top, JSVAL_TYPE_INT32);
stubNeeded = true;
}
@ -101,7 +101,7 @@ mjit::Compiler::jsop_bitnot()
RegisterID reg = frame.ownRegForData(top);
masm.not32(reg);
frame.pop();
frame.pushTypedPayload(JSVAL_TAG_INT32, reg);
frame.pushTypedPayload(JSVAL_TYPE_INT32, reg);
if (stubNeeded)
stubcc.rejoin(1);
@ -136,12 +136,12 @@ mjit::Compiler::jsop_bitop(JSOp op)
}
/* We only want to handle integers here. */
if ((rhs->isTypeKnown() && rhs->getTypeTag() != JSVAL_TAG_INT32) ||
(lhs->isTypeKnown() && lhs->getTypeTag() != JSVAL_TAG_INT32)) {
if ((rhs->isTypeKnown() && rhs->getKnownType() != JSVAL_TYPE_INT32) ||
(lhs->isTypeKnown() && lhs->getKnownType() != JSVAL_TYPE_INT32)) {
prepareStubCall();
stubCall(stub, Uses(2), Defs(1));
frame.popn(2);
frame.pushSyncedType(JSVAL_TAG_INT32);
frame.pushSyncedType(JSVAL_TYPE_INT32);
return;
}
@ -150,7 +150,7 @@ mjit::Compiler::jsop_bitop(JSOp op)
if (!rhs->isTypeKnown()) {
Jump rhsFail = frame.testInt32(Assembler::NotEqual, rhs);
stubcc.linkExit(rhsFail);
frame.learnType(rhs, JSVAL_TAG_INT32);
frame.learnType(rhs, JSVAL_TYPE_INT32);
stubNeeded = true;
}
if (!lhs->isTypeKnown()) {
@ -248,7 +248,7 @@ mjit::Compiler::jsop_bitop(JSOp op)
* Type of LHS should be learned already.
*/
frame.popn(2);
frame.pushTypedPayload(JSVAL_TAG_INT32, reg);
frame.pushTypedPayload(JSVAL_TYPE_INT32, reg);
if (stubNeeded)
stubcc.rejoin(1);
return;
@ -302,7 +302,7 @@ mjit::Compiler::jsop_bitop(JSOp op)
frame.pop();
frame.pop();
frame.pushTypedPayload(JSVAL_TAG_INT32, reg);
frame.pushTypedPayload(JSVAL_TYPE_INT32, reg);
if (stubNeeded)
stubcc.rejoin(2);
@ -355,7 +355,7 @@ mjit::Compiler::jsop_globalinc(JSOp op, uint32 index)
masm.storeData32(data, addr);
if (!post && !popped)
frame.pushUntypedPayload(JSVAL_TAG_INT32, data);
frame.pushUntypedPayload(JSVAL_TYPE_INT32, data);
else
frame.freeReg(data);
@ -365,16 +365,12 @@ mjit::Compiler::jsop_globalinc(JSOp op, uint32 index)
}
static inline bool
CheckNullOrUndefined(FrameEntry *fe, JSValueTag &mask)
CheckNullOrUndefined(FrameEntry *fe)
{
if (!fe->isTypeKnown())
return false;
mask = fe->getTypeTag();
if (mask == JSVAL_TAG_NULL)
return true;
else if (mask == JSVAL_TAG_UNDEFINED)
return true;
return false;
JSValueType type = fe->getKnownType();
return type == JSVAL_TYPE_NULL || type == JSVAL_TYPE_UNDEFINED;
}
void
@ -387,8 +383,7 @@ mjit::Compiler::jsop_equality(JSOp op, BoolStub stub, jsbytecode *target, JSOp f
JS_ASSERT(!(rhs->isConstant() && lhs->isConstant()));
bool lhsTest;
JSValueTag mask;
if ((lhsTest = CheckNullOrUndefined(lhs, mask)) || CheckNullOrUndefined(rhs, mask)) {
if ((lhsTest = CheckNullOrUndefined(lhs)) || CheckNullOrUndefined(rhs)) {
/* What's the other mask? */
FrameEntry *test = lhsTest ? rhs : lhs;
@ -431,7 +426,7 @@ mjit::Compiler::jsop_equality(JSOp op, BoolStub stub, jsbytecode *target, JSOp f
j.linkTo(masm.label(), &masm);
masm.move(Imm32(op == JSOP_EQ), reg);
j3.linkTo(masm.label(), &masm);
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, reg);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, reg);
}
return;
}
@ -449,8 +444,8 @@ mjit::Compiler::jsop_relational(JSOp op, BoolStub stub, jsbytecode *target, JSOp
JS_ASSERT(!(rhs->isConstant() && lhs->isConstant()));
/* Always slow path... */
if ((rhs->isTypeKnown() && rhs->getTypeTag() != JSVAL_TAG_INT32) ||
(lhs->isTypeKnown() && lhs->getTypeTag() != JSVAL_TAG_INT32)) {
if ((rhs->isTypeKnown() && rhs->getKnownType() != JSVAL_TYPE_INT32) ||
(lhs->isTypeKnown() && lhs->getKnownType() != JSVAL_TYPE_INT32)) {
if (op == JSOP_EQ || op == JSOP_NE)
jsop_equality(op, stub, target, fused);
else
@ -462,7 +457,7 @@ mjit::Compiler::jsop_relational(JSOp op, BoolStub stub, jsbytecode *target, JSOp
if (!rhs->isTypeKnown()) {
Jump rhsFail = frame.testInt32(Assembler::NotEqual, rhs);
stubcc.linkExit(rhsFail);
frame.learnType(rhs, JSVAL_TAG_INT32);
frame.learnType(rhs, JSVAL_TYPE_INT32);
}
if (!lhs->isTypeKnown()) {
Jump lhsFail = frame.testInt32(Assembler::NotEqual, lhs);
@ -626,7 +621,7 @@ mjit::Compiler::jsop_relational(JSOp op, BoolStub stub, jsbytecode *target, JSOp
frame.pop();
if (reg != resultReg)
frame.freeReg(reg);
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, resultReg);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, resultReg);
stubcc.rejoin(1);
}
}
@ -653,9 +648,9 @@ mjit::Compiler::jsop_not()
}
if (top->isTypeKnown()) {
uint32 mask = top->getTypeTag();
switch (mask) {
case JSVAL_TAG_INT32:
JSValueType type = top->getKnownType();
switch (type) {
case JSVAL_TYPE_INT32:
{
RegisterID data = frame.allocReg(Registers::SingleByteRegs);
if (frame.shouldAvoidDataRemat(top))
@ -666,22 +661,22 @@ mjit::Compiler::jsop_not()
masm.set32(Assembler::Equal, data, Imm32(0), data);
frame.pop();
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, data);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, data);
break;
}
case JSVAL_TAG_BOOLEAN:
case JSVAL_TYPE_BOOLEAN:
{
RegisterID reg = frame.ownRegForData(top);
masm.xor32(Imm32(1), reg);
frame.pop();
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, reg);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, reg);
break;
}
case JSVAL_TAG_OBJECT:
case JSVAL_TYPE_OBJECT:
{
frame.pop();
frame.push(BooleanTag(false));
@ -698,7 +693,7 @@ mjit::Compiler::jsop_not()
masm.xor32(Imm32(1), reg);
frame.pop();
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, reg);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, reg);
break;
}
}
@ -751,7 +746,7 @@ mjit::Compiler::jsop_not()
stubcc.call(stubs::Not);
frame.pop();
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, data);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, data);
stubcc.rejoin(1);
}
@ -765,20 +760,20 @@ mjit::Compiler::jsop_typeof()
JSRuntime *rt = cx->runtime;
JSAtom *atom = NULL;
switch (fe->getTypeTag()) {
case JSVAL_TAG_STRING:
switch (fe->getKnownType()) {
case JSVAL_TYPE_STRING:
atom = rt->atomState.typeAtoms[JSTYPE_STRING];
break;
case JSVAL_TAG_UNDEFINED:
case JSVAL_TYPE_UNDEFINED:
atom = rt->atomState.typeAtoms[JSTYPE_VOID];
break;
case JSVAL_TAG_NULL:
case JSVAL_TYPE_NULL:
atom = rt->atomState.typeAtoms[JSTYPE_OBJECT];
break;
case JSVAL_TAG_OBJECT:
case JSVAL_TYPE_OBJECT:
atom = NULL;
break;
case JSVAL_TAG_BOOLEAN:
case JSVAL_TYPE_BOOLEAN:
atom = rt->atomState.typeAtoms[JSTYPE_BOOLEAN];
break;
default:
@ -797,7 +792,7 @@ mjit::Compiler::jsop_typeof()
stubCall(stubs::TypeOf, Uses(1), Defs(1));
frame.pop();
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_STRING, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_STRING, Registers::ReturnReg);
}
void
@ -828,7 +823,7 @@ mjit::Compiler::jsop_localinc(JSOp op, uint32 slot, bool popped)
fe = frame.peek(-1);
}
if (!fe->isTypeKnown() || fe->getTypeTag() != JSVAL_TAG_INT32) {
if (!fe->isTypeKnown() || fe->getKnownType() != JSVAL_TYPE_INT32) {
/* :TODO: do something smarter for the known-type-is-bad case. */
if (fe->isTypeKnown()) {
Jump j = masm.jump();
@ -856,7 +851,7 @@ mjit::Compiler::jsop_localinc(JSOp op, uint32 slot, bool popped)
Registers::ArgReg1);
stubcc.vpInc(op, depth);
frame.pushUntypedPayload(JSVAL_TAG_INT32, reg, true, true);
frame.pushUntypedPayload(JSVAL_TYPE_INT32, reg, true, true);
frame.storeLocal(slot, post || popped, false);
if (post || popped)
@ -897,7 +892,7 @@ mjit::Compiler::jsop_arginc(JSOp op, uint32 slot, bool popped)
stubcc.masm.addPtr(Imm32(sizeof(Value) * slot), Registers::ArgReg1, Registers::ArgReg1);
stubcc.vpInc(op, depth);
frame.pushTypedPayload(JSVAL_TAG_INT32, reg);
frame.pushTypedPayload(JSVAL_TYPE_INT32, reg);
fe = frame.peek(-1);
reg = frame.allocReg();
@ -921,8 +916,8 @@ mjit::Compiler::jsop_setelem()
FrameEntry *id = frame.peek(-2);
FrameEntry *fe = frame.peek(-1);
if ((obj->isTypeKnown() && obj->getTypeTag() != JSVAL_TAG_OBJECT) ||
(id->isTypeKnown() && id->getTypeTag() != JSVAL_TAG_INT32) ||
if ((obj->isTypeKnown() && obj->getKnownType() != JSVAL_TYPE_OBJECT) ||
(id->isTypeKnown() && id->getKnownType() != JSVAL_TYPE_INT32) ||
(id->isConstant() && id->getValue().asInt32() < 0)) {
jsop_setelem_slow();
return;
@ -977,7 +972,7 @@ mjit::Compiler::jsop_setelem()
} else {
masm.storeData32(frame.tempRegForData(fe), slot);
if (fe->isTypeKnown())
masm.storeTypeTag(ImmTag(fe->getTypeTag()), slot);
masm.storeTypeTag(ImmTag(fe->getKnownTag()), slot);
else
masm.storeTypeTag(frame.tempRegForType(fe), slot);
}
@ -1006,7 +1001,7 @@ mjit::Compiler::jsop_setelem()
} else {
masm.storeData32(frame.tempRegForData(fe), slot);
if (fe->isTypeKnown())
masm.storeTypeTag(ImmTag(fe->getTypeTag()), slot);
masm.storeTypeTag(ImmTag(fe->getKnownTag()), slot);
else
masm.storeTypeTag(frame.tempRegForType(fe), slot);
}
@ -1025,8 +1020,8 @@ mjit::Compiler::jsop_getelem()
FrameEntry *obj = frame.peek(-2);
FrameEntry *id = frame.peek(-1);
if ((obj->isTypeKnown() && obj->getTypeTag() != JSVAL_TAG_OBJECT) ||
(id->isTypeKnown() && id->getTypeTag() != JSVAL_TAG_INT32) ||
if ((obj->isTypeKnown() && obj->getKnownType() != JSVAL_TYPE_OBJECT) ||
(id->isTypeKnown() && id->getKnownType() != JSVAL_TYPE_INT32) ||
(id->isConstant() && id->getValue().asInt32() < 0)) {
jsop_getelem_slow();
return;
@ -1102,18 +1097,18 @@ mjit::Compiler::jsop_getelem()
}
static inline bool
ReallySimpleStrictTest(FrameEntry *fe, JSValueTag &mask)
ReallySimpleStrictTest(FrameEntry *fe)
{
if (!fe->isTypeKnown())
return false;
mask = fe->getTypeTag();
return mask == JSVAL_TAG_NULL || mask == JSVAL_TAG_UNDEFINED;
JSValueType type = fe->getKnownType();
return type == JSVAL_TYPE_NULL || type == JSVAL_TYPE_UNDEFINED;
}
static inline bool
BooleanStrictTest(FrameEntry *fe)
{
return fe->isConstant() && fe->getTypeTag() == JSVAL_TAG_BOOLEAN;
return fe->isConstant() && fe->getKnownType() == JSVAL_TYPE_BOOLEAN;
}
void
@ -1126,16 +1121,20 @@ mjit::Compiler::jsop_stricteq(JSOp op)
/* Comparison against undefined or null is super easy. */
bool lhsTest;
JSValueTag mask;
if ((lhsTest = ReallySimpleStrictTest(lhs, mask)) || ReallySimpleStrictTest(rhs, mask)) {
if ((lhsTest = ReallySimpleStrictTest(lhs)) || ReallySimpleStrictTest(rhs)) {
FrameEntry *test = lhsTest ? rhs : lhs;
if (test->isTypeKnown()) {
FrameEntry *known = lhsTest ? lhs : rhs;
frame.popn(2);
frame.push(BooleanTag((test->getTypeTag() == mask) == (op == JSOP_STRICTEQ)));
frame.push(BooleanTag((test->getKnownType() == known->getKnownType()) ==
(op == JSOP_STRICTEQ)));
return;
}
FrameEntry *known = lhsTest ? lhs : rhs;
JSValueTag mask = known->getKnownTag();
/* This is only true if the other side is |null|. */
RegisterID result = frame.allocReg(Registers::SingleByteRegs);
if (frame.shouldAvoidTypeRemat(test))
@ -1143,7 +1142,7 @@ mjit::Compiler::jsop_stricteq(JSOp op)
else
masm.set32(cond, frame.tempRegForType(test), Imm32(mask), result);
frame.popn(2);
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, result);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, result);
return;
}
@ -1151,7 +1150,7 @@ mjit::Compiler::jsop_stricteq(JSOp op)
if ((lhsTest = BooleanStrictTest(lhs)) || BooleanStrictTest(rhs)) {
FrameEntry *test = lhsTest ? rhs : lhs;
if (test->isTypeKnown() && test->getTypeTag() != JSVAL_TAG_BOOLEAN) {
if (test->isTypeKnown() && test->getKnownType() != JSVAL_TYPE_BOOLEAN) {
frame.popn(2);
frame.push(BooleanTag(op == JSOP_STRICTNE));
return;
@ -1187,7 +1186,7 @@ mjit::Compiler::jsop_stricteq(JSOp op)
}
frame.popn(2);
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, result);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, result);
return;
}
@ -1198,7 +1197,7 @@ mjit::Compiler::jsop_stricteq(JSOp op)
stubCall(stubs::StrictNe, Uses(2), Defs(1));
frame.popn(2);
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TAG_BOOLEAN, Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_TYPE_BOOLEAN, Registers::ReturnReg);
}
void
@ -1207,7 +1206,7 @@ mjit::Compiler::jsop_pos()
FrameEntry *top = frame.peek(-1);
if (top->isTypeKnown()) {
if (top->getTypeTag() <= JSVAL_TAG_INT32)
if (top->getKnownType() <= JSVAL_TYPE_INT32)
return;
prepareStubCall();
stubCall(stubs::Pos, Uses(1), Defs(1));