JIT x86: streamline store of a 32-bit constant

This commit is contained in:
Matthew Flatt 2012-11-13 08:25:02 -07:00
parent 91a5347d5b
commit 9e3f9fbe3e
6 changed files with 27 additions and 14 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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);
}

View File

@ -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) )

View File

@ -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

View File

@ -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