more on self tail calls: avoid store and load on last argument
svn: r2389
This commit is contained in:
parent
421a8601d6
commit
2bcb68471c
|
@ -1334,6 +1334,8 @@ static int generate_self_tail_call(Scheme_Object *rator, mz_jit_state *jitter, i
|
||||||
int i;
|
int i;
|
||||||
int closure_size = jitter->self_closure_size;
|
int closure_size = jitter->self_closure_size;
|
||||||
|
|
||||||
|
/* Last argument is in R0 */
|
||||||
|
|
||||||
#ifdef JIT_PRECISE_GC
|
#ifdef JIT_PRECISE_GC
|
||||||
closure_size++; /* Skip procedure pointer, too */
|
closure_size++; /* Skip procedure pointer, too */
|
||||||
#endif
|
#endif
|
||||||
|
@ -1353,11 +1355,14 @@ static int generate_self_tail_call(Scheme_Object *rator, mz_jit_state *jitter, i
|
||||||
|
|
||||||
/* Copy args to runstack after closure data: */
|
/* Copy args to runstack after closure data: */
|
||||||
jit_subi_p(JIT_R2, JIT_RUNSTACK_BASE, WORDS_TO_BYTES(num_rands + closure_size));
|
jit_subi_p(JIT_R2, JIT_RUNSTACK_BASE, WORDS_TO_BYTES(num_rands + closure_size));
|
||||||
for (i = num_rands; i--; ) {
|
if (num_rands) {
|
||||||
|
jit_stxi_p(WORDS_TO_BYTES(num_rands - 1 + closure_size), JIT_R2, JIT_R0);
|
||||||
|
for (i = num_rands - 1; i--; ) {
|
||||||
jit_ldxi_p(JIT_R1, JIT_RUNSTACK, WORDS_TO_BYTES(i));
|
jit_ldxi_p(JIT_R1, JIT_RUNSTACK, WORDS_TO_BYTES(i));
|
||||||
jit_stxi_p(WORDS_TO_BYTES(i + closure_size), JIT_R2, JIT_R1);
|
jit_stxi_p(WORDS_TO_BYTES(i + closure_size), JIT_R2, JIT_R1);
|
||||||
CHECK_LIMIT();
|
CHECK_LIMIT();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
jit_movr_p(JIT_RUNSTACK, JIT_R2);
|
jit_movr_p(JIT_RUNSTACK, JIT_R2);
|
||||||
|
|
||||||
/* Now jump: */
|
/* Now jump: */
|
||||||
|
@ -1369,6 +1374,7 @@ static int generate_self_tail_call(Scheme_Object *rator, mz_jit_state *jitter, i
|
||||||
mz_patch_branch(refslow);
|
mz_patch_branch(refslow);
|
||||||
__END_SHORT_JUMPS__(1);
|
__END_SHORT_JUMPS__(1);
|
||||||
|
|
||||||
|
jit_stxi_p(WORDS_TO_BYTES(num_rands - 1), JIT_RUNSTACK, JIT_R0);
|
||||||
generate(rator, jitter, 0, 0);
|
generate(rator, jitter, 0, 0);
|
||||||
CHECK_LIMIT();
|
CHECK_LIMIT();
|
||||||
jit_movr_p(JIT_V1, JIT_R0);
|
jit_movr_p(JIT_V1, JIT_R0);
|
||||||
|
@ -1527,7 +1533,8 @@ static int generate_app(Scheme_App_Rec *app, Scheme_Object **alt_rands, int num_
|
||||||
/* Move rator back to register: */
|
/* Move rator back to register: */
|
||||||
jit_ldxi_p(JIT_V1, JIT_RUNSTACK, WORDS_TO_BYTES(i + offset));
|
jit_ldxi_p(JIT_V1, JIT_RUNSTACK, WORDS_TO_BYTES(i + offset));
|
||||||
}
|
}
|
||||||
if (!direct_prim || (num_rands > 1)) {
|
if ((!direct_prim || (num_rands > 1))
|
||||||
|
&& (!direct_self || (i + 1 < num_rands))) {
|
||||||
jit_stxi_p(WORDS_TO_BYTES(i + offset), JIT_RUNSTACK, JIT_R0);
|
jit_stxi_p(WORDS_TO_BYTES(i + offset), JIT_RUNSTACK, JIT_R0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user