From ec84d7ce74a0d397af736aace32aa5c97d53a3ba Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Sat, 27 Jul 2024 02:52:28 -0500 Subject: [PATCH] nak: Add tests for OpPopC and enable SrcMod::BNot Part-of: --- src/nouveau/compiler/nak/hw_tests.rs | 13 +++++++++++++ src/nouveau/compiler/nak/ir.rs | 12 ++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/nouveau/compiler/nak/hw_tests.rs b/src/nouveau/compiler/nak/hw_tests.rs index 805a7b2aefc..f4bf6bba61a 100644 --- a/src/nouveau/compiler/nak/hw_tests.rs +++ b/src/nouveau/compiler/nak/hw_tests.rs @@ -784,6 +784,19 @@ fn test_op_lop3() { } } +#[test] +fn test_op_popc() { + let src_mods = [SrcMod::None, SrcMod::BNot]; + for src_mod in src_mods { + let mut op = OpPopC { + dst: Dst::None, + src: 0.into(), + }; + op.src.src_mod = src_mod; + test_foldable_op(op); + } +} + #[test] fn test_op_shf() { let sm = &RunSingleton::get().sm; diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index 9003ef79c7a..46bb8db1607 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -4529,15 +4529,23 @@ impl DisplayOp for OpPSetP { } #[repr(C)] -#[derive(SrcsAsSlice, DstsAsSlice)] +#[derive(Clone, SrcsAsSlice, DstsAsSlice)] pub struct OpPopC { #[dst_type(GPR)] pub dst: Dst, - #[src_type(ALU)] + #[src_type(B32)] pub src: Src, } +impl Foldable for OpPopC { + fn fold(&self, _sm: &dyn ShaderModel, f: &mut OpFoldData<'_>) { + let src = f.get_u32_bnot_src(self, &self.src); + let dst = src.count_ones(); + f.set_u32_dst(self, &self.dst, dst); + } +} + impl DisplayOp for OpPopC { fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "popc {}", self.src,)