From 0c0f5263e19b4118771c2d2d3cb2e569d952a36f Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Wed, 5 Mar 2025 11:50:35 +0100 Subject: [ARM64_DYNAREC] Added unaligned path for AVX.F3.0F 7F opcode --- src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'src') 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(); } -- cgit 1.4.1