@@ -4926,7 +4926,7 @@ void CodeGen::genEnregisterOSRArgsAndLocals()
4926
4926
4927
4927
GetEmitter ()->emitIns_R_AR (ins_Load (lclTyp), size, varDsc->GetRegNum (), genFramePointerReg (), offset);
4928
4928
4929
- #elif defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
4929
+ #elif defined(TARGET_ARM64)
4930
4930
4931
4931
// Patchpoint offset is from top of Tier0 frame
4932
4932
//
@@ -4958,7 +4958,39 @@ void CodeGen::genEnregisterOSRArgsAndLocals()
4958
4958
4959
4959
genInstrWithConstant (ins_Load (lclTyp), size, varDsc->GetRegNum (), genFramePointerReg (), offset, initReg);
4960
4960
*pInitRegZeroed = false ;
4961
- #endif // TARGET_ARM64 || TARGET_LOONGARCH64 || TARGET_RISCV64
4961
+ #elif defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
4962
+
4963
+ // Patchpoint offset is from top of Tier0 frame
4964
+ //
4965
+ // We need to determine the frame-pointer relative
4966
+ // offset for this variable in the osr frame.
4967
+ //
4968
+ // First get the fp's relative offset within Tier0 frame
4969
+ //
4970
+ const int tier0FrameOffset = (int )compiler->info .compPatchpointInfo ->CalleeSaveRegisters ();
4971
+
4972
+ // then add the OSR frame size
4973
+ //
4974
+ const int osrFrameSize = genTotalFrameSize ();
4975
+
4976
+ // then subtract OSR SP-FP delta
4977
+ //
4978
+ const int osrSpToFpDelta = genSPtoFPdelta ();
4979
+
4980
+ // | => tier0 top of frame relative
4981
+ // | + => tier0's fp relative offset
4982
+ // | | + => osr bottom of frame (sp) relative
4983
+ // | | | - => osr fp relative
4984
+ // | | | |
4985
+ const int offset = stkOffs + tier0FrameOffset + osrFrameSize - osrSpToFpDelta;
4986
+
4987
+ JITDUMP (" ---OSR--- V%02u (reg) Tier0 virtual offset %d OSR frame size %d OSR sp-fp "
4988
+ " delta %d total offset %d (0x%x)\n " ,
4989
+ varNum, stkOffs, osrFrameSize, osrSpToFpDelta, offset, offset);
4990
+
4991
+ genInstrWithConstant (ins_Load (lclTyp), size, varDsc->GetRegNum (), genFramePointerReg (), offset, initReg);
4992
+ *pInitRegZeroed = false ;
4993
+ #endif // TARGET_LOONGARCH64 || TARGET_RISCV64
4962
4994
}
4963
4995
}
4964
4996
@@ -5563,20 +5595,13 @@ void CodeGen::genFinalizeFrame()
5563
5595
#endif // defined(TARGET_XARCH)
5564
5596
5565
5597
#if defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
5566
- if (isFramePointerUsed ())
5567
- {
5568
- // For a FP based frame we have to push/pop the FP register
5569
- //
5570
- maskCalleeRegsPushed |= RBM_FPBASE;
5598
+ // This assert check that we are not using REG_FP
5599
+ assert (!regSet.rsRegsModified (RBM_FPBASE));
5571
5600
5572
- // This assert check that we are not using REG_FP
5573
- // as both the frame pointer and as a codegen register
5574
- //
5575
- assert (!regSet.rsRegsModified (RBM_FPBASE));
5576
- }
5601
+ assert (isFramePointerUsed ());
5602
+ // we always push FP/RA. See genPushCalleeSavedRegisters
5603
+ maskCalleeRegsPushed |= (RBM_FPBASE | RBM_RA);
5577
5604
5578
- // we always push RA. See genPushCalleeSavedRegisters
5579
- maskCalleeRegsPushed |= RBM_RA;
5580
5605
#endif // TARGET_LOONGARCH64 || TARGET_RISCV64
5581
5606
5582
5607
compiler->compCalleeRegsPushed = genCountBits (maskCalleeRegsPushed);
0 commit comments