diff --git a/src/compiler/rust/lib.rs b/src/compiler/rust/lib.rs index 68b0087f18b..318fda2d3d6 100644 --- a/src/compiler/rust/lib.rs +++ b/src/compiler/rust/lib.rs @@ -11,3 +11,4 @@ pub mod memstream; pub mod nir; pub mod nir_instr_printer; pub mod smallvec; +pub mod vec_pair; diff --git a/src/compiler/rust/meson.build b/src/compiler/rust/meson.build index 2dbf2bfe176..e7638718350 100644 --- a/src/compiler/rust/meson.build +++ b/src/compiler/rust/meson.build @@ -11,6 +11,7 @@ _compiler_rs_sources = [ 'nir_instr_printer.rs', 'nir.rs', 'smallvec.rs', + 'vec_pair.rs', ] _compiler_binding_types = [ diff --git a/src/compiler/rust/vec_pair.rs b/src/compiler/rust/vec_pair.rs new file mode 100644 index 00000000000..ed216be2eef --- /dev/null +++ b/src/compiler/rust/vec_pair.rs @@ -0,0 +1,104 @@ +// Copyright © 2022 Collabora, Ltd. +// SPDX-License-Identifier: MIT + +use std::iter::Zip; +use std::slice; + +pub struct VecPair { + a: Vec, + b: Vec, +} + +impl VecPair { + pub fn a_as_slice(&self) -> &[A] { + &self.a + } + + pub fn a_as_mut_slice(&mut self) -> &mut [A] { + &mut self.a + } + + pub fn b_as_slice(&self) -> &[B] { + &self.b + } + + pub fn b_as_mut_slice(&mut self) -> &mut [B] { + &mut self.b + } + + pub fn append(&mut self, other: &mut VecPair) { + self.a.append(&mut other.a); + self.b.append(&mut other.b); + } + + pub fn is_empty(&self) -> bool { + debug_assert!(self.a.len() == self.b.len()); + self.a.is_empty() + } + + pub fn iter(&self) -> Zip, slice::Iter<'_, B>> { + debug_assert!(self.a.len() == self.b.len()); + self.a.iter().zip(self.b.iter()) + } + + pub fn iter_mut( + &mut self, + ) -> Zip, slice::IterMut<'_, B>> { + debug_assert!(self.a.len() == self.b.len()); + self.a.iter_mut().zip(self.b.iter_mut()) + } + + pub fn len(&self) -> usize { + debug_assert!(self.a.len() == self.b.len()); + self.a.len() + } + + pub fn new() -> Self { + Self { + a: Vec::new(), + b: Vec::new(), + } + } + + pub fn push(&mut self, a: A, b: B) { + debug_assert!(self.a.len() == self.b.len()); + self.a.push(a); + self.b.push(b); + } +} + +impl VecPair { + pub fn retain(&mut self, mut f: impl FnMut(&A, &B) -> bool) { + debug_assert!(self.a.len() == self.b.len()); + let len = self.a.len(); + let mut i = 0_usize; + while i < len { + if !f(&self.a[i], &self.b[i]) { + break; + } + i += 1; + } + + let mut new_len = i; + + // Don't check this one twice. + i += 1; + + while i < len { + // This could be more efficient but it's good enough for our + // purposes since everything we're storing is small and has a + // trivial Drop. + if f(&self.a[i], &self.b[i]) { + self.a[new_len] = self.a[i].clone(); + self.b[new_len] = self.b[i].clone(); + new_len += 1; + } + i += 1; + } + + if new_len < len { + self.a.truncate(new_len); + self.b.truncate(new_len); + } + } +} diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index 29c9a5cb93a..8e7418f6c05 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -19,11 +19,11 @@ use compiler::as_slice::*; use compiler::cfg::CFG; use compiler::dataflow::ForwardDataflow; use compiler::smallvec::SmallVec; +use compiler::vec_pair::VecPair; use nak_ir_proc::*; use std::cmp::{max, min}; use std::fmt; use std::fmt::Write; -use std::iter::Zip; use std::ops::{BitAnd, BitOr, Deref, DerefMut, Index, IndexMut, Not, Range}; use std::slice; @@ -7627,89 +7627,6 @@ impl DisplayOp for OpSrcBar { } impl_display_for_op!(OpSrcBar); -pub struct VecPair { - a: Vec, - b: Vec, -} - -impl VecPair { - pub fn append(&mut self, other: &mut VecPair) { - self.a.append(&mut other.a); - self.b.append(&mut other.b); - } - - pub fn is_empty(&self) -> bool { - debug_assert!(self.a.len() == self.b.len()); - self.a.is_empty() - } - - pub fn iter(&self) -> Zip, slice::Iter<'_, B>> { - debug_assert!(self.a.len() == self.b.len()); - self.a.iter().zip(self.b.iter()) - } - - pub fn iter_mut( - &mut self, - ) -> Zip, slice::IterMut<'_, B>> { - debug_assert!(self.a.len() == self.b.len()); - self.a.iter_mut().zip(self.b.iter_mut()) - } - - pub fn len(&self) -> usize { - debug_assert!(self.a.len() == self.b.len()); - self.a.len() - } - - pub fn new() -> Self { - Self { - a: Vec::new(), - b: Vec::new(), - } - } - - pub fn push(&mut self, a: A, b: B) { - debug_assert!(self.a.len() == self.b.len()); - self.a.push(a); - self.b.push(b); - } -} - -impl VecPair { - pub fn retain(&mut self, mut f: impl FnMut(&A, &B) -> bool) { - debug_assert!(self.a.len() == self.b.len()); - let len = self.a.len(); - let mut i = 0_usize; - while i < len { - if !f(&self.a[i], &self.b[i]) { - break; - } - i += 1; - } - - let mut new_len = i; - - // Don't check this one twice. - i += 1; - - while i < len { - // This could be more efficient but it's good enough for our - // purposes since everything we're storing is small and has a - // trivial Drop. - if f(&self.a[i], &self.b[i]) { - self.a[new_len] = self.a[i].clone(); - self.b[new_len] = self.b[i].clone(); - new_len += 1; - } - i += 1; - } - - if new_len < len { - self.a.truncate(new_len); - self.b.truncate(new_len); - } - } -} - mod phi { #[allow(unused_imports)] use crate::ir::{OpPhiDsts, OpPhiSrcs}; @@ -7804,11 +7721,11 @@ impl OpPhiSrcs { impl SrcsAsSlice for OpPhiSrcs { fn srcs_as_slice(&self) -> &[Src] { - &self.srcs.b + self.srcs.b_as_slice() } fn srcs_as_mut_slice(&mut self) -> &mut [Src] { - &mut self.srcs.b + self.srcs.b_as_mut_slice() } fn src_types(&self) -> SrcTypeList { @@ -7851,11 +7768,11 @@ impl OpPhiDsts { impl DstsAsSlice for OpPhiDsts { fn dsts_as_slice(&self) -> &[Dst] { - &self.dsts.b + self.dsts.b_as_slice() } fn dsts_as_mut_slice(&mut self) -> &mut [Dst] { - &mut self.dsts.b + self.dsts.b_as_mut_slice() } fn dst_types(&self) -> DstTypeList { @@ -7966,11 +7883,11 @@ impl OpParCopy { impl SrcsAsSlice for OpParCopy { fn srcs_as_slice(&self) -> &[Src] { - &self.dsts_srcs.b + self.dsts_srcs.b_as_slice() } fn srcs_as_mut_slice(&mut self) -> &mut [Src] { - &mut self.dsts_srcs.b + self.dsts_srcs.b_as_mut_slice() } fn src_types(&self) -> SrcTypeList { @@ -7980,11 +7897,11 @@ impl SrcsAsSlice for OpParCopy { impl DstsAsSlice for OpParCopy { fn dsts_as_slice(&self) -> &[Dst] { - &self.dsts_srcs.a + self.dsts_srcs.a_as_slice() } fn dsts_as_mut_slice(&mut self) -> &mut [Dst] { - &mut self.dsts_srcs.a + self.dsts_srcs.a_as_mut_slice() } fn dst_types(&self) -> DstTypeList {