Commit 87c70b8
authored
Refactor CPU feature detection: split x86 and ARM into separate units with shared SIMD level types (#61)
## Summary
Splits the monolithic `TCpuFeatures` class into architecture-specific units (`HlpX86SimdFeatures`, `HlpArmSimdFeatures`) with shared SIMD level enums (`HlpSimdLevels`), and adds foundational ARM SIMD and target OS defines to the include files.
## Motivation
`HlpCpuFeatures` was a single class that mixed x86-specific CPUID detection logic with the public dispatch API. This made it impossible to extend to ARM without further bloating the unit. The `TCpuSimdLevel` enum was also x86-specific (`SSE2`, `SSSE3`, `AVX2`) but lived in the shared namespace, leaving no room for ARM SIMD levels.
All dispatch units (`HlpBlake2BDispatch`, `HlpSHA2_256Dispatch`, etc.) called `TCpuFeatures.GetActiveLevel()` and matched against `TCpuSimdLevel.*` — semantically x86 concepts that were presented as architecture-neutral.
## Changes
### New units
- **`HlpSimdLevels`** — defines `TX86SimdLevel` (Scalar, SSE2, SSSE3, AVX2) and `TArmSimdLevel` (Scalar, NEON, SVE, SVE2) as separate enums.
- **`HlpX86SimdFeatures`** — `TX86SimdFeatures` class containing all CPUID/XGETBV inline assembly, hardware probing, build-time override logic, and cached feature flags. Moved from `HlpCpuFeatures` with the addition of `HasAESNI()` detection (CPUID leaf 1, ECX bit 25).
- **`HlpArmSimdFeatures`** — `TArmSimdFeatures` class with stub detection methods for NEON, SVE, SVE2, and crypto extensions (AES, SHA1, SHA256, SHA512, SHA3, PMULL). All detection methods currently return `False` (marked `TODO`), providing the scaffolding for future ARM SIMD dispatch.
### Refactored `HlpCpuFeatures`
`TCpuFeatures` is now a thin facade with two class properties:
- `TCpuFeatures.X86` → returns `TX86SimdFeatures`
- `TCpuFeatures.Arm` → returns `TArmSimdFeatures`
All CPUID logic, class vars, and the `initialization` section have been removed from this unit. Detection now runs in each architecture-specific unit's own `initialization` block.
### Dispatch unit updates
All 12 dispatch units updated to use the new API:
- `TCpuFeatures.GetActiveLevel()` → `TCpuFeatures.X86.GetSimdLevel()`
- `TCpuSimdLevel.*` → `TX86SimdLevel.*`
- `TCpuFeatures.HasSHANI()` → `TCpuFeatures.X86.HasSHANI()`
- `TCpuFeatures.HasPCLMULQDQ()` → `TCpuFeatures.X86.HasPCLMULQDQ()`
- `TCpuFeatures.HasVPCLMULQDQ()` → `TCpuFeatures.X86.HasVPCLMULQDQ()`
- Added `HlpSimdLevels` to each dispatch unit's `uses` clause.
Affected dispatch units: Adler32, CRC, Blake2B, Blake2S, Blake3, SHA1, SHA2-256, SHA2-512, SHA3, XXHash3, Argon2, Scrypt.
### Include file additions
**`HashLib.inc` (Delphi)**:
- Added `HASHLIB_ARM` and `HASHLIB_AARCH64` CPU architecture defines.
- Added target OS defines: `HASHLIB_MSWINDOWS`, `HASHLIB_IOS`, `HASHLIB_MACOS`, `HASHLIB_ANDROID`, `HASHLIB_LINUX`.
- Added `HASHLIB_ARM_SIMD` composite define (mirrors existing `HASHLIB_X86_SIMD`).
- Added ARM force-dispatch options (`HASHLIB_FORCE_NEON`, `HASHLIB_FORCE_SVE`) with mutual exclusion compile-time check.
**`HashLibFPC.inc` (FPC)**:
- Added `HASHLIB_ARM` / `HASHLIB_ARM_ASM` and `HASHLIB_AARCH64` / `HASHLIB_AARCH64_ASM` defines.
- Added target OS defines: `HASHLIB_MSWINDOWS`, `HASHLIB_ANDROID`, `HASHLIB_IOS`, `HASHLIB_MACOS`, `HASHLIB_BSD`, `HASHLIB_LINUX`, `HASHLIB_SOLARIS`.1 parent 55e10d5 commit 87c70b8
24 files changed
Lines changed: 731 additions & 302 deletions
File tree
- HashLib.Benchmark/Delphi
- HashLib.Tests/Delphi.Tests
- HashLib/src
- Checksum
- Crypto
- Hash64
- Include
- KDF
- Packages
- Delphi
- FPC
- Utils
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
125 | 125 | | |
126 | 126 | | |
127 | 127 | | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
128 | 131 | | |
129 | 132 | | |
130 | 133 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
124 | 124 | | |
125 | 125 | | |
126 | 126 | | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
127 | 130 | | |
128 | 131 | | |
129 | 132 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
143 | 143 | | |
144 | 144 | | |
145 | 145 | | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
146 | 149 | | |
147 | 150 | | |
148 | 151 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
| 17 | + | |
17 | 18 | | |
18 | 19 | | |
19 | 20 | | |
| |||
188 | 189 | | |
189 | 190 | | |
190 | 191 | | |
191 | | - | |
192 | | - | |
| 192 | + | |
| 193 | + | |
193 | 194 | | |
194 | 195 | | |
195 | 196 | | |
196 | | - | |
| 197 | + | |
197 | 198 | | |
198 | 199 | | |
199 | 200 | | |
200 | 201 | | |
201 | 202 | | |
202 | 203 | | |
203 | | - | |
204 | | - | |
| 204 | + | |
| 205 | + | |
205 | 206 | | |
206 | 207 | | |
207 | 208 | | |
208 | | - | |
| 209 | + | |
209 | 210 | | |
210 | 211 | | |
211 | 212 | | |
212 | | - | |
| 213 | + | |
213 | 214 | | |
214 | 215 | | |
215 | 216 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
78 | 78 | | |
79 | 79 | | |
80 | 80 | | |
81 | | - | |
| 81 | + | |
| 82 | + | |
82 | 83 | | |
83 | 84 | | |
84 | 85 | | |
| |||
494 | 495 | | |
495 | 496 | | |
496 | 497 | | |
497 | | - | |
| 498 | + | |
498 | 499 | | |
499 | 500 | | |
500 | 501 | | |
501 | 502 | | |
502 | 503 | | |
503 | 504 | | |
504 | 505 | | |
505 | | - | |
| 506 | + | |
506 | 507 | | |
507 | 508 | | |
508 | 509 | | |
| |||
514 | 515 | | |
515 | 516 | | |
516 | 517 | | |
517 | | - | |
518 | | - | |
| 518 | + | |
| 519 | + | |
519 | 520 | | |
520 | 521 | | |
521 | 522 | | |
522 | 523 | | |
523 | | - | |
524 | | - | |
| 524 | + | |
| 525 | + | |
525 | 526 | | |
526 | 527 | | |
527 | 528 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
| 26 | + | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
| |||
131 | 132 | | |
132 | 133 | | |
133 | 134 | | |
134 | | - | |
135 | | - | |
| 135 | + | |
| 136 | + | |
136 | 137 | | |
137 | 138 | | |
138 | 139 | | |
139 | 140 | | |
140 | 141 | | |
141 | 142 | | |
142 | | - | |
143 | | - | |
| 143 | + | |
| 144 | + | |
144 | 145 | | |
145 | 146 | | |
146 | 147 | | |
147 | | - | |
| 148 | + | |
148 | 149 | | |
149 | 150 | | |
150 | 151 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
| 26 | + | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
| |||
129 | 130 | | |
130 | 131 | | |
131 | 132 | | |
132 | | - | |
133 | | - | |
| 133 | + | |
| 134 | + | |
134 | 135 | | |
135 | 136 | | |
136 | 137 | | |
137 | 138 | | |
138 | 139 | | |
139 | 140 | | |
140 | | - | |
141 | | - | |
| 141 | + | |
| 142 | + | |
142 | 143 | | |
143 | 144 | | |
144 | 145 | | |
145 | | - | |
| 146 | + | |
146 | 147 | | |
147 | 148 | | |
148 | 149 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
29 | | - | |
| 29 | + | |
| 30 | + | |
30 | 31 | | |
31 | 32 | | |
32 | 33 | | |
| |||
712 | 713 | | |
713 | 714 | | |
714 | 715 | | |
715 | | - | |
716 | | - | |
| 716 | + | |
| 717 | + | |
717 | 718 | | |
718 | 719 | | |
719 | 720 | | |
| |||
722 | 723 | | |
723 | 724 | | |
724 | 725 | | |
725 | | - | |
726 | | - | |
| 726 | + | |
| 727 | + | |
727 | 728 | | |
728 | 729 | | |
729 | 730 | | |
730 | 731 | | |
731 | 732 | | |
732 | | - | |
| 733 | + | |
733 | 734 | | |
734 | 735 | | |
735 | 736 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
30 | | - | |
| 30 | + | |
| 31 | + | |
31 | 32 | | |
32 | 33 | | |
33 | 34 | | |
| |||
175 | 176 | | |
176 | 177 | | |
177 | 178 | | |
178 | | - | |
179 | | - | |
| 179 | + | |
| 180 | + | |
180 | 181 | | |
181 | 182 | | |
182 | 183 | | |
183 | | - | |
| 184 | + | |
184 | 185 | | |
185 | 186 | | |
186 | 187 | | |
187 | 188 | | |
188 | 189 | | |
189 | 190 | | |
190 | | - | |
| 191 | + | |
191 | 192 | | |
192 | 193 | | |
193 | 194 | | |
194 | 195 | | |
195 | | - | |
196 | | - | |
| 196 | + | |
| 197 | + | |
197 | 198 | | |
198 | 199 | | |
199 | 200 | | |
200 | | - | |
| 201 | + | |
201 | 202 | | |
202 | 203 | | |
203 | 204 | | |
204 | | - | |
| 205 | + | |
205 | 206 | | |
206 | 207 | | |
207 | 208 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
| 42 | + | |
| 43 | + | |
43 | 44 | | |
44 | 45 | | |
45 | 46 | | |
| |||
185 | 186 | | |
186 | 187 | | |
187 | 188 | | |
188 | | - | |
189 | | - | |
| 189 | + | |
| 190 | + | |
190 | 191 | | |
191 | 192 | | |
192 | 193 | | |
193 | | - | |
| 194 | + | |
194 | 195 | | |
195 | 196 | | |
196 | 197 | | |
197 | 198 | | |
198 | 199 | | |
199 | 200 | | |
200 | | - | |
| 201 | + | |
201 | 202 | | |
202 | 203 | | |
203 | 204 | | |
204 | 205 | | |
205 | | - | |
206 | | - | |
| 206 | + | |
| 207 | + | |
207 | 208 | | |
208 | 209 | | |
209 | 210 | | |
210 | | - | |
| 211 | + | |
211 | 212 | | |
212 | 213 | | |
213 | 214 | | |
214 | | - | |
| 215 | + | |
215 | 216 | | |
216 | 217 | | |
217 | 218 | | |
| |||
0 commit comments