about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-06-22 15:06:12 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-06-22 15:06:12 +0200
commite78cd0d62378c6de1bdc539626e0b27485b3c20f (patch)
treedc4e78a8a14f5f47c9606e36b11f5d199c64afa7 /src
parent6eb72b71b194ba9758ddda9d5644d272fec4ae5d (diff)
downloadbox64-e78cd0d62378c6de1bdc539626e0b27485b3c20f.tar.gz
box64-e78cd0d62378c6de1bdc539626e0b27485b3c20f.zip
[32BITS] Separate RUn67 32bits from 64bits version, as they are too differents
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run67.c62
-rw-r--r--src/emu/x64run67_32.c85
-rwxr-xr-xsrc/emu/x64run_private.h2
3 files changed, 106 insertions, 43 deletions
diff --git a/src/emu/x64run67.c b/src/emu/x64run67.c
index c18f867f..98d2df62 100644
--- a/src/emu/x64run67.c
+++ b/src/emu/x64run67.c
@@ -41,16 +41,18 @@ uintptr_t Run67(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
     #endif

     opcode = F8;

 

+    if(rex.is32bits)

+        return Run67_32(emu, rex, rep, addr);

+

     while(opcode==0x67)

         opcode = F8;

 

     // REX prefix before the 67 are ignored

     rex.rex = 0;

-    if(!rex.is32bits)

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

-            rex.rex = opcode;

-            opcode = F8;

-        }

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

+        rex.rex = opcode;

+        opcode = F8;

+    }

     while((opcode==0xF2) || (opcode==0xF3)) {

         rep = opcode-0xF1;

         opcode = F8;

@@ -337,58 +339,32 @@ uintptr_t Run67(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
     case 0xE0:                      /* LOOPNZ */

         CHECK_FLAGS(emu);

         tmp8s = F8S;

-        if(rex.is32bits) {

-            --R_CX; // don't update flags

-            if(R_CX && !ACCESS_FLAG(F_ZF))

-                addr += tmp8s;

-        } else {

-            --R_ECX; // don't update flags

-            if(R_ECX && !ACCESS_FLAG(F_ZF))

-                addr += tmp8s;

-        }

+        --R_ECX; // don't update flags

+        if(R_ECX && !ACCESS_FLAG(F_ZF))

+            addr += tmp8s;

         break;

     case 0xE1:                      /* LOOPZ */

         CHECK_FLAGS(emu);

         tmp8s = F8S;

-        if(rex.is32bits) {

-            --R_CX; // don't update flags

-            if(R_CX && ACCESS_FLAG(F_ZF))

-                addr += tmp8s;

-        } else {

-            --R_ECX; // don't update flags

-            if(R_ECX && ACCESS_FLAG(F_ZF))

-                addr += tmp8s;

-        }

+        --R_ECX; // don't update flags

+        if(R_ECX && ACCESS_FLAG(F_ZF))

+            addr += tmp8s;

         break;

     case 0xE2:                      /* LOOP */

         tmp8s = F8S;

-        if(rex.is32bits) {

-            --R_CX; // don't update flags

-            if(R_CX)

-                addr += tmp8s;

-        } else {

-            --R_ECX; // don't update flags

-            if(R_ECX)

-                addr += tmp8s;

-        }

+        --R_ECX; // don't update flags

+        if(R_ECX)

+            addr += tmp8s;

         break;

     case 0xE3:              /* JECXZ Ib */

         tmp8s = F8S;

-        if(rex.is32bits) {

-            if(!R_CX)

-                addr += tmp8s;

-        } else {

-            if(!R_ECX)

-                addr += tmp8s;

-        }

+        if(!R_ECX)

+            addr += tmp8s;

         break;

 

     case 0xE8:                      /* CALL Id */

         tmp32s = F32S; // call is relative

-        if(rex.is32bits)

-            Push32(emu, addr);

-        else

-            Push(emu, addr);

+        Push(emu, addr);

         addr += tmp32s;

         break;

 

diff --git a/src/emu/x64run67_32.c b/src/emu/x64run67_32.c
new file mode 100644
index 00000000..f0c704f3
--- /dev/null
+++ b/src/emu/x64run67_32.c
@@ -0,0 +1,85 @@
+#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"

+

+#ifdef TEST_INTERPRETER

+uintptr_t Test67_32(x64test_t *test, rex_t rex, int rep, uintptr_t addr)

+#else

+uintptr_t Run67_32(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)

+#endif

+{

+    uint8_t opcode;

+    uint8_t nextop;

+    int8_t tmp8s;

+    uint8_t tmp8u;

+    uint32_t tmp32u;

+    int32_t tmp32s;

+    uint64_t tmp64u;

+    reg64_t *oped, *opgd;

+    #ifdef TEST_INTERPRETER

+    x64emu_t* emu = test->emu;

+    #endif

+    opcode = F8;

+

+    while(opcode==0x67)

+        opcode = F8;

+

+    rex.rex = 0;

+    while((opcode==0xF2) || (opcode==0xF3)) {

+        rep = opcode-0xF1;

+        opcode = F8;

+    }

+

+    switch(opcode) {

+

+    case 0xE0:                      /* LOOPNZ */

+        CHECK_FLAGS(emu);

+        tmp8s = F8S;

+        --R_CX; // don't update flags

+        if(R_CX && !ACCESS_FLAG(F_ZF))

+            addr += tmp8s;

+        break;

+    case 0xE1:                      /* LOOPZ */

+        CHECK_FLAGS(emu);

+        tmp8s = F8S;

+        --R_CX; // don't update flags

+        if(R_CX && ACCESS_FLAG(F_ZF))

+            addr += tmp8s;

+        break;

+    case 0xE2:                      /* LOOP */

+        tmp8s = F8S;

+        --R_CX; // don't update flags

+        if(R_CX)

+            addr += tmp8s;

+        break;

+    case 0xE3:              /* JECXZ Ib */

+        tmp8s = F8S;

+        if(!R_CX)

+            addr += tmp8s;

+        break;

+

+    default:

+        return 0;

+    }

+    return addr;

+}
\ No newline at end of file
diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index 93f6c096..5b3b30f7 100755
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -107,6 +107,7 @@ uintptr_t Run66D9(x64emu_t *emu, rex_t rex, uintptr_t addr);
 uintptr_t Run66DD(x64emu_t *emu, rex_t rex, uintptr_t addr);
 uintptr_t Run66F0(x64emu_t *emu, rex_t rex, uintptr_t addr);
 uintptr_t Run67(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr);
+uintptr_t Run67_32(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr);
 uintptr_t Run670F(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr);
 uintptr_t Run6766(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr);
 uintptr_t Run67660F(x64emu_t *emu, rex_t rex, uintptr_t addr);
@@ -131,6 +132,7 @@ uintptr_t Test66D9(x64test_t *test, rex_t rex, uintptr_t addr);
 uintptr_t Test66DD(x64test_t *test, rex_t rex, uintptr_t addr);
 uintptr_t Test66F0(x64test_t *test, rex_t rex, uintptr_t addr);
 uintptr_t Test67(x64test_t *test, rex_t rex, int rep, uintptr_t addr);
+uintptr_t Test67_32(x64test_t *test, rex_t rex, int rep, uintptr_t addr);
 uintptr_t Test670F(x64test_t *test, rex_t rex, int rep, uintptr_t addr);
 uintptr_t Test6766(x64test_t *test, rex_t rex, int rep, uintptr_t addr);
 uintptr_t Test67660F(x64test_t *test, rex_t rex, uintptr_t addr);