diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-01-15 14:23:37 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-01-15 14:23:37 +0100 |
| commit | 8c71178238def88efac9bad131203f99e7e8f0db (patch) | |
| tree | cd05a51e744b7193239f029bfda9d908735f4f9a /src | |
| parent | 72df0bd1a034f0e7f85b4d778f78ba2e542f5148 (diff) | |
| download | box64-8c71178238def88efac9bad131203f99e7e8f0db.tar.gz box64-8c71178238def88efac9bad131203f99e7e8f0db.zip | |
[ARM64_DYNAREC] Added unaligned code for F3 0F 7F opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_f30f.c | 16 | ||||
| -rw-r--r-- | src/libtools/signals.c | 4 |
2 files changed, 16 insertions, 4 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f30f.c b/src/dynarec/arm64/dynarec_arm64_f30f.c index bb42167f..38c62bde 100644 --- a/src/dynarec/arm64/dynarec_arm64_f30f.c +++ b/src/dynarec/arm64/dynarec_arm64_f30f.c @@ -421,8 +421,20 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7) + (rex.b<<3)); VMOVQ(v1, v0); } else { - addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); - VST128(v0, ed, fixedaddress); + 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); + } + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); + VST128(v0, ed, fixedaddress); + } SMWRITE2(); } break; diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 9be160a1..46eb4d5a 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -1557,9 +1557,9 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) old_pc_i = 0; uint8_t* x64 = (uint8_t*)x64pc; if(db) - printf_log(LOG_INFO, "Special unalinged case fixed @%p, opcode=%08x (addr=%p, db=%p, x64pc=%p[%02hhX %02hhX %02hhX %02hhX %02hhX])\n", pc, *(uint32_t*)pc, addr, db, x64pc, x64[0], x64[1], x64[2], x64[3], x64[4], x64[5]); + printf_log(LOG_INFO, "Special unaligned case fixed @%p, opcode=%08x (addr=%p, db=%p, x64pc=%p[%02hhX %02hhX %02hhX %02hhX %02hhX])\n", pc, *(uint32_t*)pc, addr, db, x64pc, x64[0], x64[1], x64[2], x64[3], x64[4], x64[5]); else - printf_log(LOG_INFO, "Special unalinged case fixed @%p, opcode=%08x (addr=%p)\n", pc, *(uint32_t*)pc, addr); + printf_log(LOG_INFO, "Special unaligned case fixed @%p, opcode=%08x (addr=%p)\n", pc, *(uint32_t*)pc, addr); } } return; |