mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1245112 - Part 29: Move MacroAssembler::branchTestNull into generic macro assembler. r=sstangl
This commit is contained in:
parent
3a63fbd192
commit
0f89d7a32f
@ -931,6 +931,7 @@ class MacroAssembler : public MacroAssemblerSpecific
|
||||
inline void branchTestBoolean(Condition cond, Register tag, Label* label) PER_SHARED_ARCH;
|
||||
inline void branchTestString(Condition cond, Register tag, Label* label) PER_SHARED_ARCH;
|
||||
inline void branchTestSymbol(Condition cond, Register tag, Label* label) PER_SHARED_ARCH;
|
||||
inline void branchTestNull(Condition cond, Register tag, Label* label) PER_SHARED_ARCH;
|
||||
|
||||
// Perform a type-test on a Value, addressed by Address or BaseIndex, or
|
||||
// loaded into ValueOperand.
|
||||
@ -965,6 +966,11 @@ class MacroAssembler : public MacroAssemblerSpecific
|
||||
inline void branchTestSymbol(Condition cond, const ValueOperand& value, Label* label)
|
||||
DEFINED_ON(arm, arm64, mips32, mips64, x86_shared);
|
||||
|
||||
inline void branchTestNull(Condition cond, const Address& address, Label* label) PER_SHARED_ARCH;
|
||||
inline void branchTestNull(Condition cond, const BaseIndex& address, Label* label) PER_SHARED_ARCH;
|
||||
inline void branchTestNull(Condition cond, const ValueOperand& value, Label* label)
|
||||
DEFINED_ON(arm, arm64, mips32, mips64, x86_shared);
|
||||
|
||||
// Checks if given Value is evaluated to true or false in a condition.
|
||||
// The type of the value should match the type of the method.
|
||||
inline void branchTestInt32Truthy(bool truthy, const ValueOperand& value, Label* label)
|
||||
@ -998,6 +1004,9 @@ class MacroAssembler : public MacroAssemblerSpecific
|
||||
template <typename T>
|
||||
inline void branchTestSymbolImpl(Condition cond, const T& t, Label* label)
|
||||
DEFINED_ON(arm, arm64, x86_shared);
|
||||
template <typename T>
|
||||
inline void branchTestNullImpl(Condition cond, const T& t, Label* label)
|
||||
DEFINED_ON(arm, arm64, x86_shared);
|
||||
|
||||
//}}} check_macroassembler_style
|
||||
public:
|
||||
|
@ -1027,6 +1027,38 @@ MacroAssembler::branchTestSymbolImpl(Condition cond, const T& t, Label* label)
|
||||
ma_b(label, c);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, Register tag, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, tag, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const Address& address, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, address, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const BaseIndex& address, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, address, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const ValueOperand& value, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, value, label);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void
|
||||
MacroAssembler::branchTestNullImpl(Condition cond, const T& t, Label* label)
|
||||
{
|
||||
Condition c = testNull(cond, t);
|
||||
ma_b(label, c);
|
||||
}
|
||||
|
||||
//}}} check_macroassembler_style
|
||||
// ===============================================================
|
||||
|
||||
|
@ -762,11 +762,6 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
|
||||
void int32ValueToFloat32(const ValueOperand& operand, FloatRegister dest);
|
||||
void loadConstantFloat32(float f, FloatRegister dest);
|
||||
|
||||
template<typename T>
|
||||
void branchTestNull(Condition cond, const T & t, Label* label) {
|
||||
Condition c = testNull(cond, t);
|
||||
ma_b(label, c);
|
||||
}
|
||||
template<typename T>
|
||||
void branchTestObject(Condition cond, const T & t, Label* label) {
|
||||
Condition c = testObject(cond, t);
|
||||
|
@ -1126,6 +1126,38 @@ MacroAssembler::branchTestSymbolImpl(Condition cond, const T& t, Label* label)
|
||||
B(label, c);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, Register tag, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, tag, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const Address& address, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, address, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const BaseIndex& address, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, address, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const ValueOperand& value, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, value, label);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void
|
||||
MacroAssembler::branchTestNullImpl(Condition cond, const T& t, Label* label)
|
||||
{
|
||||
Condition c = testNull(cond, t);
|
||||
B(label, c);
|
||||
}
|
||||
|
||||
//}}} check_macroassembler_style
|
||||
// ===============================================================
|
||||
|
||||
|
@ -1328,19 +1328,11 @@ class MacroAssemblerCompat : public vixl::MacroAssembler
|
||||
return jumpWithPatch(label, Always, documentation);
|
||||
}
|
||||
|
||||
void branchTestNull(Condition cond, Register tag, Label* label) {
|
||||
Condition c = testNull(cond, tag);
|
||||
B(label, c);
|
||||
}
|
||||
void branchTestObject(Condition cond, Register tag, Label* label) {
|
||||
Condition c = testObject(cond, tag);
|
||||
B(label, c);
|
||||
}
|
||||
|
||||
void branchTestNull(Condition cond, const Address& address, Label* label) {
|
||||
Condition c = testNull(cond, address);
|
||||
B(label, c);
|
||||
}
|
||||
void branchTestObject(Condition cond, const Address& address, Label* label) {
|
||||
Condition c = testObject(cond, address);
|
||||
B(label, c);
|
||||
@ -1348,10 +1340,6 @@ class MacroAssemblerCompat : public vixl::MacroAssembler
|
||||
|
||||
// Perform a type-test on a full Value loaded into a register.
|
||||
// Clobbers the ScratchReg.
|
||||
void branchTestNull(Condition cond, const ValueOperand& src, Label* label) {
|
||||
Condition c = testNull(cond, src);
|
||||
B(label, c);
|
||||
}
|
||||
void branchTestObject(Condition cond, const ValueOperand& src, Label* label) {
|
||||
Condition c = testObject(cond, src);
|
||||
B(label, c);
|
||||
@ -1359,10 +1347,6 @@ class MacroAssemblerCompat : public vixl::MacroAssembler
|
||||
|
||||
// Perform a type-test on a Value addressed by BaseIndex.
|
||||
// Clobbers the ScratchReg.
|
||||
void branchTestNull(Condition cond, const BaseIndex& address, Label* label) {
|
||||
Condition c = testNull(cond, address);
|
||||
B(label, c);
|
||||
}
|
||||
void branchTestObject(Condition cond, const BaseIndex& address, Label* label) {
|
||||
Condition c = testObject(cond, address);
|
||||
B(label, c);
|
||||
|
@ -640,6 +640,29 @@ MacroAssembler::branchTestSymbol(Condition cond, const BaseIndex& address, Label
|
||||
branchTestSymbol(cond, scratch2, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, Register tag, Label* label)
|
||||
{
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
ma_b(tag, ImmTag(JSVAL_TAG_NULL), label, cond);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const Address& address, Label* label)
|
||||
{
|
||||
SecondScratchRegisterScope scratch2(*this);
|
||||
extractTag(address, scratch2);
|
||||
branchTestNull(cond, scratch2, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const BaseIndex& address, Label* label)
|
||||
{
|
||||
SecondScratchRegisterScope scratch2(*this);
|
||||
extractTag(address, scratch2);
|
||||
branchTestNull(cond, scratch2, label);
|
||||
}
|
||||
|
||||
//}}} check_macroassembler_style
|
||||
// ===============================================================
|
||||
|
||||
|
@ -362,6 +362,12 @@ MacroAssembler::branchTestSymbol(Condition cond, const ValueOperand& value, Labe
|
||||
branchTestSymbol(cond, value.typeReg(), label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const ValueOperand& value, Label* label)
|
||||
{
|
||||
branchTestNull(cond, value.typeReg(), label);
|
||||
}
|
||||
|
||||
//}}} check_macroassembler_style
|
||||
// ===============================================================
|
||||
|
||||
|
@ -1126,35 +1126,6 @@ MacroAssemblerMIPSCompat::branchTestPrimitive(Condition cond, Register tag, Labe
|
||||
(cond == Equal) ? Below : AboveOrEqual);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssemblerMIPSCompat::branchTestNull(Condition cond, const ValueOperand& value, Label* label)
|
||||
{
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
ma_b(value.typeReg(), ImmType(JSVAL_TYPE_NULL), label, cond);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssemblerMIPSCompat::branchTestNull(Condition cond, Register tag, Label* label)
|
||||
{
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
ma_b(tag, ImmTag(JSVAL_TAG_NULL), label, cond);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssemblerMIPSCompat::branchTestNull(Condition cond, const BaseIndex& src, Label* label)
|
||||
{
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
extractTag(src, SecondScratchReg);
|
||||
ma_b(SecondScratchReg, ImmTag(JSVAL_TAG_NULL), label, cond);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssemblerMIPSCompat::branchTestNull(Condition cond, const Address& address, Label* label) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
extractTag(address, SecondScratchReg);
|
||||
ma_b(SecondScratchReg, ImmTag(JSVAL_TAG_NULL), label, cond);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssemblerMIPSCompat::testNullSet(Condition cond, const ValueOperand& value, Register dest)
|
||||
{
|
||||
|
@ -375,10 +375,6 @@ class MacroAssemblerMIPSCompat : public MacroAssemblerMIPS
|
||||
void int32ValueToFloat32(const ValueOperand& operand, FloatRegister dest);
|
||||
void loadConstantFloat32(float f, FloatRegister dest);
|
||||
|
||||
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);
|
||||
void branchTestNull(Condition cond, const Address& address, Label* label);
|
||||
void testNullSet(Condition cond, const ValueOperand& value, Register dest);
|
||||
|
||||
void branchTestObject(Condition cond, const ValueOperand& value, Label* label);
|
||||
|
@ -313,6 +313,14 @@ MacroAssembler::branchTestSymbol(Condition cond, const ValueOperand& value, Labe
|
||||
branchTestSymbol(cond, scratch2, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const ValueOperand& value, Label* label)
|
||||
{
|
||||
SecondScratchRegisterScope scratch2(*this);
|
||||
splitTag(value, scratch2);
|
||||
branchTestNull(cond, scratch2, label);
|
||||
}
|
||||
|
||||
//}}} check_macroassembler_style
|
||||
// ===============================================================
|
||||
|
||||
|
@ -1254,36 +1254,6 @@ MacroAssemblerMIPS64Compat::branchTestPrimitive(Condition cond, Register tag, La
|
||||
(cond == Equal) ? Below : AboveOrEqual);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssemblerMIPS64Compat::branchTestNull(Condition cond, const ValueOperand& value, Label* label)
|
||||
{
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
splitTag(value, SecondScratchReg);
|
||||
ma_b(SecondScratchReg, ImmTag(JSVAL_TAG_NULL), label, cond);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssemblerMIPS64Compat::branchTestNull(Condition cond, Register tag, Label* label)
|
||||
{
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
ma_b(tag, ImmTag(JSVAL_TAG_NULL), label, cond);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssemblerMIPS64Compat::branchTestNull(Condition cond, const BaseIndex& src, Label* label)
|
||||
{
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
extractTag(src, SecondScratchReg);
|
||||
ma_b(SecondScratchReg, ImmTag(JSVAL_TAG_NULL), label, cond);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssemblerMIPS64Compat::branchTestNull(Condition cond, const Address& address, Label* label) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
extractTag(address, SecondScratchReg);
|
||||
ma_b(SecondScratchReg, ImmTag(JSVAL_TAG_NULL), label, cond);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssemblerMIPS64Compat::testNullSet(Condition cond, const ValueOperand& value, Register dest)
|
||||
{
|
||||
|
@ -416,10 +416,6 @@ class MacroAssemblerMIPS64Compat : public MacroAssemblerMIPS64
|
||||
void int32ValueToFloat32(const ValueOperand& operand, FloatRegister dest);
|
||||
void loadConstantFloat32(float f, FloatRegister dest);
|
||||
|
||||
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);
|
||||
void branchTestNull(Condition cond, const Address& address, Label* label);
|
||||
void testNullSet(Condition cond, const ValueOperand& value, Register dest);
|
||||
|
||||
void branchTestObject(Condition cond, const ValueOperand& value, Label* label);
|
||||
|
@ -345,7 +345,6 @@ class MacroAssemblerNone : public Assembler
|
||||
|
||||
Register splitTagForTest(ValueOperand) { MOZ_CRASH(); }
|
||||
|
||||
template <typename T> void branchTestNull(Condition, T, Label*) { MOZ_CRASH(); }
|
||||
template <typename T> void branchTestObject(Condition, T, Label*) { MOZ_CRASH(); }
|
||||
template <typename T> void branchTestGCThing(Condition, T, Label*) { MOZ_CRASH(); }
|
||||
template <typename T> void branchTestPrimitive(Condition, T, Label*) { MOZ_CRASH(); }
|
||||
|
@ -346,9 +346,8 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
|
||||
return testNumber(cond, scratch);
|
||||
}
|
||||
Condition testNull(Condition cond, const Address& src) {
|
||||
ScratchRegisterScope scratch(asMasm());
|
||||
splitTag(src, scratch);
|
||||
return testNull(cond, scratch);
|
||||
cmp32(ToUpper32(src), Imm32(Upper32Of(GetShiftedTag(JSVAL_TYPE_NULL))));
|
||||
return cond;
|
||||
}
|
||||
Condition testString(Condition cond, const Address& src) {
|
||||
ScratchRegisterScope scratch(asMasm());
|
||||
@ -684,10 +683,6 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
|
||||
cmp32(reg, tag);
|
||||
}
|
||||
|
||||
void branchTestNull(Condition cond, Register tag, Label* label) {
|
||||
cond = testNull(cond, tag);
|
||||
j(cond, label);
|
||||
}
|
||||
void branchTestObject(Condition cond, Register tag, Label* label) {
|
||||
cond = testObject(cond, tag);
|
||||
j(cond, label);
|
||||
@ -696,16 +691,6 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
|
||||
// x64 can test for certain types directly from memory when the payload
|
||||
// of the type is limited to 32 bits. This avoids loading into a register,
|
||||
// accesses half as much memory, and removes a right-shift.
|
||||
void branchTestNull(Condition cond, const Operand& operand, Label* label) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
cmp32(ToUpper32(operand), Imm32(Upper32Of(GetShiftedTag(JSVAL_TYPE_NULL))));
|
||||
j(cond, label);
|
||||
}
|
||||
void branchTestNull(Condition cond, const Address& address, Label* label) {
|
||||
MOZ_ASSERT(cond == Equal || cond == NotEqual);
|
||||
branchTestNull(cond, Operand(address), label);
|
||||
}
|
||||
|
||||
// This one, though, clobbers the ScratchReg.
|
||||
void branchTestObject(Condition cond, const Address& src, Label* label) {
|
||||
cond = testObject(cond, src);
|
||||
@ -714,10 +699,6 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
|
||||
|
||||
// Perform a type-test on a full Value loaded into a register.
|
||||
// Clobbers the ScratchReg.
|
||||
void branchTestNull(Condition cond, const ValueOperand& src, Label* label) {
|
||||
cond = testNull(cond, src);
|
||||
j(cond, label);
|
||||
}
|
||||
void branchTestObject(Condition cond, const ValueOperand& src, Label* label) {
|
||||
cond = testObject(cond, src);
|
||||
j(cond, label);
|
||||
@ -725,10 +706,6 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
|
||||
|
||||
// Perform a type-test on a Value addressed by BaseIndex.
|
||||
// Clobbers the ScratchReg.
|
||||
void branchTestNull(Condition cond, const BaseIndex& address, Label* label) {
|
||||
cond = testNull(cond, address);
|
||||
j(cond, label);
|
||||
}
|
||||
void branchTestObject(Condition cond, const BaseIndex& address, Label* label) {
|
||||
cond = testObject(cond, address);
|
||||
j(cond, label);
|
||||
|
@ -649,6 +649,38 @@ MacroAssembler::branchTestSymbolImpl(Condition cond, const T& t, Label* label)
|
||||
j(cond, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, Register tag, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, tag, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const Address& address, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, address, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const BaseIndex& address, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, address, label);
|
||||
}
|
||||
|
||||
void
|
||||
MacroAssembler::branchTestNull(Condition cond, const ValueOperand& value, Label* label)
|
||||
{
|
||||
branchTestNullImpl(cond, value, label);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void
|
||||
MacroAssembler::branchTestNullImpl(Condition cond, const T& t, Label* label)
|
||||
{
|
||||
cond = testNull(cond, t);
|
||||
j(cond, label);
|
||||
}
|
||||
|
||||
//}}} check_macroassembler_style
|
||||
// ===============================================================
|
||||
|
||||
|
@ -660,11 +660,6 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared
|
||||
// Type testing instructions can take a tag in a register or a
|
||||
// ValueOperand.
|
||||
template <typename T>
|
||||
void branchTestNull(Condition cond, const T& t, Label* label) {
|
||||
cond = testNull(cond, t);
|
||||
j(cond, label);
|
||||
}
|
||||
template <typename T>
|
||||
void branchTestObject(Condition cond, const T& t, Label* label) {
|
||||
cond = testObject(cond, t);
|
||||
j(cond, label);
|
||||
|
Loading…
Reference in New Issue
Block a user