aboutsummaryrefslogtreecommitdiffstats
path: root/insns.def
diff options
context:
space:
mode:
authorcharliesome <charliesome@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-22 13:57:21 +0000
committercharliesome <charliesome@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-22 13:57:21 +0000
commit4f683e16781ea6c856a02bc42b1b57f66a0019fb (patch)
treeec4bdc106fc3cbbef589bfd763b53b625847f73a /insns.def
parente9b63c1a225f039b90faf16c5969c658d925dd37 (diff)
downloadruby-4f683e16781ea6c856a02bc42b1b57f66a0019fb.tar.gz
* insns.def (opt_mod): Use % operator if both operands are positive for
a significant performance improvement. Thanks to @samsaffron. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40410 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'insns.def')
-rw-r--r--insns.def10
1 files changed, 6 insertions, 4 deletions
diff --git a/insns.def b/insns.def
index fc4db92d4f..b51e60018c 100644
--- a/insns.def
+++ b/insns.def
@@ -1524,13 +1524,15 @@ opt_mod
{
if (FIXNUM_2_P(recv, obj) &&
BASIC_OP_UNREDEFINED_P(BOP_MOD, FIXNUM_REDEFINED_OP_FLAG )) {
- long x, y, mod;
+ long x, y;
x = FIX2LONG(recv);
y = FIX2LONG(obj);
- {
+ if (x > 0 && y > 0) {
+ val = LONG2FIX(x % y);
+ } else {
/* copied from numeric.c#fixdivmod */
- long div;
+ long div, mod;
if (y == 0)
rb_num_zerodiv();
@@ -1551,8 +1553,8 @@ opt_mod
mod += y;
div -= 1;
}
+ val = LONG2FIX(mod);
}
- val = LONG2FIX(mod);
}
else if (FLONUM_2_P(recv, obj) &&
BASIC_OP_UNREDEFINED_P(BOP_MOD, FLOAT_REDEFINED_OP_FLAG)) {