Skip to content

Commit 6ea787e

Browse files
committed
updates to SHA SIMD
1 parent a93fa1f commit 6ea787e

11 files changed

Lines changed: 1735 additions & 145 deletions

HashLib/src/Crypto/HlpSHA1Dispatch.pas

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,14 @@ interface
1111
SHA1_Compress: TSHA1CompressProc;
1212

1313
const
14-
// BSWAP32 mask for pshufb: reverses bytes within each dword (big-endian to little-endian)
15-
K_SHA1: array [0 .. 3] of UInt32 = (
14+
// K constants replicated 4x for SIMD, followed by BSWAP32 mask.
15+
// Layout: K_00_19 (16B) at 0, K_20_39 at 16, K_40_59 at 32,
16+
// K_60_79 at 48, BSWAP32 mask at 64.
17+
K_SHA1: array [0 .. 19] of UInt32 = (
18+
$5A827999, $5A827999, $5A827999, $5A827999,
19+
$6ED9EBA1, $6ED9EBA1, $6ED9EBA1, $6ED9EBA1,
20+
$8F1BBCDC, $8F1BBCDC, $8F1BBCDC, $8F1BBCDC,
21+
$CA62C1D6, $CA62C1D6, $CA62C1D6, $CA62C1D6,
1622
$00010203, $04050607, $08090A0B, $0C0D0E0F
1723
);
1824

@@ -112,6 +118,11 @@ procedure SHA1_Compress_ShaNi_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
112118
SHA1_Compress_ShaNi(AState, AData, ANumBlocks, @K_SHA1);
113119
end;
114120

121+
procedure SHA1_Compress_Sse2(AState, AData: Pointer; ANumBlocks: UInt32);
122+
{$I ..\Include\Simd\Common\SimdProc3Begin.inc}
123+
{$I ..\Include\Simd\SHA1\SHA1CompressSse2.inc}
124+
end;
125+
115126
procedure SHA1_Compress_Ssse3(AState, AData: Pointer; ANumBlocks: UInt32;
116127
AConstants: Pointer);
117128
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
@@ -143,23 +154,32 @@ procedure SHA1_Compress_Avx2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
143154
procedure InitDispatch();
144155
begin
145156
{$IFDEF HASHLIB_X86_64}
146-
if TSimd.HasSHANI() and (TSimd.GetActiveLevel() >= TSimdLevel.SSSE3) then
157+
if TSimd.HasSHANI() then
147158
begin
148159
SHA1_Compress := @SHA1_Compress_ShaNi_Wrap;
149160
Exit;
150161
end;
151-
if TSimd.GetActiveLevel() >= TSimdLevel.AVX2 then
152-
begin
153-
SHA1_Compress := @SHA1_Compress_Avx2_Wrap;
154-
Exit;
155-
end;
156-
if TSimd.GetActiveLevel() >= TSimdLevel.SSSE3 then
157-
begin
158-
SHA1_Compress := @SHA1_Compress_Ssse3_Wrap;
159-
Exit;
160-
end;
161162
{$ENDIF}
162-
SHA1_Compress := @SHA1_Compress_Scalar;
163+
case TSimd.GetActiveLevel() of
164+
{$IFDEF HASHLIB_X86_64}
165+
TSimdLevel.AVX2:
166+
begin
167+
SHA1_Compress := @SHA1_Compress_Avx2_Wrap;
168+
end;
169+
TSimdLevel.SSSE3:
170+
begin
171+
SHA1_Compress := @SHA1_Compress_Ssse3_Wrap;
172+
end;
173+
TSimdLevel.SSE2:
174+
begin
175+
SHA1_Compress := @SHA1_Compress_Sse2;
176+
end;
177+
{$ENDIF}
178+
TSimdLevel.Scalar:
179+
begin
180+
SHA1_Compress := @SHA1_Compress_Scalar;
181+
end;
182+
end;
163183
end;
164184

165185
initialization

HashLib/src/Crypto/HlpSHA2_256Dispatch.pas

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,17 @@ procedure SHA256_Compress_ShaNi_Wrap(AState, AData: Pointer; ANumBlocks: UInt32)
113113
SHA256_Compress_ShaNi(AState, AData, ANumBlocks, @K256);
114114
end;
115115

116+
procedure SHA256_Compress_Sse2(AState, AData: Pointer; ANumBlocks: UInt32;
117+
AConstants: Pointer);
118+
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
119+
{$I ..\Include\Simd\SHA256\SHA256CompressSse2.inc}
120+
end;
121+
122+
procedure SHA256_Compress_Sse2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
123+
begin
124+
SHA256_Compress_Sse2(AState, AData, ANumBlocks, @K256);
125+
end;
126+
116127
procedure SHA256_Compress_Ssse3(AState, AData: Pointer; ANumBlocks: UInt32;
117128
AConstants: Pointer);
118129
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
@@ -144,23 +155,32 @@ procedure SHA256_Compress_Avx2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
144155
procedure InitDispatch();
145156
begin
146157
{$IFDEF HASHLIB_X86_64}
147-
if TSimd.HasSHANI() and (TSimd.GetActiveLevel() >= TSimdLevel.SSSE3) then
158+
if TSimd.HasSHANI() then
148159
begin
149160
SHA256_Compress := @SHA256_Compress_ShaNi_Wrap;
150161
Exit;
151162
end;
152-
if TSimd.GetActiveLevel() >= TSimdLevel.AVX2 then
153-
begin
154-
SHA256_Compress := @SHA256_Compress_Avx2_Wrap;
155-
Exit;
156-
end;
157-
if TSimd.GetActiveLevel() >= TSimdLevel.SSSE3 then
158-
begin
159-
SHA256_Compress := @SHA256_Compress_Ssse3_Wrap;
160-
Exit;
161-
end;
162163
{$ENDIF}
163-
SHA256_Compress := @SHA256_Compress_Scalar;
164+
case TSimd.GetActiveLevel() of
165+
{$IFDEF HASHLIB_X86_64}
166+
TSimdLevel.AVX2:
167+
begin
168+
SHA256_Compress := @SHA256_Compress_Avx2_Wrap;
169+
end;
170+
TSimdLevel.SSSE3:
171+
begin
172+
SHA256_Compress := @SHA256_Compress_Ssse3_Wrap;
173+
end;
174+
TSimdLevel.SSE2:
175+
begin
176+
SHA256_Compress := @SHA256_Compress_Sse2_Wrap;
177+
end;
178+
{$ENDIF}
179+
TSimdLevel.Scalar:
180+
begin
181+
SHA256_Compress := @SHA256_Compress_Scalar;
182+
end;
183+
end;
164184
end;
165185

166186
initialization

HashLib/src/Crypto/HlpSHA2_512Dispatch.pas

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,17 @@ procedure SHA512_Compress_Scalar(AState, AData: Pointer; ANumBlocks: UInt32);
126126

127127
{$IFDEF HASHLIB_X86_64}
128128

129+
procedure SHA512_Compress_Sse2(AState, AData: Pointer; ANumBlocks: UInt32;
130+
AConstants: Pointer);
131+
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
132+
{$I ..\Include\Simd\SHA512\SHA512CompressSse2.inc}
133+
end;
134+
135+
procedure SHA512_Compress_Sse2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
136+
begin
137+
SHA512_Compress_Sse2(AState, AData, ANumBlocks, @K512);
138+
end;
139+
129140
procedure SHA512_Compress_Ssse3(AState, AData: Pointer; ANumBlocks: UInt32;
130141
AConstants: Pointer);
131142
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
@@ -156,19 +167,26 @@ procedure SHA512_Compress_Avx2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
156167

157168
procedure InitDispatch();
158169
begin
170+
case TSimd.GetActiveLevel() of
159171
{$IFDEF HASHLIB_X86_64}
160-
if TSimd.GetActiveLevel() >= TSimdLevel.AVX2 then
161-
begin
162-
SHA512_Compress := @SHA512_Compress_Avx2_Wrap;
163-
Exit;
164-
end;
165-
if TSimd.GetActiveLevel() >= TSimdLevel.SSSE3 then
166-
begin
167-
SHA512_Compress := @SHA512_Compress_Ssse3_Wrap;
168-
Exit;
169-
end;
172+
TSimdLevel.AVX2:
173+
begin
174+
SHA512_Compress := @SHA512_Compress_Avx2_Wrap;
175+
end;
176+
TSimdLevel.SSSE3:
177+
begin
178+
SHA512_Compress := @SHA512_Compress_Ssse3_Wrap;
179+
end;
180+
TSimdLevel.SSE2:
181+
begin
182+
SHA512_Compress := @SHA512_Compress_Sse2_Wrap;
183+
end;
170184
{$ENDIF}
171-
SHA512_Compress := @SHA512_Compress_Scalar;
185+
TSimdLevel.Scalar:
186+
begin
187+
SHA512_Compress := @SHA512_Compress_Scalar;
188+
end;
189+
end;
172190
end;
173191

174192
initialization

0 commit comments

Comments
 (0)