about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-26 15:43:38 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-26 15:43:38 +0100
commit451cfa521bb8961ad12108bad4395b9548c38ecc (patch)
treee4ab0cc2aee65258257d5bb4bf5f7849d13d40a7 /src
parent6d02f7f8979e4b5611969f6922016dc44714d748 (diff)
downloadbox64-451cfa521bb8961ad12108bad4395b9548c38ecc.tar.gz
box64-451cfa521bb8961ad12108bad4395b9548c38ecc.zip
Added DC opcodes
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64run.c9
-rwxr-xr-xsrc/emu/x64run_private.h1
-rw-r--r--src/emu/x64rundc.c146
3 files changed, 155 insertions, 1 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 629bfe71..b23375fe 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -1085,7 +1085,14 @@ x64emurun:
             if(emu->quit)
                 goto fini;
             break;
-
+        case 0xDC:                      /* x87 opcodes */
+            if(RunDC(emu, rex)) {
+                unimp = 1;
+                goto fini;
+            }
+            if(emu->quit)
+                goto fini;
+            break;
         case 0xDD:                      /* x87 opcodes */
             if(RunDD(emu, rex)) {
                 unimp = 1;
diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index e2608c81..e3b3bbea 100755
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -109,6 +109,7 @@ int RunD8(x64emu_t *emu, rex_t rex);
 int RunD9(x64emu_t *emu, rex_t rex);
 int RunDA(x64emu_t *emu, rex_t rex);
 int RunDB(x64emu_t *emu, rex_t rex);
+int RunDC(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);
diff --git a/src/emu/x64rundc.c b/src/emu/x64rundc.c
new file mode 100644
index 00000000..da5b0fd9
--- /dev/null
+++ b/src/emu/x64rundc.c
@@ -0,0 +1,146 @@
+#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"
+
+#include "modrm.h"
+
+int RunDC(x64emu_t *emu, rex_t rex)
+{
+    uint8_t nextop;
+    reg64_t *oped;
+
+    nextop = F8;
+    switch(nextop) {
+        case 0xC0:
+        case 0xC1:
+        case 0xC2:
+        case 0xC3:
+        case 0xC4:
+        case 0xC5:
+        case 0xC6:
+        case 0xC7:  /* FADD */
+            ST(nextop&7).d += ST0.d;
+            break;
+        case 0xC8:
+        case 0xC9:
+        case 0xCA:
+        case 0xCB:
+        case 0xCC:
+        case 0xCD:
+        case 0xCE:
+        case 0xCF:  /* FMUL */
+            ST(nextop&7).d *= ST0.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);  // TODO: is this ok?
+            fpu_do_pop(emu);
+            break;
+        case 0xE0:
+        case 0xE1:
+        case 0xE2:
+        case 0xE3:
+        case 0xE4:
+        case 0xE5:
+        case 0xE6:
+        case 0xE7:  /* FSUBR */
+            ST(nextop&7).d = ST0.d -ST(nextop&7).d;
+            break;
+        case 0xE8:
+        case 0xE9:
+        case 0xEA:
+        case 0xEB:
+        case 0xEC:
+        case 0xED:
+        case 0xEE:
+        case 0xEF:  /* FSUB */
+            ST(nextop&7).d -= ST0.d;
+            break;
+        case 0xF0:
+        case 0xF1:
+        case 0xF2:
+        case 0xF3:
+        case 0xF4:
+        case 0xF5:
+        case 0xF6:
+        case 0xF7:  /* FDIVR */
+            ST(nextop&7).d = ST0.d / ST(nextop&7).d;
+            break;
+        case 0xF8:
+        case 0xF9:
+        case 0xFA:
+        case 0xFB:
+        case 0xFC:
+        case 0xFD:
+        case 0xFE:
+        case 0xFF:  /* FDIV */
+            ST(nextop&7).d /=  ST0.d;
+            break;
+        default:
+            GETED(0);
+            switch((nextop>>3)&7) {
+            case 0:         /* FADD ST0, double */
+                ST0.d += *(double*)ED;
+                break;
+            case 1:         /* FMUL ST0, double */
+                ST0.d *= *(double*)ED;
+                break;
+            case 2:      /* FCOM ST0, double */
+                fpu_fcom(emu, *(double*)ED);
+                break;
+            case 3:     /* FCOMP ST0, double */
+                fpu_fcom(emu, *(double*)ED);
+                fpu_do_pop(emu);
+                break;
+            case 4:         /* FSUB ST0, double */
+                ST0.d -= *(double*)ED;
+                break;
+            case 5:         /* FSUBR ST0, double */
+                ST0.d = *(double*)ED - ST0.d;
+                break;
+            case 6:         /* FDIV ST0, double */
+                ST0.d /= *(double*)ED;
+                break;
+            case 7:         /* FDIVR ST0, double */
+                ST0.d = *(double*)ED / ST0.d;
+                break;
+           default:
+                return 1;
+        }
+    }
+  return 0;
+}
\ No newline at end of file