Revision: 11362
Author:   [email protected]
Date:     Tue Apr 17 09:15:20 2012
Log:      Fix incorrect Math.pow() calculations on MinGW-w64.

Original patch by Jonathan Liu <[email protected]> https://chromiumcodereview.appspot.com/10026017/

BUG=
TEST=mjsunit/math-pow,mjsunit/math-sqrt

Review URL: https://chromiumcodereview.appspot.com/10108022
http://code.google.com/p/v8/source/detail?r=11362

Modified:
 /branches/bleeding_edge/src/assembler.cc

=======================================
--- /branches/bleeding_edge/src/assembler.cc    Thu Apr  5 07:10:39 2012
+++ /branches/bleeding_edge/src/assembler.cc    Tue Apr 17 09:15:20 2012
@@ -1153,6 +1153,20 @@


 double power_double_double(double x, double y) {
+#ifdef __MINGW64_VERSION_MAJOR
+  // MinGW64 has a custom implementation for pow.  This handles certain
+  // special cases that are different.
+  if ((x == 0.0 || isinf(x)) && isfinite(y)) {
+    double f;
+ if (modf(y, &f) != 0.0) return ((x == 0.0) ^ (y > 0)) ? V8_INFINITY : 0;
+  }
+
+  if (x == 2.0) {
+    int y_int = static_cast<int>(y);
+    if (y == y_int) return ldexp(1.0, y);
+  }
+#endif
+
// The checks for special cases can be dropped in ia32 because it has already
   // been done in generated code before bailing out here.
if (isnan(y) || ((x == 1 || x == -1) && isinf(y))) return OS::nan_value();

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to