about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-12-22 12:38:01 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-12-22 12:38:01 +0100
commita34b63b80d05baa8bc9faee7e1a1b97dcb46a8a2 (patch)
tree0bf028c86c7f935312b4c2f3e4c3e35d78186861
parent5b335f0f2658ae0afda037de2120bc5dc6aa4d48 (diff)
downloadbox64-a34b63b80d05baa8bc9faee7e1a1b97dcb46a8a2.tar.gz
box64-a34b63b80d05baa8bc9faee7e1a1b97dcb46a8a2.zip
[ARM64_DYNAREC] Partial rollback of previous commit, it was not good
-rw-r--r--src/dynarec/arm64/dynarec_arm64_emit_math.c27
-rw-r--r--src/dynarec/arm64/dynarec_arm64_emit_tests.c18
2 files changed, 23 insertions, 22 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_emit_math.c b/src/dynarec/arm64/dynarec_arm64_emit_math.c
index f71f5537..6449de5c 100644
--- a/src/dynarec/arm64/dynarec_arm64_emit_math.c
+++ b/src/dynarec/arm64/dynarec_arm64_emit_math.c
@@ -362,7 +362,7 @@ void emit_sub8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
     } else IFX(X_ALL) {
         SET_DFNONE(s3);
     }
-    IFX(X_AF|X_OF) {
+    IFX(X_AF|X_OF|X_CF) {
         MVNw_REG(s3, s1);
         ORRw_REG(s3, s3, s2);    // s3 = ~op1 | op2
         BICw_REG(s4, s2, s1);    // s4 = ~op1 & op2
@@ -372,12 +372,13 @@ void emit_sub8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
     IFX(X_PEND) {
         STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
     }
-    IFX(X_CF) {
-        BFXILw(xFlags, s1, 8, 1);
-    }
-    IFX(X_AF|X_OF) {
+    IFX(X_AF|X_OF|X_CF) {
         ANDw_REG(s3, s3, s1);   // s3 = (~op1 | op2) & res
         ORRw_REG(s3, s3, s4);   // s3 = (~op1 & op2) | ((~op1 | op2) & res)
+        IFX(X_CF) {
+            LSRw(s4, s3, 7);
+            BFIw(xFlags, s4, F_CF, 1);    // CF : bc & 0x80
+        }
         IFX(X_AF) {
             LSRw(s4, s3, 3);
             BFIw(xFlags, s4, F_AF, 1);    // AF: bc & 0x08
@@ -408,7 +409,7 @@ void emit_sub8c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4, in
     } else IFX(X_ALL) {
         SET_DFNONE(s3);
     }
-    IFX(X_AF|X_OF) {
+    IFX(X_AF|X_OF|X_CF) {
         MVNw_REG(s3, s1);
         ORRw_REG(s3, s3, s5);    // s3 = ~op1 | op2
         BICw_REG(s4, s5, s1);    // s4 = ~op1 & op2
@@ -421,10 +422,7 @@ void emit_sub8c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4, in
     IFX(X_PEND) {
         STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
     }
-    IFX(X_CF) {
-        BFXILw(xFlags, s1, 8, 1);
-    }
-    IFX(X_AF|X_OF) {
+    IFX(X_AF|X_OF|X_CF) {
         ANDw_REG(s3, s3, s1);   // s3 = (~op1 | op2) & res
         ORRw_REG(s3, s3, s4);   // s3 = (~op1 & op2) | ((~op1 | op2) & res)
         IFX(X_CF) {
@@ -576,12 +574,13 @@ void emit_sub16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
     IFX(X_PEND) {
         STRH_U12(s1, xEmu, offsetof(x64emu_t, res));
     }
-    IFX(X_CF) {
-        BFXILw(xFlags, s1, 16, 1);
-    }
-    IFX(X_AF|X_OF) {
+    IFX(X_AF|X_OF|X_CF) {
         ANDw_REG(s3, s3, s1);   // s3 = (~op1 | op2) & res
         ORRw_REG(s3, s3, s4);   // s3 = (~op1 & op2) | ((~op1 | op2) & res)
+        IFX(X_CF) {
+            LSRw(s4, s3, 15);
+            BFIw(xFlags, s4, F_CF, 1);    // CF : bc & 0x8000
+        }
         IFX(X_AF) {
             LSRw(s4, s3, 3);
             BFIw(xFlags, s4, F_AF, 1);    // AF: bc & 0x08
diff --git a/src/dynarec/arm64/dynarec_arm64_emit_tests.c b/src/dynarec/arm64/dynarec_arm64_emit_tests.c
index fcd23e2f..5c6c602f 100644
--- a/src/dynarec/arm64/dynarec_arm64_emit_tests.c
+++ b/src/dynarec/arm64/dynarec_arm64_emit_tests.c
@@ -116,16 +116,17 @@ void emit_cmp16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, i
         STRH_U12(s5, xEmu, offsetof(x64emu_t, res));
     }
     COMP_ZFSF(s5, 16)
-    IFX(X_CF) {
-        BFXILw(xFlags, s5, 16, 1);
-    }
     // bc = (res & (~d | s)) | (~d & s)
-    IFX(X_AF|X_OF) {
+    IFX(X_CF|X_AF|X_OF) {
         MVNw_REG(s4, s1);        // s4 = ~d
         ORRw_REG(s4, s4, s2);    // s4 = ~d | s
         ANDw_REG(s4, s4, s5);    // s4 = res & (~d | s)
         BICw_REG(s3, s2, s1);    // s3 = s & ~d
         ORRw_REG(s3, s4, s3);    // s3 = (res & (~d | s)) | (s & ~d)
+        IFX(X_CF) {
+            LSRw(s4, s3, 15);
+            BFIw(xFlags, s4, F_CF, 1);    // CF : bc & 0x8000
+        }
         IFX(X_AF) {
             LSRw(s4, s3, 3);
             BFIw(xFlags, s4, F_AF, 1);    // AF: bc & 0x08
@@ -179,15 +180,16 @@ void emit_cmp8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, in
         STRB_U12(s5, xEmu, offsetof(x64emu_t, res));
     }
     COMP_ZFSF(s5, 8)
-    IFX(X_CF) {
-        BFXILw(xFlags, s5, 8, 1);
-    }
     // bc = (res & (~d | s)) | (~d & s)
-    IFX(X_AF|X_OF) {
+    IFX(X_CF|X_AF|X_OF) {
         ORNw_REG(s4, s2, s1);   // s4 = ~d | s
         ANDw_REG(s4, s4, s5);   // s4 = res & (~d | s)
         BICw_REG(s3, s2, s1);   // s3 = s & ~d
         ORRw_REG(s3, s4, s3);   // s3 = (res & (~d | s)) | (s & ~d)
+        IFX(X_CF) {
+            LSRw(s4, s3, 7);
+            BFIw(xFlags, s4, F_CF, 1);    // CF : bc & 0x80
+        }
         IFX(X_AF) {
             LSRw(s4, s3, 3);
             BFIw(xFlags, s4, F_AF, 1);    // AF: bc & 0x08