diff --git a/Source/Core/Core/PowerPC/Interpreter/Interpreter.h b/Source/Core/Core/PowerPC/Interpreter/Interpreter.h
index 0ce65ba149..a10251cc36 100644
--- a/Source/Core/Core/PowerPC/Interpreter/Interpreter.h
+++ b/Source/Core/Core/PowerPC/Interpreter/Interpreter.h
@@ -287,7 +287,6 @@ private:
   // 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);
diff --git a/Source/Core/Core/PowerPC/Interpreter/Interpreter_Integer.cpp b/Source/Core/Core/PowerPC/Interpreter/Interpreter_Integer.cpp
index 65b8547b98..e8731b8c2a 100644
--- a/Source/Core/Core/PowerPC/Interpreter/Interpreter_Integer.cpp
+++ b/Source/Core/Core/PowerPC/Interpreter/Interpreter_Integer.cpp
@@ -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)