Skip to content

Commit ac3e2f5

Browse files
authored
Add and fix AArch64 NEON implementation for Blake2 and Blake3 (#81)
1 parent 91da3bb commit ac3e2f5

8 files changed

Lines changed: 4846 additions & 1 deletion

HashLib/src/Crypto/HlpBlake2BDispatch.pas

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,15 @@ procedure Blake2B_Compress_Avx2(AState, AMsg, ACounterFlags, AIV: Pointer);
124124

125125
{$ENDIF HASHLIB_X86_64_ASM}
126126

127+
{$IFDEF HASHLIB_AARCH64_ASM}
128+
129+
procedure Blake2B_Compress_Neon(AState, AMsg, ACounterFlags, AIV: Pointer);
130+
{$I ..\Include\Simd\Common\SimdProc4Begin_aarch64.inc}
131+
{$I ..\Include\Simd\Blake2B\Blake2BCompressNeon_aarch64.inc}
132+
end;
133+
134+
{$ENDIF HASHLIB_AARCH64_ASM}
135+
127136
// =============================================================================
128137
// Dispatch initialization
129138
// =============================================================================
@@ -151,6 +160,14 @@ procedure InitDispatch();
151160
end;
152161
end;
153162
{$ENDIF}
163+
{$IFDEF HASHLIB_AARCH64_ASM}
164+
case TCpuFeatures.Arm.SelectSlot([TArmSimdLevel.NEON]) of
165+
TArmSimdLevel.NEON:
166+
begin
167+
Blake2B_Compress := @Blake2B_Compress_Neon;
168+
end;
169+
end;
170+
{$ENDIF}
154171
end;
155172

156173
initialization

HashLib/src/Crypto/HlpBlake2SDispatch.pas

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,15 @@ procedure Blake2S_Compress_Avx2(AState, AMsg, ACounterFlags, AIV: Pointer);
122122

123123
{$ENDIF HASHLIB_X86_64_ASM}
124124

125+
{$IFDEF HASHLIB_AARCH64_ASM}
126+
127+
procedure Blake2S_Compress_Neon(AState, AMsg, ACounterFlags, AIV: Pointer);
128+
{$I ..\Include\Simd\Common\SimdProc4Begin_aarch64.inc}
129+
{$I ..\Include\Simd\Blake2S\Blake2SCompressNeon_aarch64.inc}
130+
end;
131+
132+
{$ENDIF HASHLIB_AARCH64_ASM}
133+
125134
// =============================================================================
126135
// Dispatch initialization
127136
// =============================================================================
@@ -149,6 +158,14 @@ procedure InitDispatch();
149158
end;
150159
end;
151160
{$ENDIF}
161+
{$IFDEF HASHLIB_AARCH64_ASM}
162+
case TCpuFeatures.Arm.SelectSlot([TArmSimdLevel.NEON]) of
163+
TArmSimdLevel.NEON:
164+
begin
165+
Blake2S_Compress := @Blake2S_Compress_Neon;
166+
end;
167+
end;
168+
{$ENDIF}
152169
end;
153170

154171
initialization

HashLib/src/Crypto/HlpBlake3Dispatch.pas

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,41 @@ procedure Blake3_HashMany_Avx2(AInput, AKey, AOut: Pointer;
703703

704704
{$ENDIF HASHLIB_X86_64_ASM}
705705

706+
{$IFDEF HASHLIB_AARCH64_ASM}
707+
708+
procedure Blake3_Compress_Neon(AState, AMsg, ACV, ACounterFlags: Pointer);
709+
{$I ..\Include\Simd\Common\SimdProc4Begin_aarch64.inc}
710+
{$I ..\Include\Simd\Blake3\Blake3CompressNeon_aarch64.inc}
711+
end;
712+
713+
procedure Blake3_Hash4_Neon(AInput, AKey, AOut: Pointer;
714+
ANumChunks: Int32; ACounter: UInt64; AFlags: UInt32);
715+
{$I ..\Include\Simd\Common\SimdProc6Begin_aarch64.inc}
716+
{$I ..\Include\Simd\Blake3\Blake3Hash4Neon_aarch64.inc}
717+
end;
718+
719+
// NEON hash_many: hash4 -> delegate remainder to scalar hash_many
720+
procedure Blake3_HashMany_Neon(AInput, AKey, AOut: Pointer;
721+
ANumChunks: Int32; ACounter: UInt64; AFlags: UInt32);
722+
var
723+
LPInput, LPOut: PByte;
724+
begin
725+
LPInput := PByte(AInput);
726+
LPOut := PByte(AOut);
727+
while ANumChunks >= 4 do
728+
begin
729+
Blake3_Hash4_Neon(LPInput, AKey, LPOut, 4, ACounter, AFlags);
730+
System.Inc(LPInput, 4 * 1024);
731+
System.Inc(LPOut, 4 * 32);
732+
System.Inc(ACounter, 4);
733+
System.Dec(ANumChunks, 4);
734+
end;
735+
if ANumChunks > 0 then
736+
Blake3_HashMany_Scalar(LPInput, AKey, LPOut, ANumChunks, ACounter, AFlags);
737+
end;
738+
739+
{$ENDIF HASHLIB_AARCH64_ASM}
740+
706741
// =============================================================================
707742
// Dispatch initialization
708743
// =============================================================================
@@ -738,6 +773,16 @@ procedure InitDispatch();
738773
end;
739774
end;
740775
{$ENDIF}
776+
{$IFDEF HASHLIB_AARCH64_ASM}
777+
case TCpuFeatures.Arm.SelectSlot([TArmSimdLevel.NEON]) of
778+
TArmSimdLevel.NEON:
779+
begin
780+
Blake3_Compress := @Blake3_Compress_Neon;
781+
Blake3_HashMany := @Blake3_HashMany_Neon;
782+
Blake3_ParallelDegree := 4;
783+
end;
784+
end;
785+
{$ENDIF}
741786
end;
742787

743788
initialization

HashLib/src/Include/HashLib.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@
173173

174174
{$IFDEF HASHLIB_ARM_SIMD}
175175
// Uncomment at most ONE to force a specific Arm SIMD dispatch level:
176-
// {$DEFINE HASHLIB_FORCE_NEON}
176+
{$DEFINE HASHLIB_FORCE_NEON}
177177
// {$DEFINE HASHLIB_FORCE_SVE}
178178

179179
{$IF (DEFINED(HASHLIB_FORCE_SCALAR) AND DEFINED(HASHLIB_FORCE_NEON))

HashLib/src/Include/Simd/Blake2B/Blake2BCompressNeon_aarch64.inc

Lines changed: 1452 additions & 0 deletions
Large diffs are not rendered by default.

HashLib/src/Include/Simd/Blake2S/Blake2SCompressNeon_aarch64.inc

Lines changed: 658 additions & 0 deletions
Large diffs are not rendered by default.

HashLib/src/Include/Simd/Blake3/Blake3CompressNeon_aarch64.inc

Lines changed: 937 additions & 0 deletions
Large diffs are not rendered by default.

HashLib/src/Include/Simd/Blake3/Blake3Hash4Neon_aarch64.inc

Lines changed: 1719 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)