diff options
| author | Matt Johnston <[email protected]> | 2025-08-12 15:28:52 +0800 |
|---|---|---|
| committer | Matt Johnston <[email protected]> | 2025-08-15 17:39:52 +0800 |
| commit | 86e257bc8df5e76c3857644f78650e65447523ad (patch) | |
| tree | 34b499c76dc68b600dc7997c3d76f381079939c9 /embassy-stm32/src/hash | |
| parent | d939d901e245c30f924e30a7605e378be0be5cca (diff) | |
stm32/hash: Improve performance when hashing
chunks_exact produces better code
Diffstat (limited to 'embassy-stm32/src/hash')
| -rw-r--r-- | embassy-stm32/src/hash/mod.rs | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/embassy-stm32/src/hash/mod.rs b/embassy-stm32/src/hash/mod.rs index a4c275242..90c06c0d8 100644 --- a/embassy-stm32/src/hash/mod.rs +++ b/embassy-stm32/src/hash/mod.rs | |||
| @@ -353,13 +353,17 @@ impl<'d, T: Instance, M: Mode> Hash<'d, T, M> { | |||
| 353 | let num_valid_bits: u8 = (8 * (input.len() % 4)) as u8; | 353 | let num_valid_bits: u8 = (8 * (input.len() % 4)) as u8; |
| 354 | T::regs().str().modify(|w| w.set_nblw(num_valid_bits)); | 354 | T::regs().str().modify(|w| w.set_nblw(num_valid_bits)); |
| 355 | 355 | ||
| 356 | let mut i = 0; | 356 | let mut chunks = input.chunks_exact(4); |
| 357 | while i < input.len() { | 357 | for chunk in &mut chunks { |
| 358 | T::regs() | ||
| 359 | .din() | ||
| 360 | .write_value(u32::from_ne_bytes(chunk.try_into().unwrap())); | ||
| 361 | } | ||
| 362 | let rem = chunks.remainder(); | ||
| 363 | if !rem.is_empty() { | ||
| 358 | let mut word: [u8; 4] = [0; 4]; | 364 | let mut word: [u8; 4] = [0; 4]; |
| 359 | let copy_idx = min(i + 4, input.len()); | 365 | word[0..rem.len()].copy_from_slice(rem); |
| 360 | word[0..copy_idx - i].copy_from_slice(&input[i..copy_idx]); | ||
| 361 | T::regs().din().write_value(u32::from_ne_bytes(word)); | 366 | T::regs().din().write_value(u32::from_ne_bytes(word)); |
| 362 | i += 4; | ||
| 363 | } | 367 | } |
| 364 | } | 368 | } |
| 365 | 369 | ||
