diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index d622d2549df..9a38f6e53ad 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -1091,6 +1091,45 @@ impl Src { } } + pub fn fold_imm(&self, src_type: SrcType) -> Src { + let SrcRef::Imm32(mut u) = self.src_ref else { + return *self; + }; + + if self.src_mod.is_none() { + return *self; + } + + u = match src_type { + SrcType::F32 | SrcType::F64 => match self.src_mod { + SrcMod::None => u, + SrcMod::FAbs => u & !(1_u32 << 31), + SrcMod::FNeg => u ^ (1_u32 << 31), + SrcMod::FNegAbs => u | (1_u32 << 31), + _ => panic!("Not a float source modifier"), + }, + SrcType::I32 => match self.src_mod { + SrcMod::None => u, + SrcMod::INeg => -(u as i32) as u32, + _ => panic!("Not an integer source modifier"), + }, + SrcType::B32 => match self.src_mod { + SrcMod::None => u, + SrcMod::BNot => !u, + _ => panic!("Not a bitwise source modifier"), + }, + _ => { + assert!(self.src_mod.is_none()); + u + } + }; + + Src { + src_mod: SrcMod::None, + src_ref: u.into(), + } + } + pub fn as_ssa(&self) -> Option<&SSARef> { if self.src_mod.is_none() { self.src_ref.as_ssa() @@ -1193,13 +1232,8 @@ impl Src { } pub fn is_fneg_zero(&self, src_type: SrcType) -> bool { - match self.src_ref { - SrcRef::Zero | SrcRef::Imm32(0) => { - matches!(self.src_mod, SrcMod::FNeg | SrcMod::FNegAbs) - } - SrcRef::Imm32(0x80000000) => { - src_type == SrcType::F32 && self.src_mod.is_none() - } + match self.fold_imm(src_type).src_ref { + SrcRef::Imm32(0x80000000) => src_type == SrcType::F32, _ => false, } } diff --git a/src/nouveau/compiler/nak/legalize.rs b/src/nouveau/compiler/nak/legalize.rs index 473dc5933a2..61fdce3fbae 100644 --- a/src/nouveau/compiler/nak/legalize.rs +++ b/src/nouveau/compiler/nak/legalize.rs @@ -753,32 +753,7 @@ fn legalize_instr( let src_types = instr.src_types(); for (i, src) in instr.srcs_mut().iter_mut().enumerate() { - if let SrcRef::Imm32(u) = &mut src.src_ref { - *u = match src_types[i] { - SrcType::F32 | SrcType::F64 => match src.src_mod { - SrcMod::None => *u, - SrcMod::FAbs => *u & !(1_u32 << 31), - SrcMod::FNeg => *u ^ !(1_u32 << 31), - SrcMod::FNegAbs => *u | !(1_u32 << 31), - _ => panic!("Not a float source modifier"), - }, - SrcType::I32 => match src.src_mod { - SrcMod::None => *u, - SrcMod::INeg => -(*u as i32) as u32, - _ => panic!("Not an integer source modifier"), - }, - SrcType::B32 => match src.src_mod { - SrcMod::None => *u, - SrcMod::BNot => !*u, - _ => panic!("Not a bitwise source modifier"), - }, - _ => { - assert!(src.src_mod.is_none()); - *u - } - }; - src.src_mod = SrcMod::None; - } + *src = src.fold_imm(src_types[i]); } let mut vec_src_map: HashMap = HashMap::new();