| 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;
|
|
|