Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 62298e6

Browse files
author
Sergey Andreenko
authored
Use saveNext unwind opcode on arm64. (#21683)
* Use `saveNext` opcode on arm64. * Support using of `save_next` on int/float border. * Delete the extra requirement that an epilog sequences can't start from `save_next`. * response feedback
1 parent 41dfe19 commit 62298e6

File tree

4 files changed

+116
-108
lines changed

4 files changed

+116
-108
lines changed

src/jit/arraystack.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ class ArrayStack
122122
}
123123

124124
// return a reference to the i'th from the bottom
125-
T BottomRef(int indx)
125+
T& BottomRef(int indx)
126126
{
127127
assert(tosIndex > indx);
128128
return data[indx];

src/jit/codegen.h

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -287,14 +287,19 @@ class CodeGen : public CodeGenInterface
287287
regNumber reg2,
288288
int spOffset,
289289
int spDelta,
290-
bool lastSavedWasPreviousPair,
290+
bool useSaveNextPair,
291291
regNumber tmpReg,
292292
bool* pTmpRegIsZero);
293293

294294
void genPrologSaveReg(regNumber reg1, int spOffset, int spDelta, regNumber tmpReg, bool* pTmpRegIsZero);
295295

296-
void genEpilogRestoreRegPair(
297-
regNumber reg1, regNumber reg2, int spOffset, int spDelta, regNumber tmpReg, bool* pTmpRegIsZero);
296+
void genEpilogRestoreRegPair(regNumber reg1,
297+
regNumber reg2,
298+
int spOffset,
299+
int spDelta,
300+
bool useSaveNextPair,
301+
regNumber tmpReg,
302+
bool* pTmpRegIsZero);
298303

299304
void genEpilogRestoreReg(regNumber reg1, int spOffset, int spDelta, regNumber tmpReg, bool* pTmpRegIsZero);
300305

@@ -307,27 +312,29 @@ class CodeGen : public CodeGenInterface
307312
{
308313
regNumber reg1;
309314
regNumber reg2;
315+
bool useSaveNextPair;
310316

311-
RegPair(regNumber reg1) : reg1(reg1), reg2(REG_NA)
317+
RegPair(regNumber reg1) : reg1(reg1), reg2(REG_NA), useSaveNextPair(false)
312318
{
313319
}
314320

315-
RegPair(regNumber reg1, regNumber reg2) : reg1(reg1), reg2(reg2)
321+
RegPair(regNumber reg1, regNumber reg2) : reg1(reg1), reg2(reg2), useSaveNextPair(false)
316322
{
317323
assert(reg2 == REG_NEXT(reg1));
318324
}
319325
};
320326

321327
static void genBuildRegPairsStack(regMaskTP regsMask, ArrayStack<RegPair>* regStack);
328+
static void genSetUseSaveNextPairs(ArrayStack<RegPair>* regStack);
322329

323330
static int genGetSlotSizeForRegsInMask(regMaskTP regsMask);
324331

325-
int genSaveCalleeSavedRegisterGroup(regMaskTP regsMask,
326-
int spDelta,
327-
int spOffset DEBUGARG(bool isRegsToSaveCountOdd));
328-
int genRestoreCalleeSavedRegisterGroup(regMaskTP regsMask,
329-
int spDelta,
330-
int spOffset DEBUGARG(bool isRegsToRestoreCountOdd));
332+
void genSaveCalleeSavedRegisterGroup(regMaskTP regsMask,
333+
int spDelta,
334+
int spOffset DEBUGARG(bool isRegsToSaveCountOdd));
335+
void genRestoreCalleeSavedRegisterGroup(regMaskTP regsMask,
336+
int spDelta,
337+
int spOffset DEBUGARG(bool isRegsToRestoreCountOdd));
331338

332339
void genSaveCalleeSavedRegistersHelp(regMaskTP regsToSaveMask, int lowestCalleeSavedOffset, int spDelta);
333340
void genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, int lowestCalleeSavedOffset, int spDelta);

0 commit comments

Comments
 (0)