From ec846754524199bc65a754dff063cca52e000177 Mon Sep 17 00:00:00 2001 From: Dimitris Panokostas Date: Thu, 4 Jun 2026 15:47:44 +0200 Subject: [PATCH] Fix JIT LINK with A7 fallback --- jit/arm/compemu_arm.cpp | 20 ++++++++++++++++++++ jit/compemu.cpp | 20 ++++++++++++++++++++ jit/gencomp.cpp | 5 +++++ jit/gencomp_arm.c | 5 +++++ 4 files changed, 50 insertions(+) diff --git a/jit/arm/compemu_arm.cpp b/jit/arm/compemu_arm.cpp index 72de3359..3f8d299e 100644 --- a/jit/arm/compemu_arm.cpp +++ b/jit/arm/compemu_arm.cpp @@ -11355,6 +11355,11 @@ uae_u32 REGPARAM2 op_4808_0_comp_ff(uae_u32 opcode) { uae_s32 srcreg = (opcode & 7); uae_u32 m68k_pc_offset_thisinst = m68k_pc_offset; m68k_pc_offset += 2; + if (srcreg == 7) { + m68k_pc_offset = m68k_pc_offset_thisinst; + FAIL(1); + return 0; + } int dodgy = 0; if (srcreg == 7) dodgy = 1; int src = dodgy ? alloc_scratch() : srcreg + 8; @@ -13964,6 +13969,11 @@ uae_u32 REGPARAM2 op_4e50_0_comp_ff(uae_u32 opcode) { uae_s32 srcreg = (opcode & 7); uae_u32 m68k_pc_offset_thisinst = m68k_pc_offset; m68k_pc_offset += 2; + if (srcreg == 7) { + m68k_pc_offset = m68k_pc_offset_thisinst; + FAIL(1); + return 0; + } int dodgy = 0; if (srcreg == 7) dodgy = 1; int src = dodgy ? alloc_scratch() : srcreg + 8; @@ -38554,6 +38564,11 @@ uae_u32 REGPARAM2 op_4808_0_comp_nf(uae_u32 opcode) { uae_s32 srcreg = (opcode & 7); uae_u32 m68k_pc_offset_thisinst = m68k_pc_offset; m68k_pc_offset += 2; + if (srcreg == 7) { + m68k_pc_offset = m68k_pc_offset_thisinst; + FAIL(1); + return 0; + } int dodgy = 0; if (srcreg == 7) dodgy = 1; int src = dodgy ? alloc_scratch() : srcreg + 8; @@ -41066,6 +41081,11 @@ uae_u32 REGPARAM2 op_4e50_0_comp_nf(uae_u32 opcode) { uae_s32 srcreg = (opcode & 7); uae_u32 m68k_pc_offset_thisinst = m68k_pc_offset; m68k_pc_offset += 2; + if (srcreg == 7) { + m68k_pc_offset = m68k_pc_offset_thisinst; + FAIL(1); + return 0; + } int dodgy = 0; if (srcreg == 7) dodgy = 1; int src = dodgy ? alloc_scratch() : srcreg + 8; diff --git a/jit/compemu.cpp b/jit/compemu.cpp index f3534b2b..c7a9da64 100644 --- a/jit/compemu.cpp +++ b/jit/compemu.cpp @@ -24929,6 +24929,11 @@ uae_u32 REGPARAM2 op_4808_0_comp_ff(uae_u32 opcode) /* LINK */ uae_u32 dodgy=0; uae_u32 m68k_pc_offset_thisinst=m68k_pc_offset; m68k_pc_offset+=2; + if (srcreg == 7) { + m68k_pc_offset = m68k_pc_offset_thisinst; + FAIL(1); + return 0; + } { uae_u8 scratchie=S1; { @@ -27698,6 +27703,11 @@ uae_u32 REGPARAM2 op_4e50_0_comp_ff(uae_u32 opcode) /* LINK */ uae_u32 dodgy=0; uae_u32 m68k_pc_offset_thisinst=m68k_pc_offset; m68k_pc_offset+=2; + if (srcreg == 7) { + m68k_pc_offset = m68k_pc_offset_thisinst; + FAIL(1); + return 0; + } { uae_u8 scratchie=S1; { @@ -76044,6 +76054,11 @@ uae_u32 REGPARAM2 op_4808_0_comp_nf(uae_u32 opcode) /* LINK */ uae_u32 dodgy=0; uae_u32 m68k_pc_offset_thisinst=m68k_pc_offset; m68k_pc_offset+=2; + if (srcreg == 7) { + m68k_pc_offset = m68k_pc_offset_thisinst; + FAIL(1); + return 0; + } { uae_u8 scratchie=S1; { @@ -78951,6 +78966,11 @@ uae_u32 REGPARAM2 op_4e50_0_comp_nf(uae_u32 opcode) /* LINK */ uae_u32 dodgy=0; uae_u32 m68k_pc_offset_thisinst=m68k_pc_offset; m68k_pc_offset+=2; + if (srcreg == 7) { + m68k_pc_offset = m68k_pc_offset_thisinst; + FAIL(1); + return 0; + } { uae_u8 scratchie=S1; { diff --git a/jit/gencomp.cpp b/jit/gencomp.cpp index a6ccb650..7488bba7 100644 --- a/jit/gencomp.cpp +++ b/jit/gencomp.cpp @@ -1971,6 +1971,11 @@ gen_opcode(unsigned int opcode) #ifdef DISABLE_I_LINK failure; #endif + comprintf("\tif (srcreg == 7) {\n" + "\t\tm68k_pc_offset = m68k_pc_offset_thisinst;\n" + "\t\tFAIL(1);\n" + "\t\t" RETURN "\n" + "\t}\n"); genamode(curi->smode, "srcreg", sz_long, "src", GENA_GETV_FETCH, GENA_MOVEM_DO_INC); genamode(curi->dmode, "dstreg", curi->size, "offs", GENA_GETV_FETCH, GENA_MOVEM_DO_INC); comprintf("\tsub_l_ri(SP_REG,4);\n" diff --git a/jit/gencomp_arm.c b/jit/gencomp_arm.c index 4742bff3..62431889 100644 --- a/jit/gencomp_arm.c +++ b/jit/gencomp_arm.c @@ -4204,6 +4204,11 @@ gen_opcode(unsigned long int opcode) { break; case i_LINK: + comprintf("\tif (srcreg == 7) {\n" + "\t\tm68k_pc_offset = m68k_pc_offset_thisinst;\n" + "\t\tFAIL(1);\n" + "\t\treturn;\n" + "\t}\n"); genamode(curi->smode, "srcreg", sz_long, "src", 1, 0); genamode(curi->dmode, "dstreg", curi->size, "offs", 1, 0); comprintf("\tsub_l_ri(15,4);\n" -- 2.47.3