about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-28 18:51:16 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-28 18:51:16 +0200
commitf9b74642a24afc78b9acb41ec8440cd98421849e (patch)
tree53c2e8335070d5565fc774954cbda08d4f0deb66 /src
parent401e3a7282abf0079a66c1f445237b1728f768e0 (diff)
downloadbox64-f9b74642a24afc78b9acb41ec8440cd98421849e.tar.gz
box64-f9b74642a24afc78b9acb41ec8440cd98421849e.zip
{ARM64_DYNAREC] Small optimisation on F3 0F BC/BD opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f30f.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f30f.c b/src/dynarec/arm64/dynarec_arm64_f30f.c
index e0828c57..2cf40246 100644
--- a/src/dynarec/arm64/dynarec_arm64_f30f.c
+++ b/src/dynarec/arm64/dynarec_arm64_f30f.c
@@ -481,14 +481,18 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             nextop = F8;

             GETED(0);

             GETGD;

-            TSTxw_REG(ed, ed);

-            CSETw(x3, cEQ);

-            BFIw(xFlags, x3, F_CF, 1);  // CF = is source 0?

+            IFX(X_CF) {

+                TSTxw_REG(ed, ed);

+                CSETw(x3, cEQ);

+                BFIw(xFlags, x3, F_CF, 1);  // CF = is source 0?

+            }

             RBITxw(x3, ed);   // reverse

             CLZxw(gd, x3);    // x2 gets leading 0 == TZCNT

-            TSTxw_REG(gd, gd);

-            CSETw(x3, cEQ);

-            BFIw(xFlags, x3, F_ZF, 1);  // ZF = is dest 0?

+            IFX(X_ZF) {

+                TSTxw_REG(gd, gd);

+                CSETw(x3, cEQ);

+                BFIw(xFlags, x3, F_ZF, 1);  // ZF = is dest 0?

+            }

             break;

         case 0xBD:

             INST_NAME("LZCNT Gd, Ed");

@@ -497,13 +501,17 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             nextop = F8;

             GETED(0);

             GETGD;

-            TSTxw_REG(ed, ed);

-            CSETw(x3, cEQ);

-            BFIw(xFlags, x3, F_CF, 1);  // CF = is source 0?

+            IFX(X_CF) {

+                TSTxw_REG(ed, ed);

+                CSETw(x3, cEQ);

+                BFIw(xFlags, x3, F_CF, 1);  // CF = is source 0?

+            }

             CLZxw(gd, ed);    // x2 gets leading 0 == LZCNT

-            TSTxw_REG(gd, gd);

-            CSETw(x3, cEQ);

-            BFIw(xFlags, x3, F_ZF, 1);  // ZF = is dest 0?

+            IFX(X_ZF) {

+                TSTxw_REG(gd, gd);

+                CSETw(x3, cEQ);

+                BFIw(xFlags, x3, F_ZF, 1);  // ZF = is dest 0?

+            }

             break;

 

         case 0xC2: