diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-03-05 11:50:35 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-03-05 11:50:35 +0100 |
| commit | 0c0f5263e19b4118771c2d2d3cb2e569d952a36f (patch) | |
| tree | 78d74c89e6f5cc2f196d0de026d0932cb1720f6e /src | |
| parent | ad70febaac6e69fc0043ae3305831e38f53b2caa (diff) | |
| download | box64-0c0f5263e19b4118771c2d2d3cb2e569d952a36f.tar.gz box64-0c0f5263e19b4118771c2d2d3cb2e569d952a36f.zip | |
[ARM64_DYNAREC] Added unaligned path for AVX.F3.0F 7F opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c index 1dc4c55b..4202f537 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c @@ -491,11 +491,30 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, VMOVQ(v1, v0); } // no ymm raz here it seems } else { - addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0); - VSTR128_U12(v0, ed, fixedaddress); - if(vex.l) { - GETGY(v0, 0, -1, -1, -1); - VSTR128_U12(v0, ed, fixedaddress+16); + IF_UNALIGNED(ip) { + addr = geted(dyn, addr, ninst, nextop, &wback, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + if(wback!=x1) { + MOVx_REG(x1, wback); + wback = x1; + } + for(int i=0; i<16; ++i) { + VST1_8(v0, i, wback); + ADDx_U12(wback, wback, 1); + } + if(vex.l) { + GETGY(v0, 0, -1, -1, -1); + for(int i=0; i<16; ++i) { + VST1_8(v0, i, wback); + ADDx_U12(wback, wback, 1); + } + } + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0); + VSTR128_U12(v0, ed, fixedaddress); + if(vex.l) { + GETGY(v0, 0, -1, -1, -1); + VSTR128_U12(v0, ed, fixedaddress+16); + } } SMWRITE2(); } |