about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-22 16:14:59 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-22 16:14:59 +0100
commit735d9c107d5054019ef89367256a6df1a01edda7 (patch)
tree3629b0930f7528b7011435982dd817791fb0606f /src
parentdaf148c4d628fe52a94b3a020a951e0f29074277 (diff)
downloadbox64-735d9c107d5054019ef89367256a6df1a01edda7.tar.gz
box64-735d9c107d5054019ef89367256a6df1a01edda7.zip
[DYNAREC] Added F2 0F 5A opcode
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64_emitter.h4
-rwxr-xr-xsrc/dynarec/arm64_printer.c9
-rwxr-xr-xsrc/dynarec/dynarec_arm64_f20f.c9
3 files changed, 22 insertions, 0 deletions
diff --git a/src/dynarec/arm64_emitter.h b/src/dynarec/arm64_emitter.h
index 7313854a..4d39a2d3 100755
--- a/src/dynarec/arm64_emitter.h
+++ b/src/dynarec/arm64_emitter.h
@@ -843,6 +843,10 @@
 #define VFCVTZUQS(Vd, Vn)           EMIT(FCVT2_vector(1, 1, 1, 0, 1, Vn, Vd))
 #define VFCVTZUQD(Vd, Vn)           EMIT(FCVT2_vector(1, 1, 1, 1, 1, Vn, Vd))
 
+#define FCVT_precision(type, opc, Rn, Rd)   (0b11110<<24 | (type)<<22 | 1<<21 | 0b0001<<17 | (opc)<<15 | 0b10000<<10 | (Rn)<<5 | (Rd))
+#define FCVT_D_S(Dd, Sn)            EMIT(FCVT_precision(0b00, 0b01, Sn, Dd))
+#define FCVT_S_D(Sd, Dn)            EMIT(FCVT_precision(0b01, 0b00, Dn, Sd))
+
 #define SCVTF_scalar(sf, type, rmode, opcode, Rn, Rd)   ((sf)<<31 | 0b11110<<24 | (type)<<22 | 1<<21 | (rmode)<<19 | (opcode)<<16 | (Rn)<<5 | (Rd))
 #define SCVTSw(Sd, Wn)              EMIT(SCVTF_scalar(0, 0b00, 0b00, 0b010, Wn, Sd))
 #define SCVTDw(Dd, Wn)              EMIT(SCVTF_scalar(0, 0b00, 0b01, 0b010, Wn, Dd))
diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c
index e217726e..4a4e8247 100755
--- a/src/dynarec/arm64_printer.c
+++ b/src/dynarec/arm64_printer.c
@@ -945,6 +945,15 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
         return buff;

     }

 

+    if(isMask(opcode, "0001111000100010110000nnnnnddddd", &a)) {

+        snprintf(buff, sizeof(buff), "FCVT D%d, S%d", Rd, Rn);

+        return buff;

+    }

+    if(isMask(opcode, "0001111001100010010000nnnnnddddd", &a)) {

+        snprintf(buff, sizeof(buff), "FCVT S%d, D%d", Rd, Rn);

+        return buff;

+    }

+

     // FMOV

     if(isMask(opcode, "00011110pp100000010000nnnnnddddd", &a)) {

         int type = a.p;

diff --git a/src/dynarec/dynarec_arm64_f20f.c b/src/dynarec/dynarec_arm64_f20f.c
index 906f8bc8..82388dd4 100755
--- a/src/dynarec/dynarec_arm64_f20f.c
+++ b/src/dynarec/dynarec_arm64_f20f.c
@@ -127,6 +127,15 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             FMULD(d1, v0, d0);

             VMOVeD(v0, 0, d1, 0);

             break;

+        case 0x5A:

+            INST_NAME("CVTSD2SS Gx, Ex");

+            nextop = F8;

+            GETGX(v0);

+            GETEX(d0, 0);

+            d1 = fpu_get_scratch(dyn);

+            FCVT_D_S(d1, d0);

+            VMOVeS(v0, 0, d1, 0);

+            break;

 

         case 0x5C:

             INST_NAME("SUBSD Gx, Ex");