mirror of
https://github.com/hrydgard/ppsspp.git
synced 2024-12-18 02:48:28 +00:00
irjit: Remove Vec4Scale/Vec4Dot aliasing in pass.
This commit is contained in:
parent
96c90c19c6
commit
2ca638868c
@ -1995,6 +1995,7 @@ bool ReduceVec4Flush(const IRWriter &in, IRWriter &out, const IROptions &opts) {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool skip = false;
|
||||||
switch (inst.op) {
|
switch (inst.op) {
|
||||||
case IROp::SetConstF:
|
case IROp::SetConstF:
|
||||||
if (isVec4[inst.dest & ~3] && findAvailTempVec4()) {
|
if (isVec4[inst.dest & ~3] && findAvailTempVec4()) {
|
||||||
@ -2077,30 +2078,54 @@ bool ReduceVec4Flush(const IRWriter &in, IRWriter &out, const IROptions &opts) {
|
|||||||
case IROp::FSub:
|
case IROp::FSub:
|
||||||
case IROp::FMul:
|
case IROp::FMul:
|
||||||
case IROp::FDiv:
|
case IROp::FDiv:
|
||||||
if (isVec4[inst.dest & ~3] && isVec4Dirty[inst.dest & ~3] && usedLaterAsVec4(inst.dest & ~3) && findAvailTempVec4()) {
|
if (isVec4[inst.dest & ~3] && isVec4Dirty[inst.dest & ~3] && usedLaterAsVec4(inst.dest & ~3)) {
|
||||||
u8 blendMask = 1 << (inst.dest & 3);
|
if (!overlapped(inst.dest & ~3, 4, inst.src1, 1, inst.src2, 1) && findAvailTempVec4()) {
|
||||||
out.Write(inst.op, temp, inst.src1, inst.src2);
|
u8 blendMask = 1 << (inst.dest & 3);
|
||||||
out.Write(IROp::Vec4Shuffle, temp, temp, 0);
|
out.Write(inst.op, temp, inst.src1, inst.src2);
|
||||||
out.Write(IROp::Vec4Blend, inst.dest & ~3, inst.dest & ~3, temp, blendMask);
|
out.Write(IROp::Vec4Shuffle, temp, temp, 0);
|
||||||
isVec4Dirty[inst.dest & ~3] = true;
|
out.Write(IROp::Vec4Blend, inst.dest & ~3, inst.dest & ~3, temp, blendMask);
|
||||||
continue;
|
updateVec4('F', inst.src1);
|
||||||
|
updateVec4('F', inst.src2);
|
||||||
|
isVec4Dirty[inst.dest & ~3] = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IROp::Vec4Dot:
|
||||||
|
if (overlapped(inst.dest, 1, inst.src1, 4, inst.src2, 4) && findAvailTempVec4()) {
|
||||||
|
out.Write(inst.op, temp, inst.src1, inst.src2, inst.constant);
|
||||||
|
out.Write(IROp::FMov, inst.dest, temp);
|
||||||
|
skip = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IROp::Vec4Scale:
|
||||||
|
if (overlapped(inst.src2, 1, inst.src1, 4, inst.dest, 4) && findAvailTempVec4()) {
|
||||||
|
out.Write(IROp::FMov, temp, inst.src2);
|
||||||
|
out.Write(inst.op, inst.dest, inst.src1, temp, inst.constant);
|
||||||
|
skip = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool downgrade = false;
|
bool downgrade = false;
|
||||||
if (updateVec4Dest(m->types[0], inst.dest, m->flags))
|
|
||||||
downgrade = true;
|
|
||||||
if (updateVec4(m->types[1], inst.src1))
|
if (updateVec4(m->types[1], inst.src1))
|
||||||
downgrade = true;
|
downgrade = true;
|
||||||
if (updateVec4(m->types[2], inst.src2))
|
if (updateVec4(m->types[2], inst.src2))
|
||||||
downgrade = true;
|
downgrade = true;
|
||||||
|
if (updateVec4Dest(m->types[0], inst.dest, m->flags))
|
||||||
|
downgrade = true;
|
||||||
|
|
||||||
if (downgrade) {
|
if (downgrade) {
|
||||||
//WARN_LOG(JIT, "Vec4 downgrade by: %s", m->name);
|
//WARN_LOG(JIT, "Vec4 downgrade by: %s", m->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
out.Write(inst);
|
if (!skip)
|
||||||
|
out.Write(inst);
|
||||||
}
|
}
|
||||||
return logBlocks;
|
return logBlocks;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user