about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-08-10 09:40:05 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-08-10 09:40:05 +0200
commit0256a6332c742c53feef4332f746a53ef80feaaa (patch)
treed3f17634544263c4dbb441d203d49356583c747c
parentbd4454d8ad925cb17ccf3beaa6c872440fede753 (diff)
downloadbox64-0256a6332c742c53feef4332f746a53ef80feaaa.tar.gz
box64-0256a6332c742c53feef4332f746a53ef80feaaa.zip
[ARM64_DYNAREC] Fixed flags for surd/shld with constant 0 shift
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 85025081..8c970f43 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -1643,12 +1643,17 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0xA4:

             nextop = F8;

             INST_NAME("SHLD Ed, Gd, Ib");

-            SETFLAGS(X_ALL, SF_SET_PENDING);

-            GETED(1);

-            GETGD;

-            u8 = F8;

-            emit_shld32c(dyn, ninst, rex, ed, gd, u8, x3, x4);

-            WBACK;

+            if(geted_ib(dyn, addr, ninst, nextop)) {

+                SETFLAGS(X_ALL, SF_SET_PENDING);

+                GETED(1);

+                GETGD;

+                u8 = F8;

+                emit_shld32c(dyn, ninst, rex, ed, gd, u8, x3, x4);

+                WBACK;

+            } else {

+                FAKEED;

+                F8;

+            }

             break;

         case 0xA5:

             nextop = F8;

@@ -1719,12 +1724,17 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0xAC:

             nextop = F8;

             INST_NAME("SHRD Ed, Gd, Ib");

-            SETFLAGS(X_ALL, SF_SET_PENDING);

-            GETED(1);

-            GETGD;

-            u8 = F8;

-            emit_shrd32c(dyn, ninst, rex, ed, gd, u8, x3, x4);

-            WBACK;

+            if(geted_ib(dyn, addr, ninst, nextop)) {

+                SETFLAGS(X_ALL, SF_SET_PENDING);

+                GETED(1);

+                GETGD;

+                u8 = F8;

+                emit_shrd32c(dyn, ninst, rex, ed, gd, u8, x3, x4);

+                WBACK;

+            } else {

+                FAKEED;

+                F8;

+            }

             break;

         case 0xAD:

             nextop = F8;