Permalink
Browse files

Merge pull request #6878 from lioncash/type

PowerPC/Interpreter: Avoid sign conversion with utility functions
  • Loading branch information...
degasus committed May 17, 2018
2 parents 1424964 + 3f19aa6 commit 3e6a70685891d18d9b69b180f06b273058058dc2
@@ -37,9 +37,9 @@ void Interpreter::bcx(UGeckoInstruction inst)
const bool true_false = ((inst.BO >> 3) & 1);
const bool only_counter_check = ((inst.BO >> 4) & 1);
const bool only_condition_check = ((inst.BO >> 2) & 1);
int ctr_check = ((CTR != 0) ^ (inst.BO >> 1)) & 1;
bool counter = only_condition_check || ctr_check;
bool condition = only_counter_check || (PowerPC::GetCRBit(inst.BI) == u32(true_false));
const u32 ctr_check = ((CTR != 0) ^ (inst.BO >> 1)) & 1;
const bool counter = only_condition_check || ctr_check;
const bool condition = only_counter_check || (PowerPC::GetCRBit(inst.BI) == u32(true_false));
if (counter && condition)
{
@@ -78,7 +78,8 @@ void Interpreter::bcctrx(UGeckoInstruction inst)
DEBUG_ASSERT_MSG(POWERPC, inst.BO_2 & BO_DONT_DECREMENT_FLAG,
"bcctrx with decrement and test CTR option is invalid!");
int condition = ((inst.BO_2 >> 4) | (PowerPC::GetCRBit(inst.BI_2) == ((inst.BO_2 >> 3) & 1))) & 1;
const u32 condition =
((inst.BO_2 >> 4) | (PowerPC::GetCRBit(inst.BI_2) == ((inst.BO_2 >> 3) & 1))) & 1;
if (condition)
{
@@ -95,8 +96,9 @@ void Interpreter::bclrx(UGeckoInstruction inst)
if ((inst.BO_2 & BO_DONT_DECREMENT_FLAG) == 0)
CTR--;
int counter = ((inst.BO_2 >> 2) | ((CTR != 0) ^ (inst.BO_2 >> 1))) & 1;
int condition = ((inst.BO_2 >> 4) | (PowerPC::GetCRBit(inst.BI_2) == ((inst.BO_2 >> 3) & 1))) & 1;
const u32 counter = ((inst.BO_2 >> 2) | ((CTR != 0) ^ (inst.BO_2 >> 1))) & 1;
const u32 condition =
((inst.BO_2 >> 4) | (PowerPC::GetCRBit(inst.BI_2) == ((inst.BO_2 >> 3) & 1))) & 1;
if (counter & condition)
{
@@ -83,9 +83,9 @@ void Interpreter::andis_rc(UGeckoInstruction inst)
void Interpreter::cmpi(UGeckoInstruction inst)
{
s32 a = rGPR[inst.RA];
s32 b = inst.SIMM_16;
int f;
const s32 a = static_cast<s32>(rGPR[inst.RA]);
const s32 b = inst.SIMM_16;
u32 f;
if (a < b)
f = 0x8;
@@ -102,9 +102,9 @@ void Interpreter::cmpi(UGeckoInstruction inst)
void Interpreter::cmpli(UGeckoInstruction inst)
{
u32 a = rGPR[inst.RA];
u32 b = inst.UIMM;
int f;
const u32 a = rGPR[inst.RA];
const u32 b = inst.UIMM;
u32 f;
if (a < b)
f = 0x8;
@@ -213,40 +213,40 @@ void Interpreter::andcx(UGeckoInstruction inst)
void Interpreter::cmp(UGeckoInstruction inst)
{
s32 a = (s32)rGPR[inst.RA];
s32 b = (s32)rGPR[inst.RB];
int fTemp;
const s32 a = static_cast<s32>(rGPR[inst.RA]);
const s32 b = static_cast<s32>(rGPR[inst.RB]);
u32 temp;
if (a < b)
fTemp = 0x8;
temp = 0x8;
else if (a > b)
fTemp = 0x4;
temp = 0x4;
else // Equals
fTemp = 0x2;
temp = 0x2;
if (PowerPC::GetXER_SO())
fTemp |= 0x1;
temp |= 0x1;
PowerPC::SetCRField(inst.CRFD, fTemp);
PowerPC::SetCRField(inst.CRFD, temp);
}
void Interpreter::cmpl(UGeckoInstruction inst)
{
u32 a = rGPR[inst.RA];
u32 b = rGPR[inst.RB];
u32 fTemp;
const u32 a = rGPR[inst.RA];
const u32 b = rGPR[inst.RB];
u32 temp;
if (a < b)
fTemp = 0x8;
temp = 0x8;
else if (a > b)
fTemp = 0x4;
temp = 0x4;
else // Equals
fTemp = 0x2;
temp = 0x2;
if (PowerPC::GetXER_SO())
fTemp |= 0x1;
temp |= 0x1;
PowerPC::SetCRField(inst.CRFD, fTemp);
PowerPC::SetCRField(inst.CRFD, temp);
}
void Interpreter::cntlzwx(UGeckoInstruction inst)
@@ -447,7 +447,7 @@ void Interpreter::crxor(UGeckoInstruction inst)
void Interpreter::mcrf(UGeckoInstruction inst)
{
int cr_f = PowerPC::GetCRField(inst.CRFS);
const u32 cr_f = PowerPC::GetCRField(inst.CRFS);
PowerPC::SetCRField(inst.CRFD, cr_f);
}
@@ -47,7 +47,7 @@ static void InvalidateCacheThreadSafe(u64 userdata, s64 cyclesLate)
u32 CompactCR()
{
u32 new_cr = 0;
for (int i = 0; i < 8; i++)
for (u32 i = 0; i < 8; i++)
{
new_cr |= GetCRField(i) << (28 - i * 4);
}
@@ -56,7 +56,7 @@ u32 CompactCR()
void ExpandCR(u32 cr)
{
for (int i = 0; i < 8; i++)
for (u32 i = 0; i < 8; i++)
{
SetCRField(i, (cr >> (28 - i * 4)) & 0xF);
}
@@ -347,34 +347,34 @@ extern const std::array<u64, 16> m_crTable;
// Warning: these CR operations are fairly slow since they need to convert from
// PowerPC format (4 bit) to our internal 64 bit format. See the definition of
// ppcState.cr_val for more explanations.
inline void SetCRField(int cr_field, int value)
inline void SetCRField(u32 cr_field, u32 value)
{
PowerPC::ppcState.cr_val[cr_field] = m_crTable[value];
}
inline u32 GetCRField(int cr_field)
inline u32 GetCRField(u32 cr_field)
{
u64 cr_val = PowerPC::ppcState.cr_val[cr_field];
const u64 cr_val = PowerPC::ppcState.cr_val[cr_field];
u32 ppc_cr = 0;
// SO
ppc_cr |= !!(cr_val & (1ull << 61));
// EQ
ppc_cr |= ((cr_val & 0xFFFFFFFF) == 0) << 1;
// GT
ppc_cr |= ((s64)cr_val > 0) << 2;
ppc_cr |= (static_cast<s64>(cr_val) > 0) << 2;
// LT
ppc_cr |= !!(cr_val & (1ull << 62)) << 3;
return ppc_cr;
}
inline u32 GetCRBit(int bit)
inline u32 GetCRBit(u32 bit)
{
return (GetCRField(bit >> 2) >> (3 - (bit & 3))) & 1;
}
inline void SetCRBit(int bit, int value)
inline void SetCRBit(u32 bit, u32 value)
{
if (value & 1)
SetCRField(bit >> 2, GetCRField(bit >> 2) | (0x8 >> (bit & 3)));
@@ -393,12 +393,12 @@ inline u32 GetCR()
return PowerPC::CompactCR();
}
inline void SetCarry(int ca)
inline void SetCarry(u32 ca)
{
PowerPC::ppcState.xer_ca = ca;
}
inline int GetCarry()
inline u32 GetCarry()
{
return PowerPC::ppcState.xer_ca;
}

0 comments on commit 3e6a706

Please sign in to comment.