Arm64: always save int registers at higher addresses than float regs
authorBruce Forstall <brucefo@microsoft.com>
Thu, 7 Mar 2019 00:18:32 +0000 (16:18 -0800)
committerBruce Forstall <brucefo@microsoft.com>
Thu, 7 Mar 2019 00:18:32 +0000 (16:18 -0800)
This is just to be consistent across all frame types, for simplicity.

Commit migrated from https://github.com/dotnet/coreclr/commit/5873b05d04a2cb735a785a1b4fd795cd71aca375

src/coreclr/src/jit/codegenarm64.cpp

index a9caf10..a43de5b 100644 (file)
@@ -613,28 +613,22 @@ void CodeGen::genSaveCalleeSavedRegistersHelp(regMaskTP regsToSaveMask, int lowe
     // We also can save FP and LR, even though they are not in RBM_CALLEE_SAVED.
     assert(regsToSaveCount <= genCountBits(RBM_CALLEE_SAVED | RBM_FP | RBM_LR));
 
-    if (genSaveFpLrWithAllCalleeSavedRegisters)
-    {
-        // TODO: always save int regs higher than float, to be consistent?
-        regMaskTP maskSaveRegsFloat = regsToSaveMask & RBM_ALLFLOAT;
-        regMaskTP maskSaveRegsInt   = regsToSaveMask & ~maskSaveRegsFloat;
+    // Save integer registers at higher addresses than floating-point registers.
 
-        if (maskSaveRegsFloat != RBM_NONE)
-        {
-            genSaveCalleeSavedRegisterGroup(maskSaveRegsFloat, spDelta, lowestCalleeSavedOffset);
-            spDelta = 0;
-            lowestCalleeSavedOffset += genCountBits(maskSaveRegsFloat) * FPSAVE_REGSIZE_BYTES;
-        }
+    regMaskTP maskSaveRegsFloat = regsToSaveMask & RBM_ALLFLOAT;
+    regMaskTP maskSaveRegsInt   = regsToSaveMask & ~maskSaveRegsFloat;
 
-        if (maskSaveRegsInt != RBM_NONE)
-        {
-            genSaveCalleeSavedRegisterGroup(maskSaveRegsInt, spDelta, lowestCalleeSavedOffset);
-            // No need to update spDelta, lowestCalleeSavedOffset since they're not used after this.
-        }
+    if (maskSaveRegsFloat != RBM_NONE)
+    {
+        genSaveCalleeSavedRegisterGroup(maskSaveRegsFloat, spDelta, lowestCalleeSavedOffset);
+        spDelta = 0;
+        lowestCalleeSavedOffset += genCountBits(maskSaveRegsFloat) * FPSAVE_REGSIZE_BYTES;
     }
-    else
+
+    if (maskSaveRegsInt != RBM_NONE)
     {
-        genSaveCalleeSavedRegisterGroup(regsToSaveMask, spDelta, lowestCalleeSavedOffset);
+        genSaveCalleeSavedRegisterGroup(maskSaveRegsInt, spDelta, lowestCalleeSavedOffset);
+        // No need to update spDelta, lowestCalleeSavedOffset since they're not used after this.
     }
 }
 
@@ -736,31 +730,25 @@ void CodeGen::genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, in
     static_assert_no_msg(REGSIZE_BYTES == FPSAVE_REGSIZE_BYTES);
     int spOffset = lowestCalleeSavedOffset + regsToRestoreCount * REGSIZE_BYTES;
 
-    if (genSaveFpLrWithAllCalleeSavedRegisters)
-    {
-        // TODO: always save int regs higher than float, to be consistent?
-        regMaskTP maskRestoreRegsFloat = regsToRestoreMask & RBM_ALLFLOAT;
-        regMaskTP maskRestoreRegsInt   = regsToRestoreMask & ~maskRestoreRegsFloat;
+    // Save integer registers at higher addresses than floating-point registers.
 
-        // Restore in the opposite order of saving.
+    regMaskTP maskRestoreRegsFloat = regsToRestoreMask & RBM_ALLFLOAT;
+    regMaskTP maskRestoreRegsInt   = regsToRestoreMask & ~maskRestoreRegsFloat;
 
-        if (maskRestoreRegsInt != RBM_NONE)
-        {
-            int spIntDelta = (maskRestoreRegsFloat != RBM_NONE) ? 0 : spDelta; // should we delay the SP adjustment?
-            genRestoreCalleeSavedRegisterGroup(maskRestoreRegsInt, spIntDelta, spOffset);
-            spOffset -= genCountBits(maskRestoreRegsInt) * REGSIZE_BYTES;
-        }
+    // Restore in the opposite order of saving.
 
-        if (maskRestoreRegsFloat != RBM_NONE)
-        {
-            // If there is any spDelta, it must be used here.
-            genRestoreCalleeSavedRegisterGroup(maskRestoreRegsFloat, spDelta, spOffset);
-            // No need to update spOffset since it's not used after this.
-        }
+    if (maskRestoreRegsInt != RBM_NONE)
+    {
+        int spIntDelta = (maskRestoreRegsFloat != RBM_NONE) ? 0 : spDelta; // should we delay the SP adjustment?
+        genRestoreCalleeSavedRegisterGroup(maskRestoreRegsInt, spIntDelta, spOffset);
+        spOffset -= genCountBits(maskRestoreRegsInt) * REGSIZE_BYTES;
     }
-    else
+
+    if (maskRestoreRegsFloat != RBM_NONE)
     {
-        genRestoreCalleeSavedRegisterGroup(regsToRestoreMask, spDelta, spOffset);
+        // If there is any spDelta, it must be used here.
+        genRestoreCalleeSavedRegisterGroup(maskRestoreRegsFloat, spDelta, spOffset);
+        // No need to update spOffset since it's not used after this.
     }
 }