--- a/js/src/jit/MacroAssembler.h
+++ b/js/src/jit/MacroAssembler.h
@@ -793,16 +793,23 @@ class MacroAssembler : public MacroAssem
inline void rshiftPtr(Imm32 imm, Register dest) PER_ARCH;
inline void rshiftPtr(Imm32 imm, Register src, Register dest) DEFINED_ON(arm64);
inline void rshiftPtrArithmetic(Imm32 imm, Register dest) PER_ARCH;
inline void rshift64(Imm32 imm, Register64 dest) PER_ARCH;
+ // ===============================================================
+ // Branch functions
+
+ // This function compares a Value (lhs) which is having a private pointer
+ // boxed inside a js::Value, with a raw pointer (rhs).
+ inline void branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label) PER_ARCH;
+
//}}} check_macroassembler_style
public:
// Emits a test of a value against all types in a TypeSet. A scratch
// register is required.
template <typename Source>
void guardTypeSet(const Source& address, const TypeSet* types, BarrierKind kind, Register scratch, Label* miss);
--- a/js/src/jit/arm/MacroAssembler-arm-inl.h
+++ b/js/src/jit/arm/MacroAssembler-arm-inl.h
@@ -385,16 +385,25 @@ MacroAssembler::rshiftPtrArithmetic(Imm3
void
MacroAssembler::rshift64(Imm32 imm, Register64 dest)
{
as_mov(dest.low, lsr(dest.low, imm.value));
as_orr(dest.low, dest.low, lsl(dest.high, 32 - imm.value));
as_mov(dest.high, lsr(dest.high, imm.value));
}
+// ===============================================================
+// Branch functions
+
+void
+MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
+{
+ branchPtr(cond, lhs, rhs, label);
+}
+
//}}} check_macroassembler_style
// ===============================================================
template <typename T>
void
MacroAssemblerARMCompat::branchAdd32(Condition cond, T src, Register dest, Label* label)
{
asMasm().add32(src, dest);
--- a/js/src/jit/arm/MacroAssembler-arm.h
+++ b/js/src/jit/arm/MacroAssembler-arm.h
@@ -817,28 +817,16 @@ class MacroAssemblerARMCompat : public M
AutoRegisterScope scratch2(asMasm(), secondScratchReg_);
load32(lhs, scratch2);
branch32(cond, scratch2, rhs, label);
}
void branchPtr(Condition cond, const Address& lhs, Register rhs, Label* label) {
branch32(cond, lhs, rhs, label);
}
- void branchPrivatePtr(Condition cond, const Address& lhs, ImmPtr ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
- void branchPrivatePtr(Condition cond, const Address& lhs, Register ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
- void branchPrivatePtr(Condition cond, Register lhs, ImmWord ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
template<typename T>
void branchTestDouble(Condition cond, const T & t, Label* label) {
Condition c = testDouble(cond, t);
ma_b(label, c);
}
template<typename T>
void branchTestNull(Condition cond, const T & t, Label* label) {
Condition c = testNull(cond, t);
--- a/js/src/jit/arm64/MacroAssembler-arm64-inl.h
+++ b/js/src/jit/arm64/MacroAssembler-arm64-inl.h
@@ -430,16 +430,31 @@ MacroAssembler::rshiftPtrArithmetic(Imm3
}
void
MacroAssembler::rshift64(Imm32 imm, Register64 dest)
{
rshiftPtr(imm, dest.reg);
}
+// ===============================================================
+// Branch functions
+
+void
+MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
+{
+ vixl::UseScratchRegisterScope temps(this);
+ const Register scratch = temps.AcquireX().asUnsized();
+ if (rhs != scratch)
+ movePtr(rhs, scratch);
+ // Instead of unboxing lhs, box rhs and do direct comparison with lhs.
+ rshiftPtr(Imm32(1), scratch);
+ branchPtr(cond, lhs, scratch, label);
+}
+
//}}} check_macroassembler_style
// ===============================================================
template <typename T>
void
MacroAssemblerCompat::addToStackPtr(T t)
{
asMasm().addPtr(t, getStackPointer());
--- a/js/src/jit/arm64/MacroAssembler-arm64.h
+++ b/js/src/jit/arm64/MacroAssembler-arm64.h
@@ -1588,27 +1588,16 @@ class MacroAssemblerCompat : public vixl
}
void branchTestPtr(Condition cond, const Address& lhs, Imm32 imm, Label* label) {
vixl::UseScratchRegisterScope temps(this);
const Register scratch = temps.AcquireX().asUnsized();
MOZ_ASSERT(scratch != lhs.base);
loadPtr(lhs, scratch);
branchTestPtr(cond, scratch, imm, label);
}
- void branchPrivatePtr(Condition cond, const Address& lhs, ImmPtr ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
- void branchPrivatePtr(Condition cond, const Address& lhs, Register ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
- void branchPrivatePtr(Condition cond, Register lhs, ImmWord ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
void decBranchPtr(Condition cond, Register lhs, Imm32 imm, Label* label) {
Subs(ARMRegister(lhs, 64), ARMRegister(lhs, 64), Operand(imm.value));
B(cond, label);
}
void branchTestUndefined(Condition cond, Register tag, Label* label) {
Condition c = testUndefined(cond, tag);
--- a/js/src/jit/mips32/MacroAssembler-mips32-inl.h
+++ b/js/src/jit/mips32/MacroAssembler-mips32-inl.h
@@ -231,16 +231,25 @@ MacroAssembler::rshift64(Imm32 imm, Regi
{
ScratchRegisterScope scratch(*this);
as_srl(dest.low, dest.low, imm.value);
as_sll(scratch, dest.high, 32 - imm.value);
as_or(dest.low, dest.low, scratch);
as_srl(dest.high, dest.high, imm.value);
}
+// ===============================================================
+// Branch functions
+
+void
+MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
+{
+ branchPtr(cond, lhs, rhs, label);
+}
+
//}}} check_macroassembler_style
// ===============================================================
void
MacroAssemblerMIPSCompat::incrementInt32Value(const Address& addr)
{
asMasm().add32(Imm32(1), ToPayload(addr));
}
--- a/js/src/jit/mips32/MacroAssembler-mips32.h
+++ b/js/src/jit/mips32/MacroAssembler-mips32.h
@@ -415,28 +415,16 @@ class MacroAssemblerMIPSCompat : public
load32(lhs, SecondScratchReg);
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 branchPrivatePtr(Condition cond, const Address& lhs, ImmPtr ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
- void branchPrivatePtr(Condition cond, const Address& lhs, Register ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
- void branchPrivatePtr(Condition cond, Register lhs, ImmWord ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
void branchTestDouble(Condition cond, const ValueOperand& value, Label* label);
void branchTestDouble(Condition cond, Register tag, Label* label);
void branchTestDouble(Condition cond, const Address& address, Label* label);
void branchTestDouble(Condition cond, const BaseIndex& src, Label* label);
void branchTestNull(Condition cond, const ValueOperand& value, Label* label);
void branchTestNull(Condition cond, Register tag, Label* label);
void branchTestNull(Condition cond, const BaseIndex& src, Label* label);
--- a/js/src/jit/mips64/MacroAssembler-mips64-inl.h
+++ b/js/src/jit/mips64/MacroAssembler-mips64-inl.h
@@ -172,16 +172,29 @@ MacroAssembler::rshiftPtrArithmetic(Imm3
}
void
MacroAssembler::rshift64(Imm32 imm, Register64 dest)
{
ma_dsrl(dest.reg, dest.reg, imm);
}
+// ===============================================================
+// Branch functions
+
+void
+MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
+{
+ if (rhs != ScratchRegister)
+ movePtr(rhs, ScratchRegister);
+ // Instead of unboxing lhs, box rhs and do direct comparison with lhs.
+ rshiftPtr(Imm32(1), ScratchRegister);
+ branchPtr(cond, lhs, ScratchRegister, label);
+}
+
//}}} check_macroassembler_style
// ===============================================================
void
MacroAssemblerMIPS64Compat::incrementInt32Value(const Address& addr)
{
asMasm().add32(Imm32(1), addr);
}
--- a/js/src/jit/mips64/MacroAssembler-mips64.h
+++ b/js/src/jit/mips64/MacroAssembler-mips64.h
@@ -456,28 +456,16 @@ class MacroAssemblerMIPS64Compat : publi
load32(lhs, SecondScratchReg);
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 branchPrivatePtr(Condition cond, const Address& lhs, ImmPtr ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
- void branchPrivatePtr(Condition cond, const Address& lhs, Register ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
- void branchPrivatePtr(Condition cond, Register lhs, ImmWord ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
void branchTestDouble(Condition cond, const ValueOperand& value, Label* label);
void branchTestDouble(Condition cond, Register tag, Label* label);
void branchTestDouble(Condition cond, const Address& address, Label* label);
void branchTestDouble(Condition cond, const BaseIndex& src, Label* label);
void branchTestNull(Condition cond, const ValueOperand& value, Label* label);
void branchTestNull(Condition cond, Register tag, Label* label);
void branchTestNull(Condition cond, const BaseIndex& src, Label* label);
--- a/js/src/jit/none/MacroAssembler-none.h
+++ b/js/src/jit/none/MacroAssembler-none.h
@@ -247,17 +247,16 @@ class MacroAssemblerNone : public Assemb
template <typename T, typename S> void branch32(Condition, T, S, Label*) { 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 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 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 branchPrivatePtr(Condition, T, S, Label*) { MOZ_CRASH(); }
template <typename T, typename S> void decBranchPtr(Condition, T, S, Label*) { MOZ_CRASH(); }
template <typename T, typename S> void branchTest64(Condition, T, T, S, Label*) { MOZ_CRASH(); }
template <typename T, typename S> void mov(T, S) { MOZ_CRASH(); }
template <typename T, typename S> void movq(T, S) { MOZ_CRASH(); }
template <typename T, typename S> void movePtr(T, S) { MOZ_CRASH(); }
template <typename T, typename S> void move32(T, S) { MOZ_CRASH(); }
template <typename T, typename S> void moveFloat32(T, S) { MOZ_CRASH(); }
template <typename T, typename S> void moveDouble(T, S) { MOZ_CRASH(); }
--- a/js/src/jit/x64/MacroAssembler-x64-inl.h
+++ b/js/src/jit/x64/MacroAssembler-x64-inl.h
@@ -214,16 +214,30 @@ MacroAssembler::rshiftPtrArithmetic(Imm3
}
void
MacroAssembler::rshift64(Imm32 imm, Register64 dest)
{
shrq(imm, dest.reg);
}
+// ===============================================================
+// Branch functions
+
+void
+MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
+{
+ ScratchRegisterScope scratch(*this);
+ if (rhs != scratch)
+ movePtr(rhs, scratch);
+ // Instead of unboxing lhs, box rhs and do direct comparison with lhs.
+ rshiftPtr(Imm32(1), scratch);
+ branchPtr(cond, lhs, scratch, label);
+}
+
//}}} check_macroassembler_style
// ===============================================================
void
MacroAssemblerX64::incrementInt32Value(const Address& addr)
{
asMasm().addPtr(Imm32(1), addr);
}
--- a/js/src/jit/x64/MacroAssembler-x64.cpp
+++ b/js/src/jit/x64/MacroAssembler-x64.cpp
@@ -116,26 +116,16 @@ MacroAssemblerX64::finish()
default: MOZ_CRASH("unexpected SimdConstant type");
}
}
MacroAssemblerX86Shared::finish();
}
void
-MacroAssemblerX64::branchPrivatePtr(Condition cond, Address lhs, Register ptr, Label* label)
-{
- ScratchRegisterScope scratch(asMasm());
- if (ptr != scratch)
- movePtr(ptr, scratch);
- asMasm().rshiftPtr(Imm32(1), scratch);
- branchPtr(cond, lhs, scratch, label);
-}
-
-void
MacroAssemblerX64::handleFailureWithHandlerTail(void* handler)
{
// Reserve space for exception information.
subq(Imm32(sizeof(ResumeFromException)), rsp);
movq(rsp, rax);
// Call the handler.
asMasm().setupUnalignedABICall(rcx);
--- a/js/src/jit/x64/MacroAssembler-x64.h
+++ b/js/src/jit/x64/MacroAssembler-x64.h
@@ -599,21 +599,16 @@ class MacroAssemblerX64 : public MacroAs
}
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);
}
- void branchPrivatePtr(Condition cond, Address lhs, ImmPtr ptr, Label* label) {
- branchPtr(cond, lhs, ImmWord(uintptr_t(ptr.value) >> 1), label);
- }
-
- void branchPrivatePtr(Condition cond, Address lhs, Register ptr, Label* label);
template <typename T, typename S>
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) {
JmpSrc src = jmpSrc(label);
--- a/js/src/jit/x86/MacroAssembler-x86-inl.h
+++ b/js/src/jit/x86/MacroAssembler-x86-inl.h
@@ -250,16 +250,25 @@ MacroAssembler::rshiftPtrArithmetic(Imm3
void
MacroAssembler::rshift64(Imm32 imm, Register64 dest)
{
shrdl(imm, dest.high, dest.low);
shrl(imm, dest.high);
}
+// ===============================================================
+// Branch functions
+
+void
+MacroAssembler::branchPrivatePtr(Condition cond, const Address& lhs, Register rhs, Label* label)
+{
+ branchPtr(cond, lhs, rhs, label);
+}
+
//}}} check_macroassembler_style
// ===============================================================
// Note: this function clobbers the source register.
void
MacroAssemblerX86::convertUInt32ToDouble(Register src, FloatRegister dest)
{
// src is [0, 2^32-1]
--- a/js/src/jit/x86/MacroAssembler-x86.h
+++ b/js/src/jit/x86/MacroAssembler-x86.h
@@ -589,24 +589,16 @@ class MacroAssemblerX86 : public MacroAs
}
template <typename T, typename S>
void branchPtr(Condition cond, T lhs, S ptr, Label* label) {
cmpPtr(Operand(lhs), ptr);
j(cond, label);
}
- void branchPrivatePtr(Condition cond, const Address& lhs, ImmPtr ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
- void branchPrivatePtr(Condition cond, const Address& lhs, Register ptr, Label* label) {
- branchPtr(cond, lhs, ptr, label);
- }
-
template <typename T, typename S>
void branchPtr(Condition cond, T lhs, S ptr, RepatchLabel* label) {
cmpPtr(Operand(lhs), ptr);
j(cond, label);
}
CodeOffsetJump jumpWithPatch(RepatchLabel* label, Label* documentation = nullptr) {
jump(label);