about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-11 17:53:17 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-11 17:53:17 +0100
commit7c000adb8704eee81395a6e2bb52010c8254b4ce (patch)
tree7b6d504d8209ae0b3f27e97d2150911a950e26e9 /src
parent2d4f073925aebb93f9f19122fe5cd9c55caf1df3 (diff)
downloadbox64-7c000adb8704eee81395a6e2bb52010c8254b4ce.tar.gz
box64-7c000adb8704eee81395a6e2bb52010c8254b4ce.zip
[INTERPRETER][COSIM] Better flags for btx opcode familly when running cosim
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run0f.c48
-rw-r--r--src/emu/x64run64.c24
-rw-r--r--src/emu/x64runf0.c36
3 files changed, 108 insertions, 0 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 673f2d2b..041b8320 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -1156,6 +1156,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                 else

                     CLEAR_FLAG(F_CF);

             }

+            if(box64_dynarec_test) {

+                CLEAR_FLAG(F_OF);

+                CLEAR_FLAG(F_SF);

+                CLEAR_FLAG(F_AF);

+                CLEAR_FLAG(F_PF);

+            }

             break;

         case 0xA4:                      /* SHLD Ed,Gd,Ib */

             nextop = F8;

@@ -1237,6 +1243,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                 if(MODREG)

                     ED->dword[1] = 0;

             }

+            if(box64_dynarec_test) {

+                CLEAR_FLAG(F_OF);

+                CLEAR_FLAG(F_SF);

+                CLEAR_FLAG(F_AF);

+                CLEAR_FLAG(F_PF);

+            }

             break;

         case 0xAC:                      /* SHRD Ed,Gd,Ib */

         case 0xAD:                      /* SHRD Ed,Gd,CL */

@@ -1400,6 +1412,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                 if(MODREG)

                     ED->dword[1] = 0;

             }

+            if(box64_dynarec_test) {

+                CLEAR_FLAG(F_OF);

+                CLEAR_FLAG(F_SF);

+                CLEAR_FLAG(F_AF);

+                CLEAR_FLAG(F_PF);

+            }

             break;

 

         case 0xB6:                      /* MOVZX Gd,Eb */

@@ -1435,6 +1453,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                         else

                             CLEAR_FLAG(F_CF);

                     }

+                    if(box64_dynarec_test) {

+                        CLEAR_FLAG(F_OF);

+                        CLEAR_FLAG(F_SF);

+                        CLEAR_FLAG(F_AF);

+                        CLEAR_FLAG(F_PF);

+                    }

                     break;

                 case 5:             /* BTS Ed, Ib */

                     CHECK_FLAGS(emu);

@@ -1459,6 +1483,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                         if(MODREG)

                             ED->dword[1] = 0;

                     }

+                    if(box64_dynarec_test) {

+                        CLEAR_FLAG(F_OF);

+                        CLEAR_FLAG(F_SF);

+                        CLEAR_FLAG(F_AF);

+                        CLEAR_FLAG(F_PF);

+                    }

                     break;

                 case 6:             /* BTR Ed, Ib */

                     CHECK_FLAGS(emu);

@@ -1481,6 +1511,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                         if(MODREG)

                             ED->dword[1] = 0;

                     }

+                    if(box64_dynarec_test) {

+                        CLEAR_FLAG(F_OF);

+                        CLEAR_FLAG(F_SF);

+                        CLEAR_FLAG(F_AF);

+                        CLEAR_FLAG(F_PF);

+                    }

                     break;

                 case 7:             /* BTC Ed, Ib */

                     CHECK_FLAGS(emu);

@@ -1503,6 +1539,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                         if(MODREG)

                             ED->dword[1] = 0;

                     }

+                    if(box64_dynarec_test) {

+                        CLEAR_FLAG(F_OF);

+                        CLEAR_FLAG(F_SF);

+                        CLEAR_FLAG(F_AF);

+                        CLEAR_FLAG(F_PF);

+                    }

                     break;

 

                 default:

@@ -1544,6 +1586,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                 if(MODREG)

                     ED->dword[1] = 0;

             }

+            if(box64_dynarec_test) {

+                CLEAR_FLAG(F_OF);

+                CLEAR_FLAG(F_SF);

+                CLEAR_FLAG(F_AF);

+                CLEAR_FLAG(F_PF);

+            }

             break;

         case 0xBC:                      /* BSF Ed,Gd */

             RESET_FLAGS(emu);

diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c
index 9523fbb8..9d8b920e 100644
--- a/src/emu/x64run64.c
+++ b/src/emu/x64run64.c
@@ -321,6 +321,12 @@ uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr)
                                 else

                                     CLEAR_FLAG(F_CF);

                             }

+                            if(box64_dynarec_test) {

+                                CLEAR_FLAG(F_OF);

+                                CLEAR_FLAG(F_SF);

+                                CLEAR_FLAG(F_AF);

+                                CLEAR_FLAG(F_PF);

+                            }

                             break;

                         case 5:             /* BTS Ed, Ib */

                             CHECK_FLAGS(emu);

@@ -345,6 +351,12 @@ uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr)
                                 if(MODREG)

                                     ED->dword[1] = 0;

                             }

+                            if(box64_dynarec_test) {

+                                CLEAR_FLAG(F_OF);

+                                CLEAR_FLAG(F_SF);

+                                CLEAR_FLAG(F_AF);

+                                CLEAR_FLAG(F_PF);

+                            }

                             break;

                         case 6:             /* BTR Ed, Ib */

                             CHECK_FLAGS(emu);

@@ -367,6 +379,12 @@ uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr)
                                 if(MODREG)

                                     ED->dword[1] = 0;

                             }

+                            if(box64_dynarec_test) {

+                                CLEAR_FLAG(F_OF);

+                                CLEAR_FLAG(F_SF);

+                                CLEAR_FLAG(F_AF);

+                                CLEAR_FLAG(F_PF);

+                            }

                             break;

                         case 7:             /* BTC Ed, Ib */

                             CHECK_FLAGS(emu);

@@ -389,6 +407,12 @@ uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr)
                                 if(MODREG)

                                     ED->dword[1] = 0;

                             }

+                            if(box64_dynarec_test) {

+                                CLEAR_FLAG(F_OF);

+                                CLEAR_FLAG(F_SF);

+                                CLEAR_FLAG(F_AF);

+                                CLEAR_FLAG(F_PF);

+                            }

                             break;

 

                         default:

diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c
index 0f6c9297..df381e5a 100644
--- a/src/emu/x64runf0.c
+++ b/src/emu/x64runf0.c
@@ -290,6 +290,12 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr)
                 }

                 pthread_mutex_unlock(&my_context->mutex_lock);

 #endif

+                if(box64_dynarec_test) {

+                    CLEAR_FLAG(F_OF);

+                    CLEAR_FLAG(F_SF);

+                    CLEAR_FLAG(F_AF);

+                    CLEAR_FLAG(F_PF);

+                }

                 break;

 

                 case 0xB0:                      /* CMPXCHG Eb,Gb */

@@ -472,6 +478,12 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr)
                     }

                     pthread_mutex_unlock(&my_context->mutex_lock);

 #endif

+                    if(box64_dynarec_test) {

+                        CLEAR_FLAG(F_OF);

+                        CLEAR_FLAG(F_SF);

+                        CLEAR_FLAG(F_AF);

+                        CLEAR_FLAG(F_PF);

+                    }

                     break;

 

                     case 0xBA:                      

@@ -494,6 +506,12 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr)
                                     else

                                         CLEAR_FLAG(F_CF);

                                 }

+                                if(box64_dynarec_test) {

+                                    CLEAR_FLAG(F_OF);

+                                    CLEAR_FLAG(F_SF);

+                                    CLEAR_FLAG(F_AF);

+                                    CLEAR_FLAG(F_PF);

+                                }

                                 break;

                             case 5:             /* BTS Ed, Ib */

                                 CHECK_FLAGS(emu);

@@ -562,6 +580,12 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr)
                                 }

                                 pthread_mutex_unlock(&my_context->mutex_lock);

 #endif

+                                if(box64_dynarec_test) {

+                                    CLEAR_FLAG(F_OF);

+                                    CLEAR_FLAG(F_SF);

+                                    CLEAR_FLAG(F_AF);

+                                    CLEAR_FLAG(F_PF);

+                                }

                                 break;

                             case 6:             /* BTR Ed, Ib */

                                 CHECK_FLAGS(emu);

@@ -614,6 +638,12 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr)
                                 }

                                 pthread_mutex_unlock(&my_context->mutex_lock);

 #endif

+                                if(box64_dynarec_test) {

+                                    CLEAR_FLAG(F_OF);

+                                    CLEAR_FLAG(F_SF);

+                                    CLEAR_FLAG(F_AF);

+                                    CLEAR_FLAG(F_PF);

+                                }

                                 break;

                             case 7:             /* BTC Ed, Ib */

                                 CHECK_FLAGS(emu);

@@ -662,6 +692,12 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr)
                                 }

                                 pthread_mutex_unlock(&my_context->mutex_lock);

 #endif

+                                if(box64_dynarec_test) {

+                                    CLEAR_FLAG(F_OF);

+                                    CLEAR_FLAG(F_SF);

+                                    CLEAR_FLAG(F_AF);

+                                    CLEAR_FLAG(F_PF);

+                                }

                                 break;

 

                             default: