nak: move folding logic to Src::fold_imm

Signed-off-by: Mary Guillemard <mary.guillemard@collabora.com>
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27635>
This commit is contained in:
Mary Guillemard
2024-02-28 15:48:21 +01:00
committed by Marge Bot
parent 02873c4745
commit 791c2b604a
2 changed files with 42 additions and 33 deletions
+41 -7
View File
@@ -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,
}
}
+1 -26
View File
@@ -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<SSARef, SSARef> = HashMap::new();