mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-01-31 20:41:45 +01:00
rsx: Fix VP writes to CC with a MOV instruction
- When moving to CC, the operation has VEC flag disabled and also temp regs disabled. Looks to be the catch-all ELSE in the selection logic.
This commit is contained in:
parent
3cbccdd760
commit
243df38360
@ -84,6 +84,12 @@ std::string VertexProgramDecompiler::GetDST(bool isSca)
|
|||||||
const std::string reg_sel = (is_address_reg) ? "a" : "tmp";
|
const std::string reg_sel = (is_address_reg) ? "a" : "tmp";
|
||||||
ret += m_parr.AddParam(PF_PARAM_NONE, reg_type, reg_sel + std::to_string(tmp_index)) + mask;
|
ret += m_parr.AddParam(PF_PARAM_NONE, reg_type, reg_sel + std::to_string(tmp_index)) + mask;
|
||||||
}
|
}
|
||||||
|
else if (!is_result)
|
||||||
|
{
|
||||||
|
// Not writing to result register, but not writing to a tmp register either
|
||||||
|
// Write to CC instead (Far Cry 2)
|
||||||
|
ret = AddCondReg() + mask;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -159,20 +165,12 @@ void VertexProgramDecompiler::SetDST(bool is_sca, std::string value)
|
|||||||
{
|
{
|
||||||
if (d0.cond == 0) return;
|
if (d0.cond == 0) return;
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
lt = 0x1,
|
|
||||||
eq = 0x2,
|
|
||||||
gt = 0x4,
|
|
||||||
};
|
|
||||||
|
|
||||||
std::string mask = GetMask(is_sca);
|
|
||||||
|
|
||||||
if (is_sca)
|
if (is_sca)
|
||||||
{
|
{
|
||||||
value = getFloatTypeName(4) + "(" + value + ")";
|
value = getFloatTypeName(4) + "(" + value + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string mask = GetMask(is_sca);
|
||||||
value += mask;
|
value += mask;
|
||||||
|
|
||||||
if (d0.staturate)
|
if (d0.staturate)
|
||||||
@ -182,20 +180,21 @@ void VertexProgramDecompiler::SetDST(bool is_sca, std::string value)
|
|||||||
|
|
||||||
std::string dest;
|
std::string dest;
|
||||||
|
|
||||||
if (d0.cond_update_enable_0 || d0.cond_update_enable_1)
|
if (const auto tmp_reg = is_sca? d3.sca_dst_tmp: d0.dst_tmp;
|
||||||
{
|
d3.dst != 0x1f || tmp_reg != 0x3f)
|
||||||
dest = AddCondReg() + mask;
|
|
||||||
}
|
|
||||||
else if (d3.dst != 0x1f || (is_sca ? d3.sca_dst_tmp != 0x3f : d0.dst_tmp != 0x3f))
|
|
||||||
{
|
{
|
||||||
dest = GetDST(is_sca);
|
dest = GetDST(is_sca);
|
||||||
}
|
}
|
||||||
|
else if (d0.cond_update_enable_0 || d0.cond_update_enable_1)
|
||||||
//std::string code;
|
{
|
||||||
//if (d0.cond_test_enable)
|
dest = AddCondReg() + mask;
|
||||||
// code += "$ifcond ";
|
}
|
||||||
//code += dest + value;
|
else
|
||||||
//AddCode(code + ";");
|
{
|
||||||
|
// Broken instruction?
|
||||||
|
LOG_ERROR(RSX, "Operation has no output defined! (0x%x, 0x%x, 0x%x, 0x%x)", d0.HEX, d1.HEX, d2.HEX, d3.HEX);
|
||||||
|
dest = " //";
|
||||||
|
}
|
||||||
|
|
||||||
AddCodeCond(Format(dest), value);
|
AddCodeCond(Format(dest), value);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user