1 /* Copyright (C) 1995, 1996, 2001 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, write to the Free 17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18 02111-1307 USA. */ 19 20 #include <errno.h> 21 #include <stdlib.h> 22 #include <limits.h> 23 #include <stdint.h> 24 #include <sys/types.h> 25 26 /* Global state for non-reentrant functions. */ 27 struct drand48_data __libc_drand48_data; 28 29 30 int 31 __drand48_iterate (xsubi, buffer) 32 unsigned short int xsubi[3]; 33 struct drand48_data *buffer; 34 { 35 uint64_t X; 36 uint64_t result; 37 38 /* Initialize buffer, if not yet done. */ 39 if (__builtin_expect (!buffer->__init, 0)) 40 { 41 buffer->__a = 0x5deece66dull; 42 buffer->__c = 0xb; 43 buffer->__init = 1; 44 } 45 46 /* Do the real work. We choose a data type which contains at least 47 48 bits. Because we compute the modulus it does not care how 48 many bits really are computed. */ 49 50 X = (uint64_t) xsubi[2] << 32 | (uint32_t) xsubi[1] << 16 | xsubi[0]; 51 52 result = X * buffer->__a + buffer->__c; 53 54 xsubi[0] = result & 0xffff; 55 xsubi[1] = (result >> 16) & 0xffff; 56 xsubi[2] = (result >> 32) & 0xffff; 57 58 return 0; 59 } 60