about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-09-04 15:35:12 +0800
committerGitHub <noreply@github.com>2025-09-04 09:35:12 +0200
commit4edba2e67a01e7baad3669111044143f3721b61f (patch)
tree679f33b1d83b603c8ebd8ad69e10ed06941a3b35 /src
parent6b41f28e2b3410b9c5b5883dffb4576193a82925 (diff)
downloadbox64-4edba2e67a01e7baad3669111044143f3721b61f.tar.gz
box64-4edba2e67a01e7baad3669111044143f3721b61f.zip
[RV64_DYNAREC] Added more scalar avx opcodes (#3005)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_avx_0f.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_avx_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_0f.c
index 104ffe22..987bf036 100644
--- a/src/dynarec/rv64/dynarec_rv64_avx_0f.c
+++ b/src/dynarec/rv64/dynarec_rv64_avx_0f.c
@@ -367,6 +367,135 @@ uintptr_t dynarec64_AVX_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, in
             } else
                 YMM0(gd);
             break;
+        case 0x54:
+            INST_NAME("VANDPS Gx, Vx, Ex");
+            nextop = F8;
+            GETEX(x1, 0, vex.l ? 24 : 8);
+            GETGX();
+            GETGY();
+            GETVX();
+            GETVY();
+            LD(x3, vback, vxoffset + 0);
+            LD(x4, wback, fixedaddress + 0);
+            AND(x5, x3, x4);
+            SD(x5, gback, gdoffset + 0);
+            LD(x3, vback, vxoffset + 8);
+            LD(x4, wback, fixedaddress + 8);
+            AND(x5, x3, x4);
+            SD(x5, gback, gdoffset + 8);
+            if (vex.l) {
+                GETEY();
+                LD(x3, vback, vyoffset + 0);
+                LD(x4, wback, fixedaddress + 0);
+                AND(x5, x3, x4);
+                SD(x5, gback, gyoffset + 0);
+                LD(x3, vback, vyoffset + 8);
+                LD(x4, wback, fixedaddress + 8);
+                AND(x5, x3, x4);
+                SD(x5, gback, gyoffset + 8);
+            } else
+                YMM0(gd);
+            break;
+        case 0x55:
+            INST_NAME("VANDNPS Gx, Vx, Ex");
+            nextop = F8;
+            GETEX(x1, 0, vex.l ? 24 : 8);
+            GETGX();
+            GETGY();
+            GETVX();
+            GETVY();
+            LD(x3, vback, vxoffset + 0);
+            LD(x4, wback, fixedaddress + 0);
+            NOT(x3, x3);
+            AND(x5, x3, x4);
+            SD(x5, gback, gdoffset + 0);
+            LD(x3, vback, vxoffset + 8);
+            LD(x4, wback, fixedaddress + 8);
+            NOT(x3, x3);
+            AND(x5, x3, x4);
+            SD(x5, gback, gdoffset + 8);
+            if (vex.l) {
+                GETEY();
+                LD(x3, vback, vyoffset + 0);
+                LD(x4, wback, fixedaddress + 0);
+                NOT(x3, x3);
+                AND(x5, x3, x4);
+                SD(x5, gback, gyoffset + 0);
+                LD(x3, vback, vyoffset + 8);
+                LD(x4, wback, fixedaddress + 8);
+                NOT(x3, x3);
+                AND(x5, x3, x4);
+                SD(x5, gback, gyoffset + 8);
+            } else
+                YMM0(gd);
+            break;
+        case 0x56:
+            INST_NAME("VORPS Gx, Vx, Ex");
+            nextop = F8;
+            GETEX(x1, 0, vex.l ? 24 : 8);
+            GETGX();
+            GETGY();
+            GETVX();
+            GETVY();
+            LD(x3, vback, vxoffset + 0);
+            LD(x4, wback, fixedaddress + 0);
+            OR(x5, x3, x4);
+            SD(x5, gback, gdoffset + 0);
+            LD(x3, vback, vxoffset + 8);
+            LD(x4, wback, fixedaddress + 8);
+            OR(x5, x3, x4);
+            SD(x5, gback, gdoffset + 8);
+            if (vex.l) {
+                GETEY();
+                LD(x3, vback, vyoffset + 0);
+                LD(x4, wback, fixedaddress + 0);
+                OR(x5, x3, x4);
+                SD(x5, gback, gyoffset + 0);
+                LD(x3, vback, vyoffset + 8);
+                LD(x4, wback, fixedaddress + 8);
+                OR(x5, x3, x4);
+                SD(x5, gback, gyoffset + 8);
+            } else
+                YMM0(gd);
+            break;
+        case 0x57:
+            INST_NAME("VXORPS Gx, Vx, Ex");
+            nextop = F8;
+            GETEX(x1, 0, vex.l ? 24 : 8);
+            GETGX();
+            GETGY();
+            GETVX();
+            GETVY();
+            if (vex.v == ed) {
+                SD(xZR, gback, gdoffset + 0);
+                SD(xZR, gback, gdoffset + 8);
+            } else {
+                LD(x3, vback, vxoffset + 0);
+                LD(x4, wback, fixedaddress + 0);
+                XOR(x5, x3, x4);
+                SD(x5, gback, gdoffset + 0);
+                LD(x3, vback, vxoffset + 8);
+                LD(x4, wback, fixedaddress + 8);
+                XOR(x5, x3, x4);
+                SD(x5, gback, gdoffset + 8);
+            }
+            if (vex.l) {
+                GETEY();
+                if (vex.v == ed) {
+                    YMM0(gd);
+                } else {
+                    LD(x3, vback, vyoffset + 0);
+                    LD(x4, wback, fixedaddress + 0);
+                    XOR(x5, x3, x4);
+                    SD(x5, gback, gyoffset + 0);
+                    LD(x3, vback, vyoffset + 8);
+                    LD(x4, wback, fixedaddress + 8);
+                    XOR(x5, x3, x4);
+                    SD(x5, gback, gyoffset + 8);
+                }
+            } else
+                YMM0(gd);
+            break;
         case 0x5A:
             INST_NAME("VCVTPS2PD Gx, Ex");
             nextop = F8;