about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-06 12:52:04 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-06 12:52:04 +0100
commit6bcc967138d15985c3f25c617e856bcc3a77472f (patch)
treed36a628dc9ee29786ba5233c18dda2b5a80a5da4 /src
parent47a5257a613e59f212af0b7ab2177fe90e13136f (diff)
downloadbox64-6bcc967138d15985c3f25c617e856bcc3a77472f.tar.gz
box64-6bcc967138d15985c3f25c617e856bcc3a77472f.zip
More work on 32bits oprations on F0 prefix
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runf0.c39
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