From df70f09951f1e73a4bff14cdb2e8949703350efa Mon Sep 17 00:00:00 2001 From: Dimitris Panokostas Date: Tue, 19 May 2026 23:00:04 +0200 Subject: [PATCH] Fix x64 JIT pointer-width codegen --- jit/codegen_x86.h | 4 +- jit/compemu.cpp | 324 ++++++++++++++++++++---------------- jit/compemu_midfunc_x86.cpp | 4 +- jit/compemu_midfunc_x86.h | 4 +- jit/gencomp.cpp | 22 ++- 5 files changed, 200 insertions(+), 158 deletions(-) diff --git a/jit/codegen_x86.h b/jit/codegen_x86.h index fb4f1230..f2413c58 100644 --- a/jit/codegen_x86.h +++ b/jit/codegen_x86.h @@ -454,7 +454,9 @@ static inline int x86_DISP32_addressing_possible(uintptr addr) #define _r_X( R, D,B,I,S,O) (_r0P(I) ? (_r0P(B) ? (!X86_TARGET_64BIT ? _r_D(R,D) : \ (_x86_RIP_addressing_possible(D, O) ? \ _r_D(R, (D) - ((uintptr)x86_get_target() + 4 + (O))) : \ - _r_DSIB(R,D))) : \ + (x86_DISP32_addressing_possible(D) ? \ + _r_DSIB(R,D) : \ + x86_emit_failure("x86-64 absolute address is not RIP-relative and does not fit disp32")))) : \ (_rIP(B) ? _r_D (R,D ) : \ (_rsp12P(B) ? _r_DBIS(R,D,_rSP(),_rSP(),1) : \ _r_DB (R,D, B )))) : \ diff --git a/jit/compemu.cpp b/jit/compemu.cpp index 42ffd3a0..42fda8b9 100644 --- a/jit/compemu.cpp +++ b/jit/compemu.cpp @@ -30750,8 +30750,8 @@ uae_u32 REGPARAM2 op_51c8_0_comp_ff(uae_u32 opcode) /* DBcc */ sub_w_ri(src,1); end_needflags(); { - uae_u32 v2; - uae_u32 v1=get_const(PC_P); + uintptr v2; + uintptr v1=get_const(PC_P); v2=get_const(offs); register_branch(v1,v2,3); if(srcreg != src) { @@ -34495,6 +34495,7 @@ uae_u32 REGPARAM2 op_60ff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); @@ -34584,6 +34585,7 @@ uae_u32 REGPARAM2 op_61ff_0_comp_ff(uae_u32 opcode) /* BSR */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); { uae_u32 retadd=(uae_u32)(start_pc+((char *)comp_pc_p-(char *)start_pc_p)+m68k_pc_offset); int ret=scratchie++; @@ -34620,8 +34622,8 @@ uae_u32 REGPARAM2 op_6200_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,7); make_flags_live(); } @@ -34654,8 +34656,8 @@ uae_u32 REGPARAM2 op_6201_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,7); make_flags_live(); } @@ -34676,14 +34678,15 @@ uae_u32 REGPARAM2 op_62ff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,7); make_flags_live(); } @@ -34711,8 +34714,8 @@ uae_u32 REGPARAM2 op_6300_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,6); make_flags_live(); } @@ -34745,8 +34748,8 @@ uae_u32 REGPARAM2 op_6301_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,6); make_flags_live(); } @@ -34770,14 +34773,15 @@ uae_u32 REGPARAM2 op_63ff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,6); make_flags_live(); } @@ -34805,8 +34809,8 @@ uae_u32 REGPARAM2 op_6400_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,3); make_flags_live(); } @@ -34839,8 +34843,8 @@ uae_u32 REGPARAM2 op_6401_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,3); make_flags_live(); } @@ -34861,14 +34865,15 @@ uae_u32 REGPARAM2 op_64ff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,3); make_flags_live(); } @@ -34896,8 +34901,8 @@ uae_u32 REGPARAM2 op_6500_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,2); make_flags_live(); } @@ -34930,8 +34935,8 @@ uae_u32 REGPARAM2 op_6501_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,2); make_flags_live(); } @@ -34952,14 +34957,15 @@ uae_u32 REGPARAM2 op_65ff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,2); make_flags_live(); } @@ -34987,8 +34993,8 @@ uae_u32 REGPARAM2 op_6600_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,5); make_flags_live(); } @@ -35021,8 +35027,8 @@ uae_u32 REGPARAM2 op_6601_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,5); make_flags_live(); } @@ -35043,14 +35049,15 @@ uae_u32 REGPARAM2 op_66ff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,5); make_flags_live(); } @@ -35078,8 +35085,8 @@ uae_u32 REGPARAM2 op_6700_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,4); make_flags_live(); } @@ -35112,8 +35119,8 @@ uae_u32 REGPARAM2 op_6701_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,4); make_flags_live(); } @@ -35134,14 +35141,15 @@ uae_u32 REGPARAM2 op_67ff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,4); make_flags_live(); } @@ -35169,8 +35177,8 @@ uae_u32 REGPARAM2 op_6a00_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,9); make_flags_live(); } @@ -35203,8 +35211,8 @@ uae_u32 REGPARAM2 op_6a01_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,9); make_flags_live(); } @@ -35225,14 +35233,15 @@ uae_u32 REGPARAM2 op_6aff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,9); make_flags_live(); } @@ -35260,8 +35269,8 @@ uae_u32 REGPARAM2 op_6b00_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,8); make_flags_live(); } @@ -35294,8 +35303,8 @@ uae_u32 REGPARAM2 op_6b01_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,8); make_flags_live(); } @@ -35316,14 +35325,15 @@ uae_u32 REGPARAM2 op_6bff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,8); make_flags_live(); } @@ -35351,8 +35361,8 @@ uae_u32 REGPARAM2 op_6c00_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,13); make_flags_live(); } @@ -35385,8 +35395,8 @@ uae_u32 REGPARAM2 op_6c01_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,13); make_flags_live(); } @@ -35407,14 +35417,15 @@ uae_u32 REGPARAM2 op_6cff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,13); make_flags_live(); } @@ -35442,8 +35453,8 @@ uae_u32 REGPARAM2 op_6d00_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,12); make_flags_live(); } @@ -35476,8 +35487,8 @@ uae_u32 REGPARAM2 op_6d01_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,12); make_flags_live(); } @@ -35498,14 +35509,15 @@ uae_u32 REGPARAM2 op_6dff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,12); make_flags_live(); } @@ -35533,8 +35545,8 @@ uae_u32 REGPARAM2 op_6e00_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,15); make_flags_live(); } @@ -35567,8 +35579,8 @@ uae_u32 REGPARAM2 op_6e01_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,15); make_flags_live(); } @@ -35589,14 +35601,15 @@ uae_u32 REGPARAM2 op_6eff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,15); make_flags_live(); } @@ -35624,8 +35637,8 @@ uae_u32 REGPARAM2 op_6f00_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,14); make_flags_live(); } @@ -35658,8 +35671,8 @@ uae_u32 REGPARAM2 op_6f01_0_comp_ff(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,14); make_flags_live(); } @@ -35680,14 +35693,15 @@ uae_u32 REGPARAM2 op_6fff_0_comp_ff(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,14); make_flags_live(); } @@ -81653,8 +81667,8 @@ uae_u32 REGPARAM2 op_51c8_0_comp_nf(uae_u32 opcode) /* DBcc */ sub_w_ri(src,1); end_needflags(); { - uae_u32 v2; - uae_u32 v1=get_const(PC_P); + uintptr v2; + uintptr v1=get_const(PC_P); v2=get_const(offs); register_branch(v1,v2,3); if(srcreg != src) { @@ -85398,6 +85412,7 @@ uae_u32 REGPARAM2 op_60ff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); @@ -85487,6 +85502,7 @@ uae_u32 REGPARAM2 op_61ff_0_comp_nf(uae_u32 opcode) /* BSR */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); { uae_u32 retadd=(uae_u32)(start_pc+((char *)comp_pc_p-(char *)start_pc_p)+m68k_pc_offset); int ret=scratchie++; @@ -85523,8 +85539,8 @@ uae_u32 REGPARAM2 op_6200_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,7); make_flags_live(); } @@ -85557,8 +85573,8 @@ uae_u32 REGPARAM2 op_6201_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,7); make_flags_live(); } @@ -85579,14 +85595,15 @@ uae_u32 REGPARAM2 op_62ff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,7); make_flags_live(); } @@ -85614,8 +85631,8 @@ uae_u32 REGPARAM2 op_6300_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,6); make_flags_live(); } @@ -85648,8 +85665,8 @@ uae_u32 REGPARAM2 op_6301_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,6); make_flags_live(); } @@ -85673,14 +85690,15 @@ uae_u32 REGPARAM2 op_63ff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,6); make_flags_live(); } @@ -85708,8 +85726,8 @@ uae_u32 REGPARAM2 op_6400_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,3); make_flags_live(); } @@ -85742,8 +85760,8 @@ uae_u32 REGPARAM2 op_6401_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,3); make_flags_live(); } @@ -85764,14 +85782,15 @@ uae_u32 REGPARAM2 op_64ff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,3); make_flags_live(); } @@ -85799,8 +85818,8 @@ uae_u32 REGPARAM2 op_6500_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,2); make_flags_live(); } @@ -85833,8 +85852,8 @@ uae_u32 REGPARAM2 op_6501_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,2); make_flags_live(); } @@ -85855,14 +85874,15 @@ uae_u32 REGPARAM2 op_65ff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,2); make_flags_live(); } @@ -85890,8 +85910,8 @@ uae_u32 REGPARAM2 op_6600_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,5); make_flags_live(); } @@ -85924,8 +85944,8 @@ uae_u32 REGPARAM2 op_6601_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,5); make_flags_live(); } @@ -85946,14 +85966,15 @@ uae_u32 REGPARAM2 op_66ff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,5); make_flags_live(); } @@ -85981,8 +86002,8 @@ uae_u32 REGPARAM2 op_6700_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,4); make_flags_live(); } @@ -86015,8 +86036,8 @@ uae_u32 REGPARAM2 op_6701_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,4); make_flags_live(); } @@ -86037,14 +86058,15 @@ uae_u32 REGPARAM2 op_67ff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,4); make_flags_live(); } @@ -86072,8 +86094,8 @@ uae_u32 REGPARAM2 op_6a00_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,9); make_flags_live(); } @@ -86106,8 +86128,8 @@ uae_u32 REGPARAM2 op_6a01_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,9); make_flags_live(); } @@ -86128,14 +86150,15 @@ uae_u32 REGPARAM2 op_6aff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,9); make_flags_live(); } @@ -86163,8 +86186,8 @@ uae_u32 REGPARAM2 op_6b00_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,8); make_flags_live(); } @@ -86197,8 +86220,8 @@ uae_u32 REGPARAM2 op_6b01_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,8); make_flags_live(); } @@ -86219,14 +86242,15 @@ uae_u32 REGPARAM2 op_6bff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,8); make_flags_live(); } @@ -86254,8 +86278,8 @@ uae_u32 REGPARAM2 op_6c00_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,13); make_flags_live(); } @@ -86288,8 +86312,8 @@ uae_u32 REGPARAM2 op_6c01_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,13); make_flags_live(); } @@ -86310,14 +86334,15 @@ uae_u32 REGPARAM2 op_6cff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,13); make_flags_live(); } @@ -86345,8 +86370,8 @@ uae_u32 REGPARAM2 op_6d00_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,12); make_flags_live(); } @@ -86379,8 +86404,8 @@ uae_u32 REGPARAM2 op_6d01_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,12); make_flags_live(); } @@ -86401,14 +86426,15 @@ uae_u32 REGPARAM2 op_6dff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,12); make_flags_live(); } @@ -86436,8 +86462,8 @@ uae_u32 REGPARAM2 op_6e00_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,15); make_flags_live(); } @@ -86470,8 +86496,8 @@ uae_u32 REGPARAM2 op_6e01_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,15); make_flags_live(); } @@ -86492,14 +86518,15 @@ uae_u32 REGPARAM2 op_6eff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,15); make_flags_live(); } @@ -86527,8 +86554,8 @@ uae_u32 REGPARAM2 op_6f00_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,14); make_flags_live(); } @@ -86561,8 +86588,8 @@ uae_u32 REGPARAM2 op_6f01_0_comp_nf(uae_u32 opcode) /* Bcc */ add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,14); make_flags_live(); } @@ -86583,14 +86610,15 @@ uae_u32 REGPARAM2 op_6fff_0_comp_nf(uae_u32 opcode) /* Bcc */ { int src = scratchie++; mov_l_ri(src, comp_get_ilong((m68k_pc_offset+=4)-4)); + mov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src)); sub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2); add_l_ri(src,JITPTR comp_pc_p); mov_l_ri(PC_P,JITPTR comp_pc_p); add_l_ri(src,m68k_pc_offset); add_l_ri(PC_P,m68k_pc_offset); m68k_pc_offset=0; - uae_u32 v1=get_const(PC_P); - uae_u32 v2=get_const(src); + uintptr v1=get_const(PC_P); + uintptr v2=get_const(src); register_branch(v1,v2,14); make_flags_live(); } diff --git a/jit/compemu_midfunc_x86.cpp b/jit/compemu_midfunc_x86.cpp index 87bf3171..9b292fb4 100644 --- a/jit/compemu_midfunc_x86.cpp +++ b/jit/compemu_midfunc_x86.cpp @@ -813,7 +813,7 @@ MIDFUNC(2,setcc,(W1 d, IMM cc)) unlock2(d); } -MIDFUNC(2,setcc_m,(IMM d, IMM cc)) +MIDFUNC(2,setcc_m,(MEMW d, IMM cc)) { CLOBBER_SETCC; raw_setcc_m(d,cc); @@ -1999,7 +1999,7 @@ MIDFUNC(2,and_b,(RW1 d, RR1 s)) } // gb-- used for making an fpcr value in compemu_fpp.cpp -MIDFUNC(2,or_l_rm,(RW4 d, IMM s)) +MIDFUNC(2,or_l_rm,(RW4 d, MEMR s)) { CLOBBER_OR; d=rmw(d,4,4); diff --git a/jit/compemu_midfunc_x86.h b/jit/compemu_midfunc_x86.h index 2b04e647..fe697611 100644 --- a/jit/compemu_midfunc_x86.h +++ b/jit/compemu_midfunc_x86.h @@ -76,7 +76,7 @@ DECLARE_MIDFUNC(shra_l_ri(RW4 r, IMM i)); DECLARE_MIDFUNC(shra_w_ri(RW2 r, IMM i)); DECLARE_MIDFUNC(shra_b_ri(RW1 r, IMM i)); DECLARE_MIDFUNC(setcc(W1 d, IMM cc)); -DECLARE_MIDFUNC(setcc_m(IMM d, IMM cc)); +DECLARE_MIDFUNC(setcc_m(MEMW d, IMM cc)); DECLARE_MIDFUNC(cmov_l_rr(RW4 d, RR4 s, IMM cc)); DECLARE_MIDFUNC(cmov_l_rm(RW4 d, MEMR s, IMM cc)); DECLARE_MIDFUNC(bsf_l_rr(W4 d, RR4 s)); @@ -156,7 +156,7 @@ DECLARE_MIDFUNC(and_l_ri(RW4 d, IMM i)); DECLARE_MIDFUNC(and_l(RW4 d, RR4 s)); DECLARE_MIDFUNC(and_w(RW2 d, RR2 s)); DECLARE_MIDFUNC(and_b(RW1 d, RR1 s)); -DECLARE_MIDFUNC(or_l_rm(RW4 d, IMM s)); +DECLARE_MIDFUNC(or_l_rm(RW4 d, MEMR s)); DECLARE_MIDFUNC(or_l_ri(RW4 d, IMM i)); DECLARE_MIDFUNC(or_l(RW4 d, RR4 s)); DECLARE_MIDFUNC(or_w(RW2 d, RR2 s)); diff --git a/jit/gencomp.cpp b/jit/gencomp.cpp index 3b2b1416..21aa146a 100644 --- a/jit/gencomp.cpp +++ b/jit/gencomp.cpp @@ -2020,6 +2020,14 @@ gen_opcode(unsigned int opcode) #endif is_const_jump; genamode(curi->smode, "srcreg", curi->size, "src", GENA_GETV_FETCH, GENA_MOVEM_DO_INC); + if (curi->size == sz_long) { + /* Sign-extend 32-bit displacement to pointer width for backward branches. + comp_get_ilong() returns uae_u32 which zero-extends to uintptr on 64-bit; + a negative displacement like 0xFFFFF000 must become 0xFFFFFFFFFFFFF000. + Uses get_const/mov_l_ri (accessible from generated code) instead of + isconst/live (static in compemu_support, not visible here). */ + comprintf("\tmov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src));\n"); + } start_brace(); comprintf("\tuae_u32 retadd=(uae_u32)(start_pc+((char *)comp_pc_p-(char *)start_pc_p)+m68k_pc_offset);\n"); comprintf("\tint ret=scratchie++;\n" @@ -2043,7 +2051,11 @@ gen_opcode(unsigned int opcode) switch (curi->size) { case sz_byte: comprintf("\tsign_extend_8_rr(src,src);\n"); break; case sz_word: comprintf("\tsign_extend_16_rr(src,src);\n"); break; - case sz_long: break; + case sz_long: + /* Sign-extend 32-bit displacement to pointer width for backward branches. + Same fix as BSR.L above. */ + comprintf("\tmov_l_ri(src, (uintptr)(uae_s32)(uae_u32)get_const(src));\n"); + break; } comprintf("\tsub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2);\n"); /* Leave the following as "add" --- it will allow it to be optimized @@ -2056,8 +2068,8 @@ gen_opcode(unsigned int opcode) comprintf("\tm68k_pc_offset=0;\n"); if (curi->cc >= 2) { - comprintf("\tuae_u32 v1=get_const(PC_P);\n" - "\tuae_u32 v2=get_const(src);\n" + comprintf("\tuintptr v1=get_const(PC_P);\n" + "\tuintptr v2=get_const(src);\n" "\tregister_branch(v1,v2,%d);\n", cond_codes[curi->cc]); comprintf("\tmake_flags_live();\n"); /* Load the flags */ @@ -2159,8 +2171,8 @@ gen_opcode(unsigned int opcode) comprintf("\tsub_w_ri(src,1);\n"); comprintf("\tend_needflags();\n"); start_brace(); - comprintf("\tuae_u32 v2;\n" - "\tuae_u32 v1=get_const(PC_P);\n"); + comprintf("\tuintptr v2;\n" + "\tuintptr v1=get_const(PC_P);\n"); comprintf("\tv2=get_const(offs);\n" "\tregister_branch(v1,v2,%d);\n", NATIVE_CC_CC); break; -- 2.47.3