diff --git a/src/README b/src/README index 9f254df51b..278dd29917 100644 --- a/src/README +++ b/src/README @@ -360,6 +360,13 @@ Configuration Options Athough `configure' flags control most options, some configrations options can be modified by setting flags in "racket/sconfig.h". +Some CPP flags control default settings in "racket/sconfig.h": + + * MZ_{USE_,NO_}JIT_SSE - {en,dis}ables use of SSE floating point + + * MZ_USE_DETERMINSTIC_FUEL - disables use of itimer or pthread for + Racket thread scheduling. + Modifying Racket ---------------- diff --git a/src/foreign/Makefile.in b/src/foreign/Makefile.in index 7d50a079f7..3b6a3c0873 100644 --- a/src/foreign/Makefile.in +++ b/src/foreign/Makefile.in @@ -34,6 +34,7 @@ libffi/libffi@FOREIGN_CONVENIENCE@.la: cd libffi; $(MAKE) libffi@FOREIGN_CONVENIENCE@.la foreign.@LTO@: $(srcdir)/foreign.c \ + $(srcdir)/../racket/sconfig.h \ $(srcdir)/../racket/include/scheme.h \ $(srcdir)/../racket/include/schthread.h \ $(srcdir)/../racket/src/schemef.h \ diff --git a/src/racket/sconfig.h b/src/racket/sconfig.h index f5b923c5c5..8ed9860560 100644 --- a/src/racket/sconfig.h +++ b/src/racket/sconfig.h @@ -597,7 +597,9 @@ # define NO_SLEEP # define WINDOWS_PROCESSES # define WINDOWS_FILE_HANDLES -# define USE_WIN32_THREAD_TIMER +# ifndef MZ_USE_DETERMINSTIC_FUEL +# define USE_WIN32_THREAD_TIMER +# endif # define SIGSET_IS_SIGNAL # define SIGSET_NEEDS_REINSTALL @@ -728,8 +730,10 @@ # define SYSTEM_TYPE_NAME "macosx" #endif -# undef USE_ITIMER -# define USE_PTHREAD_THREAD_TIMER +# ifndef MZ_USE_DETERMINSTIC_FUEL +# undef USE_ITIMER +# define USE_PTHREAD_THREAD_TIMER +# endif # define USE_MAP_ANON diff --git a/src/racket/src/jit.c b/src/racket/src/jit.c index 78d8a87156..49d2863388 100644 --- a/src/racket/src/jit.c +++ b/src/racket/src/jit.c @@ -1058,6 +1058,23 @@ static int finish_branch(mz_jit_state *jitter, int target, Branch_Info *for_bran #ifdef USE_FLONUM_UNBOXING +int scheme_generate_flonum_local_boxing(mz_jit_state *jitter, int pos, int offset, int target) +{ + GC_CAN_IGNORE jit_insn *ref; + __START_TINY_JUMPS__(1); + ref = jit_bnei_p(jit_forward(), target, NULL); + __END_TINY_JUMPS__(1); + CHECK_LIMIT(); + jit_movi_l(JIT_R0, offset); + (void)jit_calli(sjc.box_flonum_from_stack_code); + mz_rs_stxi(pos, JIT_R0); + __START_TINY_JUMPS__(1); + mz_patch_branch(ref); + __END_TINY_JUMPS__(1); + + return 1; +} + static int generate_flonum_local_boxing(mz_jit_state *jitter, int pos, int local_pos, int target) { int offset; @@ -1069,18 +1086,8 @@ static int generate_flonum_local_boxing(mz_jit_state *jitter, int pos, int local jit_ldxi_d_fppush(fpr0, JIT_FP, offset); jitter->unbox_depth++; } else { - GC_CAN_IGNORE jit_insn *ref; mz_rs_sync(); - __START_TINY_JUMPS__(1); - ref = jit_bnei_p(jit_forward(), target, NULL); - __END_TINY_JUMPS__(1); - CHECK_LIMIT(); - jit_movi_l(JIT_R0, offset); - (void)jit_calli(sjc.box_flonum_from_stack_code); - mz_rs_stxi(pos, JIT_R0); - __START_TINY_JUMPS__(1); - mz_patch_branch(ref); - __END_TINY_JUMPS__(1); + scheme_generate_flonum_local_boxing(jitter, pos, offset, target); } return 1; @@ -3292,7 +3299,7 @@ static int do_generate_closure(mz_jit_state *jitter, void *_data) GC_CAN_IGNORE jit_insn *zref; int f_offset; - /* In the case of an direct native call, the flonums can be + /* In the case of a direct native call, the flonums can be already unpacked, in which case JIT_SP is set up. Check whether JIT_SP is already different than the 0-flonums case. */ f_offset = JIT_FRAME_FLONUM_OFFSET - (jitter->flostack_space * sizeof(double)); diff --git a/src/racket/src/jit.h b/src/racket/src/jit.h index d53fde2882..929631ca67 100644 --- a/src/racket/src/jit.h +++ b/src/racket/src/jit.h @@ -417,6 +417,9 @@ void *scheme_jit_get_threadlocal_table(); # define _mz_tl_str_p(addr, tmp_reg, reg) jit_str_p(tmp_reg, reg) # define _mz_tl_str_l(addr, tmp_reg, reg) jit_str_l(tmp_reg, reg) # define _mz_tl_str_i(addr, tmp_reg, reg) jit_str_i(tmp_reg, reg) +# define mz_tl_addr_tmp_i(tmp_reg, addr) (jit_movr_l(JIT_R10, tmp_reg), mz_tl_addr(tmp_reg, addr)) +# define mz_tl_addr_untmp_i(tmp_reg) jit_movr_l(tmp_reg, JIT_R10) +# define mz_tl_tmp_reg_i(tmp_reg) tmp_reg # else # define THREAD_LOCAL_USES_JIT_V2 # ifdef THREAD_LOCAL_USES_JIT_V2 @@ -436,12 +439,15 @@ void *scheme_jit_get_threadlocal_table(); # define _mz_tl_str_l(addr, tmp_reg, reg) jit_str_l(tmp_reg, reg) # define _mz_tl_str_i(addr, tmp_reg, reg) jit_str_i(tmp_reg, reg) # endif +# define mz_tl_addr_tmp_i(tmp_reg, addr) mz_tl_addr_tmp(tmp_reg, addr) +# define mz_tl_addr_untmp_i(tmp_reg) mz_tl_addr_untmp(tmp_reg) +# define mz_tl_tmp_reg_i(tmp_reg) mz_tl_tmp_reg(tmp_reg) # endif /* A given tmp_reg doesn't have to be unused; it just has to be distinct from other arguments. */ # define mz_tl_sti_p(addr, reg, tmp_reg) (mz_tl_addr_tmp(tmp_reg, addr), _mz_tl_str_p(addr, mz_tl_tmp_reg(tmp_reg), reg), mz_tl_addr_untmp(tmp_reg)) # define mz_tl_sti_l(addr, reg, tmp_reg) (mz_tl_addr_tmp(tmp_reg, addr), _mz_tl_str_l(addr, mz_tl_tmp_reg(tmp_reg), reg), mz_tl_addr_untmp(tmp_reg)) -# define mz_tl_sti_i(addr, reg, tmp_reg) (mz_tl_addr_tmp(tmp_reg, addr), _mz_tl_str_i(addr, mz_tl_tmp_reg(tmp_reg), reg), mz_tl_addr_untmp(tmp_reg)) +# define mz_tl_sti_i(addr, reg, tmp_reg) (mz_tl_addr_tmp_i(tmp_reg, addr), _mz_tl_str_i(addr, mz_tl_tmp_reg_i(tmp_reg), reg), mz_tl_addr_untmp_i(tmp_reg)) # define mz_tl_ldi_p(reg, addr) (mz_tl_addr(reg, addr), jit_ldr_p(reg, reg)) # define mz_tl_ldi_l(reg, addr) (mz_tl_addr(reg, addr), jit_ldr_l(reg, reg)) # define mz_tl_ldi_i(reg, addr) (mz_tl_addr(reg, addr), jit_ldr_i(reg, reg)) @@ -1264,6 +1270,7 @@ int scheme_generate_unboxed(Scheme_Object *obj, mz_jit_state *jitter, int inline #ifdef USE_FLONUM_UNBOXING int scheme_generate_flonum_local_unboxing(mz_jit_state *jitter, int push); +int scheme_generate_flonum_local_boxing(mz_jit_state *jitter, int pos, int offset, int target); #endif int scheme_generate_unboxed(Scheme_Object *obj, mz_jit_state *jitter, int inlined_ok, int unbox_anyway); int scheme_generate_non_tail_mark_pos_prefix(mz_jit_state *jitter); diff --git a/src/racket/src/jitarith.c b/src/racket/src/jitarith.c index dc86d7a66b..19a2e93079 100644 --- a/src/racket/src/jitarith.c +++ b/src/racket/src/jitarith.c @@ -375,7 +375,7 @@ int scheme_generate_unboxing(mz_jit_state *jitter, int target) int fpr0; fpr0 = JIT_FPR_0(jitter->unbox_depth); - jit_ldxi_d_fppush(fpr0, target, &((Scheme_Double *)0x0)->double_val); + jit_ldxi_d_fppush(fpr0, target, &((Scheme_Double *)0x0)->double_val); jitter->unbox_depth++; return 1; diff --git a/src/racket/src/jitcall.c b/src/racket/src/jitcall.c index 18d1405cf7..e4541149a4 100644 --- a/src/racket/src/jitcall.c +++ b/src/racket/src/jitcall.c @@ -1165,18 +1165,19 @@ static int generate_self_tail_call(Scheme_Object *rator, mz_jit_state *jitter, i GC_CAN_IGNORE jit_insn *iref; mz_pushr_p(JIT_R0); mz_ld_runstack_base_alt(JIT_R2); - jit_subi_p(JIT_R2, JIT_RUNSTACK_BASE_OR_ALT(JIT_R2), WORDS_TO_BYTES(num_rands + closure_size + args_already_in_place)); - jit_ldxi_p(JIT_R0, JIT_R2, WORDS_TO_BYTES(i+closure_size)); + jit_subi_p(JIT_R2, JIT_RUNSTACK_BASE_OR_ALT(JIT_R2), WORDS_TO_BYTES(num_rands + args_already_in_place)); + jit_ldxi_p(JIT_R0, JIT_R2, WORDS_TO_BYTES(i)); mz_rs_sync(); __START_TINY_JUMPS__(1); iref = jit_bnei_p(jit_forward(), JIT_R0, NULL); __END_TINY_JUMPS__(1); { - mz_ld_fppush(JIT_FPR0, arg_tmp_offset); + int aoffset = JIT_FRAME_FLONUM_OFFSET - (arg_tmp_offset * sizeof(double)); + jit_movi_l(JIT_R0, aoffset); (void)jit_calli(sjc.box_flonum_from_stack_code); mz_ld_runstack_base_alt(JIT_R2); - jit_subi_p(JIT_R2, JIT_RUNSTACK_BASE_OR_ALT(JIT_R2), WORDS_TO_BYTES(num_rands + closure_size + args_already_in_place)); - jit_stxi_p(WORDS_TO_BYTES(i+closure_size), JIT_R2, JIT_R0); + jit_subi_p(JIT_R2, JIT_RUNSTACK_BASE_OR_ALT(JIT_R2), WORDS_TO_BYTES(num_rands + args_already_in_place)); + jit_stxi_p(WORDS_TO_BYTES(i), JIT_R2, JIT_R0); } __START_TINY_JUMPS__(1); mz_patch_branch(iref); @@ -1501,7 +1502,7 @@ static int generate_call_path_with_unboxes(mz_jit_state *jitter, int direct_flos GC_CAN_IGNORE jit_insn **_refdone, int num_rands, Scheme_Closure_Data *direct_data, Scheme_Object *rator) { - GC_CAN_IGNORE jit_insn *refdone, *refgo, *refcopy, *ref; + GC_CAN_IGNORE jit_insn *refdone, *refgo, *refcopy; int i, k, offset; refgo = jit_jmpi(jit_forward()); @@ -1547,16 +1548,7 @@ static int generate_call_path_with_unboxes(mz_jit_state *jitter, int direct_flos offset = jitter->flostack_offset - direct_flostack_offset + k; offset = JIT_FRAME_FLONUM_OFFSET - (offset * sizeof(double)); jit_ldxi_p(JIT_R0, JIT_RUNSTACK, WORDS_TO_BYTES(i)); - __START_TINY_JUMPS__(1); - ref = jit_bnei_p(jit_forward(), JIT_R0, NULL); - __END_TINY_JUMPS__(1); - CHECK_LIMIT(); - jit_movi_l(JIT_R0, offset); - (void)jit_calli(sjc.box_flonum_from_stack_code); - jit_stxi_p(WORDS_TO_BYTES(i), JIT_RUNSTACK, JIT_R0); - __START_TINY_JUMPS__(1); - mz_patch_branch(ref); - __END_TINY_JUMPS__(1); + scheme_generate_flonum_local_boxing(jitter, i, offset, JIT_R0); } } diff --git a/src/racket/uconfig.h b/src/racket/uconfig.h index e7744c9b9a..bf334ae8a9 100644 --- a/src/racket/uconfig.h +++ b/src/racket/uconfig.h @@ -37,8 +37,10 @@ #define USE_GETRUSAGE -#if defined(MZ_USE_PLACES) || defined(USE_PTHREAD_INSTEAD_OF_ITIMER) -# define USE_PTHREAD_THREAD_TIMER -#else -# define USE_ITIMER +#ifndef MZ_USE_DETERMINSTIC_FUEL +# if defined(MZ_USE_PLACES) || defined(USE_PTHREAD_INSTEAD_OF_ITIMER) +# define USE_PTHREAD_THREAD_TIMER +# else +# define USE_ITIMER +# endif #endif