diff options
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/drand48-iter.c | 47 | ||||
-rw-r--r-- | stdlib/drand48.c | 4 | ||||
-rw-r--r-- | stdlib/drand48_r.c | 4 | ||||
-rw-r--r-- | stdlib/erand48_r.c | 11 | ||||
-rw-r--r-- | stdlib/jrand48_r.c | 5 | ||||
-rw-r--r-- | stdlib/lcong48_r.c | 22 | ||||
-rw-r--r-- | stdlib/lrand48.c | 4 | ||||
-rw-r--r-- | stdlib/lrand48_r.c | 4 | ||||
-rw-r--r-- | stdlib/mrand48.c | 4 | ||||
-rw-r--r-- | stdlib/mrand48_r.c | 4 | ||||
-rw-r--r-- | stdlib/seed48.c | 4 | ||||
-rw-r--r-- | stdlib/seed48_r.c | 29 | ||||
-rw-r--r-- | stdlib/srand48_r.c | 28 | ||||
-rw-r--r-- | stdlib/stdlib.h | 16 |
14 files changed, 61 insertions, 125 deletions
diff --git a/stdlib/drand48-iter.c b/stdlib/drand48-iter.c index 707be8e566..3e8ea0e9c6 100644 --- a/stdlib/drand48-iter.c +++ b/stdlib/drand48-iter.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -20,6 +20,7 @@ #include <errno.h> #include <stdlib.h> #include <limits.h> +#include <stdint.h> #include <sys/types.h> /* Global state for non-reentrant functions. */ @@ -31,50 +32,28 @@ __drand48_iterate (xsubi, buffer) unsigned short int xsubi[3]; struct drand48_data *buffer; { - u_int64_t X, a, result; + uint64_t X; + uint64_t result; /* Initialize buffer, if not yet done. */ - if (!buffer->init) + if (__builtin_expect (!buffer->__init, 0)) { -#if (USHRT_MAX == 0xffffU) - buffer->a[2] = 0x5; - buffer->a[1] = 0xdeec; - buffer->a[0] = 0xe66d; -#else - buffer->a[2] = 0x5deecUL; - buffer->a[1] = 0xe66d0000UL; - buffer->a[0] = 0; -#endif - buffer->c = 0xb; - buffer->init = 1; + buffer->__a = 0x5deece66dull; + buffer->__c = 0xb; + buffer->__init = 1; } /* Do the real work. We choose a data type which contains at least 48 bits. Because we compute the modulus it does not care how many bits really are computed. */ - if (sizeof (unsigned short int) == 2) - { - X = (u_int64_t)xsubi[2] << 32 | (u_int64_t)xsubi[1] << 16 | xsubi[0]; - a = ((u_int64_t)buffer->a[2] << 32 | (u_int64_t)buffer->a[1] << 16 - | buffer->a[0]); - - result = X * a + buffer->c; - - xsubi[0] = result & 0xffff; - xsubi[1] = (result >> 16) & 0xffff; - xsubi[2] = (result >> 32) & 0xffff; - } - else - { - X = (u_int64_t)xsubi[2] << 16 | xsubi[1] >> 16; - a = (u_int64_t)buffer->a[2] << 16 | buffer->a[1] >> 16; + X = (uint64_t) xsubi[2] << 32 | (uint32_t) xsubi[1] << 16 | xsubi[0]; - result = X * a + buffer->c; + result = X * buffer->__a + buffer->__c; - xsubi[0] = result >> 16 & 0xffffffffl; - xsubi[1] = result << 16 & 0xffff0000l; - } + xsubi[0] = result & 0xffff; + xsubi[1] = (result >> 16) & 0xffff; + xsubi[2] = (result >> 32) & 0xffff; return 0; } diff --git a/stdlib/drand48.c b/stdlib/drand48.c index 4668ead152..fe08a08696 100644 --- a/stdlib/drand48.c +++ b/stdlib/drand48.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -27,7 +27,7 @@ drand48 () { double result; - (void) __erand48_r (__libc_drand48_data.x, &__libc_drand48_data, &result); + (void) __erand48_r (__libc_drand48_data.__x, &__libc_drand48_data, &result); return result; } diff --git a/stdlib/drand48_r.c b/stdlib/drand48_r.c index 066c400f9c..af52924b98 100644 --- a/stdlib/drand48_r.c +++ b/stdlib/drand48_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -26,5 +26,5 @@ drand48_r (buffer, result) struct drand48_data *buffer; double *result; { - return __erand48_r (buffer->x, buffer, result); + return __erand48_r (buffer->__x, buffer, result); } diff --git a/stdlib/erand48_r.c b/stdlib/erand48_r.c index 85393b79f6..3ce78e306e 100644 --- a/stdlib/erand48_r.c +++ b/stdlib/erand48_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1997, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -37,19 +37,10 @@ __erand48_r (xsubi, buffer, result) /* Construct a positive double with the 48 random bits distributed over its fractional part so the resulting FP number is [0.0,1.0). */ -#if USHRT_MAX == 65535 temp.ieee.negative = 0; temp.ieee.exponent = IEEE754_DOUBLE_BIAS; temp.ieee.mantissa0 = (xsubi[2] << 4) | (xsubi[1] >> 12); temp.ieee.mantissa1 = ((xsubi[1] & 0xfff) << 20) | (xsubi[0] << 4); -#elif USHRT_MAX == 2147483647 - temp.ieee.negative = 0; - temp.ieee.exponent = IEEE754_DOUBLE_BIAS; - temp.ieee.mantissa0 = (xsubi[1] << 4) | (xsubi[0] >> 28); - temp.ieee.mantissa1 = ((xsubi[0] & 0xfffffff) << 4); -#else -# error Unsupported size of short int -#endif /* Please note the lower 4 bits of mantissa1 are always 0. */ *result = temp.d - 1.0; diff --git a/stdlib/jrand48_r.c b/stdlib/jrand48_r.c index 9df36942f6..dae1606e95 100644 --- a/stdlib/jrand48_r.c +++ b/stdlib/jrand48_r.c @@ -30,10 +30,7 @@ __jrand48_r (xsubi, buffer, result) return -1; /* Store the result. */ - if (sizeof (unsigned short int) == 2) - *result = ((xsubi[2] << 16) | xsubi[1]) & 0xffffffffl; - else - *result = xsubi[2] & 0xffffffffl; + *result = ((xsubi[2] << 16) | xsubi[1]) & 0xffffffffl; return 0; } diff --git a/stdlib/lcong48_r.c b/stdlib/lcong48_r.c index 32b948c946..27cab449a5 100644 --- a/stdlib/lcong48_r.c +++ b/stdlib/lcong48_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -17,6 +17,7 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <stdint.h> #include <stdlib.h> #include <string.h> #include <limits.h> @@ -27,20 +28,11 @@ __lcong48_r (param, buffer) struct drand48_data *buffer; { /* Store the given values. */ -#if USHRT_MAX == 0xffffU - memcpy (buffer->x, ¶m[0], sizeof (buffer->x)); - memcpy (buffer->a, ¶m[3], sizeof (buffer->a)); -#else - buffer->x[2] = (param[2] << 16) | param[1]; - buffer->x[1] = param[0] << 16; - buffer->x[0] = 0; - - buffer->a[2] = (param[5] << 16) | param[4]; - buffer->a[1] = param[3] << 16; - buffer->a[0] = 0; -#endif - buffer->c = param[6]; - buffer->init = 1; + memcpy (buffer->__x, ¶m[0], sizeof (buffer->__x)); + buffer->__a = ((uint64_t) param[5] << 32 | (uint32_t) param[4] << 16 + | param[3]); + buffer->__c = param[6]; + buffer->__init = 1; return 0; } diff --git a/stdlib/lrand48.c b/stdlib/lrand48.c index 1857ed4291..3442549274 100644 --- a/stdlib/lrand48.c +++ b/stdlib/lrand48.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -27,7 +27,7 @@ lrand48 () { long int result; - (void) __nrand48_r (__libc_drand48_data.x, &__libc_drand48_data, &result); + (void) __nrand48_r (__libc_drand48_data.__x, &__libc_drand48_data, &result); return result; } diff --git a/stdlib/lrand48_r.c b/stdlib/lrand48_r.c index 4890923a74..e1fe56cf80 100644 --- a/stdlib/lrand48_r.c +++ b/stdlib/lrand48_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -28,5 +28,5 @@ lrand48_r (buffer, result) if (buffer == NULL) return -1; - return __nrand48_r (buffer->x, buffer, result); + return __nrand48_r (buffer->__x, buffer, result); } diff --git a/stdlib/mrand48.c b/stdlib/mrand48.c index aebb9b0117..fc62fdcf57 100644 --- a/stdlib/mrand48.c +++ b/stdlib/mrand48.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -27,7 +27,7 @@ mrand48 () { long int result; - (void) __jrand48_r (__libc_drand48_data.x, &__libc_drand48_data, &result); + (void) __jrand48_r (__libc_drand48_data.__x, &__libc_drand48_data, &result); return result; } diff --git a/stdlib/mrand48_r.c b/stdlib/mrand48_r.c index 3ed5643e00..32c199e324 100644 --- a/stdlib/mrand48_r.c +++ b/stdlib/mrand48_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -28,5 +28,5 @@ mrand48_r (buffer, result) if (buffer == NULL) return -1; - return __jrand48_r (buffer->x, buffer, result); + return __jrand48_r (buffer->__x, buffer, result); } diff --git a/stdlib/seed48.c b/stdlib/seed48.c index 19bb215529..b6f9a74105 100644 --- a/stdlib/seed48.c +++ b/stdlib/seed48.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -28,5 +28,5 @@ seed48 (seed16v) { (void) __seed48_r (seed16v, &__libc_drand48_data); - return __libc_drand48_data.old_x; + return __libc_drand48_data.__old_x; } diff --git a/stdlib/seed48_r.c b/stdlib/seed48_r.c index 910a2256c6..16706e9136 100644 --- a/stdlib/seed48_r.c +++ b/stdlib/seed48_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -27,28 +27,15 @@ __seed48_r (seed16v, buffer) struct drand48_data *buffer; { /* Save old value at a private place to be used as return value. */ - memcpy (buffer->old_x, buffer->x, sizeof (buffer->x)); + memcpy (buffer->__old_x, buffer->__x, sizeof (buffer->__x)); /* Install new state. */ -#if USHRT_MAX == 0xffffU - buffer->x[2] = seed16v[2]; - buffer->x[1] = seed16v[1]; - buffer->x[0] = seed16v[0]; - - buffer->a[2] = 0x5; - buffer->a[1] = 0xdeec; - buffer->a[0] = 0xe66d; -#else - buffer->x[2] = (seed16v[2] << 16) | seed16v[1]; - buffer->x[1] = seed16v[0] << 16; - buffer->x[0] = 0; - - buffer->a[2] = 0x5deecUL; - buffer->a[1] = 0xe66d0000UL; - buffer->a[0] = 0; -#endif - buffer->c = 0xb; - buffer->init = 1; + buffer->__x[2] = seed16v[2]; + buffer->__x[1] = seed16v[1]; + buffer->__x[0] = seed16v[0]; + buffer->__a = 0x5deece66dull; + buffer->__c = 0xb; + buffer->__init = 1; return 0; } diff --git a/stdlib/srand48_r.c b/stdlib/srand48_r.c index abaec32e5a..9d0ca76f7c 100644 --- a/stdlib/srand48_r.c +++ b/stdlib/srand48_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -29,25 +29,13 @@ __srand48_r (seedval, buffer) if (sizeof (long int) > 4) seedval &= 0xffffffffl; -#if USHRT_MAX == 0xffffU - buffer->x[2] = seedval >> 16; - buffer->x[1] = seedval & 0xffffl; - buffer->x[0] = 0x330e; - - buffer->a[2] = 0x5; - buffer->a[1] = 0xdeec; - buffer->a[0] = 0xe66d; -#else - buffer->x[2] = seedval; - buffer->x[1] = 0x330e0000UL; - buffer->x[0] = 0; - - buffer->a[2] = 0x5deecUL; - buffer->a[1] = 0xe66d0000UL; - buffer->a[0] = 0; -#endif - buffer->c = 0xb; - buffer->init = 1; + buffer->__x[2] = seedval >> 16; + buffer->__x[1] = seedval & 0xffffl; + buffer->__x[0] = 0x330e; + + buffer->__a = 0x5deece66dull; + buffer->__c = 0xb; + buffer->__init = 1; return 0; } diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h index de127348bc..17f19ac8d6 100644 --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h @@ -474,17 +474,19 @@ extern void srand48 (long int __seedval) __THROW; extern unsigned short int *seed48 (unsigned short int __seed16v[3]) __THROW; extern void lcong48 (unsigned short int __param[7]) __THROW; -/* Data structure for communication with thread safe versions. */ +# ifdef __USE_MISC +/* Data structure for communication with thread safe versions. This + type is to be regarded as opaque. It's only exported because users + have to allocate objects of this type. */ struct drand48_data { - unsigned short int x[3]; /* Current state. */ - unsigned short int a[3]; /* Factor in congruential formula. */ - unsigned short int c; /* Additive const. in congruential formula. */ - unsigned short int old_x[3]; /* Old state. */ - int init; /* Flag for initializing. */ + unsigned short int __x[3]; /* Current state. */ + unsigned short int __old_x[3]; /* Old state. */ + unsigned short int __c; /* Additive const. in congruential formula. */ + unsigned short int __init; /* Flag for initializing. */ + unsigned long long int __a; /* Factor in congruential formula. */ }; -# ifdef __USE_MISC /* Return non-negative, double-precision floating-point value in [0.0,1.0). */ extern int drand48_r (struct drand48_data *__restrict __buffer, double *__restrict __result) __THROW; |