From 169b867fbf039ccb7f990449b898b2f9870a5269 Mon Sep 17 00:00:00 2001 From: akr Date: Wed, 24 Feb 2016 12:30:20 +0000 Subject: * 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 --- random.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'random.c') 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; } -- cgit v1.2.3