From 5881133cf59c9b953882268b7bc60f7b0a785d09 Mon Sep 17 00:00:00 2001
From: Stenzek <stenzek@gmail.com>
Date: Wed, 10 Jul 2024 19:10:56 +1000
Subject: [PATCH] CPU/PGXP: Set valid on bitwise ops from lowprec

---
 src/core/cpu_pgxp.cpp | 55 +++++++------------------------------------
 1 file changed, 8 insertions(+), 47 deletions(-)

diff --git a/src/core/cpu_pgxp.cpp b/src/core/cpu_pgxp.cpp
index 15c02274a..45ff4c7cf 100644
--- a/src/core/cpu_pgxp.cpp
+++ b/src/core/cpu_pgxp.cpp
@@ -1035,8 +1035,6 @@ void CPU::PGXP::CPU_SUB(u32 instr, u32 rsVal, u32 rtVal)
 
 ALWAYS_INLINE_RELEASE void CPU::PGXP::CPU_BITWISE(u32 instr, u32 rdVal, u32 rsVal, u32 rtVal)
 {
-  LOG_VALUES_C2(rs(instr), rsVal, rt(instr), rtVal);
-
   // Rd = Rs & Rt
   PGXP_value& prsVal = g_state.pgxp_gpr[rs(instr)];
   PGXP_value& prtVal = g_state.pgxp_gpr[rt(instr)];
@@ -1049,64 +1047,27 @@ ALWAYS_INLINE_RELEASE void CPU::PGXP::CPU_BITWISE(u32 instr, u32 rdVal, u32 rsVa
   valt.d = rtVal;
 
   PGXP_value ret;
-  ret.flags = VALID_XY | VALID_TAINTED_Z;
+  ret.flags = ((prsVal.flags | prtVal.flags) & VALID_XY) ? (VALID_XY | VALID_TAINTED_Z) : 0;
 
   if (vald.w.l == 0)
-  {
     ret.x = 0.f;
-  }
   else if (vald.w.l == vals.w.l)
-  {
-    ret.x = prsVal.x;
-    ret.SetValid(COMP_X, prsVal.HasValid(COMP_X));
-  }
+    ret.x = prsVal.GetValidX(rsVal);
   else if (vald.w.l == valt.w.l)
-  {
-    ret.x = prtVal.x;
-    ret.SetValid(COMP_X, prtVal.HasValid(COMP_X));
-  }
+    ret.x = prtVal.GetValidX(rtVal);
   else
-  {
-    ret.x = (float)vald.sw.l;
-    ret.SetValid(COMP_X);
-  }
+    ret.x = static_cast<float>(vald.sw.l);
 
   if (vald.w.h == 0)
-  {
     ret.y = 0.f;
-  }
   else if (vald.w.h == vals.w.h)
-  {
-    ret.y = prsVal.y;
-    ret.SetValid(COMP_Y, prsVal.HasValid(COMP_Y));
-  }
+    ret.y = prsVal.GetValidY(rsVal);
   else if (vald.w.h == valt.w.h)
-  {
-    ret.y = prtVal.y;
-    ret.SetValid(COMP_Y, prtVal.HasValid(COMP_Y));
-  }
+    ret.y = prtVal.GetValidY(rtVal);
   else
-  {
-    ret.y = (float)vald.sw.h;
-    ret.SetValid(COMP_Y);
-  }
+    ret.y = static_cast<float>(vald.sw.h);
 
-  // Get a valid W
-  if (prsVal.HasValid(COMP_Z))
-  {
-    ret.z = prsVal.z;
-    ret.SetValid(COMP_Z);
-  }
-  else if (prtVal.HasValid(COMP_Z))
-  {
-    ret.z = prtVal.z;
-    ret.SetValid(COMP_Z);
-  }
-  else
-  {
-    ret.z = 0.0f;
-    ret.SetValid(COMP_Z, false);
-  }
+  SelectZ(ret, prsVal, prtVal);
 
   ret.value = rdVal;
   g_state.pgxp_gpr[rd(instr)] = ret;