about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-03-08 16:47:00 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-03-08 16:47:00 +0100
commit460277289bafc73aba1a548d893364235ef5aed6 (patch)
tree9e3baef5eaa0847eb8cdbd2ed4e5428ea128a9f4
parent35ed305718688dc28c967167c3cdffbafce50ab0 (diff)
downloadbox64-460277289bafc73aba1a548d893364235ef5aed6.tar.gz
box64-460277289bafc73aba1a548d893364235ef5aed6.zip
POPF opcode should not overwrite IF bit
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c3
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_2.c2
-rw-r--r--src/emu/x64run.c2
3 files changed, 4 insertions, 3 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index c1ee3648..638c41de 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1491,7 +1491,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             POP1z(xFlags);
             MOV32w(x1, 0x3F7FD7);
             ANDw_REG(xFlags, xFlags, x1);
-            ORRw_mask(xFlags, xFlags, 0b011111, 0);   //mask=0x00000002
+            MOV32w(x1, 0x202);
+            ORRw_REG(xFlags, xFlags, x1);
             SET_DFNONE(x1);
             if(box64_wine) {    // should this be done all the time?
                 TBZ_NEXT(xFlags, F_TF);
diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c
index bc6ae6c9..e75e56d5 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_2.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_2.c
@@ -494,7 +494,7 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             FLAGS_ADJUST_FROM11(xFlags, xFlags, x2);
             MOV32w(x1, 0x3F7FD7);
             AND(xFlags, xFlags, x1);
-            ORI(xFlags, xFlags, 0x2);
+            ORI(xFlags, xFlags, 0x202);
             SET_DFNONE();
             if(box64_wine) {    // should this be done all the time?
                 ANDI(x1, xFlags, 1 << F_TF);
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index e9092067..c5d29a1c 100644
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -860,7 +860,7 @@ x64emurun:
         case 0x9D:                      /* POPF */
             if(ACCESS_FLAG(F_TF) && !tf_next)
                 --tf_next;
-            emu->eflags.x64 = (((rex.is32bits?Pop32(emu):Pop64(emu)) & 0x3F7FD7)/* & (0xffff-40)*/ ) | 0x2; // mask off res2 and res3 and on res1
+            emu->eflags.x64 = (((rex.is32bits?Pop32(emu):Pop64(emu)) & 0x3F7FD7)/* & (0xffff-40)*/ ) | 0x202; // mask off res2 and res3 and on res1
             RESET_FLAGS(emu);
             if(ACCESS_FLAG(F_TF))
                 ++tf_next;