more on self tail calls: avoid store and load on last argument

svn: r2389
This commit is contained in:
Matthew Flatt 2006-03-08 03:00:28 +00:00
parent 421a8601d6
commit 2bcb68471c

View File

@ -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);
} }
} }