@@ -4087,7 +4087,7 @@ void CodeGen::genEnregisterOSRArgsAndLocals()
4087
4087
4088
4088
GetEmitter ()->emitIns_R_AR (ins_Load (lclTyp), size, varDsc->GetRegNum (), genFramePointerReg (), offset);
4089
4089
4090
- #elif defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
4090
+ #elif defined(TARGET_ARM64)
4091
4091
4092
4092
// Patchpoint offset is from top of Tier0 frame
4093
4093
//
@@ -4119,7 +4119,39 @@ void CodeGen::genEnregisterOSRArgsAndLocals()
4119
4119
4120
4120
genInstrWithConstant (ins_Load (lclTyp), size, varDsc->GetRegNum (), genFramePointerReg (), offset, initReg);
4121
4121
*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
4123
4155
}
4124
4156
}
4125
4157
@@ -4745,20 +4777,13 @@ void CodeGen::genFinalizeFrame()
4745
4777
#endif // defined(TARGET_XARCH)
4746
4778
4747
4779
#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));
4753
4782
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);
4759
4786
4760
- // we always push RA. See genPushCalleeSavedRegisters
4761
- maskCalleeRegsPushed |= RBM_RA;
4762
4787
#endif // TARGET_LOONGARCH64 || TARGET_RISCV64
4763
4788
4764
4789
compiler->compCalleeRegsPushed = genCountBits (maskCalleeRegsPushed);
0 commit comments