From a0854d705d26d746a51564f4183961c66bc20ca7 Mon Sep 17 00:00:00 2001 From: Pascal Seitz Date: Wed, 1 Feb 2023 13:58:06 +0800 Subject: [PATCH] simplify extend_from_within_overlapping extend_from_within_overlapping is used in safe decompression when overlapping data has been detected. The prev version had unnecessary assertions/safe guard, since this method is only used in safe code. Removing the temporary &mut slice also simplified assembly output. uiCA Code Analyzer Prev Tool Skylake IceLake Tiger Lake Rocket Lake uiCA Cycles 28.71 30.67 28.71 27.57 Simplified Tool Skylake IceLake TigerLake Rocket Lake uiCA Cycles 13.00 15.00 13.00 11.00 --- src/sink.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/sink.rs b/src/sink.rs index 7d8474b9..19f71e81 100644 --- a/src/sink.rs +++ b/src/sink.rs @@ -148,16 +148,12 @@ impl<'a> SliceSink<'a> { #[inline] #[cfg(any(feature = "safe-decode"))] - pub(crate) fn extend_from_within_overlapping(&mut self, start: usize, len: usize) { - // Sink safety invariant guarantees that the first `pos` items are always initialized. - assert!(start <= self.pos); + pub(crate) fn extend_from_within_overlapping(&mut self, start: usize, num_bytes: usize) { let offset = self.pos - start; - let out = &mut self.output[start..self.pos + len]; - out[offset] = 0; // ensures that a copy w/ start == pos becomes a zero fill - for i in offset..out.len() { - out[i] = out[i - offset]; + for i in start + offset..start + offset + num_bytes { + self.output[i] = self.output[i - offset]; } - self.pos += len; + self.pos += num_bytes; } }