Bug 1373290 - Move object/string pre-barrier null check to JIT code. r=nbp

This commit is contained in:
Jan de Mooij 2017-06-16 14:57:14 +02:00
Родитель c0de281328
Коммит 3adc938ea8
7 изменённых файлов: 41 добавлений и 4 удалений

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

@ -1037,6 +1037,8 @@ class MacroAssembler : public MacroAssemblerSpecific
inline void branchPtr(Condition cond, const Address& lhs, ImmGCPtr rhs, Label* label) PER_SHARED_ARCH;
inline void branchPtr(Condition cond, const Address& lhs, ImmWord rhs, Label* label) PER_SHARED_ARCH;
inline void branchPtr(Condition cond, const BaseIndex& lhs, ImmWord rhs, Label* label) PER_SHARED_ARCH;
inline void branchPtr(Condition cond, const AbsoluteAddress& lhs, Register rhs, Label* label)
DEFINED_ON(arm, arm64, mips_shared, x86, x64);
inline void branchPtr(Condition cond, const AbsoluteAddress& lhs, ImmWord rhs, Label* label)
@ -1654,6 +1656,8 @@ class MacroAssembler : public MacroAssemblerSpecific
if (type == MIRType::Value)
branchTestGCThing(Assembler::NotEqual, address, &done);
else if (type == MIRType::Object || type == MIRType::String)
branchPtr(Assembler::Equal, address, ImmWord(0), &done);
Push(PreBarrierReg);
computeEffectiveAddress(address, PreBarrierReg);

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

@ -1433,15 +1433,15 @@ MarkValueFromIon(JSRuntime* rt, Value* vp)
void
MarkStringFromIon(JSRuntime* rt, JSString** stringp)
{
if (*stringp)
TraceManuallyBarrieredEdge(&rt->gc.marker, stringp, "write barrier");
MOZ_ASSERT(*stringp);
TraceManuallyBarrieredEdge(&rt->gc.marker, stringp, "write barrier");
}
void
MarkObjectFromIon(JSRuntime* rt, JSObject** objp)
{
if (*objp)
TraceManuallyBarrieredEdge(&rt->gc.marker, objp, "write barrier");
MOZ_ASSERT(*objp);
TraceManuallyBarrieredEdge(&rt->gc.marker, objp, "write barrier");
}
void

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

@ -1457,6 +1457,12 @@ MacroAssembler::branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register rh
branchPtr(cond, scratch2, rhs, label);
}
void
MacroAssembler::branchPtr(Condition cond, const BaseIndex& lhs, ImmWord rhs, Label* label)
{
branch32(cond, lhs, Imm32(rhs.value), label);
}
template <typename T>
inline CodeOffsetJump
MacroAssembler::branchPtrWithPatch(Condition cond, Register lhs, T rhs, RepatchLabel* label)

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

@ -1032,6 +1032,17 @@ MacroAssembler::branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register rh
branchPtr(cond, scratch, rhs, label);
}
void
MacroAssembler::branchPtr(Condition cond, const BaseIndex& lhs, ImmWord rhs, Label* label)
{
vixl::UseScratchRegisterScope temps(this);
const Register scratch = temps.AcquireX().asUnsized();
MOZ_ASSERT(scratch != lhs.base);
MOZ_ASSERT(scratch != lhs.index);
loadPtr(lhs, scratch);
branchPtr(cond, scratch, rhs, label);
}
template <typename T>
CodeOffsetJump
MacroAssembler::branchPtrWithPatch(Condition cond, Register lhs, T rhs, RepatchLabel* label)

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

@ -571,6 +571,13 @@ MacroAssembler::branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register rh
branchPtr(cond, SecondScratchReg, rhs, label);
}
void
MacroAssembler::branchPtr(Condition cond, const BaseIndex& lhs, ImmWord rhs, Label* label)
{
loadPtr(lhs, SecondScratchReg);
branchPtr(cond, SecondScratchReg, rhs, label);
}
template <typename T>
CodeOffsetJump
MacroAssembler::branchPtrWithPatch(Condition cond, Register lhs, T rhs, RepatchLabel* label)

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

@ -871,6 +871,9 @@ class Assembler : public AssemblerX86Shared
case Operand::MEM_REG_DISP:
masm.cmpq_im(rhs.value, lhs.disp(), lhs.base());
break;
case Operand::MEM_SCALE:
masm.cmpq_im(rhs.value, lhs.disp(), lhs.base(), lhs.index(), lhs.scale());
break;
case Operand::MEM_ADDRESS32:
masm.cmpq_im(rhs.value, lhs.address());
break;

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

@ -582,6 +582,12 @@ MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmWord rhs, Label
branchPtrImpl(cond, lhs, rhs, label);
}
void
MacroAssembler::branchPtr(Condition cond, const BaseIndex& lhs, ImmWord rhs, Label* label)
{
branchPtrImpl(cond, lhs, rhs, label);
}
template <typename T, typename S, typename L>
void
MacroAssembler::branchPtrImpl(Condition cond, const T& lhs, const S& rhs, L label)