about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-31 16:55:08 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-03-31 16:55:08 +0200
commit74b70253b25328f171f11bd2776dadb553cefc84 (patch)
tree71efeae2480b918d2cfe0a6e014ab8eb234a8e05
parent0343ee119c07b2ac15162e20a92956ec0abeed99 (diff)
downloadbox64-74b70253b25328f171f11bd2776dadb553cefc84.tar.gz
box64-74b70253b25328f171f11bd2776dadb553cefc84.zip
[DYNAREC] Added 0F 60/61/62 opcodes
-rwxr-xr-xsrc/dynarec/dynarec_arm64_0f.c48
1 files changed, 36 insertions, 12 deletions
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c
index c93590e2..c528e99e 100755
--- a/src/dynarec/dynarec_arm64_0f.c
+++ b/src/dynarec/dynarec_arm64_0f.c
@@ -44,20 +44,22 @@
         VLDR128_U12(a, ed, fixedaddress);                       \

     }

 

-#define GETGM(a)            \

-    gd = ((nextop&0x38)>>3);  \

+#define GETGM(a)                        \

+    gd = ((nextop&0x38)>>3);            \

     a = mmx_get_reg(dyn, ninst, x1, gd)

-#define GETEM(a, D)    \

-    if(MODREG) {        \

-        a = mmx_get_reg(dyn, ninst, x1, (nextop&7)); \

+

+#define GETEM(a, D)                                 \

+    if(MODREG) {                                    \

+        a = mmx_get_reg(dyn, ninst, x1, (nextop&7));\

     } else {                                        \

-        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0); \

-        a = fpu_get_scratch_double(dyn); \

-        VLD1_64(a, ed);    \

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

+        a = fpu_get_scratch(dyn);                   \

+        VLDR64_U12(a, ed, fixedaddress);            \

     }

-#define PUTEM(a)    \

-    if(!MODREG) { \

-        VST1_64(a, ed);    \

+

+#define PUTEM(a)                            \

+    if(!MODREG) {                           \

+        VSTR64_U12(a, ed, fixedaddress);    \

     }

 

 uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)

@@ -70,7 +72,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     uint8_t eb1, eb2;

     int v0, v1;

     int q0, q1;

-    int d0;

+    int d0, d1;

     int s0;

     int fixedaddress;

     MAYUSE(s0);

@@ -79,6 +81,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     MAYUSE(v0);

     MAYUSE(v1);

     MAYUSE(d0);

+    MAYUSE(d1);

     MAYUSE(eb2);

     MAYUSE(eb1);

     MAYUSE(wb2);

@@ -387,6 +390,27 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             GETEX(v1, 0);

             VFMAXQD(v0, v0, v1);

             break;

+        case 0x60:

+            INST_NAME("PUNPCKLBW Gm,Em");

+            nextop = F8;

+            GETGM(d0);

+            GETEM(d1, 0);

+            VZIP1_8(d0, d0, d1);

+            break;

+        case 0x61:

+            INST_NAME("PUNPCKLWD Gm,Em");

+            nextop = F8;

+            GETGM(d0);

+            GETEM(d1, 0);

+            VZIP1_16(d0, d0, d1);

+            break;

+        case 0x62:

+            INST_NAME("PUNPCKLDQ Gm,Em");

+            nextop = F8;

+            GETGM(d0);

+            GETEM(d1, 0);

+            VZIP1_32(d0, d0, d1);

+            break;

 

         case 0x6E:

             INST_NAME("MOVD Gm, Ed");