diff options
Diffstat (limited to 'crypto/src/math/raw/Interleave.cs')
-rw-r--r-- | crypto/src/math/raw/Interleave.cs | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/crypto/src/math/raw/Interleave.cs b/crypto/src/math/raw/Interleave.cs index 02aa79551..3e994a43c 100644 --- a/crypto/src/math/raw/Interleave.cs +++ b/crypto/src/math/raw/Interleave.cs @@ -12,23 +12,37 @@ namespace Org.BouncyCastle.Math.Raw private const ulong M64 = 0x5555555555555555UL; private const ulong M64R = 0xAAAAAAAAAAAAAAAAUL; - internal static uint Expand8to16(uint x) + internal static uint Expand8to16(byte x) { - x &= 0xFFU; - x = (x | (x << 4)) & 0x0F0FU; - x = (x | (x << 2)) & 0x3333U; - x = (x | (x << 1)) & 0x5555U; - return x; + uint t = x; + +#if NETCOREAPP3_0_OR_GREATER + if (Bmi2.IsSupported) + { + return Bmi2.ParallelBitDeposit(t, 0x55555555U); + } +#endif + t = (t | (t << 4)) & 0x0F0FU; + t = (t | (t << 2)) & 0x3333U; + t = (t | (t << 1)) & 0x5555U; + return t; } - internal static uint Expand16to32(uint x) + internal static uint Expand16to32(ushort x) { - x &= 0xFFFFU; - x = (x | (x << 8)) & 0x00FF00FFU; - x = (x | (x << 4)) & 0x0F0F0F0FU; - x = (x | (x << 2)) & 0x33333333U; - x = (x | (x << 1)) & 0x55555555U; - return x; + uint t = x; + +#if NETCOREAPP3_0_OR_GREATER + if (Bmi2.IsSupported) + { + return Bmi2.ParallelBitDeposit(t, 0x55555555U); + } +#endif + t = (t | (t << 8)) & 0x00FF00FFU; + t = (t | (t << 4)) & 0x0F0F0F0FU; + t = (t | (t << 2)) & 0x33333333U; + t = (t | (t << 1)) & 0x55555555U; + return t; } internal static ulong Expand32to64(uint x) |