diff --git a/src/racket/src/future.c b/src/racket/src/future.c index 12673a20bf..1e00147f8b 100644 --- a/src/racket/src/future.c +++ b/src/racket/src/future.c @@ -1276,7 +1276,7 @@ static void future_do_runtimecall(Scheme_Future_Thread_State *fts, to suspend wouldn't accomplish anything). */ insist_to_suspend = !is_atomic; prefer_to_suspend = (insist_to_suspend || fs->future_queue_count); - + if (prefer_to_suspend && GC_gen0_alloc_page_ptr && capture_future_continuation(future, storage)) { diff --git a/src/racket/src/jit.c b/src/racket/src/jit.c index 6d91743c88..c4e9660ddc 100644 --- a/src/racket/src/jit.c +++ b/src/racket/src/jit.c @@ -1955,6 +1955,9 @@ typedef struct { intptr_t full_size, copy_size; #ifdef JIT_X86_64 intptr_t saved_r14, saved_r15; +# ifdef _WIN64 + intptr_t saved_r12, saved_r13; +# endif #endif Scheme_Object *result; void *new_runstack; @@ -11796,7 +11799,8 @@ static int do_generate_common(mz_jit_state *jitter, void *_data) jit_stxi_p(WORDS_TO_BYTES(1), JIT_RUNSTACK, JIT_R1); jit_stxi_p(WORDS_TO_BYTES(2), JIT_RUNSTACK, JIT_R2); JIT_UPDATE_THREAD_RSPTR(); - (void)jit_calli(ts_on_demand); /* DARWIN: stack needs to be 16-byte aligned */ + mz_prepare(0); + (void)mz_finish_lwe(ts_on_demand, ref); CHECK_LIMIT(); /* Restore registers and runstack, and jump to arity checking of newly-created code when argv == runstack (i.e., a tail call): */ @@ -13438,11 +13442,15 @@ static int do_generate_more_common(mz_jit_state *jitter, void *_data) #ifdef JIT_X86_64 jit_stxi_p((int)&((Apply_LWC_Args *)0x0)->saved_r14, JIT_R0, JIT_R(14)); jit_stxi_p((int)&((Apply_LWC_Args *)0x0)->saved_r15, JIT_R0, JIT_R(15)); +# ifdef _WIN64 + jit_stxi_p((int)&((Apply_LWC_Args *)0x0)->saved_r12, JIT_R0, JIT_R(12)); + jit_stxi_p((int)&((Apply_LWC_Args *)0x0)->saved_r13, JIT_R0, JIT_R(13)); +# endif #endif jit_prepare(1); jit_pusharg_p(JIT_R0); - (void)jit_calli(continuation_apply_install); + (void)mz_finish(continuation_apply_install); CHECK_LIMIT(); } @@ -13488,6 +13496,10 @@ static int do_generate_more_common(mz_jit_state *jitter, void *_data) # ifdef JIT_X86_64 /* saved_r14 is installed in the topmost frame already */ jit_ldxi_p(JIT_R(15), JIT_R0, (int)&((Apply_LWC_Args *)0x0)->saved_r15); +# ifdef _WIN64 + jit_ldxi_p(JIT_R(12), JIT_R0, (int)&((Apply_LWC_Args *)0x0)->saved_r12); + jit_ldxi_p(JIT_R(13), JIT_R0, (int)&((Apply_LWC_Args *)0x0)->saved_r13); +# endif # endif CHECK_LIMIT(); diff --git a/src/racket/src/lightning/i386/core.h b/src/racket/src/lightning/i386/core.h index 836c820cc9..064b5840ff 100644 --- a/src/racket/src/lightning/i386/core.h +++ b/src/racket/src/lightning/i386/core.h @@ -354,9 +354,15 @@ struct jit_local_state { before we set up the local frame: */ #define JIT_PREARG JIT_R0 #ifdef JIT_X86_64 -# define jit_getprearg__p(r) (MOVQrr(_EDI, r)) -# define jit_getprearg_pip_p(r) (MOVQrr(_ECX, r)) -# define jit_getprearg_pipp_p(r) (MOVQrr(JIT_R(8), r)) +# ifdef _WIN64 +# define jit_getprearg__p(r) (MOVQrr(_ECX, r)) +# define jit_getprearg_pip_p(r) (MOVQrr(JIT_R(9), r)) +# define jit_getprearg_pipp_p(r) (jit_ldxi_p(r, JIT_SP, 40)) +# else +# define jit_getprearg__p(r) (MOVQrr(_EDI, r)) +# define jit_getprearg_pip_p(r) (MOVQrr(_ECX, r)) +# define jit_getprearg_pipp_p(r) (MOVQrr(JIT_R(8), r)) +# endif #else # define jit_getprearg__p(r) (jit_ldxi_p(r, JIT_SP, 4)) # define jit_getprearg_pip_p(r) (jit_ldxi_p(r, JIT_SP, 16))