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

Fix arm64 prolog generation for register masks with holes. #21395

Merged
merged 24 commits into from
Dec 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
60b6775
Check that `genSaveCalleeSavedRegistersHelp` doesn't accept `REG_LR`.
Dec 5, 2018
29805f0
Extract `genPushOrPopCalleeSavedRegisters`.
Dec 5, 2018
7252726
Extend `genSaveCaleeSavedRegisterGroup` to support float.
Dec 6, 2018
43c7ba9
Use `genSaveCaleeSavedRegisterGroup` for floats.
Dec 6, 2018
9adcfe8
Extract `genRestoreCaleeSavedRegisterGroup`.
Dec 6, 2018
a1a2549
Prepare `genPopCalleeSavedRegisters` to work with float.
Dec 6, 2018
3d85f13
Use `genRestoreCaleeSavedRegisterGroup` for float.
Dec 6, 2018
10d2e72
Check that `genRestoreCalleeSavedRegistersHelp` doesn't restore `REG_…
Dec 6, 2018
8c8fba2
Extract `CheckSPOffset`.
Dec 6, 2018
667f2ef
Format `genRestoreCaleeSavedRegisterGroup` as `genSaveCalleeSavedRegi…
Dec 6, 2018
15adca7
Extract `buildRegPairsStack` from `genSaveCaleeSavedRegisterGroup` an…
Dec 6, 2018
08033a7
Extract `GetSlotSizeForRegsInMask`.
Dec 6, 2018
e606e78
Tolerate holes in arm64 prolog/epilog register masks.
Dec 6, 2018
5a64b77
Reenable the test.
Dec 6, 2018
66731e4
Add new methods headers.
Dec 6, 2018
9bd9cb5
Fix typos.
Dec 6, 2018
24b6813
Do not use non-const references.
Dec 7, 2018
886d9af
Describe `buildRegPairsStack` better.
Dec 7, 2018
833cba8
Change signature of `buildRegPairsStack` to avoid copyings of big str…
Dec 7, 2018
ae42682
Return the logic for `RBM_LR`.
Dec 7, 2018
ecdefc6
Clean-up some unused variables.
Dec 7, 2018
477023c
Fix comments.
Dec 18, 2018
46010a5
Get rid of file-level functions.
Dec 20, 2018
178c0db
Make new methods static.
Dec 21, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion src/jit/codegen.h
Original file line number Diff line number Diff line change
Expand Up @@ -298,8 +298,42 @@ class CodeGen : public CodeGenInterface

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

void genSaveCalleeSavedRegistersHelp(regMaskTP regsToSaveMask, int lowestCalleeSavedOffset, int spDelta);
#ifdef DEBUG
static void genCheckSPOffset(bool isRegsCountOdd, int spOffset, int slotSize);
#endif // DEBUG

// A simple struct to keep register pairs for prolog and epilog.
struct RegPair
{
regNumber reg1;
regNumber reg2;

RegPair() : reg1(REG_NA), reg2(REG_NA)
{
}

RegPair(regNumber reg1) : reg1(reg1), reg2(REG_NA)
{
}

RegPair(regNumber reg1, regNumber reg2) : reg1(reg1), reg2(reg2)
{
assert(reg2 == REG_NEXT(reg1));
}
};

static void genBuildRegPairsStack(regMaskTP regsMask, ArrayStack<RegPair>* regStack);

static int genGetSlotSizeForRegsInMask(regMaskTP regsMask);

int genSaveCalleeSavedRegisterGroup(regMaskTP regsMask,
int spDelta,
int spOffset DEBUGARG(bool isRegsToSaveCountOdd));
int genRestoreCalleeSavedRegisterGroup(regMaskTP regsMask,
int spDelta,
int spOffset DEBUGARG(bool isRegsToRestoreCountOdd));

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

void genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroed);
Expand Down
Loading