diff options
author | Dam Sunwoo <dam.sunwoo@arm.com> | 2012-01-09 18:08:20 -0600 |
---|---|---|
committer | Dam Sunwoo <dam.sunwoo@arm.com> | 2012-01-09 18:08:20 -0600 |
commit | 3f9e352de4e1ac34e1f0b83c3f66af2175b524f4 (patch) | |
tree | 38397e9b46754ce2211a689639484883ba2ea5be | |
parent | 6a6d888ab486546c0b2e3facb9d1ce3ee417e9ae (diff) | |
download | gem5-3f9e352de4e1ac34e1f0b83c3f66af2175b524f4.tar.xz |
Base: Fixed shift amount in genrand() to work with large numbers
The previous version didn't work correctly with max integer values (2^31-1 for
32-bit, 2^63-1 for 64bit version), causing "shift" to become -1. For smaller
numbers, it wouldn't have caused functional errors, but would have resulted in
more than necessary loops in the while loop. Special-cased cases when (max + 1
== 0) to prevent the ceilLog2 functions from failing.
-rw-r--r-- | src/base/random.cc | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/base/random.cc b/src/base/random.cc index 457b0c98b..cffeddec9 100644 --- a/src/base/random.cc +++ b/src/base/random.cc @@ -29,6 +29,7 @@ * Ali Saidi */ +#include <limits> #include "base/fenv.hh" #include "base/intmath.hh" #include "base/misc.hh" @@ -67,7 +68,10 @@ Random::genrand(uint32_t max) { if (max == 0) return 0; - int log = ceilLog2(max) + 1; + if (max == std::numeric_limits<uint32_t>::max()) + return genrand(); + + int log = ceilLog2(max + 1); int shift = (sizeof(uint32_t) * 8 - log); uint32_t random; @@ -83,7 +87,10 @@ Random::genrand(uint64_t max) { if (max == 0) return 0; - int log = ceilLog2(max) + 1; + if (max == std::numeric_limits<uint64_t>::max()) + return genrand(); + + int log = ceilLog2(max + 1); int shift = (sizeof(uint64_t) * 8 - log); uint64_t random; |