diff --git a/src/racket/sconfig.h b/src/racket/sconfig.h index 3188560562..f5b923c5c5 100644 --- a/src/racket/sconfig.h +++ b/src/racket/sconfig.h @@ -763,9 +763,13 @@ # define MZ_USE_JIT_I386 # ifndef MZ_NO_JIT_SSE # define MZ_USE_JIT_SSE -# define ASM_DBLPREC_CONTROL_87 # endif #endif + +#ifdef MZ_NO_JIT_SSE +# define ASM_DBLPREC_CONTROL_87 +#endif + # define MZ_JIT_USE_MPROTECT # define FLAGS_ALREADY_SET diff --git a/src/racket/src/future.c b/src/racket/src/future.c index 41caccb141..9dc48c1095 100644 --- a/src/racket/src/future.c +++ b/src/racket/src/future.c @@ -2151,6 +2151,8 @@ void *worker_thread_future_loop(void *arg) mzrt_mutex_unlock(fs->future_mutex); */ + scheme_configure_floating_point(); + mzrt_sema_create(&fts->worker_can_continue_sema, 0); scheme_use_rtcall = 1; diff --git a/src/racket/src/number.c b/src/racket/src/number.c index bd5b56e506..8ac33b3074 100644 --- a/src/racket/src/number.c +++ b/src/racket/src/number.c @@ -213,32 +213,11 @@ static void to_extended_prec(void) } #endif -void -scheme_init_number (Scheme_Env *env) -{ - Scheme_Object *p; - REGISTER_SO(scheme_pi); - REGISTER_SO(scheme_half_pi); - REGISTER_SO(scheme_zerod); - REGISTER_SO(scheme_nzerod); -#ifdef MZ_USE_SINGLE_FLOATS - REGISTER_SO(scheme_single_pi); - REGISTER_SO(scheme_zerof); - REGISTER_SO(scheme_nzerof); -#endif - REGISTER_SO(scheme_plus_i); - REGISTER_SO(scheme_minus_i); - REGISTER_SO(scheme_inf_object); - REGISTER_SO(scheme_minus_inf_object); - REGISTER_SO(scheme_nan_object); -#ifdef MZ_USE_SINGLE_FLOATS - REGISTER_SO(scheme_single_inf_object); - REGISTER_SO(scheme_single_minus_inf_object); - REGISTER_SO(scheme_single_nan_object); -#endif - - START_XFORM_SKIP; +void scheme_configure_floating_point(void) + XFORM_SKIP_PROC +/* can be called in any thread */ +{ #ifndef DONT_IGNORE_FPE_SIGNAL MZ_SIGSET(SIGFPE, SIG_IGN); #endif @@ -270,7 +249,35 @@ scheme_init_number (Scheme_Env *env) #ifdef ASM_DBLPREC_CONTROL_87 to_double_prec(); #endif - END_XFORM_SKIP; +} + + +void +scheme_init_number (Scheme_Env *env) +{ + Scheme_Object *p; + + REGISTER_SO(scheme_pi); + REGISTER_SO(scheme_half_pi); + REGISTER_SO(scheme_zerod); + REGISTER_SO(scheme_nzerod); +#ifdef MZ_USE_SINGLE_FLOATS + REGISTER_SO(scheme_single_pi); + REGISTER_SO(scheme_zerof); + REGISTER_SO(scheme_nzerof); +#endif + REGISTER_SO(scheme_plus_i); + REGISTER_SO(scheme_minus_i); + REGISTER_SO(scheme_inf_object); + REGISTER_SO(scheme_minus_inf_object); + REGISTER_SO(scheme_nan_object); +#ifdef MZ_USE_SINGLE_FLOATS + REGISTER_SO(scheme_single_inf_object); + REGISTER_SO(scheme_single_minus_inf_object); + REGISTER_SO(scheme_single_nan_object); +#endif + + scheme_configure_floating_point(); #if defined(HUGE_VAL) && !defined(USE_DIVIDE_MAKE_INFINITY) scheme_infinity_val = HUGE_VAL; diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index 2ef8bfb090..1aa4183832 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -1773,6 +1773,8 @@ intptr_t scheme_get_semaphore_init(const char *who, int n, Scheme_Object **p); # define scheme_exact_one scheme_make_integer(1) #endif +void scheme_configure_floating_point(void); + /****** Bignums *******/ #ifdef USE_LONG_LONG_FOR_BIGDIG