summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2021-09-22 16:11:45 -0400
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:41 -0400
commitd0a213b30d04372d1a1b5012246ac7da3236db31 (patch)
tree2ea09e1582feab7ce986745975675b3164e1f119
parent0a108601eff5a1e69a4dd5dc170e9eaa807d4788 (diff)
Remove a memory load in gen_send_iseq
Instead of loading from meory for REG_SP, do a register rename instead. It's cheaper.
-rw-r--r--yjit_codegen.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/yjit_codegen.c b/yjit_codegen.c
index ac7f866d9e..e3a23b3bb8 100644
--- a/yjit_codegen.c
+++ b/yjit_codegen.c
@@ -3477,15 +3477,16 @@ gen_send_iseq(jitstate_t *jit, ctx_t *ctx, const struct rb_callinfo *ci, const r
// .block_code = 0,
// .__bp__ = sp,
// };
- mov(cb, member_opnd(REG_CFP, rb_control_frame_t, block_code), imm_opnd(0));
+ mov(cb, REG1, recv);
+ mov(cb, member_opnd(REG_CFP, rb_control_frame_t, self), REG1);
+ mov(cb, REG_SP, REG0); // Switch to the callee's REG_SP
mov(cb, member_opnd(REG_CFP, rb_control_frame_t, sp), REG0);
mov(cb, member_opnd(REG_CFP, rb_control_frame_t, __bp__), REG0);
sub(cb, REG0, imm_opnd(sizeof(VALUE)));
mov(cb, member_opnd(REG_CFP, rb_control_frame_t, ep), REG0);
- mov(cb, REG0, recv);
- mov(cb, member_opnd(REG_CFP, rb_control_frame_t, self), REG0);
jit_mov_gc_ptr(jit, cb, REG0, (VALUE)iseq);
mov(cb, member_opnd(REG_CFP, rb_control_frame_t, iseq), REG0);
+ mov(cb, member_opnd(REG_CFP, rb_control_frame_t, block_code), imm_opnd(0));
// No need to set cfp->pc since the callee sets it whenever calling into routines
// that could look at it through jit_save_pc().
@@ -3532,9 +3533,6 @@ gen_send_iseq(jitstate_t *jit, ctx_t *ctx, const struct rb_callinfo *ci, const r
//print_str(cb, "calling Ruby func:");
//print_str(cb, rb_id2name(vm_ci_mid(ci)));
- // Load the updated SP from the CFP
- mov(cb, REG_SP, member_opnd(REG_CFP, rb_control_frame_t, sp));
-
// Directly jump to the entry point of the callee
gen_direct_jump(
jit,