about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-26 21:40:39 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-26 21:40:39 +0100
commit1a750182d625a80d4f89fa9f046a447f0cd50aed (patch)
tree35df9e016873a727a2dc40244f47ce758b90d5f9 /src
parent03a69053a63b73614b80543ad4bdb3d5a878c9fe (diff)
downloadbox64-1a750182d625a80d4f89fa9f046a447f0cd50aed.tar.gz
box64-1a750182d625a80d4f89fa9f046a447f0cd50aed.zip
[DYNAREC] Added some more 66 0F opcodes, plus a few small bug fixes
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_0f.c10
-rwxr-xr-xsrc/dynarec/dynarec_arm64_660f.c81
-rw-r--r--src/emu/x64run660f.c4
3 files changed, 86 insertions, 9 deletions
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c
index 6a9a8dff..d9857d42 100755
--- a/src/dynarec/dynarec_arm64_0f.c
+++ b/src/dynarec/dynarec_arm64_0f.c
@@ -39,7 +39,7 @@
     if(MODREG) {                                                \

         a = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3));   \

     } else {                                                    \

-        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, 0, 0); \

+        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, 0, D); \

         a = fpu_get_scratch(dyn);                               \

         VLDR128_U12(a, ed, fixedaddress);                       \

     }

@@ -639,7 +639,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         ed = xRAX+(nextop&7)+(rex.b<<3);

                         u8 = F8;

                     } else {

-                        addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 0);

+                        addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 1);

                         u8 = F8;

                         fixedaddress+=(u8>>(rex.w?6:5))*(rex.w?8:4);

                         LDRxw_U12(x1, wback, fixedaddress);

@@ -660,7 +660,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         u8 = F8;

                         wback = 0;

                     } else {

-                        addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 0);

+                        addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 1);

                         u8 = F8;

                         fixedaddress+=(u8>>(rex.w?6:5))*(rex.w?8:4);

                         LDRxw_U12(x1, wback, fixedaddress);

@@ -684,7 +684,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         u8 = F8;

                         wback = 0;

                     } else {

-                        addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 0);

+                        addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 1);

                         u8 = F8;

                         fixedaddress+=(u8>>(rex.w?6:5))*(rex.w?8:4);

                         LDRxw_U12(x1, wback, fixedaddress);

@@ -708,7 +708,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         u8 = F8;

                         wback = 0;

                     } else {

-                        addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 0);

+                        addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 1);

                         u8 = F8;

                         fixedaddress+=(u8>>(rex.w?6:5))*(rex.w?8:4);

                         LDRxw_U12(x1, wback, fixedaddress);

diff --git a/src/dynarec/dynarec_arm64_660f.c b/src/dynarec/dynarec_arm64_660f.c
index c35f0224..6fce1a6f 100755
--- a/src/dynarec/dynarec_arm64_660f.c
+++ b/src/dynarec/dynarec_arm64_660f.c
@@ -61,13 +61,39 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
     MAYUSE(eb1);

     MAYUSE(eb2);

     MAYUSE(j32);

-    #if 0//STEP == 3

+    #if 0//STEP > 1

     static const int8_t mask_shift8[] = { -7, -6, -5, -4, -3, -2, -1, 0 };

     #endif

 

     switch(opcode) {

 

-

+        case 0x10:

+            INST_NAME("MOVUPD Gx,Ex");

+            nextop = F8;

+            GETG;

+            if(MODREG) {

+                v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3));

+                v0 = sse_get_reg_empty(dyn, ninst, x1, gd);

+                VMOVQ(v0, v1);

+            } else {

+                v0 = sse_get_reg_empty(dyn, ninst, x1, gd);

+                addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, 0, 0);

+                VLDR128_U12(v0, ed, fixedaddress);

+            }

+            break;

+        case 0x11:

+            INST_NAME("MOVUPD Ex,Gx");

+            nextop = F8;

+            GETG;

+            v0 = sse_get_reg(dyn, ninst, x1, gd);

+            if(MODREG) {

+                v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7)+(rex.b<<3));

+                VMOVQ(v1, v0);

+            } else {

+                addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, 0, 0);

+                VSTR128_U12(v0, ed, fixedaddress);

+            }

+            break;

         case 0x12:

             INST_NAME("MOVLPD Gx, Eq");

             nextop = F8;

@@ -628,6 +654,28 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             }

             break;

 

+        case 0x74:

+            INST_NAME("PCMPEQB Gx,Ex");

+            nextop = F8;

+            GETGX(v0);

+            GETEX(q0, 0);

+            VCMEQQ_8(v0, v0, q0);

+            break;

+        case 0x75:

+            INST_NAME("PCMPEQW Gx,Ex");

+            nextop = F8;

+            GETGX(v0);

+            GETEX(q0, 0);

+            VCMEQQ_16(v0, v0, q0);

+            break;

+        case 0x76:

+            INST_NAME("PCMPEQD Gx,Ex");

+            nextop = F8;

+            GETGX(v0);

+            GETEX(q0, 0);

+            VCMEQQ_32(v0, v0, q0);

+            break;

+

         case 0x7E:

             INST_NAME("MOVD Ed,Gx");

             nextop = F8;

@@ -829,6 +877,35 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             BFIx(gd, x1, 0, 16);

             break;

 

+        case 0xC4:

+            INST_NAME("PINSRW Gx,Ed,Ib");

+            nextop = F8;

+            GETGX(v0);

+            if(MODREG) {

+                u8 = (F8)&7;

+                ed = xRAX+(nextop&7)+(rex.b<<3);

+                VMOVHto(ed, v0, u8);

+            } else {

+                addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0, 0, rex, 0, 1);

+                u8 = (F8)&7;

+                VLD1_16(wback, v0, u8);

+            }

+            break;

+        case 0xC5:

+            INST_NAME("PEXTRW Gd,Ex,Ib");

+            nextop = F8;

+            GETG;

+            if(MODREG) {

+                GETEX(v0, 1);

+                u8 = (F8)&7;

+                VMOVQHfrom(v0, u8, gd);

+            } else {

+                addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0, 0, rex, 0, 1);

+                u8 = (F8)&7;

+                LDRH_U12(gd, wback, u8*2);

+            }

+            break;

+

 

         case 0xD4:

             INST_NAME("PADDQ Gx,Ex");

diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index a6d6acd5..7227f6f0 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -862,14 +862,14 @@ int Run660F(x64emu_t *emu, rex_t rex)
 

     case 0xC4:  /* PINSRW Gx,Ew,Ib */

         nextop = F8;

-        GETED(0);

+        GETED(1);

         GETGX;

         tmp8u = F8;

         GX->uw[tmp8u&7] = ED->word[0];   // only low 16bits

         break;

     case 0xC5:  /* PEXTRW Gw,Ex,Ib */

         nextop = F8;

-        GETEX(0);

+        GETEX(1);

         GETGD;

         tmp8u = F8;

         GD->dword[0] = EX->uw[tmp8u&7];  // 16bits extract, 0 extended