10000 Implement opt_eq by calling interpreter function (#28) · github/ruby@9ab9e63 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9ab9e63

Browse files
authored
Implement opt_eq by calling interpreter function (#28)
1 parent 71b5fb4 commit 9ab9e63

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

vm_insnhelper.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,6 +1975,12 @@ opt_equality_specialized(VALUE recv, VALUE obj)
19751975
}
19761976
}
19771977

1978+
VALUE
1979+
rb_opt_equality_specialized(VALUE recv, VALUE obj)
1980+
{
1981+
return opt_equality_specialized(recv, obj);
1982+
}
1983+
19781984
static VALUE
19791985
opt_equality(const rb_iseq_t *cd_owner, VALUE recv, VALUE obj, CALL_DATA cd)
19801986
{

yjit_codegen.c

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1161,7 +1161,7 @@ gen_fixnum_cmp(jitstate_t* jit, ctx_t* ctx, cmov_fn cmov_op)
11611161
// Check that both operands are fixnums
11621162
guard_two_fixnums(ctx, side_exit);
11631163

1164-
// Get the operands and destination from the stack
1164+
// Get the operands from the stack
11651165
x86opnd_t arg1 = ctx_stack_pop(ctx, 1);
11661166
x86opnd_t arg0 = ctx_stack_pop(ctx, 1);
11671167

@@ -1203,6 +1203,36 @@ gen_opt_gt(jitstate_t* jit, ctx_t* ctx)
12031203
return gen_fixnum_cmp(jit, ctx, cmovg);
12041204
}
12051205

1206+
VALUE rb_opt_equality_specialized(VALUE recv, VALUE obj);
1207+
1208+
static codegen_status_t
1209+
gen_opt_eq(jitstate_t* jit, ctx_t* ctx)
1210+
{
1211+
uint8_t* side_exit = yjit_side_exit(jit, ctx);
1212+
1213+
// Get the operands from the stack
1214+
x86opnd_t arg1 = ctx_stack_pop(ctx, 1);
1215+
x86opnd_t arg0 = ctx_stack_pop(ctx, 1);
1216+
1217+
// Call rb_opt_equality_specialized(VALUE recv, VALUE obj)
1218+
// We know this method won't allocate or perform calls
1219+
yjit_save_regs(cb);
1220+
mov(cb, C_ARG_REGS[0], arg0);
1221+
mov(cb, C_ARG_REGS[1], arg1);
1222+
call_ptr(cb, REG0, (void *)rb_opt_equality_specialized);
1223+
yjit_load_regs(cb);
1224+
1225+
// If val == Qundef, bail to do a method call
1226+
cmp(cb, RAX, imm_opnd(Qundef));
1227+
je_ptr(cb, side_exit);
1228+
1229+
// Push the return value onto the stack
1230+
x86opnd_t stack_ret = ctx_stack_push(ctx, TYPE_IMM);
1231+
mov(cb, stack_ret, RAX);
1232+
1233+
return YJIT_KEEP_COMPILING;
1234+
}
1235+
12061236
static codegen_status_t gen_opt_send_without_block(jitstate_t *jit, ctx_t *ctx);
12071237

12081238
static codegen_status_t
@@ -2452,6 +2482,7 @@ yjit_init_codegen(void)
24522482
yjit_reg_op(BIN(opt_le), gen_opt_le);
24532483
yjit_reg_op(BIN(opt_ge), gen_opt_ge);
24542484
yjit_reg_op(BIN(opt_gt), gen_opt_gt);
2485+
yjit_reg_op(BIN(opt_eq), gen_opt_eq);
24552486
yjit_reg_op(BIN(opt_aref), gen_opt_aref);
24562487
yjit_reg_op(BIN(opt_and), gen_opt_and);
24572488
yjit_reg_op(BIN(opt_or), gen_opt_or);

0 commit comments

Comments
 (0)
0