about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-26 17:48:51 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-26 17:48:51 +0100
commit2a85ea9c6111920c3d1d7be2c237596119b39933 (patch)
tree9ac44609aecc8efe4d3e3a7d67ee9f452742f3c8 /src
parent3ee5c792d154bf17fdf8706cca2c60c16de00c0f (diff)
downloadbox64-2a85ea9c6111920c3d1d7be2c237596119b39933.tar.gz
box64-2a85ea9c6111920c3d1d7be2c237596119b39933.zip
Added 64 66 0F D6 and 64 0F 29 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/modrm.h1
-rw-r--r--src/emu/x64run64.c49
-rwxr-xr-xsrc/emu/x64run_private.c8
-rwxr-xr-xsrc/emu/x64run_private.h1
4 files changed, 59 insertions, 0 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h
index f799bdfb..cf4a2039 100644
--- a/src/emu/modrm.h
+++ b/src/emu/modrm.h
@@ -24,6 +24,7 @@
 #define GETEW_OFFS(D, O)    oped=GetEdO(emu, rex, nextop, D, O)

 #define GETGW               opgd=GetGw(emu, rex, nextop)

 #define GETEX(D)            opex=GetEx(emu, rex, nextop, D)

+#define GETEX_OFFS(D, O)    opex=GetExO(emu, rex, nextop, D, O)

 #define GETGX               opgx=GetGx(emu, rex, nextop)

 #define GETEM(D)            opem=GetEm(emu, rex, nextop, D)

 #define GETGM               opgm=GetGm(emu, rex, nextop)

diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c
index efc90e75..003c65c3 100644
--- a/src/emu/x64run64.c
+++ b/src/emu/x64run64.c
@@ -33,6 +33,7 @@ int Run64(x64emu_t *emu, rex_t rex)
     uint32_t tmp32u;

     uint64_t tmp64u;

     reg64_t *oped, *opgd;

+    sse_regs_t *opex, *opgx;

     uintptr_t tlsdata = GetFSBaseEmu(emu);

 

     opcode = F8;

@@ -45,6 +46,23 @@ int Run64(x64emu_t *emu, rex_t rex)
 

     switch(opcode) {

 

+        case 0x0F:

+            opcode = F8;

+            switch(opcode) {

+

+                case 0x29:                      /* MOVAPS Ex,Gx */

+                    nextop = F8;

+                    GETEX_OFFS(0, tlsdata);

+                    GETGX;

+                    EX->q[0] = GX->q[0];

+                    EX->q[1] = GX->q[1];

+                    break;

+

+                default:

+                    return 1;

+            }

+            break;

+

         case 0x33:              /* XOR Gd,Ed */

             nextop = F8;

             GETED_OFFS(0, tlsdata);

@@ -54,6 +72,37 @@ int Run64(x64emu_t *emu, rex_t rex)
             else

                 GD->q[0] = xor32(emu, GD->dword[0], ED->dword[0]);

             break;

+        

+        case 0x66:

+            opcode = F8;

+

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

+                rex.rex = opcode;

+                opcode = F8;

+            }

+            switch(opcode) {

+                case 0x0F:

+                    opcode = F8;

+                    switch(opcode) {

+                        case 0xD6:                      /* MOVQ Ex,Gx */

+                            nextop = F8;

+                            GETEX_OFFS(0, tlsdata);

+                            GETGX;

+                            EX->q[0] = GX->q[0];

+                            if(MODREG)

+                                EX->q[1] = 0;

+                            break;

+

+                        default:

+                            return 1;

+                    }

+                    break;

+

+                default:

+                    return 1;

+            }

+            break;

+

 

         case 0x81:                      /* GRP Ed,Id */

         case 0x83:                      /* GRP Ed,Ib */

diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 1ac3eec2..3b6691e6 100755
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -1229,6 +1229,14 @@ sse_regs_t* GetEx(x64emu_t *emu, rex_t rex, uint8_t v, uint8_t delta)
     } else return (sse_regs_t*)GetECommon(emu, rex, m, delta);
 }
 
+sse_regs_t* GetExO(x64emu_t *emu, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset)
+{
+    uint8_t m = v&0xC7;    // filter Ed
+    if(m>=0xC0) {
+         return &emu->xmm[(m&0x07)+(rex.b<<3)];
+    } else return (sse_regs_t*)GetECommonO(emu, rex, m, delta, offset);
+}
+
 
 reg64_t* GetGd(x64emu_t *emu, rex_t rex, uint8_t v)
 {
diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index a027e398..49b8ff1a 100755
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -86,6 +86,7 @@ reg64_t* GetEw16(x64emu_t *emu, rex_t rex, uint8_t v);
 reg64_t* GetEw16off(x64emu_t *emu, rex_t rex, uint8_t v, uintptr_t offset);
 mmx87_regs_t* GetEm(x64emu_t *emu, rex_t rex, uint8_t v, uint8_t delta);
 sse_regs_t* GetEx(x64emu_t *emu, rex_t rex, uint8_t v, uint8_t delta);
+sse_regs_t* GetExO(x64emu_t *emu, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset);
 reg64_t* GetGd(x64emu_t *emu, rex_t rex, uint8_t v);
 #define GetGw GetGd
 reg64_t* GetGb(x64emu_t *emu, rex_t rex, uint8_t v);