fix direct-prim interception code to not use 4 arguments
svn: r15673
This commit is contained in:
parent
160d30d81d
commit
7616035dc0
|
@ -1957,16 +1957,18 @@ static jit_insn *generate_proc_struct_retry(mz_jit_state *jitter, int num_rands,
|
|||
#if 1
|
||||
# define mz_prepare_direct_prim(n) mz_prepare(n)
|
||||
# define mz_finishr_direct_prim(reg, proc) mz_finishr(reg)
|
||||
# define mz_direct_only(p) p
|
||||
#else
|
||||
# define mz_prepare_direct_prim(n) mz_prepare(n+1)
|
||||
# define mz_prepare_direct_prim(n) mz_prepare(n)
|
||||
# define mz_finishr_direct_prim(reg, proc) (jit_pusharg_p(reg), (void)mz_finish(proc))
|
||||
static Scheme_Object *noncm_prim_indirect(Scheme_Prim proc, int argc, Scheme_Object **argv)
|
||||
# define mz_direct_only(p) /* skip this arg, so that total count <= 3 args */
|
||||
static Scheme_Object *noncm_prim_indirect(Scheme_Prim proc, int argc)
|
||||
{
|
||||
return proc(argc, argv);
|
||||
return proc(argc, MZ_RUNSTACK);
|
||||
}
|
||||
static Scheme_Object *prim_indirect(Scheme_Primitive_Closure_Proc proc, int argc, Scheme_Object **argv, Scheme_Object *self)
|
||||
static Scheme_Object *prim_indirect(Scheme_Primitive_Closure_Proc proc, int argc, Scheme_Object *self)
|
||||
{
|
||||
return proc(argc, argv, self);
|
||||
return proc(argc, MZ_RUNSTACK, self);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1985,7 +1987,7 @@ static int generate_direct_prim_tail_call(mz_jit_state *jitter, int num_rands)
|
|||
jit_movi_i(JIT_R1, num_rands);
|
||||
mz_prepare_direct_prim(2); /* a prim takes 3 args, but a NONCM prim ignores the 3rd */
|
||||
CHECK_LIMIT();
|
||||
jit_pusharg_p(JIT_RUNSTACK);
|
||||
mz_direct_only(jit_pusharg_p(JIT_RUNSTACK));
|
||||
jit_pusharg_i(JIT_R1);
|
||||
mz_finishr_direct_prim(JIT_V1, noncm_prim_indirect);
|
||||
CHECK_LIMIT();
|
||||
|
@ -2178,7 +2180,7 @@ static int generate_direct_prim_non_tail_call(mz_jit_state *jitter, int num_rand
|
|||
jit_movi_i(JIT_R1, num_rands);
|
||||
mz_prepare_direct_prim(2); /* a prim takes 3 args, but a NONCM prim ignores the 3rd */
|
||||
CHECK_LIMIT();
|
||||
jit_pusharg_p(JIT_RUNSTACK);
|
||||
mz_direct_only(jit_pusharg_p(JIT_RUNSTACK));
|
||||
jit_pusharg_i(JIT_R1);
|
||||
mz_finishr_direct_prim(JIT_V1, noncm_prim_indirect);
|
||||
CHECK_LIMIT();
|
||||
|
@ -2471,7 +2473,7 @@ static int generate_non_tail_call(mz_jit_state *jitter, int num_rands, int direc
|
|||
mz_prepare_direct_prim(3);
|
||||
jit_pusharg_p(JIT_V1);
|
||||
if (num_rands < 0) { jit_movr_p(JIT_V1, JIT_R0); } /* save argc to manually pop runstack */
|
||||
jit_pusharg_p(JIT_RUNSTACK);
|
||||
mz_direct_only(jit_pusharg_p(JIT_RUNSTACK));
|
||||
jit_pusharg_i(JIT_R2);
|
||||
mz_finishr_direct_prim(JIT_R1, prim_indirect);
|
||||
CHECK_LIMIT();
|
||||
|
@ -7207,7 +7209,7 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
|
|||
}
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
mz_prepare_direct_prim(2);
|
||||
jit_pusharg_p(JIT_RUNSTACK);
|
||||
mz_direct_only(jit_pusharg_p(JIT_RUNSTACK));
|
||||
jit_pusharg_p(JIT_R1);
|
||||
mz_finishr_direct_prim(JIT_R2, noncm_prim_indirect);
|
||||
CHECK_LIMIT();
|
||||
|
|
Loading…
Reference in New Issue
Block a user