about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-09-01 21:48:21 +0800
committerGitHub <noreply@github.com>2025-09-01 15:48:21 +0200
commit470b8664d2b9e0910cbeceef3c458079152d5072 (patch)
treeebe60e1ae829de0abe4c1ec5132322b781723fa4 /src
parentb31e522eb239df0f00728d199ac6efe338dac46d (diff)
downloadbox64-470b8664d2b9e0910cbeceef3c458079152d5072.tar.gz
box64-470b8664d2b9e0910cbeceef3c458079152d5072.zip
[RV64_DYNAREC] Added 1 more scalar avx 0F opcode (#2994)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_avx_0f.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_avx_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_0f.c
index ce698230..104ffe22 100644
--- a/src/dynarec/rv64/dynarec_rv64_avx_0f.c
+++ b/src/dynarec/rv64/dynarec_rv64_avx_0f.c
@@ -320,6 +320,53 @@ uintptr_t dynarec64_AVX_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, in
             } else
                 YMM0(gd);
             break;
+        case 0x53:
+            INST_NAME("VRCPPS Gx, Ex");
+            nextop = F8;
+            GETEX(x2, 0, vex.l ? 28 : 12);
+            GETGX();
+            GETGY();
+            d0 = fpu_get_scratch(dyn);
+            d1 = fpu_get_scratch(dyn);
+            LUI(x3, 0x3f800);
+            FMVWX(d0, x3); // 1.0f
+            for (int i = 0; i < 4; ++i) {
+                FLW(d1, wback, fixedaddress + 4 * i);
+                if (!BOX64ENV(dynarec_fastnan)) {
+                    FEQS(x3, d1, d1);
+                    BNEZ(x3, 4 + 2 * 4); // isnan(d1)? copy it
+                    FSW(d1, gback, gdoffset + i * 4);
+                    J(4 + 5 * 4); // continue
+                }
+                FDIVS(d1, d0, d1);
+                if (!BOX64ENV(dynarec_fastnan)) {
+                    FEQS(x3, d1, d1);
+                    BNEZ(x3, 4 + 4); // isnan(d1)? negate it
+                    FNEGS(d1, d1);
+                }
+                FSW(d1, gback, gdoffset + 4 * i);
+            }
+            if (vex.l) {
+                GETEY();
+                for (int i = 0; i < 4; ++i) {
+                    FLW(d1, wback, fixedaddress + 4 * i);
+                    if (!BOX64ENV(dynarec_fastnan)) {
+                        FEQS(x3, d1, d1);
+                        BNEZ(x3, 4 + 2 * 4); // isnan(d1)? copy it
+                        FSW(d1, gback, gyoffset + i * 4);
+                        J(4 + 5 * 4); // continue
+                    }
+                    FDIVS(d1, d0, d1);
+                    if (!BOX64ENV(dynarec_fastnan)) {
+                        FEQS(x3, d1, d1);
+                        BNEZ(x3, 4 + 4); // isnan(d1)? negate it
+                        FNEGS(d1, d1);
+                    }
+                    FSW(d1, gback, gyoffset + 4 * i);
+                }
+            } else
+                YMM0(gd);
+            break;
         case 0x5A:
             INST_NAME("VCVTPS2PD Gx, Ex");
             nextop = F8;