Module: Mesa Branch: main Commit: b736cdcb832462e6d72ca2601e0b17fc01892028 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b736cdcb832462e6d72ca2601e0b17fc01892028
Author: Faith Ekstrand <faith.ekstr...@collabora.com> Date: Tue Dec 5 23:52:24 2023 -0600 nak: Rework the OpIAdd3/OpIAdd3X split This lets us use the correct source types on OpIAdd3X Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26535> --- src/nouveau/compiler/nak_builder.rs | 1 + src/nouveau/compiler/nak_encode_sm70.rs | 7 +++---- src/nouveau/compiler/nak_from_nir.rs | 10 ++-------- src/nouveau/compiler/nak_ir.rs | 26 ++++++++++++-------------- src/nouveau/compiler/nak_legalize.rs | 1 + 5 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/nouveau/compiler/nak_builder.rs b/src/nouveau/compiler/nak_builder.rs index 6f54069bfec..0eb2cf5e955 100644 --- a/src/nouveau/compiler/nak_builder.rs +++ b/src/nouveau/compiler/nak_builder.rs @@ -154,6 +154,7 @@ pub trait SSABuilder: Builder { self.push_op(OpIAdd3 { dst: dst.into(), srcs: [Src::new_zero(), x, y], + overflow: [Dst::None; 2], }); dst } diff --git a/src/nouveau/compiler/nak_encode_sm70.rs b/src/nouveau/compiler/nak_encode_sm70.rs index f1c15575a18..15a6527dcff 100644 --- a/src/nouveau/compiler/nak_encode_sm70.rs +++ b/src/nouveau/compiler/nak_encode_sm70.rs @@ -636,8 +636,8 @@ impl SM70Instr { ALUSrc::from_src(&op.srcs[2]), ); - self.set_pred_dst(81..84, Dst::None); - self.set_pred_dst(84..87, Dst::None); + self.set_pred_dst(81..84, op.overflow[0]); + self.set_pred_dst(84..87, op.overflow[1]); } fn encode_iadd3x(&mut self, op: &OpIAdd3X) { @@ -652,8 +652,7 @@ impl SM70Instr { ALUSrc::from_src(&op.srcs[2]), ); - // .X - self.set_bit(74, op.high); + self.set_bit(74, true); // .X self.set_pred_dst(81..84, op.overflow[0]); self.set_pred_dst(84..87, op.overflow[1]); diff --git a/src/nouveau/compiler/nak_from_nir.rs b/src/nouveau/compiler/nak_from_nir.rs index 1e58d8cc54a..a7d3f76a892 100644 --- a/src/nouveau/compiler/nak_from_nir.rs +++ b/src/nouveau/compiler/nak_from_nir.rs @@ -757,17 +757,14 @@ impl<'a> ShaderFromNir<'a> { let y = srcs[1].as_ssa().unwrap(); let sum = b.alloc_ssa(RegFile::GPR, 2); let carry = b.alloc_ssa(RegFile::Pred, 1); - b.push_op(OpIAdd3X { + b.push_op(OpIAdd3 { dst: sum[0].into(), overflow: [carry.into(), Dst::None], - high: false, srcs: [x[0].into(), y[0].into(), 0.into()], - carry: [SrcRef::False.into(), SrcRef::False.into()], }); b.push_op(OpIAdd3X { dst: sum[1].into(), overflow: [Dst::None, Dst::None], - high: true, srcs: [x[1].into(), y[1].into(), 0.into()], carry: [carry.into(), SrcRef::False.into()], }); @@ -867,17 +864,14 @@ impl<'a> ShaderFromNir<'a> { let x = srcs[0].as_ssa().unwrap(); let sum = b.alloc_ssa(RegFile::GPR, 2); let carry = b.alloc_ssa(RegFile::Pred, 1); - b.push_op(OpIAdd3X { + b.push_op(OpIAdd3 { dst: sum[0].into(), overflow: [carry.into(), Dst::None], - high: false, srcs: [0.into(), Src::from(x[0]).ineg(), 0.into()], - carry: [SrcRef::False.into(), SrcRef::False.into()], }); b.push_op(OpIAdd3X { dst: sum[1].into(), overflow: [Dst::None, Dst::None], - high: true, srcs: [0.into(), Src::from(x[1]).bnot(), 0.into()], carry: [carry.into(), SrcRef::False.into()], }); diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index c76c65b69e8..1a8a47d5e78 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -2405,6 +2405,7 @@ impl_display_for_op!(OpINeg); #[derive(SrcsAsSlice, DstsAsSlice)] pub struct OpIAdd3 { pub dst: Dst, + pub overflow: [Dst; 2], #[src_type(I32)] pub srcs: [Src; 3], @@ -2427,9 +2428,7 @@ pub struct OpIAdd3X { pub dst: Dst, pub overflow: [Dst; 2], - pub high: bool, - - #[src_type(ALU)] + #[src_type(B32)] pub srcs: [Src; 3], #[src_type(Pred)] @@ -2438,17 +2437,15 @@ pub struct OpIAdd3X { impl DisplayOp for OpIAdd3X { fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "iadd3")?; - if self.high { - write!(f, ".hi")?; - } else { - write!(f, ".lo")?; - } - write!(f, " {} {} {}", self.srcs[0], self.srcs[1], self.srcs[2])?; - if self.high { - write!(f, " {} {}", self.carry[0], self.carry[1])?; - } - Ok(()) + write!( + f, + "iadd3.x {} {} {} {} {}", + self.srcs[0], + self.srcs[1], + self.srcs[2], + self.carry[0], + self.carry[1] + ) } } impl_display_for_op!(OpIAdd3X); @@ -5306,6 +5303,7 @@ impl Shader { match instr.op { Op::INeg(neg) => MappedInstrs::One(Instr::new_boxed(OpIAdd3 { dst: neg.dst, + overflow: [Dst::None; 2], srcs: [Src::new_zero(), neg.src.ineg(), Src::new_zero()], })), _ => MappedInstrs::One(instr), diff --git a/src/nouveau/compiler/nak_legalize.rs b/src/nouveau/compiler/nak_legalize.rs index 92370d8a4fa..41afeecdcde 100644 --- a/src/nouveau/compiler/nak_legalize.rs +++ b/src/nouveau/compiler/nak_legalize.rs @@ -128,6 +128,7 @@ fn legalize_instr( let val = b.alloc_ssa(RegFile::GPR, 1); b.push_op(OpIAdd3 { srcs: [Src::new_zero(), *src0, Src::new_zero()], + overflow: [Dst::None; 2], dst: val.into(), }); *src0 = val.into();