diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64run.c | 4 | ||||
| -rw-r--r-- | src/emu/x64run0f.c | 18 | ||||
| -rw-r--r-- | src/emu/x64run66f0.c | 32 | ||||
| -rw-r--r-- | src/emu/x64run67.c | 10 | ||||
| -rw-r--r-- | src/emu/x64runf0.c | 46 | ||||
| -rw-r--r-- | src/emu/x64runf20f.c | 1 |
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; |