Index: src/builtins/builtins-math.cc |
diff --git a/src/builtins/builtins-math.cc b/src/builtins/builtins-math.cc |
index 6058f12265a36fd3380f02ebf3e07865c0a905e6..29c87b4be2ab225849a046902e44e1f4ce8c9b20 100644 |
--- a/src/builtins/builtins-math.cc |
+++ b/src/builtins/builtins-math.cc |
@@ -452,6 +452,46 @@ void Builtins::Generate_MathPow(CodeStubAssembler* assembler) { |
assembler->Return(result); |
} |
+// ES6 section 20.2.2.27 Math.random ( ) |
+void Builtins::Generate_MathRandom(CodeStubAssembler* assembler) { |
+ using compiler::Node; |
+ |
+ Node* context = assembler->Parameter(3); |
+ Node* native_context = assembler->LoadNativeContext(context); |
+ |
+ // Load cache index. |
+ CodeStubAssembler::Variable smi_index(assembler, |
+ MachineRepresentation::kTagged); |
+ smi_index.Bind(assembler->LoadContextElement( |
+ native_context, Context::MATH_RANDOM_INDEX_INDEX)); |
+ |
+ // Cached random numbers are exhausted if index is 0. Go to slow path. |
+ CodeStubAssembler::Label if_cached(assembler); |
+ assembler->GotoIf(assembler->SmiAbove(smi_index.value(), |
+ assembler->SmiConstant(Smi::kZero)), |
+ &if_cached); |
+ |
+ // Cache exhausted, populate the cache. Return value is the new index. |
+ smi_index.Bind( |
+ assembler->CallRuntime(Runtime::kGenerateRandomNumbers, context)); |
+ assembler->Goto(&if_cached); |
+ |
+ // Compute next index by decrement. |
+ assembler->Bind(&if_cached); |
+ Node* new_smi_index = assembler->SmiSub( |
+ smi_index.value(), assembler->SmiConstant(Smi::FromInt(1))); |
+ assembler->StoreContextElement( |
+ native_context, Context::MATH_RANDOM_INDEX_INDEX, new_smi_index); |
+ |
+ // Load and return next cached random number. |
+ Node* array = assembler->LoadContextElement(native_context, |
+ Context::MATH_RANDOM_CACHE_INDEX); |
+ Node* random = assembler->LoadFixedDoubleArrayElement( |
+ array, new_smi_index, MachineType::Float64(), 0, |
+ CodeStubAssembler::SMI_PARAMETERS); |
+ assembler->Return(assembler->ChangeFloat64ToTagged(random)); |
+} |
+ |
// ES6 section 20.2.2.28 Math.round ( x ) |
void Builtins::Generate_MathRound(CodeStubAssembler* assembler) { |
Generate_MathRoundingOperation(assembler, &CodeStubAssembler::Float64Round); |