about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-05-17 20:42:36 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-05-17 20:42:36 +0200
commit727178df574fab93a029c608e022fbbd5fc5a4a3 (patch)
tree205af8db7bf9afedf9d931f2cbd4957dfaa3afc2
parent66b3303f2218fb9711e52148b0a6e2bfd680bc50 (diff)
downloadbox64-727178df574fab93a029c608e022fbbd5fc5a4a3.tar.gz
box64-727178df574fab93a029c608e022fbbd5fc5a4a3.zip
[DYNAREC] Added 0F 50/52/53 opcodes
-rwxr-xr-xsrc/dynarec/dynarec_arm64_0f.c65
1 files changed, 63 insertions, 2 deletions
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c
index 2e41435f..3df73d30 100755
--- a/src/dynarec/dynarec_arm64_0f.c
+++ b/src/dynarec/dynarec_arm64_0f.c
@@ -347,7 +347,39 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
 

         GOCOND(0x40, "CMOV", "Gd, Ed");

         #undef GO

-        

+        case 0x50:

+            INST_NAME("MOVMSPKPS Gd, Ex");

+            nextop = F8;

+            GETGD;

+            MOV32w(gd, 0);

+            if((nextop&0xC0)==0xC0) {

+                // EX is an xmm reg

+                GETEX(q0, 0);

+                VMOVQDto(x1, q0, 0);

+                LSRx(x1, x1, 31);

+                BFIx(gd, x1, 0, 1);

+                LSRx(x1, x1, 32);

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

+                VMOVQDto(x1, q0, 1);

+                LSRx(x1, x1, 31);

+                BFIx(gd, x1, 2, 1);

+                LSRx(x1, x1, 32);

+                BFIx(gd, x1, 3, 1);

+            } else {

+                // EX is memory

+                addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, (0xfff<<3)-8, 7, rex, 0, 0);

+                LDRx_U12(x1, ed, fixedaddress+0);

+                LSRx(x1, x1, 31);

+                BFIx(gd, x1, 0, 1);

+                LSRx(x1, x1, 32);

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

+                LDRx_U12(x1, ed, fixedaddress+8);

+                LSRx(x1, x1, 31);

+                BFIx(gd, x1, 2, 1);

+                LSRx(x1, x1, 32);

+                BFIx(gd, x1, 3, 1);

+            }

+            break;

         case 0x51:

             INST_NAME("SQRTPS Gx, Ex");

             nextop = F8;

@@ -355,7 +387,36 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             GETGX_empty(v0);

             VFSQRTQS(v0, q0);

             break;

-

+        case 0x52:

+            INST_NAME("RSQRTPS Gx, Ex");

+            nextop = F8;

+            GETEX(q0, 0);

+            GETGX_empty(q1);

+            v0 = fpu_get_scratch(dyn);

+            // more precise

+            if(q1==q0)

+                v1 = fpu_get_scratch(dyn);

+            else 

+                v1 = q1;

+            VFRSQRTEQS(v0, q0);

+            VFMULQS(v1, v0, q0);

+            VFRSQRTSQS(v1, v1, v0);

+            VFMULQS(q1, v1, v0);

+            break;

+        case 0x53:

+            INST_NAME("RCPPS Gx, Ex");

+            nextop = F8;

+            GETEX(q0, 0);

+            GETGX_empty(q1);

+            if(q0 == q1)

+                v1 = fpu_get_scratch(dyn);

+            else

+                v1 = q1;

+            v0 = fpu_get_scratch(dyn);

+            VFRECPEQS(v0, q0);

+            VFRECPSQS(v1, v0, q0);

+            VFMULQS(q1, v0, v1);

+            break;

         case 0x54:

             INST_NAME("ANDPS Gx, Ex");

             nextop = F8;