about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-05 20:49:15 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-05 20:49:15 +0200
commitc1ee744205baf252c6ef764d5ade65789b70cc8e (patch)
tree27c717b168b3a421eba9100fac06c2e159c63460 /src
parentf21afb32771dbe9966966aab59e5f572bb333838 (diff)
downloadbox64-c1ee744205baf252c6ef764d5ade65789b70cc8e.tar.gz
box64-c1ee744205baf252c6ef764d5ade65789b70cc8e.zip
[DYNAREC] Added 66 0F D7 opcode (for CB15)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_660f.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/dynarec/dynarec_arm64_660f.c b/src/dynarec/dynarec_arm64_660f.c
index 577c3d2f..a2c6e083 100755
--- a/src/dynarec/dynarec_arm64_660f.c
+++ b/src/dynarec/dynarec_arm64_660f.c
@@ -66,7 +66,7 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
     MAYUSE(eb1);

     MAYUSE(eb2);

     MAYUSE(j64);

-    #if 0//STEP > 1

+    #if STEP > 1

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

     #endif

 

@@ -1262,7 +1262,33 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 VSTR64_U12(v0, ed, fixedaddress);

             }

             break;

-

+        case 0xD7:

+            nextop = F8;

+            if(MODREG) {

+                INST_NAME("PMOVMSKB Gd, Ex");

+                v0 = fpu_get_scratch(dyn);

+                v1 = fpu_get_scratch(dyn);

+                q1 = fpu_get_scratch(dyn);

+                GETEX(q0, 0);

+                GETGD;

+                TABLE64(x1, (uintptr_t)&mask_shift8);

+                VLDR64_U12(v0, x1, 0);     // load shift

+                MOVI_8(v1, 0x80);   // load mask

+                VAND(q1, v1, q0);

+                USHL_8(q1, q1, v0); // shift

+                UADDLV_8(q1, q1);   // accumalte

+                VMOVBto(gd, q1, 0);

+                // and now the high part

+                VMOVeD(q1, 0, q0, 1);

+                VAND(q1, v1, q1);  // keep highest bit

+                USHL_8(q1, q1, v0); // shift

+                UADDLV_8(q1, q1);   // accumalte

+                VMOVBto(x1, q1, 0);

+                BFIx(gd, x1, 8, 8);

+            } else {

+                DEFAULT;

+            }

+            break;        

         case 0xD8:

             INST_NAME("PSUBUSB Gx, Ex");

             nextop = F8;