]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Fix x64 JIT pointer-width codegen
authorDimitris Panokostas <midwan@gmail.com>
Tue, 19 May 2026 21:00:04 +0000 (23:00 +0200)
committerDimitris Panokostas <midwan@gmail.com>
Tue, 19 May 2026 21:18:57 +0000 (23:18 +0200)
jit/codegen_x86.h
jit/compemu.cpp
jit/compemu_midfunc_x86.cpp
jit/compemu_midfunc_x86.h
jit/gencomp.cpp

index fb4f1230d34bf94085a87bd3625213eab7a9bad0..f2413c58a98b4a9f0fe2334daf7f83bfaf8e034a 100644 (file)
@@ -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       ))))  : \
index 42ffd3a0d4deb3ac5ecdda64e862c1bea849f8f9..42fda8b945eff23db8ea434ae12c55896ee2910c 100644 (file)
@@ -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();
                }
index 87bf31715cf1fbfce78b6ba469601568a63de82f..9b292fb4fffd7b150b1d8a0061ddc11ad1f1dea6 100644 (file)
@@ -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);
index 2b04e647e98e18c98d5523db7ff554358b000ef4..fe6976112426c1b63960540d521bae31f2013b0e 100644 (file)
@@ -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));
index 3b2b1416f0ed6b1d7e6da7fb099cd845b33c531b..21aa146a93295c687c9ea47f73d912a5c082b1fc 100644 (file)
@@ -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;