about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-04 20:56:23 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-04 20:56:23 +0200
commit6c7f306baa775725a624d05f00ee3690d205390e (patch)
treebd702bd1ae4d8cfda9f9060f54e4829def630960 /src
parentc56517b80177d12c1f5fc7e11304189b3702cd23 (diff)
downloadbox64-6c7f306baa775725a624d05f00ee3690d205390e.tar.gz
box64-6c7f306baa775725a624d05f00ee3690d205390e.zip
[ARM64_DYNAREC] Added AVX.66.0F 51 opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
index ca141f08..52b88fd8 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
@@ -295,6 +295,29 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
                 BFIx(gd, x2, 3, 1);
             }
             break;
+        case 0x51:
+            INST_NAME("VSQRTPD Gx, Ex");
+            nextop = F8;
+            if(!box64_dynarec_fastnan) {
+                d0 = fpu_get_scratch(dyn, ninst);
+                d1 = fpu_get_scratch(dyn, ninst);
+            }
+            for(int l=0; l<1+vex.l; ++l) {
+                if(!l) { GETGX_empty_EX(v0, v1, 0); } else { GETGY_empty_EY(v0, v1); }
+                if(!box64_dynarec_fastnan) {
+                    // check if any input value was NAN
+                    VFCMEQQD(d0, v1, v1);    // 0 if NAN, 1 if not NAN
+                    VFSQRTQD(v0, v1);
+                    VFCMEQQD(d1, v0, v0);    // 0 => out is NAN
+                    VBICQ(d1, d0, d1);      // forget it in any input was a NAN already
+                    VSHLQ_64(d1, d1, 63);   // only keep the sign bit
+                    VORRQ(v0, v0, d1);      // NAN -> -NAN
+                } else {
+                    VFSQRTQD(v0, v1);
+                }
+            }
+            if(!vex.l) YMM0(gd);
+            break;
 
         case 0x54:
             INST_NAME("VANDPD Gx, Vx, Ex");