From af6093a71267f6be5392c74491ab68f83ff750d0 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 14 Apr 2025 19:27:52 -0500 Subject: [PATCH] nak/legalize: Add a helper for lowering ineg This is similar to the helper we have for lowering float modifiers. Part-of: --- src/nouveau/compiler/nak/legalize.rs | 23 +++++++++++++++++++++++ src/nouveau/compiler/nak/sm50.rs | 8 +------- src/nouveau/compiler/nak/sm70_encode.rs | 8 +------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/nouveau/compiler/nak/legalize.rs b/src/nouveau/compiler/nak/legalize.rs index 18c669820fb..585d32d4073 100644 --- a/src/nouveau/compiler/nak/legalize.rs +++ b/src/nouveau/compiler/nak/legalize.rs @@ -269,6 +269,29 @@ pub trait LegalizeBuildHelpers: SSABuilder { } } + fn copy_alu_src_and_lower_ineg( + &mut self, + src: &mut Src, + src_type: SrcType, + ) { + assert!(src_type == SrcType::I32); + let val = self.alloc_ssa(RegFile::GPR, 1); + if self.sm() >= 70 { + self.push_op(OpIAdd3 { + srcs: [Src::new_zero(), *src, Src::new_zero()], + overflow: [Dst::None; 2], + dst: val.into(), + }); + } else { + self.push_op(OpIAdd2 { + dst: val.into(), + carry_out: Dst::None, + srcs: [Src::new_zero(), *src], + }); + } + *src = val.into(); + } + fn copy_ssa_ref_if_uniform(&mut self, ssa_ref: &mut SSARef) { for ssa in &mut ssa_ref[..] { if ssa.is_uniform() { diff --git a/src/nouveau/compiler/nak/sm50.rs b/src/nouveau/compiler/nak/sm50.rs index fcd23993316..16213009696 100644 --- a/src/nouveau/compiler/nak/sm50.rs +++ b/src/nouveau/compiler/nak/sm50.rs @@ -1265,13 +1265,7 @@ impl SM50Op for OpIAdd2 { swap_srcs_if_not_reg(src0, src1, GPR); if src0.src_mod.is_ineg() && src1.src_mod.is_ineg() { assert!(self.carry_out.is_none()); - let val = b.alloc_ssa(GPR, 1); - b.push_op(OpIAdd2 { - dst: val.into(), - carry_out: Dst::None, - srcs: [Src::new_zero(), *src0], - }); - *src0 = val.into(); + b.copy_alu_src_and_lower_ineg(src0, SrcType::I32); } b.copy_alu_src_if_not_reg(src0, GPR, SrcType::I32); if !self.carry_out.is_none() { diff --git a/src/nouveau/compiler/nak/sm70_encode.rs b/src/nouveau/compiler/nak/sm70_encode.rs index 904bd00f857..46ae7a6f152 100644 --- a/src/nouveau/compiler/nak/sm70_encode.rs +++ b/src/nouveau/compiler/nak/sm70_encode.rs @@ -1350,13 +1350,7 @@ impl SM70Op for OpIAdd3 { if !src0.src_mod.is_none() && !src1.src_mod.is_none() { assert!(self.overflow[0].is_none()); assert!(self.overflow[1].is_none()); - let val = b.alloc_ssa(gpr, 1); - b.push_op(OpIAdd3 { - srcs: [Src::new_zero(), *src0, Src::new_zero()], - overflow: [Dst::None; 2], - dst: val.into(), - }); - *src0 = val.into(); + b.copy_alu_src_and_lower_ineg(src0, SrcType::I32); } b.copy_alu_src_if_not_reg(src0, gpr, SrcType::I32); b.copy_alu_src_if_both_not_reg(src1, src2, gpr, SrcType::I32);