@@ -4087,7 +4087,7 @@ void CodeGen::genEnregisterOSRArgsAndLocals()
40874087
40884088 GetEmitter ()->emitIns_R_AR (ins_Load (lclTyp), size, varDsc->GetRegNum (), genFramePointerReg (), offset);
40894089
4090- #elif defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
4090+ #elif defined(TARGET_ARM64)
40914091
40924092 // Patchpoint offset is from top of Tier0 frame
40934093 //
@@ -4119,7 +4119,39 @@ void CodeGen::genEnregisterOSRArgsAndLocals()
41194119
41204120 genInstrWithConstant (ins_Load (lclTyp), size, varDsc->GetRegNum (), genFramePointerReg (), offset, initReg);
41214121 *pInitRegZeroed = false ;
4122- #endif // TARGET_ARM64 || TARGET_LOONGARCH64 || TARGET_RISCV64
4122+ #elif defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
4123+
4124+ // Patchpoint offset is from top of Tier0 frame
4125+ //
4126+ // We need to determine the frame-pointer relative
4127+ // offset for this variable in the osr frame.
4128+ //
4129+ // First get the fp's relative offset within Tier0 frame
4130+ //
4131+ const int tier0FrameOffset = (int )compiler->info .compPatchpointInfo ->CalleeSaveRegisters ();
4132+
4133+ // then add the OSR frame size
4134+ //
4135+ const int osrFrameSize = genTotalFrameSize ();
4136+
4137+ // then subtract OSR SP-FP delta
4138+ //
4139+ const int osrSpToFpDelta = genSPtoFPdelta ();
4140+
4141+ // | => tier0 top of frame relative
4142+ // | + => tier0's fp relative offset
4143+ // | | + => osr bottom of frame (sp) relative
4144+ // | | | - => osr fp relative
4145+ // | | | |
4146+ const int offset = stkOffs + tier0FrameOffset + osrFrameSize - osrSpToFpDelta;
4147+
4148+ JITDUMP (" ---OSR--- V%02u (reg) Tier0 virtual offset %d OSR frame size %d OSR sp-fp "
4149+ " delta %d total offset %d (0x%x)\n " ,
4150+ varNum, stkOffs, osrFrameSize, osrSpToFpDelta, offset, offset);
4151+
4152+ genInstrWithConstant (ins_Load (lclTyp), size, varDsc->GetRegNum (), genFramePointerReg (), offset, initReg);
4153+ *pInitRegZeroed = false ;
4154+ #endif // TARGET_LOONGARCH64 || TARGET_RISCV64
41234155 }
41244156}
41254157
@@ -4745,20 +4777,13 @@ void CodeGen::genFinalizeFrame()
47454777#endif // defined(TARGET_XARCH)
47464778
47474779#if defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
4748- if (isFramePointerUsed ())
4749- {
4750- // For a FP based frame we have to push/pop the FP register
4751- //
4752- maskCalleeRegsPushed |= RBM_FPBASE;
4780+ // This assert check that we are not using REG_FP
4781+ assert (!regSet.rsRegsModified (RBM_FPBASE));
47534782
4754- // This assert check that we are not using REG_FP
4755- // as both the frame pointer and as a codegen register
4756- //
4757- assert (!regSet.rsRegsModified (RBM_FPBASE));
4758- }
4783+ assert (isFramePointerUsed ());
4784+ // we always push FP/RA. See genPushCalleeSavedRegisters
4785+ maskCalleeRegsPushed |= (RBM_FPBASE | RBM_RA);
47594786
4760- // we always push RA. See genPushCalleeSavedRegisters
4761- maskCalleeRegsPushed |= RBM_RA;
47624787#endif // TARGET_LOONGARCH64 || TARGET_RISCV64
47634788
47644789 compiler->compCalleeRegsPushed = genCountBits (maskCalleeRegsPushed);
0 commit comments