diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-10-30 05:04:07 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-29 22:04:07 +0100 |
| commit | 121148da72f44937012ee14bcd48ab43b846977b (patch) | |
| tree | a207d80624071dce288625e29bacd9a44037cc8f /src | |
| parent | 1e34db98a854c0adf0e38de120c7df896c11f5f0 (diff) | |
| download | box64-121148da72f44937012ee14bcd48ab43b846977b.tar.gz box64-121148da72f44937012ee14bcd48ab43b846977b.zip | |
[RV64_DYNAREC] Added more opcodes for vector (#1979)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f_vector.c | 9 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f30f_vector.c | 63 |
2 files changed, 72 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f_vector.c b/src/dynarec/rv64/dynarec_rv64_0f_vector.c index d8036ed4..dca311d4 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f_vector.c +++ b/src/dynarec/rv64/dynarec_rv64_0f_vector.c @@ -326,6 +326,14 @@ uintptr_t dynarec64_0F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, GETGX_vector(v0, 1, VECTOR_SEW32); VFMUL_VV(v0, v0, q0, VECTOR_UNMASKED); break; + case 0x5B: + INST_NAME("CVTDQ2PS Gx, Ex"); + nextop = F8; + SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); + GETEX_vector(q0, 0, 0, VECTOR_SEW32); + GETGX_empty_vector(v0); + VFCVT_F_X_V(v0, q0, VECTOR_UNMASKED); + break; case 0x5C: INST_NAME("SUBPS Gx, Ex"); nextop = F8; @@ -465,6 +473,7 @@ uintptr_t dynarec64_0F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, case 0x2C ... 0x2F: case 0x31: case 0x40 ... 0x4F: + case 0x60 ... 0x7F: case 0x80 ... 0xBF: case 0xC8 ... 0xCF: return 0; diff --git a/src/dynarec/rv64/dynarec_rv64_f30f_vector.c b/src/dynarec/rv64/dynarec_rv64_f30f_vector.c index c4f82e45..abd39e98 100644 --- a/src/dynarec/rv64/dynarec_rv64_f30f_vector.c +++ b/src/dynarec/rv64/dynarec_rv64_f30f_vector.c @@ -122,6 +122,34 @@ uintptr_t dynarec64_F30F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i VFMV_S_F(v0, v0); } break; + case 0x2D: + INST_NAME("CVTSS2SI Gd, Ex"); + nextop = F8; + GETGD; + SET_ELEMENT_WIDTH(x3, VECTOR_SEW32, 1); + if (MODREG) { + ed = (nextop & 7) + (rex.b << 3); + d0 = sse_get_reg_vector(dyn, ninst, x1, ed, 0, VECTOR_SEW32); + VFMV_F_S(d0, d0); + } else { + GETEXSS(d0, 0); + } + if (!box64_dynarec_fastround) FSFLAGSI(0); + u8 = sse_setround(dyn, ninst, x5, x6); + FCVTSxw(gd, d0, RD_DYN); + x87_restoreround(dyn, ninst, u8); + if (!rex.w) ZEROUP(gd); + if (!box64_dynarec_fastround) { + FRFLAGS(x5); + ANDI(x5, x5, (1 << FR_NV) | (1 << FR_OF)); + CBZ_NEXT(x5); + if (rex.w) { + MOV64x(gd, 0x8000000000000000LL); + } else { + MOV32w(gd, 0x80000000); + } + } + break; case 0x38: return 0; case 0x58: @@ -308,6 +336,41 @@ uintptr_t dynarec64_F30F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i } } break; + case 0x6F: + INST_NAME("MOVDQU Gx, Ex"); + nextop = F8; + GETG; + if (MODREG) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEWANY, 1); + ed = (nextop & 7) + (rex.b << 3); + v1 = sse_get_reg_vector(dyn, ninst, x1, ed, 0, dyn->vector_eew); + v0 = sse_get_reg_empty_vector(dyn, ninst, x1, gd); + VMV_V_V(v0, v1); + } else { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); // unaligned! + SMREAD(); + v0 = sse_get_reg_empty_vector(dyn, ninst, x1, gd); + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x3, &fixedaddress, rex, NULL, 0, 0); + VLE_V(v0, ed, dyn->vector_eew, VECTOR_UNMASKED, VECTOR_NFIELD1); + } + break; + case 0x7E: + INST_NAME("MOVQ Gx, Ex"); + nextop = F8; + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + if (MODREG) { + GETEX_vector(v1, 0, 0, VECTOR_SEW64); + GETGX_empty_vector(v0); + VMV_X_S(x4, v1); + } else { + SMREAD(); + GETGX_empty_vector(v0); + addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0); + LD(x4, ed, fixedaddress); + } + if (!rv64_xtheadvector) VXOR_VV(v0, v0, v0, VECTOR_UNMASKED); + VMV_S_X(v0, x4); + break; case 0xAE: case 0xB8: case 0xBC: |