Bug 1873926: Remove branching from MacroAssembler::signInt32. r=jandem

Replace the explicit branching with a conditional move.

Differential Revision: https://phabricator.services.mozilla.com/D198162
This commit is contained in:
André Bargull 2024-01-11 17:16:05 +00:00
parent 04689ca3bc
commit e61907e230
9 changed files with 59 additions and 4 deletions

View File

@ -4417,12 +4417,10 @@ void MacroAssembler::pow32(Register base, Register power, Register dest,
void MacroAssembler::signInt32(Register input, Register output) {
MOZ_ASSERT(input != output);
Label done;
move32(input, output);
rshift32Arithmetic(Imm32(31), output);
branch32(Assembler::LessThanOrEqual, input, Imm32(0), &done);
move32(Imm32(1), output);
bind(&done);
or32(Imm32(1), output);
cmp32Move32(Assembler::Equal, input, Imm32(0), input, output);
}
void MacroAssembler::signDouble(FloatRegister input, FloatRegister output) {

View File

@ -2115,6 +2115,10 @@ class MacroAssembler : public MacroAssemblerSpecific {
template <typename T>
inline void fallibleUnboxBigInt(const T& src, Register dest, Label* fail);
inline void cmp32Move32(Condition cond, Register lhs, Imm32 rhs, Register src,
Register dest)
DEFINED_ON(arm, arm64, loong64, riscv64, wasm32, mips_shared, x86_shared);
inline void cmp32Move32(Condition cond, Register lhs, Register rhs,
Register src, Register dest)
DEFINED_ON(arm, arm64, loong64, riscv64, wasm32, mips_shared, x86_shared);

View File

@ -2363,6 +2363,12 @@ void MacroAssembler::branchToComputedAddress(const BaseIndex& addr) {
}
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Imm32 rhs,
Register src, Register dest) {
cmp32(lhs, rhs);
ma_mov(src, dest, LeaveCC, cond);
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
cmp32(lhs, rhs);

View File

@ -2029,6 +2029,13 @@ void MacroAssembler::branchToComputedAddress(const BaseIndex& addr) {
Br(scratch64);
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Imm32 rhs,
Register src, Register dest) {
cmp32(lhs, rhs);
Csel(ARMRegister(dest, 32), ARMRegister(src, 32), ARMRegister(dest, 32),
cond);
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
cmp32(lhs, rhs);

View File

@ -1858,6 +1858,13 @@ void MacroAssembler::branchToComputedAddress(const BaseIndex& addr) {
branch(scratch2);
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Imm32 rhs,
Register src, Register dest) {
SecondScratchRegisterScope scratch2(asMasm());
cmp32Set(cond, lhs, rhs, scratch2);
moveIfNotZero(dest, src, scratch2);
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
SecondScratchRegisterScope scratch2(asMasm());

View File

@ -1132,6 +1132,20 @@ void MacroAssembler::branchToComputedAddress(const BaseIndex& addr) {
branch(ScratchRegister);
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Imm32 rhs,
Register src, Register dest) {
Register scratch = ScratchRegister;
MOZ_ASSERT(src != scratch && dest != scratch);
cmp32Set(cond, lhs, rhs, scratch);
#ifdef MIPSR6
as_selnez(src, src, scratch);
as_seleqz(dest, dest, scratch);
as_or(dest, dest, src);
#else
as_movn(dest, src, scratch);
#endif
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
Register scratch = ScratchRegister;

View File

@ -1343,6 +1343,14 @@ void MacroAssembler::cmp32LoadPtr(Condition cond, const Address& lhs, Imm32 rhs,
bind(&skip);
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Imm32 rhs,
Register src, Register dest) {
UseScratchRegisterScope temps(this);
Register scratch2 = temps.Acquire();
cmp32Set(cond, lhs, rhs, scratch2);
moveIfNotZero(dest, src, scratch2);
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
UseScratchRegisterScope temps(this);

View File

@ -964,6 +964,11 @@ void MacroAssembler::branchTestString(Condition cond, const ValueOperand& value,
MOZ_CRASH();
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Imm32 rhs,
Register src, Register dest) {
MOZ_CRASH();
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
MOZ_CRASH();

View File

@ -1139,6 +1139,12 @@ void MacroAssembler::testBigIntSet(Condition cond, const T& src,
emitSet(cond, dest);
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Imm32 rhs,
Register src, Register dest) {
cmp32(lhs, rhs);
cmovCCl(cond, src, dest);
}
void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
cmp32(lhs, rhs);