fixed arithmetic-shift for x86

svn: r2199
This commit is contained in:
Matthew Flatt 2006-02-11 15:08:57 +00:00
parent 54f97b5489
commit b6bf45a003
2 changed files with 13 additions and 1 deletions

View File

@ -1603,7 +1603,13 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj
jit_notr_l(JIT_V1, v2);
jit_rshi_l(JIT_V1, JIT_V1, 0x1);
jit_addi_l(JIT_V1, JIT_V1, 0x1);
#ifdef MZ_USE_JIT_I386
/* Can't shift from _ECX */
jit_movr_l(JIT_R2, v1);
jit_rshr_l(JIT_R2, JIT_R2, JIT_V1);
#else
jit_rshr_l(JIT_R2, v1, JIT_V1);
#endif
jit_ori_l(JIT_R0, JIT_R2, 0x1);
refc = jit_jmpi(jit_forward());
@ -1612,7 +1618,13 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj
(void)jit_bgti_l(refslow, v2, scheme_make_integer(MAX_TRY_SHIFT));
jit_rshi_l(JIT_V1, v2, 0x1);
jit_andi_l(v1, v1, (~0x1));
#ifdef MZ_USE_JIT_I386
/* Can't shift from _ECX */
jit_movr_l(JIT_R2, v1);
jit_lshr_l(JIT_R2, JIT_R2, JIT_V1);
#else
jit_lshr_l(JIT_R2, v1, JIT_V1);
#endif
/* If shifting back right produces a different result, that's overflow... */
jit_rshr_l(JIT_V1, JIT_R2, JIT_V1);
/* !! In case we go refslow, it nseed to add back tag to v1 !! */

View File

@ -281,7 +281,7 @@ scheme_init_number (Scheme_Env *env)
scheme_add_global_constant("bitwise-not", p, env);
p = scheme_make_folding_prim(scheme_bitwise_shift, "arithmetic-shift", 2, 2, 1);
/* SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; */
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_add_global_constant("arithmetic-shift", p, env);
scheme_add_global_constant("gcd",