diff options
author | JUNG DONG-HEON <dheon.jung@samsung.com> | 2020-05-28 11:15:47 +0900 |
---|---|---|
committer | 이형주/Common Platform Lab(SR)/Staff Engineer/삼성전자 <leee.lee@samsung.com> | 2020-06-18 07:38:46 +0900 |
commit | 488be5d790020489f7f4dd7d43680f43b101dbd4 (patch) | |
tree | e051d18299dfa580fabdb1ca32863f517f0ab356 /src/vm/comdelegate.h | |
parent | 45278569f1e32a5e3ab52f1643ee5f0f3b1f00c9 (diff) | |
download | coreclr-488be5d790020489f7f4dd7d43680f43b101dbd4.tar.gz coreclr-488be5d790020489f7f4dd7d43680f43b101dbd4.tar.bz2 coreclr-488be5d790020489f7f4dd7d43680f43b101dbd4.zip |
Fix GenerateShuffleArray to support cyclic shuffles (dotnet/coreclr#26169)
* Fix GenerateShuffleArray to support cyclic shuffles
The GenerateShuffleArray was not handling case when there was a cycle in
the register / stack slots shuffle and it resulted in an infinite loop
in this function. This issue is Unix Amd64 ABI specific.
To fix that, this change reworks the algorithm completely. Besides
fixing the issue, it has also better performance in some cases.
To fix the cyclic shuffling, I needed an extra helper register. However,
there was no available general purpose register available, so I had to
use xmm8 for this purpose.
* Remove special handling of the hang from ABI stress
Diffstat (limited to 'src/vm/comdelegate.h')
-rw-r--r-- | src/vm/comdelegate.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/src/vm/comdelegate.h b/src/vm/comdelegate.h index 3d5ec8e30e..330f1f8886 100644 --- a/src/vm/comdelegate.h +++ b/src/vm/comdelegate.h @@ -194,6 +194,7 @@ struct ShuffleEntry OFSMASK = 0x7fff, // Mask to get stack offset OFSREGMASK = 0x1fff, // Mask to get register index SENTINEL = 0xffff, // Indicates end of shuffle array + HELPERREG = 0xcfff, // Use a helper register as source or destination (used to handle cycles in the shuffling) }; #if defined(_TARGET_AMD64_) && !defined(UNIX_AMD64_ABI) |