about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64run.c4
-rw-r--r--src/emu/x64run0f.c18
-rw-r--r--src/emu/x64run66f0.c32
-rw-r--r--src/emu/x64run67.c10
-rw-r--r--src/emu/x64runf0.c46
-rw-r--r--src/emu/x64runf20f.c1
6 files changed, 63 insertions, 48 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 17a7da6e..8257dd2f 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -497,7 +497,7 @@ x64emurun:
             if(rex.w)
                 GD->q[0] = (uint64_t)ED;
             else
-                GD->q[0] = (uint32_t)(uintptr_t)ED;
+                GD->q[0] = ((uintptr_t)ED)&0xffffffff;
             break;
 
         case 0x8F:                      /* POP Ed */
@@ -579,7 +579,7 @@ x64emurun:
             if(rex.w)
                 R_RAX = *(uint64_t*)F64;
             else
-                R_EAX = *(uint32_t*)F64;
+                R_RAX = *(uint32_t*)F64;
             break;
         case 0xA2:                      /* MOV Ob,AL */
             *(uint8_t*)F64 = R_AL;
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 7426a4af..887ca31c 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -742,8 +742,12 @@ int Run0F(x64emu_t *emu, rex_t rex)
                 tmp8u = R_CL;

             if(rex.w)

                 ED->q[0] = shld64(emu, ED->q[0], GD->q[0], tmp8u);

-            else

-                ED->q[0] = shld32(emu, ED->dword[0], GD->dword[0], tmp8u);

+            else {

+                if(MODREG)

+                    ED->q[0] = shld32(emu, ED->dword[0], GD->dword[0], tmp8u);

+                else

+                    ED->dword[0] = shld32(emu, ED->dword[0], GD->dword[0], tmp8u);

+            }

             break;

 

         case 0xAB:                      /* BTS Ed,Gd */

@@ -784,8 +788,12 @@ int Run0F(x64emu_t *emu, rex_t rex)
             tmp8u = (opcode==0xAC)?(F8):R_CL;

             if(rex.w)

                 ED->q[0] = shrd64(emu, ED->q[0], GD->q[0], tmp8u);

-            else

-                ED->q[0] = shrd32(emu, ED->dword[0], GD->dword[0], tmp8u);

+            else {

+                if(MODREG)

+                    ED->q[0] = shrd32(emu, ED->dword[0], GD->dword[0], tmp8u);

+                else

+                    ED->dword[0] = shrd32(emu, ED->dword[0], GD->dword[0], tmp8u);

+            }

             break;

         case 0xAE:                      /* Grp Ed (SSE) */

             nextop = F8;

@@ -834,7 +842,7 @@ int Run0F(x64emu_t *emu, rex_t rex)
             if(rex.w)

                 GD->q[0] = imul64(emu, GD->q[0], ED->q[0]);

             else

-                GD->dword[0] = imul32(emu, GD->dword[0], ED->dword[0]);

+                GD->q[0] = imul32(emu, GD->dword[0], ED->dword[0]);

             break;

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

             nextop = F8;

diff --git a/src/emu/x64run66f0.c b/src/emu/x64run66f0.c
index cdfecd06..50f159f8 100644
--- a/src/emu/x64run66f0.c
+++ b/src/emu/x64run66f0.c
@@ -97,28 +97,16 @@ int Run66F0(x64emu_t *emu, rex_t rex)
                     case 7:            cmp64(emu, ED->q[0], tmp64u); break;
                 }
             } else {
-                if((nextop&0xC0)==0xC0)
-                    switch((nextop>>3)&7) {
-                        case 0: ED->word[0] = add16(emu, ED->word[0], tmp64u); break;
-                        case 1: ED->word[0] =  or16(emu, ED->word[0], tmp64u); break;
-                        case 2: ED->word[0] = adc16(emu, ED->word[0], tmp64u); break;
-                        case 3: ED->word[0] = sbb16(emu, ED->word[0], tmp64u); break;
-                        case 4: ED->word[0] = and16(emu, ED->word[0], tmp64u); break;
-                        case 5: ED->word[0] = sub16(emu, ED->word[0], tmp64u); break;
-                        case 6: ED->word[0] = xor16(emu, ED->word[0], tmp64u); break;
-                        case 7:               cmp16(emu, ED->word[0], tmp64u); break;
-                    }
-                else
-                    switch((nextop>>3)&7) {
-                        case 0: ED->word[0] = add16(emu, ED->word[0], tmp64u); break;
-                        case 1: ED->word[0] =  or16(emu, ED->word[0], tmp64u); break;
-                        case 2: ED->word[0] = adc16(emu, ED->word[0], tmp64u); break;
-                        case 3: ED->word[0] = sbb16(emu, ED->word[0], tmp64u); break;
-                        case 4: ED->word[0] = and16(emu, ED->word[0], tmp64u); break;
-                        case 5: ED->word[0] = sub16(emu, ED->word[0], tmp64u); break;
-                        case 6: ED->word[0] = xor16(emu, ED->word[0], tmp64u); break;
-                        case 7:               cmp16(emu, ED->word[0], tmp64u); break;
-                    }
+                switch((nextop>>3)&7) {
+                    case 0: ED->word[0] = add16(emu, ED->word[0], tmp64u); break;
+                    case 1: ED->word[0] =  or16(emu, ED->word[0], tmp64u); break;
+                    case 2: ED->word[0] = adc16(emu, ED->word[0], tmp64u); break;
+                    case 3: ED->word[0] = sbb16(emu, ED->word[0], tmp64u); break;
+                    case 4: ED->word[0] = and16(emu, ED->word[0], tmp64u); break;
+                    case 5: ED->word[0] = sub16(emu, ED->word[0], tmp64u); break;
+                    case 6: ED->word[0] = xor16(emu, ED->word[0], tmp64u); break;
+                    case 7:               cmp16(emu, ED->word[0], tmp64u); break;
+                }
             }
             pthread_mutex_unlock(&emu->context->mutex_lock);
 #endif
diff --git a/src/emu/x64run67.c b/src/emu/x64run67.c
index 320ea2ac..239bae4a 100644
--- a/src/emu/x64run67.c
+++ b/src/emu/x64run67.c
@@ -52,13 +52,13 @@ int Run67(x64emu_t *emu, rex_t rex, int rep)
     #define GO(B, OP)                                   \

     case B+0:                                           \

         nextop = F8;                                    \

-        GETEB32(0);                                       \

+        GETEB32(0);                                     \

         GETGB;                                          \

         EB->byte[0] = OP##8(emu, EB->byte[0], GB);      \

         break;                                          \

     case B+1:                                           \

         nextop = F8;                                    \

-        GETED32(0);                                       \

+        GETED32(0);                                     \

         GETGD;                                          \

         if(rex.w)                                       \

             ED->q[0] = OP##64(emu, ED->q[0], GD->q[0]); \

@@ -71,13 +71,13 @@ int Run67(x64emu_t *emu, rex_t rex, int rep)
         break;                                          \

     case B+2:                                           \

         nextop = F8;                                    \

-        GETEB32(0);                                       \

+        GETEB32(0);                                     \

         GETGB;                                          \

         GB = OP##8(emu, GB, EB->byte[0]);               \

         break;                                          \

     case B+3:                                           \

         nextop = F8;                                    \

-        GETED32(0);                                       \

+        GETED32(0);                                     \

         GETGD;                                          \

         if(rex.w)                                       \

             GD->q[0] = OP##64(emu, GD->q[0], ED->q[0]); \

@@ -167,7 +167,7 @@ int Run67(x64emu_t *emu, rex_t rex, int rep)
         if(rex.w)

             GD->q[0] = (uint64_t)ED;

         else

-            GD->q[0] = (uint32_t)(uintptr_t)ED;

+            GD->q[0] = ((uintptr_t)ED)&0xffffffff;

         break;

 

     case 0xC1:                      /* GRP2 Ed,Ib */

diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c
index 8ad70b78..34b73da9 100644
--- a/src/emu/x64runf0.c
+++ b/src/emu/x64runf0.c
@@ -197,7 +197,7 @@ int RunF0(x64emu_t *emu, rex_t rex)
                             } else {

                                 tmp64u |= (1LL<<tmp8u);

                                 CLEAR_FLAG(F_CF);

-                                tmp32s = arm64_lock_write_d(ED, tmp64u);

+                                tmp32s = arm64_lock_write_dd(ED, tmp64u);

                             }

                         } while(tmp32s);

                 } else {

@@ -281,17 +281,32 @@ int RunF0(x64emu_t *emu, rex_t rex)
                     GETGD;

 #ifdef DYNAREC

                     if(rex.w)

-                        do {

-                            tmp64u = arm64_lock_read_dd(ED);

-                            cmp64(emu, R_RAX, tmp64u);

-                            if(ACCESS_FLAG(F_ZF)) {

-                                tmp32s = arm64_lock_write_dd(ED, GD->q[0]);

-                            } else {

-                                R_RAX = tmp64u;

-                                tmp32s = 0;

-                            }

-                        } while(tmp32s);

-                    else

+                        if(((uintptr_t)ED)&7) {

+                            do {

+                                tmp64u = ED->q[0] & ~0xffLL;

+                                tmp64u |= arm64_lock_read_b(ED);

+                                cmp64(emu, R_RAX, tmp64u);

+                                if(ACCESS_FLAG(F_ZF)) {

+                                    tmp32s = arm64_lock_write_b(ED, GD->q[0]&0xff);

+                                    if(!tmp32s)

+                                        ED->q[0] = GD->q[0];

+                                } else {

+                                    R_RAX = tmp64u;

+                                    tmp32s = 0;

+                                }

+                            } while(tmp32s);

+                        } else

+                            do {

+                                tmp64u = arm64_lock_read_dd(ED);

+                                cmp64(emu, R_RAX, tmp64u);

+                                if(ACCESS_FLAG(F_ZF)) {

+                                    tmp32s = arm64_lock_write_dd(ED, GD->q[0]);

+                                } else {

+                                    R_RAX = tmp64u;

+                                    tmp32s = 0;

+                                }

+                            } while(tmp32s);

+                    else {

                         do {

                             tmp32u = arm64_lock_read_d(ED);

                             cmp32(emu, R_EAX, tmp32u);

@@ -302,6 +317,8 @@ int RunF0(x64emu_t *emu, rex_t rex)
                                 tmp32s = 0;

                             }

                         } while(tmp32s);

+                        emu->regs[_AX].dword[1] = 0;

+                    }

 #else

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

                     if(rex.w) {

@@ -318,6 +335,7 @@ int RunF0(x64emu_t *emu, rex_t rex)
                         } else {

                             R_EAX = ED->dword[0];

                         }

+                        emu->regs[_AX].dword[1] = 0;

                     }

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

 #endif

@@ -482,8 +500,8 @@ int RunF0(x64emu_t *emu, rex_t rex)
                             ED->dword[1] = R_ECX;

                         } else {

                             CLEAR_FLAG(F_ZF);

-                            R_EAX = tmp32u;

-                            R_EDX = tmp32u2;

+                            R_RAX = tmp32u;

+                            R_RDX = tmp32u2;

                         }

                     }

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

diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c
index 2d64969a..fafcce2c 100644
--- a/src/emu/x64runf20f.c
+++ b/src/emu/x64runf20f.c
@@ -116,6 +116,7 @@ int RunF20F(x64emu_t *emu, rex_t rex)
                     GD->sdword[0] = EX->d[0];

                     break;

             }

+            GD->dword[1] = 0;

         }

         break;