mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Backed out changeset e92294275e90 (bug 1245112)
This commit is contained in:
parent
55fec6a1c2
commit
45ccebe9a3
@ -336,64 +336,8 @@ MacroAssembler::branchFunctionKind(Condition cond, JSFunction::FunctionKind kind
|
|||||||
branch32(cond, scratch, Imm32(bit), label);
|
branch32(cond, scratch, Imm32(bit), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchTestObjClass(Condition cond, Register obj, Register scratch, const js::Class* clasp,
|
|
||||||
Label* label)
|
|
||||||
{
|
|
||||||
loadObjGroup(obj, scratch);
|
|
||||||
branchPtr(cond, Address(scratch, ObjectGroup::offsetOfClasp()), ImmPtr(clasp), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchTestObjShape(Condition cond, Register obj, const Shape* shape, Label* label)
|
|
||||||
{
|
|
||||||
branchPtr(cond, Address(obj, JSObject::offsetOfShape()), ImmGCPtr(shape), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchTestObjShape(Condition cond, Register obj, Register shape, Label* label)
|
|
||||||
{
|
|
||||||
branchPtr(cond, Address(obj, JSObject::offsetOfShape()), shape, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchTestObjGroup(Condition cond, Register obj, ObjectGroup* group, Label* label)
|
|
||||||
{
|
|
||||||
branchPtr(cond, Address(obj, JSObject::offsetOfGroup()), ImmGCPtr(group), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchTestObjGroup(Condition cond, Register obj, Register group, Label* label)
|
|
||||||
{
|
|
||||||
branchPtr(cond, Address(obj, JSObject::offsetOfGroup()), group, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchTestProxyHandlerFamily(Condition cond, Register proxy, Register scratch,
|
|
||||||
const void* handlerp, Label* label)
|
|
||||||
{
|
|
||||||
Address handlerAddr(proxy, ProxyObject::offsetOfHandler());
|
|
||||||
loadPtr(handlerAddr, scratch);
|
|
||||||
Address familyAddr(scratch, BaseProxyHandler::offsetOfFamily());
|
|
||||||
branchPtr(cond, familyAddr, ImmPtr(handlerp), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef JS_CODEGEN_ARM64
|
#ifndef JS_CODEGEN_ARM64
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void
|
|
||||||
MacroAssembler::branchStackPtr(Condition cond, T rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtr(cond, getStackPointer(), rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void
|
|
||||||
MacroAssembler::branchStackPtrRhs(Condition cond, T lhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtr(cond, lhs, getStackPointer(), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> void
|
template <typename T> void
|
||||||
MacroAssembler::addToStackPtr(T t)
|
MacroAssembler::addToStackPtr(T t)
|
||||||
{
|
{
|
||||||
|
@ -2538,13 +2538,6 @@ MacroAssembler::linkSelfReference(JitCode* code)
|
|||||||
|
|
||||||
//}}} check_macroassembler_style
|
//}}} check_macroassembler_style
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::BranchGCPtr::emit(MacroAssembler& masm)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(isInitialized());
|
|
||||||
masm.branchPtr(cond(), reg(), ptr_, jump());
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace js {
|
namespace js {
|
||||||
namespace jit {
|
namespace jit {
|
||||||
|
|
||||||
|
@ -325,7 +325,10 @@ class MacroAssembler : public MacroAssemblerSpecific
|
|||||||
ptr_(ptr)
|
ptr_(ptr)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void emit(MacroAssembler& masm);
|
void emit(MacroAssembler& masm) {
|
||||||
|
MOZ_ASSERT(isInitialized());
|
||||||
|
masm.branchPtr(cond(), reg(), ptr_, jump());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
mozilla::Maybe<AutoRooter> autoRooter_;
|
mozilla::Maybe<AutoRooter> autoRooter_;
|
||||||
@ -798,25 +801,6 @@ class MacroAssembler : public MacroAssemblerSpecific
|
|||||||
// ===============================================================
|
// ===============================================================
|
||||||
// Branch functions
|
// Branch functions
|
||||||
|
|
||||||
inline void branchPtr(Condition cond, Register lhs, Register rhs, Label* label) PER_SHARED_ARCH;
|
|
||||||
inline void branchPtr(Condition cond, Register lhs, Imm32 rhs, Label* label) PER_SHARED_ARCH;
|
|
||||||
inline void branchPtr(Condition cond, Register lhs, ImmPtr rhs, Label* label) PER_SHARED_ARCH;
|
|
||||||
inline void branchPtr(Condition cond, Register lhs, ImmGCPtr rhs, Label* label) PER_SHARED_ARCH;
|
|
||||||
inline void branchPtr(Condition cond, Register lhs, ImmWord rhs, Label* label) PER_SHARED_ARCH;
|
|
||||||
|
|
||||||
inline void branchPtr(Condition cond, const Address& lhs, Register rhs, Label* label) PER_SHARED_ARCH;
|
|
||||||
inline void branchPtr(Condition cond, const Address& lhs, ImmPtr rhs, Label* label) PER_SHARED_ARCH;
|
|
||||||
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 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)
|
|
||||||
DEFINED_ON(arm, arm64, mips_shared, x86, x64);
|
|
||||||
|
|
||||||
inline void branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register rhs, Label* label)
|
|
||||||
DEFINED_ON(arm, arm64, mips_shared, x86, x64);
|
|
||||||
|
|
||||||
// This function compares a Value (lhs) which is having a private pointer
|
// This function compares a Value (lhs) which is having a private pointer
|
||||||
// boxed inside a js::Value, with a raw pointer (rhs).
|
// boxed inside a js::Value, with a raw pointer (rhs).
|
||||||
inline void branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label) PER_ARCH;
|
inline void branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label) PER_ARCH;
|
||||||
@ -848,14 +832,30 @@ class MacroAssembler : public MacroAssemblerSpecific
|
|||||||
loadObjGroup(objReg, dest);
|
loadObjGroup(objReg, dest);
|
||||||
loadPtr(Address(dest, ObjectGroup::offsetOfClasp()), dest);
|
loadPtr(Address(dest, ObjectGroup::offsetOfClasp()), dest);
|
||||||
}
|
}
|
||||||
inline void branchTestObjClass(Condition cond, Register obj, Register scratch, const js::Class* clasp,
|
void branchTestObjClass(Condition cond, Register obj, Register scratch, const js::Class* clasp,
|
||||||
Label* label);
|
Label* label) {
|
||||||
inline void branchTestObjShape(Condition cond, Register obj, const Shape* shape, Label* label);
|
loadObjGroup(obj, scratch);
|
||||||
inline void branchTestObjShape(Condition cond, Register obj, Register shape, Label* label);
|
branchPtr(cond, Address(scratch, ObjectGroup::offsetOfClasp()), ImmPtr(clasp), label);
|
||||||
inline void branchTestObjGroup(Condition cond, Register obj, ObjectGroup* group, Label* label);
|
}
|
||||||
inline void branchTestObjGroup(Condition cond, Register obj, Register group, Label* label);
|
void branchTestObjShape(Condition cond, Register obj, const Shape* shape, Label* label) {
|
||||||
inline void branchTestProxyHandlerFamily(Condition cond, Register proxy, Register scratch,
|
branchPtr(cond, Address(obj, JSObject::offsetOfShape()), ImmGCPtr(shape), label);
|
||||||
const void* handlerp, Label* label);
|
}
|
||||||
|
void branchTestObjShape(Condition cond, Register obj, Register shape, Label* label) {
|
||||||
|
branchPtr(cond, Address(obj, JSObject::offsetOfShape()), shape, label);
|
||||||
|
}
|
||||||
|
void branchTestObjGroup(Condition cond, Register obj, ObjectGroup* group, Label* label) {
|
||||||
|
branchPtr(cond, Address(obj, JSObject::offsetOfGroup()), ImmGCPtr(group), label);
|
||||||
|
}
|
||||||
|
void branchTestObjGroup(Condition cond, Register obj, Register group, Label* label) {
|
||||||
|
branchPtr(cond, Address(obj, JSObject::offsetOfGroup()), group, label);
|
||||||
|
}
|
||||||
|
void branchTestProxyHandlerFamily(Condition cond, Register proxy, Register scratch,
|
||||||
|
const void* handlerp, Label* label) {
|
||||||
|
Address handlerAddr(proxy, ProxyObject::offsetOfHandler());
|
||||||
|
loadPtr(handlerAddr, scratch);
|
||||||
|
Address familyAddr(scratch, BaseProxyHandler::offsetOfFamily());
|
||||||
|
branchPtr(cond, familyAddr, ImmPtr(handlerp), label);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Value>
|
template <typename Value>
|
||||||
void branchTestMIRType(Condition cond, const Value& val, MIRType type, Label* label) {
|
void branchTestMIRType(Condition cond, const Value& val, MIRType type, Label* label) {
|
||||||
@ -1344,9 +1344,13 @@ class MacroAssembler : public MacroAssemblerSpecific
|
|||||||
branchTestPtr(cond, getStackPointer(), t, label);
|
branchTestPtr(cond, getStackPointer(), t, label);
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline void branchStackPtr(Condition cond, T rhs, Label* label);
|
void branchStackPtr(Condition cond, T rhs, Label* label) {
|
||||||
|
branchPtr(cond, getStackPointer(), rhs, label);
|
||||||
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline void branchStackPtrRhs(Condition cond, T lhs, Label* label);
|
void branchStackPtrRhs(Condition cond, T lhs, Label* label) {
|
||||||
|
branchPtr(cond, lhs, getStackPointer(), label);
|
||||||
|
}
|
||||||
#endif // !JS_CODEGEN_ARM64
|
#endif // !JS_CODEGEN_ARM64
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -393,90 +393,6 @@ MacroAssembler::rshift64(Imm32 imm, Register64 dest)
|
|||||||
// ===============================================================
|
// ===============================================================
|
||||||
// Branch functions
|
// Branch functions
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
branch32(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, Imm32 rhs, Label* label)
|
|
||||||
{
|
|
||||||
branch32(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtr(cond, lhs, ImmWord(uintptr_t(rhs.value)), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmGCPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
ScratchRegisterScope scratch(*this);
|
|
||||||
movePtr(rhs, scratch);
|
|
||||||
branchPtr(cond, lhs, scratch, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
branch32(cond, lhs, Imm32(rhs.value), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
branch32(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtr(cond, lhs, ImmWord(uintptr_t(rhs.value)), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmGCPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
AutoRegisterScope scratch2(*this, secondScratchReg_);
|
|
||||||
loadPtr(lhs, scratch2);
|
|
||||||
branchPtr(cond, scratch2, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
AutoRegisterScope scratch2(*this, secondScratchReg_);
|
|
||||||
loadPtr(lhs, scratch2);
|
|
||||||
branchPtr(cond, scratch2, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const AbsoluteAddress& lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
ScratchRegisterScope scratch(*this);
|
|
||||||
loadPtr(lhs, scratch);
|
|
||||||
branchPtr(cond, scratch, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const AbsoluteAddress& lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
ScratchRegisterScope scratch(*this);
|
|
||||||
loadPtr(lhs, scratch);
|
|
||||||
branchPtr(cond, scratch, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
ScratchRegisterScope scratch(*this);
|
|
||||||
loadPtr(lhs, scratch);
|
|
||||||
branchPtr(cond, scratch, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
||||||
{
|
{
|
||||||
|
@ -2963,18 +2963,18 @@ MacroAssemblerARMCompat::branchTestValue(Condition cond, const Address& valaddr,
|
|||||||
// Check payload before tag, since payload is more likely to differ.
|
// Check payload before tag, since payload is more likely to differ.
|
||||||
if (cond == NotEqual) {
|
if (cond == NotEqual) {
|
||||||
ma_ldr(ToPayload(valaddr), scratch);
|
ma_ldr(ToPayload(valaddr), scratch);
|
||||||
asMasm().branchPtr(NotEqual, scratch, value.payloadReg(), label);
|
branchPtr(NotEqual, scratch, value.payloadReg(), label);
|
||||||
|
|
||||||
ma_ldr(ToType(valaddr), scratch);
|
ma_ldr(ToType(valaddr), scratch);
|
||||||
asMasm().branchPtr(NotEqual, scratch, value.typeReg(), label);
|
branchPtr(NotEqual, scratch, value.typeReg(), label);
|
||||||
} else {
|
} else {
|
||||||
Label fallthrough;
|
Label fallthrough;
|
||||||
|
|
||||||
ma_ldr(ToPayload(valaddr), scratch);
|
ma_ldr(ToPayload(valaddr), scratch);
|
||||||
asMasm().branchPtr(NotEqual, scratch, value.payloadReg(), &fallthrough);
|
branchPtr(NotEqual, scratch, value.payloadReg(), &fallthrough);
|
||||||
|
|
||||||
ma_ldr(ToType(valaddr), scratch);
|
ma_ldr(ToType(valaddr), scratch);
|
||||||
asMasm().branchPtr(Equal, scratch, value.typeReg(), label);
|
branchPtr(Equal, scratch, value.typeReg(), label);
|
||||||
|
|
||||||
bind(&fallthrough);
|
bind(&fallthrough);
|
||||||
}
|
}
|
||||||
|
@ -818,6 +818,9 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
|
|||||||
load32(lhs, scratch2);
|
load32(lhs, scratch2);
|
||||||
branch32(cond, scratch2, rhs, label);
|
branch32(cond, scratch2, rhs, label);
|
||||||
}
|
}
|
||||||
|
void branchPtr(Condition cond, const Address& lhs, Register rhs, Label* label) {
|
||||||
|
branch32(cond, lhs, rhs, label);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void branchTestDouble(Condition cond, const T & t, Label* label) {
|
void branchTestDouble(Condition cond, const T & t, Label* label) {
|
||||||
@ -918,6 +921,28 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
|
|||||||
void branchTestPtr(Condition cond, const Address& lhs, Imm32 imm, Label* label) {
|
void branchTestPtr(Condition cond, const Address& lhs, Imm32 imm, Label* label) {
|
||||||
branchTest32(cond, lhs, imm, label);
|
branchTest32(cond, lhs, imm, label);
|
||||||
}
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
||||||
|
branch32(cond, lhs, rhs, label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmGCPtr ptr, Label* label) {
|
||||||
|
ScratchRegisterScope scratch(asMasm());
|
||||||
|
movePtr(ptr, scratch);
|
||||||
|
branchPtr(cond, lhs, scratch, label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmWord imm, Label* label) {
|
||||||
|
branch32(cond, lhs, Imm32(imm.value), label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmPtr imm, Label* label) {
|
||||||
|
branchPtr(cond, lhs, ImmWord(uintptr_t(imm.value)), label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, wasm::SymbolicAddress imm, Label* label) {
|
||||||
|
ScratchRegisterScope scratch(asMasm());
|
||||||
|
movePtr(imm, scratch);
|
||||||
|
branchPtr(cond, lhs, scratch, label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, Imm32 imm, Label* label) {
|
||||||
|
branch32(cond, lhs, imm, label);
|
||||||
|
}
|
||||||
void decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label) {
|
void decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label) {
|
||||||
ma_sub(imm, lhs, SetCC);
|
ma_sub(imm, lhs, SetCC);
|
||||||
as_b(label, cond);
|
as_b(label, cond);
|
||||||
@ -942,6 +967,39 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
|
|||||||
ma_cmp(scratch2, ptr);
|
ma_cmp(scratch2, ptr);
|
||||||
return jumpWithPatch(label, cond);
|
return jumpWithPatch(label, cond);
|
||||||
}
|
}
|
||||||
|
void branchPtr(Condition cond, Address addr, ImmGCPtr ptr, Label* label) {
|
||||||
|
AutoRegisterScope scratch2(asMasm(), secondScratchReg_);
|
||||||
|
ma_ldr(addr, scratch2);
|
||||||
|
ma_cmp(scratch2, ptr);
|
||||||
|
ma_b(label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Address addr, ImmWord ptr, Label* label) {
|
||||||
|
AutoRegisterScope scratch2(asMasm(), secondScratchReg_);
|
||||||
|
ma_ldr(addr, scratch2);
|
||||||
|
ma_cmp(scratch2, ptr);
|
||||||
|
ma_b(label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Address addr, ImmPtr ptr, Label* label) {
|
||||||
|
branchPtr(cond, addr, ImmWord(uintptr_t(ptr.value)), label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, AbsoluteAddress addr, Register ptr, Label* label) {
|
||||||
|
ScratchRegisterScope scratch(asMasm());
|
||||||
|
loadPtr(addr, scratch);
|
||||||
|
ma_cmp(scratch, ptr);
|
||||||
|
ma_b(label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, AbsoluteAddress addr, ImmWord ptr, Label* label) {
|
||||||
|
ScratchRegisterScope scratch(asMasm());
|
||||||
|
loadPtr(addr, scratch);
|
||||||
|
ma_cmp(scratch, ptr);
|
||||||
|
ma_b(label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, wasm::SymbolicAddress addr, Register ptr, Label* label) {
|
||||||
|
ScratchRegisterScope scratch(asMasm());
|
||||||
|
loadPtr(addr, scratch);
|
||||||
|
ma_cmp(scratch, ptr);
|
||||||
|
ma_b(label, cond);
|
||||||
|
}
|
||||||
void branch32(Condition cond, AbsoluteAddress lhs, Imm32 rhs, Label* label) {
|
void branch32(Condition cond, AbsoluteAddress lhs, Imm32 rhs, Label* label) {
|
||||||
AutoRegisterScope scratch2(asMasm(), secondScratchReg_);
|
AutoRegisterScope scratch2(asMasm(), secondScratchReg_);
|
||||||
loadPtr(lhs, scratch2); // ma_cmp will use the scratch register.
|
loadPtr(lhs, scratch2); // ma_cmp will use the scratch register.
|
||||||
|
@ -438,118 +438,6 @@ MacroAssembler::rshift64(Imm32 imm, Register64 dest)
|
|||||||
// ===============================================================
|
// ===============================================================
|
||||||
// Branch functions
|
// Branch functions
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
Cmp(ARMRegister(lhs, 64), ARMRegister(rhs, 64));
|
|
||||||
B(label, cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, Imm32 rhs, Label* label)
|
|
||||||
{
|
|
||||||
cmpPtr(lhs, rhs);
|
|
||||||
B(label, cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
cmpPtr(lhs, rhs);
|
|
||||||
B(label, cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmGCPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
vixl::UseScratchRegisterScope temps(this);
|
|
||||||
const Register scratch = temps.AcquireX().asUnsized();
|
|
||||||
MOZ_ASSERT(scratch != lhs);
|
|
||||||
movePtr(rhs, scratch);
|
|
||||||
branchPtr(cond, lhs, scratch, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
cmpPtr(lhs, rhs);
|
|
||||||
B(label, cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
vixl::UseScratchRegisterScope temps(this);
|
|
||||||
const Register scratch = temps.AcquireX().asUnsized();
|
|
||||||
MOZ_ASSERT(scratch != lhs.base);
|
|
||||||
MOZ_ASSERT(scratch != rhs);
|
|
||||||
loadPtr(lhs, scratch);
|
|
||||||
branchPtr(cond, scratch, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
vixl::UseScratchRegisterScope temps(this);
|
|
||||||
const Register scratch = temps.AcquireX().asUnsized();
|
|
||||||
MOZ_ASSERT(scratch != lhs.base);
|
|
||||||
loadPtr(lhs, scratch);
|
|
||||||
branchPtr(cond, scratch, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmGCPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
vixl::UseScratchRegisterScope temps(this);
|
|
||||||
const ARMRegister scratch1_64 = temps.AcquireX();
|
|
||||||
const ARMRegister scratch2_64 = temps.AcquireX();
|
|
||||||
MOZ_ASSERT(scratch1_64.asUnsized() != lhs.base);
|
|
||||||
MOZ_ASSERT(scratch2_64.asUnsized() != lhs.base);
|
|
||||||
|
|
||||||
movePtr(rhs, scratch1_64.asUnsized());
|
|
||||||
loadPtr(lhs, scratch2_64.asUnsized());
|
|
||||||
branchPtr(cond, scratch2_64.asUnsized(), scratch1_64.asUnsized(), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
vixl::UseScratchRegisterScope temps(this);
|
|
||||||
const Register scratch = temps.AcquireX().asUnsized();
|
|
||||||
MOZ_ASSERT(scratch != lhs.base);
|
|
||||||
loadPtr(lhs, scratch);
|
|
||||||
branchPtr(cond, scratch, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const AbsoluteAddress& lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
vixl::UseScratchRegisterScope temps(this);
|
|
||||||
const Register scratch = temps.AcquireX().asUnsized();
|
|
||||||
MOZ_ASSERT(scratch != rhs);
|
|
||||||
loadPtr(lhs, scratch);
|
|
||||||
branchPtr(cond, scratch, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const AbsoluteAddress& lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
vixl::UseScratchRegisterScope temps(this);
|
|
||||||
const Register scratch = temps.AcquireX().asUnsized();
|
|
||||||
loadPtr(lhs, scratch);
|
|
||||||
branchPtr(cond, scratch, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
vixl::UseScratchRegisterScope temps(this);
|
|
||||||
const Register scratch = temps.AcquireX().asUnsized();
|
|
||||||
MOZ_ASSERT(scratch != rhs);
|
|
||||||
loadPtr(lhs, scratch);
|
|
||||||
branchPtr(cond, scratch, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
||||||
{
|
{
|
||||||
@ -608,20 +496,6 @@ MacroAssemblerCompat::andStackPtrTo(T t)
|
|||||||
asMasm().andPtr(getStackPointer(), t);
|
asMasm().andPtr(getStackPointer(), t);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void
|
|
||||||
MacroAssemblerCompat::branchStackPtr(Condition cond, T rhs, Label* label)
|
|
||||||
{
|
|
||||||
asMasm().branchPtr(cond, getStackPointer(), rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void
|
|
||||||
MacroAssemblerCompat::branchStackPtrRhs(Condition cond, T lhs, Label* label)
|
|
||||||
{
|
|
||||||
asMasm().branchPtr(cond, lhs, getStackPointer(), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace jit
|
} // namespace jit
|
||||||
} // namespace js
|
} // namespace js
|
||||||
|
|
||||||
|
@ -227,8 +227,8 @@ MacroAssemblerCompat::branchPtrInNurseryRange(Condition cond, Register ptr, Regi
|
|||||||
const Nursery& nursery = GetJitContext()->runtime->gcNursery();
|
const Nursery& nursery = GetJitContext()->runtime->gcNursery();
|
||||||
movePtr(ImmWord(-ptrdiff_t(nursery.start())), temp);
|
movePtr(ImmWord(-ptrdiff_t(nursery.start())), temp);
|
||||||
asMasm().addPtr(ptr, temp);
|
asMasm().addPtr(ptr, temp);
|
||||||
asMasm().branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
||||||
temp, ImmWord(nursery.nurserySize()), label);
|
temp, ImmWord(nursery.nurserySize()), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -249,8 +249,8 @@ MacroAssemblerCompat::branchValueIsNurseryObject(Condition cond, ValueOperand va
|
|||||||
|
|
||||||
movePtr(ImmWord(-ptrdiff_t(start.asRawBits())), temp);
|
movePtr(ImmWord(-ptrdiff_t(start.asRawBits())), temp);
|
||||||
asMasm().addPtr(value.valueReg(), temp);
|
asMasm().addPtr(value.valueReg(), temp);
|
||||||
asMasm().branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
||||||
temp, ImmWord(nursery.nurserySize()), label);
|
temp, ImmWord(nursery.nurserySize()), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1061,9 +1061,13 @@ class MacroAssemblerCompat : public vixl::MacroAssembler
|
|||||||
branchTestPtr(cond, getStackPointer(), t, label);
|
branchTestPtr(cond, getStackPointer(), t, label);
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void branchStackPtr(Condition cond, T rhs, Label* label);
|
void branchStackPtr(Condition cond, T rhs, Label* label) {
|
||||||
|
branchPtr(cond, getStackPointer(), rhs, label);
|
||||||
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void branchStackPtrRhs(Condition cond, T lhs, Label* label);
|
void branchStackPtrRhs(Condition cond, T lhs, Label* label) {
|
||||||
|
branchPtr(cond, lhs, getStackPointer(), label);
|
||||||
|
}
|
||||||
|
|
||||||
void testPtr(Register lhs, Register rhs) {
|
void testPtr(Register lhs, Register rhs) {
|
||||||
Tst(ARMRegister(lhs, 64), Operand(ARMRegister(rhs, 64)));
|
Tst(ARMRegister(lhs, 64), Operand(ARMRegister(rhs, 64)));
|
||||||
@ -1495,6 +1499,85 @@ class MacroAssemblerCompat : public vixl::MacroAssembler
|
|||||||
return jumpWithPatch(label, cond);
|
return jumpWithPatch(label, cond);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register rhs, Label* label) {
|
||||||
|
vixl::UseScratchRegisterScope temps(this);
|
||||||
|
const Register scratch = temps.AcquireX().asUnsized();
|
||||||
|
MOZ_ASSERT(scratch != rhs);
|
||||||
|
loadPtr(lhs, scratch);
|
||||||
|
branchPtr(cond, scratch, rhs, label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Address lhs, ImmWord ptr, Label* label) {
|
||||||
|
vixl::UseScratchRegisterScope temps(this);
|
||||||
|
const Register scratch = temps.AcquireX().asUnsized();
|
||||||
|
MOZ_ASSERT(scratch != lhs.base);
|
||||||
|
loadPtr(lhs, scratch);
|
||||||
|
branchPtr(cond, scratch, ptr, label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Address lhs, ImmPtr ptr, Label* label) {
|
||||||
|
vixl::UseScratchRegisterScope temps(this);
|
||||||
|
const Register scratch = temps.AcquireX().asUnsized();
|
||||||
|
MOZ_ASSERT(scratch != lhs.base);
|
||||||
|
loadPtr(lhs, scratch);
|
||||||
|
branchPtr(cond, scratch, ptr, label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Address lhs, Register ptr, Label* label) {
|
||||||
|
vixl::UseScratchRegisterScope temps(this);
|
||||||
|
const Register scratch = temps.AcquireX().asUnsized();
|
||||||
|
MOZ_ASSERT(scratch != lhs.base);
|
||||||
|
MOZ_ASSERT(scratch != ptr);
|
||||||
|
loadPtr(lhs, scratch);
|
||||||
|
branchPtr(cond, scratch, ptr, label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, Imm32 imm, Label* label) {
|
||||||
|
cmpPtr(lhs, imm);
|
||||||
|
B(label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmWord ptr, Label* label) {
|
||||||
|
cmpPtr(lhs, ptr);
|
||||||
|
B(label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmPtr rhs, Label* label) {
|
||||||
|
cmpPtr(lhs, rhs);
|
||||||
|
B(label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmGCPtr ptr, Label* label) {
|
||||||
|
vixl::UseScratchRegisterScope temps(this);
|
||||||
|
const Register scratch = temps.AcquireX().asUnsized();
|
||||||
|
MOZ_ASSERT(scratch != lhs);
|
||||||
|
movePtr(ptr, scratch);
|
||||||
|
branchPtr(cond, lhs, scratch, label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Address lhs, ImmGCPtr ptr, Label* label) {
|
||||||
|
vixl::UseScratchRegisterScope temps(this);
|
||||||
|
const ARMRegister scratch1_64 = temps.AcquireX();
|
||||||
|
const ARMRegister scratch2_64 = temps.AcquireX();
|
||||||
|
MOZ_ASSERT(scratch1_64.asUnsized() != lhs.base);
|
||||||
|
MOZ_ASSERT(scratch2_64.asUnsized() != lhs.base);
|
||||||
|
|
||||||
|
movePtr(ptr, scratch1_64.asUnsized());
|
||||||
|
loadPtr(lhs, scratch2_64.asUnsized());
|
||||||
|
cmp(scratch2_64, scratch1_64);
|
||||||
|
B(cond, label);
|
||||||
|
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
||||||
|
Cmp(ARMRegister(lhs, 64), ARMRegister(rhs, 64));
|
||||||
|
B(label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, AbsoluteAddress lhs, Register rhs, Label* label) {
|
||||||
|
vixl::UseScratchRegisterScope temps(this);
|
||||||
|
const Register scratch = temps.AcquireX().asUnsized();
|
||||||
|
MOZ_ASSERT(scratch != rhs);
|
||||||
|
loadPtr(lhs, scratch);
|
||||||
|
branchPtr(cond, scratch, rhs, label);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, AbsoluteAddress lhs, ImmWord ptr, Label* label) {
|
||||||
|
vixl::UseScratchRegisterScope temps(this);
|
||||||
|
const Register scratch = temps.AcquireX().asUnsized();
|
||||||
|
loadPtr(lhs, scratch);
|
||||||
|
branchPtr(cond, scratch, ptr, label);
|
||||||
|
}
|
||||||
|
|
||||||
void branchTestPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
void branchTestPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
||||||
Tst(ARMRegister(lhs, 64), Operand(ARMRegister(rhs, 64)));
|
Tst(ARMRegister(lhs, 64), Operand(ARMRegister(rhs, 64)));
|
||||||
B(label, cond);
|
B(label, cond);
|
||||||
|
@ -191,88 +191,6 @@ MacroAssembler::negateDouble(FloatRegister reg)
|
|||||||
as_negd(reg, reg);
|
as_negd(reg, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===============================================================
|
|
||||||
// Branch functions
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
ma_b(lhs, rhs, label, cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, Imm32 rhs, Label* label)
|
|
||||||
{
|
|
||||||
ma_b(lhs, rhs, label, cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
ma_b(lhs, rhs, label, cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmGCPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
ma_b(lhs, rhs, label, cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
ma_b(lhs, rhs, label, cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
loadPtr(lhs, SecondScratchReg);
|
|
||||||
branchPtr(cond, SecondScratchReg, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
loadPtr(lhs, SecondScratchReg);
|
|
||||||
branchPtr(cond, SecondScratchReg, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmGCPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
loadPtr(lhs, SecondScratchReg);
|
|
||||||
branchPtr(cond, SecondScratchReg, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
loadPtr(lhs, SecondScratchReg);
|
|
||||||
branchPtr(cond, SecondScratchReg, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const AbsoluteAddress& lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
loadPtr(lhs, SecondScratchReg);
|
|
||||||
branchPtr(cond, SecondScratchReg, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const AbsoluteAddress& lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
loadPtr(lhs, SecondScratchReg);
|
|
||||||
branchPtr(cond, SecondScratchReg, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
loadPtr(lhs, SecondScratchReg);
|
|
||||||
branchPtr(cond, SecondScratchReg, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
//}}} check_macroassembler_style
|
//}}} check_macroassembler_style
|
||||||
// ===============================================================
|
// ===============================================================
|
||||||
|
|
||||||
|
@ -275,7 +275,7 @@ void
|
|||||||
MacroAssemblerMIPSCompat::decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label)
|
MacroAssemblerMIPSCompat::decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label)
|
||||||
{
|
{
|
||||||
asMasm().subPtr(imm, lhs);
|
asMasm().subPtr(imm, lhs);
|
||||||
asMasm().branchPtr(cond, lhs, Imm32(0), label);
|
branchPtr(cond, lhs, Imm32(0), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace jit
|
} // namespace jit
|
||||||
|
@ -1485,11 +1485,11 @@ MacroAssemblerMIPSCompat::branchTestValue(Condition cond, const Address& valaddr
|
|||||||
|
|
||||||
// Load tag.
|
// Load tag.
|
||||||
ma_lw(ScratchRegister, Address(valaddr.base, valaddr.offset + TAG_OFFSET));
|
ma_lw(ScratchRegister, Address(valaddr.base, valaddr.offset + TAG_OFFSET));
|
||||||
asMasm().branchPtr(cond, ScratchRegister, value.typeReg(), label);
|
branchPtr(cond, ScratchRegister, value.typeReg(), label);
|
||||||
|
|
||||||
// Load payload
|
// Load payload
|
||||||
ma_lw(ScratchRegister, Address(valaddr.base, valaddr.offset + PAYLOAD_OFFSET));
|
ma_lw(ScratchRegister, Address(valaddr.base, valaddr.offset + PAYLOAD_OFFSET));
|
||||||
asMasm().branchPtr(cond, ScratchRegister, value.payloadReg(), label);
|
branchPtr(cond, ScratchRegister, value.payloadReg(), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
// unboxing code
|
// unboxing code
|
||||||
@ -2382,8 +2382,8 @@ MacroAssemblerMIPSCompat::branchPtrInNurseryRange(Condition cond, Register ptr,
|
|||||||
const Nursery& nursery = GetJitContext()->runtime->gcNursery();
|
const Nursery& nursery = GetJitContext()->runtime->gcNursery();
|
||||||
movePtr(ImmWord(-ptrdiff_t(nursery.start())), SecondScratchReg);
|
movePtr(ImmWord(-ptrdiff_t(nursery.start())), SecondScratchReg);
|
||||||
asMasm().addPtr(ptr, SecondScratchReg);
|
asMasm().addPtr(ptr, SecondScratchReg);
|
||||||
asMasm().branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
||||||
SecondScratchReg, Imm32(nursery.nurserySize()), label);
|
SecondScratchReg, Imm32(nursery.nurserySize()), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -415,6 +415,10 @@ class MacroAssemblerMIPSCompat : public MacroAssemblerMIPS
|
|||||||
load32(lhs, SecondScratchReg);
|
load32(lhs, SecondScratchReg);
|
||||||
ma_b(SecondScratchReg, rhs, label, cond);
|
ma_b(SecondScratchReg, rhs, label, cond);
|
||||||
}
|
}
|
||||||
|
void branchPtr(Condition cond, const Address& lhs, Register rhs, Label* label) {
|
||||||
|
loadPtr(lhs, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, rhs, label, cond);
|
||||||
|
}
|
||||||
|
|
||||||
void branchTestDouble(Condition cond, const ValueOperand& value, Label* label);
|
void branchTestDouble(Condition cond, const ValueOperand& value, Label* label);
|
||||||
void branchTestDouble(Condition cond, Register tag, Label* label);
|
void branchTestDouble(Condition cond, Register tag, Label* label);
|
||||||
@ -509,6 +513,25 @@ class MacroAssemblerMIPSCompat : public MacroAssemblerMIPS
|
|||||||
}
|
}
|
||||||
void branchTest64(Condition cond, Register64 lhs, Register64 rhs, Register temp,
|
void branchTest64(Condition cond, Register64 lhs, Register64 rhs, Register temp,
|
||||||
Label* label);
|
Label* label);
|
||||||
|
void branchPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
||||||
|
ma_b(lhs, rhs, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmGCPtr ptr, Label* label) {
|
||||||
|
ma_b(lhs, ptr, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmWord imm, Label* label) {
|
||||||
|
ma_b(lhs, imm, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmPtr imm, Label* label) {
|
||||||
|
ma_b(lhs, imm, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, wasm::SymbolicAddress imm, Label* label) {
|
||||||
|
movePtr(imm, SecondScratchReg);
|
||||||
|
ma_b(lhs, SecondScratchReg, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, Imm32 imm, Label* label) {
|
||||||
|
ma_b(lhs, imm, label, cond);
|
||||||
|
}
|
||||||
inline void decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label);
|
inline void decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label);
|
||||||
|
|
||||||
// higher level tag testing code
|
// higher level tag testing code
|
||||||
@ -551,6 +574,31 @@ class MacroAssemblerMIPSCompat : public MacroAssemblerMIPS
|
|||||||
bind(&skipJump);
|
bind(&skipJump);
|
||||||
return off;
|
return off;
|
||||||
}
|
}
|
||||||
|
void branchPtr(Condition cond, Address addr, ImmGCPtr ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
void branchPtr(Condition cond, Address addr, ImmWord ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Address addr, ImmPtr ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, AbsoluteAddress addr, Register ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, AbsoluteAddress addr, ImmWord ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, wasm::SymbolicAddress addr, Register ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
void branch32(Condition cond, AbsoluteAddress lhs, Imm32 rhs, Label* label) {
|
void branch32(Condition cond, AbsoluteAddress lhs, Imm32 rhs, Label* label) {
|
||||||
load32(lhs, SecondScratchReg);
|
load32(lhs, SecondScratchReg);
|
||||||
ma_b(SecondScratchReg, rhs, label, cond);
|
ma_b(SecondScratchReg, rhs, label, cond);
|
||||||
|
@ -221,7 +221,7 @@ void
|
|||||||
MacroAssemblerMIPS64Compat::decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label)
|
MacroAssemblerMIPS64Compat::decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label)
|
||||||
{
|
{
|
||||||
asMasm().subPtr(imm, lhs);
|
asMasm().subPtr(imm, lhs);
|
||||||
asMasm().branchPtr(cond, lhs, Imm32(0), label);
|
branchPtr(cond, lhs, Imm32(0), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace jit
|
} // namespace jit
|
||||||
|
@ -2539,8 +2539,8 @@ MacroAssemblerMIPS64Compat::branchPtrInNurseryRange(Condition cond, Register ptr
|
|||||||
const Nursery& nursery = GetJitContext()->runtime->gcNursery();
|
const Nursery& nursery = GetJitContext()->runtime->gcNursery();
|
||||||
movePtr(ImmWord(-ptrdiff_t(nursery.start())), SecondScratchReg);
|
movePtr(ImmWord(-ptrdiff_t(nursery.start())), SecondScratchReg);
|
||||||
asMasm().addPtr(ptr, SecondScratchReg);
|
asMasm().addPtr(ptr, SecondScratchReg);
|
||||||
asMasm().branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
||||||
SecondScratchReg, Imm32(nursery.nurserySize()), label);
|
SecondScratchReg, Imm32(nursery.nurserySize()), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -2555,8 +2555,8 @@ MacroAssemblerMIPS64Compat::branchValueIsNurseryObject(Condition cond, ValueOper
|
|||||||
|
|
||||||
movePtr(ImmWord(-ptrdiff_t(start.asRawBits())), SecondScratchReg);
|
movePtr(ImmWord(-ptrdiff_t(start.asRawBits())), SecondScratchReg);
|
||||||
asMasm().addPtr(value.valueReg(), SecondScratchReg);
|
asMasm().addPtr(value.valueReg(), SecondScratchReg);
|
||||||
asMasm().branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
||||||
SecondScratchReg, Imm32(nursery.nurserySize()), label);
|
SecondScratchReg, Imm32(nursery.nurserySize()), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -456,6 +456,10 @@ class MacroAssemblerMIPS64Compat : public MacroAssemblerMIPS64
|
|||||||
load32(lhs, SecondScratchReg);
|
load32(lhs, SecondScratchReg);
|
||||||
ma_b(SecondScratchReg, rhs, label, cond);
|
ma_b(SecondScratchReg, rhs, label, cond);
|
||||||
}
|
}
|
||||||
|
void branchPtr(Condition cond, const Address& lhs, Register rhs, Label* label) {
|
||||||
|
loadPtr(lhs, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, rhs, label, cond);
|
||||||
|
}
|
||||||
|
|
||||||
void branchTestDouble(Condition cond, const ValueOperand& value, Label* label);
|
void branchTestDouble(Condition cond, const ValueOperand& value, Label* label);
|
||||||
void branchTestDouble(Condition cond, Register tag, Label* label);
|
void branchTestDouble(Condition cond, Register tag, Label* label);
|
||||||
@ -552,6 +556,25 @@ class MacroAssemblerMIPS64Compat : public MacroAssemblerMIPS64
|
|||||||
Label* label) {
|
Label* label) {
|
||||||
branchTestPtr(cond, lhs.reg, rhs.reg, label);
|
branchTestPtr(cond, lhs.reg, rhs.reg, label);
|
||||||
}
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
||||||
|
ma_b(lhs, rhs, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmGCPtr ptr, Label* label) {
|
||||||
|
ma_b(lhs, ptr, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmWord imm, Label* label) {
|
||||||
|
ma_b(lhs, imm, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, ImmPtr imm, Label* label) {
|
||||||
|
ma_b(lhs, imm, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, wasm::SymbolicAddress imm, Label* label) {
|
||||||
|
movePtr(imm, SecondScratchReg);
|
||||||
|
ma_b(lhs, SecondScratchReg, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, Imm32 imm, Label* label) {
|
||||||
|
ma_b(lhs, imm, label, cond);
|
||||||
|
}
|
||||||
inline void decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label);
|
inline void decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label);
|
||||||
|
|
||||||
// higher level tag testing code
|
// higher level tag testing code
|
||||||
@ -584,6 +607,31 @@ class MacroAssemblerMIPS64Compat : public MacroAssemblerMIPS64
|
|||||||
bind(&skipJump);
|
bind(&skipJump);
|
||||||
return off;
|
return off;
|
||||||
}
|
}
|
||||||
|
void branchPtr(Condition cond, Address addr, ImmGCPtr ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
void branchPtr(Condition cond, Address addr, ImmWord ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, Address addr, ImmPtr ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, AbsoluteAddress addr, Register ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, AbsoluteAddress addr, ImmWord ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, wasm::SymbolicAddress addr, Register ptr, Label* label) {
|
||||||
|
loadPtr(addr, SecondScratchReg);
|
||||||
|
ma_b(SecondScratchReg, ptr, label, cond);
|
||||||
|
}
|
||||||
void branch32(Condition cond, AbsoluteAddress lhs, Imm32 rhs, Label* label) {
|
void branch32(Condition cond, AbsoluteAddress lhs, Imm32 rhs, Label* label) {
|
||||||
load32(lhs, SecondScratchReg);
|
load32(lhs, SecondScratchReg);
|
||||||
ma_b(SecondScratchReg, rhs, label, cond);
|
ma_b(SecondScratchReg, rhs, label, cond);
|
||||||
|
@ -248,6 +248,7 @@ class MacroAssemblerNone : public Assembler
|
|||||||
template <typename T, typename S, typename L> void branchTest32(Condition, T, S, L) { MOZ_CRASH(); }
|
template <typename T, typename S, typename L> void branchTest32(Condition, T, S, L) { MOZ_CRASH(); }
|
||||||
template <typename T, typename S> void branchAdd32(Condition, T, S, Label*) { MOZ_CRASH(); }
|
template <typename T, typename S> void branchAdd32(Condition, T, S, Label*) { MOZ_CRASH(); }
|
||||||
template <typename T, typename S> void branchSub32(Condition, T, S, Label*) { MOZ_CRASH(); }
|
template <typename T, typename S> void branchSub32(Condition, T, S, Label*) { MOZ_CRASH(); }
|
||||||
|
template <typename T, typename S> void branchPtr(Condition, T, S, Label*) { MOZ_CRASH(); }
|
||||||
template <typename T, typename S> void branchTestPtr(Condition, T, S, Label*) { MOZ_CRASH(); }
|
template <typename T, typename S> void branchTestPtr(Condition, T, S, Label*) { MOZ_CRASH(); }
|
||||||
template <typename T, typename S> void branchDouble(DoubleCondition, T, S, Label*) { MOZ_CRASH(); }
|
template <typename T, typename S> void branchDouble(DoubleCondition, T, S, Label*) { MOZ_CRASH(); }
|
||||||
template <typename T, typename S> void branchFloat(DoubleCondition, T, S, Label*) { MOZ_CRASH(); }
|
template <typename T, typename S> void branchFloat(DoubleCondition, T, S, Label*) { MOZ_CRASH(); }
|
||||||
|
@ -222,40 +222,6 @@ MacroAssembler::rshift64(Imm32 imm, Register64 dest)
|
|||||||
// ===============================================================
|
// ===============================================================
|
||||||
// Branch functions
|
// Branch functions
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const AbsoluteAddress& lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
ScratchRegisterScope scratch(*this);
|
|
||||||
MOZ_ASSERT(rhs != scratch);
|
|
||||||
if (X86Encoding::IsAddressImmediate(lhs.addr)) {
|
|
||||||
branchPtrImpl(cond, Operand(lhs), rhs, label);
|
|
||||||
} else {
|
|
||||||
mov(ImmPtr(lhs.addr), scratch);
|
|
||||||
branchPtrImpl(cond, Operand(scratch, 0x0), rhs, label);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const AbsoluteAddress& lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
if (X86Encoding::IsAddressImmediate(lhs.addr)) {
|
|
||||||
branchPtrImpl(cond, Operand(lhs), rhs, label);
|
|
||||||
} else {
|
|
||||||
ScratchRegisterScope scratch(*this);
|
|
||||||
mov(ImmPtr(lhs.addr), scratch);
|
|
||||||
branchPtrImpl(cond, Operand(scratch, 0x0), rhs, label);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
ScratchRegisterScope scratch(*this);
|
|
||||||
MOZ_ASSERT(rhs != scratch);
|
|
||||||
mov(lhs, scratch);
|
|
||||||
branchPtrImpl(cond, Operand(scratch, 0x0), rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
||||||
{
|
{
|
||||||
@ -276,22 +242,6 @@ MacroAssemblerX64::incrementInt32Value(const Address& addr)
|
|||||||
asMasm().addPtr(Imm32(1), addr);
|
asMasm().addPtr(Imm32(1), addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssemblerX64::branchTestValue(Condition cond, const Address& valaddr, const
|
|
||||||
ValueOperand& value, Label* label)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
|
||||||
asMasm().branchPtr(cond, valaddr, value.valueReg(), label);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename S>
|
|
||||||
void
|
|
||||||
MacroAssemblerX64::branchPtrImpl(Condition cond, const T& lhs, const S& rhs, Label* label)
|
|
||||||
{
|
|
||||||
cmpPtr(Operand(lhs), rhs);
|
|
||||||
j(cond, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace jit
|
} // namespace jit
|
||||||
} // namespace js
|
} // namespace js
|
||||||
|
|
||||||
|
@ -120,26 +120,6 @@ MacroAssemblerX64::finish()
|
|||||||
MacroAssemblerX86Shared::finish();
|
MacroAssemblerX86Shared::finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssemblerX64::boxValue(JSValueType type, Register src, Register dest)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(src != dest);
|
|
||||||
|
|
||||||
JSValueShiftedTag tag = (JSValueShiftedTag)JSVAL_TYPE_TO_SHIFTED_TAG(type);
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (type == JSVAL_TYPE_INT32 || type == JSVAL_TYPE_BOOLEAN) {
|
|
||||||
Label upper32BitsZeroed;
|
|
||||||
movePtr(ImmWord(UINT32_MAX), dest);
|
|
||||||
asMasm().branchPtr(Assembler::BelowOrEqual, src, dest, &upper32BitsZeroed);
|
|
||||||
breakpoint();
|
|
||||||
bind(&upper32BitsZeroed);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
mov(ImmShiftedTag(tag), dest);
|
|
||||||
orq(src, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MacroAssemblerX64::handleFailureWithHandlerTail(void* handler)
|
MacroAssemblerX64::handleFailureWithHandlerTail(void* handler)
|
||||||
{
|
{
|
||||||
@ -276,8 +256,8 @@ MacroAssemblerX64::branchPtrInNurseryRange(Condition cond, Register ptr, Registe
|
|||||||
const Nursery& nursery = GetJitContext()->runtime->gcNursery();
|
const Nursery& nursery = GetJitContext()->runtime->gcNursery();
|
||||||
movePtr(ImmWord(-ptrdiff_t(nursery.start())), scratch);
|
movePtr(ImmWord(-ptrdiff_t(nursery.start())), scratch);
|
||||||
asMasm().addPtr(ptr, scratch);
|
asMasm().addPtr(ptr, scratch);
|
||||||
asMasm().branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
||||||
scratch, Imm32(nursery.nurserySize()), label);
|
scratch, Imm32(nursery.nurserySize()), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -298,8 +278,8 @@ MacroAssemblerX64::branchValueIsNurseryObject(Condition cond, ValueOperand value
|
|||||||
ScratchRegisterScope scratch(asMasm());
|
ScratchRegisterScope scratch(asMasm());
|
||||||
movePtr(ImmWord(-ptrdiff_t(start.asRawBits())), scratch);
|
movePtr(ImmWord(-ptrdiff_t(start.asRawBits())), scratch);
|
||||||
asMasm().addPtr(value.valueReg(), scratch);
|
asMasm().addPtr(value.valueReg(), scratch);
|
||||||
asMasm().branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
||||||
scratch, Imm32(nursery.nurserySize()), label);
|
scratch, Imm32(nursery.nurserySize()), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -200,7 +200,22 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
|
|||||||
if (src.valueReg() != dest.valueReg())
|
if (src.valueReg() != dest.valueReg())
|
||||||
movq(src.valueReg(), dest.valueReg());
|
movq(src.valueReg(), dest.valueReg());
|
||||||
}
|
}
|
||||||
void boxValue(JSValueType type, Register src, Register dest);
|
void boxValue(JSValueType type, Register src, Register dest) {
|
||||||
|
MOZ_ASSERT(src != dest);
|
||||||
|
|
||||||
|
JSValueShiftedTag tag = (JSValueShiftedTag)JSVAL_TYPE_TO_SHIFTED_TAG(type);
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (type == JSVAL_TYPE_INT32 || type == JSVAL_TYPE_BOOLEAN) {
|
||||||
|
Label upper32BitsZeroed;
|
||||||
|
movePtr(ImmWord(UINT32_MAX), dest);
|
||||||
|
branchPtr(Assembler::BelowOrEqual, src, dest, &upper32BitsZeroed);
|
||||||
|
breakpoint();
|
||||||
|
bind(&upper32BitsZeroed);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
mov(ImmShiftedTag(tag), dest);
|
||||||
|
orq(src, dest);
|
||||||
|
}
|
||||||
|
|
||||||
Condition testUndefined(Condition cond, Register tag) {
|
Condition testUndefined(Condition cond, Register tag) {
|
||||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||||
@ -562,8 +577,38 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
|
|||||||
j(cond, label);
|
j(cond, label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Specialization for AbsoluteAddress.
|
||||||
|
void branchPtr(Condition cond, AbsoluteAddress addr, Register ptr, Label* label) {
|
||||||
|
ScratchRegisterScope scratch(asMasm());
|
||||||
|
MOZ_ASSERT(ptr != scratch);
|
||||||
|
if (X86Encoding::IsAddressImmediate(addr.addr)) {
|
||||||
|
branchPtr(cond, Operand(addr), ptr, label);
|
||||||
|
} else {
|
||||||
|
mov(ImmPtr(addr.addr), scratch);
|
||||||
|
branchPtr(cond, Operand(scratch, 0x0), ptr, label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, AbsoluteAddress addr, ImmWord ptr, Label* label) {
|
||||||
|
if (X86Encoding::IsAddressImmediate(addr.addr)) {
|
||||||
|
branchPtr(cond, Operand(addr), ptr, label);
|
||||||
|
} else {
|
||||||
|
ScratchRegisterScope scratch(asMasm());
|
||||||
|
mov(ImmPtr(addr.addr), scratch);
|
||||||
|
branchPtr(cond, Operand(scratch, 0x0), ptr, label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void branchPtr(Condition cond, wasm::SymbolicAddress addr, Register ptr, Label* label) {
|
||||||
|
ScratchRegisterScope scratch(asMasm());
|
||||||
|
MOZ_ASSERT(ptr != scratch);
|
||||||
|
mov(addr, scratch);
|
||||||
|
branchPtr(cond, Operand(scratch, 0x0), ptr, label);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T, typename S>
|
template <typename T, typename S>
|
||||||
inline void branchPtrImpl(Condition cond, const T& lhs, const S& rhs, Label* label);
|
void branchPtr(Condition cond, const T& lhs, const S& ptr, Label* label) {
|
||||||
|
cmpPtr(Operand(lhs), ptr);
|
||||||
|
j(cond, label);
|
||||||
|
}
|
||||||
|
|
||||||
CodeOffsetJump jumpWithPatch(RepatchLabel* label, Label* documentation = nullptr) {
|
CodeOffsetJump jumpWithPatch(RepatchLabel* label, Label* documentation = nullptr) {
|
||||||
JmpSrc src = jmpSrc(label);
|
JmpSrc src = jmpSrc(label);
|
||||||
@ -586,6 +631,10 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
|
|||||||
cmpPtr(lhs, ptr);
|
cmpPtr(lhs, ptr);
|
||||||
return jumpWithPatch(label, cond);
|
return jumpWithPatch(label, cond);
|
||||||
}
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
||||||
|
cmpPtr(lhs, rhs);
|
||||||
|
j(cond, label);
|
||||||
|
}
|
||||||
void branchTestPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
void branchTestPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
||||||
testPtr(lhs, rhs);
|
testPtr(lhs, rhs);
|
||||||
j(cond, label);
|
j(cond, label);
|
||||||
@ -949,8 +998,12 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
|
|||||||
cmpPtr(value.valueReg(), scratch);
|
cmpPtr(value.valueReg(), scratch);
|
||||||
j(cond, label);
|
j(cond, label);
|
||||||
}
|
}
|
||||||
inline void branchTestValue(Condition cond, const Address& valaddr, const ValueOperand& value,
|
void branchTestValue(Condition cond, const Address& valaddr, const ValueOperand& value,
|
||||||
Label* label);
|
Label* label)
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||||
|
branchPtr(cond, valaddr, value.valueReg(), label);
|
||||||
|
}
|
||||||
|
|
||||||
void testNullSet(Condition cond, const ValueOperand& value, Register dest) {
|
void testNullSet(Condition cond, const ValueOperand& value, Register dest) {
|
||||||
cond = testNull(cond, value);
|
cond = testNull(cond, value);
|
||||||
|
@ -180,64 +180,6 @@ MacroAssembler::negateDouble(FloatRegister reg)
|
|||||||
vxorpd(scratch, reg, reg); // s ^ 0x80000000000000
|
vxorpd(scratch, reg, reg); // s ^ 0x80000000000000
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===============================================================
|
|
||||||
// Branch instructions
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
cmpPtr(lhs, rhs);
|
|
||||||
j(cond, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, Imm32 rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtrImpl(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtrImpl(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmGCPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtrImpl(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, Register lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtrImpl(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtrImpl(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtrImpl(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmGCPtr rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtrImpl(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const Address& lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtrImpl(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
//}}} check_macroassembler_style
|
//}}} check_macroassembler_style
|
||||||
// ===============================================================
|
// ===============================================================
|
||||||
|
|
||||||
|
@ -258,25 +258,6 @@ MacroAssembler::rshift64(Imm32 imm, Register64 dest)
|
|||||||
// ===============================================================
|
// ===============================================================
|
||||||
// Branch functions
|
// Branch functions
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const AbsoluteAddress& lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtrImpl(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, const AbsoluteAddress& lhs, ImmWord rhs, Label* label)
|
|
||||||
{
|
|
||||||
branchPtrImpl(cond, lhs, rhs, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssembler::branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register rhs, Label* label)
|
|
||||||
{
|
|
||||||
cmpl(rhs, lhs);
|
|
||||||
j(cond, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
|
||||||
{
|
{
|
||||||
@ -309,31 +290,6 @@ MacroAssemblerX86::convertUInt32ToFloat32(Register src, FloatRegister dest)
|
|||||||
convertDoubleToFloat32(dest, dest);
|
convertDoubleToFloat32(dest, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
MacroAssemblerX86::branchTestValue(Condition cond, const Address& valaddr, const ValueOperand& value,
|
|
||||||
Label* label)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
|
||||||
// Check payload before tag, since payload is more likely to differ.
|
|
||||||
if (cond == NotEqual) {
|
|
||||||
branchPtrImpl(NotEqual, payloadOf(valaddr), value.payloadReg(), label);
|
|
||||||
branchPtrImpl(NotEqual, tagOf(valaddr), value.typeReg(), label);
|
|
||||||
} else {
|
|
||||||
Label fallthrough;
|
|
||||||
branchPtrImpl(NotEqual, payloadOf(valaddr), value.payloadReg(), &fallthrough);
|
|
||||||
branchPtrImpl(Equal, tagOf(valaddr), value.typeReg(), label);
|
|
||||||
bind(&fallthrough);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename S>
|
|
||||||
void
|
|
||||||
MacroAssemblerX86::branchPtrImpl(Condition cond, const T& lhs, const S& rhs, Label* label)
|
|
||||||
{
|
|
||||||
cmpPtr(Operand(lhs), rhs);
|
|
||||||
j(cond, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace jit
|
} // namespace jit
|
||||||
} // namespace js
|
} // namespace js
|
||||||
|
|
||||||
|
@ -336,8 +336,8 @@ MacroAssemblerX86::branchPtrInNurseryRange(Condition cond, Register ptr, Registe
|
|||||||
const Nursery& nursery = GetJitContext()->runtime->gcNursery();
|
const Nursery& nursery = GetJitContext()->runtime->gcNursery();
|
||||||
movePtr(ImmWord(-ptrdiff_t(nursery.start())), temp);
|
movePtr(ImmWord(-ptrdiff_t(nursery.start())), temp);
|
||||||
asMasm().addPtr(ptr, temp);
|
asMasm().addPtr(ptr, temp);
|
||||||
asMasm().branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
branchPtr(cond == Assembler::Equal ? Assembler::Below : Assembler::AboveOrEqual,
|
||||||
temp, Imm32(nursery.nurserySize()), label);
|
temp, Imm32(nursery.nurserySize()), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -468,8 +468,22 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared
|
|||||||
|
|
||||||
|
|
||||||
void branchTestValue(Condition cond, const ValueOperand& value, const Value& v, Label* label);
|
void branchTestValue(Condition cond, const ValueOperand& value, const Value& v, Label* label);
|
||||||
inline void branchTestValue(Condition cond, const Address& valaddr, const ValueOperand& value,
|
void branchTestValue(Condition cond, const Address& valaddr, const ValueOperand& value,
|
||||||
Label* label);
|
Label* label)
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||||
|
// Check payload before tag, since payload is more likely to differ.
|
||||||
|
if (cond == NotEqual) {
|
||||||
|
branchPtr(NotEqual, payloadOf(valaddr), value.payloadReg(), label);
|
||||||
|
branchPtr(NotEqual, tagOf(valaddr), value.typeReg(), label);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Label fallthrough;
|
||||||
|
branchPtr(NotEqual, payloadOf(valaddr), value.payloadReg(), &fallthrough);
|
||||||
|
branchPtr(Equal, tagOf(valaddr), value.typeReg(), label);
|
||||||
|
bind(&fallthrough);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void testNullSet(Condition cond, const ValueOperand& value, Register dest) {
|
void testNullSet(Condition cond, const ValueOperand& value, Register dest) {
|
||||||
cond = testNull(cond, value);
|
cond = testNull(cond, value);
|
||||||
@ -569,14 +583,22 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared
|
|||||||
j(cond, label);
|
j(cond, label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void branchPtr(Condition cond, wasm::SymbolicAddress lhs, Register ptr, Label* label) {
|
||||||
|
cmpl(ptr, lhs);
|
||||||
|
j(cond, label);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T, typename S>
|
template <typename T, typename S>
|
||||||
void branchPtr(Condition cond, T lhs, S ptr, RepatchLabel* label) {
|
void branchPtr(Condition cond, T lhs, S ptr, Label* label) {
|
||||||
cmpPtr(Operand(lhs), ptr);
|
cmpPtr(Operand(lhs), ptr);
|
||||||
j(cond, label);
|
j(cond, label);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename S>
|
template <typename T, typename S>
|
||||||
inline void branchPtrImpl(Condition cond, const T& lhs, const S& rhs, Label* label);
|
void branchPtr(Condition cond, T lhs, S ptr, RepatchLabel* label) {
|
||||||
|
cmpPtr(Operand(lhs), ptr);
|
||||||
|
j(cond, label);
|
||||||
|
}
|
||||||
|
|
||||||
CodeOffsetJump jumpWithPatch(RepatchLabel* label, Label* documentation = nullptr) {
|
CodeOffsetJump jumpWithPatch(RepatchLabel* label, Label* documentation = nullptr) {
|
||||||
jump(label);
|
jump(label);
|
||||||
@ -603,6 +625,10 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared
|
|||||||
cmpPtr(lhs, rhs);
|
cmpPtr(lhs, rhs);
|
||||||
j(cond, label);
|
j(cond, label);
|
||||||
}
|
}
|
||||||
|
void branchPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
||||||
|
cmpPtr(lhs, rhs);
|
||||||
|
j(cond, label);
|
||||||
|
}
|
||||||
void branchTestPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
void branchTestPtr(Condition cond, Register lhs, Register rhs, Label* label) {
|
||||||
testPtr(lhs, rhs);
|
testPtr(lhs, rhs);
|
||||||
j(cond, label);
|
j(cond, label);
|
||||||
|
Loading…
Reference in New Issue
Block a user