summaryrefslogtreecommitdiff
path: root/integer.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2020-12-22 22:23:45 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2020-12-22 22:32:19 -0800
commitdbb4f1996939d0ce977e6b37579e28dd886428ff (patch)
treec78f48a6f20b742c265596ea580e1fab318c239b /integer.rb
parentdaec109f423e54094800e083fc8a8ca5cbceb866 (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 'integer.rb')
-rw-r--r--integer.rb25
1 files changed, 25 insertions, 0 deletions
diff --git a/integer.rb b/integer.rb
index b9cde8f390..d18494f42f 100644
--- a/integer.rb
+++ b/integer.rb
@@ -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)'