about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-08 15:50:24 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-08 15:50:24 +0100
commit987e6e03f173bbd4c92983182905c95e124c003d (patch)
tree793709bbaf12052d0d990853d69a744def69487c /src
parent50045135967768a5a8cba612d15c76fa7afb9c0b (diff)
downloadbox64-987e6e03f173bbd4c92983182905c95e124c003d.tar.gz
box64-987e6e03f173bbd4c92983182905c95e124c003d.zip
Added more opcodes, including D8 and DD x87 ones
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64run.c17
-rwxr-xr-xsrc/emu/x64run_private.h2
-rw-r--r--src/emu/x64rund8.c198
-rw-r--r--src/emu/x64rundd.c194
-rw-r--r--src/emu/x64runf30f.c7
5 files changed, 418 insertions, 0 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index a01fdb92..1a461687 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -627,6 +627,14 @@ x64emurun:
             }
             break;
 
+        case 0xD8:                      /* x87 opcodes */
+            if(RunD8(emu, rex)) {
+                unimp = 1;
+                goto fini;
+            }
+            if(emu->quit)
+                goto fini;
+            break;
         case 0xD9:                      /* x87 opcodes */
             if(RunD9(emu, rex)) {
                 unimp = 1;
@@ -645,6 +653,15 @@ x64emurun:
                 goto fini;
             break;
 
+        case 0xDD:                      /* x87 opcodes */
+            if(RunDD(emu, rex)) {
+                unimp = 1;
+                goto fini;
+            }
+            if(emu->quit)
+                goto fini;
+            break;
+
         case 0xDF:                      /* x87 opcodes */
             if(RunDF(emu, rex)) {
                 unimp = 1;
diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index f9d3012e..024564a7 100755
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -100,8 +100,10 @@ int Run64(x64emu_t *emu, rex_t rex);
 int Run66(x64emu_t *emu, rex_t rex);
 int Run660F(x64emu_t *emu, rex_t rex);
 //int Run67(x64emu_t *emu, rex_t rex);
+int RunD8(x64emu_t *emu, rex_t rex);
 int RunD9(x64emu_t *emu, rex_t rex);
 int RunDB(x64emu_t *emu, rex_t rex);
+int RunDD(x64emu_t *emu, rex_t rex);
 int RunDF(x64emu_t *emu, rex_t rex);
 int RunF0(x64emu_t *emu, rex_t rex);
 int RunF20F(x64emu_t *emu, rex_t rex);
diff --git a/src/emu/x64rund8.c b/src/emu/x64rund8.c
new file mode 100644
index 00000000..e0f1017e
--- /dev/null
+++ b/src/emu/x64rund8.c
@@ -0,0 +1,198 @@
+#define _GNU_SOURCE

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <math.h>

+#include <string.h>

+#include <signal.h>

+#include <sys/types.h>

+#include <unistd.h>

+

+#include "debug.h"

+#include "box64stack.h"

+#include "x64emu.h"

+#include "x64run.h"

+#include "x64emu_private.h"

+#include "x64run_private.h"

+#include "x64primop.h"

+#include "x64trace.h"

+#include "x87emu_private.h"

+#include "box64context.h"

+#include "bridge.h"

+#ifdef DYNAREC

+#include "../dynarec/arm_lock_helper.h"

+#endif

+

+#include "modrm.h"

+

+int RunD8(x64emu_t *emu, rex_t rex)

+{

+    uint8_t nextop;

+    float f;

+    reg64_t *oped;

+

+    nextop = F8;

+    switch (nextop) {

+

+        case 0xC0:

+        case 0xC1:

+        case 0xC2:

+        case 0xC3:

+        case 0xC4:

+        case 0xC5:

+        case 0xC6:

+        case 0xC7:  /* FADD */

+            ST0.d += ST(nextop&7).d;

+            break;

+        case 0xC8:

+        case 0xC9:

+        case 0xCA:

+        case 0xCB:

+        case 0xCC:

+        case 0xCD:

+        case 0xCE:

+        case 0xCF:  /* FMUL */

+            ST0.d *= ST(nextop&7).d;

+            break;

+        case 0xD0:

+        case 0xD1:

+        case 0xD2:

+        case 0xD3:

+        case 0xD4:

+        case 0xD5:

+        case 0xD6:

+        case 0xD7:  /* FCOM */

+            fpu_fcom(emu, ST(nextop&7).d);

+            break;

+        case 0xD8:

+        case 0xD9:

+        case 0xDA:

+        case 0xDB:

+        case 0xDC:

+        case 0xDD:

+        case 0xDE:

+        case 0xDF:  /* FCOMP */

+            fpu_fcom(emu, ST(nextop&7).d);

+            fpu_do_pop(emu);

+            break;

+        case 0xE0:

+        case 0xE1:

+        case 0xE2:

+        case 0xE3:

+        case 0xE4:

+        case 0xE5:

+        case 0xE6:

+        case 0xE7:  /* FSUB */

+            ST0.d -= ST(nextop&7).d;

+            break;

+        case 0xE8:

+        case 0xE9:

+        case 0xEA:

+        case 0xEB:

+        case 0xEC:

+        case 0xED:

+        case 0xEE:

+        case 0xEF:  /* FSUBR */

+            ST0.d = ST(nextop&7).d - ST0.d;

+            break;

+        case 0xF0:

+        case 0xF1:

+        case 0xF2:

+        case 0xF3:

+        case 0xF4:

+        case 0xF5:

+        case 0xF6:

+        case 0xF7:  /* FDIV */

+            ST0.d /= ST(nextop&7).d;

+            break;

+        case 0xF8:

+        case 0xF9:

+        case 0xFA:

+        case 0xFB:

+        case 0xFC:

+        case 0xFD:

+        case 0xFE:

+        case 0xFF:  /* FDIVR */

+            ST0.d = ST(nextop&7).d / ST0.d;

+            break;

+        default:

+        switch((nextop>>3)&7) {

+            case 0:         /* FADD ST0, float */

+                GETED(0);

+                if(!(((uintptr_t)ED)&3))

+                    ST0.d += *(float*)ED;

+                else {

+                    memcpy(&f, ED, sizeof(float));

+                    ST0.d += f;

+                }

+                break;

+            case 1:         /* FMUL ST0, float */

+                GETED(0);

+                if(!(((uintptr_t)ED)&3))

+                    ST0.d *= *(float*)ED;

+                else {

+                    memcpy(&f, ED, sizeof(float));

+                    ST0.d *= f;

+                }

+                break;

+            case 2:      /* FCOM ST0, float */

+                GETED(0);

+                if(!(((uintptr_t)ED)&3))

+                    fpu_fcom(emu, *(float*)ED);

+                else {

+                    memcpy(&f, ED, sizeof(float));

+                    fpu_fcom(emu, f);

+                }

+                break;

+            case 3:     /* FCOMP */

+                GETED(0);

+                if(!(((uintptr_t)ED)&3))

+                    fpu_fcom(emu, *(float*)ED);

+                else {

+                    memcpy(&f, ED, sizeof(float));

+                    fpu_fcom(emu, f);

+                }

+                fpu_do_pop(emu);

+                break;

+            case 4:         /* FSUB ST0, float */

+                GETED(0);

+                if(!(((uintptr_t)ED)&3))

+                    ST0.d -= *(float*)ED;

+                else {

+                    memcpy(&f, ED, sizeof(float));

+                    ST0.d -= f;

+                }

+                break;

+            case 5:         /* FSUBR ST0, float */

+                GETED(0);

+                if(!(((uintptr_t)ED)&3))

+                    ST0.d = *(float*)ED - ST0.d;

+                else {

+                    memcpy(&f, ED, sizeof(float));

+                    ST0.d = f - ST0.d;

+                }

+                break;

+            case 6:         /* FDIV ST0, float */

+                GETED(0);

+                if(!(((uintptr_t)ED)&3))

+                    ST0.d /= *(float*)ED;

+                else {

+                    memcpy(&f, ED, sizeof(float));

+                    ST0.d /= f;

+                }

+                break;

+            case 7:         /* FDIVR ST0, float */

+                GETED(0);

+                if(!(((uintptr_t)ED)&3))

+                    ST0.d = *(float*)ED / ST0.d;

+                else {

+                    memcpy(&f, ED, sizeof(float));

+                    ST0.d = f / ST0.d;

+                }

+                break;

+            default:

+                return 1;

+        }

+    }

+   return 0;

+}
\ No newline at end of file
diff --git a/src/emu/x64rundd.c b/src/emu/x64rundd.c
new file mode 100644
index 00000000..8c5228c9
--- /dev/null
+++ b/src/emu/x64rundd.c
@@ -0,0 +1,194 @@
+#define _GNU_SOURCE

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <math.h>

+#include <string.h>

+#include <signal.h>

+#include <sys/types.h>

+#include <unistd.h>

+

+#include "debug.h"

+#include "box64stack.h"

+#include "x64emu.h"

+#include "x64run.h"

+#include "x64emu_private.h"

+#include "x64run_private.h"

+#include "x64primop.h"

+#include "x64trace.h"

+#include "x87emu_private.h"

+#include "box64context.h"

+#include "bridge.h"

+#ifdef DYNAREC

+#include "../dynarec/arm_lock_helper.h"

+#endif

+

+#include "modrm.h"

+

+int RunDD(x64emu_t *emu, rex_t rex)

+{

+    uint8_t nextop;

+    reg64_t *oped;

+

+    nextop = F8;

+    switch (nextop) {

+    case 0xC0:  /* FFREE STx */

+    case 0xC1:

+    case 0xC2:

+    case 0xC3:

+    case 0xC4:

+    case 0xC5:

+    case 0xC6:

+    case 0xC7:

+        fpu_do_free(emu, nextop-0xC0);

+        break;

+

+    case 0xD0:  /* FST ST0, STx */

+    case 0xD1:

+    case 0xD2:

+    case 0xD3:

+    case 0xD4:

+    case 0xD5:

+    case 0xD6:

+    case 0xD7:

+        ST(nextop&7).q = ST0.q;

+        break;

+    case 0xD8:  /* FSTP ST0, STx */

+    case 0xD9:

+    case 0xDA:

+    case 0xDB:

+    case 0xDC:

+    case 0xDD:

+    case 0xDE:

+    case 0xDF:

+        ST(nextop&7).q = ST0.q;

+        fpu_do_pop(emu);

+        break;

+    case 0xE0:  /* FUCOM ST0, STx */

+    case 0xE1:

+    case 0xE2:

+    case 0xE3:

+    case 0xE4:

+    case 0xE5:

+    case 0xE6:

+    case 0xE7:

+        fpu_fcom(emu, ST(nextop&7).d);   // bad, should handle QNaN and IA interrupt

+        break;

+    case 0xE8:  /* FUCOMP ST0, STx */

+    case 0xE9:

+    case 0xEA:

+    case 0xEB:

+    case 0xEC:

+    case 0xED:

+    case 0xEE:

+    case 0xEF:

+        fpu_fcom(emu, ST(nextop&7).d);   // bad, should handle QNaN and IA interrupt

+        fpu_do_pop(emu);

+        break;

+

+    case 0xC8:

+    case 0xC9:

+    case 0xCA:

+    case 0xCB:

+    case 0xCC:

+    case 0xCD:

+    case 0xCE:

+    case 0xCF:

+    case 0xF0:

+    case 0xF1:

+    case 0xF2:

+    case 0xF3:

+    case 0xF4:

+    case 0xF5:

+    case 0xF6:

+    case 0xF7:

+    case 0xF8:

+    case 0xF9:

+    case 0xFA:

+    case 0xFB:

+    case 0xFC:

+    case 0xFD:

+    case 0xFE:

+    case 0xFF:

+        return 1;

+

+    default:

+        switch((nextop>>3)&7) {

+            case 0: /* FLD double */

+                GETED(0);

+                fpu_do_push(emu);

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

+                    ST0.d = *(double*)ED;

+                else {

+                    memcpy(&ST0.d, ED, sizeof(double));

+                }

+                break;

+            case 1: /* FISTTP ED qword */

+                GETED(0);

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

+                    *(int64_t*)ED = ST0.d;

+                else {

+                    int64_t i64 = ST0.d;

+                    memcpy(ED, &i64, sizeof(int64_t));

+                }

+                fpu_do_pop(emu);

+                break;

+            case 2: /* FST double */

+                GETED(0);

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

+                    *(double*)ED = ST0.d;

+                else {

+                    memcpy(ED, &ST0.d, sizeof(double));

+                }

+                break;

+            case 3: /* FSTP double */

+                GETED(0);

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

+                    *(double*)ED = ST0.d;

+                else {

+                    memcpy(ED, &ST0.d, sizeof(double));

+                }

+                fpu_do_pop(emu);

+                break;

+            #if 0

+            case 4: /* FRSTOR m108byte */

+                GETED(0);

+                fpu_loadenv(emu, (char*)ED, 0);

+                // get the STx

+                {

+                    char* p =(char*)ED;

+                    p += 28;

+                    for (int i=0; i<8; ++i) {

+                        LD2D(p, &ST(i).d);

+                        p+=10;

+                    }

+                }

+                break;

+            case 6: /* FNSAVE m108byte */

+                GETED(0);

+                // ENV first...

+                // warning, incomplete

+                fpu_savenv(emu, (char*)ED, 0);

+                // save the STx

+                {

+                    char* p =(char*)ED;

+                    p += 28;

+                    for (int i=0; i<8; ++i) {

+                        D2LD(&ST(i).d, p);

+                        p+=10;

+                    }

+                }

+                reset_fpu(emu);

+                break;

+            #endif

+            case 7: /* FNSTSW m2byte */

+                GETED(0);

+                emu->sw.f.F87_TOP = emu->top&7;

+                *(uint16_t*)ED = emu->sw.x16;

+                break;

+            default:

+                return 1;

+        }

+    }

+   return 0;

+}
\ No newline at end of file
diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c
index 711f0785..d3fd0508 100644
--- a/src/emu/x64runf30f.c
+++ b/src/emu/x64runf30f.c
@@ -106,6 +106,13 @@ int RunF30F(x64emu_t *emu, rex_t rex)
         GX->q[0] = EX->q[0];

         GX->q[1] = 0;

         break;

+    case 0x7F:  /* MOVDQU Ex, Gx */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        memcpy(EX, GX, 16);    // unaligned...

+        break;

+

 

     default:

         return 1;