27
27
#include "phpmath.h"
28
28
#include "php_rand.h"
29
29
30
+ #include "basic_functions.h"
31
+
30
32
/*
31
33
This is the ``Mersenne Twister'' random number generator MT19937, which
32
34
generates pseudorandom integers uniformly distributed in 0..(2^32 - 1)
77
79
uint32 must be an unsigned integer type capable of holding at least 32
78
80
bits; exactly 32 should be fastest, but 64 is better on an Alpha with
79
81
GCC at -O3 optimization so try your options and see what's best for you
80
-
82
+
81
83
Melo: we should put some ifdefs here to catch those alphas...
82
84
*/
83
85
84
- typedef unsigned int uint32 ;
85
86
86
- #define N (624) /* length of state vector */
87
+ #define N MT_N /* length of state vector */
87
88
#define M (397) /* a period parameter */
88
89
#define K (0x9908B0DFU) /* a magic constant */
89
90
#define hiBit (u ) ((u) & 0x80000000U) /* mask all but highest bit of u */
90
91
#define loBit (u ) ((u) & 0x00000001U) /* mask all but lowest bit of u */
91
92
#define loBits (u ) ((u) & 0x7FFFFFFFU) /* mask the highest bit of u */
92
93
#define mixBits (u , v ) (hiBit(u)|loBits(v)) /* move hi bit of u to hi bit of v */
93
94
94
- static uint32 state [N + 1 ]; /* state vector + 1 extra to not violate ANSI C */
95
- static uint32 * next ; /* next random value is computed from here */
96
- static int left = -1 ; /* can *next++ this many times before reloading */
97
-
98
-
99
- static void seedMT (uint32 seed )
95
+ static void seedMT (uint32 seed BLS_DC )
100
96
{
101
97
/*
102
98
We initialize state[0..(N-1)] via the generator
@@ -144,31 +140,31 @@ static void seedMT(uint32 seed)
144
140
so-- that's why the only change I made is to restrict to odd seeds.
145
141
*/
146
142
147
- register uint32 x = (seed | 1U ) & 0xFFFFFFFFU , * s = state ;
143
+ register uint32 x = (seed | 1U ) & 0xFFFFFFFFU , * s = BG ( state ) ;
148
144
register int j ;
149
145
150
- for (left = 0 , * s ++ = x , j = N ; -- j ;
146
+ for (BG ( left ) = 0 , * s ++ = x , j = N ; -- j ;
151
147
* s ++ = (x *=69069U ) & 0xFFFFFFFFU );
152
148
}
153
149
154
150
155
- static uint32 reloadMT (void )
151
+ static uint32 reloadMT (BLS_D )
156
152
{
157
- register uint32 * p0 = state , * p2 = state + 2 , * pM = state + M , s0 , s1 ;
153
+ register uint32 * p0 = BG ( state ) , * p2 = BG ( state ) + 2 , * pM = BG ( state ) + M , s0 , s1 ;
158
154
register int j ;
159
155
160
- if (left < -1 )
161
- seedMT (4357U );
156
+ if (BG ( left ) < -1 )
157
+ seedMT (4357U BLS_CC );
162
158
163
- left = N - 1 , next = state + 1 ;
159
+ BG ( left ) = N - 1 , BG ( next ) = BG ( state ) + 1 ;
164
160
165
- for (s0 = state [0 ], s1 = state [1 ], j = N - M + 1 ; -- j ; s0 = s1 , s1 = * p2 ++ )
161
+ for (s0 = BG ( state ) [0 ], s1 = BG ( state ) [1 ], j = N - M + 1 ; -- j ; s0 = s1 , s1 = * p2 ++ )
166
162
* p0 ++ = * pM ++ ^ (mixBits (s0 , s1 ) >> 1 ) ^ (loBit (s1 ) ? K : 0U );
167
163
168
- for (pM = state , j = M ; -- j ; s0 = s1 , s1 = * p2 ++ )
164
+ for (pM = BG ( state ) , j = M ; -- j ; s0 = s1 , s1 = * p2 ++ )
169
165
* p0 ++ = * pM ++ ^ (mixBits (s0 , s1 ) >> 1 ) ^ (loBit (s1 ) ? K : 0U );
170
166
171
- s1 = state [0 ], * p0 = * pM ^ (mixBits (s0 , s1 ) >> 1 ) ^ (loBit (s1 ) ? K : 0U );
167
+ s1 = BG ( state ) [0 ], * p0 = * pM ^ (mixBits (s0 , s1 ) >> 1 ) ^ (loBit (s1 ) ? K : 0U );
172
168
s1 ^= (s1 >> 11 );
173
169
s1 ^= (s1 << 7 ) & 0x9D2C5680U ;
174
170
s1 ^= (s1 << 15 ) & 0xEFC60000U ;
@@ -179,11 +175,12 @@ static uint32 reloadMT(void)
179
175
static inline uint32 randomMT (void )
180
176
{
181
177
uint32 y ;
178
+ BLS_FETCH ();
182
179
183
- if (-- left < 0 )
184
- return (reloadMT ());
180
+ if (-- BG ( left ) < 0 )
181
+ return (reloadMT (BLS_C ));
185
182
186
- y = * next ++ ;
183
+ y = * BG ( next ) ++ ;
187
184
y ^= (y >> 11 );
188
185
y ^= (y << 7 ) & 0x9D2C5680U ;
189
186
y ^= (y << 15 ) & 0xEFC60000U ;
@@ -217,12 +214,13 @@ PHP_FUNCTION(srand)
217
214
PHP_FUNCTION (mt_srand )
218
215
{
219
216
pval * * arg ;
217
+ BLS_FETCH ();
220
218
221
219
if (ARG_COUNT (ht ) != 1 || getParametersEx (1 , & arg ) == FAILURE ) {
222
220
WRONG_PARAM_COUNT ;
223
221
}
224
222
convert_to_long_ex (arg );
225
- seedMT ((* arg )-> value .lval );
223
+ seedMT ((* arg )-> value .lval BLS_CC );
226
224
}
227
225
/* }}} */
228
226
0 commit comments