void MacroAssemblerX86::branchTestValue(Condition cond, const ValueOperand &value, const Value &v, Label *label) { jsval_layout jv = JSVAL_TO_IMPL(v); if (v.isMarkable()) cmpl(value.payloadReg(), ImmGCPtr(reinterpret_cast<gc::Cell *>(v.toGCThing()))); else cmpl(value.payloadReg(), Imm32(jv.s.payload.i32)); if (cond == Equal) { Label done; j(NotEqual, &done); { cmpl(value.typeReg(), Imm32(jv.s.tag)); j(Equal, label); } bind(&done); } else { MOZ_ASSERT(cond == NotEqual); j(NotEqual, label); cmpl(value.typeReg(), Imm32(jv.s.tag)); j(NotEqual, label); } }
void MacroAssembler::branchTestValue(Condition cond, const ValueOperand& lhs, const Value& rhs, Label* label) { MOZ_ASSERT(cond == Equal || cond == NotEqual); jsval_layout jv = JSVAL_TO_IMPL(rhs); if (rhs.isMarkable()) cmpPtr(lhs.payloadReg(), ImmGCPtr(reinterpret_cast<gc::Cell*>(rhs.toGCThing()))); else cmpPtr(lhs.payloadReg(), ImmWord(jv.s.payload.i32)); if (cond == Equal) { Label done; j(NotEqual, &done); { cmp32(lhs.typeReg(), Imm32(jv.s.tag)); j(Equal, label); } bind(&done); } else { j(NotEqual, label); cmp32(lhs.typeReg(), Imm32(jv.s.tag)); j(NotEqual, label); } }
static void NukeSlot(JSObject *wrapper, uint32_t slot, Value v) { Value old = wrapper->getSlot(slot); if (old.isMarkable()) { Cell *cell = static_cast<Cell *>(old.toGCThing()); AutoMarkInDeadCompartment amd(cell->compartment()); wrapper->setReservedSlot(slot, v); } else { wrapper->setReservedSlot(slot, v); } }