aboutsummaryrefslogtreecommitdiffstats
path: root/random.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-02-24 12:30:20 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-02-24 12:30:20 +0000
commitbf3022464835f7d5965ef1d59ad0951f6ac77a17 (patch)
treecba90f2077974df62598d1e5b31cd38412063c66 /random.c
parent271f6d68d64588b15f5c056736509595d5b15d6b (diff)
downloadruby-bf3022464835f7d5965ef1d59ad0951f6ac77a17.tar.gz
* random.c (limited_rand): Add a specialized path for the limit fits in 32 bit.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53914 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'random.c')
-rw-r--r--random.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/random.c b/random.c
index 936121f49e..7796d3456a 100644
--- a/random.c
+++ b/random.c
@@ -826,21 +826,31 @@ static unsigned long
limited_rand(struct MT *mt, unsigned long limit)
{
/* mt must be initialized */
- int i;
unsigned long val, mask;
if (!limit) return 0;
mask = make_mask(limit);
- retry:
- val = 0;
- for (i = SIZEOF_LONG/SIZEOF_INT32-1; 0 <= i; i--) {
- if ((mask >> (i * 32)) & 0xffffffff) {
- val |= (unsigned long)genrand_int32(mt) << (i * 32);
- val &= mask;
- if (limit < val)
- goto retry;
+
+#if 4 < SIZEOF_LONG
+ if (0xffffffff < limit) {
+ int i;
+ retry:
+ val = 0;
+ for (i = SIZEOF_LONG/SIZEOF_INT32-1; 0 <= i; i--) {
+ if ((mask >> (i * 32)) & 0xffffffff) {
+ val |= (unsigned long)genrand_int32(mt) << (i * 32);
+ val &= mask;
+ if (limit < val)
+ goto retry;
+ }
}
+ return val;
}
+#endif
+
+ do {
+ val = genrand_int32(mt) & mask;
+ } while (limit < val);
return val;
}