about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-01-15 14:23:37 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-01-15 14:23:37 +0100
commit8c71178238def88efac9bad131203f99e7e8f0db (patch)
treecd05a51e744b7193239f029bfda9d908735f4f9a /src
parent72df0bd1a034f0e7f85b4d778f78ba2e542f5148 (diff)
downloadbox64-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.c16
-rw-r--r--src/libtools/signals.c4
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;