Allow inlining Integer#-@ and #~

```
$ benchmark-driver -v --rbenv 'before --jit;after --jit' benchmark/mjit_integer.yml --filter '(comp|uminus)'
before --jit: ruby 3.0.0dev (2020-12-23T05:41:44Z master 0dd4896175) +JIT [x86_64-linux]
after --jit: ruby 3.0.0dev (2020-12-23T06:25:41Z master 8887d78992) +JIT [x86_64-linux]
last_commit=Allow inlining Integer#-@ and #~
Calculating -------------------------------------
                     before --jit  after --jit
        mjit_comp(1)      44.006M      70.417M i/s -     40.000M times in 0.908967s 0.568042s
      mjit_uminus(1)      44.333M      68.422M i/s -     40.000M times in 0.902255s 0.584603s

Comparison:
                     mjit_comp(1)
         after --jit:  70417331.4 i/s
        before --jit:  44005980.4 i/s - 1.60x  slower

                   mjit_uminus(1)
         after --jit:  68422468.8 i/s
        before --jit:  44333371.0 i/s - 1.54x  slower
```
This commit is contained in:
Takashi Kokubun 2020-12-22 22:23:45 -08:00
parent daec109f42
commit dbb4f19969
No known key found for this signature in database
GPG Key ID: 6FFC433B12EE23DD
4 changed files with 35 additions and 31 deletions

View File

@ -2,6 +2,7 @@ type: lib/benchmark_driver/runner/mjit
prelude: |
def mjit_abs(int) int.abs end
def mjit_bit_length(int) int.bit_length end
def mjit_comp(int) ~int end
def mjit_even?(int) int.even? end
def mjit_integer?(int) int.integer? end
def mjit_magnitude(int) int.magnitude end
@ -9,11 +10,13 @@ prelude: |
def mjit_ord(int) int.ord end
def mjit_to_i(int) int.to_i end
def mjit_to_int(int) int.to_int end
def mjit_uminus(int) -int end
def mjit_zero?(int) int.zero? end
benchmark:
- mjit_abs(-1)
- mjit_bit_length(100)
- mjit_comp(1)
- mjit_even?(2)
- mjit_integer?(0)
- mjit_magnitude(-1)
@ -21,6 +24,7 @@ benchmark:
- mjit_ord(1)
- mjit_to_i(1)
- mjit_to_int(1)
- mjit_uminus(1)
- mjit_zero?(0)
loop_count: 40000000

View File

@ -1,4 +1,29 @@
class Integer
# call-seq:
# -int -> integer
#
# Returns +int+, negated.
def -@
Primitive.attr! 'inline'
Primitive.cexpr! 'rb_int_uminus(self)'
end
# call-seq:
# ~int -> integer
#
# One's complement: returns a number where each bit is flipped.
#
# Inverts the bits in an Integer. As integers are conceptually of
# infinite length, the result acts as if it had an infinite number of
# one bits to the left. In hex representations, this is displayed
# as two periods to the left of the digits.
#
# sprintf("%X", ~0x1122334455) #=> "..FEEDDCCBBAA"
def ~
Primitive.attr! 'inline'
Primitive.cexpr! 'rb_int_comp(self)'
end
def abs
Primitive.attr! 'inline'
Primitive.cexpr! 'rb_int_abs(self)'

View File

@ -50,7 +50,6 @@ double ruby_float_step_size(double beg, double end, double unit, int excl);
int ruby_float_step(VALUE from, VALUE to, VALUE step, int excl, int allow_endless);
int rb_num_negative_p(VALUE);
VALUE rb_int_succ(VALUE num);
VALUE rb_int_uminus(VALUE num);
VALUE rb_float_uminus(VALUE num);
VALUE rb_int_plus(VALUE x, VALUE y);
VALUE rb_float_plus(VALUE x, VALUE y);
@ -112,6 +111,8 @@ VALUE rb_int_even_p(VALUE num);
VALUE rb_int_odd_p(VALUE num);
VALUE rb_int_abs(VALUE num);
VALUE rb_int_bit_length(VALUE num);
VALUE rb_int_uminus(VALUE num);
VALUE rb_int_comp(VALUE num);
MJIT_SYMBOL_EXPORT_END
static inline bool

View File

@ -3456,15 +3456,6 @@ int_chr(int argc, VALUE *argv, VALUE num)
* Fixnum
*/
/*
* Document-method: Integer#-@
* call-seq:
* -int -> integer
*
* Returns +int+, negated.
*/
static VALUE
fix_uminus(VALUE num)
{
@ -3477,10 +3468,10 @@ rb_int_uminus(VALUE num)
if (FIXNUM_P(num)) {
return fix_uminus(num);
}
else if (RB_TYPE_P(num, T_BIGNUM)) {
else {
assert(RB_TYPE_P(num, T_BIGNUM));
return rb_big_uminus(num);
}
return num_funcall0(num, idUMinus);
}
/*
@ -4371,29 +4362,14 @@ int_le(VALUE x, VALUE y)
return Qnil;
}
/*
* Document-method: Integer#~
* call-seq:
* ~int -> integer
*
* One's complement: returns a number where each bit is flipped.
*
* Inverts the bits in an Integer. As integers are conceptually of
* infinite length, the result acts as if it had an infinite number of
* one bits to the left. In hex representations, this is displayed
* as two periods to the left of the digits.
*
* sprintf("%X", ~0x1122334455) #=> "..FEEDDCCBBAA"
*/
static VALUE
fix_comp(VALUE num)
{
return ~num | FIXNUM_FLAG;
}
static VALUE
int_comp(VALUE num)
VALUE
rb_int_comp(VALUE num)
{
if (FIXNUM_P(num)) {
return fix_comp(num);
@ -5576,7 +5552,6 @@ Init_Numeric(void)
rb_define_method(rb_cInteger, "round", int_round, -1);
rb_define_method(rb_cInteger, "<=>", rb_int_cmp, 1);
rb_define_method(rb_cInteger, "-@", rb_int_uminus, 0);
rb_define_method(rb_cInteger, "+", rb_int_plus, 1);
rb_define_method(rb_cInteger, "-", rb_int_minus, 1);
rb_define_method(rb_cInteger, "*", rb_int_mul, 1);
@ -5598,7 +5573,6 @@ Init_Numeric(void)
rb_define_method(rb_cInteger, "<", int_lt, 1);
rb_define_method(rb_cInteger, "<=", int_le, 1);
rb_define_method(rb_cInteger, "~", int_comp, 0);
rb_define_method(rb_cInteger, "&", rb_int_and, 1);
rb_define_method(rb_cInteger, "|", int_or, 1);
rb_define_method(rb_cInteger, "^", int_xor, 1);