1 /*
2  * -- High Performance Computing Linpack Benchmark (HPL)
3  *    HPL - 2.3 - December 2, 2018
4  *    Antoine P. Petitet
5  *    University of Tennessee, Knoxville
6  *    Innovative Computing Laboratory
7  *    (C) Copyright 2000-2008 All Rights Reserved
8  *
9  * -- Copyright notice and Licensing terms:
10  *
11  * Redistribution  and  use in  source and binary forms, with or without
12  * modification, are  permitted provided  that the following  conditions
13  * are met:
14  *
15  * 1. Redistributions  of  source  code  must retain the above copyright
16  * notice, this list of conditions and the following disclaimer.
17  *
18  * 2. Redistributions in binary form must reproduce  the above copyright
19  * notice, this list of conditions,  and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution.
21  *
22  * 3. All  advertising  materials  mentioning  features  or  use of this
23  * software must display the following acknowledgement:
24  * This  product  includes  software  developed  at  the  University  of
25  * Tennessee, Knoxville, Innovative Computing Laboratory.
26  *
27  * 4. The name of the  University,  the name of the  Laboratory,  or the
28  * names  of  its  contributors  may  not  be used to endorse or promote
29  * products  derived   from   this  software  without  specific  written
30  * permission.
31  *
32  * -- Disclaimer:
33  *
34  * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
36  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
37  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
38  * OR  CONTRIBUTORS  BE  LIABLE FOR ANY  DIRECT,  INDIRECT,  INCIDENTAL,
39  * SPECIAL,  EXEMPLARY,  OR  CONSEQUENTIAL DAMAGES  (INCLUDING,  BUT NOT
40  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
41  * DATA OR PROFITS; OR BUSINESS INTERRUPTION)  HOWEVER CAUSED AND ON ANY
42  * THEORY OF LIABILITY, WHETHER IN CONTRACT,  STRICT LIABILITY,  OR TORT
43  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
44  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45  * ---------------------------------------------------------------------
46  */
47 /*
48  * Include files
49  */
50 #include "hpl.h"
51 /*
52  * ---------------------------------------------------------------------
53  * Static variables
54  * ---------------------------------------------------------------------
55  */
56 static int       ias[2], ics[2], irand[2];
57 
58 #ifdef STDC_HEADERS
HPL_setran(const int OPTION,int * IRAN)59 void HPL_setran
60 (
61    const int                        OPTION,
62    int *                            IRAN
63 )
64 #else
65 void HPL_setran
66 ( OPTION, IRAN )
67    const int                        OPTION;
68    int *                            IRAN;
69 #endif
70 {
71 /*
72  * Purpose
73  * =======
74  *
75  * HPL_setran initializes  the random generator with the encoding of the
76  * first number X(0) in the sequence,  and the constants a and c used to
77  * compute the next element in the sequence: X(n+1) = a*X(n) + c.  X(0),
78  * a and c are stored in the static variables  irand, ias and ics.  When
79  * OPTION is 0 (resp. 1 and 2),  irand  (resp. ia and ic)  is set to the
80  * values of the input array IRAN.  When OPTION is 3, IRAN is set to the
81  * current value of irand, and irand is then incremented.
82  *
83  * Arguments
84  * =========
85  *
86  * OPTION  (local input)                 const int
87  *         On entry, OPTION  is an integer that specifies the operations
88  *         to be performed on the random generator as specified above.
89  *
90  * IRAN    (local input/output)          int *
91  *         On entry,  IRAN is an array of dimension 2, that contains the
92  *         16-lower and 15-higher bits of a random number.
93  *
94  * ---------------------------------------------------------------------
95  */
96 /*
97  * .. Local Variables ..
98  */
99    int                        j[2];
100 /* ..
101  * .. Executable Statements ..
102  */
103    if(      OPTION == 3 )
104    {                                       /* return current value */
105       IRAN[0] = irand[0]; IRAN[1] = irand[1];
106       HPL_lmul( irand, ias, j );         /* j     = irand * ias;   */
107       HPL_ladd( j, ics, irand );         /* irand = j     + ics;   */
108    }
109    else if( OPTION == 0 ) { irand[0] = IRAN[0]; irand[1] = IRAN[1]; }
110    else if( OPTION == 1 ) { ias  [0] = IRAN[0]; ias  [1] = IRAN[1]; }
111    else if( OPTION == 2 ) { ics  [0] = IRAN[0]; ics  [1] = IRAN[1]; }
112 /*
113  * End of HPL_setran
114  */
115 }
116