JIT-inline all of the `cXr's

This commit is contained in:
Matthew Flatt 2011-07-06 20:37:38 -06:00
parent 6f9c197b96
commit a77a2fb3e1
11 changed files with 286 additions and 231 deletions

View File

@ -95,6 +95,7 @@ typedef struct future_t {
Scheme_Object *arg_s2;
Scheme_Object **arg_S2;
int arg_i2;
void *arg_p2;
const char *arg_str0;
const char *arg_str1;

View File

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

View File

@ -210,6 +210,7 @@ struct scheme_jit_common_record {
void *call_original_nary_arith_code;
void *bad_car_code, *bad_cdr_code;
void *bad_caar_code, *bad_cdar_code, *bad_cadr_code, *bad_cddr_code;
void *bad_cXr_code;
void *bad_mcar_code, *bad_mcdr_code;
void *bad_set_mcar_code, *bad_set_mcdr_code;
void *imag_part_code, *real_part_code, *make_rectangular_code;

View File

@ -53,6 +53,7 @@ define_ts_iS_s(scheme_checked_caar, FSRC_MARKS)
define_ts_iS_s(scheme_checked_cadr, FSRC_MARKS)
define_ts_iS_s(scheme_checked_cdar, FSRC_MARKS)
define_ts_iS_s(scheme_checked_cddr, FSRC_MARKS)
define_ts_iSp_v(apply_prim_to_fail, FSRC_OTHER)
define_ts_s_s(scheme_checked_length, FSRC_MARKS)
define_ts_iS_s(scheme_checked_mcar, FSRC_MARKS)
define_ts_iS_s(scheme_checked_mcdr, FSRC_MARKS)
@ -156,6 +157,7 @@ define_ts_s_s(scheme_box, FSRC_OTHER)
# define ts_scheme_checked_cadr scheme_checked_cadr
# define ts_scheme_checked_cdar scheme_checked_cdar
# define ts_scheme_checked_cddr scheme_checked_cddr
# define ts_apply_prim_to_fail apply_prim_to_fail
# define ts_scheme_checked_length scheme_checked_length
# define ts_scheme_checked_mcar scheme_checked_mcar
# define ts_scheme_checked_mcdr scheme_checked_mcdr

View File

@ -223,3 +223,12 @@ static int ts_ ## id(Scheme_Object* g51, Scheme_Object* g52) \
else \
return id(g51, g52); \
}
#define define_ts_iSp_v(id, src_type) \
static void ts_ ## id(int g53, Scheme_Object** g54, void* g55) \
XFORM_SKIP_PROC \
{ \
if (scheme_use_rtcall) \
scheme_rtcall_iSp_v("[" #id "]", src_type, id, g53, g54, g55); \
else \
id(g53, g54, g55); \
}

View File

@ -1,4 +1,4 @@
Scheme_Object* scheme_rtcall_siS_s(const char *who, int src_type, prim_siS_s f, Scheme_Object* g53, int g54, Scheme_Object** g55)
Scheme_Object* scheme_rtcall_siS_s(const char *who, int src_type, prim_siS_s f, Scheme_Object* g56, int g57, Scheme_Object** g58)
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 = g53;
future->arg_i1 = g54;
future->arg_S2 = g55;
future->arg_s0 = g56;
future->arg_i1 = g57;
future->arg_S2 = g58;
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 g56, Scheme_Object** g57, Scheme_Object* g58)
Scheme_Object* scheme_rtcall_iSs_s(const char *who, int src_type, prim_iSs_s f, int g59, Scheme_Object** g60, Scheme_Object* g61)
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 = g56;
future->arg_S1 = g57;
future->arg_s2 = g58;
future->arg_i0 = g59;
future->arg_S1 = g60;
future->arg_s2 = g61;
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* g59)
Scheme_Object* scheme_rtcall_s_s(const char *who, int src_type, prim_s_s f, Scheme_Object* g62)
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 = g59;
send_special_result(future, g59);
future->arg_s0 = g62;
send_special_result(future, g62);
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* g60)
Scheme_Object* scheme_rtcall_n_s(const char *who, int src_type, prim_n_s f, Scheme_Native_Closure_Data* g63)
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 = g60;
future->arg_n0 = g63;
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* g61, Scheme_Object* g62)
Scheme_Object* scheme_rtcall_ss_s(const char *who, int src_type, prim_ss_s f, Scheme_Object* g64, Scheme_Object* g65)
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 = g61;
future->arg_s1 = g62;
future->arg_s0 = g64;
future->arg_s1 = g65;
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_ssi_s(const char *who, int src_type, prim_ssi_s f, Scheme_Object* g63, Scheme_Object* g64, int g65)
Scheme_Object* scheme_rtcall_ssi_s(const char *who, int src_type, prim_ssi_s f, Scheme_Object* g66, Scheme_Object* g67, int g68)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -162,9 +162,9 @@
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_i2 = g65;
future->arg_s0 = g66;
future->arg_s1 = g67;
future->arg_i2 = g68;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -173,7 +173,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* g66, const Scheme_Object* g67)
Scheme_Object* scheme_rtcall_tt_s(const char *who, int src_type, prim_tt_s f, const Scheme_Object* g69, const Scheme_Object* g70)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -188,8 +188,8 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_t0 = g66;
future->arg_t1 = g67;
future->arg_t0 = g69;
future->arg_t1 = g70;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -198,7 +198,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* g68, Scheme_Object* g69)
MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(const char *who, int src_type, prim_ss_m f, Scheme_Object* g71, Scheme_Object* g72)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -213,8 +213,8 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g68;
future->arg_s1 = g69;
future->arg_s0 = g71;
future->arg_s1 = g72;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -223,7 +223,7 @@
return retval;
}
Scheme_Object* scheme_rtcall_Sl_s(const char *who, int src_type, prim_Sl_s f, Scheme_Object** g70, intptr_t g71)
Scheme_Object* scheme_rtcall_Sl_s(const char *who, int src_type, prim_Sl_s f, Scheme_Object** g73, intptr_t g74)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -238,8 +238,8 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_S0 = g70;
future->arg_l1 = g71;
future->arg_S0 = g73;
future->arg_l1 = g74;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -248,7 +248,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 g72)
Scheme_Object* scheme_rtcall_l_s(const char *who, int src_type, prim_l_s f, intptr_t g75)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -263,7 +263,7 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_l0 = g72;
future->arg_l0 = g75;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -272,7 +272,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* g73, Scheme_Object* g74, int g75)
void scheme_rtcall_bsi_v(const char *who, int src_type, prim_bsi_v f, Scheme_Bucket* g76, Scheme_Object* g77, int g78)
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_b0 = g73;
future->arg_s1 = g74;
future->arg_i2 = g75;
future->arg_b0 = g76;
future->arg_s1 = g77;
future->arg_i2 = g78;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -298,7 +298,7 @@
}
void scheme_rtcall_iiS_v(const char *who, int src_type, prim_iiS_v f, int g76, int g77, Scheme_Object** g78)
void scheme_rtcall_iiS_v(const char *who, int src_type, prim_iiS_v f, int g79, int g80, Scheme_Object** g81)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -313,9 +313,9 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_i0 = g76;
future->arg_i1 = g77;
future->arg_S2 = g78;
future->arg_i0 = g79;
future->arg_i1 = g80;
future->arg_S2 = g81;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -324,7 +324,7 @@
}
void scheme_rtcall_ss_v(const char *who, int src_type, prim_ss_v f, Scheme_Object* g79, Scheme_Object* g80)
void scheme_rtcall_ss_v(const char *who, int src_type, prim_ss_v f, Scheme_Object* g82, Scheme_Object* g83)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -339,8 +339,8 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g79;
future->arg_s1 = g80;
future->arg_s0 = g82;
future->arg_s1 = g83;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -349,7 +349,7 @@
}
void scheme_rtcall_b_v(const char *who, int src_type, prim_b_v f, Scheme_Bucket* g81)
void scheme_rtcall_b_v(const char *who, int src_type, prim_b_v f, Scheme_Bucket* g84)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -364,7 +364,7 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_b0 = g81;
future->arg_b0 = g84;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -373,7 +373,7 @@
}
Scheme_Object* scheme_rtcall_sl_s(const char *who, int src_type, prim_sl_s f, Scheme_Object* g82, intptr_t g83)
Scheme_Object* scheme_rtcall_sl_s(const char *who, int src_type, prim_sl_s f, Scheme_Object* g85, intptr_t g86)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -388,8 +388,8 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g82;
future->arg_l1 = g83;
future->arg_s0 = g85;
future->arg_l1 = g86;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -398,7 +398,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 g84, Scheme_Object** g85)
Scheme_Object* scheme_rtcall_iS_s(const char *who, int src_type, prim_iS_s f, int g87, Scheme_Object** g88)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -413,8 +413,8 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_i0 = g84;
future->arg_S1 = g85;
future->arg_i0 = g87;
future->arg_S1 = g88;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -423,7 +423,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** g86)
Scheme_Object* scheme_rtcall_S_s(const char *who, int src_type, prim_S_s f, Scheme_Object** g89)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -438,7 +438,7 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_S0 = g86;
future->arg_S0 = g89;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -447,7 +447,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* g87)
void scheme_rtcall_s_v(const char *who, int src_type, prim_s_v f, Scheme_Object* g90)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -462,8 +462,8 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g87;
send_special_result(future, g87);
future->arg_s0 = g90;
send_special_result(future, g90);
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -471,7 +471,7 @@
}
Scheme_Object* scheme_rtcall_iSi_s(const char *who, int src_type, prim_iSi_s f, int g88, Scheme_Object** g89, int g90)
Scheme_Object* scheme_rtcall_iSi_s(const char *who, int src_type, prim_iSi_s f, int g91, Scheme_Object** g92, int g93)
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_i0 = g88;
future->arg_S1 = g89;
future->arg_i2 = g90;
future->arg_i0 = g91;
future->arg_S1 = g92;
future->arg_i2 = g93;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -497,7 +497,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* g91, int g92, Scheme_Object** g93)
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;
@ -512,9 +512,9 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g91;
future->arg_i1 = g92;
future->arg_S2 = g93;
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;
@ -523,7 +523,7 @@
}
void* scheme_rtcall_z_p(const char *who, int src_type, prim_z_p f, size_t g94)
void* scheme_rtcall_z_p(const char *who, int src_type, prim_z_p f, size_t g97)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -538,7 +538,7 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_z0 = g94;
future->arg_z0 = g97;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -547,7 +547,7 @@
return retval;
}
Scheme_Object* scheme_rtcall_si_s(const char *who, int src_type, prim_si_s f, Scheme_Object* g95, int g96)
Scheme_Object* scheme_rtcall_si_s(const char *who, int src_type, prim_si_s f, Scheme_Object* g98, int g99)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -562,8 +562,8 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g95;
future->arg_i1 = g96;
future->arg_s0 = g98;
future->arg_i1 = g99;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -572,7 +572,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* g97, int g98, Scheme_Object* g99)
void scheme_rtcall_sis_v(const char *who, int src_type, prim_sis_v f, Scheme_Object* g100, int g101, Scheme_Object* g102)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -587,9 +587,9 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g97;
future->arg_i1 = g98;
future->arg_s2 = g99;
future->arg_s0 = g100;
future->arg_i1 = g101;
future->arg_s2 = g102;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -598,7 +598,7 @@
}
int scheme_rtcall_ss_i(const char *who, int src_type, prim_ss_i f, Scheme_Object* g100, Scheme_Object* g101)
int scheme_rtcall_ss_i(const char *who, int src_type, prim_ss_i f, Scheme_Object* g103, Scheme_Object* g104)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
@ -613,8 +613,8 @@
future->time_of_request = tm;
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g100;
future->arg_s1 = g101;
future->arg_s0 = g103;
future->arg_s1 = g104;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
@ -622,4 +622,30 @@
future->retval_i = 0;
return retval;
}
void scheme_rtcall_iSp_v(const char *who, int src_type, prim_iSp_v f, int g105, Scheme_Object** g106, void* g107)
XFORM_SKIP_PROC
{
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
future = fts->thread->current_ft;
future->prim_protocol = SIG_iSp_v;
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_i0 = g105;
future->arg_S1 = g106;
future->arg_p2 = g107;
future_do_runtimecall(fts, (void*)f, 0, 1);
future = fts->thread->current_ft;
}

View File

@ -1,75 +1,78 @@
#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* g151, int g152, Scheme_Object** g153);
Scheme_Object* scheme_rtcall_siS_s(const char *who, int src_type, prim_siS_s f, Scheme_Object* g160, int g161, Scheme_Object** g162);
#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 g154, Scheme_Object** g155, Scheme_Object* g156);
Scheme_Object* scheme_rtcall_iSs_s(const char *who, int src_type, prim_iSs_s f, int g163, Scheme_Object** g164, Scheme_Object* g165);
#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* g157);
Scheme_Object* scheme_rtcall_s_s(const char *who, int src_type, prim_s_s f, Scheme_Object* g166);
#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* g158);
Scheme_Object* scheme_rtcall_n_s(const char *who, int src_type, prim_n_s f, Scheme_Native_Closure_Data* g167);
#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* g159, Scheme_Object* g160);
Scheme_Object* scheme_rtcall_ss_s(const char *who, int src_type, prim_ss_s f, Scheme_Object* g168, Scheme_Object* g169);
#define SIG_ssi_s 16
typedef Scheme_Object* (*prim_ssi_s)(Scheme_Object*, Scheme_Object*, int);
Scheme_Object* scheme_rtcall_ssi_s(const char *who, int src_type, prim_ssi_s f, Scheme_Object* g161, Scheme_Object* g162, int g163);
Scheme_Object* scheme_rtcall_ssi_s(const char *who, int src_type, prim_ssi_s f, Scheme_Object* g170, Scheme_Object* g171, int g172);
#define SIG_tt_s 17
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* g164, const Scheme_Object* g165);
Scheme_Object* scheme_rtcall_tt_s(const char *who, int src_type, prim_tt_s f, const Scheme_Object* g173, const Scheme_Object* g174);
#define SIG_ss_m 18
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* g166, Scheme_Object* g167);
MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(const char *who, int src_type, prim_ss_m f, Scheme_Object* g175, Scheme_Object* g176);
#define SIG_Sl_s 19
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** g168, intptr_t g169);
Scheme_Object* scheme_rtcall_Sl_s(const char *who, int src_type, prim_Sl_s f, Scheme_Object** g177, intptr_t g178);
#define SIG_l_s 20
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 g170);
Scheme_Object* scheme_rtcall_l_s(const char *who, int src_type, prim_l_s f, intptr_t g179);
#define SIG_bsi_v 21
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* g171, Scheme_Object* g172, int g173);
void scheme_rtcall_bsi_v(const char *who, int src_type, prim_bsi_v f, Scheme_Bucket* g180, Scheme_Object* g181, int g182);
#define SIG_iiS_v 22
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 g174, int g175, Scheme_Object** g176);
void scheme_rtcall_iiS_v(const char *who, int src_type, prim_iiS_v f, int g183, int g184, Scheme_Object** g185);
#define SIG_ss_v 23
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* g177, Scheme_Object* g178);
void scheme_rtcall_ss_v(const char *who, int src_type, prim_ss_v f, Scheme_Object* g186, Scheme_Object* g187);
#define SIG_b_v 24
typedef void (*prim_b_v)(Scheme_Bucket*);
void scheme_rtcall_b_v(const char *who, int src_type, prim_b_v f, Scheme_Bucket* g179);
void scheme_rtcall_b_v(const char *who, int src_type, prim_b_v f, Scheme_Bucket* g188);
#define SIG_sl_s 25
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* g180, intptr_t g181);
Scheme_Object* scheme_rtcall_sl_s(const char *who, int src_type, prim_sl_s f, Scheme_Object* g189, intptr_t g190);
#define SIG_iS_s 26
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 g182, Scheme_Object** g183);
Scheme_Object* scheme_rtcall_iS_s(const char *who, int src_type, prim_iS_s f, int g191, Scheme_Object** g192);
#define SIG_S_s 27
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** g184);
Scheme_Object* scheme_rtcall_S_s(const char *who, int src_type, prim_S_s f, Scheme_Object** g193);
#define SIG_s_v 28
typedef void (*prim_s_v)(Scheme_Object*);
void scheme_rtcall_s_v(const char *who, int src_type, prim_s_v f, Scheme_Object* g185);
void scheme_rtcall_s_v(const char *who, int src_type, prim_s_v f, Scheme_Object* g194);
#define SIG_iSi_s 29
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 g186, Scheme_Object** g187, int g188);
Scheme_Object* scheme_rtcall_iSi_s(const char *who, int src_type, prim_iSi_s f, int g195, Scheme_Object** g196, int g197);
#define SIG_siS_v 30
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* g189, int g190, Scheme_Object** g191);
void scheme_rtcall_siS_v(const char *who, int src_type, prim_siS_v f, Scheme_Object* g198, int g199, Scheme_Object** g200);
#define SIG_z_p 31
typedef void* (*prim_z_p)(size_t);
void* scheme_rtcall_z_p(const char *who, int src_type, prim_z_p f, size_t g192);
void* scheme_rtcall_z_p(const char *who, int src_type, prim_z_p f, size_t g201);
#define SIG_si_s 32
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* g193, int g194);
Scheme_Object* scheme_rtcall_si_s(const char *who, int src_type, prim_si_s f, Scheme_Object* g202, int g203);
#define SIG_sis_v 33
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* g195, int g196, Scheme_Object* g197);
void scheme_rtcall_sis_v(const char *who, int src_type, prim_sis_v f, Scheme_Object* g204, int g205, Scheme_Object* g206);
#define SIG_ss_i 34
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* g198, Scheme_Object* g199);
int scheme_rtcall_ss_i(const char *who, int src_type, prim_ss_i f, Scheme_Object* g207, Scheme_Object* g208);
#define SIG_iSp_v 35
typedef void (*prim_iSp_v)(int, Scheme_Object**, void*);
void scheme_rtcall_iSp_v(const char *who, int src_type, prim_iSp_v f, int g209, Scheme_Object** g210, void* g211);

View File

@ -346,5 +346,19 @@ case SIG_ss_i:
f(arg_s0, arg_s1);
future->retval_i = retval;
break;
}
case SIG_iSp_v:
{
prim_iSp_v f = (prim_iSp_v)future->prim_func;
JIT_TS_LOCALIZE(int, arg_i0); JIT_TS_LOCALIZE(Scheme_Object**, arg_S1); JIT_TS_LOCALIZE(void*, arg_p2);
future->arg_S1 = NULL; future->arg_p2 = NULL;
ADJUST_RS_ARG(future, arg_S1);
f(arg_i0, arg_S1, arg_p2);
break;
}

View File

@ -83,6 +83,12 @@ static Scheme_Object *apply_checked_fail(Scheme_Object **args)
return _scheme_apply(args[2], 3, a);
}
static void apply_prim_to_fail(int argc, Scheme_Object **argv, void *_p)
{
Scheme_Primitive_Closure_Proc *p = (Scheme_Primitive_Closure_Proc *)_p;
(void)p(argc, argv, NULL);
}
static Scheme_Object *vector_check_chaperone_of(Scheme_Object *o, Scheme_Object *orig, int setter)
{
if (!scheme_chaperone_of(o, orig))
@ -288,8 +294,8 @@ static int common1(mz_jit_state *jitter, void *_data)
GC_CAN_IGNORE jit_insn *ref;
/* *** [bad_][m]{car,cdr,...,{imag,real}_part}_code *** */
/* Argument is in R0 for car/cdr, R2 otherwise */
for (i = 0; i < 12; i++) {
/* Argument is in R2 for cXX+r, R0 otherwise */
for (i = 0; i < 13; i++) {
void *code;
code = jit_get_ip().ptr;
@ -330,11 +336,14 @@ static int common1(mz_jit_state *jitter, void *_data)
case 11:
sjc.bad_flimag_part_code = code;
break;
case 12:
sjc.bad_cXr_code = code;
break;
}
mz_prolog(JIT_R1);
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1));
CHECK_RUNSTACK_OVERFLOW();
if ((i < 2) || (i > 5)) {
if ((i != 12) && ((i < 2) || (i > 5))) {
jit_str_p(JIT_RUNSTACK, JIT_R0);
} else {
jit_str_p(JIT_RUNSTACK, JIT_R2);
@ -342,7 +351,12 @@ static int common1(mz_jit_state *jitter, void *_data)
JIT_UPDATE_THREAD_RSPTR();
CHECK_LIMIT();
jit_movi_i(JIT_R1, 1);
jit_prepare(2);
if (i == 12) {
jit_prepare(3);
jit_pusharg_p(JIT_R0);
} else {
jit_prepare(2);
}
jit_pusharg_p(JIT_RUNSTACK);
jit_pusharg_i(JIT_R1);
switch (i) {
@ -382,6 +396,9 @@ static int common1(mz_jit_state *jitter, void *_data)
case 11:
(void)mz_finish_lwe(ts_scheme_checked_flimag_part, ref);
break;
case 12:
(void)mz_finish_lwe(ts_apply_prim_to_fail, ref);
break;
}
CHECK_LIMIT();

View File

@ -367,6 +367,15 @@ static int generate_inlined_struct_op(int kind, mz_jit_state *jitter,
return 1;
}
static int is_cXr_prim(const char *name)
{
int i;
if (name[0] != 'c') return 0;
for (i = 1; (name[i] == 'a') || (name[i] == 'd'); i++) { }
if (name[i] != 'r') return 0;
return !name[i+1];
}
static int generate_vector_alloc(mz_jit_state *jitter, Scheme_Object *rator,
Scheme_App_Rec *app, Scheme_App2_Rec *app2, Scheme_App3_Rec *app3);
@ -608,12 +617,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
return 1;
} else if (!for_branch) {
if (IS_NAMED_PRIM(rator, "car")
|| IS_NAMED_PRIM(rator, "cdr")
|| IS_NAMED_PRIM(rator, "cadr")
|| IS_NAMED_PRIM(rator, "cdar")
|| IS_NAMED_PRIM(rator, "caar")
|| IS_NAMED_PRIM(rator, "cddr")) {
if (is_cXr_prim(((Scheme_Primitive_Proc *)rator)->name)) {
# define MAX_LEVELS 2
GC_CAN_IGNORE jit_insn *reffail = NULL, *ref;
int steps, i;
@ -650,7 +654,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
} else {
(void)jit_calli(sjc.bad_cdr_code);
}
} else {
} else if (steps == 2) {
if (name[1] == 'a') {
if (name[2] == 'a') {
(void)jit_calli(sjc.bad_caar_code);
@ -664,6 +668,9 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
(void)jit_calli(sjc.bad_cddr_code);
}
}
} else {
(void)jit_movi_p(JIT_R0, ((Scheme_Primitive_Proc *)rator)->prim_val);
(void)jit_calli(sjc.bad_cXr_code);
}
__START_TINY_JUMPS__(1);
mz_patch_branch(ref);

View File

@ -321,127 +321,101 @@ scheme_init_list (Scheme_Env *env)
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cddr", p, env);
scheme_add_global_constant ("caaar",
scheme_make_folding_prim(caaar_prim,
"caaar",
1, 1, 1),
env);
scheme_add_global_constant ("caadr",
scheme_make_folding_prim(caadr_prim,
"caadr",
1, 1, 1),
env);
scheme_add_global_constant ("cadar",
scheme_make_folding_prim(cadar_prim,
"cadar",
1, 1, 1),
env);
scheme_add_global_constant ("cdaar",
scheme_make_folding_prim(cdaar_prim,
"cdaar",
1, 1, 1),
env);
scheme_add_global_constant ("cdadr",
scheme_make_folding_prim(cdadr_prim,
"cdadr",
1, 1, 1),
env);
scheme_add_global_constant ("cddar",
scheme_make_folding_prim(cddar_prim,
"cddar",
1, 1, 1),
env);
scheme_add_global_constant ("caddr",
scheme_make_folding_prim(caddr_prim,
"caddr",
1, 1, 1),
env);
scheme_add_global_constant ("cdddr",
scheme_make_folding_prim(cdddr_prim,
"cdddr",
1, 1, 1),
env);
scheme_add_global_constant ("cddddr",
scheme_make_folding_prim(cddddr_prim,
"cddddr",
1, 1, 1),
env);
p = scheme_make_folding_prim(caaar_prim, "caaar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("caaar", p, env);
scheme_add_global_constant ("cadddr",
scheme_make_folding_prim(cadddr_prim,
"cadddr",
1, 1, 1),
env);
scheme_add_global_constant ("cdaddr",
scheme_make_folding_prim(cdaddr_prim,
"cdaddr",
1, 1, 1),
env);
scheme_add_global_constant ("cddadr",
scheme_make_folding_prim(cddadr_prim,
"cddadr",
1, 1, 1),
env);
scheme_add_global_constant ("cdddar",
scheme_make_folding_prim(cdddar_prim,
"cdddar",
1, 1, 1),
env);
scheme_add_global_constant ("caaddr",
scheme_make_folding_prim(caaddr_prim,
"caaddr",
1, 1, 1),
env);
scheme_add_global_constant ("cadadr",
scheme_make_folding_prim(cadadr_prim,
"cadadr",
1, 1, 1),
env);
scheme_add_global_constant ("caddar",
scheme_make_folding_prim(caddar_prim,
"caddar",
1, 1, 1),
env);
scheme_add_global_constant ("cdaadr",
scheme_make_folding_prim(cdaadr_prim,
"cdaadr",
1, 1, 1),
env);
scheme_add_global_constant ("cdadar",
scheme_make_folding_prim(cdadar_prim,
"cdadar",
1, 1, 1),
env);
scheme_add_global_constant ("cddaar",
scheme_make_folding_prim(cddaar_prim,
"cddaar",
1, 1, 1),
env);
scheme_add_global_constant ("cdaaar",
scheme_make_folding_prim(cdaaar_prim,
"cdaaar",
1, 1, 1),
env);
scheme_add_global_constant ("cadaar",
scheme_make_folding_prim(cadaar_prim,
"cadaar",
1, 1, 1),
env);
scheme_add_global_constant ("caadar",
scheme_make_folding_prim(caadar_prim,
"caadar",
1, 1, 1),
env);
scheme_add_global_constant ("caaadr",
scheme_make_folding_prim(caaadr_prim,
"caaadr",
1, 1, 1),
env);
scheme_add_global_constant ("caaaar",
scheme_make_folding_prim(caaaar_prim,
"caaaar",
1, 1, 1),
env);
p = scheme_make_folding_prim(caadr_prim, "caadr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("caadr", p, env);
p = scheme_make_folding_prim(cadar_prim, "cadar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cadar", p, env);
p = scheme_make_folding_prim(cdaar_prim, "cdaar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cdaar", p, env);
p = scheme_make_folding_prim(cdadr_prim, "cdadr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cdadr", p, env);
p = scheme_make_folding_prim(cddar_prim, "cddar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cddar", p, env);
p = scheme_make_folding_prim(caddr_prim, "caddr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("caddr", p, env);
p = scheme_make_folding_prim(cdddr_prim, "cdddr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cdddr", p, env);
p = scheme_make_folding_prim(cddddr_prim, "cddddr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cddddr", p, env);
p = scheme_make_folding_prim(cadddr_prim, "cadddr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cadddr", p, env);
p = scheme_make_folding_prim(cdaddr_prim, "cdaddr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cdaddr", p, env);
p = scheme_make_folding_prim(cddadr_prim, "cddadr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cddadr", p, env);
p = scheme_make_folding_prim(cdddar_prim, "cdddar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cdddar", p, env);
p = scheme_make_folding_prim(caaddr_prim, "caaddr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("caaddr", p, env);
p = scheme_make_folding_prim(cadadr_prim, "cadadr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cadadr", p, env);
p = scheme_make_folding_prim(caddar_prim, "caddar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("caddar", p, env);
p = scheme_make_folding_prim(cdaadr_prim, "cdaadr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cdaadr", p, env);
p = scheme_make_folding_prim(cdadar_prim, "cdadar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cdadar", p, env);
p = scheme_make_folding_prim(cddaar_prim, "cddaar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cddaar", p, env);
p = scheme_make_folding_prim(cdaaar_prim, "cdaaar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cdaaar", p, env);
p = scheme_make_folding_prim(cadaar_prim, "cadaar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("cadaar", p, env);
p = scheme_make_folding_prim(caadar_prim, "caadar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("caadar", p, env);
p = scheme_make_folding_prim(caaadr_prim, "caaadr", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("caaadr", p, env);
p = scheme_make_folding_prim(caaaar_prim, "caaaar", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant ("caaaar", p, env);
REGISTER_SO(scheme_box_proc);
p = scheme_make_immed_prim(box, BOX, 1, 1);