@@ -7782,6 +7782,11 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe
77827782{
77837783 assert (compiler->compGeneratingProlog );
77847784
7785+ // The 'initReg' could have been calculated as one of the callee-saved registers (let's say T0, T1 and T2 are in
7786+ // use, so the next possible register is S1, which should be callee-save register). This is fine, as long as we
7787+ // save callee-saved registers before using 'initReg' for the first time. Instead, we can use REG_SCRATCH
7788+ // beforehand. We don't care if REG_SCRATCH will be overwritten, so we'll skip 'RegZeroed check'.
7789+ //
77857790 // Unlike on x86/x64, we can also push float registers to stack
77867791 regMaskTP rsPushRegs = regSet.rsGetModifiedRegsMask () & RBM_CALLEE_SAVED;
77877792
@@ -7894,11 +7899,11 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe
78947899 calleeSaveSPDelta = AlignUp ((UINT)offset, STACK_ALIGN);
78957900 offset = calleeSaveSPDelta - offset;
78967901
7897- genStackPointerAdjustment (-calleeSaveSPDelta, initReg, pInitRegZeroed , /* reportUnwindData */ true );
7902+ genStackPointerAdjustment (-calleeSaveSPDelta, REG_SCRATCH, nullptr , /* reportUnwindData */ true );
78987903 }
78997904 else
79007905 {
7901- genStackPointerAdjustment (-totalFrameSize, initReg, pInitRegZeroed , /* reportUnwindData */ true );
7906+ genStackPointerAdjustment (-totalFrameSize, REG_SCRATCH, nullptr , /* reportUnwindData */ true );
79027907 }
79037908 }
79047909
@@ -7907,6 +7912,8 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe
79077912 genSaveCalleeSavedRegistersHelp (rsPushRegs, offset, 0 );
79087913 offset += (int )(genCountBits (rsPushRegs) << 3 ); // each reg has 8 bytes
79097914
7915+ // From now on, we can safely use initReg.
7916+
79107917 emit->emitIns_R_R_I (INS_sd, EA_PTRSIZE, REG_RA, REG_SPBASE, offset);
79117918 compiler->unwindSaveReg (REG_RA, offset);
79127919
0 commit comments