nak: Legalize immediates with source modifiers

We can just apply the source modifier to the immediate.  Also, make
IAdd3X have I32 sources.  They do get a bit odd in the high form but

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26535>
This commit is contained in:
Faith Ekstrand
2023-12-05 23:28:52 -06:00
committed by Marge Bot
parent 5335a59bff
commit 85462f7455

View File

@@ -323,6 +323,37 @@ 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;
}
}
let mut vec_src_map: HashMap<SSARef, SSARef> = HashMap::new();
let mut vec_comps = HashSet::new();
for src in instr.srcs_mut() {