From f2a7cda75a203527f74a8c7762cf9fab5986e7b8 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 10 Apr 2023 17:23:28 -0500 Subject: [PATCH] nak: Implement nir_op_[iu](min|max) Part-of: --- src/nouveau/compiler/nak_encode_sm75.rs | 19 +++++++++++++++++++ src/nouveau/compiler/nak_from_nir.rs | 15 +++++++++++++++ src/nouveau/compiler/nak_ir.rs | 21 +++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/src/nouveau/compiler/nak_encode_sm75.rs b/src/nouveau/compiler/nak_encode_sm75.rs index d8c09c619a3..54d14b83d21 100644 --- a/src/nouveau/compiler/nak_encode_sm75.rs +++ b/src/nouveau/compiler/nak_encode_sm75.rs @@ -475,6 +475,24 @@ impl SM75Instr { ); } + fn encode_imnmx(&mut self, op: &OpIMnMx) { + self.encode_alu( + 0x017, + Some(op.dst), + ALUSrc::from_src(&op.srcs[0]), + ALUSrc::from_src(&op.srcs[1]), + ALUSrc::None, + ); + self.set_pred_src(87..90, 90, op.min); + self.set_bit( + 73, + match op.cmp_type { + IntCmpType::U32 => false, + IntCmpType::I32 => true, + }, + ); + } + fn set_int_cmp_op(&mut self, range: Range, op: IntCmpOp) { assert!(range.len() == 3); self.set_field( @@ -751,6 +769,7 @@ impl SM75Instr { Op::FSet(op) => si.encode_fset(&op), Op::FSetP(op) => si.encode_fsetp(&op), Op::IAdd3(op) => si.encode_iadd3(&op), + Op::IMnMx(op) => si.encode_imnmx(&op), Op::ISetP(op) => si.encode_isetp(&op), Op::Lop3(op) => si.encode_lop3(&op), Op::Shl(op) => si.encode_shl(&op), diff --git a/src/nouveau/compiler/nak_from_nir.rs b/src/nouveau/compiler/nak_from_nir.rs index 8736b9e4681..f58684eb2a3 100644 --- a/src/nouveau/compiler/nak_from_nir.rs +++ b/src/nouveau/compiler/nak_from_nir.rs @@ -328,6 +328,21 @@ impl<'a> ShaderFromNir<'a> { )); } } + nir_op_imax | nir_op_imin | nir_op_umax | nir_op_umin => { + let (tp, min) = match alu.op { + nir_op_imax => (IntCmpType::I32, SrcRef::False), + nir_op_imin => (IntCmpType::I32, SrcRef::True), + nir_op_umax => (IntCmpType::U32, SrcRef::False), + nir_op_umin => (IntCmpType::U32, SrcRef::True), + _ => panic!("Not an integer min/max"), + }; + self.instrs.push(Instr::new(Op::IMnMx(OpIMnMx { + dst: dst, + cmp_type: tp, + srcs: [srcs[0], srcs[1]], + min: min.into(), + }))); + } nir_op_ineg => { self.instrs.push(Instr::new(Op::IMov(OpIMov { dst: dst, diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index b18b3b569a1..66e55be310a 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -1102,6 +1102,25 @@ impl fmt::Display for OpIAdd3 { } } +#[repr(C)] +#[derive(SrcsAsSlice, DstsAsSlice)] +pub struct OpIMnMx { + pub dst: Dst, + pub cmp_type: IntCmpType, + pub srcs: [Src; 2], + pub min: Src, +} + +impl fmt::Display for OpIMnMx { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "IMNMX.{} {} {{ {}, {} }} {}", + self.cmp_type, self.dst, self.srcs[0], self.srcs[1], self.min + ) + } +} + #[repr(C)] #[derive(SrcsAsSlice, DstsAsSlice)] pub struct OpISetP { @@ -1644,6 +1663,7 @@ pub enum Op { FSet(OpFSet), FSetP(OpFSetP), IAdd3(OpIAdd3), + IMnMx(OpIMnMx), ISetP(OpISetP), Lop3(OpLop3), Shl(OpShl), @@ -2069,6 +2089,7 @@ impl Instr { | Op::FSet(_) | Op::FSetP(_) | Op::IAdd3(_) + | Op::IMnMx(_) | Op::Lop3(_) | Op::PLop3(_) | Op::ISetP(_)