aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/hash
diff options
context:
space:
mode:
authorMatt Johnston <[email protected]>2025-08-12 15:28:52 +0800
committerMatt Johnston <[email protected]>2025-08-15 17:39:52 +0800
commit86e257bc8df5e76c3857644f78650e65447523ad (patch)
tree34b499c76dc68b600dc7997c3d76f381079939c9 /embassy-stm32/src/hash
parentd939d901e245c30f924e30a7605e378be0be5cca (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.rs14
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