about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-08-26 16:19:51 +0800
committerGitHub <noreply@github.com>2025-08-26 10:19:51 +0200
commit709a526217e6e495f8a5b8bb8566036f4f7ddf41 (patch)
treefa57997108dd605567dd568a5d88991a12dc2448
parent1cddcad20a1c5c167c9be1576841605bc063737f (diff)
downloadbox64-709a526217e6e495f8a5b8bb8566036f4f7ddf41.tar.gz
box64-709a526217e6e495f8a5b8bb8566036f4f7ddf41.zip
[RV64_DYNAREC] Added more scalar avx opcodes (#2973)
* [RV64_DYNAREC] Added more scalar avx opcodes

* fix
-rw-r--r--src/dynarec/rv64/dynarec_rv64_avx_66_0f.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c
index 88005608..bea96f73 100644
--- a/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c
+++ b/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c
@@ -1105,6 +1105,103 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip,
             } else
                 YMM0(gd);
             break;
+        case 0x74:
+            INST_NAME("VPCMPEQB Gx, Vx, Ex");
+            nextop = F8;
+            GETEX(x1, 0, vex.l ? 31 : 15);
+            GETGX();
+            GETGY();
+            GETVX();
+            GETVY();
+            for (int i = 0; i < 16; ++i) {
+                LBU(x3, vback, vxoffset + i);
+                LBU(x4, wback, fixedaddress + i);
+                if (cpuext.xtheadbb) {
+                    XOR(x3, x3, x4);
+                    TH_TSTNBZ(x3, x3);
+                } else {
+                    SUB(x3, x3, x4);
+                    SEQZ(x3, x3);
+                    NEG(x3, x3);
+                }
+                SB(x3, gback, gdoffset + i);
+            }
+            if (vex.l) {
+                GETEY();
+                for (int i = 0; i < 16; ++i) {
+                    LBU(x3, vback, vyoffset + i);
+                    LBU(x4, wback, fixedaddress + i);
+                    if (cpuext.xtheadbb) {
+                        XOR(x3, x3, x4);
+                        TH_TSTNBZ(x3, x3);
+                    } else {
+                        SUB(x3, x3, x4);
+                        SEQZ(x3, x3);
+                        NEG(x3, x3);
+                    }
+                    SB(x3, gback, gyoffset + i);
+                }
+            } else
+                YMM0(gd);
+            break;
+        case 0x75:
+            INST_NAME("VPCMPEQW Gx, Vx, Ex");
+            nextop = F8;
+            GETEX(x1, 0, vex.l ? 30 : 14);
+            GETGX();
+            GETGY();
+            GETVX();
+            GETVY();
+            for (int i = 0; i < 8; ++i) {
+                LHU(x3, vback, vxoffset + i * 2);
+                LHU(x4, wback, fixedaddress + i * 2);
+                SUB(x3, x3, x4);
+                SEQZ(x3, x3);
+                NEG(x3, x3);
+                SH(x3, gback, gdoffset + i * 2);
+            }
+            if (vex.l) {
+                GETEY();
+                for (int i = 0; i < 8; ++i) {
+                    LHU(x3, vback, vyoffset + i * 2);
+                    LHU(x4, wback, fixedaddress + i * 2);
+                    SUB(x3, x3, x4);
+                    SEQZ(x3, x3);
+                    NEG(x3, x3);
+                    SH(x3, gback, gyoffset + i * 2);
+                }
+            } else
+                YMM0(gd);
+            break;
+        case 0x76:
+            INST_NAME("VPCMPEQD Gx, Vx, Ex");
+            nextop = F8;
+            GETEX(x1, 0, vex.l ? 28 : 12);
+            GETGX();
+            GETGY();
+            GETVX();
+            GETVY();
+            for (int i = 0; i < 4; ++i) {
+                LWU(x3, vback, vxoffset + i * 4);
+                LWU(x4, wback, fixedaddress + i * 4);
+                SUB(x3, x3, x4);
+                SEQZ(x3, x3);
+                NEG(x3, x3);
+                SW(x3, gback, gdoffset + i * 4);
+            }
+            if (vex.l) {
+                GETEY();
+                for (int i = 0; i < 4; ++i) {
+                    LWU(x3, vback, vyoffset + i * 4);
+                    LWU(x4, wback, fixedaddress + i * 4);
+                    SUB(x3, x3, x4);
+                    SEQZ(x3, x3);
+                    NEG(x3, x3);
+                    SW(x3, gback, gyoffset + i * 4);
+                }
+            } else
+                YMM0(gd);
+            break;
         case 0x7E:
             INST_NAME("VMOVD Ed, Gx");
             nextop = F8;