about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <seebastien.chev@gmail.com>2023-10-18 18:14:41 +0200
committerptitSeb <seebastien.chev@gmail.com>2023-10-18 18:14:41 +0200
commit10b4782efbf8dae9ced90722078b45e4c83638a0 (patch)
tree39c70d09953e36f1e4fc636b6ca41b58be1d6298 /src
parentf82d8d647a5470dc7e77e9f6bd161c963411e12c (diff)
downloadbox64-10b4782efbf8dae9ced90722078b45e4c83638a0.tar.gz
box64-10b4782efbf8dae9ced90722078b45e4c83638a0.zip
[ARM64_DYNAREC] Added a use of FLAGM extension in add8 emitter
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_emit_math.c70
1 files changed, 52 insertions, 18 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_emit_math.c b/src/dynarec/arm64/dynarec_arm64_emit_math.c
index 526f8b72..d23dde0f 100644
--- a/src/dynarec/arm64/dynarec_arm64_emit_math.c
+++ b/src/dynarec/arm64/dynarec_arm64_emit_math.c
@@ -278,22 +278,38 @@ void emit_add8(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) {
-        ORRw_REG(s3, s1, s2);    // s3 = op1 | op2
-        ANDw_REG(s4, s1, s2);    // s4 = op1 & op2
+    if(arm64_flagm) {
+        IFX(X_AF) {
+            ORRw_REG(s3, s1, s2);    // s3 = op1 | op2
+            ANDw_REG(s4, s1, s2);    // s4 = op1 & op2
+        }
+    } else {
+        IFX(X_AF | X_OF) {
+            ORRw_REG(s3, s1, s2);    // s3 = op1 | op2
+            ANDw_REG(s4, s1, s2);    // s4 = op1 & op2
+        }
     }
     ADDw_REG(s1, s1, s2);
-    IFX(X_AF|X_OF) {
-        BICw_REG(s3, s3, s1);   // s3 = (op1 | op2) & ~ res
-        ORRw_REG(s3, s3, s4);   // s3 = (op1 & op2) | ((op1 | op2) & ~ res)
+    if(arm64_flagm) {
         IFX(X_AF) {
+            BICw_REG(s3, s3, s1);   // s3 = (op1 | op2) & ~ res
+            ORRw_REG(s3, s3, s4);   // s3 = (op1 & op2) | ((op1 | op2) & ~ res)
             LSRw(s4, s3, 3);
             BFIw(xFlags, s4, F_AF, 1);    // AF: bc & 0x08
         }
-        IFX(X_OF) {
-            LSRw(s4, s3, 6);
-            EORw_REG_LSR(s4, s4, s4, 1);
-            BFIw(xFlags, s4, F_OF, 1);    // OF: ((bc >> 6) ^ ((bc>>6)>>1)) & 1
+    } else {
+        IFX(X_AF|X_OF) {
+            BICw_REG(s3, s3, s1);   // s3 = (op1 | op2) & ~ res
+            ORRw_REG(s3, s3, s4);   // s3 = (op1 & op2) | ((op1 | op2) & ~ res)
+            IFX(X_AF) {
+                LSRw(s4, s3, 3);
+                BFIw(xFlags, s4, F_AF, 1);    // AF: bc & 0x08
+            }
+            IFX(X_OF) {
+                LSRw(s4, s3, 6);
+                EORw_REG_LSR(s4, s4, s4, 1);
+                BFIw(xFlags, s4, F_OF, 1);    // OF: ((bc >> 6) ^ ((bc>>6)>>1)) & 1
+            }
         }
     }
     IFX(X_CF) {
@@ -303,14 +319,32 @@ void emit_add8(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_ZF) {
-        ANDSw_mask(s1, s1, 0, 7);   //mask=0xff
-        CSETw(s3, cEQ);
-        BFIw(xFlags, s3, F_ZF, 1);
-    }
-    IFX(X_SF) {
-        LSRw(s3, s1, 7);
-        BFIw(xFlags, s3, F_SF, 1);
+    if(arm64_flagm) {
+        IFX(X_ZF|X_SF|X_OF) {
+            SETF8(s1);
+        }
+        IFX(X_ZF) {
+            CSETw(s3, cEQ);
+            BFIw(xFlags, s3, F_ZF, 1);
+        }
+        IFX(X_SF) {
+            CSETw(s3, cMI);
+            BFIw(xFlags, s3, F_SF, 1);
+        }
+        IFX(X_OF) {
+            CSETw(s3, cVS);
+            BFIw(xFlags, s3, F_OF, 1);
+        }
+    } else {
+        IFX(X_ZF) {
+            ANDSw_mask(s1, s1, 0, 7);   //mask=0xff
+            CSETw(s3, cEQ);
+            BFIw(xFlags, s3, F_ZF, 1);
+        }
+        IFX(X_SF) {
+            LSRw(s3, s1, 7);
+            BFIw(xFlags, s3, F_SF, 1);
+        }
     }
     IFX(X_PF) {
         emit_pf(dyn, ninst, s1, s3, s4);