Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
vm_insnhelper.c: split vm_opt_minus
  • Loading branch information
k0kubun committed Sep 22, 2018
commit b888472e2e2e4015452f310c33feafeb59312af2
1 change: 0 additions & 1 deletion compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -3232,7 +3232,6 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
break;
case 1:
switch (ci->mid) {
case idMINUS: SP_INSN(minus); return COMPILE_OK;
case idMULT: SP_INSN(mult); return COMPILE_OK;
case idDIV: SP_INSN(div); return COMPILE_OK;
case idMOD: SP_INSN(mod); return COMPILE_OK;
Expand Down
14 changes: 0 additions & 14 deletions insns.def
Original file line number Diff line number Diff line change
Expand Up @@ -1040,20 +1040,6 @@ opt_case_dispatch

/** simple functions */

/* optimized X-Y. */
DEFINE_INSN
opt_minus
(CALL_INFO ci, CALL_CACHE cc)
(VALUE recv, VALUE obj)
(VALUE val)
{
val = vm_opt_minus(recv, obj);

if (val == Qundef) {
CALL_SIMPLE_METHOD();
}
}

/* optimized X*Y. */
DEFINE_INSN
opt_mult
Expand Down
3 changes: 3 additions & 0 deletions internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -1450,6 +1450,7 @@ VALUE rb_int_idiv(VALUE x, VALUE y);
VALUE rb_int_modulo(VALUE x, VALUE y);
VALUE rb_int_round(VALUE num, int ndigits, enum ruby_num_rounding_mode mode);
VALUE rb_flo_plus(VALUE x, VALUE y);
VALUE rb_flo_minus(VALUE x, VALUE y);
VALUE rb_int2str(VALUE num, int base);
VALUE rb_dbl_hash(double d);
VALUE rb_fix_plus(VALUE x, VALUE y);
Expand Down Expand Up @@ -1953,6 +1954,8 @@ VALUE rb_opt_int_plus(VALUE recv, VALUE obj);
VALUE rb_opt_flo_plus(VALUE recv, VALUE obj);
VALUE rb_opt_str_plus(VALUE recv, VALUE obj);
VALUE rb_opt_ary_plus(VALUE recv, VALUE obj);
VALUE rb_opt_int_minus(VALUE recv, VALUE obj);
VALUE rb_opt_flo_minus(VALUE recv, VALUE obj);
VALUE rb_equal_opt(VALUE obj1, VALUE obj2);
VALUE rb_eql_opt(VALUE obj1, VALUE obj2);
void Init_vm_stack_canary(void);
Expand Down
8 changes: 4 additions & 4 deletions numeric.c
Original file line number Diff line number Diff line change
Expand Up @@ -1042,8 +1042,8 @@ rb_flo_plus(VALUE x, VALUE y)
* Returns a new Float which is the difference of +float+ and +other+.
*/

static VALUE
flo_minus(VALUE x, VALUE y)
VALUE
rb_flo_minus(VALUE x, VALUE y)
{
if (RB_TYPE_P(y, T_FIXNUM)) {
return DBL2NUM(RFLOAT_VALUE(x) - (double)FIX2LONG(y));
Expand Down Expand Up @@ -5477,7 +5477,7 @@ Init_Numeric(void)

rb_define_method(rb_cInteger, "-@", rb_int_uminus, 0);
rb_define_method(rb_cInteger, "+", rb_opt_int_plus, 1);
rb_define_method(rb_cInteger, "-", rb_int_minus, 1);
rb_define_method(rb_cInteger, "-", rb_opt_int_minus, 1);
rb_define_method(rb_cInteger, "*", rb_int_mul, 1);
rb_define_method(rb_cInteger, "/", rb_int_div, 1);
rb_define_method(rb_cInteger, "div", rb_int_idiv, 1);
Expand Down Expand Up @@ -5625,7 +5625,7 @@ Init_Numeric(void)
rb_define_method(rb_cFloat, "coerce", flo_coerce, 1);
rb_define_method(rb_cFloat, "-@", rb_float_uminus, 0);
rb_define_method(rb_cFloat, "+", rb_opt_flo_plus, 1);
rb_define_method(rb_cFloat, "-", flo_minus, 1);
rb_define_method(rb_cFloat, "-", rb_opt_flo_minus, 1);
rb_define_method(rb_cFloat, "*", flo_mul, 1);
rb_define_method(rb_cFloat, "/", flo_div, 1);
rb_define_method(rb_cFloat, "quo", flo_quo, 1);
Expand Down
56 changes: 34 additions & 22 deletions vm_insnhelper.c
Original file line number Diff line number Diff line change
Expand Up @@ -3426,15 +3426,12 @@ RB_DEFINE_FASTPATH(rb_fix_plus_fix, 1, FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEF
RB_DEFINE_FASTPATH_INLINE(rb_flonum_plus, 1, FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_PLUS, FLOAT_REDEFINED_OP_FLAG),
DBL2NUM(RFLOAT_VALUE(recv) + RFLOAT_VALUE(obj)));
RB_DEFINE_FASTPATH_INLINE(rb_float_plus, 1, !SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj) &&
RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat &&
BASIC_OP_UNREDEFINED_P(BOP_PLUS, FLOAT_REDEFINED_OP_FLAG),
RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_PLUS, FLOAT_REDEFINED_OP_FLAG),
DBL2NUM(RFLOAT_VALUE(recv) + RFLOAT_VALUE(obj)));
RB_DEFINE_FASTPATH(rb_str_plus, 1, !SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj) &&
RBASIC_CLASS(recv) == rb_cString && RBASIC_CLASS(obj) == rb_cString &&
BASIC_OP_UNREDEFINED_P(BOP_PLUS, STRING_REDEFINED_OP_FLAG));
RBASIC_CLASS(recv) == rb_cString && RBASIC_CLASS(obj) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_PLUS, STRING_REDEFINED_OP_FLAG));
RB_DEFINE_FASTPATH(rb_ary_plus, 1, !SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj) &&
RBASIC_CLASS(recv) == rb_cArray && RBASIC_CLASS(obj) == rb_cArray &&
BASIC_OP_UNREDEFINED_P(BOP_PLUS, ARRAY_REDEFINED_OP_FLAG));
RBASIC_CLASS(recv) == rb_cArray && RBASIC_CLASS(obj) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_PLUS, ARRAY_REDEFINED_OP_FLAG));

VALUE
rb_opt_int_plus(VALUE recv, VALUE obj)
Expand Down Expand Up @@ -3482,27 +3479,38 @@ rb_opt_ary_plus(VALUE recv, VALUE obj)
return rb_ary_plus(recv, obj);
}

static VALUE
vm_opt_minus(VALUE recv, VALUE obj)
RB_DEFINE_FASTPATH(rb_fix_minus_fix, 1, FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MINUS, INTEGER_REDEFINED_OP_FLAG));
RB_DEFINE_FASTPATH_INLINE(rb_flonum_minus, 1, FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MINUS, FLOAT_REDEFINED_OP_FLAG),
DBL2NUM(RFLOAT_VALUE(recv) - RFLOAT_VALUE(obj)));
RB_DEFINE_FASTPATH_INLINE(rb_float_minus, 1, !SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj) &&
RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_MINUS, FLOAT_REDEFINED_OP_FLAG),
DBL2NUM(RFLOAT_VALUE(recv) - RFLOAT_VALUE(obj)));

VALUE
rb_opt_int_minus(VALUE recv, VALUE obj)
{
if (FIXNUM_2_P(recv, obj) &&
BASIC_OP_UNREDEFINED_P(BOP_MINUS, INTEGER_REDEFINED_OP_FLAG)) {
return rb_fix_minus_fix(recv, obj);
if (FIXNUM_2_P(recv, obj)) {
RB_SET_FASTPATH(rb_fix_minus_fix);
return rb_fix_minus_fix(recv, obj);
}
else if (FLONUM_2_P(recv, obj) &&
BASIC_OP_UNREDEFINED_P(BOP_MINUS, FLOAT_REDEFINED_OP_FLAG)) {
return DBL2NUM(RFLOAT_VALUE(recv) - RFLOAT_VALUE(obj));
else {
return rb_int_minus(recv, obj);
}
else if (SPECIAL_CONST_P(recv) || SPECIAL_CONST_P(obj)) {
return Qundef;
}

VALUE
rb_opt_flo_minus(VALUE recv, VALUE obj)
{
if (FLONUM_2_P(recv, obj)) {
RB_SET_FASTPATH(rb_flonum_minus);
return rb_flonum_minus(recv, obj);
}
else if (RBASIC_CLASS(recv) == rb_cFloat &&
RBASIC_CLASS(obj) == rb_cFloat &&
BASIC_OP_UNREDEFINED_P(BOP_MINUS, FLOAT_REDEFINED_OP_FLAG)) {
return DBL2NUM(RFLOAT_VALUE(recv) - RFLOAT_VALUE(obj));
else if (!SPECIAL_CONST_P(obj) && RBASIC_CLASS(obj) == rb_cFloat) {
RB_SET_FASTPATH(rb_float_minus);
return rb_float_minus(recv, obj);
}
else {
return Qundef;
return rb_flo_minus(recv, obj);
}
}

Expand Down Expand Up @@ -3888,12 +3896,16 @@ const char *
rb_vm_fastpath_funcname(vm_call_handler call)
{
#define DETECT_FASTPATH(funcname) if (call == funcname ## _fastpath) return #funcname ;
/* List up ONLY `RB_DEFINE_FASTPATH`-ed fastpaths */
/* List up ONLY `RB_DEFINE_FASTPATH`-ed fastpaths.
TODO: create st and insert this entry by `RB_DEFINE_FASTPATH` to make this faster and remove this list. */
DETECT_FASTPATH(rb_fix_plus_fix);
DETECT_FASTPATH(rb_flonum_plus);
DETECT_FASTPATH(rb_float_plus);
DETECT_FASTPATH(rb_str_plus);
DETECT_FASTPATH(rb_ary_plus);
DETECT_FASTPATH(rb_fix_minus_fix);
DETECT_FASTPATH(rb_flonum_minus);
DETECT_FASTPATH(rb_float_minus);
return NULL;
#undef DETECT_FASTPATH
}
Expand Down