mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-30 01:25:51 +00:00
CPU/Recompiler: Fix a few incorrect calls to PGXP
Fixes PGXP not being effective in Grandia.
This commit is contained in:
parent
98f0e5908b
commit
2343696995
|
@ -1874,7 +1874,10 @@ bool CodeGenerator::Compile_Multiply(const CodeBlockInstruction& cbi)
|
|||
Value rs = m_register_cache.ReadGuestRegister(cbi.instruction.r.rs);
|
||||
Value rt = m_register_cache.ReadGuestRegister(cbi.instruction.r.rt);
|
||||
if (g_settings.UsingPGXPCPUMode())
|
||||
EmitFunctionCall(nullptr, signed_multiply ? &PGXP::CPU_MULT : &PGXP::CPU_MULTU, rs, rt);
|
||||
{
|
||||
EmitFunctionCall(nullptr, signed_multiply ? &PGXP::CPU_MULT : &PGXP::CPU_MULTU,
|
||||
Value::FromConstantU32(cbi.instruction.bits), rs, rt);
|
||||
}
|
||||
|
||||
std::pair<Value, Value> result = MulValues(rs, rt, signed_multiply);
|
||||
rs.ReleaseAndClear();
|
||||
|
@ -1937,7 +1940,7 @@ bool CodeGenerator::Compile_Divide(const CodeBlockInstruction& cbi)
|
|||
Value denom = m_register_cache.ReadGuestRegister(cbi.instruction.r.rt);
|
||||
|
||||
if (g_settings.UsingPGXPCPUMode())
|
||||
EmitFunctionCall(nullptr, &PGXP::CPU_DIV, num, denom);
|
||||
EmitFunctionCall(nullptr, &PGXP::CPU_DIV, Value::FromConstantU32(cbi.instruction.bits), num, denom);
|
||||
|
||||
if (num.IsConstant() && denom.IsConstant())
|
||||
{
|
||||
|
@ -1998,7 +2001,7 @@ bool CodeGenerator::Compile_SignedDivide(const CodeBlockInstruction& cbi)
|
|||
Value denom = m_register_cache.ReadGuestRegister(cbi.instruction.r.rt);
|
||||
|
||||
if (g_settings.UsingPGXPCPUMode())
|
||||
EmitFunctionCall(nullptr, &PGXP::CPU_DIVU, num, denom);
|
||||
EmitFunctionCall(nullptr, &PGXP::CPU_DIV, Value::FromConstantU32(cbi.instruction.bits), num, denom);
|
||||
|
||||
if (num.IsConstant() && denom.IsConstant())
|
||||
{
|
||||
|
|
|
@ -185,7 +185,7 @@ ALWAYS_INLINE_RELEASE void ValidateAndCopyMem(PGXP_value* dest, u32 addr, u32 va
|
|||
*dest = PGXP_value_invalid;
|
||||
}
|
||||
|
||||
static void ValidateAndCopyMem16(PGXP_value* dest, u32 addr, u32 value, int sign)
|
||||
ALWAYS_INLINE_RELEASE static void ValidateAndCopyMem16(PGXP_value* dest, u32 addr, u32 value, int sign)
|
||||
{
|
||||
u32 validMask = 0;
|
||||
psx_value val, mask;
|
||||
|
@ -236,7 +236,7 @@ ALWAYS_INLINE_RELEASE void WriteMem(const PGXP_value* value, u32 addr)
|
|||
*pMem = *value;
|
||||
}
|
||||
|
||||
static void WriteMem16(PGXP_value* src, u32 addr)
|
||||
ALWAYS_INLINE_RELEASE static void WriteMem16(const PGXP_value* src, u32 addr)
|
||||
{
|
||||
PGXP_value* dest = GetPtr(addr);
|
||||
psx_value* pVal = NULL;
|
||||
|
@ -599,16 +599,19 @@ void CPU_SB(u32 instr, u8 rtVal, u32 addr)
|
|||
|
||||
void CPU_SH(u32 instr, u16 rtVal, u32 addr)
|
||||
{
|
||||
PGXP_value* val = &CPU_reg[rt(instr)];
|
||||
|
||||
// validate and copy half value
|
||||
MaskValidate(&CPU_reg[rt(instr)], rtVal, 0xFFFF, VALID_0);
|
||||
WriteMem16(&CPU_reg[rt(instr)], addr);
|
||||
MaskValidate(val, rtVal, 0xFFFF, VALID_0);
|
||||
WriteMem16(val, addr);
|
||||
}
|
||||
|
||||
void CPU_SW(u32 instr, u32 rtVal, u32 addr)
|
||||
{
|
||||
// Mem[Rs + Im] = Rt
|
||||
Validate(&CPU_reg[rt(instr)], rtVal);
|
||||
WriteMem(&CPU_reg[rt(instr)], addr);
|
||||
PGXP_value* val = &CPU_reg[rt(instr)];
|
||||
Validate(val, rtVal);
|
||||
WriteMem(val, addr);
|
||||
}
|
||||
|
||||
void CPU_MOVE(u32 rd_and_rs, u32 rsVal)
|
||||
|
|
Loading…
Reference in a new issue