diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-08-22 01:15:59 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-21 19:15:59 +0200 |
| commit | d476217f4c53ed5697086fd477cc4058e78fbae1 (patch) | |
| tree | 299fb7099e7097ac1a2d112fdb2e672e7a42d654 | |
| parent | 34e789484a6177e2b9eff4ccf3f677a9ae82b273 (diff) | |
| download | box64-d476217f4c53ed5697086fd477cc4058e78fbae1.tar.gz box64-d476217f4c53ed5697086fd477cc4058e78fbae1.zip | |
[RV64_DYNAREC] Fixed more scalar avx opcodes (#2959)
* [RV64_DYNAREC] Fixed more scalar avx opcodes * oops
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c b/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c index 28558f14..0a3ef423 100644 --- a/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c +++ b/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c @@ -65,9 +65,8 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i } for (int i = 0; i < 16; ++i) { - LBU(x3, wback, fixedaddress + i); - ANDI(x4, x3, 128); - BEQZ(x4, 4 + 4 * 2); + LB(x3, wback, fixedaddress + i); + BGE(x3, xZR, 4 + 4 * 2); SB(xZR, gback, gdoffset + i); J(4 + 4 * 4); // continue ANDI(x4, x3, 15); @@ -87,15 +86,14 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i vyoffset = 0; } for (int i = 0; i < 16; ++i) { - LBU(x3, wback, fixedaddress + i); - ANDI(x4, x3, 128); - BEQZ(x4, 4 + 4 * 2); - SB(xZR, gback, gdoffset + i); + LB(x3, wback, fixedaddress + i); + BGE(x3, xZR, 4 + 4 * 2); + SB(xZR, gback, gyoffset + i); J(4 + 4 * 4); // continue ANDI(x4, x3, 15); ADD(x4, x4, vback); - LBU(x4, x4, vxoffset); - SB(x4, gback, gdoffset + i); + LBU(x4, x4, vyoffset); + SB(x4, gback, gyoffset + i); } } else { SD(xZR, gback, gyoffset + 0); @@ -243,7 +241,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i LD(x3, gback, gyoffset + 0); SD(x3, gback, gyoffset + 8); } else { - for (int i = 0; i < 4; ++i) { + for (int i = 0; i < 2; ++i) { // GY->sd[4+i] = EY->sd[i*2+0]+EY->sd[i*2+1]; LW(x3, wback, fixedaddress + 4 * (i * 2 + 0)); LW(x4, wback, fixedaddress + 4 * (i * 2 + 1)); @@ -434,7 +432,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i LD(x3, gback, gyoffset + 0); SD(x3, gback, gyoffset + 8); } else { - for (int i = 0; i < 4; ++i) { + for (int i = 0; i < 2; ++i) { // GY->sd[4+i] = EY->sd[i*2+0]-EY->sd[i*2+1]; LW(x3, wback, fixedaddress + 4 * (i * 2 + 0)); LW(x4, wback, fixedaddress + 4 * (i * 2 + 1)); |