Index: src/mips/lithium-codegen-mips.cc |
diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc |
index 06e886c6bb1c9db5aca15deb9a53d43daee24941..7c94730f129a50bc863f27bf129e92f877d11762 100644 |
--- a/src/mips/lithium-codegen-mips.cc |
+++ b/src/mips/lithium-codegen-mips.cc |
@@ -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: |
@@ -3095,6 +3095,27 @@ void LCodeGen::DoPower(LPower* instr) { |
} |
+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, |