Add ARM special instructions implementation for CRC32.

This commit is contained in:
2021-09-29 02:50:34 +01:00
parent 0f90f7c967
commit e9eb3abdae
3 changed files with 164 additions and 7 deletions

View File

@@ -32,6 +32,7 @@
using System;
using System.IO;
using System.Runtime.Intrinsics.Arm;
using System.Runtime.Intrinsics.X86;
using System.Text;
using Aaru.CommonTypes.Interfaces;
@@ -411,15 +412,31 @@ namespace Aaru6.Checksums
static void Step(ref uint previousCrc, uint[][] table, byte[] data, uint len, bool useIso)
{
if(useIso &&
Pclmulqdq.IsSupported &&
Sse41.IsSupported &&
Ssse3.IsSupported &&
Sse2.IsSupported)
if(useIso)
{
previousCrc = ~Clmul.Step(data, len, ~previousCrc);
if(Pclmulqdq.IsSupported &&
Sse41.IsSupported &&
Ssse3.IsSupported &&
Sse2.IsSupported)
{
previousCrc = ~Clmul.Step(data, len, ~previousCrc);
return;
return;
}
if(Crc32.Arm64.IsSupported)
{
previousCrc = ArmSimd.Step64(data, len, previousCrc);
return;
}
if(Crc32.IsSupported)
{
previousCrc = ArmSimd.Step32(data, len, previousCrc);
return;
}
}
// Unroll according to Intel slicing by uint8_t