Skip to content

Commit e33ec66

Browse files
committed
fix: scalar-first SIMD dispatch fallback across all dispatchers
## Summary - Restructures all 11 `InitDispatch` procedures to assign scalar function pointers as the default **before** the SIMD `case` statement, which is now entirely wrapped in `{$IFDEF HASHLIB_X86_64}`. - **Fixes** SHA3/Keccak tests failing when `HASHLIB_FORCE_SSE2` or `HASHLIB_FORCE_SSSE3` is defined — the `case` had no branch for those levels, so `KeccakF1600_Permute` and `KeccakF1600_Absorb` were never assigned. - Hardens all other dispatchers (SHA1, SHA2-256, SHA2-512, Blake2S, Blake2B, Blake3, Adler32, XXHash3, Argon2, Scrypt) with the same pattern for consistency and future-proofing against new SIMD levels.
1 parent 01cd822 commit e33ec66

11 files changed

Lines changed: 35 additions & 74 deletions

HashLib/src/Checksum/HlpAdler32Dispatch.pas

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,9 @@ procedure Adler32_Update_Avx2(AData: PByte; ALength: UInt32; ASums: Pointer);
153153

154154
procedure InitDispatch();
155155
begin
156-
case TSimd.GetActiveLevel() of
156+
Adler32_Update := @Adler32_Update_Scalar;
157157
{$IFDEF HASHLIB_X86_64}
158+
case TSimd.GetActiveLevel() of
158159
TSimdLevel.AVX2:
159160
begin
160161
Adler32_Update := @Adler32_Update_Avx2;
@@ -167,12 +168,8 @@ procedure InitDispatch();
167168
begin
168169
Adler32_Update := @Adler32_Update_Sse2;
169170
end;
170-
{$ENDIF}
171-
TSimdLevel.Scalar:
172-
begin
173-
Adler32_Update := @Adler32_Update_Scalar;
174-
end;
175171
end;
172+
{$ENDIF}
176173
end;
177174

178175
initialization

HashLib/src/Crypto/HlpBlake2BDispatch.pas

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,9 @@ procedure Blake2B_Compress_Avx2(AState, AMsg, ACounterFlags, AIV: Pointer);
119119

120120
procedure InitDispatch();
121121
begin
122-
case TSimd.GetActiveLevel() of
122+
Blake2B_Compress := @Blake2B_Compress_Scalar;
123123
{$IFDEF HASHLIB_X86_64}
124+
case TSimd.GetActiveLevel() of
124125
TSimdLevel.AVX2:
125126
begin
126127
Blake2B_Compress := @Blake2B_Compress_Avx2;
@@ -129,12 +130,8 @@ procedure InitDispatch();
129130
begin
130131
Blake2B_Compress := @Blake2B_Compress_Sse2;
131132
end;
132-
{$ENDIF}
133-
TSimdLevel.Scalar:
134-
begin
135-
Blake2B_Compress := @Blake2B_Compress_Scalar;
136-
end;
137133
end;
134+
{$ENDIF}
138135
end;
139136

140137
initialization

HashLib/src/Crypto/HlpBlake2SDispatch.pas

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,9 @@ procedure Blake2S_Compress_Avx2(AState, AMsg, ACounterFlags, AIV: Pointer);
117117

118118
procedure InitDispatch();
119119
begin
120-
case TSimd.GetActiveLevel() of
120+
Blake2S_Compress := @Blake2S_Compress_Scalar;
121121
{$IFDEF HASHLIB_X86_64}
122+
case TSimd.GetActiveLevel() of
122123
TSimdLevel.AVX2:
123124
begin
124125
Blake2S_Compress := @Blake2S_Compress_Avx2;
@@ -127,12 +128,8 @@ procedure InitDispatch();
127128
begin
128129
Blake2S_Compress := @Blake2S_Compress_Sse2;
129130
end;
130-
{$ENDIF}
131-
TSimdLevel.Scalar:
132-
begin
133-
Blake2S_Compress := @Blake2S_Compress_Scalar;
134-
end;
135131
end;
132+
{$ENDIF}
136133
end;
137134

138135
initialization

HashLib/src/Crypto/HlpBlake3Dispatch.pas

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -687,12 +687,11 @@ procedure Blake3_HashMany_Avx2(AInput, AKey, AOut: Pointer;
687687

688688
procedure InitDispatch();
689689
begin
690-
// HashMany always has a scalar fallback available
690+
Blake3_Compress := @Blake3_Compress_Scalar;
691691
Blake3_HashMany := @Blake3_HashMany_Scalar;
692692
Blake3_ParallelDegree := 1;
693-
694-
case TSimd.GetActiveLevel() of
695693
{$IFDEF HASHLIB_X86_64}
694+
case TSimd.GetActiveLevel() of
696695
TSimdLevel.AVX2:
697696
begin
698697
Blake3_Compress := @Blake3_Compress_Avx2;
@@ -705,12 +704,8 @@ procedure InitDispatch();
705704
Blake3_HashMany := @Blake3_HashMany_Sse2;
706705
Blake3_ParallelDegree := 4;
707706
end;
708-
{$ENDIF}
709-
TSimdLevel.Scalar:
710-
begin
711-
Blake3_Compress := @Blake3_Compress_Scalar;
712-
end;
713707
end;
708+
{$ENDIF}
714709
end;
715710

716711
initialization

HashLib/src/Crypto/HlpSHA1Dispatch.pas

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -153,15 +153,14 @@ procedure SHA1_Compress_Avx2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
153153

154154
procedure InitDispatch();
155155
begin
156+
SHA1_Compress := @SHA1_Compress_Scalar;
156157
{$IFDEF HASHLIB_X86_64}
157158
if TSimd.HasSHANI() then
158159
begin
159160
SHA1_Compress := @SHA1_Compress_ShaNi_Wrap;
160161
Exit;
161162
end;
162-
{$ENDIF}
163163
case TSimd.GetActiveLevel() of
164-
{$IFDEF HASHLIB_X86_64}
165164
TSimdLevel.AVX2:
166165
begin
167166
SHA1_Compress := @SHA1_Compress_Avx2_Wrap;
@@ -174,12 +173,8 @@ procedure InitDispatch();
174173
begin
175174
SHA1_Compress := @SHA1_Compress_Sse2;
176175
end;
177-
{$ENDIF}
178-
TSimdLevel.Scalar:
179-
begin
180-
SHA1_Compress := @SHA1_Compress_Scalar;
181-
end;
182176
end;
177+
{$ENDIF}
183178
end;
184179

185180
initialization

HashLib/src/Crypto/HlpSHA2_256Dispatch.pas

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,14 @@ procedure SHA256_Compress_Avx2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
154154

155155
procedure InitDispatch();
156156
begin
157+
SHA256_Compress := @SHA256_Compress_Scalar;
157158
{$IFDEF HASHLIB_X86_64}
158159
if TSimd.HasSHANI() then
159160
begin
160161
SHA256_Compress := @SHA256_Compress_ShaNi_Wrap;
161162
Exit;
162163
end;
163-
{$ENDIF}
164164
case TSimd.GetActiveLevel() of
165-
{$IFDEF HASHLIB_X86_64}
166165
TSimdLevel.AVX2:
167166
begin
168167
SHA256_Compress := @SHA256_Compress_Avx2_Wrap;
@@ -175,12 +174,8 @@ procedure InitDispatch();
175174
begin
176175
SHA256_Compress := @SHA256_Compress_Sse2_Wrap;
177176
end;
178-
{$ENDIF}
179-
TSimdLevel.Scalar:
180-
begin
181-
SHA256_Compress := @SHA256_Compress_Scalar;
182-
end;
183177
end;
178+
{$ENDIF}
184179
end;
185180

186181
initialization

HashLib/src/Crypto/HlpSHA2_512Dispatch.pas

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,9 @@ procedure SHA512_Compress_Avx2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
167167

168168
procedure InitDispatch();
169169
begin
170-
case TSimd.GetActiveLevel() of
170+
SHA512_Compress := @SHA512_Compress_Scalar;
171171
{$IFDEF HASHLIB_X86_64}
172+
case TSimd.GetActiveLevel() of
172173
TSimdLevel.AVX2:
173174
begin
174175
SHA512_Compress := @SHA512_Compress_Avx2_Wrap;
@@ -181,12 +182,8 @@ procedure InitDispatch();
181182
begin
182183
SHA512_Compress := @SHA512_Compress_Sse2_Wrap;
183184
end;
184-
{$ENDIF}
185-
TSimdLevel.Scalar:
186-
begin
187-
SHA512_Compress := @SHA512_Compress_Scalar;
188-
end;
189185
end;
186+
{$ENDIF}
190187
end;
191188

192189
initialization

HashLib/src/Crypto/HlpSHA3Dispatch.pas

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -493,20 +493,17 @@ procedure KeccakF1600_Avx2_Absorb_Wrap(AState: Pointer; AData: PByte;
493493

494494
procedure InitDispatch();
495495
begin
496-
case TSimd.GetActiveLevel() of
496+
KeccakF1600_Permute := @KeccakF1600_Scalar;
497+
KeccakF1600_Absorb := @KeccakF1600_Absorb_Scalar;
497498
{$IFDEF HASHLIB_X86_64}
499+
case TSimd.GetActiveLevel() of
498500
TSimdLevel.AVX2:
499501
begin
500502
KeccakF1600_Permute := @KeccakF1600_Avx2_Wrap;
501503
KeccakF1600_Absorb := @KeccakF1600_Avx2_Absorb_Wrap;
502504
end;
503-
{$ENDIF}
504-
TSimdLevel.Scalar:
505-
begin
506-
KeccakF1600_Permute := @KeccakF1600_Scalar;
507-
KeccakF1600_Absorb := @KeccakF1600_Absorb_Scalar;
508-
end;
509505
end;
506+
{$ENDIF}
510507
end;
511508

512509
initialization

HashLib/src/Hash64/HlpXXHash3Dispatch.pas

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,12 @@ procedure XXH3_Accumulate_Avx2(AAcc: Pointer; AInput: Pointer;
174174

175175
procedure InitDispatch();
176176
begin
177-
case TSimd.GetActiveLevel() of
177+
XXH3_Accumulate512 := @XXH3_Accumulate512_Scalar;
178+
XXH3_Accumulate := @XXH3_Accumulate_Scalar;
179+
XXH3_ScrambleAcc := @XXH3_ScrambleAcc_Scalar;
180+
XXH3_InitSecret := @XXH3_InitSecret_Scalar;
178181
{$IFDEF HASHLIB_X86_64}
182+
case TSimd.GetActiveLevel() of
179183
TSimdLevel.AVX2:
180184
begin
181185
XXH3_Accumulate512 := @XXH3_Accumulate512_Avx2;
@@ -190,15 +194,8 @@ procedure InitDispatch();
190194
XXH3_ScrambleAcc := @XXH3_ScrambleAcc_Sse2;
191195
XXH3_InitSecret := @XXH3_InitSecret_Sse2;
192196
end;
193-
{$ENDIF}
194-
TSimdLevel.Scalar:
195-
begin
196-
XXH3_Accumulate512 := @XXH3_Accumulate512_Scalar;
197-
XXH3_Accumulate := @XXH3_Accumulate_Scalar;
198-
XXH3_ScrambleAcc := @XXH3_ScrambleAcc_Scalar;
199-
XXH3_InitSecret := @XXH3_InitSecret_Scalar;
200-
end;
201197
end;
198+
{$ENDIF}
202199
end;
203200

204201
initialization

HashLib/src/KDF/HlpArgon2Dispatch.pas

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,9 @@ procedure Argon2_FillBlock_Avx2(ALeft, ARight, ACurrent: Pointer; AWithXor: Int3
125125

126126
procedure InitDispatch();
127127
begin
128-
case TSimd.GetActiveLevel() of
128+
Argon2_FillBlock := @Argon2_FillBlock_Scalar;
129129
{$IFDEF HASHLIB_X86_64}
130+
case TSimd.GetActiveLevel() of
130131
TSimdLevel.AVX2:
131132
begin
132133
Argon2_FillBlock := @Argon2_FillBlock_Avx2;
@@ -135,12 +136,8 @@ procedure InitDispatch();
135136
begin
136137
Argon2_FillBlock := @Argon2_FillBlock_Sse2;
137138
end;
138-
{$ENDIF}
139-
TSimdLevel.Scalar:
140-
begin
141-
Argon2_FillBlock := @Argon2_FillBlock_Scalar;
142-
end;
143139
end;
140+
{$ENDIF}
144141
end;
145142

146143
initialization

0 commit comments

Comments
 (0)