tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 551667b535da20bbb87d5383b6e1792448f6f38b
parent 0e78108a322692ec0de832b331742adee9271ec0
Author: André Bargull <andre.bargull@gmail.com>
Date:   Mon, 20 Oct 2025 08:20:22 +0000

Bug 1993951 - Part 3: Use MacroAssembler::copySign{Float32,Double} on loong64. r=spidermonkey-reviewers,iain

Simulator support for `fcopysign` was missing.

Differential Revision: https://phabricator.services.mozilla.com/D268368

Diffstat:
Mjs/src/jit/MacroAssembler.h | 2+-
Mjs/src/jit/loong64/CodeGenerator-loong64.cpp | 23++---------------------
Mjs/src/jit/loong64/Lowering-loong64.cpp | 3---
Mjs/src/jit/loong64/MacroAssembler-loong64.cpp | 7++++++-
Mjs/src/jit/loong64/Simulator-loong64.cpp | 6++++--
5 files changed, 13 insertions(+), 28 deletions(-)

diff --git a/js/src/jit/MacroAssembler.h b/js/src/jit/MacroAssembler.h @@ -1329,7 +1329,7 @@ class MacroAssembler : public MacroAssemblerSpecific { FloatRegister output) PER_SHARED_ARCH; void copySignFloat32(FloatRegister lhs, FloatRegister rhs, FloatRegister output) - DEFINED_ON(arm, arm64, riscv64, x86_shared); + DEFINED_ON(arm, arm64, loong64, riscv64, x86_shared); // Returns a random double in range [0, 1) in |dest|. The |rng| register must // hold a pointer to a mozilla::non_crypto::XorShift128PlusRNG. diff --git a/js/src/jit/loong64/CodeGenerator-loong64.cpp b/js/src/jit/loong64/CodeGenerator-loong64.cpp @@ -1587,16 +1587,7 @@ void CodeGenerator::visitCopySignF(LCopySignF* ins) { FloatRegister rhs = ToFloatRegister(ins->rhs()); FloatRegister output = ToFloatRegister(ins->output()); - Register lhsi = ToRegister(ins->temp0()); - Register rhsi = ToRegister(ins->temp1()); - - masm.moveFromFloat32(lhs, lhsi); - masm.moveFromFloat32(rhs, rhsi); - - // Combine. - masm.as_bstrins_w(rhsi, lhsi, 30, 0); - - masm.moveToFloat32(rhsi, output); + masm.copySignFloat32(lhs, rhs, output); } void CodeGenerator::visitCopySignD(LCopySignD* ins) { @@ -1604,17 +1595,7 @@ void CodeGenerator::visitCopySignD(LCopySignD* ins) { FloatRegister rhs = ToFloatRegister(ins->rhs()); FloatRegister output = ToFloatRegister(ins->output()); - Register lhsi = ToRegister(ins->temp0()); - Register rhsi = ToRegister(ins->temp1()); - - // Manipulate high words of double inputs. - masm.moveFromDoubleHi(lhs, lhsi); - masm.moveFromDoubleHi(rhs, rhsi); - - // Combine. - masm.as_bstrins_w(rhsi, lhsi, 30, 0); - - masm.moveToDoubleHi(rhsi, output); + masm.copySignDouble(lhs, rhs, output); } void CodeGenerator::visitTestDAndBranch(LTestDAndBranch* test) { diff --git a/js/src/jit/loong64/Lowering-loong64.cpp b/js/src/jit/loong64/Lowering-loong64.cpp @@ -552,9 +552,6 @@ void LIRGenerator::visitCopySign(MCopySign* ins) { lir = new (alloc()) LCopySignF(); } - lir->setTemp(0, temp()); - lir->setTemp(1, temp()); - lir->setOperand(0, useRegisterAtStart(lhs)); lir->setOperand(1, willHaveDifferentLIRNodes(lhs, rhs) ? useRegister(rhs) diff --git a/js/src/jit/loong64/MacroAssembler-loong64.cpp b/js/src/jit/loong64/MacroAssembler-loong64.cpp @@ -4936,7 +4936,12 @@ void MacroAssembler::nearbyIntFloat32(RoundingMode mode, FloatRegister src, void MacroAssembler::copySignDouble(FloatRegister lhs, FloatRegister rhs, FloatRegister output) { - MOZ_CRASH("not supported on this platform"); + as_fcopysign_d(output, lhs, rhs); +} + +void MacroAssembler::copySignFloat32(FloatRegister lhs, FloatRegister rhs, + FloatRegister output) { + as_fcopysign_s(output, lhs, rhs); } void MacroAssemblerLOONG64Compat::move32(Imm32 imm, Register dest) { diff --git a/js/src/jit/loong64/Simulator-loong64.cpp b/js/src/jit/loong64/Simulator-loong64.cpp @@ -3808,10 +3808,12 @@ void Simulator::decodeTypeOp17(SimInstruction* instr) { UNIMPLEMENTED(); break; case op_fcopysign_s: - UNIMPLEMENTED(); + setFpuRegisterFloat(fd_reg(instr), + std::copysign(fj_float(instr), fk_float(instr))); break; case op_fcopysign_d: - UNIMPLEMENTED(); + setFpuRegisterDouble(fd_reg(instr), + std::copysign(fj_double(instr), fk_double(instr))); break; default: UNREACHABLE();