From d17c01f9fe958d9d78739d3bf7111f2c01690d0d Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 21 Jan 2001 16:54:08 +0000 Subject: Update. * stdlib/stdlib.h (drand48_data): Make available only for __USE_MISC. Rename elements to protect namespace. Change type and position of a and init element. * stdlib/drand48-iter.c: Don't handle unsigned short > 16 bit differently. Adjust for drand48_data change. Don't compute a here, it comes from drand48_data. * stdlib/lcong48_r.c: Don't handle unsigned short > 16 bit differently. Adjust for drand48_data change. Compute a here. * stdlib/srand48_r.c: Likewise. * stdlib/drand48.c: Adjust for drand48_data change. * stdlib/lrand48.c: Likewise. * stdlib/mrand48.c: Likewise. * stdlib/seek48.c: Likewise. * stdlib/drand48_r.c: Likewise. * stdlib/lrand48_r.c: Likewise. * stdlib/mrand48_r.c: Likewise. * stdlib/seed48_r.c: Likewise. Don't handle unsigned short > 16 bit differently. * stdlib/erand48_r.c: Don't handle unsigned short > 16 bit differently. * stdlib/jrand48_r.c: Likewise. --- stdlib/drand48-iter.c | 47 +++++++++++++---------------------------------- 1 file changed, 13 insertions(+), 34 deletions(-) (limited to 'stdlib/drand48-iter.c') 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 , August 1995. @@ -20,6 +20,7 @@ #include #include #include +#include #include /* 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; } -- cgit v1.2.1