diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index 49c2406c8c..f913b0cf69 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -966,11 +966,12 @@ void JitArm64::subfex(UGeckoInstruction inst)
   JITDISABLE(bJITIntegerOff);
   FALLBACK_IF(inst.OE);
 
+  bool mex = inst.SUBOP10 & 32;
   int a = inst.RA, b = inst.RB, d = inst.RD;
 
-  if (gpr.IsImm(a) && gpr.IsImm(b))
+  if (gpr.IsImm(a) && (mex || gpr.IsImm(b)))
   {
-    u32 i = gpr.GetImm(a), j = gpr.GetImm(b);
+    u32 i = gpr.GetImm(a), j = mex ? -1 : gpr.GetImm(b);
 
     gpr.BindToRegister(d, false);
 
@@ -1023,18 +1024,23 @@ void JitArm64::subfex(UGeckoInstruction inst)
   else
   {
     gpr.BindToRegister(d, d == a || d == b);
+    ARM64Reg RB = mex ? gpr.GetReg() : gpr.R(b);
+    if (mex)
+      MOVI2R(RB, -1);
 
     if (js.carryFlag == CarryFlag::ConstantTrue)
     {
-      CARRY_IF_NEEDED(SUB, SUBS, gpr.R(d), gpr.R(b), gpr.R(a));
+      CARRY_IF_NEEDED(SUB, SUBS, gpr.R(d), RB, gpr.R(a));
     }
     else
     {
       LoadCarry();
-      CARRY_IF_NEEDED(SBC, SBCS, gpr.R(d), gpr.R(b), gpr.R(a));
+      CARRY_IF_NEEDED(SBC, SBCS, gpr.R(d), RB, gpr.R(a));
     }
 
     ComputeCarry();
+    if (mex)
+      gpr.Unlock(RB);
   }
 
   if (inst.Rc)
@@ -1154,11 +1160,12 @@ void JitArm64::addex(UGeckoInstruction inst)
   JITDISABLE(bJITIntegerOff);
   FALLBACK_IF(inst.OE);
 
+  bool mex = inst.SUBOP10 & 32;
   int a = inst.RA, b = inst.RB, d = inst.RD;
 
-  if (gpr.IsImm(a) && gpr.IsImm(b))
+  if (gpr.IsImm(a) && (mex || gpr.IsImm(b)))
   {
-    u32 i = gpr.GetImm(a), j = gpr.GetImm(b);
+    u32 i = gpr.GetImm(a), j = mex ? -1 : gpr.GetImm(b);
 
     gpr.BindToRegister(d, false);
 
@@ -1211,18 +1218,23 @@ void JitArm64::addex(UGeckoInstruction inst)
   else
   {
     gpr.BindToRegister(d, d == a || d == b);
+    ARM64Reg RB = mex ? gpr.GetReg() : gpr.R(b);
+    if (mex)
+      MOVI2R(RB, -1);
 
     if (js.carryFlag == CarryFlag::ConstantFalse)
     {
-      CARRY_IF_NEEDED(ADD, ADDS, gpr.R(d), gpr.R(a), gpr.R(b));
+      CARRY_IF_NEEDED(ADD, ADDS, gpr.R(d), gpr.R(a), RB);
     }
     else
     {
       LoadCarry();
-      CARRY_IF_NEEDED(ADC, ADCS, gpr.R(d), gpr.R(a), gpr.R(b));
+      CARRY_IF_NEEDED(ADC, ADCS, gpr.R(d), gpr.R(a), RB);
     }
 
     ComputeCarry();
+    if (mex)
+      gpr.Unlock(RB);
   }
 
   if (inst.Rc)
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp
index da8fb78682..0a50f20b4d 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp
@@ -150,36 +150,36 @@ constexpr std::array<GekkoOPTemplate, 13> table19{{
 }};
 
 constexpr std::array<GekkoOPTemplate, 107> table31{{
-    {266, &JitArm64::addx},                   // addx
-    {778, &JitArm64::addx},                   // addox
-    {10, &JitArm64::addcx},                   // addcx
-    {522, &JitArm64::addcx},                  // addcox
-    {138, &JitArm64::addex},                  // addex
-    {650, &JitArm64::addex},                  // addeox
-    {234, &JitArm64::FallBackToInterpreter},  // addmex
-    {746, &JitArm64::FallBackToInterpreter},  // addmeox
-    {202, &JitArm64::addzex},                 // addzex
-    {714, &JitArm64::addzex},                 // addzeox
-    {491, &JitArm64::divwx},                  // divwx
-    {1003, &JitArm64::divwx},                 // divwox
-    {459, &JitArm64::divwux},                 // divwux
-    {971, &JitArm64::divwux},                 // divwuox
-    {75, &JitArm64::mulhwx},                  // mulhwx
-    {11, &JitArm64::mulhwux},                 // mulhwux
-    {235, &JitArm64::mullwx},                 // mullwx
-    {747, &JitArm64::mullwx},                 // mullwox
-    {104, &JitArm64::negx},                   // negx
-    {616, &JitArm64::negx},                   // negox
-    {40, &JitArm64::subfx},                   // subfx
-    {552, &JitArm64::subfx},                  // subfox
-    {8, &JitArm64::subfcx},                   // subfcx
-    {520, &JitArm64::subfcx},                 // subfcox
-    {136, &JitArm64::subfex},                 // subfex
-    {648, &JitArm64::subfex},                 // subfeox
-    {232, &JitArm64::FallBackToInterpreter},  // subfmex
-    {744, &JitArm64::FallBackToInterpreter},  // subfmeox
-    {200, &JitArm64::subfzex},                // subfzex
-    {712, &JitArm64::subfzex},                // subfzeox
+    {266, &JitArm64::addx},     // addx
+    {778, &JitArm64::addx},     // addox
+    {10, &JitArm64::addcx},     // addcx
+    {522, &JitArm64::addcx},    // addcox
+    {138, &JitArm64::addex},    // addex
+    {650, &JitArm64::addex},    // addeox
+    {234, &JitArm64::addex},    // addmex
+    {746, &JitArm64::addex},    // addmeox
+    {202, &JitArm64::addzex},   // addzex
+    {714, &JitArm64::addzex},   // addzeox
+    {491, &JitArm64::divwx},    // divwx
+    {1003, &JitArm64::divwx},   // divwox
+    {459, &JitArm64::divwux},   // divwux
+    {971, &JitArm64::divwux},   // divwuox
+    {75, &JitArm64::mulhwx},    // mulhwx
+    {11, &JitArm64::mulhwux},   // mulhwux
+    {235, &JitArm64::mullwx},   // mullwx
+    {747, &JitArm64::mullwx},   // mullwox
+    {104, &JitArm64::negx},     // negx
+    {616, &JitArm64::negx},     // negox
+    {40, &JitArm64::subfx},     // subfx
+    {552, &JitArm64::subfx},    // subfox
+    {8, &JitArm64::subfcx},     // subfcx
+    {520, &JitArm64::subfcx},   // subfcox
+    {136, &JitArm64::subfex},   // subfex
+    {648, &JitArm64::subfex},   // subfeox
+    {232, &JitArm64::subfex},   // subfmex
+    {744, &JitArm64::subfex},   // subfmeox
+    {200, &JitArm64::subfzex},  // subfzex
+    {712, &JitArm64::subfzex},  // subfzeox
 
     {28, &JitArm64::boolX},    // andx
     {60, &JitArm64::boolX},    // andcx