From 0f6d8640e1a0822e863f72e11eefc100cba82cbc Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Sat, 7 Oct 2023 22:24:35 -0500 Subject: [PATCH] nak/bitset: Improve set_words() Only set the bits requested and don't clobber other bits. Part-of: --- src/nouveau/compiler/bitset.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/nouveau/compiler/bitset.rs b/src/nouveau/compiler/bitset.rs index 7a21995f0c7..082e2993f95 100644 --- a/src/nouveau/compiler/bitset.rs +++ b/src/nouveau/compiler/bitset.rs @@ -107,6 +107,16 @@ impl BitSet { exists } + #[inline] + fn set_word( + &mut self, + w: usize, + mask: u32, + f: &mut impl FnMut(usize) -> u32, + ) { + self.words[w] = (self.words[w] & !mask) | (f(w) & mask); + } + pub fn set_words( &mut self, bits: Range, @@ -124,13 +134,13 @@ impl BitSet { self.reserve(last_word + 1); if first_word == last_word { - self.words[first_word] = f(first_word) & start_mask & end_mask; + self.set_word(first_word, start_mask & end_mask, &mut f); } else { - self.words[first_word] = f(first_word) & start_mask; + self.set_word(first_word, start_mask, &mut f); for w in (first_word + 1)..last_word { - self.words[w] = f(w); + self.set_word(w, !0, &mut f); } - self.words[last_word] = f(last_word) & end_mask; + self.set_word(last_word, end_mask, &mut f); } }