From e61907e230d88e8cc2d873e4aebe63b5de2fa011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= Date: Thu, 11 Jan 2024 17:16:05 +0000 Subject: [PATCH] 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 --- js/src/jit/MacroAssembler.cpp | 6 ++---- js/src/jit/MacroAssembler.h | 4 ++++ js/src/jit/arm/MacroAssembler-arm-inl.h | 6 ++++++ js/src/jit/arm64/MacroAssembler-arm64-inl.h | 7 +++++++ js/src/jit/loong64/MacroAssembler-loong64-inl.h | 7 +++++++ .../mips-shared/MacroAssembler-mips-shared-inl.h | 14 ++++++++++++++ js/src/jit/riscv64/MacroAssembler-riscv64-inl.h | 8 ++++++++ js/src/jit/wasm32/MacroAssembler-wasm32-inl.h | 5 +++++ .../jit/x86-shared/MacroAssembler-x86-shared-inl.h | 6 ++++++ 9 files changed, 59 insertions(+), 4 deletions(-) diff --git a/js/src/jit/MacroAssembler.cpp b/js/src/jit/MacroAssembler.cpp index 422b2eeec870..ca2d8d33f046 100644 --- a/js/src/jit/MacroAssembler.cpp +++ b/js/src/jit/MacroAssembler.cpp @@ -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) { diff --git a/js/src/jit/MacroAssembler.h b/js/src/jit/MacroAssembler.h index 678f686c2d24..8b3722229d9e 100644 --- a/js/src/jit/MacroAssembler.h +++ b/js/src/jit/MacroAssembler.h @@ -2115,6 +2115,10 @@ class MacroAssembler : public MacroAssemblerSpecific { template 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); diff --git a/js/src/jit/arm/MacroAssembler-arm-inl.h b/js/src/jit/arm/MacroAssembler-arm-inl.h index b4edded21ee5..eaa938730b18 100644 --- a/js/src/jit/arm/MacroAssembler-arm-inl.h +++ b/js/src/jit/arm/MacroAssembler-arm-inl.h @@ -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); diff --git a/js/src/jit/arm64/MacroAssembler-arm64-inl.h b/js/src/jit/arm64/MacroAssembler-arm64-inl.h index b1e5bec9b091..8ce98cecdd56 100644 --- a/js/src/jit/arm64/MacroAssembler-arm64-inl.h +++ b/js/src/jit/arm64/MacroAssembler-arm64-inl.h @@ -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); diff --git a/js/src/jit/loong64/MacroAssembler-loong64-inl.h b/js/src/jit/loong64/MacroAssembler-loong64-inl.h index 09e256edf15a..5c4583ffec29 100644 --- a/js/src/jit/loong64/MacroAssembler-loong64-inl.h +++ b/js/src/jit/loong64/MacroAssembler-loong64-inl.h @@ -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()); diff --git a/js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h b/js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h index db8246a0dce9..130e7b66eace 100644 --- a/js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h +++ b/js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h @@ -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; diff --git a/js/src/jit/riscv64/MacroAssembler-riscv64-inl.h b/js/src/jit/riscv64/MacroAssembler-riscv64-inl.h index f3840ccb99e4..b53cc29d0182 100644 --- a/js/src/jit/riscv64/MacroAssembler-riscv64-inl.h +++ b/js/src/jit/riscv64/MacroAssembler-riscv64-inl.h @@ -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); diff --git a/js/src/jit/wasm32/MacroAssembler-wasm32-inl.h b/js/src/jit/wasm32/MacroAssembler-wasm32-inl.h index a3f1e47f4568..39980eabeedf 100644 --- a/js/src/jit/wasm32/MacroAssembler-wasm32-inl.h +++ b/js/src/jit/wasm32/MacroAssembler-wasm32-inl.h @@ -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(); diff --git a/js/src/jit/x86-shared/MacroAssembler-x86-shared-inl.h b/js/src/jit/x86-shared/MacroAssembler-x86-shared-inl.h index 482b5ff4d66a..a96b025127bf 100644 --- a/js/src/jit/x86-shared/MacroAssembler-x86-shared-inl.h +++ b/js/src/jit/x86-shared/MacroAssembler-x86-shared-inl.h @@ -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);