Index: src/mips/full-codegen-mips.cc |
diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc |
index 486eb9db2db7a9da86f06f3521a4bf692881a553..6ef871fe669bf66e9d14234c1f72645fb9ca8d7f 100644 |
--- a/src/mips/full-codegen-mips.cc |
+++ b/src/mips/full-codegen-mips.cc |
@@ -3378,6 +3378,48 @@ void FullCodeGenerator::EmitLog(CallRuntime* expr) { |
} |
+void FullCodeGenerator::EmitRandomHeapNumber(CallRuntime* expr) { |
+ ASSERT(expr->arguments()->length() == 0); |
+ Label slow_allocate_heapnumber; |
+ Label heapnumber_allocated; |
+ |
+ // Save the new heap number in callee-saved register s0, since |
+ // we call out to external C code below. |
+ __ LoadRoot(t6, Heap::kHeapNumberMapRootIndex); |
+ __ AllocateHeapNumber(s0, a1, a2, t6, &slow_allocate_heapnumber); |
+ __ jmp(&heapnumber_allocated); |
+ |
+ __ bind(&slow_allocate_heapnumber); |
+ |
+ // Allocate a heap number. |
+ __ CallRuntime(Runtime::kNumberAlloc, 0); |
+ __ mov(s0, v0); // Save result in s0, so it is saved thru CFunc call. |
+ |
+ __ bind(&heapnumber_allocated); |
+ |
+ // Convert 32 random bits in v0 to 0.(32 random bits) in a double |
+ // by computing: |
+ // ( 1.(20 0s)(32 random bits) x 2^20 ) - (1.0 x 2^20)). |
+ __ PrepareCallCFunction(1, a0); |
+ __ lw(a0, ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX)); |
+ __ lw(a0, FieldMemOperand(a0, GlobalObject::kNativeContextOffset)); |
+ __ CallCFunction(ExternalReference::random_uint32_function(isolate()), 1); |
+ |
+ // 0x41300000 is the top half of 1.0 x 2^20 as a double. |
+ __ li(a1, Operand(0x41300000)); |
+ // Move 0x41300000xxxxxxxx (x = random bits in v0) to FPU. |
+ __ Move(f12, v0, a1); |
+ // Move 0x4130000000000000 to FPU. |
+ __ Move(f14, zero_reg, a1); |
+ // Subtract and store the result in the heap number. |
+ __ sub_d(f0, f12, f14); |
+ __ sdc1(f0, FieldMemOperand(s0, HeapNumber::kValueOffset)); |
+ __ mov(v0, s0); |
+ |
+ context()->Plug(v0); |
+} |
+ |
+ |
void FullCodeGenerator::EmitSubString(CallRuntime* expr) { |
// Load the arguments on the stack and call the stub. |
SubStringStub stub; |