Index: src/js/math.js |
diff --git a/src/js/math.js b/src/js/math.js |
index 18ea596408c6dc63754097a34008f52cdcf20b84..38d4334d9ec95489c586dab64ac46e3a874e7c85 100644 |
--- a/src/js/math.js |
+++ b/src/js/math.js |
@@ -10,18 +10,18 @@ |
// ------------------------------------------------------------------- |
// Imports |
+define kRandomBatchSize = 64; |
+define kRandomNumberStart = 2; |
Jakob Kummerow
2015/11/23 14:34:08
nit: maybe add a comment here that indices 0 and 1
|
+ |
+var GlobalFloat64Array = global.Float64Array; |
var GlobalMath = global.Math; |
var GlobalObject = global.Object; |
var InternalArray = utils.InternalArray; |
var NaN = %GetRootNaN(); |
-var rngstate = { a: 1, b: 2, c: 3, d: 4 }; |
+var nextRandomIndex = kRandomBatchSize; |
+var randomNumbers = UNDEFINED; |
var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); |
-utils.InitializeRNG = function() { |
- var state = %InitializeRNG(); |
- rngstate = { a: state[0], b: state[1], c: state[2], d: state[3] }; |
-}; |
- |
//------------------------------------------------------------------- |
// ECMA 262 - 15.8.2.1 |
@@ -135,26 +135,19 @@ function MathPowJS(x, y) { |
// ECMA 262 - 15.8.2.14 |
function MathRandom() { |
- var r0 = (MathImul(18030, rngstate.a) + rngstate.b) | 0; |
- var r1 = (MathImul(36969, rngstate.c) + rngstate.d) | 0; |
- rngstate.a = r0 & 0xFFFF; |
- rngstate.b = r0 >>> 16; |
- rngstate.c = r1 & 0xFFFF; |
- rngstate.d = r1 >>> 16; |
- var r = r0 ^ r1; |
- // Construct a double number 1.<32-bits of randomness> and subtract 1. |
- return %_ConstructDouble(0x3FF00000 | (r & 0x000FFFFF), r & 0xFFF00000) - 1; |
+ if (nextRandomIndex >= kRandomBatchSize) { |
+ randomNumbers = %GenerateRandomNumbers(randomNumbers); |
+ nextRandomIndex = kRandomNumberStart; |
+ } |
+ return randomNumbers[nextRandomIndex++]; |
} |
function MathRandomRaw() { |
- var r0 = (MathImul(18030, rngstate.a) + rngstate.b) | 0; |
- var r1 = (MathImul(36969, rngstate.c) + rngstate.d) | 0; |
- rngstate.a = r0 & 0xFFFF; |
- rngstate.b = r0 >>> 16; |
- rngstate.c = r1 & 0xFFFF; |
- rngstate.d = r1 >>> 16; |
- var r = r0 ^ r1; |
- return r & 0x3FFFFFFF; |
+ if (nextRandomIndex >= kRandomBatchSize) { |
+ randomNumbers = %GenerateRandomNumbers(randomNumbers); |
+ nextRandomIndex = kRandomNumberStart; |
+ } |
+ return %_DoubleLo(randomNumbers[nextRandomIndex++]) & 0x3FFFFFFF; |
} |
// ECMA 262 - 15.8.2.15 |
@@ -354,7 +347,7 @@ utils.Export(function(to) { |
to.MathAbs = MathAbs; |
to.MathExp = MathExp; |
to.MathFloor = MathFloorJS; |
- to.IntRandom = MathRandomRaw; |
+ to.MathRandomRaw = MathRandomRaw; |
to.MathMax = MathMax; |
to.MathMin = MathMin; |
}); |