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:
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();