about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-05-30 21:38:43 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-05-30 21:38:43 +0200
commit2038df85c0fc289acc7ff1dce4cd6b416031f7f5 (patch)
tree0f9d73ad0b29388b8452f812fca9028eed8d0339 /src/dynarec
parentb142c5a1817fb788b9692870ff6aa0cb3e622aea (diff)
downloadbox64-2038df85c0fc289acc7ff1dce4cd6b416031f7f5.tar.gz
box64-2038df85c0fc289acc7ff1dce4cd6b416031f7f5.zip
[ARM64_DYNAREC] Try to optimise Windows INT n version on 64bits (TODO: Interp and 32bits and wowbox64)
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c2
-rw-r--r--src/dynarec/dynarec_native_functions.c6
-rw-r--r--src/dynarec/dynarec_native_functions.h1
3 files changed, 8 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 7b227e24..84f134fc 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -2672,13 +2672,13 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 MOV32w(x1, u8);
                 CALL(native_int, -1);
                 LOAD_XEMU_CALL(xRIP);
+                LOAD_XEMU_REM();
                 TABLE64(x3, addr); // expected return address
                 CMPSx_REG(xRIP, x3);
                 B_MARK(cNE);
                 LDRw_U12(w1, xEmu, offsetof(x64emu_t, quit));
                 CBZw_NEXT(w1);
                 MARK;
-                LOAD_XEMU_REM();
                 jump_to_epilog(dyn, 0, xRIP, ninst);
             } else if (u8==0x80) {
                 INST_NAME("32bits SYSCALL");
diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c
index a97e22c4..555b2eba 100644
--- a/src/dynarec/dynarec_native_functions.c
+++ b/src/dynarec/dynarec_native_functions.c
@@ -208,6 +208,12 @@ void native_int(x64emu_t* emu, int num)
     EmitInterruption(emu, num, (void*)R_RIP);
 }
 
+void native_wineint(x64emu_t* emu, int num)
+{
+    emu->test.test = 0;
+    EmitWineInt(emu, num, (void*)R_RIP);
+}
+
 void native_int3(x64emu_t* emu)
 {
     EmitSignal(emu, SIGTRAP, NULL, 3);
diff --git a/src/dynarec/dynarec_native_functions.h b/src/dynarec/dynarec_native_functions.h
index 0df058f2..eca8568f 100644
--- a/src/dynarec/dynarec_native_functions.h
+++ b/src/dynarec/dynarec_native_functions.h
@@ -57,6 +57,7 @@ void native_br(x64emu_t* emu);
 void native_priv(x64emu_t* emu);
 void native_int3(x64emu_t* emu);
 void native_int(x64emu_t* emu, int num);
+void native_wineint(x64emu_t* emu, int num);
 void native_div0(x64emu_t* emu);
 
 // Caches transformation (for loops) // Specific, need to be written par backend