mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-22 06:20:22 +01:00
nak: Move the copy detection part of opt_copy_prop to a helper
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26743>
This commit is contained in:
parent
0b2e48f432
commit
d41b0a2bf5
1 changed files with 99 additions and 116 deletions
|
|
@ -304,125 +304,108 @@ impl CopyPropPass {
|
|||
}
|
||||
}
|
||||
|
||||
fn try_add_instr(&mut self, instr: &Instr) {
|
||||
match &instr.op {
|
||||
Op::FAdd(add) => {
|
||||
let dst = add.dst.as_ssa().unwrap();
|
||||
assert!(dst.comps() == 1);
|
||||
let dst = dst[0];
|
||||
|
||||
if !add.saturate {
|
||||
if add.srcs[0].is_fneg_zero(SrcType::F32) {
|
||||
self.add_copy(dst, SrcType::F32, add.srcs[1]);
|
||||
} else if add.srcs[1].is_fneg_zero(SrcType::F32) {
|
||||
self.add_copy(dst, SrcType::F32, add.srcs[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Op::DAdd(add) => {
|
||||
let dst = add.dst.as_ssa().unwrap();
|
||||
if !add.saturate {
|
||||
if add.srcs[0].is_zero() {
|
||||
self.add_fp64_copy(dst, add.srcs[1]);
|
||||
} else if add.srcs[1].is_zero() {
|
||||
self.add_fp64_copy(dst, add.srcs[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Op::Lop3(lop) => {
|
||||
let dst = lop.dst.as_ssa().unwrap();
|
||||
assert!(dst.comps() == 1);
|
||||
let dst = dst[0];
|
||||
|
||||
let op = lop.op;
|
||||
if op.lut == 0 {
|
||||
self.add_copy(dst, SrcType::ALU, SrcRef::Zero.into());
|
||||
} else if op.lut == !0 {
|
||||
self.add_copy(
|
||||
dst,
|
||||
SrcType::ALU,
|
||||
SrcRef::Imm32(u32::MAX).into(),
|
||||
);
|
||||
} else {
|
||||
for s in 0..3 {
|
||||
if op.lut == LogicOp3::SRC_MASKS[s] {
|
||||
self.add_copy(dst, SrcType::ALU, lop.srcs[s]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Op::PLop3(lop) => {
|
||||
for i in 0..2 {
|
||||
let dst = match lop.dsts[i] {
|
||||
Dst::SSA(vec) => {
|
||||
assert!(vec.comps() == 1);
|
||||
vec[0]
|
||||
}
|
||||
_ => continue,
|
||||
};
|
||||
|
||||
let op = lop.ops[i];
|
||||
if op.lut == 0 {
|
||||
self.add_copy(dst, SrcType::Pred, SrcRef::False.into());
|
||||
} else if op.lut == !0 {
|
||||
self.add_copy(dst, SrcType::Pred, SrcRef::True.into());
|
||||
} else {
|
||||
for s in 0..3 {
|
||||
if op.lut == LogicOp3::SRC_MASKS[s] {
|
||||
self.add_copy(dst, SrcType::Pred, lop.srcs[s]);
|
||||
} else if op.lut == !LogicOp3::SRC_MASKS[s] {
|
||||
self.add_copy(
|
||||
dst,
|
||||
SrcType::Pred,
|
||||
lop.srcs[s].bnot(),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Op::INeg(neg) => {
|
||||
let dst = neg.dst.as_ssa().unwrap();
|
||||
assert!(dst.comps() == 1);
|
||||
self.add_copy(dst[0], SrcType::I32, neg.src.ineg());
|
||||
}
|
||||
Op::Copy(copy) => {
|
||||
let dst = copy.dst.as_ssa().unwrap();
|
||||
assert!(dst.comps() == 1);
|
||||
self.add_copy(dst[0], SrcType::GPR, copy.src);
|
||||
}
|
||||
Op::ParCopy(pcopy) => {
|
||||
for (dst, src) in pcopy.dsts_srcs.iter() {
|
||||
let dst = dst.as_ssa().unwrap();
|
||||
assert!(dst.comps() == 1);
|
||||
self.add_copy(dst[0], SrcType::GPR, *src);
|
||||
}
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn run(&mut self, f: &mut Function) {
|
||||
for b in &mut f.blocks {
|
||||
for instr in &mut b.instrs {
|
||||
match &instr.op {
|
||||
Op::FAdd(add) => {
|
||||
let dst = add.dst.as_ssa().unwrap();
|
||||
assert!(dst.comps() == 1);
|
||||
let dst = dst[0];
|
||||
|
||||
if !add.saturate {
|
||||
if add.srcs[0].is_fneg_zero(SrcType::F32) {
|
||||
self.add_copy(dst, SrcType::F32, add.srcs[1]);
|
||||
} else if add.srcs[1].is_fneg_zero(SrcType::F32) {
|
||||
self.add_copy(dst, SrcType::F32, add.srcs[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Op::DAdd(add) => {
|
||||
let dst = add.dst.as_ssa().unwrap();
|
||||
if !add.saturate {
|
||||
if add.srcs[0].is_zero() {
|
||||
self.add_fp64_copy(dst, add.srcs[1]);
|
||||
} else if add.srcs[1].is_zero() {
|
||||
self.add_fp64_copy(dst, add.srcs[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Op::Lop3(lop) => {
|
||||
let dst = lop.dst.as_ssa().unwrap();
|
||||
assert!(dst.comps() == 1);
|
||||
let dst = dst[0];
|
||||
|
||||
let op = lop.op;
|
||||
if op.lut == 0 {
|
||||
self.add_copy(
|
||||
dst,
|
||||
SrcType::ALU,
|
||||
SrcRef::Zero.into(),
|
||||
);
|
||||
} else if op.lut == !0 {
|
||||
self.add_copy(
|
||||
dst,
|
||||
SrcType::ALU,
|
||||
SrcRef::Imm32(u32::MAX).into(),
|
||||
);
|
||||
} else {
|
||||
for s in 0..3 {
|
||||
if op.lut == LogicOp3::SRC_MASKS[s] {
|
||||
self.add_copy(
|
||||
dst,
|
||||
SrcType::ALU,
|
||||
lop.srcs[s],
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Op::PLop3(lop) => {
|
||||
for i in 0..2 {
|
||||
let dst = match lop.dsts[i] {
|
||||
Dst::SSA(vec) => {
|
||||
assert!(vec.comps() == 1);
|
||||
vec[0]
|
||||
}
|
||||
_ => continue,
|
||||
};
|
||||
|
||||
let op = lop.ops[i];
|
||||
if op.lut == 0 {
|
||||
self.add_copy(
|
||||
dst,
|
||||
SrcType::Pred,
|
||||
SrcRef::False.into(),
|
||||
);
|
||||
} else if op.lut == !0 {
|
||||
self.add_copy(
|
||||
dst,
|
||||
SrcType::Pred,
|
||||
SrcRef::True.into(),
|
||||
);
|
||||
} else {
|
||||
for s in 0..3 {
|
||||
if op.lut == LogicOp3::SRC_MASKS[s] {
|
||||
self.add_copy(
|
||||
dst,
|
||||
SrcType::Pred,
|
||||
lop.srcs[s],
|
||||
);
|
||||
} else if op.lut == !LogicOp3::SRC_MASKS[s]
|
||||
{
|
||||
self.add_copy(
|
||||
dst,
|
||||
SrcType::Pred,
|
||||
lop.srcs[s].bnot(),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Op::INeg(neg) => {
|
||||
let dst = neg.dst.as_ssa().unwrap();
|
||||
assert!(dst.comps() == 1);
|
||||
self.add_copy(dst[0], SrcType::I32, neg.src.ineg());
|
||||
}
|
||||
Op::Copy(copy) => {
|
||||
let dst = copy.dst.as_ssa().unwrap();
|
||||
assert!(dst.comps() == 1);
|
||||
self.add_copy(dst[0], SrcType::GPR, copy.src);
|
||||
}
|
||||
Op::ParCopy(pcopy) => {
|
||||
for (dst, src) in pcopy.dsts_srcs.iter() {
|
||||
let dst = dst.as_ssa().unwrap();
|
||||
assert!(dst.comps() == 1);
|
||||
self.add_copy(dst[0], SrcType::GPR, *src);
|
||||
}
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
self.try_add_instr(instr);
|
||||
|
||||
self.prop_to_pred(&mut instr.pred);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue