diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2020-12-22 22:23:45 -0800 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2020-12-22 22:32:19 -0800 |
commit | dbb4f1996939d0ce977e6b37579e28dd886428ff (patch) | |
tree | c78f48a6f20b742c265596ea580e1fab318c239b /numeric.c | |
parent | daec109f423e54094800e083fc8a8ca5cbceb866 (diff) |
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
```
Diffstat (limited to 'numeric.c')
-rw-r--r-- | numeric.c | 34 |
1 files changed, 4 insertions, 30 deletions
@@ -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); |