diff --git a/src/racket/src/jitalloc.c b/src/racket/src/jitalloc.c index c3dda0ddc1..44c695d3d7 100644 --- a/src/racket/src/jitalloc.c +++ b/src/racket/src/jitalloc.c @@ -160,18 +160,15 @@ int scheme_inline_alloc(mz_jit_state *jitter, int amt, Scheme_Type ty, int immut a_word = GC_pair_initial_word(amt); else a_word = GC_initial_word(amt); - jit_movi_l(JIT_R2, a_word); - jit_str_l(JIT_V1, JIT_R2); + jit_stir_l(JIT_V1, a_word); /* Scheme_Object header: */ a_word = initial_tag_word(ty, immut); - jit_movi_l(JIT_R2, a_word); - jit_stxi_l(sizeof(intptr_t), JIT_V1, JIT_R2); + jit_stixi_l(sizeof(intptr_t), JIT_V1, a_word); } else { /* an array of pointers */ a_word = GC_array_initial_word(amt); - jit_movi_l(JIT_R2, a_word); - jit_str_l(JIT_V1, JIT_R2); + jit_stir_l(JIT_V1, a_word); } CHECK_LIMIT(); diff --git a/src/racket/src/jitcall.c b/src/racket/src/jitcall.c index 6c594f206e..af47b15b21 100644 --- a/src/racket/src/jitcall.c +++ b/src/racket/src/jitcall.c @@ -653,8 +653,7 @@ static int generate_retry_call(mz_jit_state *jitter, int num_rands, int multi_ok CHECK_LIMIT(); /* Clear tail-call arguments pointer: */ - (void)jit_movi_p(JIT_V1, NULL); - jit_stxi_p(&((Scheme_Thread *)0x0)->ku.apply.tail_rands, JIT_R1, JIT_V1); + jit_stixi_p(&((Scheme_Thread *)0x0)->ku.apply.tail_rands, JIT_R1, NULL); CHECK_LIMIT(); /* R1 is still the thread. @@ -708,8 +707,7 @@ static int generate_ignored_result_check(mz_jit_state *jitter) refm = jit_bnei_p(jit_forward(), JIT_R0, SCHEME_MULTIPLE_VALUES); mz_tl_ldi_p(JIT_R1, tl_scheme_current_thread); - (void)jit_movi_p(JIT_R0, NULL); - jit_stxi_p(&((Scheme_Thread *)0x0)->ku.multiple.array, JIT_R1, JIT_R0); + jit_stixi_p(&((Scheme_Thread *)0x0)->ku.multiple.array, JIT_R1, NULL); (void)jit_movi_p(JIT_R0, scheme_void); mz_patch_branch(refm); diff --git a/src/racket/src/jitinline.c b/src/racket/src/jitinline.c index 26097ddc7d..3d46e6c331 100644 --- a/src/racket/src/jitinline.c +++ b/src/racket/src/jitinline.c @@ -3827,9 +3827,8 @@ int scheme_generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int mz_runstack_popped(jitter, c); } else { mz_tl_ldi_p(JIT_R2, tl_scheme_current_thread); - jit_movi_l(JIT_R0, 0); - jit_stxi_l(((int)&((Scheme_Thread *)0x0)->ku.multiple.count), JIT_R2, JIT_R0); - jit_stxi_p(((int)&((Scheme_Thread *)0x0)->ku.multiple.array), JIT_R2, JIT_R0); + jit_stixi_l(((int)&((Scheme_Thread *)0x0)->ku.multiple.count), JIT_R2, 0); + jit_stixi_p(((int)&((Scheme_Thread *)0x0)->ku.multiple.array), JIT_R2, NULL); (void)jit_movi_p(dest, SCHEME_MULTIPLE_VALUES); } diff --git a/src/racket/src/lightning/i386/asm.h b/src/racket/src/lightning/i386/asm.h index 6cc2b2de73..1a7305b8e6 100644 --- a/src/racket/src/lightning/i386/asm.h +++ b/src/racket/src/lightning/i386/asm.h @@ -272,12 +272,14 @@ typedef _uc jit_insn; #define _O_r_X_B( OP ,R ,MD,MB,MI,MS,B ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_jit_B(B) ) #define _O_r_X_W( OP ,R ,MD,MB,MI,MS,W ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_jit_W(W) ) #define _O_r_X_L( OP ,R ,MD,MB,MI,MS,L ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_jit_I(L) ) +#define _qO_r_X_L( OP ,R ,MD,MB,MI,MS,L ) ( _qO ( OP,R,0,MB),_r_X( R ,MD,MB,MI,MS) ,_jit_I(L) ) #define _OO_r_X_B( OP ,R ,MD,MB,MI,MS,B ) ( _OO ( OP ),_r_X( R ,MD,MB,MI,MS) ,_jit_B(B) ) #define _Os_r_X_sW(OP ,R ,MD,MB,MI,MS,W ) ( _Os ( OP,W),_r_X( R ,MD,MB,MI,MS),_sW(W) ) #define _Os_r_X_sL(OP ,R ,MD,MB,MI,MS,L ) ( _Os ( OP,L),_r_X( R ,MD,MB,MI,MS),_sL(L) ) #define _O_X_B( OP ,MD,MB,MI,MS,B ) ( _O_r_X_B( OP ,0 ,MD,MB,MI,MS ,B) ) #define _O_X_W( OP ,MD,MB,MI,MS,W ) ( _O_r_X_W( OP ,0 ,MD,MB,MI,MS ,W) ) #define _O_X_L( OP ,MD,MB,MI,MS,L ) ( _O_r_X_L( OP ,0 ,MD,MB,MI,MS ,L) ) +#define _qO_X_L( OP ,MD,MB,MI,MS,L ) ( _qO_r_X_L( OP ,0 ,MD,MB,MI,MS ,L) ) #define _wO( OP ) (_d16(), _O( OP ) ) #define _wOr( OP,R ) (_d16(), _Or( OP,R ) ) #define _wOr_W( OP,R ,W ) (_d16(), _Or_W( OP,R ,W) ) @@ -700,13 +702,15 @@ typedef _uc jit_insn; #define MOVLrm(RS, MD, MB, MI, MS) _O_r_X (0x89 ,_r4(RS) ,MD,MB,MI,MS ) #define MOVLQrm(RS, MD, MB, MI, MS) _qOd_r_X (0x89 ,_r8(RS) ,MD,MB,MI,MS ) #define MOVLir(IM, R) _Or_L (0xb8,_r4(R) ,IM ) -#define MOVLim(IM, MD, MB, MI, MS) _O_X_L (0xc7 ,MD,MB,MI,MS ,IM ) +#define MOVLiQr(IM, R) (_REXd(0,0,R), MOVLir(IM, R)) +#define MOVLim(IM, MD, MB, MI, MS) _qOd_X_L (0xc7 ,MD,MB,MI,MS ,IM ) #define MOVQmr(MD, MB, MI, MS, RD) _qO_r_X (0x8b ,_r8(RD) ,MD,MB,MI,MS ) #define MOVQmQr(MD, MB, MI, MS, RD) _qO_r_XB (0x8b ,_r8(RD) ,MD,MB,MI,MS ) #define MOVQrm(RS, MD, MB, MI, MS) _qOd_r_X (0x89 ,_r8(RS) ,MD,MB,MI,MS ) #define MOVQrQm(RS, MD, MB, MI, MS) _qO_r_XB (0x89 ,_r8(RS) ,MD,MB,MI,MS ) #define MOVQir(IM, R) _qOr_Q (0xb8,_r8(R) ,IM ) +#define MOVQim(IM, MD, MB, MI, MS) _qO_X_L (0xc7 ,MD,MB,MI,MS ,IM ) #define MOVQrr(RS, RD) _qO_Mrm (0x89 ,_b11,_r8(RS),_r8(RD) ) diff --git a/src/racket/src/lightning/i386/core.h b/src/racket/src/lightning/i386/core.h index 9003a505b2..8c874ccaf1 100644 --- a/src/racket/src/lightning/i386/core.h +++ b/src/racket/src/lightning/i386/core.h @@ -699,18 +699,28 @@ XFORM_NONGCING static intptr_t _CHECK_TINY(intptr_t diff) { if ((diff < -128) || #define jit_stxr_l(d1, d2, rs) MOVQrQm((rs), 0, (d1), (d2), 1) #define jit_stxi_l(id, rd, rs) MOVQrQm((rs), (id), (rd), 0, 0) +#define _jit_stir_l(rd, is) MOVQim((is), 0, (rd), 0, 0) +#define _jit_stixi_l(id, rd, is) MOVQim((is), (id), (rd), 0, 0) + #ifdef JIT_X86_64 # define jit_ldi_l(d, is) (_u32P((intptr_t)(is)) ? _jit_ldi_l(d, is) : (jit_movi_l(d, is), jit_ldr_l(d, d))) # define jit_sti_l(id, rs) (_u32P((intptr_t)(id)) ? _jit_sti_l(id, rs) : (jit_movi_l(JIT_REXTMP, (intptr_t)(id)), MOVQrQm(rs, 0, JIT_REXTMP, 0, 0))) # define jit_ldi_i(d, is) (_u32P((intptr_t)(is)) ? _jit_ldi_i(d, is) : (jit_movi_l(d, is), jit_ldr_i(d, d))) # define jit_sti_i(id, rs) (_u32P((intptr_t)(id)) ? _jit_sti_i(id, rs) : (jit_movi_l(JIT_REXTMP, (intptr_t)(id)), MOVQrm(rs, 0, JIT_REXTMP, 0, 0))) +# define jit_stir_l(rd, is) (_u32P((intptr_t)(is)) ? _jit_stir_l(rd, is) : (jit_movi_l(JIT_REXTMP, (intptr_t)(is)), jit_str_l(rd, JIT_REXTMP))) +# define jit_stixi_l(id, rd, is) (_u32P((intptr_t)(is)) ? _jit_stixi_l(id, rd, is) : (jit_movi_l(JIT_REXTMP, is), jit_stxi_l(id, rd, JIT_REXTMP))) #else # define jit_ldi_l(d, is) _jit_ldi_l(d, is) # define jit_sti_l(id, rs) _jit_sti_l(id, rs) # define jit_ldi_i(d, is) _jit_ldi_i(d, is) # define jit_sti_i(id, rs) _jit_sti_i(id, rs) +# define jit_stir_l(rd, is) _jit_stir_l(rd, is) +# define jit_stixi_l(id, rd, is) _jit_stixi_l(id, rd, is) #endif +#define jit_stir_p(rd, is) jit_stir_l(rd, is) +#define jit_stixi_p(id, rd, is) jit_stixi_l(id, rd, is) + #define jit_lock_cmpxchgr_i(rd, rs) LOCK_PREFIX(CMPXCHGr(rd, rs)) #define jit_lock_cmpxchgr_s(rd, rs) LOCK_PREFIX(CMPXCHGWr(rd, rs)) #ifdef JIT_X86_64 diff --git a/src/racket/src/lightning/ppc/core.h b/src/racket/src/lightning/ppc/core.h index 1b85586541..266de6e070 100644 --- a/src/racket/src/lightning/ppc/core.h +++ b/src/racket/src/lightning/ppc/core.h @@ -285,6 +285,11 @@ struct jit_local_state { #define jit_ldr_uc(rd, rs) jit_ldxr_uc((rd), 0, (rs)) #define jit_ldr_us(rd, rs) jit_ldxr_us((rd), 0, (rs)) +#define jit_stir_l(rd, is) (jit_movi_l(JIT_AUX, (intptr_t)(is)), jit_str_l(rd, JIT_AUX)) +#define jit_stixi_l(id, rd, is) (jit_movi_l(JIT_AUX, is), jit_stxi_l(id, rd, JIT_AUX)) +#define jit_stir_p(rd, is) jit_stir_l(rd, is) +#define jit_stixi_p(id, rd, is) jit_stixi_l(id, rd, is) + /* e.g. * 0x01234567 _HA << 16 = 0x01230000 _LA = 0x00004567 _HA << 16 + LA = 0x01234567 * 0x89abcdef _HA << 16 = 0x89ac0000 _LA = 0xffffcdef _HA << 16 + LA = 0x89abcdef