-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Arm64/SVE: Add support to handle predicate registers as callee-trash #104065
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
b23e311
a15808b
570583f
a4b687c
2a175f9
c19234e
08f3748
1e69fd3
bcfd8a8
bb97d80
5535c69
775db15
a9b64a8
0d91f29
387ceef
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -5591,9 +5591,9 @@ unsigned Compiler::lvaGetMaxSpillTempSize() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Doing this all in one pass is 'hard'. So instead we do it in 2 basic passes: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* 1. Assign all the offsets relative to the Virtual '0'. Offsets above (the | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* 1. Assign all the offsets relative to the Virtual '0'. Offsets above (thetemp->tdAdjustTempOffs(delta); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* incoming arguments) are positive. Offsets below (everything else) are | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* negative. This pass also calcuates the total frame size (between Caller's | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* negative. This pass also calculates the total frame size (between Caller's | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* SP/return address and the Ambient SP). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* 2. Figure out where to place the frame pointer, and then adjust the offsets | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* as needed for the final stack size and whether the offset is frame pointer | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -5872,6 +5872,14 @@ void Compiler::lvaFixVirtualFrameOffsets() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for (TempDsc* temp = codeGen->regSet.tmpListBeg(); temp != nullptr; temp = codeGen->regSet.tmpListNxt(temp)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
temp->tdAdjustTempOffs(delta); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#if defined(TARGET_ARM64) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
for (int i = 0; i < TYP_COUNT; i++) | |
{ | |
if (var_types(i) != RegSet::tmpNormalizeType(var_types(i))) | |
{ | |
// Only normalized types should have anything in the maxSpill array. | |
// We assume here that if type 'i' does not normalize to itself, then | |
// nothing else normalizes to 'i', either. | |
assert(maxSpill[i] == 0); | |
} | |
if (maxSpill[i] != 0) | |
{ | |
JITDUMP(" %s: %d\n", varTypeName(var_types(i)), maxSpill[i]); | |
compiler->codeGen->regSet.tmpPreAllocateTemps(var_types(i), maxSpill[i]); | |
} | |
} |
In tmpPreAllocateTemps()
, we iterate through the number of slots we want to allocate and create them:
runtime/src/coreclr/jit/regset.cpp
Lines 694 to 708 in 2b4a4bc
for (unsigned i = 0; i < count; i++) | |
{ | |
tmpCount++; | |
tmpSize += size; | |
#ifdef TARGET_ARM | |
if (type == TYP_DOUBLE) | |
{ | |
// Adjust tmpSize to accommodate possible alignment padding. | |
// Note that at this point the offsets aren't yet finalized, so we don't yet know if it will be required. | |
tmpSize += TARGET_POINTER_SIZE; | |
} | |
#endif // TARGET_ARM | |
TempDsc* temp = new (m_rsCompiler, CMK_Unknown) TempDsc(-((int)tmpCount), size, type); |
Uh oh!
There was an error while loading. Please reload this page.