about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-06 15:36:43 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-06 15:36:43 +0100
commitca8abae2409006457b0c29c0ca0970047435d351 (patch)
tree50d8af8d9102033198736c4f182463bbef487a1e
parent6f0d09536405c1a80faa3f27f377d23a551dd8e8 (diff)
downloadbox64-ca8abae2409006457b0c29c0ca0970047435d351.tar.gz
box64-ca8abae2409006457b0c29c0ca0970047435d351.zip
[ARM64_DYNAREC] Added 66 0F 3A 40 opcode (with tests)
-rw-r--r--src/dynarec/arm64/arm64_emitter.h6
-rw-r--r--src/dynarec/arm64/arm64_printer.c14
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c22
-rw-r--r--tests/ref17.txt24
-rwxr-xr-xtests/test17bin137224 -> 137104 bytes
-rw-r--r--tests/test17.c5
6 files changed, 71 insertions, 0 deletions
diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h
index 4a939eb8..79e24f02 100644
--- a/src/dynarec/arm64/arm64_emitter.h
+++ b/src/dynarec/arm64/arm64_emitter.h
@@ -1104,6 +1104,12 @@
 #define FADDP_vector(Q, sz, Rm, Rn, Rd) ((Q)<<30 | 1<<29 | 0b01110<<24 | (sz)<<22 | 1<<21 | (Rm)<<16 | 0b11010<<11 | 1<<10 | (Rn)<<5 | (Rd))
 #define VFADDPQS(Vd, Vn, Vm)        EMIT(FADDP_vector(1, 0, Vm, Vn, Vd))
 #define VFADDPQD(Vd, Vn, Vm)        EMIT(FADDP_vector(1, 1, Vm, Vn, Vd))
+#define VFADDPS(Vd, Vn, Vm)         EMIT(FADDP_vector(0, 0, Vm, Vn, Vd))
+#define VFADDPD(Vd, Vn, Vm)         EMIT(FADDP_vector(0, 1, Vm, Vn, Vd))
+
+#define FADDP_scalar(sz, Rn, Rd)        (0b01<<30 | 1<<29 | 0b11110<<24 | (sz)<<22 | 0b11000<<17 | 0b01101<<12 | 0b10<<10 | (Rn)<<5 | (Rd))
+#define FADDPS(Sd, Sn)              EMIT(FADDP_scalar(0, Sn, Sd))
+#define FADDPD(Dd, Dn)              EMIT(FADDP_scalar(1, Dn, Dd))
 
 // NEG / ABS
 #define FNEGABS_scalar(type, opc, Rn, Rd)  (0b11110<<24 | (type)<<22 | 1<<21 | (opc)<<15 | 0b10000<<10 | (Rn)<<5 | (Rd))
diff --git a/src/dynarec/arm64/arm64_printer.c b/src/dynarec/arm64/arm64_printer.c
index 70f96d34..f8d09c89 100644
--- a/src/dynarec/arm64/arm64_printer.c
+++ b/src/dynarec/arm64/arm64_printer.c
@@ -1145,6 +1145,20 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
         return buff;

     }

 

+    // FADDP

+    if(isMask(opcode, "0Q1011100f1mmmmm110101nnnnnddddd", &a)) {

+        char s = a.Q?'V':'D';

+        char d = sf?'D':'S';

+        int n = (a.Q && !sf)?4:2;

+        snprintf(buff, sizeof(buff), "VFADDP %c%d.%d%c, %c%d.%d%c, %c%d.%d%c", s, Rd, n, d, s, Rn, n, d, s, Rm, n, d);

+        return buff;

+    }

+    if(isMask(opcode, "011111100f110000110110nnnnnddddd", &a)) {

+        char s = (sf==0)?'S':((sf==1)?'D':'?');

+        snprintf(buff, sizeof(buff), "FADDP %c%d, %c%d, %c%d", s, Rd, s, Rn, s, Rm);

+        return buff;

+    }

+

     // SQRT

     if(isMask(opcode, "0Q1011101f100001111110nnnnnddddd", &a)) {

         char s = a.Q?'V':'D';

diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index f5e689e1..101b05dd 100644
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -1195,6 +1195,28 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     }

                     break;

 

+                case 0x40:

+                    INST_NAME("DPPS Gx, Ex, Ib");

+                    nextop = F8;

+                    GETGX(q0, 1);

+                    GETEX(q1, 0, 1);

+                    u8 = F8;

+                    v0 = fpu_get_scratch(dyn);

+                    VFMULQS(v0, q0, q1);

+                    // mask some, duplicate all, mask some

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

+                        if(!(u8&(1<<(4+i)))) {

+                            VMOVQSfrom(v0, i, xZR);

+                        }

+                    VFADDPQS(v0, v0, v0);

+                    FADDPS(v0, v0);

+                    VDUPQ_32(q0, v0, 0);

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

+                        if(!(u8&(1<<i))) {

+                            VMOVQSfrom(q0, i, xZR);

+                        }

+                    break;

+

                 case 0x44:

                     INST_NAME("PCLMULQDQ Gx, Ex, Ib");

                     nextop = F8;

diff --git a/tests/ref17.txt b/tests/ref17.txt
index 865dabc2..35f59cd7 100644
--- a/tests/ref17.txt
+++ b/tests/ref17.txt
@@ -538,3 +538,27 @@ cvtps2pd(1 2 3 -4 ) = 0x1 0x2 0x3 0xfffffffc
 cvtps2pd(0 -2 -10 0.5 ) = 0x0 0xfffffffe 0xfffffff6 0x0 
 cvtps2pd(inf -inf -inf 1 ) = 0x80000000 0x80000000 0x80000000 0x1 
 cvtps2pd(nan -0 nan inf ) = 0x80000000 0x0 0x80000000 0x80000000 
+dpps(1 2 3 -4 , 0 -2 -10 0.5 , 255) = -36 -36 -36 -36 
+dpps(0 -2 -10 0.5 , inf -inf -inf 1 , 255) = nan nan nan nan 
+dpps(1 2 3 -4 , nan -0 nan inf , 255) = nan nan nan nan 
+dpps(0 -2 -10 0.5 , nan -0 nan inf , 255) = nan nan nan nan 
+dpps(inf -inf -inf 1 , nan -0 nan inf , 255) = nan nan nan nan 
+dpps(nan -0 nan inf , nan -0 nan inf , 255) = nan nan nan nan 
+dpps(1 2 3 -4 , 0 -2 -10 0.5 , 63) = -4 -4 -4 -4 
+dpps(0 -2 -10 0.5 , inf -inf -inf 1 , 63) = nan nan nan nan 
+dpps(1 2 3 -4 , nan -0 nan inf , 63) = nan nan nan nan 
+dpps(0 -2 -10 0.5 , nan -0 nan inf , 63) = nan nan nan nan 
+dpps(inf -inf -inf 1 , nan -0 nan inf , 63) = nan nan nan nan 
+dpps(nan -0 nan inf , nan -0 nan inf , 63) = nan nan nan nan 
+dpps(1 2 3 -4 , 0 -2 -10 0.5 , 243) = -36 -36 0 0 
+dpps(0 -2 -10 0.5 , inf -inf -inf 1 , 243) = nan nan 0 0 
+dpps(1 2 3 -4 , nan -0 nan inf , 243) = nan nan 0 0 
+dpps(0 -2 -10 0.5 , nan -0 nan inf , 243) = nan nan 0 0 
+dpps(inf -inf -inf 1 , nan -0 nan inf , 243) = nan nan 0 0 
+dpps(nan -0 nan inf , nan -0 nan inf , 243) = nan nan 0 0 
+dpps(1 2 3 -4 , 0 -2 -10 0.5 , 83) = -30 -30 0 0 
+dpps(0 -2 -10 0.5 , inf -inf -inf 1 , 83) = nan nan 0 0 
+dpps(1 2 3 -4 , nan -0 nan inf , 83) = nan nan 0 0 
+dpps(0 -2 -10 0.5 , nan -0 nan inf , 83) = nan nan 0 0 
+dpps(inf -inf -inf 1 , nan -0 nan inf , 83) = nan nan 0 0 
+dpps(nan -0 nan inf , nan -0 nan inf , 83) = nan nan 0 0 
diff --git a/tests/test17 b/tests/test17
index ebb01718..5b28c1ad 100755
--- a/tests/test17
+++ b/tests/test17
Binary files differdiff --git a/tests/test17.c b/tests/test17.c
index 632d13ce..8b0cfc40 100644
--- a/tests/test17.c
+++ b/tests/test17.c
@@ -601,6 +601,11 @@ printf(N " %g, %g => %g\n", b, a, *(float*)&r);
  MULTIGO2sd(div, divsd)
  MULTIGO2sd(max, maxsd)
  MULTIGO1ps2dq(cvtps, cvtps2pd)
+ MULITGO2Cps(dp, dpps, 0xff)
+ MULITGO2Cps(dp, dpps, 0x3f)
+ MULITGO2Cps(dp, dpps, 0xf3)
+ MULITGO2Cps(dp, dpps, 0x53)
 
  return 0;
 }
+