about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-04-24 14:37:37 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-04-24 14:37:37 +0200
commit52e125e35a8c6831d628bb30c40221650d976044 (patch)
treed48f7ddc91f340e231d492a2dafcc9180b91254a /src
parent57bea35004fcd5d0a453964ce61b5807223ab66d (diff)
downloadbox64-52e125e35a8c6831d628bb30c40221650d976044.tar.gz
box64-52e125e35a8c6831d628bb30c40221650d976044.zip
Added 66 F0 83 opcode
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run66.c3
-rw-r--r--src/emu/x64run66f0.c131
-rwxr-xr-xsrc/emu/x64run_private.h1
3 files changed, 135 insertions, 0 deletions
diff --git a/src/emu/x64run66.c b/src/emu/x64run66.c
index 689897ce..0e1f4bac 100644
--- a/src/emu/x64run66.c
+++ b/src/emu/x64run66.c
@@ -557,6 +557,9 @@ int Run66(x64emu_t *emu, rex_t rex, int rep)
         R_RIP += tmp32s;

         break;

 

+    case 0xF0:                              /* LOCK: */

+        return Run66F0(emu, rex);

+

     case 0xF7:                      /* GRP3 Ew(,Iw) */

         nextop = F8;

         tmp8u = (nextop>>3)&7;

diff --git a/src/emu/x64run66f0.c b/src/emu/x64run66f0.c
new file mode 100644
index 00000000..f583bee8
--- /dev/null
+++ b/src/emu/x64run66f0.c
@@ -0,0 +1,131 @@
+#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 Run66F0(x64emu_t *emu, rex_t rex)
+{
+    uint8_t opcode;
+    uint8_t nextop;
+    uint16_t tmp16u, tmp16u2;
+    int64_t tmp64s;
+    uint64_t tmp64u, tmp64u2;
+    reg64_t *oped, *opgd;
+    uintptr_t tlsdata = GetFSBaseEmu(emu);
+
+    opcode = F8;
+    // REX prefix before the F0 are ignored
+    rex.rex = 0;
+    while(opcode>=0x40 && opcode<=0x4f) {
+        rex.rex = opcode;
+        opcode = F8;
+    }
+
+    switch(opcode) {
+
+        case 0x83:              /* GRP Ed,Ib */
+            nextop = F8;
+            GETED(1);
+            tmp64s = F8S;
+            tmp64u = (uint64_t)tmp64s;
+#ifdef DYNAREC
+            if(rex.w) {
+                switch((nextop>>3)&7) {
+                    case 0: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = add64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break;
+                    case 1: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 =  or64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break;
+                    case 2: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = adc64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break;
+                    case 3: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = sbb64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break;
+                    case 4: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = and64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break;
+                    case 5: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = sub64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break;
+                    case 6: do { tmp64u2 = arm64_lock_read_dd(ED); tmp64u2 = xor64(emu, tmp64u2, tmp64u);} while(arm64_lock_write_dd(ED, tmp64u2)); break;
+                    case 7:                cmp64(emu, ED->q[0], tmp64u); break;
+                }
+            } else {
+                if(MODREG)
+                    switch((nextop>>3)&7) {
+                        case 0: ED->word[0] = add16(emu, ED->word[0], tmp64u); break;
+                        case 1: ED->word[0] =  or16(emu, ED->word[0], tmp64u); break;
+                        case 2: ED->word[0] = adc16(emu, ED->word[0], tmp64u); break;
+                        case 3: ED->word[0] = sbb16(emu, ED->word[0], tmp64u); break;
+                        case 4: ED->word[0] = and16(emu, ED->word[0], tmp64u); break;
+                        case 5: ED->word[0] = sub16(emu, ED->word[0], tmp64u); break;
+                        case 6: ED->word[0] = xor16(emu, ED->word[0], tmp64u); break;
+                        case 7:            cmp16(emu, ED->word[0], tmp64u); break;
+                    }
+                else
+                    switch((nextop>>3)&7) {
+                        case 0: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = add16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break;
+                        case 1: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 =  or16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break;
+                        case 2: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = adc16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break;
+                        case 3: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = sbb16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break;
+                        case 4: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = and16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break;
+                        case 5: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = sub16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break;
+                        case 6: do { tmp16u2 = arm64_lock_read_h(ED); tmp16u2 = xor16(emu, tmp16u2, tmp64u);} while(arm64_lock_write_h(ED, tmp16u2)); break;
+                        case 7:                                                 cmp16(emu, ED->word[0], tmp64u); break;
+                    }
+            }
+#else
+            pthread_mutex_lock(&emu->context->mutex_lock);
+            if(rex.w) {
+                switch((nextop>>3)&7) {
+                    case 0: ED->q[0] = add64(emu, ED->q[0], tmp64u); break;
+                    case 1: ED->q[0] =  or64(emu, ED->q[0], tmp64u); break;
+                    case 2: ED->q[0] = adc64(emu, ED->q[0], tmp64u); break;
+                    case 3: ED->q[0] = sbb64(emu, ED->q[0], tmp64u); break;
+                    case 4: ED->q[0] = and64(emu, ED->q[0], tmp64u); break;
+                    case 5: ED->q[0] = sub64(emu, ED->q[0], tmp64u); break;
+                    case 6: ED->q[0] = xor64(emu, ED->q[0], tmp64u); break;
+                    case 7:            cmp64(emu, ED->q[0], tmp64u); break;
+                }
+            } else {
+                if((nextop&0xC0)==0xC0)
+                    switch((nextop>>3)&7) {
+                        case 0: ED->word[0] = add16(emu, ED->word[0], tmp64u); break;
+                        case 1: ED->word[0] =  or16(emu, ED->word[0], tmp64u); break;
+                        case 2: ED->word[0] = adc16(emu, ED->word[0], tmp64u); break;
+                        case 3: ED->word[0] = sbb16(emu, ED->word[0], tmp64u); break;
+                        case 4: ED->word[0] = and16(emu, ED->word[0], tmp64u); break;
+                        case 5: ED->word[0] = sub16(emu, ED->word[0], tmp64u); break;
+                        case 6: ED->word[0] = xor16(emu, ED->word[0], tmp64u); break;
+                        case 7:               cmp16(emu, ED->word[0], tmp64u); break;
+                    }
+                else
+                    switch((nextop>>3)&7) {
+                        case 0: ED->word[0] = add16(emu, ED->word[0], tmp64u); break;
+                        case 1: ED->word[0] =  or16(emu, ED->word[0], tmp64u); break;
+                        case 2: ED->word[0] = adc16(emu, ED->word[0], tmp64u); break;
+                        case 3: ED->word[0] = sbb16(emu, ED->word[0], tmp64u); break;
+                        case 4: ED->word[0] = and16(emu, ED->word[0], tmp64u); break;
+                        case 5: ED->word[0] = sub16(emu, ED->word[0], tmp64u); break;
+                        case 6: ED->word[0] = xor16(emu, ED->word[0], tmp64u); break;
+                        case 7:               cmp16(emu, ED->word[0], tmp64u); break;
+                    }
+            }
+            pthread_mutex_unlock(&emu->context->mutex_lock);
+#endif
+            break;
+
+       default:
+            return 1;
+    }
+    return 0;
+}
\ No newline at end of file
diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index 525771f2..7f4089fc 100755
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -108,6 +108,7 @@ int Run660F(x64emu_t *emu, rex_t rex);
 int Run6664(x64emu_t *emu, rex_t rex);
 int Run66D9(x64emu_t *emu, rex_t rex);
 int Run66DD(x64emu_t *emu, rex_t rex);
+int Run66F0(x64emu_t *emu, rex_t rex);
 int Run67(x64emu_t *emu, rex_t rex, int rep);
 int Run670F(x64emu_t *emu, rex_t rex, int rep);
 int Run6766(x64emu_t *emu, rex_t rex, int rep);