about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-11-05 16:43:30 +0800
committerGitHub <noreply@github.com>2024-11-05 09:43:30 +0100
commit681e207af574d07bec8d3976a1c3d6382540fbeb (patch)
treefdb35dfa38ae729114274420578ef8c92b947634 /src
parentf651b7bfb033ac0b3dd8313a7d1781d84e8ecbdd (diff)
downloadbox64-681e207af574d07bec8d3976a1c3d6382540fbeb.tar.gz
box64-681e207af574d07bec8d3976a1c3d6382540fbeb.zip
[RV64_DYNAREC] Added more SSE opcodes for vector (#1999)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f30f_vector.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f30f_vector.c b/src/dynarec/rv64/dynarec_rv64_f30f_vector.c
index 0081552d..ae7c02e2 100644
--- a/src/dynarec/rv64/dynarec_rv64_f30f_vector.c
+++ b/src/dynarec/rv64/dynarec_rv64_f30f_vector.c
@@ -35,6 +35,7 @@ uintptr_t dynarec64_F30F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
     int v0, v1;
     int q0, q1;
     int d0, d1;
+    uint64_t tmp64u0, tmp64u1;
     int64_t fixedaddress, gdoffset;
     int unscaled;
     int64_t j64;
@@ -511,6 +512,30 @@ uintptr_t dynarec64_F30F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
                 VLE_V(v0, ed, dyn->vector_eew, VECTOR_UNMASKED, VECTOR_NFIELD1);
             }
             break;
+        case 0x70:
+            INST_NAME("PSHUFHW Gx, Ex, Ib");
+            nextop = F8;
+            SET_ELEMENT_WIDTH(x1, VECTOR_SEW16, 1);
+            GETEX_vector(v1, 0, 1, VECTOR_SEW16);
+            GETGX_vector(v0, 1, VECTOR_SEW16);
+            u8 = F8;
+            d0 = fpu_get_scratch(dyn);
+            d1 = fpu_get_scratch(dyn);
+            vector_vsetvli(dyn, ninst, x1, VECTOR_SEW64, VECTOR_LMUL1, 1);
+            tmp64u0 = ((((uint64_t)u8 >> 6) & 3) << 48) | ((((uint64_t)u8 >> 4) & 3) << 32) | (((u8 >> 2) & 3) << 16) | (u8 & 3);
+            tmp64u0 += 0x0004000400040004ULL;
+            MOV64x(x5, tmp64u0);
+            VMV_S_X(d1, x5);
+            tmp64u0 = 0x0003000200010000ULL;
+            MOV64x(x5, tmp64u0);
+            VSLIDE1UP_VX(d0, d1, x5, VECTOR_UNMASKED);
+            vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 1);
+            if (v0 == v1) {
+                v1 = fpu_get_scratch(dyn);
+                VMV_V_V(v1, v0);
+            }
+            VRGATHER_VV(v0, v1, d0, VECTOR_UNMASKED);
+            break;
         case 0x7E:
             INST_NAME("MOVQ Gx, Ex");
             nextop = F8;