Implemented BRA CC conditional and FSET CC Setting
This commit is contained in:
parent
f7a1827aaa
commit
33afff1870
@ -3254,6 +3254,10 @@ private:
|
|||||||
regs.SetRegisterToInteger(instr.gpr0, false, 0, predicate + " ? 0xFFFFFFFF : 0", 1,
|
regs.SetRegisterToInteger(instr.gpr0, false, 0, predicate + " ? 0xFFFFFFFF : 0", 1,
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
|
if (instr.generates_cc.Value() != 0) {
|
||||||
|
regs.SetInternalFlag(InternalFlag::ZeroFlag, predicate);
|
||||||
|
LOG_WARNING(HW_GPU, "FSET Condition Code is incomplete");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OpCode::Type::IntegerSet: {
|
case OpCode::Type::IntegerSet: {
|
||||||
@ -3530,11 +3534,17 @@ private:
|
|||||||
"BRA with constant buffers are not implemented");
|
"BRA with constant buffers are not implemented");
|
||||||
|
|
||||||
const Tegra::Shader::ConditionCode cc = instr.flow_condition_code;
|
const Tegra::Shader::ConditionCode cc = instr.flow_condition_code;
|
||||||
UNIMPLEMENTED_IF_MSG(cc != Tegra::Shader::ConditionCode::T,
|
|
||||||
"BRA condition code used: {}", static_cast<u32>(cc));
|
|
||||||
|
|
||||||
const u32 target = offset + instr.bra.GetBranchTarget();
|
const u32 target = offset + instr.bra.GetBranchTarget();
|
||||||
|
if (cc != Tegra::Shader::ConditionCode::T) {
|
||||||
|
const std::string condition_code = regs.GetConditionCode(cc);
|
||||||
|
shader.AddLine("if (" + condition_code + "){");
|
||||||
|
shader.scope++;
|
||||||
shader.AddLine("{ jmp_to = " + std::to_string(target) + "u; break; }");
|
shader.AddLine("{ jmp_to = " + std::to_string(target) + "u; break; }");
|
||||||
|
shader.scope--;
|
||||||
|
shader.AddLine('}');
|
||||||
|
} else {
|
||||||
|
shader.AddLine("{ jmp_to = " + std::to_string(target) + "u; break; }");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OpCode::Id::IPA: {
|
case OpCode::Id::IPA: {
|
||||||
|
Loading…
Reference in New Issue
Block a user