Index: src/mips/lithium-codegen-mips.cc |
=================================================================== |
--- src/mips/lithium-codegen-mips.cc (revision 10404) |
+++ src/mips/lithium-codegen-mips.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright 2011 the V8 project authors. All rights reserved. |
+// Copyright 2012 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -2794,7 +2794,7 @@ |
__ lw(at, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); |
__ Call(at); |
- // Setup deoptimization. |
+ // Set up deoptimization. |
RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); |
// Restore context. |
@@ -3095,6 +3095,27 @@ |
} |
+void LCodeGen::DoRandom(LRandom* instr) { |
+ // Having marked this instruction as a call we can use any |
+ // registers. |
+ ASSERT(ToDoubleRegister(instr->result()).is(f0)); |
+ ASSERT(ToRegister(instr->InputAt(0)).is(a0)); |
+ |
+ __ PrepareCallCFunction(1, a1); |
+ __ lw(a0, FieldMemOperand(a0, GlobalObject::kGlobalContextOffset)); |
+ __ CallCFunction(ExternalReference::random_uint32_function(isolate()), 1); |
+ |
+ // 0x41300000 is the top half of 1.0 x 2^20 as a double. |
+ __ li(a2, Operand(0x41300000)); |
+ // Move 0x41300000xxxxxxxx (x = random bits in v0) to FPU. |
+ __ Move(f12, v0, a2); |
+ // Move 0x4130000000000000 to FPU. |
+ __ Move(f14, zero_reg, a2); |
+ // Subtract to get the result. |
+ __ sub_d(f0, f12, f14); |
+} |
+ |
+ |
void LCodeGen::DoMathLog(LUnaryMathOperation* instr) { |
ASSERT(ToDoubleRegister(instr->result()).is(f4)); |
TranscendentalCacheStub stub(TranscendentalCache::LOG, |