diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-06 12:52:04 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-06 12:52:04 +0100 |
| commit | 6bcc967138d15985c3f25c617e856bcc3a77472f (patch) | |
| tree | d36a628dc9ee29786ba5233c18dda2b5a80a5da4 /src | |
| parent | 47a5257a613e59f212af0b7ab2177fe90e13136f (diff) | |
| download | box64-6bcc967138d15985c3f25c617e856bcc3a77472f.tar.gz box64-6bcc967138d15985c3f25c617e856bcc3a77472f.zip | |
More work on 32bits oprations on F0 prefix
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64runf0.c | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c index 72b1fc9e..9b7cf878 100644 --- a/src/emu/x64runf0.c +++ b/src/emu/x64runf0.c @@ -129,8 +129,11 @@ int RunF0(x64emu_t *emu, rex_t rex) ED->q[0] = tmp64u; } else { tmp32u = add32(emu, ED->dword[0], GD->dword[0]); - GD->dword[0] = ED->dword[0]; - ED->dword[0] = tmp32u; + GD->q[0] = ED->dword[0]; + if((nextop&0xC0)==0xC0) + ED->q[0] = tmp32u; + else + ED->dword[0] = tmp32u; } pthread_mutex_unlock(&emu->context->mutex_lock); #endif @@ -175,16 +178,28 @@ int RunF0(x64emu_t *emu, rex_t rex) case 7: cmp64(emu, ED->q[0], tmp64u); break; } } else { - switch((nextop>>3)&7) { - case 0: ED->dword[0] = add32(emu, ED->dword[0], tmp64u&0xffffffff); break; - case 1: ED->dword[0] = or32(emu, ED->dword[0], tmp64u&0xffffffff); break; - case 2: ED->dword[0] = adc32(emu, ED->dword[0], tmp64u&0xffffffff); break; - case 3: ED->dword[0] = sbb32(emu, ED->dword[0], tmp64u&0xffffffff); break; - case 4: ED->dword[0] = and32(emu, ED->dword[0], tmp64u&0xffffffff); break; - case 5: ED->dword[0] = sub32(emu, ED->dword[0], tmp64u&0xffffffff); break; - case 6: ED->dword[0] = xor32(emu, ED->dword[0], tmp64u&0xffffffff); break; - case 7: cmp32(emu, ED->dword[0], tmp64u&0xffffffff); break; - } + if((nextop&0xC0)==0xC0) + switch((nextop>>3)&7) { + case 0: ED->q[0] = add32(emu, ED->dword[0], tmp64u); break; + case 1: ED->q[0] = or32(emu, ED->dword[0], tmp64u); break; + case 2: ED->q[0] = adc32(emu, ED->dword[0], tmp64u); break; + case 3: ED->q[0] = sbb32(emu, ED->dword[0], tmp64u); break; + case 4: ED->q[0] = and32(emu, ED->dword[0], tmp64u); break; + case 5: ED->q[0] = sub32(emu, ED->dword[0], tmp64u); break; + case 6: ED->q[0] = xor32(emu, ED->dword[0], tmp64u); break; + case 7: cmp32(emu, ED->dword[0], tmp64u); break; + } + else + switch((nextop>>3)&7) { + case 0: ED->dword[0] = add32(emu, ED->dword[0], tmp64u); break; + case 1: ED->dword[0] = or32(emu, ED->dword[0], tmp64u); break; + case 2: ED->dword[0] = adc32(emu, ED->dword[0], tmp64u); break; + case 3: ED->dword[0] = sbb32(emu, ED->dword[0], tmp64u); break; + case 4: ED->dword[0] = and32(emu, ED->dword[0], tmp64u); break; + case 5: ED->dword[0] = sub32(emu, ED->dword[0], tmp64u); break; + case 6: ED->dword[0] = xor32(emu, ED->dword[0], tmp64u); break; + case 7: cmp32(emu, ED->dword[0], tmp64u); break; + } } pthread_mutex_unlock(&emu->context->mutex_lock); #endif |