Reviewers: Yang,
Message:
LGTM. Landing.
Description:
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
Please review this at https://chromiumcodereview.appspot.com/10108022/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/assembler.cc
Index: src/assembler.cc
diff --git a/src/assembler.cc b/src/assembler.cc
index
40765b31d7dde62c4b731dd304f5dd6e1fc739f2..1f65a41c0449576d1a1e0e368ee664b9534aecf6
100644
--- a/src/assembler.cc
+++ b/src/assembler.cc
@@ -1153,6 +1153,20 @@ double power_double_int(double x, int y) {
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