Assign directly to C_ARG_REGS now when possible

This commit is contained in:
John Hawthorn 2021-08-09 23:49:44 -07:00 коммит произвёл Alan Wu
Родитель 8fa0ee4d40
Коммит 595fdf8d66
1 изменённых файлов: 8 добавлений и 20 удалений

Просмотреть файл

@ -1531,7 +1531,6 @@ gen_setinstancevariable(jitstate_t* jit, ctx_t* ctx)
x86opnd_t val_opnd = ctx_stack_pop(ctx, 1);
// Call rb_vm_setinstancevariable(iseq, obj, id, val, ic);
// Out of order because we're going to corrupt REG_SP and REG_CFP
mov(cb, C_ARG_REGS[1], member_opnd(REG_CFP, rb_control_frame_t, self));
mov(cb, C_ARG_REGS[3], val_opnd);
mov(cb, C_ARG_REGS[2], imm_opnd(id));
@ -1584,14 +1583,11 @@ gen_defined(jitstate_t* jit, ctx_t* ctx)
x86opnd_t v_opnd = ctx_stack_pop(ctx, 1);
// Call vm_defined(ec, reg_cfp, op_type, obj, v)
// Out of order because we're going to corrupt REG_SP and REG_CFP
yjit_save_regs(cb);
mov(cb, R9, REG_CFP);
mov(cb, C_ARG_REGS[0], REG_EC);
mov(cb, C_ARG_REGS[1], R9);
mov(cb, C_ARG_REGS[4], v_opnd); // depends on REG_SP
mov(cb, C_ARG_REGS[2], imm_opnd(op_type)); // clobers REG_SP
mov(cb, C_ARG_REGS[1], REG_CFP);
mov(cb, C_ARG_REGS[2], imm_opnd(op_type));
jit_mov_gc_ptr(jit, cb, C_ARG_REGS[3], (VALUE)obj);
mov(cb, C_ARG_REGS[4], v_opnd);
call_ptr(cb, REG0, (void *)rb_vm_defined);
// if (vm_defined(ec, GET_CFP(), op_type, obj, v)) {
@ -1948,14 +1944,12 @@ gen_opt_aref(jitstate_t *jit, ctx_t *ctx)
jit_save_pc(jit, REG0);
// About to change REG_SP which these operands depend on. Yikes.
mov(cb, R8, recv_opnd);
mov(cb, R9, idx_opnd);
mov(cb, C_ARG_REGS[0], recv_opnd);
mov(cb, C_ARG_REGS[1], idx_opnd);
// Write sp to cfp->sp since rb_hash_aref might need to call #hash on the key
jit_save_sp(jit, ctx);
mov(cb, C_ARG_REGS[0], R8);
mov(cb, C_ARG_REGS[1], R9);
call_ptr(cb, REG0, (void *)rb_hash_aref);
// Push the return value onto the stack
@ -2961,15 +2955,12 @@ gen_send_iseq(jitstate_t *jit, ctx_t *ctx, const struct rb_callinfo *ci, const r
if (leaf_builtin && !block && leaf_builtin->argc + 1 <= NUM_C_ARG_REGS) {
ADD_COMMENT(cb, "inlined leaf builtin");
// Get a pointer to the top of the stack
lea(cb, REG0, ctx_stack_opnd(ctx, 0));
// Call the builtin func (ec, recv, arg1, arg2, ...)
mov(cb, C_ARG_REGS[0], REG_EC);
// Copy self and arguments
for (int32_t i = 0; i < leaf_builtin->argc + 1; i++) {
x86opnd_t stack_opnd = mem_opnd(64, REG0, -(leaf_builtin->argc - i) * SIZEOF_VALUE);
x86opnd_t stack_opnd = ctx_stack_opnd(ctx, leaf_builtin->argc - i);
x86opnd_t c_arg_reg = C_ARG_REGS[i + 1];
mov(cb, c_arg_reg, stack_opnd);
}
@ -3613,12 +3604,9 @@ gen_opt_invokebuiltin_delegate(jitstate_t *jit, ctx_t *ctx)
mov(cb, REG0, member_opnd(REG_CFP, rb_control_frame_t, ep));
}
// Save self from CFP
mov(cb, REG1, member_opnd(REG_CFP, rb_control_frame_t, self));
// Call the builtin func (ec, recv, arg1, arg2, ...)
mov(cb, C_ARG_REGS[0], REG_EC); // clobbers REG_CFP
mov(cb, C_ARG_REGS[1], REG1); // self, clobbers REG_EC
mov(cb, C_ARG_REGS[0], REG_EC);
mov(cb, C_ARG_REGS[1], member_opnd(REG_CFP, rb_control_frame_t, self));
// Copy arguments from locals
for (int32_t i = 0; i < bf->argc; i++) {