From 8a4ffe3c7ef477f21e9fb0f77ba15a48293cdbb2 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 5 May 2025 10:25:06 -0400 Subject: [PATCH] nak: Fold source modifiers in Src::as_u32() For now we leave a fold_imm() helper with the old semantics because there are still two uses of it. Part-of: --- src/nouveau/compiler/nak/ir.rs | 40 +++++++++++++++++----------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index fb72284164a..08a7a7b85d5 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -1126,13 +1126,15 @@ impl Src { } } - pub fn fold_imm(&self, src_type: SrcType) -> Src { - let SrcRef::Imm32(mut u) = self.src_ref else { - return *self; + pub fn as_u32(&self, src_type: SrcType) -> Option { + let u = match &self.src_ref { + SrcRef::Zero => 0, + SrcRef::Imm32(u) => *u, + _ => return None, }; if self.src_mod.is_none() && self.src_swizzle.is_none() { - return *self; + return Some(u); } assert!(src_type == SrcType::F16v2 || self.src_swizzle.is_none()); @@ -1141,10 +1143,10 @@ impl Src { // trivially folded. In fact, -imm may not be representable as a 32-bit // immediate at all. if src_type == SrcType::I32 { - return *self; + return None; } - u = match src_type { + Some(match src_type { SrcType::F16 => { let low = u & 0xFFFF; @@ -1192,12 +1194,19 @@ impl Src { assert!(self.src_mod.is_none()); u } - }; + }) + } - Src { - src_mod: SrcMod::None, - src_ref: u.into(), - src_swizzle: SrcSwizzle::None, + pub fn fold_imm(&self, src_type: SrcType) -> Src { + // Don't fold Zero + if !matches!(self.src_ref, SrcRef::Imm32(_)) { + return *self; + } + + if let Some(u) = self.as_u32(src_type) { + u.into() + } else { + *self } } @@ -1225,15 +1234,6 @@ impl Src { } } - pub fn as_u32(&self, src_type: SrcType) -> Option { - debug_assert!(self.supports_type(&src_type)); - if self.src_mod.is_none() { - self.src_ref.as_u32() - } else { - None - } - } - pub fn as_imm_not_i20(&self) -> Option { match self.src_ref { SrcRef::Imm32(i) => {