about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-06 16:37:02 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-06 16:37:02 +0200
commitd07036b8ec693bb85bd74bd81703931a85b13a50 (patch)
tree9a9fa9f5a604fe5924b847a81cc06c231b90a93b /src
parentcb73eaf7768cd765cb242bb4526c9ce998e4d82d (diff)
downloadbox64-d07036b8ec693bb85bd74bd81703931a85b13a50.tar.gz
box64-d07036b8ec693bb85bd74bd81703931a85b13a50.zip
Added 0F D7 opcode ([DYNAREC] too) (for #32)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_0f.c18
-rw-r--r--src/emu/x64run0f.c9
2 files changed, 26 insertions, 1 deletions
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c
index 3d77c257..2ea941ff 100755
--- a/src/dynarec/dynarec_arm64_0f.c
+++ b/src/dynarec/dynarec_arm64_0f.c
@@ -88,7 +88,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     MAYUSE(d1);

     MAYUSE(s0);

     MAYUSE(j64);

-    #if 0//STEP == 3

+    #if STEP > 1

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

     #endif

 

@@ -1622,6 +1622,22 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             VMUL_16(q0, q0, q1);

             break;

 

+        case 0xD7:

+            nextop = F8;

+            INST_NAME("PMOVMSKB Gd, Em");

+            v0 = fpu_get_scratch(dyn);

+            v1 = fpu_get_scratch(dyn);

+            q1 = fpu_get_scratch(dyn);

+            GETEM(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);

+            break;        

         case 0xD8:

             INST_NAME("PSUBUSB Gm, Em");

             nextop = F8;

diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 8bb36279..89c005a1 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -1283,6 +1283,15 @@ int Run0F(x64emu_t *emu, rex_t rex)
             }

             break;

 

+        case 0xD7:                   /* PMOVMSKB Gd,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGD;

+            GD->dword[0] = 0;

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

+                if(EM->ub[i]&0x80)

+                    GD->dword[0] |= (1<<i);

+            break;

         case 0xD8:                   /* PSUBUSB Gm,Em */

             nextop = F8;

             GETEM(0);