Skip to content
Permalink
Browse files
Merge pull request #5916 from degasus/cmp
Interpreter: Fix cmpi.
  • Loading branch information
delroth committed Aug 11, 2017
2 parents 5767309 + b89e4b5 commit 0a8e1bd
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
@@ -287,7 +287,6 @@ class Interpreter : public CPUCoreBase
// flag helper
static void Helper_UpdateCR0(u32 value);
static void Helper_UpdateCR1();
static void Helper_UpdateCRx(int x, u32 value);

// address helper
static u32 Helper_Get_EA(const UGeckoInstruction inst);
@@ -11,17 +11,12 @@
#include "Core/PowerPC/PowerPC.h"

void Interpreter::Helper_UpdateCR0(u32 value)
{
Helper_UpdateCRx(0, value);
}

void Interpreter::Helper_UpdateCRx(int idx, u32 value)
{
s64 sign_extended = (s64)(s32)value;
u64 cr_val = (u64)sign_extended;
cr_val = (cr_val & ~(1ull << 61)) | ((u64)GetXER_SO() << 61);

PowerPC::ppcState.cr_val[idx] = cr_val;
PowerPC::ppcState.cr_val[0] = cr_val;
}

u32 Interpreter::Helper_Carry(u32 value1, u32 value2)
@@ -89,7 +84,21 @@ void Interpreter::andis_rc(UGeckoInstruction inst)

void Interpreter::cmpi(UGeckoInstruction inst)
{
Helper_UpdateCRx(inst.CRFD, rGPR[inst.RA] - inst.SIMM_16);
s32 a = rGPR[inst.RA];
s32 b = inst.SIMM_16;
int f;

if (a < b)
f = 0x8;
else if (a > b)
f = 0x4;
else
f = 0x2; // equals

if (GetXER_SO())
f |= 0x1;

SetCRField(inst.CRFD, f);
}

void Interpreter::cmpli(UGeckoInstruction inst)

0 comments on commit 0a8e1bd

Please sign in to comment.