about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-01-06 21:46:53 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-01-06 21:46:53 +0100
commite249a33d3e038f0e3c17f2f6c3eb5b8d7a21a2c3 (patch)
tree28af59c430d5ab734c62d13fbb7f6a0b412e7065 /src
parent5f03d1b90507e52020b00a2833c6074a7dbf9c9f (diff)
downloadbox64-e249a33d3e038f0e3c17f2f6c3eb5b8d7a21a2c3.tar.gz
box64-e249a33d3e038f0e3c17f2f6c3eb5b8d7a21a2c3.zip
Fixed (F0) 0F C7 opcode, only /1 is CMPXCHG(8/16)B
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run0f.c54
-rw-r--r--src/emu/x64runf0.c114
2 files changed, 90 insertions, 78 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 977e6c73..e934c6c2 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -1221,30 +1221,36 @@ int Run0F(x64emu_t *emu, rex_t rex)
             CHECK_FLAGS(emu);

             nextop = F8;

             GETED(0);

-            if(rex.w) {

-                tmp64u = ED->q[0];

-                tmp64u2= ED->q[1];

-                if(R_RAX == tmp64u && R_RDX == tmp64u2) {

-                    SET_FLAG(F_ZF);

-                    ED->q[0] = R_EBX;

-                    ED->q[1] = R_ECX;

-                } else {

-                    CLEAR_FLAG(F_ZF);

-                    R_RAX = tmp64u;

-                    R_RDX = tmp64u2;

-                }

-            } else {

-                tmp32u = ED->dword[0];

-                tmp32u2= ED->dword[1];

-                if(R_EAX == tmp32u && R_EDX == tmp32u2) {

-                    SET_FLAG(F_ZF);

-                    ED->dword[0] = R_EBX;

-                    ED->dword[1] = R_ECX;

-                } else {

-                    CLEAR_FLAG(F_ZF);

-                    R_RAX = tmp32u;

-                    R_RDX = tmp32u2;

-                }

+            switch((nextop>>3)&7) {

+                case 1:

+                    if(rex.w) {

+                        tmp64u = ED->q[0];

+                        tmp64u2= ED->q[1];

+                        if(R_RAX == tmp64u && R_RDX == tmp64u2) {

+                            SET_FLAG(F_ZF);

+                            ED->q[0] = R_EBX;

+                            ED->q[1] = R_ECX;

+                        } else {

+                            CLEAR_FLAG(F_ZF);

+                            R_RAX = tmp64u;

+                            R_RDX = tmp64u2;

+                        }

+                    } else {

+                        tmp32u = ED->dword[0];

+                        tmp32u2= ED->dword[1];

+                        if(R_EAX == tmp32u && R_EDX == tmp32u2) {

+                            SET_FLAG(F_ZF);

+                            ED->dword[0] = R_EBX;

+                            ED->dword[1] = R_ECX;

+                        } else {

+                            CLEAR_FLAG(F_ZF);

+                            R_RAX = tmp32u;

+                            R_RDX = tmp32u2;

+                        }

+                    }

+                    break;

+                default:

+                    return 1;

             }

             break;

         case 0xC8:

diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c
index f3c0fb10..041c147a 100644
--- a/src/emu/x64runf0.c
+++ b/src/emu/x64runf0.c
@@ -634,66 +634,72 @@ int RunF0(x64emu_t *emu, rex_t rex)
                     break;

 

                 case 0xC7:                      /* CMPXCHG8B Gq */

-                    CHECK_FLAGS(emu);

                     nextop = F8;

                     GETED(0);

-                    GETGD;

+                    switch((nextop>>3)&7) {

+                        case 1:

+                            CHECK_FLAGS(emu);

+                            GETGD;

 #ifdef DYNAREC

-                    if(rex.w)

-                        do {

-                            arm64_lock_read_dq(&tmp64u, &tmp64u2, ED);

-                            if(R_RAX == tmp64u && R_RDX == tmp64u2) {

-                                SET_FLAG(F_ZF);

-                                tmp32s = arm64_lock_write_dq(R_RBX, R_RCX, ED);

-                            } else {

-                                CLEAR_FLAG(F_ZF);

-                                R_RAX = tmp64u;

-                                R_RDX = tmp64u2;

-                                tmp32s = 0;

-                            }

-                        } while(tmp32s);

-                    else

-                        do {

-                            tmp64u = arm64_lock_read_dd(ED);

-                            if((R_EAX == (tmp64u&0xffffffff)) && (R_EDX == ((tmp64u>>32)&0xffffffff))) {

-                                SET_FLAG(F_ZF);

-                                tmp32s = arm64_lock_write_dd(ED, R_EBX|(((uint64_t)R_ECX)<<32));

+                            if(rex.w)

+                                do {

+                                    arm64_lock_read_dq(&tmp64u, &tmp64u2, ED);

+                                    if(R_RAX == tmp64u && R_RDX == tmp64u2) {

+                                        SET_FLAG(F_ZF);

+                                        tmp32s = arm64_lock_write_dq(R_RBX, R_RCX, ED);

+                                    } else {

+                                        CLEAR_FLAG(F_ZF);

+                                        R_RAX = tmp64u;

+                                        R_RDX = tmp64u2;

+                                        tmp32s = 0;

+                                    }

+                                } while(tmp32s);

+                            else

+                                do {

+                                    tmp64u = arm64_lock_read_dd(ED);

+                                    if((R_EAX == (tmp64u&0xffffffff)) && (R_EDX == ((tmp64u>>32)&0xffffffff))) {

+                                        SET_FLAG(F_ZF);

+                                        tmp32s = arm64_lock_write_dd(ED, R_EBX|(((uint64_t)R_ECX)<<32));

+                                    } else {

+                                        CLEAR_FLAG(F_ZF);

+                                        R_RAX = tmp64u&0xffffffff;

+                                        R_RDX = (tmp64u>>32)&0xffffffff;

+                                        tmp32s = 0;

+                                    }

+                                } while(tmp32s);

+#else

+                            pthread_mutex_lock(&emu->context->mutex_lock);

+                            if(rex.w) {

+                                tmp64u = ED->q[0];

+                                tmp64u2= ED->q[1];

+                                if(R_RAX == tmp64u && R_RDX == tmp64u2) {

+                                    SET_FLAG(F_ZF);

+                                    ED->q[0] = R_RBX;

+                                    ED->q[1] = R_RCX;

+                                } else {

+                                    CLEAR_FLAG(F_ZF);

+                                    R_RAX = tmp64u;

+                                    R_RDX = tmp64u2;

+                                }

                             } else {

-                                CLEAR_FLAG(F_ZF);

-                                R_RAX = tmp64u&0xffffffff;

-                                R_RDX = (tmp64u>>32)&0xffffffff;

-                                tmp32s = 0;

+                                tmp32u = ED->dword[0];

+                                tmp32u2= ED->dword[1];

+                                if(R_EAX == tmp32u && R_EDX == tmp32u2) {

+                                    SET_FLAG(F_ZF);

+                                    ED->dword[0] = R_EBX;

+                                    ED->dword[1] = R_ECX;

+                                } else {

+                                    CLEAR_FLAG(F_ZF);

+                                    R_RAX = tmp32u;

+                                    R_RDX = tmp32u2;

+                                }

                             }

-                        } while(tmp32s);

-#else

-                    pthread_mutex_lock(&emu->context->mutex_lock);

-                    if(rex.w) {

-                        tmp64u = ED->q[0];

-                        tmp64u2= ED->q[1];

-                        if(R_RAX == tmp64u && R_RDX == tmp64u2) {

-                            SET_FLAG(F_ZF);

-                            ED->q[0] = R_RBX;

-                            ED->q[1] = R_RCX;

-                        } else {

-                            CLEAR_FLAG(F_ZF);

-                            R_RAX = tmp64u;

-                            R_RDX = tmp64u2;

-                        }

-                    } else {

-                        tmp32u = ED->dword[0];

-                        tmp32u2= ED->dword[1];

-                        if(R_EAX == tmp32u && R_EDX == tmp32u2) {

-                            SET_FLAG(F_ZF);

-                            ED->dword[0] = R_EBX;

-                            ED->dword[1] = R_ECX;

-                        } else {

-                            CLEAR_FLAG(F_ZF);

-                            R_RAX = tmp32u;

-                            R_RDX = tmp32u2;

-                        }

-                    }

-                    pthread_mutex_unlock(&emu->context->mutex_lock);

+                            pthread_mutex_unlock(&emu->context->mutex_lock);

 #endif

+                            break;

+                        default:

+                            return 1;

+                    }

                     break;

 

             default: