From f4303cbef8c4da255f8c16cc6f960e19138c3c54 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 23 Apr 2011 10:22:47 -0600 Subject: [PATCH] faster JITted path to `equal?' --- collects/tests/racket/optimize.rktl | 6 +- src/racket/src/bool.c | 4 +- src/racket/src/future.h | 1 + src/racket/src/gen-jit-ts.rkt | 3 +- src/racket/src/jit_ts.c | 2 + src/racket/src/jit_ts_def.c | 9 ++ src/racket/src/jit_ts_future_glue.c | 161 ++++++++++++++++----------- src/racket/src/jit_ts_protos.h | 47 ++++---- src/racket/src/jit_ts_runtime_glue.c | 14 +++ src/racket/src/jitinline.c | 41 +++++++ 10 files changed, 195 insertions(+), 93 deletions(-) diff --git a/collects/tests/racket/optimize.rktl b/collects/tests/racket/optimize.rktl index 230aee3f7f..45fa8e98b6 100644 --- a/collects/tests/racket/optimize.rktl +++ b/collects/tests/racket/optimize.rktl @@ -15,7 +15,8 @@ (namespace-require 'racket/flonum) (namespace-require 'racket/fixnum) (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? procedure? symbol? string? bytes? @@ -190,6 +191,9 @@ (bin-exact #t 'eqv? 1+2i 1+2i) (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 #f 'zero? 1) (un #f 'zero? -1) diff --git a/src/racket/src/bool.c b/src/racket/src/bool.c index ae4f7b5823..a53c303860 100644 --- a/src/racket/src/bool.c +++ b/src/racket/src/bool.c @@ -100,7 +100,9 @@ void scheme_init_bool (Scheme_Env *env) scheme_eqv_prim = p; 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?/recur", diff --git a/src/racket/src/future.h b/src/racket/src/future.h index fc36200d77..844ae96d0a 100644 --- a/src/racket/src/future.h +++ b/src/racket/src/future.h @@ -111,6 +111,7 @@ typedef struct future_t { Scheme_Object *retval_s; void *retval_p; /* use only with conservative GC */ MZ_MARK_STACK_TYPE retval_m; + int retval_i; int no_retval, retval_is_rs_argv; Scheme_Object **multiple_array; diff --git a/src/racket/src/gen-jit-ts.rkt b/src/racket/src/gen-jit-ts.rkt index 8f56b2f46b..e7f8f90402 100644 --- a/src/racket/src/gen-jit-ts.rkt +++ b/src/racket/src/gen-jit-ts.rkt @@ -191,7 +191,8 @@ siS_v z_p si_s - sis_v)) + sis_v + ss_i)) (with-output-to-file "jit_ts_def.c" #:exists 'replace diff --git a/src/racket/src/jit_ts.c b/src/racket/src/jit_ts.c index 142530bff9..d37a4a375f 100644 --- a/src/racket/src/jit_ts.c +++ b/src/racket/src/jit_ts.c @@ -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_vector, FSRC_OTHER) # endif +define_ts_ss_i(scheme_equal, FSRC_OTHER) #endif #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_struct_ref scheme_struct_ref # 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_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 diff --git a/src/racket/src/jit_ts_def.c b/src/racket/src/jit_ts_def.c index 262571e588..cd2d3ecb14 100644 --- a/src/racket/src/jit_ts_def.c +++ b/src/racket/src/jit_ts_def.c @@ -205,3 +205,12 @@ static void ts_ ## id(Scheme_Object* g48, int g49, Scheme_Object* g50) \ else \ 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); \ +} diff --git a/src/racket/src/jit_ts_future_glue.c b/src/racket/src/jit_ts_future_glue.c index c0c0e7f017..e570e32b3d 100644 --- a/src/racket/src/jit_ts_future_glue.c +++ b/src/racket/src/jit_ts_future_glue.c @@ -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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -13,9 +13,9 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_s0 = g51; - future->arg_i1 = g52; - future->arg_S2 = g53; + future->arg_s0 = g53; + future->arg_i1 = g54; + future->arg_S2 = g55; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -24,7 +24,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -39,9 +39,9 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_i0 = g54; - future->arg_S1 = g55; - future->arg_s2 = g56; + future->arg_i0 = g56; + future->arg_S1 = g57; + future->arg_s2 = g58; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -50,7 +50,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -65,8 +65,8 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_s0 = g57; - send_special_result(future, g57); + future->arg_s0 = g59; + send_special_result(future, g59); future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; retval = future->retval_s; @@ -74,7 +74,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -89,7 +89,7 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_n0 = g58; + future->arg_n0 = g60; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -122,7 +122,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -137,8 +137,8 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_s0 = g59; - future->arg_s1 = g60; + future->arg_s0 = g61; + future->arg_s1 = g62; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -147,7 +147,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -162,8 +162,8 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_t0 = g61; - future->arg_t1 = g62; + future->arg_t0 = g63; + future->arg_t1 = g64; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -172,7 +172,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -187,8 +187,8 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_s0 = g63; - future->arg_s1 = g64; + future->arg_s0 = g65; + future->arg_s1 = g66; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -197,7 +197,7 @@ 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -212,8 +212,8 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_S0 = g65; - future->arg_l1 = g66; + future->arg_S0 = g67; + future->arg_l1 = g68; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -222,7 +222,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -237,7 +237,7 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_l0 = g67; + future->arg_l0 = g69; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -246,7 +246,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -261,9 +261,9 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_b0 = g68; - future->arg_s1 = g69; - future->arg_i2 = g70; + future->arg_b0 = g70; + future->arg_s1 = g71; + future->arg_i2 = g72; future_do_runtimecall(fts, (void*)f, 0, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -287,9 +287,9 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_i0 = g71; - future->arg_i1 = g72; - future->arg_S2 = g73; + future->arg_i0 = g73; + future->arg_i1 = g74; + future->arg_S2 = g75; future_do_runtimecall(fts, (void*)f, 0, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -313,8 +313,8 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_s0 = g74; - future->arg_s1 = g75; + future->arg_s0 = g76; + future->arg_s1 = g77; future_do_runtimecall(fts, (void*)f, 0, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -338,7 +338,7 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_b0 = g76; + future->arg_b0 = g78; future_do_runtimecall(fts, (void*)f, 0, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -362,8 +362,8 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_s0 = g77; - future->arg_l1 = g78; + future->arg_s0 = g79; + future->arg_l1 = g80; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -372,7 +372,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -387,8 +387,8 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_i0 = g79; - future->arg_S1 = g80; + future->arg_i0 = g81; + future->arg_S1 = g82; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -397,7 +397,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -412,7 +412,7 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_S0 = g81; + future->arg_S0 = g83; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -421,7 +421,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -436,8 +436,8 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_s0 = g82; - send_special_result(future, g82); + future->arg_s0 = g84; + send_special_result(future, g84); future_do_runtimecall(fts, (void*)f, 0, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -460,9 +460,9 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_i0 = g83; - future->arg_S1 = g84; - future->arg_i2 = g85; + future->arg_i0 = g85; + future->arg_S1 = g86; + future->arg_i2 = g87; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -471,7 +471,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -486,9 +486,9 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_s0 = g86; - future->arg_i1 = g87; - future->arg_S2 = g88; + future->arg_s0 = g88; + future->arg_i1 = g89; + future->arg_S2 = g90; future_do_runtimecall(fts, (void*)f, 0, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -512,7 +512,7 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_z0 = g89; + future->arg_z0 = g91; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -521,7 +521,7 @@ 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -536,8 +536,8 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_s0 = g90; - future->arg_i1 = g91; + future->arg_s0 = g92; + future->arg_i1 = g93; future_do_runtimecall(fts, (void*)f, 0, 1); future = fts->thread->current_ft; @@ -546,7 +546,7 @@ receive_special_result(future, retval, 1); 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 { Scheme_Future_Thread_State *fts = scheme_future_thread_state; @@ -561,9 +561,9 @@ future->time_of_request = tm; future->source_of_request = who; future->source_type = src_type; - future->arg_s0 = g92; - future->arg_i1 = g93; - future->arg_s2 = g94; + future->arg_s0 = g94; + future->arg_i1 = g95; + future->arg_s2 = g96; future_do_runtimecall(fts, (void*)f, 0, 1); 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; } diff --git a/src/racket/src/jit_ts_protos.h b/src/racket/src/jit_ts_protos.h index b031b7f4b9..e6e6964a34 100644 --- a/src/racket/src/jit_ts_protos.h +++ b/src/racket/src/jit_ts_protos.h @@ -1,69 +1,72 @@ #define SIG_siS_s 10 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 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 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 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 typedef Scheme_Object* (*prim__s)(); Scheme_Object* scheme_rtcall__s(const char *who, int src_type, prim__s f ); #define SIG_ss_s 15 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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); diff --git a/src/racket/src/jit_ts_runtime_glue.c b/src/racket/src/jit_ts_runtime_glue.c index 461ddaba84..33da5526ce 100644 --- a/src/racket/src/jit_ts_runtime_glue.c +++ b/src/racket/src/jit_ts_runtime_glue.c @@ -318,5 +318,19 @@ case SIG_sis_v: 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; } diff --git a/src/racket/src/jitinline.c b/src/racket/src/jitinline.c index c0bff817e2..42702a34f6 100644 --- a/src/racket/src/jitinline.c +++ b/src/racket/src/jitinline.c @@ -1710,6 +1710,47 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i __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; } else if (IS_NAMED_PRIM(rator, "eqv?")) { GC_CAN_IGNORE jit_insn *ref_f1, *ref_f2, *ref_f3, *ref_f4, *ref_f5;