From 86e257bc8df5e76c3857644f78650e65447523ad Mon Sep 17 00:00:00 2001 From: Matt Johnston Date: Tue, 12 Aug 2025 15:28:52 +0800 Subject: stm32/hash: Improve performance when hashing chunks_exact produces better code --- embassy-stm32/CHANGELOG.md | 1 + embassy-stm32/src/hash/mod.rs | 14 +++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/embassy-stm32/CHANGELOG.md b/embassy-stm32/CHANGELOG.md index 0f044419e..d2dccaea5 100644 --- a/embassy-stm32/CHANGELOG.md +++ b/embassy-stm32/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased - ReleaseDate +- feat: Improve blocking hash speed - fix: Fix vrefbuf building with log feature - fix: Fix performing a hash after performing a hmac - chore: Updated stm32-metapac and stm32-data dependencies 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> { let num_valid_bits: u8 = (8 * (input.len() % 4)) as u8; T::regs().str().modify(|w| w.set_nblw(num_valid_bits)); - let mut i = 0; - while i < input.len() { + let mut chunks = input.chunks_exact(4); + for chunk in &mut chunks { + T::regs() + .din() + .write_value(u32::from_ne_bytes(chunk.try_into().unwrap())); + } + let rem = chunks.remainder(); + if !rem.is_empty() { let mut word: [u8; 4] = [0; 4]; - let copy_idx = min(i + 4, input.len()); - word[0..copy_idx - i].copy_from_slice(&input[i..copy_idx]); + word[0..rem.len()].copy_from_slice(rem); T::regs().din().write_value(u32::from_ne_bytes(word)); - i += 4; } } -- cgit