Module: Mesa Branch: main Commit: c0d0ce4c6b4530264afef0db89236c9e9e4cc7bb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c0d0ce4c6b4530264afef0db89236c9e9e4cc7bb
Author: Faith Ekstrand <faith.ekstr...@collabora.com> Date: Wed Nov 22 14:41:48 2023 -0600 nak: Rework OpPrmt a bit This renames `selection` to `sel`, adds a source type for sel, adds the PrmtMode for selecting permute mode, and adds proper legalization. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26348> --- src/nouveau/compiler/nak_builder.rs | 3 ++- src/nouveau/compiler/nak_encode_sm70.rs | 15 +++++++++++++- src/nouveau/compiler/nak_ir.rs | 35 ++++++++++++++++++++++++++++++--- src/nouveau/compiler/nak_legalize.rs | 7 +++++-- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/nouveau/compiler/nak_builder.rs b/src/nouveau/compiler/nak_builder.rs index f8090243acd..585bde11d60 100644 --- a/src/nouveau/compiler/nak_builder.rs +++ b/src/nouveau/compiler/nak_builder.rs @@ -64,7 +64,8 @@ pub trait Builder { self.push_op(OpPrmt { dst: dst, srcs: [x, y], - selection: sel_u32.into(), + sel: sel_u32.into(), + mode: PrmtMode::Index, }); } } diff --git a/src/nouveau/compiler/nak_encode_sm70.rs b/src/nouveau/compiler/nak_encode_sm70.rs index 4e1ce63fd9f..6c5f8fa27ea 100644 --- a/src/nouveau/compiler/nak_encode_sm70.rs +++ b/src/nouveau/compiler/nak_encode_sm70.rs @@ -864,9 +864,22 @@ impl SM70Instr { 0x16, Some(op.dst), ALUSrc::from_src(&op.srcs[0]), - ALUSrc::from_src(&op.selection), + ALUSrc::from_src(&op.sel), ALUSrc::from_src(&op.srcs[1]), ); + + self.set_field( + 72..75, + match op.mode { + PrmtMode::Index => 0_u8, + PrmtMode::Forward4Extract => 1_u8, + PrmtMode::Backward4Extract => 2_u8, + PrmtMode::Replicate8 => 3_u8, + PrmtMode::EdgeClampLeft => 4_u8, + PrmtMode::EdgeClampRight => 5_u8, + PrmtMode::Replicate16 => 6_u8, + }, + ) } fn encode_sel(&mut self, op: &OpSel) { diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index 966f42202bb..89bcaac929a 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -2726,6 +2726,32 @@ impl DisplayOp for OpMov { } impl_display_for_op!(OpMov); +#[allow(dead_code)] +#[derive(Clone, Copy, Eq, Hash, PartialEq)] +pub enum PrmtMode { + Index, + Forward4Extract, + Backward4Extract, + Replicate8, + EdgeClampLeft, + EdgeClampRight, + Replicate16, +} + +impl fmt::Display for PrmtMode { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + PrmtMode::Index => Ok(()), + PrmtMode::Forward4Extract => write!(f, ".f4e"), + PrmtMode::Backward4Extract => write!(f, ".b4e"), + PrmtMode::Replicate8 => write!(f, ".rc8"), + PrmtMode::EdgeClampLeft => write!(f, ".ecl"), + PrmtMode::EdgeClampRight => write!(f, ".ecl"), + PrmtMode::Replicate16 => write!(f, ".rc16"), + } + } +} + #[repr(C)] #[derive(SrcsAsSlice, DstsAsSlice)] /// Permutes `srcs` into `dst` using `selection`. @@ -2735,15 +2761,18 @@ pub struct OpPrmt { #[src_type(ALU)] pub srcs: [Src; 2], - pub selection: Src, + #[src_type(ALU)] + pub sel: Src, + + pub mode: PrmtMode, } impl DisplayOp for OpPrmt { fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, - "prmt {} [{}] {}", - self.srcs[0], self.selection, self.srcs[1], + "prmt{} {} [{}] {}", + self.mode, self.srcs[0], self.sel, self.srcs[1], ) } } diff --git a/src/nouveau/compiler/nak_legalize.rs b/src/nouveau/compiler/nak_legalize.rs index 924959a2b13..5393167d991 100644 --- a/src/nouveau/compiler/nak_legalize.rs +++ b/src/nouveau/compiler/nak_legalize.rs @@ -198,8 +198,11 @@ fn legalize_instr(b: &mut impl SSABuilder, instr: &mut Instr) { | Op::F2I(_) | Op::I2F(_) | Op::Mov(_) - | Op::FRnd(_) - | Op::Prmt(_) => (), + | Op::FRnd(_) => (), + Op::Prmt(op) => { + copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR); + copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR); + } Op::Sel(op) => { let [ref mut src0, ref mut src1] = op.srcs; if !src_is_reg(src0) && src_is_reg(src1) {