diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-11-05 16:43:30 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-05 09:43:30 +0100 |
| commit | 681e207af574d07bec8d3976a1c3d6382540fbeb (patch) | |
| tree | fdb35dfa38ae729114274420578ef8c92b947634 /src | |
| parent | f651b7bfb033ac0b3dd8313a7d1781d84e8ecbdd (diff) | |
| download | box64-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.c | 25 |
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; |