Skip to content

Commit a072cca

Browse files
committed
SSE2 (I386) Initial Implementation
1 parent 4cbe340 commit a072cca

36 files changed

Lines changed: 9122 additions & 79 deletions

HashLib/src/Checksum/HlpAdler32Dispatch.pas

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -64,33 +64,15 @@ procedure Adler32_Update_Scalar(AData: PByte; ALength: UInt32; ASums: Pointer);
6464
end;
6565

6666
// =============================================================================
67-
// SIMD implementations (x86-64 only)
67+
// SIMD implementations: SSE2 (IA-32); SSE2 / SSSE3 / AVX2 (x86-64)
6868
// =============================================================================
6969

70-
{$IFDEF HASHLIB_X86_64_ASM}
70+
{$IFDEF HASHLIB_X86_SIMD}
7171

7272
type
7373
TProcessBlocksProc = procedure(AData: PByte; ANumBlocks: UInt32;
7474
ASums, AConstants: Pointer);
7575

76-
procedure Adler32_ProcessBlocks_Sse2(AData: PByte; ANumBlocks: UInt32;
77-
ASums, AConstants: Pointer);
78-
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
79-
{$I ..\Include\Simd\Adler32\Adler32BlocksSse2.inc}
80-
end;
81-
82-
procedure Adler32_ProcessBlocks_Ssse3(AData: PByte; ANumBlocks: UInt32;
83-
ASums, AConstants: Pointer);
84-
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
85-
{$I ..\Include\Simd\Adler32\Adler32BlocksSsse3.inc}
86-
end;
87-
88-
procedure Adler32_ProcessBlocks_Avx2(AData: PByte; ANumBlocks: UInt32;
89-
ASums, AConstants: Pointer);
90-
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
91-
{$I ..\Include\Simd\Adler32\Adler32BlocksAvx2.inc}
92-
end;
93-
9476
procedure Adler32_Update_Simd(AData: PByte; ALength: UInt32; ASums: Pointer;
9577
AProcessBlocks: TProcessBlocksProc);
9678
const
@@ -130,9 +112,36 @@ procedure Adler32_Update_Simd(AData: PByte; ALength: UInt32; ASums: Pointer;
130112
end;
131113
end;
132114

133-
procedure Adler32_Update_Sse2(AData: PByte; ALength: UInt32; ASums: Pointer);
134-
begin
135-
Adler32_Update_Simd(AData, ALength, ASums, @Adler32_ProcessBlocks_Sse2);
115+
{$ENDIF HASHLIB_X86_SIMD}
116+
117+
{$IFDEF HASHLIB_I386_ASM}
118+
119+
procedure Adler32_ProcessBlocks_Sse2(AData: PByte; ANumBlocks: UInt32;
120+
ASums, AConstants: Pointer);
121+
{$I ..\Include\Simd\Common\SimdProc4Begin_i386.inc}
122+
{$I ..\Include\Simd\Adler32\Adler32BlocksSse2_i386.inc}
123+
end;
124+
125+
{$ENDIF HASHLIB_I386_ASM}
126+
127+
{$IFDEF HASHLIB_X86_64_ASM}
128+
129+
procedure Adler32_ProcessBlocks_Sse2(AData: PByte; ANumBlocks: UInt32;
130+
ASums, AConstants: Pointer);
131+
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
132+
{$I ..\Include\Simd\Adler32\Adler32BlocksSse2.inc}
133+
end;
134+
135+
procedure Adler32_ProcessBlocks_Ssse3(AData: PByte; ANumBlocks: UInt32;
136+
ASums, AConstants: Pointer);
137+
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
138+
{$I ..\Include\Simd\Adler32\Adler32BlocksSsse3.inc}
139+
end;
140+
141+
procedure Adler32_ProcessBlocks_Avx2(AData: PByte; ANumBlocks: UInt32;
142+
ASums, AConstants: Pointer);
143+
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
144+
{$I ..\Include\Simd\Adler32\Adler32BlocksAvx2.inc}
136145
end;
137146

138147
procedure Adler32_Update_Ssse3(AData: PByte; ALength: UInt32; ASums: Pointer);
@@ -147,13 +156,30 @@ procedure Adler32_Update_Avx2(AData: PByte; ALength: UInt32; ASums: Pointer);
147156

148157
{$ENDIF HASHLIB_X86_64_ASM}
149158

159+
{$IFDEF HASHLIB_X86_SIMD}
160+
161+
procedure Adler32_Update_Sse2(AData: PByte; ALength: UInt32; ASums: Pointer);
162+
begin
163+
Adler32_Update_Simd(AData, ALength, ASums, @Adler32_ProcessBlocks_Sse2);
164+
end;
165+
166+
{$ENDIF HASHLIB_X86_SIMD}
167+
150168
// =============================================================================
151169
// Dispatch initialization
152170
// =============================================================================
153171

154172
procedure InitDispatch();
155173
begin
156174
Adler32_Update := @Adler32_Update_Scalar;
175+
{$IFDEF HASHLIB_I386_ASM}
176+
case TSimd.GetActiveLevel() of
177+
TSimdLevel.SSE2, TSimdLevel.SSSE3:
178+
begin
179+
Adler32_Update := @Adler32_Update_Sse2;
180+
end;
181+
end;
182+
{$ENDIF}
157183
{$IFDEF HASHLIB_X86_64_ASM}
158184
case TSimd.GetActiveLevel() of
159185
TSimdLevel.AVX2:

HashLib/src/Checksum/HlpCRCDispatch.pas

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ implementation
2424
uses
2525
HlpSimd;
2626

27+
// =============================================================================
28+
// SIMD implementations: none (IA-32); PCLMULQDQ / VPCLMULQDQ (x86-64)
29+
// =============================================================================
30+
2731
{$IFDEF HASHLIB_X86_64_ASM}
2832

2933
function CRC_Fold_Pclmul(AData: PByte; ALength: UInt32;

HashLib/src/Crypto/HlpBlake2BDispatch.pas

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,19 @@ procedure Blake2B_Compress_Scalar(AState, AMsg, ACounterFlags, AIV: Pointer);
9696
end;
9797

9898
// =============================================================================
99-
// SSE2 and AVX2 implementations (x86-64 only)
99+
// SIMD implementations: SSE2 (IA-32); SSE2 / SSSE3 / AVX2 (x86-64)
100+
// IA-32: XMM8/XMM9 from the x64 asm are mapped to XMM0-7 plus stack.
100101
// =============================================================================
101102

103+
{$IFDEF HASHLIB_I386_ASM}
104+
105+
procedure Blake2B_Compress_Sse2(AState, AMsg, ACounterFlags, AIV: Pointer);
106+
{$I ..\Include\Simd\Common\SimdProc4Begin_i386.inc}
107+
{$I ..\Include\Simd\Blake2B\Blake2BCompressSse2_i386.inc}
108+
end;
109+
110+
{$ENDIF HASHLIB_I386_ASM}
111+
102112
{$IFDEF HASHLIB_X86_64_ASM}
103113

104114
procedure Blake2B_Compress_Sse2(AState, AMsg, ACounterFlags, AIV: Pointer);
@@ -120,6 +130,14 @@ procedure Blake2B_Compress_Avx2(AState, AMsg, ACounterFlags, AIV: Pointer);
120130
procedure InitDispatch();
121131
begin
122132
Blake2B_Compress := @Blake2B_Compress_Scalar;
133+
{$IFDEF HASHLIB_I386_ASM}
134+
case TSimd.GetActiveLevel() of
135+
TSimdLevel.SSE2, TSimdLevel.SSSE3:
136+
begin
137+
Blake2B_Compress := @Blake2B_Compress_Sse2;
138+
end;
139+
end;
140+
{$ENDIF}
123141
{$IFDEF HASHLIB_X86_64_ASM}
124142
case TSimd.GetActiveLevel() of
125143
TSimdLevel.AVX2:

HashLib/src/Crypto/HlpBlake2SDispatch.pas

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,19 @@ procedure Blake2S_Compress_Scalar(AState, AMsg, ACounterFlags, AIV: Pointer);
9494
end;
9595

9696
// =============================================================================
97-
// SSE2 and AVX2 implementations (x86-64 only)
97+
// SIMD implementations: SSE2 (IA-32); SSE2 / SSSE3 / AVX2 (x86-64)
98+
// IA-32: uses XMM0-XMM6 only.
9899
// =============================================================================
99100

101+
{$IFDEF HASHLIB_I386_ASM}
102+
103+
procedure Blake2S_Compress_Sse2(AState, AMsg, ACounterFlags, AIV: Pointer);
104+
{$I ..\Include\Simd\Common\SimdProc4Begin_i386.inc}
105+
{$I ..\Include\Simd\Blake2S\Blake2SCompressSse2_i386.inc}
106+
end;
107+
108+
{$ENDIF HASHLIB_I386_ASM}
109+
100110
{$IFDEF HASHLIB_X86_64_ASM}
101111

102112
procedure Blake2S_Compress_Sse2(AState, AMsg, ACounterFlags, AIV: Pointer);
@@ -118,6 +128,14 @@ procedure Blake2S_Compress_Avx2(AState, AMsg, ACounterFlags, AIV: Pointer);
118128
procedure InitDispatch();
119129
begin
120130
Blake2S_Compress := @Blake2S_Compress_Scalar;
131+
{$IFDEF HASHLIB_I386_ASM}
132+
case TSimd.GetActiveLevel() of
133+
TSimdLevel.SSE2, TSimdLevel.SSSE3:
134+
begin
135+
Blake2S_Compress := @Blake2S_Compress_Sse2;
136+
end;
137+
end;
138+
{$ENDIF}
121139
{$IFDEF HASHLIB_X86_64_ASM}
122140
case TSimd.GetActiveLevel() of
123141
TSimdLevel.AVX2:

HashLib/src/Crypto/HlpBlake3Dispatch.pas

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -610,9 +610,24 @@ procedure Blake3_HashMany_Scalar(AInput, AKey, AOut: Pointer;
610610
end;
611611

612612
// =============================================================================
613-
// SSE2 and AVX2 implementations (x86-64 only)
613+
// SIMD implementations: SSE2 (IA-32); SSE2 / SSSE3 / AVX2 (x86-64)
614614
// =============================================================================
615615

616+
{$IFDEF HASHLIB_I386_ASM}
617+
618+
procedure Blake3_Compress_Sse2(AState, AMsg, ACV, ACounterFlags: Pointer);
619+
{$I ..\Include\Simd\Common\SimdProc4Begin_i386.inc}
620+
{$I ..\Include\Simd\Blake3\Blake3CompressSse2_i386.inc}
621+
end;
622+
623+
procedure Blake3_Hash4_Sse2(AInput, AKey, AOut: Pointer;
624+
ANumChunks: Int32; ACounter: UInt64; AFlags: UInt32);
625+
{$I ..\Include\Simd\Common\SimdProc6Begin_i386.inc}
626+
{$I ..\Include\Simd\Blake3\Blake3Hash4Sse2_i386.inc}
627+
end;
628+
629+
{$ENDIF HASHLIB_I386_ASM}
630+
616631
{$IFDEF HASHLIB_X86_64_ASM}
617632

618633
procedure Blake3_Compress_Sse2(AState, AMsg, ACV, ACounterFlags: Pointer);
@@ -637,10 +652,11 @@ procedure Blake3_Hash8_Avx2(AInput, AKey, AOut: Pointer;
637652
{$I ..\Include\Simd\Blake3\Blake3Hash8Avx2.inc}
638653
end;
639654

640-
// Cascade wrappers matching the official BLAKE3 dispatch pattern:
641-
// AVX2 hash_many: hash8 -> delegate remainder to SSE2 hash_many
642-
// SSE2 hash_many: hash4 -> delegate remainder to scalar hash_many
655+
{$ENDIF HASHLIB_X86_64_ASM}
656+
657+
{$IFDEF HASHLIB_X86_SIMD}
643658

659+
// SSE2 hash_many: hash4 -> delegate remainder to scalar hash_many
644660
procedure Blake3_HashMany_Sse2(AInput, AKey, AOut: Pointer;
645661
ANumChunks: Int32; ACounter: UInt64; AFlags: UInt32);
646662
var
@@ -660,6 +676,11 @@ procedure Blake3_HashMany_Sse2(AInput, AKey, AOut: Pointer;
660676
Blake3_HashMany_Scalar(LPInput, AKey, LPOut, ANumChunks, ACounter, AFlags);
661677
end;
662678

679+
{$ENDIF HASHLIB_X86_SIMD}
680+
681+
{$IFDEF HASHLIB_X86_64_ASM}
682+
683+
// AVX2 hash_many: hash8 -> delegate remainder to SSE2 hash_many (x64 only; after shared Sse2)
663684
procedure Blake3_HashMany_Avx2(AInput, AKey, AOut: Pointer;
664685
ANumChunks: Int32; ACounter: UInt64; AFlags: UInt32);
665686
var
@@ -690,6 +711,16 @@ procedure InitDispatch();
690711
Blake3_Compress := @Blake3_Compress_Scalar;
691712
Blake3_HashMany := @Blake3_HashMany_Scalar;
692713
Blake3_ParallelDegree := 1;
714+
{$IFDEF HASHLIB_I386_ASM}
715+
case TSimd.GetActiveLevel() of
716+
TSimdLevel.SSE2, TSimdLevel.SSSE3:
717+
begin
718+
Blake3_Compress := @Blake3_Compress_Sse2;
719+
Blake3_HashMany := @Blake3_HashMany_Sse2;
720+
Blake3_ParallelDegree := 4;
721+
end;
722+
end;
723+
{$ENDIF}
693724
{$IFDEF HASHLIB_X86_64_ASM}
694725
case TSimd.GetActiveLevel() of
695726
TSimdLevel.AVX2:

HashLib/src/Crypto/HlpSHA1Dispatch.pas

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,18 @@ procedure SHA1_Compress_Scalar(AState, AData: Pointer; ANumBlocks: UInt32);
102102
end;
103103

104104
// =============================================================================
105-
// SIMD implementations (x86-64 only)
105+
// SIMD implementations: SSE2 (IA-32); ShaNi, SSE2, SSSE3, AVX2 (x86-64)
106106
// =============================================================================
107107

108+
{$IFDEF HASHLIB_I386_ASM}
109+
110+
procedure SHA1_Compress_Sse2(AState, AData: Pointer; ANumBlocks: UInt32);
111+
{$I ..\Include\Simd\Common\SimdProc3Begin_i386.inc}
112+
{$I ..\Include\Simd\SHA1\SHA1CompressSse2_i386.inc}
113+
end;
114+
115+
{$ENDIF HASHLIB_I386_ASM}
116+
108117
{$IFDEF HASHLIB_X86_64_ASM}
109118

110119
procedure SHA1_Compress_ShaNi(AState, AData: Pointer; ANumBlocks: UInt32;
@@ -154,6 +163,14 @@ procedure SHA1_Compress_Avx2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
154163
procedure InitDispatch();
155164
begin
156165
SHA1_Compress := @SHA1_Compress_Scalar;
166+
{$IFDEF HASHLIB_I386_ASM}
167+
case TSimd.GetActiveLevel() of
168+
TSimdLevel.SSE2, TSimdLevel.SSSE3:
169+
begin
170+
SHA1_Compress := @SHA1_Compress_Sse2;
171+
end;
172+
end;
173+
{$ENDIF}
157174
{$IFDEF HASHLIB_X86_64_ASM}
158175
if TSimd.HasSHANI() then
159176
begin

HashLib/src/Crypto/HlpSHA2_256Dispatch.pas

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,19 @@ procedure SHA256_Compress_Scalar(AState, AData: Pointer; ANumBlocks: UInt32);
9797
end;
9898

9999
// =============================================================================
100-
// SIMD implementations (x86-64 only)
100+
// SIMD implementations: SSE2 (IA-32); ShaNi, SSE2, SSSE3, AVX2 (x86-64)
101101
// =============================================================================
102102

103+
{$IFDEF HASHLIB_I386_ASM}
104+
105+
procedure SHA256_Compress_Sse2(AState, AData: Pointer; ANumBlocks: UInt32;
106+
AConstants: Pointer);
107+
{$I ..\Include\Simd\Common\SimdProc4Begin_i386.inc}
108+
{$I ..\Include\Simd\SHA256\SHA256CompressSse2_i386.inc}
109+
end;
110+
111+
{$ENDIF HASHLIB_I386_ASM}
112+
103113
{$IFDEF HASHLIB_X86_64_ASM}
104114

105115
procedure SHA256_Compress_ShaNi(AState, AData: Pointer; ANumBlocks: UInt32;
@@ -119,11 +129,6 @@ procedure SHA256_Compress_Sse2(AState, AData: Pointer; ANumBlocks: UInt32;
119129
{$I ..\Include\Simd\SHA256\SHA256CompressSse2.inc}
120130
end;
121131

122-
procedure SHA256_Compress_Sse2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
123-
begin
124-
SHA256_Compress_Sse2(AState, AData, ANumBlocks, @K256);
125-
end;
126-
127132
procedure SHA256_Compress_Ssse3(AState, AData: Pointer; ANumBlocks: UInt32;
128133
AConstants: Pointer);
129134
{$I ..\Include\Simd\Common\SimdProc4Begin.inc}
@@ -148,13 +153,30 @@ procedure SHA256_Compress_Avx2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
148153

149154
{$ENDIF HASHLIB_X86_64_ASM}
150155

156+
{$IFDEF HASHLIB_X86_SIMD}
157+
158+
procedure SHA256_Compress_Sse2_Wrap(AState, AData: Pointer; ANumBlocks: UInt32);
159+
begin
160+
SHA256_Compress_Sse2(AState, AData, ANumBlocks, @K256);
161+
end;
162+
163+
{$ENDIF HASHLIB_X86_SIMD}
164+
151165
// =============================================================================
152166
// Dispatch initialization
153167
// =============================================================================
154168

155169
procedure InitDispatch();
156170
begin
157171
SHA256_Compress := @SHA256_Compress_Scalar;
172+
{$IFDEF HASHLIB_I386_ASM}
173+
case TSimd.GetActiveLevel() of
174+
TSimdLevel.SSE2, TSimdLevel.SSSE3:
175+
begin
176+
SHA256_Compress := @SHA256_Compress_Sse2_Wrap;
177+
end;
178+
end;
179+
{$ENDIF}
158180
{$IFDEF HASHLIB_X86_64_ASM}
159181
if TSimd.HasSHANI() then
160182
begin

0 commit comments

Comments
 (0)