about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-23 17:58:31 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-23 17:58:31 +0100
commitde0718811e271b8971444fea68f2a04f3d9bca26 (patch)
tree7c9a0ac29c14b284acc256cba72166f8c941f163
parent12b9b1a6e920bb04587cd92fcd835ded37495108 (diff)
downloadbox64-de0718811e271b8971444fea68f2a04f3d9bca26.tar.gz
box64-de0718811e271b8971444fea68f2a04f3d9bca26.zip
[DYNAREC] Added 0F 5B opcode
-rwxr-xr-xsrc/dynarec/arm64_emitter.h8
-rwxr-xr-xsrc/dynarec/dynarec_arm64_0f.c15
2 files changed, 17 insertions, 6 deletions
diff --git a/src/dynarec/arm64_emitter.h b/src/dynarec/arm64_emitter.h
index 1baf2218..47ee286f 100755
--- a/src/dynarec/arm64_emitter.h
+++ b/src/dynarec/arm64_emitter.h
@@ -982,10 +982,10 @@
 #define SCVTFDD(Vd, Vn)             EMIT(SCVT_vector_scalar(0, 1, Vn, Vd))
 
 #define SCVTF_vector(Q, U, sz, Rn, Rd)      ((Q)<<30 | (U)<<29 | 0b01110<<24 | (sz)<<22 | 0b10000<<17 | 0b11101<<12 | 0b10<<10 | (Rn)<<5 | (Rd))
-#define SCVTFS(Vd, Vn)              EMIT(SCVTF_vector(0, 0, 0, Vn, VD))
-#define SCVTFD(Vd, Vn)              EMIT(SCVTF_vector(0, 0, 1, Vn, VD))
-#define SCVTQFS(Vd, Vn)             EMIT(SCVTF_vector(1, 0, 0, Vn, VD))
-#define SCVTQFD(Vd, Vn)             EMIT(SCVTF_vector(1, 0, 1, Vn, VD))
+#define SCVTFS(Vd, Vn)              EMIT(SCVTF_vector(0, 0, 0, Vn, Vd))
+#define SCVTFD(Vd, Vn)              EMIT(SCVTF_vector(0, 0, 1, Vn, Vd))
+#define SCVTQFS(Vd, Vn)             EMIT(SCVTF_vector(1, 0, 0, Vn, Vd))
+#define SCVTQFD(Vd, Vn)             EMIT(SCVTF_vector(1, 0, 1, Vn, Vd))
 
 // FMAX / FMIN
 #define FMINMAX_vector(Q, U, o1, sz, Rm, Rn, Rd)    ((Q)<<30 | (U)<<29 | 0b01110<<24 | (o1)<<23 | (sz)<<22 | 0b1<<21 | (Rm)<<16 | 0b11110<<11 | 1<<10 | (Rn)<<5 | (Rd))
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c
index 7d3c9afc..8905878f 100755
--- a/src/dynarec/dynarec_arm64_0f.c
+++ b/src/dynarec/dynarec_arm64_0f.c
@@ -24,10 +24,14 @@
 #include "dynarec_arm64_functions.h"

 #include "dynarec_arm64_helper.h"

 

-#define GETGX(a)    \

-    gd = ((nextop&0x38)>>3)+(rex.r<<3);  \

+#define GETGX(a)                        \

+    gd = ((nextop&0x38)>>3)+(rex.r<<3); \

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

 

+#define GETGX_empty(a)                          \

+    gd = ((nextop&0x38)>>3)+(rex.r<<3);         \

+    a = sse_get_reg_empty(dyn, ninst, x1, gd)

+

 #define GETEX(a, D)                                             \

     if(MODREG) {                                                \

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

@@ -265,6 +269,13 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             d0 = fpu_get_scratch(dyn);

             FCVTL(q1, q0);

             break;

+        case 0x5B:

+            INST_NAME("CVTDQ2PS Gx, Ex");

+            nextop = F8;

+            GETEX(q0, 0);

+            GETGX_empty(q1);

+            SCVTQFS(q1, q0);

+            break;

 

         #define GO(GETFLAGS, NO, YES, F)   \

             READFLAGS(F);   \