win64: futures
This commit is contained in:
parent
43d69fa80e
commit
9dc827dec3
|
@ -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)) {
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue
Block a user