From 63a142a912fee3e6990ae4862d6326287085a990 Mon Sep 17 00:00:00 2001 From: Basilisk-Dev Date: Fri, 24 Apr 2026 11:49:10 -0400 Subject: [PATCH] Issue #3049 - Preserve loongarch64 ra across baseline helper calls --- js/src/jit/BaselineCompiler.cpp | 3 +-- js/src/jit/BaselineIC.cpp | 12 ++++++++++++ js/src/jit/SharedIC.cpp | 23 +++++++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/js/src/jit/BaselineCompiler.cpp b/js/src/jit/BaselineCompiler.cpp index ab38011be2..282cdeaf9b 100644 --- a/js/src/jit/BaselineCompiler.cpp +++ b/js/src/jit/BaselineCompiler.cpp @@ -458,7 +458,6 @@ BaselineCompiler::emitEpilogue() masm.pop(BaselineFrameReg); emitProfilerExitFrame(); - masm.ret(); return true; } @@ -484,7 +483,7 @@ BaselineCompiler::emitOutOfLinePostBarrierSlot() // On ARM, save the link register before calling. It contains the return // address. The |masm.ret()| later will pop this into |pc| to return. masm.push(lr); -#elif defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) +#elif defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONGARCH64) masm.push(ra); #endif masm.pushValue(R0); diff --git a/js/src/jit/BaselineIC.cpp b/js/src/jit/BaselineIC.cpp index a6adc122c7..adef1f46f9 100644 --- a/js/src/jit/BaselineIC.cpp +++ b/js/src/jit/BaselineIC.cpp @@ -679,9 +679,15 @@ ICToBool_Object::Compiler::generateStubCode(MacroAssembler& masm) EmitReturnFromIC(masm); masm.bind(&slowPath); +#ifdef JS_CODEGEN_LOONGARCH64 + masm.push(ra); +#endif masm.setupUnalignedABICall(scratch); masm.passABIArg(objReg); masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, js::EmulatesUndefined)); +#ifdef JS_CODEGEN_LOONGARCH64 + masm.pop(ra); +#endif masm.convertBoolToInt32(ReturnReg, ReturnReg); masm.xor32(Imm32(1), ReturnReg); masm.tagValue(JSVAL_TYPE_BOOLEAN, ReturnReg, R0); @@ -7468,6 +7474,9 @@ ICTableSwitch::Compiler::generateStubCode(MacroAssembler& masm) masm.convertDoubleToInt32(FloatReg0, key, &outOfRange, /* negativeZeroCheck = */ false); } else { // Pass pointer to double value. +#ifdef JS_CODEGEN_LOONGARCH64 + masm.push(ra); +#endif masm.pushValue(R0); masm.moveStackPtrTo(R0.scratchReg()); @@ -7479,6 +7488,9 @@ ICTableSwitch::Compiler::generateStubCode(MacroAssembler& masm) // int32. masm.movePtr(ReturnReg, scratch); masm.popValue(R0); +#ifdef JS_CODEGEN_LOONGARCH64 + masm.pop(ra); +#endif masm.branchIfFalseBool(scratch, &outOfRange); masm.unboxInt32(R0, key); } diff --git a/js/src/jit/SharedIC.cpp b/js/src/jit/SharedIC.cpp index d337534768..2805651f12 100644 --- a/js/src/jit/SharedIC.cpp +++ b/js/src/jit/SharedIC.cpp @@ -848,6 +848,8 @@ ICStubCompiler::emitPostWriteBarrierSlot(MacroAssembler& masm, Register obj, Val // void PostWriteBarrier(JSRuntime* rt, JSObject* obj); #if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) saveRegs.add(ICTailCallReg); +#elif defined(JS_CODEGEN_LOONGARCH64) + masm.push(ra); #endif saveRegs.set() = GeneralRegisterSet::Intersect(saveRegs.set(), GeneralRegisterSet::Volatile()); masm.PushRegsInMask(saveRegs); @@ -857,6 +859,9 @@ ICStubCompiler::emitPostWriteBarrierSlot(MacroAssembler& masm, Register obj, Val masm.passABIArg(obj); masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, PostWriteBarrier)); masm.PopRegsInMask(saveRegs); +#ifdef JS_CODEGEN_LOONGARCH64 + masm.pop(ra); +#endif masm.bind(&skipBarrier); } @@ -1292,10 +1297,16 @@ ICBinaryArith_Double::Compiler::generateStubCode(MacroAssembler& masm) masm.divDouble(FloatReg1, FloatReg0); break; case JSOP_MOD: +#ifdef JS_CODEGEN_LOONGARCH64 + masm.push(ra); +#endif masm.setupUnalignedABICall(R0.scratchReg()); masm.passABIArg(FloatReg0, MoveOp::DOUBLE); masm.passABIArg(FloatReg1, MoveOp::DOUBLE); masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, NumberMod), MoveOp::DOUBLE); +#ifdef JS_CODEGEN_LOONGARCH64 + masm.pop(ra); +#endif MOZ_ASSERT(ReturnDoubleReg == FloatReg0); break; default: @@ -1417,9 +1428,15 @@ ICBinaryArith_DoubleWithInt32::Compiler::generateStubCode(MacroAssembler& masm) masm.bind(&truncateABICall); masm.push(intReg); +#ifdef JS_CODEGEN_LOONGARCH64 + masm.push(ra); +#endif masm.setupUnalignedABICall(scratchReg); masm.passABIArg(FloatReg0, MoveOp::DOUBLE); masm.callWithABI(mozilla::BitwiseCast(JS::ToInt32)); +#ifdef JS_CODEGEN_LOONGARCH64 + masm.pop(ra); +#endif masm.storeCallInt32Result(scratchReg); masm.pop(intReg); @@ -1581,9 +1598,15 @@ ICUnaryArith_Double::Compiler::generateStubCode(MacroAssembler& masm) masm.jump(&doneTruncate); masm.bind(&truncateABICall); +#ifdef JS_CODEGEN_LOONGARCH64 + masm.push(ra); +#endif masm.setupUnalignedABICall(scratchReg); masm.passABIArg(FloatReg0, MoveOp::DOUBLE); masm.callWithABI(BitwiseCast(JS::ToInt32)); +#ifdef JS_CODEGEN_LOONGARCH64 + masm.pop(ra); +#endif masm.storeCallInt32Result(scratchReg); masm.bind(&doneTruncate);