Update maximum allowed arm prolog size
authorBruce Forstall <brucefo@microsoft.com>
Fri, 12 Apr 2019 20:15:42 +0000 (13:15 -0700)
committerBruce Forstall <brucefo@microsoft.com>
Fri, 12 Apr 2019 20:22:22 +0000 (13:22 -0700)
Change dotnet/coreclr#23715 changed the localloc stack probe loop to load a
negative constant instead of zero to start the probing loop.
This increased the size of the probing loop, and hence the
size of the maximum prolog, by 4 bytes. Bump the assert on
the maximum size to match.

Note that as the comment says, the maximum size there is not
actually a maximum (it was originally), it is just to alert
us when the maximum generated prolog size has gone up.

Fixes dotnet/coreclr#23920

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

src/coreclr/src/jit/codegenarmarch.cpp
src/coreclr/src/jit/unwind.h

index 55b3f0a..add7b98 100644 (file)
@@ -3849,7 +3849,9 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni
 
         // Generate:
         //
-        //      mov rOffset, -pageSize
+        //      mov rOffset, -pageSize    // On arm, this turns out to be "movw r1, 0xf000; sxth r1, r1".
+        //                                // We could save 4 bytes in the prolog by using "movs r1, 0" at the
+        //                                // runtime expense of running a useless first loop iteration.
         //      mov rLimit, -frameSize
         // loop:
         //      ldr rTemp, [sp + rOffset] // rTemp = wzr on ARM64
index a78df32..06396f2 100644 (file)
@@ -20,8 +20,8 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 // You can increase this "max" number if necessary.
 
 #if defined(_TARGET_ARM_)
-const unsigned MAX_PROLOG_SIZE_BYTES = 40;
-const unsigned MAX_EPILOG_SIZE_BYTES = 40;
+const unsigned MAX_PROLOG_SIZE_BYTES = 44;
+const unsigned MAX_EPILOG_SIZE_BYTES = 44;
 #define UWC_END 0xFF // "end" unwind code
 #define UW_MAX_FRAGMENT_SIZE_BYTES (1U << 19)
 #define UW_MAX_CODE_WORDS_COUNT 15      // Max number that can be encoded in the "Code Words" field of the .pdata record