x86 JIT: use LEA for fixnum tagging

This has no effect on performance that I can detect, but it
looks better.
This commit is contained in:
Matthew Flatt 2012-11-10 08:32:48 -07:00
parent b223ad2d90
commit 54c4a1f21a
6 changed files with 29 additions and 35 deletions

View File

@ -1432,8 +1432,7 @@ static int generate_non_tail_with_branch(Scheme_Object *obj, mz_jit_state *jitte
using_local1 = 2;
} else {
/* mark stack is an integer... turn it into a pointer */
jit_lshi_l(JIT_R2, JIT_R2, 0x1);
jit_ori_l(JIT_R2, JIT_R2, 0x1);
jit_fixnum_l(JIT_R2, JIT_R2);
mz_pushr_p(JIT_R2); /* no sync */
# ifdef MZ_USE_LWC
/* For lighweight continuations, we need to be able to recognize
@ -2047,8 +2046,7 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
mz_tl_ldi_p(JIT_R0, tl_scheme_current_thread);
CHECK_LIMIT();
jit_ldxi_l(JIT_V1, JIT_R0, &((Scheme_Thread *)0x0)->ku.multiple.count);
jit_lshi_l(JIT_V1, JIT_V1, 0x1);
jit_ori_l(JIT_V1, JIT_V1, 0x1);
jit_fixnum_l(JIT_V1, JIT_V1);
mz_pushr_p(JIT_V1); /* sync'd below */
jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Thread *)0x0)->ku.multiple.array);
mz_pushr_p(JIT_V1); /* sync'd below */

View File

@ -914,6 +914,13 @@ static jit_insn *fp_tmpr;
# define mz_bnei_p(a, v, i) jit_bnei_p(a, v, i)
#endif
#ifdef jit_leai_l
# define jit_fixnum_l(JIT_Rdest, JIT_Rsrc) jit_leai_l(JIT_Rdest, JIT_Rsrc, 1, 1)
#else
# define jit_fixnum_l(JIT_Rdest, JIT_Rsrc) (jit_lshi_l(JIT_Rdest, JIT_Rsrc, 1), \
jit_ori_l(JIT_Rdest, JIT_Rdest, 0x1))
#endif
/*
About short-jump mode:

View File

@ -590,8 +590,7 @@ static int generate_double_arith(mz_jit_state *jitter, Scheme_Object *rator,
jit_roundr_d_l_fppop(JIT_R1, fpr2); /* slow path won't be needed */
#endif
}
jit_lshi_l(JIT_R0, JIT_R1, 1);
jit_ori_l(JIT_R0, JIT_R0, 0x1);
jit_fixnum_l(JIT_R0, JIT_R1);
no_alloc = 1;
break;
case ARITH_SQRT:
@ -1363,11 +1362,11 @@ int scheme_generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj
refx = jit_beqr_l(jit_forward(), JIT_R2, JIT_V1);
__END_INNER_TINY__(branch_short);
/* restore R0 argument: */
if (reversed)
jit_lshi_l(JIT_R0, JIT_V1, 1);
else
jit_lshi_l(JIT_R0, JIT_R2, 1);
jit_ori_l(JIT_R0, JIT_R0, 0x1);
if (reversed) {
jit_fixnum_l(JIT_R0, JIT_V1);
} else {
jit_fixnum_l(JIT_R0, JIT_R2);
}
(void)jit_jmpi(refslow);
__START_INNER_TINY__(branch_short);
mz_patch_branch(refx);
@ -1404,8 +1403,7 @@ int scheme_generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj
__END_INNER_TINY__(branch_short);
}
}
jit_lshi_l(JIT_R0, JIT_R0, 1);
jit_ori_l(JIT_R0, JIT_R0, 0x1);
jit_fixnum_l(JIT_R0, JIT_R0);
} else if (arith == ARITH_AND) {
/* and */
jit_andr_ul(JIT_R0, JIT_R1, JIT_R0);

View File

@ -720,8 +720,7 @@ static int common2(mz_jit_state *jitter, void *_data)
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(2));
CHECK_RUNSTACK_OVERFLOW();
jit_str_p(JIT_RUNSTACK, JIT_R0);
jit_lshi_ul(JIT_R1, JIT_R1, 0x1);
jit_ori_ul(JIT_R1, JIT_R1, 0x1);
jit_fixnum_l(JIT_R1, JIT_R1);
CHECK_LIMIT();
jit_stxi_p(WORDS_TO_BYTES(1), JIT_RUNSTACK, JIT_R1);
JIT_UPDATE_THREAD_RSPTR();
@ -1150,8 +1149,7 @@ static int common3(mz_jit_state *jitter, void *_data)
if (i)
jit_stxi_p(WORDS_TO_BYTES(1), JIT_RUNSTACK, JIT_R1);
else {
jit_lshi_ul(JIT_R2, JIT_R1, 0x1);
jit_ori_ul(JIT_R2, JIT_R2, 0x1);
jit_fixnum_l(JIT_R2, JIT_R1);
jit_stxi_p(WORDS_TO_BYTES(1), JIT_RUNSTACK, JIT_R2);
}
}
@ -1164,8 +1162,7 @@ static int common3(mz_jit_state *jitter, void *_data)
if (ii != -1) {
/* in chaperone mode, we already saved original and index on runstack */
if (!i) {
jit_lshi_ul(JIT_R1, JIT_R1, 1);
jit_ori_ul(JIT_R1, JIT_R1, 0x1);
jit_fixnum_l(JIT_R1, JIT_R1);
}
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(2));
CHECK_RUNSTACK_OVERFLOW();
@ -1296,8 +1293,7 @@ static int common3(mz_jit_state *jitter, void *_data)
jit_ldxi_p(JIT_R0, JIT_R0, offset);
jit_ldxr_c(JIT_R0, JIT_R0, JIT_V1);
jit_extr_uc_ul(JIT_R0, JIT_R0);
jit_lshi_l(JIT_R0, JIT_R0, 0x1);
jit_ori_l(JIT_R0, JIT_R0, 0x1);
jit_fixnum_l(JIT_R0, JIT_R0);
break;
}
@ -2642,8 +2638,7 @@ static int common8(mz_jit_state *jitter, void *_data)
/* Return result: */
mz_patch_branch(ref2);
__END_SHORT_JUMPS__(1);
jit_lshi_l(JIT_R0, JIT_R1, 1);
jit_ori_l(JIT_R0, JIT_R0, 1);
jit_fixnum_l(JIT_R0, JIT_R1);
ref1 = _jit.x.pc;
mz_epilog(JIT_R2);

View File

@ -1393,8 +1393,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
(void)jit_ldxi_l(JIT_R0, JIT_R0, &SCHEME_VEC_SIZE(0x0));
else
(void)jit_ldxi_l(JIT_R0, JIT_R0, &SCHEME_FLVEC_SIZE(0x0));
jit_lshi_l(JIT_R0, JIT_R0, 1);
jit_ori_l(JIT_R0, JIT_R0, 0x1);
jit_fixnum_l(JIT_R0, JIT_R0);
return 1;
} else if (IS_NAMED_PRIM(rator, "unsafe-string-length")
@ -1412,8 +1411,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
(void)jit_ldxi_l(JIT_R0, JIT_R0, &SCHEME_CHAR_STRLEN_VAL(0x0));
else
(void)jit_ldxi_l(JIT_R0, JIT_R0, &SCHEME_BYTE_STRLEN_VAL(0x0));
jit_lshi_l(JIT_R0, JIT_R0, 1);
jit_ori_l(JIT_R0, JIT_R0, 0x1);
jit_fixnum_l(JIT_R0, JIT_R0);
return 1;
} else if (IS_NAMED_PRIM(rator, "unbox")) {
@ -1995,8 +1993,7 @@ static int generate_vector_op(mz_jit_state *jitter, int set, int int_ready, int
reffail = _jit.x.pc;
if (int_ready) {
jit_lshi_ul(JIT_R1, JIT_R1, 1);
jit_ori_l(JIT_R1, JIT_R1, 0x1);
jit_fixnum_l(JIT_R1, JIT_R1);
}
if (set) {
if (for_struct)
@ -2721,8 +2718,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i
jit_ldxi_p(JIT_R0, JIT_R0, &SCHEME_CHAR_STR_VAL((Scheme_Object *)0x0));
jit_ldxr_c(JIT_R0, JIT_R0, JIT_R1);
jit_extr_uc_ul(JIT_R0, JIT_R0);
jit_lshi_l(JIT_R0, JIT_R0, 0x1);
jit_ori_l(JIT_R0, JIT_R0, 0x1);
jit_fixnum_l(JIT_R0, JIT_R0);
CHECK_LIMIT();
} else {
(void)jit_calli(sjc.bytes_ref_check_index_code);
@ -2776,8 +2772,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i
jit_ldxi_p(JIT_R0, JIT_R0, &SCHEME_CHAR_STR_VAL((Scheme_Object *)0x0));
jit_ldxr_c(JIT_R0, JIT_R0, JIT_V1);
jit_extr_uc_ul(JIT_R0, JIT_R0);
jit_lshi_l(JIT_R0, JIT_R0, 0x1);
jit_ori_l(JIT_R0, JIT_R0, 0x1);
jit_fixnum_l(JIT_R0, JIT_R0);
} else {
(void)jit_calli(sjc.bytes_ref_code);
}
@ -2844,8 +2839,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i
else
jit_ldxr_s(JIT_R0, JIT_R0, JIT_R1);
jit_lshi_l(JIT_R0, JIT_R0, 0x1);
jit_ori_l(JIT_R0, JIT_R0, 0x1);
jit_fixnum_l(JIT_R0, JIT_R0);
return 1;
} else if (IS_NAMED_PRIM(rator, "list-ref")

View File

@ -353,6 +353,8 @@ struct jit_local_state {
#define jit_rshr_l(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_qop_ ((d), (r1), SARQrr(_CL, (d)) ))
#define jit_rshr_ul(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_qop_ ((d), (r1), SHRQrr(_CL, (d)) ))
#define jit_leai_l(d, rs, is, js) LEAQmr((is), 0, (rs), 1 << (js), (d))
/* Stack */
#define jit_pushi_i(is) PUSHLi(is)
#define jit_pushr_i(rs) PUSHLr(rs)