about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-07-04 08:07:53 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-07-04 08:07:53 +0200
commit0f3884afde958d644cead9d5adea0c145191f8e4 (patch)
treece9524d8c519ac5fe8d8c3186ffa5d4526d565e3 /src
parent7b3d4c6359b9ed8356e3765c93b01d58f60042ba (diff)
downloadbox64-0f3884afde958d644cead9d5adea0c145191f8e4.tar.gz
box64-0f3884afde958d644cead9d5adea0c145191f8e4.zip
Fixed 64 F2 0F 10 and 64 66 0F 2E opcodes (for #298)
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run64.c30
-rw-r--r--src/emu/x64run6664.c20
2 files changed, 24 insertions, 26 deletions
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c
index 3413fc81..ad637ce2 100644
--- a/src/emu/x64run64.c
+++ b/src/emu/x64run64.c
@@ -49,6 +49,10 @@ int Run64(x64emu_t *emu, rex_t rex, int seg)
         rep = opcode-0xF1;

         opcode = F8;

     }

+    while(opcode>=0x40 && opcode<=0x4f) {

+        rex.rex = opcode;

+        opcode = F8;

+    }

 

     switch(opcode) {

         #define GO(B, OP)                                   \

@@ -173,32 +177,6 @@ int Run64(x64emu_t *emu, rex_t rex, int seg)
                     }

                     break;

 

-                case 0x2E:                      /* UCOMISD Gx, Ex */

-                    // no special check...

-                case 0x2F:                      /* COMISD Gx, Ex */

-                    switch(rep) {

-                        case 0:

-                            RESET_FLAGS(emu);

-                            nextop = F8;

-                            GETEX_OFFS(0, tlsdata);

-                            GETGX;

-                            if(isnan(GX->d[0]) || isnan(EX->d[0])) {

-                                SET_FLAG(F_ZF); SET_FLAG(F_PF); SET_FLAG(F_CF);

-                            } else if(isgreater(GX->d[0], EX->d[0])) {

-                                CLEAR_FLAG(F_ZF); CLEAR_FLAG(F_PF); CLEAR_FLAG(F_CF);

-                            } else if(isless(GX->d[0], EX->d[0])) {

-                                CLEAR_FLAG(F_ZF); CLEAR_FLAG(F_PF); SET_FLAG(F_CF);

-                            } else {

-                                SET_FLAG(F_ZF); CLEAR_FLAG(F_PF); CLEAR_FLAG(F_CF);

-                            }

-                            CLEAR_FLAG(F_OF); CLEAR_FLAG(F_AF); CLEAR_FLAG(F_SF);

-                            break;

-                        default:

-                            return 1;

-                    }

-                    break;

-

-                

                 case 0x59:

                     switch(rep) {

                         case 2: /* MULSS Gx, Ex */

diff --git a/src/emu/x64run6664.c b/src/emu/x64run6664.c
index 14c59677..3b564517 100644
--- a/src/emu/x64run6664.c
+++ b/src/emu/x64run6664.c
@@ -52,6 +52,26 @@ int Run6664(x64emu_t *emu, rex_t rex)
                         EX->q[1] = 0;

                     break;

 

+                case 0x2E:                      /* UCOMISD Gx, Ex */

+                    // no special check...

+                case 0x2F:                      /* COMISD Gx, Ex */

+                    RESET_FLAGS(emu);

+                    nextop = F8;

+                    GETEX_OFFS(0, tlsdata);

+                    GETGX;

+                    if(isnan(GX->d[0]) || isnan(EX->d[0])) {

+                        SET_FLAG(F_ZF); SET_FLAG(F_PF); SET_FLAG(F_CF);

+                    } else if(isgreater(GX->d[0], EX->d[0])) {

+                        CLEAR_FLAG(F_ZF); CLEAR_FLAG(F_PF); CLEAR_FLAG(F_CF);

+                    } else if(isless(GX->d[0], EX->d[0])) {

+                        CLEAR_FLAG(F_ZF); CLEAR_FLAG(F_PF); SET_FLAG(F_CF);

+                    } else {

+                        SET_FLAG(F_ZF); CLEAR_FLAG(F_PF); CLEAR_FLAG(F_CF);

+                    }

+                    CLEAR_FLAG(F_OF); CLEAR_FLAG(F_AF); CLEAR_FLAG(F_SF);

+                    break;

+                    break;

+

                 default:

                     return 1;

             }