X87: implement MathPow stub for X87.
authorchunyang.dai <chunyang.dai@intel.com>
Mon, 27 Jul 2015 10:05:27 +0000 (03:05 -0700)
committerCommit bot <commit-bot@chromium.org>
Mon, 27 Jul 2015 10:05:43 +0000 (10:05 +0000)
  In CL 0fe2fbd173c5e547e021476428001cac6fcdf7a9 the implementation of
  MathPow for all ports are unified and MathPow stub code is invoked.
  So we move the direct runtime function call from full-codegen to MathPow
  stub for X87 platform.

BUG=

Review URL: https://codereview.chromium.org/1258873002

Cr-Commit-Position: refs/heads/master@{#29865}

src/x87/code-stubs-x87.cc

index c3903f9..0fe2cd9 100644 (file)
@@ -325,8 +325,28 @@ void FloatingPointHelper::CheckFloatOperands(MacroAssembler* masm,
 
 
 void MathPowStub::Generate(MacroAssembler* masm) {
-  // No SSE2 support
-  UNREACHABLE();
+  const Register base = edx;
+  const Register scratch = ecx;
+  Counters* counters = isolate()->counters();
+  Label call_runtime;
+
+  // We will call runtime helper function directly.
+  if (exponent_type() == ON_STACK) {
+    // The arguments are still on the stack.
+    __ bind(&call_runtime);
+    __ TailCallRuntime(Runtime::kMathPowRT, 2, 1);
+
+    // The stub is called from non-optimized code, which expects the result
+    // as heap number in exponent.
+    __ AllocateHeapNumber(eax, scratch, base, &call_runtime);
+    __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset));
+    __ IncrementCounter(counters->math_pow(), 1);
+    __ ret(2 * kPointerSize);
+  } else {
+    // Currently it's only called from full-compiler and exponent type is
+    // ON_STACK.
+    UNIMPLEMENTED();
+  }
 }