faster JITted path to `equal?'

This commit is contained in:
Matthew Flatt 2011-04-23 10:22:47 -06:00
parent 45d7635188
commit f4303cbef8
10 changed files with 195 additions and 93 deletions

View File

@ -15,7 +15,8 @@
(namespace-require 'racket/flonum) (namespace-require 'racket/flonum)
(namespace-require 'racket/fixnum) (namespace-require 'racket/fixnum)
(let* ([check-error-message (lambda (name proc [fixnum? #f]) (let* ([check-error-message (lambda (name proc [fixnum? #f])
(unless (memq name '(eq? eqv? not null? pair? list? (unless (memq name '(eq? eqv? equal?
not null? pair? list?
real? number? boolean? real? number? boolean?
procedure? symbol? procedure? symbol?
string? bytes? string? bytes?
@ -190,6 +191,9 @@
(bin-exact #t 'eqv? 1+2i 1+2i) (bin-exact #t 'eqv? 1+2i 1+2i)
(bin-exact #f 'eqv? 1+2i 1+3i) (bin-exact #f 'eqv? 1+2i 1+3i)
(bin-exact #f 'equal? 0 10)
(bin-exact #t 'equal? "apple" "apple")
(un #t 'zero? 0) (un #t 'zero? 0)
(un #f 'zero? 1) (un #f 'zero? 1)
(un #f 'zero? -1) (un #f 'zero? -1)

View File

@ -100,7 +100,9 @@ void scheme_init_bool (Scheme_Env *env)
scheme_eqv_prim = p; scheme_eqv_prim = p;
scheme_add_global_constant("eqv?", scheme_eqv_prim, env); scheme_add_global_constant("eqv?", scheme_eqv_prim, env);
scheme_equal_prim = scheme_make_prim_w_arity(equal_prim, "equal?", 2, 2); p = scheme_make_prim_w_arity(equal_prim, "equal?", 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_equal_prim = p;
scheme_add_global_constant("equal?", scheme_equal_prim, env); scheme_add_global_constant("equal?", scheme_equal_prim, env);
scheme_add_global_constant("equal?/recur", scheme_add_global_constant("equal?/recur",

View File

@ -111,6 +111,7 @@ typedef struct future_t {
Scheme_Object *retval_s; Scheme_Object *retval_s;
void *retval_p; /* use only with conservative GC */ void *retval_p; /* use only with conservative GC */
MZ_MARK_STACK_TYPE retval_m; MZ_MARK_STACK_TYPE retval_m;
int retval_i;
int no_retval, retval_is_rs_argv; int no_retval, retval_is_rs_argv;
Scheme_Object **multiple_array; Scheme_Object **multiple_array;

View File

@ -191,7 +191,8 @@
siS_v siS_v
z_p z_p
si_s si_s
sis_v)) sis_v
ss_i))
(with-output-to-file "jit_ts_def.c" (with-output-to-file "jit_ts_def.c"
#:exists 'replace #:exists 'replace

View File

@ -104,6 +104,7 @@ define_ts_ss_s(scheme_jit_make_two_element_vector, FSRC_OTHER)
define_ts_l_s(scheme_jit_make_ivector, FSRC_OTHER) define_ts_l_s(scheme_jit_make_ivector, FSRC_OTHER)
define_ts_l_s(scheme_jit_make_vector, FSRC_OTHER) define_ts_l_s(scheme_jit_make_vector, FSRC_OTHER)
# endif # endif
define_ts_ss_i(scheme_equal, FSRC_OTHER)
#endif #endif
#ifdef JIT_APPLY_TS_PROCS #ifdef JIT_APPLY_TS_PROCS
@ -172,6 +173,7 @@ define_ts_s_s(scheme_box, FSRC_OTHER)
# define ts_scheme_fxvector_length scheme_fxvector_length # define ts_scheme_fxvector_length scheme_fxvector_length
# define ts_scheme_struct_ref scheme_struct_ref # define ts_scheme_struct_ref scheme_struct_ref
# define ts_scheme_struct_set scheme_struct_set # define ts_scheme_struct_set scheme_struct_set
# define ts_scheme_equal scheme_equal
# define ts_tail_call_with_values_from_multiple_result tail_call_with_values_from_multiple_result # define ts_tail_call_with_values_from_multiple_result tail_call_with_values_from_multiple_result
# define ts_raise_bad_call_with_values raise_bad_call_with_values # define ts_raise_bad_call_with_values raise_bad_call_with_values
# define ts_call_with_values_from_multiple_result_multi call_with_values_from_multiple_result_multi # define ts_call_with_values_from_multiple_result_multi call_with_values_from_multiple_result_multi

View File

@ -205,3 +205,12 @@ static void ts_ ## id(Scheme_Object* g48, int g49, Scheme_Object* g50) \
else \ else \
id(g48, g49, g50); \ id(g48, g49, g50); \
} }
#define define_ts_ss_i(id, src_type) \
static int ts_ ## id(Scheme_Object* g51, Scheme_Object* g52) \
XFORM_SKIP_PROC \
{ \
if (scheme_use_rtcall) \
return scheme_rtcall_ss_i("[" #id "]", src_type, id, g51, g52); \
else \
return id(g51, g52); \
}

View File

@ -1,4 +1,4 @@
Scheme_Object* scheme_rtcall_siS_s(const char *who, int src_type, prim_siS_s f, Scheme_Object* g51, int g52, Scheme_Object** g53) Scheme_Object* scheme_rtcall_siS_s(const char *who, int src_type, prim_siS_s f, Scheme_Object* g53, int g54, Scheme_Object** g55)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -13,9 +13,9 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_s0 = g51; future->arg_s0 = g53;
future->arg_i1 = g52; future->arg_i1 = g54;
future->arg_S2 = g53; future->arg_S2 = g55;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -24,7 +24,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
Scheme_Object* scheme_rtcall_iSs_s(const char *who, int src_type, prim_iSs_s f, int g54, Scheme_Object** g55, Scheme_Object* g56) Scheme_Object* scheme_rtcall_iSs_s(const char *who, int src_type, prim_iSs_s f, int g56, Scheme_Object** g57, Scheme_Object* g58)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -39,9 +39,9 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_i0 = g54; future->arg_i0 = g56;
future->arg_S1 = g55; future->arg_S1 = g57;
future->arg_s2 = g56; future->arg_s2 = g58;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -50,7 +50,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
Scheme_Object* scheme_rtcall_s_s(const char *who, int src_type, prim_s_s f, Scheme_Object* g57) Scheme_Object* scheme_rtcall_s_s(const char *who, int src_type, prim_s_s f, Scheme_Object* g59)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -65,8 +65,8 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_s0 = g57; future->arg_s0 = g59;
send_special_result(future, g57); send_special_result(future, g59);
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
retval = future->retval_s; retval = future->retval_s;
@ -74,7 +74,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
Scheme_Object* scheme_rtcall_n_s(const char *who, int src_type, prim_n_s f, Scheme_Native_Closure_Data* g58) Scheme_Object* scheme_rtcall_n_s(const char *who, int src_type, prim_n_s f, Scheme_Native_Closure_Data* g60)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -89,7 +89,7 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_n0 = g58; future->arg_n0 = g60;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -122,7 +122,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
Scheme_Object* scheme_rtcall_ss_s(const char *who, int src_type, prim_ss_s f, Scheme_Object* g59, Scheme_Object* g60) Scheme_Object* scheme_rtcall_ss_s(const char *who, int src_type, prim_ss_s f, Scheme_Object* g61, Scheme_Object* g62)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -137,8 +137,8 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_s0 = g59; future->arg_s0 = g61;
future->arg_s1 = g60; future->arg_s1 = g62;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -147,7 +147,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
Scheme_Object* scheme_rtcall_tt_s(const char *who, int src_type, prim_tt_s f, const Scheme_Object* g61, const Scheme_Object* g62) Scheme_Object* scheme_rtcall_tt_s(const char *who, int src_type, prim_tt_s f, const Scheme_Object* g63, const Scheme_Object* g64)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -162,8 +162,8 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_t0 = g61; future->arg_t0 = g63;
future->arg_t1 = g62; future->arg_t1 = g64;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -172,7 +172,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(const char *who, int src_type, prim_ss_m f, Scheme_Object* g63, Scheme_Object* g64) MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(const char *who, int src_type, prim_ss_m f, Scheme_Object* g65, Scheme_Object* g66)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -187,8 +187,8 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_s0 = g63; future->arg_s0 = g65;
future->arg_s1 = g64; future->arg_s1 = g66;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -197,7 +197,7 @@
return retval; return retval;
} }
Scheme_Object* scheme_rtcall_Sl_s(const char *who, int src_type, prim_Sl_s f, Scheme_Object** g65, intptr_t g66) Scheme_Object* scheme_rtcall_Sl_s(const char *who, int src_type, prim_Sl_s f, Scheme_Object** g67, intptr_t g68)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -212,8 +212,8 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_S0 = g65; future->arg_S0 = g67;
future->arg_l1 = g66; future->arg_l1 = g68;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -222,7 +222,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
Scheme_Object* scheme_rtcall_l_s(const char *who, int src_type, prim_l_s f, intptr_t g67) Scheme_Object* scheme_rtcall_l_s(const char *who, int src_type, prim_l_s f, intptr_t g69)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -237,7 +237,7 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_l0 = g67; future->arg_l0 = g69;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -246,7 +246,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
void scheme_rtcall_bsi_v(const char *who, int src_type, prim_bsi_v f, Scheme_Bucket* g68, Scheme_Object* g69, int g70) void scheme_rtcall_bsi_v(const char *who, int src_type, prim_bsi_v f, Scheme_Bucket* g70, Scheme_Object* g71, int g72)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -261,9 +261,9 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_b0 = g68; future->arg_b0 = g70;
future->arg_s1 = g69; future->arg_s1 = g71;
future->arg_i2 = g70; future->arg_i2 = g72;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -272,7 +272,7 @@
} }
void scheme_rtcall_iiS_v(const char *who, int src_type, prim_iiS_v f, int g71, int g72, Scheme_Object** g73) void scheme_rtcall_iiS_v(const char *who, int src_type, prim_iiS_v f, int g73, int g74, Scheme_Object** g75)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -287,9 +287,9 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_i0 = g71; future->arg_i0 = g73;
future->arg_i1 = g72; future->arg_i1 = g74;
future->arg_S2 = g73; future->arg_S2 = g75;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -298,7 +298,7 @@
} }
void scheme_rtcall_ss_v(const char *who, int src_type, prim_ss_v f, Scheme_Object* g74, Scheme_Object* g75) void scheme_rtcall_ss_v(const char *who, int src_type, prim_ss_v f, Scheme_Object* g76, Scheme_Object* g77)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -313,8 +313,8 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_s0 = g74; future->arg_s0 = g76;
future->arg_s1 = g75; future->arg_s1 = g77;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -323,7 +323,7 @@
} }
void scheme_rtcall_b_v(const char *who, int src_type, prim_b_v f, Scheme_Bucket* g76) void scheme_rtcall_b_v(const char *who, int src_type, prim_b_v f, Scheme_Bucket* g78)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -338,7 +338,7 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_b0 = g76; future->arg_b0 = g78;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -347,7 +347,7 @@
} }
Scheme_Object* scheme_rtcall_sl_s(const char *who, int src_type, prim_sl_s f, Scheme_Object* g77, intptr_t g78) Scheme_Object* scheme_rtcall_sl_s(const char *who, int src_type, prim_sl_s f, Scheme_Object* g79, intptr_t g80)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -362,8 +362,8 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_s0 = g77; future->arg_s0 = g79;
future->arg_l1 = g78; future->arg_l1 = g80;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -372,7 +372,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
Scheme_Object* scheme_rtcall_iS_s(const char *who, int src_type, prim_iS_s f, int g79, Scheme_Object** g80) Scheme_Object* scheme_rtcall_iS_s(const char *who, int src_type, prim_iS_s f, int g81, Scheme_Object** g82)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -387,8 +387,8 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_i0 = g79; future->arg_i0 = g81;
future->arg_S1 = g80; future->arg_S1 = g82;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -397,7 +397,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
Scheme_Object* scheme_rtcall_S_s(const char *who, int src_type, prim_S_s f, Scheme_Object** g81) Scheme_Object* scheme_rtcall_S_s(const char *who, int src_type, prim_S_s f, Scheme_Object** g83)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -412,7 +412,7 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_S0 = g81; future->arg_S0 = g83;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -421,7 +421,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
void scheme_rtcall_s_v(const char *who, int src_type, prim_s_v f, Scheme_Object* g82) void scheme_rtcall_s_v(const char *who, int src_type, prim_s_v f, Scheme_Object* g84)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -436,8 +436,8 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_s0 = g82; future->arg_s0 = g84;
send_special_result(future, g82); send_special_result(future, g84);
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -445,7 +445,7 @@
} }
Scheme_Object* scheme_rtcall_iSi_s(const char *who, int src_type, prim_iSi_s f, int g83, Scheme_Object** g84, int g85) Scheme_Object* scheme_rtcall_iSi_s(const char *who, int src_type, prim_iSi_s f, int g85, Scheme_Object** g86, int g87)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -460,9 +460,9 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_i0 = g83; future->arg_i0 = g85;
future->arg_S1 = g84; future->arg_S1 = g86;
future->arg_i2 = g85; future->arg_i2 = g87;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -471,7 +471,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
void scheme_rtcall_siS_v(const char *who, int src_type, prim_siS_v f, Scheme_Object* g86, int g87, Scheme_Object** g88) void scheme_rtcall_siS_v(const char *who, int src_type, prim_siS_v f, Scheme_Object* g88, int g89, Scheme_Object** g90)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -486,9 +486,9 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_s0 = g86; future->arg_s0 = g88;
future->arg_i1 = g87; future->arg_i1 = g89;
future->arg_S2 = g88; future->arg_S2 = g90;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -497,7 +497,7 @@
} }
void* scheme_rtcall_z_p(const char *who, int src_type, prim_z_p f, size_t g89) void* scheme_rtcall_z_p(const char *who, int src_type, prim_z_p f, size_t g91)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -512,7 +512,7 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_z0 = g89; future->arg_z0 = g91;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -521,7 +521,7 @@
return retval; return retval;
} }
Scheme_Object* scheme_rtcall_si_s(const char *who, int src_type, prim_si_s f, Scheme_Object* g90, int g91) Scheme_Object* scheme_rtcall_si_s(const char *who, int src_type, prim_si_s f, Scheme_Object* g92, int g93)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -536,8 +536,8 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_s0 = g90; future->arg_s0 = g92;
future->arg_i1 = g91; future->arg_i1 = g93;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -546,7 +546,7 @@
receive_special_result(future, retval, 1); receive_special_result(future, retval, 1);
return retval; return retval;
} }
void scheme_rtcall_sis_v(const char *who, int src_type, prim_sis_v f, Scheme_Object* g92, int g93, Scheme_Object* g94) void scheme_rtcall_sis_v(const char *who, int src_type, prim_sis_v f, Scheme_Object* g94, int g95, Scheme_Object* g96)
XFORM_SKIP_PROC XFORM_SKIP_PROC
{ {
Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -561,9 +561,9 @@
future->time_of_request = tm; future->time_of_request = tm;
future->source_of_request = who; future->source_of_request = who;
future->source_type = src_type; future->source_type = src_type;
future->arg_s0 = g92; future->arg_s0 = g94;
future->arg_i1 = g93; future->arg_i1 = g95;
future->arg_s2 = g94; future->arg_s2 = g96;
future_do_runtimecall(fts, (void*)f, 0, 1); future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft; future = fts->thread->current_ft;
@ -571,4 +571,29 @@
}
int scheme_rtcall_ss_i(const char *who, int src_type, prim_ss_i f, Scheme_Object* g97, Scheme_Object* g98)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
int retval;
future = fts->thread->current_ft;
future->prim_protocol = SIG_ss_i;
future->prim_func = f;
tm = get_future_timestamp();
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g97;
future->arg_s1 = g98;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
retval = future->retval_i;
future->retval_i = 0;
return retval;
} }

View File

@ -1,69 +1,72 @@
#define SIG_siS_s 10 #define SIG_siS_s 10
typedef Scheme_Object* (*prim_siS_s)(Scheme_Object*, int, Scheme_Object**); typedef Scheme_Object* (*prim_siS_s)(Scheme_Object*, int, Scheme_Object**);
Scheme_Object* scheme_rtcall_siS_s(const char *who, int src_type, prim_siS_s f, Scheme_Object* g139, int g140, Scheme_Object** g141); Scheme_Object* scheme_rtcall_siS_s(const char *who, int src_type, prim_siS_s f, Scheme_Object* g145, int g146, Scheme_Object** g147);
#define SIG_iSs_s 11 #define SIG_iSs_s 11
typedef Scheme_Object* (*prim_iSs_s)(int, Scheme_Object**, Scheme_Object*); typedef Scheme_Object* (*prim_iSs_s)(int, Scheme_Object**, Scheme_Object*);
Scheme_Object* scheme_rtcall_iSs_s(const char *who, int src_type, prim_iSs_s f, int g142, Scheme_Object** g143, Scheme_Object* g144); Scheme_Object* scheme_rtcall_iSs_s(const char *who, int src_type, prim_iSs_s f, int g148, Scheme_Object** g149, Scheme_Object* g150);
#define SIG_s_s 12 #define SIG_s_s 12
typedef Scheme_Object* (*prim_s_s)(Scheme_Object*); typedef Scheme_Object* (*prim_s_s)(Scheme_Object*);
Scheme_Object* scheme_rtcall_s_s(const char *who, int src_type, prim_s_s f, Scheme_Object* g145); Scheme_Object* scheme_rtcall_s_s(const char *who, int src_type, prim_s_s f, Scheme_Object* g151);
#define SIG_n_s 13 #define SIG_n_s 13
typedef Scheme_Object* (*prim_n_s)(Scheme_Native_Closure_Data*); typedef Scheme_Object* (*prim_n_s)(Scheme_Native_Closure_Data*);
Scheme_Object* scheme_rtcall_n_s(const char *who, int src_type, prim_n_s f, Scheme_Native_Closure_Data* g146); Scheme_Object* scheme_rtcall_n_s(const char *who, int src_type, prim_n_s f, Scheme_Native_Closure_Data* g152);
#define SIG__s 14 #define SIG__s 14
typedef Scheme_Object* (*prim__s)(); typedef Scheme_Object* (*prim__s)();
Scheme_Object* scheme_rtcall__s(const char *who, int src_type, prim__s f ); Scheme_Object* scheme_rtcall__s(const char *who, int src_type, prim__s f );
#define SIG_ss_s 15 #define SIG_ss_s 15
typedef Scheme_Object* (*prim_ss_s)(Scheme_Object*, Scheme_Object*); typedef Scheme_Object* (*prim_ss_s)(Scheme_Object*, Scheme_Object*);
Scheme_Object* scheme_rtcall_ss_s(const char *who, int src_type, prim_ss_s f, Scheme_Object* g147, Scheme_Object* g148); Scheme_Object* scheme_rtcall_ss_s(const char *who, int src_type, prim_ss_s f, Scheme_Object* g153, Scheme_Object* g154);
#define SIG_tt_s 16 #define SIG_tt_s 16
typedef Scheme_Object* (*prim_tt_s)(const Scheme_Object*, const Scheme_Object*); typedef Scheme_Object* (*prim_tt_s)(const Scheme_Object*, const Scheme_Object*);
Scheme_Object* scheme_rtcall_tt_s(const char *who, int src_type, prim_tt_s f, const Scheme_Object* g149, const Scheme_Object* g150); Scheme_Object* scheme_rtcall_tt_s(const char *who, int src_type, prim_tt_s f, const Scheme_Object* g155, const Scheme_Object* g156);
#define SIG_ss_m 17 #define SIG_ss_m 17
typedef MZ_MARK_STACK_TYPE (*prim_ss_m)(Scheme_Object*, Scheme_Object*); typedef MZ_MARK_STACK_TYPE (*prim_ss_m)(Scheme_Object*, Scheme_Object*);
MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(const char *who, int src_type, prim_ss_m f, Scheme_Object* g151, Scheme_Object* g152); MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(const char *who, int src_type, prim_ss_m f, Scheme_Object* g157, Scheme_Object* g158);
#define SIG_Sl_s 18 #define SIG_Sl_s 18
typedef Scheme_Object* (*prim_Sl_s)(Scheme_Object**, intptr_t); typedef Scheme_Object* (*prim_Sl_s)(Scheme_Object**, intptr_t);
Scheme_Object* scheme_rtcall_Sl_s(const char *who, int src_type, prim_Sl_s f, Scheme_Object** g153, intptr_t g154); Scheme_Object* scheme_rtcall_Sl_s(const char *who, int src_type, prim_Sl_s f, Scheme_Object** g159, intptr_t g160);
#define SIG_l_s 19 #define SIG_l_s 19
typedef Scheme_Object* (*prim_l_s)(intptr_t); typedef Scheme_Object* (*prim_l_s)(intptr_t);
Scheme_Object* scheme_rtcall_l_s(const char *who, int src_type, prim_l_s f, intptr_t g155); Scheme_Object* scheme_rtcall_l_s(const char *who, int src_type, prim_l_s f, intptr_t g161);
#define SIG_bsi_v 20 #define SIG_bsi_v 20
typedef void (*prim_bsi_v)(Scheme_Bucket*, Scheme_Object*, int); typedef void (*prim_bsi_v)(Scheme_Bucket*, Scheme_Object*, int);
void scheme_rtcall_bsi_v(const char *who, int src_type, prim_bsi_v f, Scheme_Bucket* g156, Scheme_Object* g157, int g158); void scheme_rtcall_bsi_v(const char *who, int src_type, prim_bsi_v f, Scheme_Bucket* g162, Scheme_Object* g163, int g164);
#define SIG_iiS_v 21 #define SIG_iiS_v 21
typedef void (*prim_iiS_v)(int, int, Scheme_Object**); typedef void (*prim_iiS_v)(int, int, Scheme_Object**);
void scheme_rtcall_iiS_v(const char *who, int src_type, prim_iiS_v f, int g159, int g160, Scheme_Object** g161); void scheme_rtcall_iiS_v(const char *who, int src_type, prim_iiS_v f, int g165, int g166, Scheme_Object** g167);
#define SIG_ss_v 22 #define SIG_ss_v 22
typedef void (*prim_ss_v)(Scheme_Object*, Scheme_Object*); typedef void (*prim_ss_v)(Scheme_Object*, Scheme_Object*);
void scheme_rtcall_ss_v(const char *who, int src_type, prim_ss_v f, Scheme_Object* g162, Scheme_Object* g163); void scheme_rtcall_ss_v(const char *who, int src_type, prim_ss_v f, Scheme_Object* g168, Scheme_Object* g169);
#define SIG_b_v 23 #define SIG_b_v 23
typedef void (*prim_b_v)(Scheme_Bucket*); typedef void (*prim_b_v)(Scheme_Bucket*);
void scheme_rtcall_b_v(const char *who, int src_type, prim_b_v f, Scheme_Bucket* g164); void scheme_rtcall_b_v(const char *who, int src_type, prim_b_v f, Scheme_Bucket* g170);
#define SIG_sl_s 24 #define SIG_sl_s 24
typedef Scheme_Object* (*prim_sl_s)(Scheme_Object*, intptr_t); typedef Scheme_Object* (*prim_sl_s)(Scheme_Object*, intptr_t);
Scheme_Object* scheme_rtcall_sl_s(const char *who, int src_type, prim_sl_s f, Scheme_Object* g165, intptr_t g166); Scheme_Object* scheme_rtcall_sl_s(const char *who, int src_type, prim_sl_s f, Scheme_Object* g171, intptr_t g172);
#define SIG_iS_s 25 #define SIG_iS_s 25
typedef Scheme_Object* (*prim_iS_s)(int, Scheme_Object**); typedef Scheme_Object* (*prim_iS_s)(int, Scheme_Object**);
Scheme_Object* scheme_rtcall_iS_s(const char *who, int src_type, prim_iS_s f, int g167, Scheme_Object** g168); Scheme_Object* scheme_rtcall_iS_s(const char *who, int src_type, prim_iS_s f, int g173, Scheme_Object** g174);
#define SIG_S_s 26 #define SIG_S_s 26
typedef Scheme_Object* (*prim_S_s)(Scheme_Object**); typedef Scheme_Object* (*prim_S_s)(Scheme_Object**);
Scheme_Object* scheme_rtcall_S_s(const char *who, int src_type, prim_S_s f, Scheme_Object** g169); Scheme_Object* scheme_rtcall_S_s(const char *who, int src_type, prim_S_s f, Scheme_Object** g175);
#define SIG_s_v 27 #define SIG_s_v 27
typedef void (*prim_s_v)(Scheme_Object*); typedef void (*prim_s_v)(Scheme_Object*);
void scheme_rtcall_s_v(const char *who, int src_type, prim_s_v f, Scheme_Object* g170); void scheme_rtcall_s_v(const char *who, int src_type, prim_s_v f, Scheme_Object* g176);
#define SIG_iSi_s 28 #define SIG_iSi_s 28
typedef Scheme_Object* (*prim_iSi_s)(int, Scheme_Object**, int); typedef Scheme_Object* (*prim_iSi_s)(int, Scheme_Object**, int);
Scheme_Object* scheme_rtcall_iSi_s(const char *who, int src_type, prim_iSi_s f, int g171, Scheme_Object** g172, int g173); Scheme_Object* scheme_rtcall_iSi_s(const char *who, int src_type, prim_iSi_s f, int g177, Scheme_Object** g178, int g179);
#define SIG_siS_v 29 #define SIG_siS_v 29
typedef void (*prim_siS_v)(Scheme_Object*, int, Scheme_Object**); typedef void (*prim_siS_v)(Scheme_Object*, int, Scheme_Object**);
void scheme_rtcall_siS_v(const char *who, int src_type, prim_siS_v f, Scheme_Object* g174, int g175, Scheme_Object** g176); void scheme_rtcall_siS_v(const char *who, int src_type, prim_siS_v f, Scheme_Object* g180, int g181, Scheme_Object** g182);
#define SIG_z_p 30 #define SIG_z_p 30
typedef void* (*prim_z_p)(size_t); typedef void* (*prim_z_p)(size_t);
void* scheme_rtcall_z_p(const char *who, int src_type, prim_z_p f, size_t g177); void* scheme_rtcall_z_p(const char *who, int src_type, prim_z_p f, size_t g183);
#define SIG_si_s 31 #define SIG_si_s 31
typedef Scheme_Object* (*prim_si_s)(Scheme_Object*, int); typedef Scheme_Object* (*prim_si_s)(Scheme_Object*, int);
Scheme_Object* scheme_rtcall_si_s(const char *who, int src_type, prim_si_s f, Scheme_Object* g178, int g179); Scheme_Object* scheme_rtcall_si_s(const char *who, int src_type, prim_si_s f, Scheme_Object* g184, int g185);
#define SIG_sis_v 32 #define SIG_sis_v 32
typedef void (*prim_sis_v)(Scheme_Object*, int, Scheme_Object*); typedef void (*prim_sis_v)(Scheme_Object*, int, Scheme_Object*);
void scheme_rtcall_sis_v(const char *who, int src_type, prim_sis_v f, Scheme_Object* g180, int g181, Scheme_Object* g182); void scheme_rtcall_sis_v(const char *who, int src_type, prim_sis_v f, Scheme_Object* g186, int g187, Scheme_Object* g188);
#define SIG_ss_i 33
typedef int (*prim_ss_i)(Scheme_Object*, Scheme_Object*);
int scheme_rtcall_ss_i(const char *who, int src_type, prim_ss_i f, Scheme_Object* g189, Scheme_Object* g190);

View File

@ -318,5 +318,19 @@ case SIG_sis_v:
f(arg_s0, arg_i1, arg_s2); f(arg_s0, arg_i1, arg_s2);
break;
}
case SIG_ss_i:
{
prim_ss_i f = (prim_ss_i)future->prim_func;
GC_CAN_IGNORE int retval;
JIT_TS_LOCALIZE(Scheme_Object*, arg_s0); JIT_TS_LOCALIZE(Scheme_Object*, arg_s1);
future->arg_s0 = NULL; future->arg_s1 = NULL;
retval =
f(arg_s0, arg_s1);
future->retval_i = retval;
break; break;
} }

View File

@ -1710,6 +1710,47 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i
__END_SHORT_JUMPS__(branch_short); __END_SHORT_JUMPS__(branch_short);
} }
return 1;
} else if (IS_NAMED_PRIM(rator, "equal?")) {
GC_CAN_IGNORE jit_insn *ref_f, *ref_d, *refr;
generate_two_args(app->rand1, app->rand2, jitter, 0, 2);
CHECK_LIMIT();
mz_rs_sync();
JIT_UPDATE_THREAD_RSPTR_IF_NEEDED();
jit_prepare(2);
jit_pusharg_p(JIT_R0);
jit_pusharg_p(JIT_R1);
(void)mz_finish_lwe(ts_scheme_equal, refr);
jit_retval(JIT_R0);
CHECK_LIMIT();
__START_SHORT_JUMPS__(branch_short);
if (for_branch) {
scheme_prepare_branch_jump(jitter, for_branch);
CHECK_LIMIT();
}
ref_f = jit_beqi_p(jit_forward(), JIT_R0, 0);
if (for_branch) {
scheme_add_branch_false(for_branch, ref_f);
scheme_branch_for_true(jitter, for_branch);
} else {
jit_movi_p(JIT_R0, scheme_true);
ref_d = jit_jmpi(jit_forward());
mz_patch_branch(ref_f);
jit_movi_p(JIT_R0, scheme_false);
mz_patch_ucbranch(ref_d);
}
__END_SHORT_JUMPS__(branch_short);
return 1; return 1;
} else if (IS_NAMED_PRIM(rator, "eqv?")) { } else if (IS_NAMED_PRIM(rator, "eqv?")) {
GC_CAN_IGNORE jit_insn *ref_f1, *ref_f2, *ref_f3, *ref_f4, *ref_f5; GC_CAN_IGNORE jit_insn *ref_f1, *ref_f2, *ref_f3, *ref_f4, *ref_f5;