From ebc1c052ab4d2a703a8fd174ded9931f5b1fb01d Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 19 Jul 2024 19:38:56 -0500 Subject: [PATCH] nak: Implement Foldable for OpPrmt Part-of: --- src/nouveau/compiler/nak/hw_tests.rs | 11 +++++++++++ src/nouveau/compiler/nak/ir.rs | 25 ++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/nouveau/compiler/nak/hw_tests.rs b/src/nouveau/compiler/nak/hw_tests.rs index 00aa5fc7d22..f5790361265 100644 --- a/src/nouveau/compiler/nak/hw_tests.rs +++ b/src/nouveau/compiler/nak/hw_tests.rs @@ -565,3 +565,14 @@ fn test_op_iadd3x() { } } } + +#[test] +fn test_op_prmt() { + let op = OpPrmt { + dst: Dst::None, + srcs: [0.into(), 0.into()], + sel: 0.into(), + mode: PrmtMode::Index, + }; + test_foldable_op(op); +} diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index 32948a4c6f6..d7729538f76 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -4078,7 +4078,7 @@ impl fmt::Display for PrmtMode { } #[repr(C)] -#[derive(SrcsAsSlice, DstsAsSlice)] +#[derive(Clone, SrcsAsSlice, DstsAsSlice)] /// Permutes `srcs` into `dst` using `selection`. pub struct OpPrmt { #[dst_type(GPR)] @@ -4128,6 +4128,29 @@ impl OpPrmt { } } +impl Foldable for OpPrmt { + fn fold(&self, _sm: &dyn ShaderModel, f: &mut OpFoldData<'_>) { + let srcs = [ + f.get_u32_src(self, &self.srcs[0]), + f.get_u32_src(self, &self.srcs[1]), + ]; + let sel = f.get_u32_src(self, &self.sel); + + assert!(self.mode == PrmtMode::Index); + let sel = PrmtSel(sel as u16); + + let mut dst = 0_u32; + for b in 0..4 { + let sel_byte = sel.get(b); + let src = srcs[sel_byte.src()]; + let sb = sel_byte.fold_u32(src); + dst |= u32::from(sb) << (b * 8); + } + + f.set_u32_dst(self, &self.dst, dst); + } +} + impl DisplayOp for OpPrmt { fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(