about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-31 22:05:42 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-31 22:05:42 +0100
commitca8d569e63dd53183dcb9b1e6446027774083782 (patch)
tree3b68aab825dd012e15d2ca7497d5195b6c18ece6 /src
parent670770e24a5469cc27f357ff601fd876b5cfb1bc (diff)
downloadbox64-ca8d569e63dd53183dcb9b1e6446027774083782.tar.gz
box64-ca8d569e63dd53183dcb9b1e6446027774083782.zip
[ARM64_DYNAREC] Fixed some issue with shrd/shld opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c8
-rw-r--r--src/dynarec/arm64/dynarec_arm64_emit_shift.c20
2 files changed, 12 insertions, 16 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index cdc4b0a2..058478c6 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -1691,11 +1691,11 @@ 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");

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

+            if(geted_ib(dyn, addr, ninst, nextop)&(rex.w?63:31)) {

                 SETFLAGS(X_ALL, SF_SET_PENDING);

                 GETED(1);

                 GETGD;

-                u8 = F8;

+                u8 = F8&(rex.w?63:31);

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

                 WBACK;

             } else {

@@ -1779,11 +1779,11 @@ 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");

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

+            if(geted_ib(dyn, addr, ninst, nextop)&(rex.w?63:31)) {

                 SETFLAGS(X_ALL, SF_SET_PENDING);

                 GETED(1);

                 GETGD;

-                u8 = F8;

+                u8 = F8&(rex.w?63:31);

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

                 WBACK;

             } else {

diff --git a/src/dynarec/arm64/dynarec_arm64_emit_shift.c b/src/dynarec/arm64/dynarec_arm64_emit_shift.c
index 0c9d45ed..96ab49bc 100644
--- a/src/dynarec/arm64/dynarec_arm64_emit_shift.c
+++ b/src/dynarec/arm64/dynarec_arm64_emit_shift.c
@@ -213,11 +213,9 @@ void emit_shr32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, i
             BFIw(xFlags, s3, 0, 1);
         }
     }
-    IFX(X_OF) {
-        if(c==1) {
-            LSRxw(s4, s1, rex.w?63:31);
-            BFIw(xFlags, s4, F_OF, 1);
-        }
+    IFX2(X_OF, && (c==1)) {
+        LSRxw(s4, s1, rex.w?63:31);
+        BFIw(xFlags, s4, F_OF, 1);
     }
     LSRxw(s1, s1, c);
     IFX(X_PEND) {
@@ -757,7 +755,7 @@ void emit_shr16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
     IFX(X_OF) {
         CMPSw_U12(s2, 1);   // if s2==1
             LSRw(s4, s1, 15);
-            CSELw(s4, s4, xZR, 0);
+            CSELw(s4, s4, xZR, cEQ);
             BFIw(xFlags, s4, F_OF, 1);
     }
     LSRw_REG(s1, s1, s2);
@@ -1237,7 +1235,6 @@ void emit_rcr32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, i
 // emit SHRD32 instruction, from s1, fill s2 , constant c, store result in s1 using s3 and s4 as scratch
 void emit_shrd32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4)
 {
-    c&=(rex.w?0x3f:0x1f);
     IFX(X_PEND) {
         MOV32w(s3, c);
         STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
@@ -1288,7 +1285,7 @@ void emit_shrd32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, uint
     }
     if(box64_dynarec_test) {
         IFX(X_AF) {BFCw(xFlags, F_AF, 1);}
-        IFX(X_OF) if(c>1) {BFCw(xFlags, F_OF, 1);}
+        IFX2(X_OF, && (c>1)) {BFCw(xFlags, F_OF, 1);}
     }
     IFX(X_PF) {
         emit_pf(dyn, ninst, s1, s4);
@@ -1297,7 +1294,6 @@ void emit_shrd32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, uint
 
 void emit_shld32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4)
 {
-    c&=(rex.w?0x3f:0x1f);
     IFX(X_PEND) {
         MOV32w(s3, c);
         STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
@@ -1343,7 +1339,7 @@ void emit_shld32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, uint
     }
     if(box64_dynarec_test) {
         IFX(X_AF) {BFCw(xFlags, F_AF, 1);}
-        IFX(X_OF) if(c>1) {BFCw(xFlags, F_OF, 1);}
+        IFX2(X_OF, && (c>1)) {BFCw(xFlags, F_OF, 1);}
     }
     IFX(X_PF) {
         emit_pf(dyn, ninst, s1, s4);
@@ -1524,7 +1520,7 @@ void emit_shrd16c(dynarec_arm_t* dyn, int ninst, int s1, int s2, uint32_t c, int
     }
     if(box64_dynarec_test) {
         IFX(X_AF) {BFCw(xFlags, F_AF, 1);}
-        IFX(X_OF) if(c>1) {BFCw(xFlags, F_OF, 1);}
+        IFX2(X_OF, && (c>1)) {BFCw(xFlags, F_OF, 1);}
     }
     IFX(X_PF) {
         emit_pf(dyn, ninst, s1, s4);
@@ -1619,7 +1615,7 @@ void emit_shld16c(dynarec_arm_t* dyn, int ninst, int s1, int s2, uint32_t c, int
     }
     if(box64_dynarec_test) {
         IFX(X_AF) {BFCw(xFlags, F_AF, 1);}
-        IFX(X_OF) if(c>1) {BFCw(xFlags, F_OF, 1);}
+        IFX2(X_OF, && (c>1)) {BFCw(xFlags, F_OF, 1);}
     }
     IFX(X_PF) {
         emit_pf(dyn, ninst, s1, s4);