win64: futures

This commit is contained in:
Matthew Flatt 2010-12-05 13:15:16 -07:00
parent 43d69fa80e
commit 9dc827dec3
3 changed files with 24 additions and 6 deletions

View File

@ -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)) {

View File

@ -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();

View File

@ -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))