about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-12 14:59:35 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-12 14:59:35 +0100
commit4318172edd1e26c1168f576e28ae23f94fe879e7 (patch)
tree41ddc963e7fbaaba66677c031712c18ac4b36515 /src
parent9201559b1d71a5e46c6d10cc1053260d86a00ee6 (diff)
parent308cc81a275da39c1bb17d5dcdc8963c2267d383 (diff)
downloadbox64-4318172edd1e26c1168f576e28ae23f94fe879e7.tar.gz
box64-4318172edd1e26c1168f576e28ae23f94fe879e7.zip
Merge branch 'main' of https://github.com/ptitSeb/box64
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c12
-rw-r--r--src/dynarec/arm64/dynarec_arm64_emit_shift.c75
2 files changed, 55 insertions, 32 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 99686b1c..ec2faa63 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1780,7 +1780,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         SETFLAGS(X_ALL, SF_SET_PENDING);    // some flags are left undefined
                         GETEB(x1, 1);
                         u8 = (F8)&0x1f;
-                        emit_shl8c(dyn, ninst, ed, u8, x3, x4);
+                        emit_shl8c(dyn, ninst, ed, u8, x4, x5);
                         EBBACK;
                     }
                     break;
@@ -1790,7 +1790,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         SETFLAGS(X_ALL, SF_SET_PENDING);
                         GETEB(x1, 1);
                         u8 = (F8)&0x1f;
-                        emit_shr8c(dyn, ninst, ed, u8, x3, x4);
+                        emit_shr8c(dyn, ninst, ed, u8, x4, x5);
                         EBBACK;
                     }
                     break;
@@ -1800,7 +1800,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         SETFLAGS(X_ALL, SF_SET_PENDING);
                         GETSEB(x1, 1);
                         u8 = (F8)&0x1f;
-                        emit_sar8c(dyn, ninst, ed, u8, x3, x4);
+                        emit_sar8c(dyn, ninst, ed, u8, x4, x5);
                         EBBACK;
                     }
                     break;
@@ -2116,21 +2116,21 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     INST_NAME("SHL Eb, 1");
                     SETFLAGS(X_ALL, SF_SET_PENDING);    // some flags are left undefined
                     GETEB(x1, 0);
-                    emit_shl8c(dyn, ninst, ed, 1, x3, x4);
+                    emit_shl8c(dyn, ninst, ed, 1, x4, x5);
                     EBBACK;
                     break;
                 case 5:
                     INST_NAME("SHR Eb, 1");
                     SETFLAGS(X_ALL, SF_SET_PENDING);    // some flags are left undefined
                     GETEB(x1, 0);
-                    emit_shr8c(dyn, ninst, ed, 1, x3, x4);
+                    emit_shr8c(dyn, ninst, ed, 1, x4, x5);
                     EBBACK;
                     break;
                 case 7:
                     INST_NAME("SAR Eb, 1");
                     SETFLAGS(X_ALL, SF_SET_PENDING);    // some flags are left undefined
                     GETSEB(x1, 0);
-                    emit_sar8c(dyn, ninst, ed, 1, x3, x4);
+                    emit_sar8c(dyn, ninst, ed, 1, x4, x5);
                     EBBACK;
                     break;
             }
diff --git a/src/dynarec/arm64/dynarec_arm64_emit_shift.c b/src/dynarec/arm64/dynarec_arm64_emit_shift.c
index e9a1e88c..fc37d54a 100644
--- a/src/dynarec/arm64/dynarec_arm64_emit_shift.c
+++ b/src/dynarec/arm64/dynarec_arm64_emit_shift.c
@@ -320,35 +320,58 @@ void emit_shl8c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int s
     } else IFX(X_ALL) {
         SET_DFNONE(s4);
     }
-    IFX(X_CF|X_OF) {
-        LSRw(s3, s1, 8-c);
-        BFIw(xFlags, s3, F_CF, 1);
-    }
-    LSLw(s1, s1, c);
+    if(c<8) {
+        IFX(X_CF|X_OF) {
+            LSRw(s3, s1, 8-c);
+            BFIw(xFlags, s3, F_CF, 1);
+        }
+        LSLw(s1, s1, c);
 
-    IFX(X_PEND) {
-        STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
-    }
-    IFX(X_ZF) {
-        TSTw_mask(s1, 0, 7);
-        CSETw(s4, cEQ);
-        BFIw(xFlags, s4, F_ZF, 1);
-    }
-    IFX(X_SF) {
-        LSRw(s4, s1, 7);
-        BFIw(xFlags, s4, F_SF, 1);
-    }
-    IFX(X_OF) {
-        if(c==1) {
-            IFX(X_SF) {} else {LSRw(s4, s1, 7);}
-            EORw_REG(s4, s4, xFlags);  // CF is set if OF is asked
-            BFIw(xFlags, s4, F_OF, 1);
-        } else {
+        IFX(X_PEND) {
+            STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
+        }
+        IFX(X_ZF) {
+            TSTw_mask(s1, 0, 7);
+            CSETw(s4, cEQ);
+            BFIw(xFlags, s4, F_ZF, 1);
+        }
+        IFX(X_SF) {
+            LSRw(s4, s1, 7);
+            BFIw(xFlags, s4, F_SF, 1);
+        }
+        IFX(X_OF) {
+            if(c==1) {
+                IFX(X_SF) {} else {LSRw(s4, s1, 7);}
+                EORw_REG(s4, s4, xFlags);  // CF is set if OF is asked
+                BFIw(xFlags, s4, F_OF, 1);
+            } else {
+                BFCw(xFlags, F_OF, 1);
+            }
+        }
+        IFX(X_PF) {
+            emit_pf(dyn, ninst, s1, s3, s4);
+        }
+    } else {
+        IFX(X_CF) {
+            LSLw(s3, s1, c-1);
+            BFXILw(xFlags, s3, 7, 1);   // insert F_CF from s3[7:1]
+        }
+        MOVw_REG(s1, xZR);
+        IFX(X_OF) {
             BFCw(xFlags, F_OF, 1);
         }
-    }
-    IFX(X_PF) {
-        emit_pf(dyn, ninst, s1, s3, s4);
+        IFX(X_SF) {
+            BFCw(xFlags, F_SF, 1);
+        }
+        IFX(X_PF | X_ZF) {
+            MOV32w(s3, 1);
+            IFX(X_ZF) {
+                BFIw(xFlags, s3, F_ZF, 1);
+            }
+            IFX(X_PF) {
+                BFIw(xFlags, s3, F_PF, 1);
+            }
+        }
     }
 }