CPU/PGXP: Eliminate extra copy in SLT/SLTU

This commit is contained in:
Stenzek 2024-08-20 18:35:49 +10:00
parent 17e8b610ea
commit 6e8a69c46f
No known key found for this signature in database

View file

@ -1093,16 +1093,15 @@ void CPU::PGXP::CPU_SLT(Instruction instr, u32 rsVal, u32 rtVal)
// Rd = Rs < Rt (signed) // Rd = Rs < Rt (signed)
PGXP_value& prsVal = ValidateAndGetRsValue(instr, rsVal); PGXP_value& prsVal = ValidateAndGetRsValue(instr, rsVal);
PGXP_value& prtVal = ValidateAndGetRtValue(instr, rtVal); PGXP_value& prtVal = ValidateAndGetRtValue(instr, rtVal);
PGXP_value& prdVal = GetRdValue(instr);
PGXP_value ret = prsVal; prdVal.x = (prsVal.GetValidY(rsVal) < prtVal.GetValidY(rtVal) ||
ret.x = (prsVal.GetValidY(rsVal) < prtVal.GetValidY(rtVal) || f16Unsign(prsVal.GetValidX(rsVal)) < f16Unsign(prtVal.GetValidX(rtVal))) ?
f16Unsign(prsVal.GetValidX(rsVal)) < f16Unsign(prtVal.GetValidX(rtVal))) ? 1.0f :
1.f : 0.0f;
0.f; prdVal.y = 0.0f;
ret.y = 0.f; prdVal.z = prsVal.z;
ret.flags |= VALID_TAINTED_Z | VALID_X | VALID_Y; prdVal.flags = prsVal.flags | VALID_TAINTED_Z | VALID_X | VALID_Y;
ret.value = BoolToUInt32(static_cast<s32>(rsVal) < static_cast<s32>(rtVal)); prdVal.value = BoolToUInt32(static_cast<s32>(rsVal) < static_cast<s32>(rtVal));
GetRdValue(instr) = ret;
} }
void CPU::PGXP::CPU_SLTU(Instruction instr, u32 rsVal, u32 rtVal) void CPU::PGXP::CPU_SLTU(Instruction instr, u32 rsVal, u32 rtVal)
@ -1112,16 +1111,15 @@ void CPU::PGXP::CPU_SLTU(Instruction instr, u32 rsVal, u32 rtVal)
// Rd = Rs < Rt (unsigned) // Rd = Rs < Rt (unsigned)
PGXP_value& prsVal = ValidateAndGetRsValue(instr, rsVal); PGXP_value& prsVal = ValidateAndGetRsValue(instr, rsVal);
PGXP_value& prtVal = ValidateAndGetRtValue(instr, rtVal); PGXP_value& prtVal = ValidateAndGetRtValue(instr, rtVal);
PGXP_value& prdVal = GetRdValue(instr);
PGXP_value ret = prsVal; prdVal.x = (f16Unsign(prsVal.GetValidY(rsVal)) < f16Unsign(prtVal.GetValidY(rtVal)) ||
ret.x = (f16Unsign(prsVal.GetValidY(rsVal)) < f16Unsign(prtVal.GetValidY(rtVal)) || f16Unsign(prsVal.GetValidX(rsVal)) < f16Unsign(prtVal.GetValidX(rtVal))) ?
f16Unsign(prsVal.GetValidX(rsVal)) < f16Unsign(prtVal.GetValidX(rtVal))) ? 1.0f :
1.f : 0.0f;
0.f; prdVal.y = 0.0f;
ret.y = 0.f; prdVal.z = prsVal.z;
ret.flags |= VALID_TAINTED_Z | VALID_X | VALID_Y; prdVal.flags = prsVal.flags | VALID_TAINTED_Z | VALID_X | VALID_Y;
ret.value = BoolToUInt32(rsVal < rtVal); prdVal.value = BoolToUInt32(rsVal < rtVal);
GetRdValue(instr) = ret;
} }
//////////////////////////////////// ////////////////////////////////////