Merge pull request #5084 from MerryMage/Update_SR_Register

DSP/Jit: Explicitly specify scratch register for Update_SR_Register
This commit is contained in:
Markus Wick 2017-03-17 17:21:21 +01:00 committed by GitHub
commit b7ba391041
4 changed files with 23 additions and 21 deletions

View File

@ -221,7 +221,7 @@ private:
void r_ifcc(UDSPInstruction opc); void r_ifcc(UDSPInstruction opc);
void r_ret(UDSPInstruction opc); void r_ret(UDSPInstruction opc);
void Update_SR_Register(Gen::X64Reg val = Gen::EAX); void Update_SR_Register(Gen::X64Reg val = Gen::EAX, Gen::X64Reg scratch = Gen::EDX);
void get_long_prod(Gen::X64Reg long_prod = Gen::RAX); void get_long_prod(Gen::X64Reg long_prod = Gen::RAX);
void get_long_prod_round_prodl(Gen::X64Reg long_prod = Gen::RAX); void get_long_prod_round_prodl(Gen::X64Reg long_prod = Gen::RAX);
@ -243,7 +243,7 @@ private:
void HandleLoop(); void HandleLoop();
// CC helpers // CC helpers
void Update_SR_Register64(Gen::X64Reg val = Gen::EAX); void Update_SR_Register64(Gen::X64Reg val = Gen::EAX, Gen::X64Reg scratch = Gen::EDX);
void Update_SR_Register64_Carry(Gen::X64Reg val, Gen::X64Reg carry_ovfl, bool carry_eq = false); void Update_SR_Register64_Carry(Gen::X64Reg val, Gen::X64Reg carry_ovfl, bool carry_eq = false);
void Update_SR_Register16(Gen::X64Reg val = Gen::EAX); void Update_SR_Register16(Gen::X64Reg val = Gen::EAX);
void Update_SR_Register16_OverS32(Gen::X64Reg val = Gen::EAX); void Update_SR_Register16_OverS32(Gen::X64Reg val = Gen::EAX);

View File

@ -1382,7 +1382,7 @@ void DSPEmitter::lsrn(const UDSPInstruction opc)
// Update_SR_Register64(dsp_get_long_acc(0)); // Update_SR_Register64(dsp_get_long_acc(0));
if (FlagsNeeded()) if (FlagsNeeded())
{ {
Update_SR_Register64(RDX); Update_SR_Register64(RDX, RCX);
} }
} }
@ -1439,7 +1439,7 @@ void DSPEmitter::asrn(const UDSPInstruction opc)
SetJumpTarget(zero); SetJumpTarget(zero);
if (FlagsNeeded()) if (FlagsNeeded())
{ {
Update_SR_Register64(RDX); Update_SR_Register64(RDX, RCX);
} }
} }
@ -1502,7 +1502,7 @@ void DSPEmitter::lsrnrx(const UDSPInstruction opc)
SetJumpTarget(zero); SetJumpTarget(zero);
if (FlagsNeeded()) if (FlagsNeeded())
{ {
Update_SR_Register64(RDX); Update_SR_Register64(RDX, RCX);
} }
} }
@ -1559,7 +1559,7 @@ void DSPEmitter::asrnrx(const UDSPInstruction opc)
// Update_SR_Register64(dsp_get_long_acc(dreg)); // Update_SR_Register64(dsp_get_long_acc(dreg));
if (FlagsNeeded()) if (FlagsNeeded())
{ {
Update_SR_Register64(RDX); Update_SR_Register64(RDX, RCX);
} }
} }
@ -1617,7 +1617,7 @@ void DSPEmitter::lsrnr(const UDSPInstruction opc)
// Update_SR_Register64(dsp_get_long_acc(dreg)); // Update_SR_Register64(dsp_get_long_acc(dreg));
if (FlagsNeeded()) if (FlagsNeeded())
{ {
Update_SR_Register64(RDX); Update_SR_Register64(RDX, RCX);
} }
} }
@ -1672,7 +1672,7 @@ void DSPEmitter::asrnr(const UDSPInstruction opc)
// Update_SR_Register64(dsp_get_long_acc(dreg)); // Update_SR_Register64(dsp_get_long_acc(dreg));
if (FlagsNeeded()) if (FlagsNeeded())
{ {
Update_SR_Register64(RDX); Update_SR_Register64(RDX, RCX);
} }
} }

View File

@ -15,10 +15,12 @@ namespace JIT
{ {
namespace x86 namespace x86
{ {
// In: RAX: s64 _Value // In: val: s64 _Value
// Clobbers RDX // Clobbers scratch
void DSPEmitter::Update_SR_Register(Gen::X64Reg val) void DSPEmitter::Update_SR_Register(Gen::X64Reg val, Gen::X64Reg scratch)
{ {
_assert_(val != scratch);
const OpArg sr_reg = m_gpr.GetReg(DSP_REG_SR); const OpArg sr_reg = m_gpr.GetReg(DSP_REG_SR);
// // 0x04 // // 0x04
// if (_Value == 0) g_dsp.r[DSP_REG_SR] |= SR_ARITH_ZERO; // if (_Value == 0) g_dsp.r[DSP_REG_SR] |= SR_ARITH_ZERO;
@ -36,18 +38,18 @@ void DSPEmitter::Update_SR_Register(Gen::X64Reg val)
// // 0x10 // // 0x10
// if (_Value != (s32)_Value) g_dsp.r[DSP_REG_SR] |= SR_OVER_S32; // if (_Value != (s32)_Value) g_dsp.r[DSP_REG_SR] |= SR_OVER_S32;
MOVSX(64, 32, RDX, R(val)); MOVSX(64, 32, scratch, R(val));
CMP(64, R(RDX), R(val)); CMP(64, R(scratch), R(val));
FixupBranch noOverS32 = J_CC(CC_E); FixupBranch noOverS32 = J_CC(CC_E);
OR(16, sr_reg, Imm16(SR_OVER_S32)); OR(16, sr_reg, Imm16(SR_OVER_S32));
SetJumpTarget(noOverS32); SetJumpTarget(noOverS32);
// // 0x20 - Checks if top bits of m are equal // // 0x20 - Checks if top bits of m are equal
// if (((_Value & 0xc0000000) == 0) || ((_Value & 0xc0000000) == 0xc0000000)) // if (((_Value & 0xc0000000) == 0) || ((_Value & 0xc0000000) == 0xc0000000))
MOV(32, R(RDX), Imm32(0xc0000000)); MOV(32, R(scratch), Imm32(0xc0000000));
AND(32, R(val), R(RDX)); AND(32, R(val), R(scratch));
FixupBranch zeroC = J_CC(CC_Z); FixupBranch zeroC = J_CC(CC_Z);
CMP(32, R(val), R(RDX)); CMP(32, R(val), R(scratch));
FixupBranch cC = J_CC(CC_NE); FixupBranch cC = J_CC(CC_NE);
SetJumpTarget(zeroC); SetJumpTarget(zeroC);
// g_dsp.r[DSP_REG_SR] |= SR_TOP2BITS; // g_dsp.r[DSP_REG_SR] |= SR_TOP2BITS;
@ -57,15 +59,15 @@ void DSPEmitter::Update_SR_Register(Gen::X64Reg val)
m_gpr.PutReg(DSP_REG_SR); m_gpr.PutReg(DSP_REG_SR);
} }
// In: RAX: s64 _Value // In: val: s64 _Value
// Clobbers RDX // Clobbers scratch
void DSPEmitter::Update_SR_Register64(Gen::X64Reg val) void DSPEmitter::Update_SR_Register64(Gen::X64Reg val, Gen::X64Reg scratch)
{ {
// g_dsp.r[DSP_REG_SR] &= ~SR_CMP_MASK; // g_dsp.r[DSP_REG_SR] &= ~SR_CMP_MASK;
const OpArg sr_reg = m_gpr.GetReg(DSP_REG_SR); const OpArg sr_reg = m_gpr.GetReg(DSP_REG_SR);
AND(16, sr_reg, Imm16(~SR_CMP_MASK)); AND(16, sr_reg, Imm16(~SR_CMP_MASK));
m_gpr.PutReg(DSP_REG_SR); m_gpr.PutReg(DSP_REG_SR);
Update_SR_Register(val); Update_SR_Register(val, scratch);
} }
// In: (val): s64 _Value // In: (val): s64 _Value

View File

@ -393,7 +393,7 @@ void DSPEmitter::mulmvz(const UDSPInstruction opc)
// Update_SR_Register64(dsp_get_long_acc(rreg)); // Update_SR_Register64(dsp_get_long_acc(rreg));
if (FlagsNeeded()) if (FlagsNeeded())
{ {
Update_SR_Register64(RDX); Update_SR_Register64(RDX, RCX);
} }
} }