about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-13 10:45:20 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-13 10:45:20 +0100
commit4ce40ad239b2d172f18f2c016db8251b9adc6223 (patch)
tree107418779051e86ba2b365e97509c94e41e77efb /src
parentca345d7f55135ac698106b8a9a835ddc8ea10d1b (diff)
downloadbox64-4ce40ad239b2d172f18f2c016db8251b9adc6223.tar.gz
box64-4ce40ad239b2d172f18f2c016db8251b9adc6223.zip
Added a few opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run64.c51
-rw-r--r--src/emu/x64run660f.c54
2 files changed, 105 insertions, 0 deletions
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c
index b0e70a0c..20c087ac 100644
--- a/src/emu/x64run64.c
+++ b/src/emu/x64run64.c
@@ -33,6 +33,9 @@ int Run64(x64emu_t *emu, rex_t rex)
     uint8_t tmp8u;

     int16_t tmp16s;

     uint16_t tmp16u;

+    int32_t tmp32s;

+    uint32_t tmp32u;

+    uint64_t tmp64u;

     reg64_t *oped, *opgd;

     uintptr_t tlsdata = GetFSBaseEmu(emu);

 

@@ -56,6 +59,54 @@ int Run64(x64emu_t *emu, rex_t rex)
                 GD->q[0] = xor32(emu, GD->dword[0], ED->dword[0]);

             break;

 

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

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

+            nextop = F8;

+            GETED_OFFS((opcode==0x81)?4:1, tlsdata);

+            if(opcode==0x81) {

+                tmp32s = F32S;

+            } else {

+                tmp32s = F8S;

+            }

+            if(rex.w) {

+                tmp64u = (uint64_t)tmp32s;

+                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 {

+                tmp32u = (uint32_t)tmp32s;

+                if(MODREG)

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

+                        case 0: ED->q[0] = add32(emu, ED->dword[0], tmp32u); break;

+                        case 1: ED->q[0] =  or32(emu, ED->dword[0], tmp32u); break;

+                        case 2: ED->q[0] = adc32(emu, ED->dword[0], tmp32u); break;

+                        case 3: ED->q[0] = sbb32(emu, ED->dword[0], tmp32u); break;

+                        case 4: ED->q[0] = and32(emu, ED->dword[0], tmp32u); break;

+                        case 5: ED->q[0] = sub32(emu, ED->dword[0], tmp32u); break;

+                        case 6: ED->q[0] = xor32(emu, ED->dword[0], tmp32u); break;

+                        case 7:            cmp32(emu, ED->dword[0], tmp32u); break;

+                    }

+                else

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

+                        case 0: ED->dword[0] = add32(emu, ED->dword[0], tmp32u); break;

+                        case 1: ED->dword[0] =  or32(emu, ED->dword[0], tmp32u); break;

+                        case 2: ED->dword[0] = adc32(emu, ED->dword[0], tmp32u); break;

+                        case 3: ED->dword[0] = sbb32(emu, ED->dword[0], tmp32u); break;

+                        case 4: ED->dword[0] = and32(emu, ED->dword[0], tmp32u); break;

+                        case 5: ED->dword[0] = sub32(emu, ED->dword[0], tmp32u); break;

+                        case 6: ED->dword[0] = xor32(emu, ED->dword[0], tmp32u); break;

+                        case 7:                cmp32(emu, ED->dword[0], tmp32u); break;

+                    }

+            }

+            break;

+

         case 0x88:                      /* MOV Eb,Gb */

             nextop = F8;

             GETEB_OFFS(0, tlsdata);

diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index b2e21c32..d23a9755 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -960,6 +960,60 @@ int Run660F(x64emu_t *emu, rex_t rex)
             {tmp8u=EX->q[0]; for (int i=0; i<2; ++i) GX->q[i] <<= tmp8u;}

         break;

 

+    case 0xF8:  /* PSUBB Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        for(int i=0; i<16; ++i)

+            GX->sb[i] -= EX->sb[i];

+        break;

+    case 0xF9:  /* PSUBW Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

+            GX->sw[i] -= EX->sw[i];

+        break;

+    case 0xFA:  /* PSUBD Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

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

+        GX->sd[2] -= EX->sd[2];

+        GX->sd[3] -= EX->sd[3];

+        break;

+    case 0xFB:  /* PSUBQ Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

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

+        break;

+    case 0xFC:  /* PADDB Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        for(int i=0; i<16; ++i)

+            GX->sb[i] += EX->sb[i];

+        break;

+    case 0xFD:  /* PADDW Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

+            GX->sw[i] += EX->sw[i];

+        break;

+    case 0xFE:  /* PADDD Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

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

+        GX->sd[2] += EX->sd[2];

+        GX->sd[3] += EX->sd[3];

+        break;

+    

     default:

         return 1;

     }