Bug 717379, part 1 - Implement the new ES6 math functions. r=jorendorff.
authorDavid Caabeiro <david.caabeiro@gmail.com>
Mon, 15 Jul 2013 10:03:14 -0500
changeset 138565 348b2ba27515f7918f0602868b7e7fd4c7371d25
parent 138564 e4e605d990f465b0ebcf1993070e0f400346836a
child 138566 ffc604b7497490fee651d8a017a5b99c0cb08325
push idunknown
push userunknown
push dateunknown
reviewersjorendorff
bugs717379
milestone25.0a1
Bug 717379, part 1 - Implement the new ES6 math functions. r=jorendorff.
js/src/configure.in
js/src/jsmath.cpp
js/src/jsmath.h
js/src/tests/browser.js
js/src/tests/ecma_6/Math/acosh-approx.js
js/src/tests/ecma_6/Math/acosh-exact.js
js/src/tests/ecma_6/Math/asinh-approx.js
js/src/tests/ecma_6/Math/asinh-exact.js
js/src/tests/ecma_6/Math/atanh-approx.js
js/src/tests/ecma_6/Math/atanh-exact.js
js/src/tests/ecma_6/Math/browser.js
js/src/tests/ecma_6/Math/cbrt-approx.js
js/src/tests/ecma_6/Math/cbrt-exact.js
js/src/tests/ecma_6/Math/cosh-approx.js
js/src/tests/ecma_6/Math/cosh-exact.js
js/src/tests/ecma_6/Math/expm1-approx.js
js/src/tests/ecma_6/Math/expm1-exact.js
js/src/tests/ecma_6/Math/hypot-approx.js
js/src/tests/ecma_6/Math/hypot-exact.js
js/src/tests/ecma_6/Math/log10-approx.js
js/src/tests/ecma_6/Math/log10-exact.js
js/src/tests/ecma_6/Math/log1p-approx.js
js/src/tests/ecma_6/Math/log1p-exact.js
js/src/tests/ecma_6/Math/log2-approx.js
js/src/tests/ecma_6/Math/log2-exact.js
js/src/tests/ecma_6/Math/shell.js
js/src/tests/ecma_6/Math/sign.js
js/src/tests/ecma_6/Math/sinh-approx.js
js/src/tests/ecma_6/Math/sinh-exact.js
js/src/tests/ecma_6/Math/tanh-approx.js
js/src/tests/ecma_6/Math/tanh-exact.js
js/src/tests/ecma_6/Math/trunc.js
js/src/tests/ecma_6/shell.js
--- a/js/src/configure.in
+++ b/js/src/configure.in
@@ -599,16 +599,17 @@ if test -n "$_WIN32_MSVC"; then
     SKIP_LIBRARY_CHECKS=1
 
     # Since we're skipping compiler and library checks, hard-code
     # some facts here.
 
     # Common to all MSVC environments:
 
     AC_DEFINE(HAVE_LOCALECONV)
+    AC_DEFINE(HAVE_HYPOT)
 fi
 
 fi # COMPILE_ENVIRONMENT
 
 if test "$cross_compiling"  = "yes"; then
     CROSS_COMPILE=1
 else
     CROSS_COMPILE=
@@ -2747,16 +2748,22 @@ fi
 dnl Checks for library functions.
 dnl ========================================================
 AC_PROG_GCC_TRADITIONAL
 AC_FUNC_MEMCMP
 AC_CHECK_FUNCS([fchmod flockfile getc_unlocked _getc_nolock getpagesize \
                 lchown localtime_r lstat64 memmove random rint sbrk snprintf \
                 stat64 statvfs statvfs64 strerror strtok_r truncate64])
 
+
+dnl Checks for math functions.
+dnl ========================================================
+AC_CHECK_FUNCS(log2 log1p expm1 sqrt1pm1 acosh asinh atanh hypot trunc cbrt)
+
+
 dnl check for wcrtomb/mbrtowc
 dnl =======================================================================
 if test -z "$MACOS_DEPLOYMENT_TARGET" || test "$MACOS_DEPLOYMENT_TARGET" -ge "100300"; then
 AC_LANG_SAVE
 AC_LANG_CPLUSPLUS
 AC_CACHE_CHECK(for wcrtomb,
     ac_cv_have_wcrtomb,
     [AC_TRY_LINK([#include <wchar.h>],
--- a/js/src/jsmath.cpp
+++ b/js/src/jsmath.cpp
@@ -17,16 +17,17 @@
 
 #include "jslibmath.h"
 
 #include "mozilla/Constants.h"
 #include "mozilla/FloatingPoint.h"
 #include "mozilla/MathAlgorithms.h"
 #include "mozilla/MemoryReporting.h"
 
+#include <algorithm>  // for std::max
 #include <fcntl.h>
 
 #ifdef XP_UNIX
 # include <unistd.h>
 #endif
 
 #include "jstypes.h"
 #include "prmjtime.h"
@@ -45,16 +46,17 @@ using mozilla::ExponentComponent;
 using mozilla::IsFinite;
 using mozilla::IsInfinite;
 using mozilla::IsNaN;
 using mozilla::IsNegative;
 using mozilla::IsNegativeZero;
 using mozilla::PositiveInfinity;
 using mozilla::NegativeInfinity;
 using mozilla::SpecificNaN;
+using JS::ToNumber;
 
 #ifndef M_E
 #define M_E             2.7182818284590452354
 #endif
 #ifndef M_LOG2E
 #define M_LOG2E         1.4426950408889634074
 #endif
 #ifndef M_LOG10E
@@ -793,16 +795,448 @@ js::math_tan(JSContext *cx, unsigned arg
     if (!mathCache)
         return false;
 
     double z = math_tan_impl(mathCache, x);
     args.rval().setDouble(z);
     return true;
 }
 
+
+typedef double (*UnaryMathFunctionType)(MathCache *cache, double);
+
+template <UnaryMathFunctionType F>
+JSBool math_function(JSContext *cx, unsigned argc, Value *vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    if (args.length() == 0) {
+        args.rval().setNumber(js_NaN);
+        return true;
+    }
+
+    double x;
+    if (!ToNumber(cx, args.handleAt(0), &x))
+        return false;
+
+    MathCache *mathCache = cx->runtime()->getMathCache(cx);
+    if (!mathCache)
+        return false;
+    double z = F(mathCache, x);
+    args.rval().setNumber(z);
+
+    return true;
+}
+
+
+
+double
+js::math_log10_impl(MathCache *cache, double x)
+{
+    return cache->lookup(log10, x);
+}
+
+JSBool
+js::math_log10(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_log10_impl>(cx, argc, vp);
+}
+
+#if !HAVE_LOG2
+double log2(double x)
+{
+    return log(x) / M_LN2;
+}
+#endif
+
+double
+js::math_log2_impl(MathCache *cache, double x)
+{
+    return cache->lookup(log2, x);
+}
+
+JSBool
+js::math_log2(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_log2_impl>(cx, argc, vp);
+}
+
+#if !HAVE_LOG1P
+double log1p(double x)
+{
+    if (fabs(x) < 1e-4) {
+        /*
+         * Use Taylor approx. log(1 + x) = x - x^2 / 2 + x^3 / 3 - x^4 / 4 with error x^5 / 5
+         * Since |x| < 10^-4, |x|^5 < 10^-20, relative error less than 10^-16
+         */
+        double z = -(x * x * x * x) / 4 + (x * x * x) / 3 - (x * x) / 2 + x;
+        return z;
+    } else {
+        /* For other large enough values of x use direct computation */
+        return log(1.0 + x);
+    }
+}
+#endif
+
+double
+js::math_log1p_impl(MathCache *cache, double x)
+{
+#ifdef __APPLE__
+    // Ensure that log1p(-0) is -0.
+    if (x == 0)
+        return x;
+#endif
+
+    return cache->lookup(log1p, x);
+}
+
+JSBool
+js::math_log1p(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_log1p_impl>(cx, argc, vp);
+}
+
+#if !HAVE_EXPM1
+double expm1(double x)
+{
+    /* Special handling for -0 */
+    if (x == 0.0)
+        return x;
+
+    if (fabs(x) < 1e-5) {
+        /*
+         * Use Taylor approx. exp(x) - 1 = x + x^2 / 2 + x^3 / 6 with error x^4 / 24
+         * Since |x| < 10^-5, |x|^4 < 10^-20, relative error less than 10^-15
+         */
+        double z = (x * x * x) / 6 + (x * x) / 2 + x;
+        return z;
+    } else {
+        /* For other large enough values of x use direct computation */
+        return exp(x) - 1.0;
+    }
+}
+#endif
+
+double
+js::math_expm1_impl(MathCache *cache, double x)
+{
+    return cache->lookup(expm1, x);
+}
+
+JSBool
+js::math_expm1(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_expm1_impl>(cx, argc, vp);
+}
+
+#if !HAVE_SQRT1PM1
+/* This algorithm computes sqrt(1+x)-1 for small x */
+double sqrt1pm1(double x)
+{
+    if (fabs(x) > 0.75)
+        return sqrt(1 + x) - 1;
+
+    return expm1(log1p(x) / 2);
+}
+#endif
+
+
+double
+js::math_cosh_impl(MathCache *cache, double x)
+{
+    return cache->lookup(cosh, x);
+}
+
+JSBool
+js::math_cosh(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_cosh_impl>(cx, argc, vp);
+}
+
+double
+js::math_sinh_impl(MathCache *cache, double x)
+{
+    return cache->lookup(sinh, x);
+}
+
+JSBool
+js::math_sinh(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_sinh_impl>(cx, argc, vp);
+}
+
+double
+js::math_tanh_impl(MathCache *cache, double x)
+{
+    return cache->lookup(tanh, x);
+}
+
+JSBool
+js::math_tanh(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_tanh_impl>(cx, argc, vp);
+}
+
+#if !HAVE_ACOSH
+double acosh(double x)
+{
+    const double SQUARE_ROOT_EPSILON = sqrt(std::numeric_limits<double>::epsilon());
+
+    if ((x - 1) >= SQUARE_ROOT_EPSILON) {
+        if (x > 1 / SQUARE_ROOT_EPSILON) {
+            /*
+             * http://functions.wolfram.com/ElementaryFunctions/ArcCosh/06/01/06/01/0001/
+             * approximation by laurent series in 1/x at 0+ order from -1 to 0
+             */
+            return log(x) + M_LN2;
+        } else if (x < 1.5) {
+            // This is just a rearrangement of the standard form below
+            // devised to minimize loss of precision when x ~ 1:
+            double y = x - 1;
+            return log1p(y + sqrt(y * y + 2 * y));
+        } else {
+            // http://functions.wolfram.com/ElementaryFunctions/ArcCosh/02/
+            return log(x + sqrt(x * x - 1));
+        }
+    } else {
+        // see http://functions.wolfram.com/ElementaryFunctions/ArcCosh/06/01/04/01/0001/
+        double y = x - 1;
+        // approximation by taylor series in y at 0 up to order 2.
+        // If x is less than 1, sqrt(2 * y) is NaN and the result is NaN.
+        return sqrt(2 * y) * (1 - y / 12 + 3 * y * y / 160);
+    }
+}
+#endif
+
+double
+js::math_acosh_impl(MathCache *cache, double x)
+{
+    return cache->lookup(acosh, x);
+}
+
+JSBool
+js::math_acosh(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_acosh_impl>(cx, argc, vp);
+}
+
+#if !HAVE_ASINH
+double asinh(double x)
+{
+    const double SQUARE_ROOT_EPSILON = sqrt(std::numeric_limits<double>::epsilon());
+    const double FOURTH_ROOT_EPSILON = sqrt(SQUARE_ROOT_EPSILON);
+
+    if (x >= FOURTH_ROOT_EPSILON) {
+        if (x > 1 / SQUARE_ROOT_EPSILON)
+            // http://functions.wolfram.com/ElementaryFunctions/ArcSinh/06/01/06/01/0001/
+            // approximation by laurent series in 1/x at 0+ order from -1 to 1
+            return M_LN2 + log(x) + 1 / (4 * x * x);
+        else if (x < 0.5)
+            return log1p(x + sqrt1pm1(x * x));
+        else
+            return log(x + sqrt(x * x + 1));
+    } else if (x <= -FOURTH_ROOT_EPSILON) {
+        return -asinh(-x);
+    } else {
+        // http://functions.wolfram.com/ElementaryFunctions/ArcSinh/06/01/03/01/0001/
+        // approximation by taylor series in x at 0 up to order 2
+        double result = x;
+
+        if (fabs(x) >= SQUARE_ROOT_EPSILON) {
+            double x3 = x * x * x;
+            // approximation by taylor series in x at 0 up to order 4
+            result -= x3 / 6;
+        }
+
+        return result;
+    }
+}
+#endif
+
+double
+js::math_asinh_impl(MathCache *cache, double x)
+{
+    return cache->lookup(asinh, x);
+}
+
+JSBool
+js::math_asinh(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_asinh_impl>(cx, argc, vp);
+}
+
+#if !HAVE_ATANH
+double atanh(double x)
+{
+    const double EPSILON = std::numeric_limits<double>::epsilon();
+    const double SQUARE_ROOT_EPSILON = sqrt(EPSILON);
+    const double FOURTH_ROOT_EPSILON = sqrt(SQUARE_ROOT_EPSILON);
+
+    if (fabs(x) >= FOURTH_ROOT_EPSILON) {
+        // http://functions.wolfram.com/ElementaryFunctions/ArcTanh/02/
+        if (fabs(x) < 0.5)
+            return (log1p(x) - log1p(-x)) / 2;
+
+        return log((1 + x) / (1 - x)) / 2;
+    } else {
+        // http://functions.wolfram.com/ElementaryFunctions/ArcTanh/06/01/03/01/
+        // approximation by taylor series in x at 0 up to order 2
+        double result = x;
+
+        if (fabs(x) >= SQUARE_ROOT_EPSILON) {
+            double x3 = x * x * x;
+            result += x3 / 3;
+        }
+
+        return result;
+    }
+}
+#endif
+
+double
+js::math_atanh_impl(MathCache *cache, double x)
+{
+    return cache->lookup(atanh, x);
+}
+
+JSBool
+js::math_atanh(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_atanh_impl>(cx, argc, vp);
+}
+
+#if !HAVE_HYPOT
+double hypot(double x, double y)
+{
+    if (mozilla::IsInfinite(x) || mozilla::IsInfinite(y))
+        return js_PositiveInfinity;
+
+    if (mozilla::IsNaN(x) || mozilla::IsNaN(y))
+        return js_NaN;
+
+    double xabs = mozilla::Abs(x);
+    double yabs = mozilla::Abs(y);
+
+    double min = std::min(xabs, yabs);
+    double max = std::max(xabs, yabs);
+
+    if (min == 0) {
+        return max;
+    } else {
+        double u = min / max;
+        return max * sqrt(1 + u * u);
+    }
+}
+#endif
+
+double
+js::math_hypot_impl(double x, double y)
+{
+#ifdef XP_WIN
+    // On Windows, hypot(NaN, Infinity) is NaN. ES6 requires Infinity.
+    if (mozilla::IsInfinite(x) || mozilla::IsInfinite(y))
+        return js_PositiveInfinity;
+#endif
+    return hypot(x, y);
+}
+
+JSBool
+js::math_hypot(JSContext *cx, unsigned argc, Value *vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    if (args.length() < 2) {
+        args.rval().setNumber(js_NaN);
+        return true;
+    }
+
+    double x, y;
+    if (!ToNumber(cx, args.handleAt(0), &x))
+        return false;
+
+    if (!ToNumber(cx, args.handleAt(1), &y))
+        return false;
+
+    if (args.length() == 2) {
+        args.rval().setNumber(math_hypot_impl(x, y));
+        return true;
+    }
+
+    /* args.length() > 2 */
+    double z;
+    if (!ToNumber(cx, args.handleAt(2), &z)) {
+        return false;
+    }
+
+    args.rval().setNumber(math_hypot_impl(math_hypot_impl(x, y), z));
+    return true;
+}
+
+#if !HAVE_TRUNC
+double trunc(double x)
+{
+    return x > 0 ? floor(x) : ceil(x);
+}
+#endif
+
+double
+js::math_trunc_impl(MathCache *cache, double x)
+{
+    return cache->lookup(trunc, x);
+}
+
+JSBool
+js::math_trunc(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_trunc_impl>(cx, argc, vp);
+}
+
+double sign(double x)
+{
+    if (mozilla::IsNaN(x))
+        return js_NaN;
+
+    return x == 0 ? x : x < 0 ? -1 : 1;
+}
+
+double
+js::math_sign_impl(MathCache *cache, double x)
+{
+    return cache->lookup(sign, x);
+}
+
+JSBool
+js::math_sign(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_sign_impl>(cx, argc, vp);
+}
+
+#if !HAVE_CBRT
+double cbrt(double x)
+{
+    if (x > 0) {
+        return pow(x, 1.0 / 3.0);
+    } else if (x == 0) {
+        return x;
+    } else {
+        return -pow(-x, 1.0 / 3.0);
+    }
+}
+#endif
+
+double
+js::math_cbrt_impl(MathCache *cache, double x)
+{
+    return cache->lookup(cbrt, x);
+}
+
+JSBool
+js::math_cbrt(JSContext *cx, unsigned argc, Value *vp)
+{
+    return math_function<math_cbrt_impl>(cx, argc, vp);
+}
+
 #if JS_HAS_TOSOURCE
 static JSBool
 math_toSource(JSContext *cx, unsigned argc, Value *vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
     args.rval().setString(cx->names().Math);
     return true;
 }
@@ -826,16 +1260,30 @@ static const JSFunctionSpec math_static_
     JS_FN("max",            js_math_max,          2, 0),
     JS_FN("min",            js_math_min,          2, 0),
     JS_FN("pow",            js_math_pow,          2, 0),
     JS_FN("random",         js_math_random,       0, 0),
     JS_FN("round",          js_math_round,        1, 0),
     JS_FN("sin",            math_sin,             1, 0),
     JS_FN("sqrt",           js_math_sqrt,         1, 0),
     JS_FN("tan",            math_tan,             1, 0),
+    JS_FN("log10",          math_log10,           1, 0),
+    JS_FN("log2",           math_log2,            1, 0),
+    JS_FN("log1p",          math_log1p,           1, 0),
+    JS_FN("expm1",          math_expm1,           1, 0),
+    JS_FN("cosh",           math_cosh,            1, 0),
+    JS_FN("sinh",           math_sinh,            1, 0),
+    JS_FN("tanh",           math_tanh,            1, 0),
+    JS_FN("acosh",          math_acosh,           1, 0),
+    JS_FN("asinh",          math_asinh,           1, 0),
+    JS_FN("atanh",          math_atanh,           1, 0),
+    JS_FN("hypot",          math_hypot,           2, 0),
+    JS_FN("trunc",          math_trunc,           1, 0),
+    JS_FN("sign",           math_sign,            1, 0),
+    JS_FN("cbrt",           math_cbrt,            1, 0),
     JS_FS_END
 };
 
 JSObject *
 js_InitMathClass(JSContext *cx, HandleObject obj)
 {
     RootedObject Math(cx, NewObjectWithClassProto(cx, &MathClass, NULL, obj, SingletonObject));
     if (!Math)
--- a/js/src/jsmath.h
+++ b/js/src/jsmath.h
@@ -92,19 +92,16 @@ extern double
 js_math_ceil_impl(double x);
 
 extern double
 js_math_floor_impl(double x);
 
 namespace js {
 
 extern JSBool
-math_exp(JSContext *cx, unsigned argc, Value *vp);
-
-extern JSBool
 math_imul(JSContext *cx, unsigned argc, js::Value *vp);
 
 extern JSBool
 math_log(JSContext *cx, unsigned argc, js::Value *vp);
 
 extern double
 math_log_impl(MathCache *cache, double x);
 
@@ -128,16 +125,58 @@ math_exp_impl(MathCache *cache, double x
 
 extern JSBool
 math_tan(JSContext *cx, unsigned argc, js::Value *vp);
 
 extern double
 math_tan_impl(MathCache *cache, double x);
 
 extern JSBool
+math_log10(JSContext *cx, unsigned argc, js::Value *vp);
+
+extern JSBool
+math_log2(JSContext *cx, unsigned argc, js::Value *vp);
+
+extern JSBool
+math_log1p(JSContext *cx, unsigned argc, js::Value *vp);
+
+extern JSBool
+math_expm1(JSContext *cx, unsigned argc, js::Value *vp);
+
+extern JSBool
+math_cosh(JSContext *cx, unsigned argc, js::Value *vp);
+
+extern JSBool
+math_sinh(JSContext *cx, unsigned argc, js::Value *vp);
+
+extern JSBool
+math_tanh(JSContext *cx, unsigned argc, js::Value *vp);
+
+extern JSBool
+math_acosh(JSContext *cx, unsigned argc, js::Value *vp);
+
+extern JSBool
+math_asinh(JSContext *cx, unsigned argc, js::Value *vp);
+
+extern JSBool
+math_atanh(JSContext *cx, unsigned argc, js::Value *vp);
+
+extern JSBool
+math_hypot(JSContext *cx, unsigned argc, Value *vp);
+
+extern JSBool
+math_trunc(JSContext *cx, unsigned argc, Value *vp);
+
+extern JSBool
+math_sign(JSContext *cx, unsigned argc, Value *vp);
+
+extern JSBool
+math_cbrt(JSContext *cx, unsigned argc, Value *vp);
+
+extern JSBool
 math_asin(JSContext *cx, unsigned argc, Value *vp);
 
 extern JSBool
 math_acos(JSContext *cx, unsigned argc, Value *vp);
 
 extern JSBool
 math_atan(JSContext *cx, unsigned argc, Value *vp);
 
@@ -169,11 +208,53 @@ extern double
 powi(double x, int y);
 
 extern double
 ecmaPow(double x, double y);
 
 extern JSBool
 math_imul(JSContext *cx, unsigned argc, Value *vp);
 
+extern double 
+math_log10_impl(MathCache *cache, double x);
+
+extern double 
+math_log2_impl(MathCache *cache, double x);
+
+extern double 
+math_log1p_impl(MathCache *cache, double x);
+
+extern double 
+math_expm1_impl(MathCache *cache, double x);
+
+extern double 
+math_cosh_impl(MathCache *cache, double x);
+
+extern double 
+math_sinh_impl(MathCache *cache, double x);
+
+extern double 
+math_tanh_impl(MathCache *cache, double x);
+
+extern double 
+math_acosh_impl(MathCache *cache, double x);
+
+extern double 
+math_asinh_impl(MathCache *cache, double x);
+
+extern double 
+math_atanh_impl(MathCache *cache, double x);
+
+extern double 
+math_hypot_impl(double x, double y);
+
+extern double 
+math_trunc_impl(MathCache *cache, double x);
+
+extern double 
+math_sign_impl(MathCache *cache, double x);
+
+extern double 
+math_cbrt_impl(MathCache *cache, double x);
+
 } /* namespace js */
 
 #endif /* jsmath_h */
--- a/js/src/tests/browser.js
+++ b/js/src/tests/browser.js
@@ -341,17 +341,17 @@ function jsTestDriverBrowserInit()
     if (properties.test.match(/^js1_6/))
     {
       properties.version = '1.6';
     }
     else if (properties.test.match(/^js1_7/))
     {
       properties.version = '1.7';
     }
-    else if (properties.test.match(/^js1_8/))
+    else if (properties.test.match(/^js1_8|^ecma_6/))
     {
       properties.version = '1.8';
     }
   }
 
   // default to language=type;text/javascript. required for
   // reftest style manifests.
   if (!properties.language)
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/acosh-approx.js
@@ -0,0 +1,281 @@
+var cosh_data = [
+    [1.0000014305114746, 0.0016914556651292944],
+    [1.0000019073486328, 0.001953124689559275],
+    [1.000007152557373, 0.003782208044661295],
+    [1.000013828277588, 0.005258943946801101],
+    [1.0000171661376953, 0.005859366618129203],
+    [1.0000600814819336, 0.010961831992188852],
+    [1.0001168251037598, 0.015285472131830425],
+    [1.0001487731933594, 0.017249319093529877],
+    [1.0003981590270996, 0.028218171738655373],
+    [1.000638484954834, 0.03573281468231457],
+    [1.0010714530944824, 0.046287402472878776],
+    [1.0030217170715332, 0.07771996527168971],
+    [1.0049939155578613, 0.0998975930860278],
+    [1.0092840194702148, 0.13615938768032465],
+    [1.024169921875, 0.21942279004958354],
+    [1.0622773170471191, 0.3511165938166055],
+    [1.1223440170288086, 0.48975026711288183],
+    [1.2495574951171875, 0.692556883708491],
+    [1.4912219047546387, 0.954530572221414],
+    [1.9838471412658691, 1.307581416910453],
+    [2.1576128005981445, 1.4035188779741334],
+    [2.406397819519043, 1.5250070845427517],
+    [3.386958122253418, 1.8905372013072799],
+    [4.451677322387695, 2.1735673399948254],
+    [6.9391326904296875, 2.625091127868242],
+    [7.756023406982422, 2.737434918695162],
+    [8.882369995117188, 2.8740317167801948],
+    [9.869171142578125, 2.97998639328949],
+    [16.848876953125, 3.516549380542481],
+    [16.88458251953125, 3.51867003468025],
+    [18.18859100341797, 3.593185165198829],
+    [18.82012176513672, 3.6273672142963385],
+    [19.184181213378906, 3.646553244410946],
+    [24.039520263671875, 3.872413451393967],
+    [26.556991577148438, 3.972085568933329],
+    [27.921104431152344, 4.022209178119238],
+    [32.314666748046875, 4.168428891496629],
+    [34.73008728027344, 4.240546229861005],
+    [36.51556396484375, 4.290698214968891],
+    [38.851287841796875, 4.352722738491574],
+    [49.46875, 4.594386162629449],
+    [49.67265319824219, 4.598500387004538],
+    [55.821014404296875, 4.7152173401856095],
+    [57.119781494140625, 4.73822104001982],
+    [60.37983703613281, 4.793733825338029],
+    [63.4661865234375, 4.8435923769530165],
+    [63.822418212890625, 4.849190310904695],
+    [64.36642456054688, 4.85767897228448],
+    [65.82318115234375, 4.880061548144127],
+    [68.60302734375, 4.921430721025434],
+    [70.173583984375, 4.94406835208057],
+    [71.80126953125, 4.967000841791218],
+    [75.40786743164062, 5.016014824864732],
+    [75.49771118164062, 5.017205657609766],
+    [78.06475830078125, 5.0506448716550825],
+    [79.64892578125, 5.0707363201405276],
+    [79.8707275390625, 5.073517411135063],
+    [82.14324951171875, 5.101574796209937],
+    [86.42214965820312, 5.152357710985635],
+    [87.75869750976562, 5.167705692500117],
+    [94.24942016601562, 5.2390637098028074],
+    [95.00259399414062, 5.247023676519904],
+    [96.06402587890625, 5.258134994273664],
+    [99.10101318359375, 5.289261389093961],
+    [104.82595825195312, 5.345425863147171],
+    [105.89431762695312, 5.3555664787245885],
+    [106.750244140625, 5.363617180711895],
+    [109.40167236328125, 5.388152468690488],
+    [111.29598999023438, 5.405320225963013],
+    [112.68215942382812, 5.417698597745429],
+    [115.84786987304688, 5.445406415908933],
+    [122.51895141601562, 5.501396249028249],
+    [126.29083251953125, 5.531718947357248],
+    [127.88677978515625, 5.544277233951787],
+    [128.29241943359375, 5.547444176085567],
+    [129.49658203125, 5.556786759298988],
+    [138.73651123046875, 5.625710723366437],
+    [139.18450927734375, 5.628934733085022],
+    [139.9705810546875, 5.634566685055491],
+    [143.6336669921875, 5.660401141376928],
+    [149.2176513671875, 5.698541939965668],
+    [150.61602783203125, 5.7078698961812995],
+    [151.65460205078125, 5.714741890601693],
+    [154.77532958984375, 5.735111323217677],
+    [158.9586181640625, 5.761781191641161],
+    [159.23260498046875, 5.763503378028959],
+    [166.89166259765625, 5.810483079631769],
+    [169.22418212890625, 5.824362807770767],
+    [170.85247802734375, 5.833939098607025],
+    [175.641845703125, 5.861586030831371],
+    [176.47808837890625, 5.866335876872544],
+    [177.0284423828125, 5.869449614294116],
+    [178.81622314453125, 5.879497954012966],
+    [181.28570556640625, 5.893213844044451],
+    [190.84246826171875, 5.944588630523773],
+    [191.39764404296875, 5.947493525920713],
+    [194.2606201171875, 5.962341215900494],
+    [194.89630126953125, 5.9656082276276],
+    [196.72125244140625, 5.9749284849312865],
+    [196.76788330078125, 5.975165500176202],
+    [198.0592041015625, 5.981706804024238],
+    [199.97052001953125, 5.991310884439669],
+    [202.70001220703125, 6.004868209578554],
+    [204.95684814453125, 6.0159406892865155],
+    [206.92059326171875, 6.025476453825986],
+    [211.4588623046875, 6.047172064627678],
+    [211.6217041015625, 6.0479418642231595],
+    [212.15936279296875, 6.050479329955437],
+    [219.93341064453125, 6.086466833749719],
+    [223.34747314453125, 6.101870903204913],
+    [228.56036376953125, 6.1249427443985525],
+    [229.53656005859375, 6.129204755426344],
+    [231.15753173828125, 6.136241935513706],
+    [235.22589111328125, 6.153688953514383],
+    [237.17108154296875, 6.1619244798633215],
+    [237.904541015625, 6.165012268502458],
+    [243.202392578125, 6.187036941752032],
+    [244.296875, 6.191527178125454],
+    [245.39239501953125, 6.196001570568187],
+    [245.80389404296875, 6.197677082130341],
+    [249.68365478515625, 6.2133379061260285],
+    [252.32763671875, 6.223871642756905],
+    [253.4725341796875, 6.228398760115369],
+    [264.1583251953125, 6.269692237869835],
+    [265.867919921875, 6.276143287577458],
+    [273.893798828125, 6.305884283737176],
+    [274.060546875, 6.306492908028797],
+    [274.06298828125, 6.3065018163217115],
+    [275.31201171875, 6.31104892482331],
+    [281.2171630859375, 6.3322712125431915],
+    [284.3428955078125, 6.343324976847916],
+    [284.8428955078125, 6.345081883725142],
+    [287.3035888671875, 6.353683609448096],
+    [290.8973388671875, 6.366114643735997],
+    [293.0467529296875, 6.373476431987165],
+    [293.048583984375, 6.3734826803404045],
+    [296.819091796875, 6.3862671775996915],
+    [297.6572265625, 6.389086936901673],
+    [308.40625, 6.424562459508495],
+    [316.5472412109375, 6.4506171773701535],
+    [320.2418212890625, 6.462221144761522],
+    [322.33642578125, 6.468740575092418],
+    [323.5101318359375, 6.472375224718483],
+    [327.8939208984375, 6.485834999462654],
+    [328.0833740234375, 6.486412623146554],
+    [328.214599609375, 6.486812521370483],
+    [332.13916015625, 6.498698952535687],
+    [339.6888427734375, 6.521175044233963],
+    [340.171630859375, 6.522595306993373],
+    [340.22998046875, 6.522766822935215],
+    [340.9984130859375, 6.52502285413445],
+    [347.719482421875, 6.5445411825986985],
+    [347.921142578125, 6.5451209675856825],
+    [349.8392333984375, 6.55061885367159],
+    [353.1812744140625, 6.560126626713879],
+    [353.3170166015625, 6.560510895819139],
+    [354.9730224609375, 6.565186990039135],
+    [355.6412353515625, 6.567067660815945],
+    [363.193603515625, 6.588081320423386],
+    [363.7503662109375, 6.5896131163651415],
+    [366.66650390625, 6.597598047275183],
+    [370.5828857421875, 6.608222493065004],
+    [371.822998046875, 6.611563301604297],
+    [375.8822021484375, 6.622421213257873],
+    [377.1107177734375, 6.625684248051368],
+    [377.588623046875, 6.626950731244344],
+    [378.8428955078125, 6.630267034079059],
+    [379.1123046875, 6.630977920761718],
+    [381.1038818359375, 6.636217452968849],
+    [382.1112060546875, 6.638857149899159],
+    [382.9927978515625, 6.641161660644278],
+    [387.1845703125, 6.652047018118426],
+    [389.669921875, 6.658445560711748],
+    [389.804443359375, 6.658790721334144],
+    [396.3114013671875, 6.675345858154136],
+    [397.005126953125, 6.677094789236718],
+    [397.1934814453125, 6.6775691166680895],
+    [397.8046875, 6.679106750673113],
+    [398.8426513671875, 6.681712590609845],
+    [399.1663818359375, 6.682523938576487],
+    [399.2547607421875, 6.68274532345516],
+    [400.33984375, 6.685459416477178],
+    [403.9578857421875, 6.694456277839498],
+    [404.279541015625, 6.6952522228540765],
+    [405.0574951171875, 6.6971746771142415],
+    [407.328125, 6.702764738337774],
+    [407.547119140625, 6.7033022311799595],
+    [410.5994873046875, 6.710763953621196],
+    [410.8016357421875, 6.711256159037373],
+    [411.129638671875, 6.712054288828399],
+    [411.9053955078125, 6.713939407502346],
+    [415.5833740234375, 6.722828986708716],
+    [417.669189453125, 6.727835453862132],
+    [420.517822265625, 6.734632628835641],
+    [424.3853759765625, 6.743787740494532],
+    [424.7154541015625, 6.744565219553757],
+    [436.3419189453125, 6.7715720212680655],
+    [438.501953125, 6.776510146304201],
+    [439.3369140625, 6.778412462065226],
+    [445.5606689453125, 6.79247934060035],
+    [452.9901123046875, 6.809016260337229],
+    [453.77490234375, 6.810747231716348],
+    [456.7745361328125, 6.817335895109251],
+    [457.9520263671875, 6.819910421197311],
+    [458.6795654296875, 6.821497844004013],
+    [460.5164794921875, 6.8254946428721475],
+    [461.8717041015625, 6.828433164406687],
+    [464.7025146484375, 6.834543470287694],
+    [467.0626220703125, 6.839609377592375],
+    [467.0712890625, 6.839627933844213],
+    [470.096923828125, 6.846084943645239],
+    [475.1607666015625, 6.856799276049143],
+    [477.5537109375, 6.861822721577315],
+    [478.626220703125, 6.864066049482581],
+    [478.7958984375, 6.864420497333681],
+    [479.6864013671875, 6.866278653973069],
+    [479.7867431640625, 6.866487814627139],
+    [479.9122314453125, 6.8667493311188395],
+    [482.4793701171875, 6.872084270243208],
+    [482.5181884765625, 6.872164723177875],
+    [483.8797607421875, 6.874982560453874],
+    [484.4649658203125, 6.876191234145179],
+    [485.3258056640625, 6.877966548833207],
+    [490.57373046875, 6.888721726428236],
+    [493.7423095703125, 6.89515989558997],
+    [494.272216796875, 6.896232568812718],
+    [496.44775390625, 6.900624415355815],
+    [497.0401611328125, 6.901816998553275],
+    [498.234130859375, 6.9042162822876465],
+    [665.0791015625, 7.193052598670793],
+    [1170.29150390625, 7.758155143419732],
+    [2058.7958984375, 8.323023697145112],
+    [5824.533203125, 9.36298131161099],
+    [9114.30859375, 9.810748008110926],
+    [31388.40625, 11.047341056314202],
+    [53732.765625, 11.584925435512535],
+    [117455.09375, 12.366958539207397],
+    [246210.625, 13.107089828327874],
+    [513670.125, 13.84248373881162],
+    [788353.25, 14.27084873575108],
+    [1736171, 15.060339852215408],
+    [3770530, 15.835873313657556],
+    [4344090, 15.977474039173265],
+    [11419360, 16.943967899150145],
+    [31023240, 17.943394339560967],
+    [40665424, 18.214035936745432],
+    [129788064, 19.374560581709215],
+    [225668224, 19.927723623778547],
+    [450631936, 20.619308638400597],
+    [750941952, 21.129986093026698],
+    [1887358976, 22.05159150215413],
+    [3738011648, 22.734966842639743],
+    [7486695424, 23.42954051928097],
+    [12668080128, 23.955498471391667],
+    [23918272512, 24.591055724582848],
+    [48862560256, 25.305424481799395],
+    [113763549184, 26.150535181949436],
+    [161334755328, 26.499894449532565],
+    [321933279232, 27.19075733422632],
+    [715734122496, 27.989721778208146],
+    [1875817529344, 28.953212876533797]
+];
+
+for (let [x, y] of cosh_data)
+    assertNear(Math.acosh(x), y);
+
+for (var i = 0; i <= 100; i++) {
+    var x = (i - 50) / 5;
+    var y = Math.cosh(x);
+    var z = Math.acosh(y);
+    assertNear(z, Math.abs(x));
+}
+
+for (var i = 1; i < 20; i++)
+    assertNear(Math.acosh(Math.cosh(i)), i);
+
+assertNear(Math.acosh(1e300), 691.4686750787737);
+assertNear(Math.acosh(1.0000000001), 0.000014142136208675862);
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/acosh-exact.js
@@ -0,0 +1,26 @@
+// Properties of Math.acosh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.acosh(NaN), NaN);
+
+// If x is less than 1, the result is NaN.
+assertEq(Math.acosh(ONE_MINUS_EPSILON), NaN);
+assertEq(Math.acosh(Number.MIN_VALUE), NaN);
+assertEq(Math.acosh(+0), NaN);
+assertEq(Math.acosh(-0), NaN);
+assertEq(Math.acosh(-Number.MIN_VALUE), NaN);
+assertEq(Math.acosh(-1), NaN);
+assertEq(Math.acosh(-Number.MAX_VALUE), NaN);
+assertEq(Math.acosh(-Infinity), NaN);
+
+for (var i = -20; i < 1; i++)
+    assertEq(Math.acosh(i), NaN);
+
+// If x is 1, the result is +0.
+assertEq(Math.acosh(1), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.acosh(Number.POSITIVE_INFINITY), Number.POSITIVE_INFINITY);
+
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/asinh-approx.js
@@ -0,0 +1,305 @@
+var sinh_data = [
+    [-497.181640625, -6.902103625349695],
+    [-495.216552734375, -6.898143347143859],
+    [-488.0980224609375, -6.883664481302669],
+    [-486.4609375, -6.880304842490273],
+    [-482.2261962890625, -6.871561546509046],
+    [-468.167236328125, -6.841973895837549],
+    [-465.553955078125, -6.836376331805493],
+    [-464.288330078125, -6.833654100575195],
+    [-463.558837890625, -6.8320816635009045],
+    [-453.82861328125, -6.8108680173663085],
+    [-448.7835693359375, -6.799689165151487],
+    [-446.0499267578125, -6.793579326246197],
+    [-432.4046630859375, -6.762510387544996],
+    [-424.145751953125, -6.743225720989222],
+    [-402.8682861328125, -6.691758395994307],
+    [-402.4595947265625, -6.690743430063694],
+    [-390.1383056640625, -6.6596501292114505],
+    [-387.5355224609375, -6.652956360641761],
+    [-381.0023193359375, -6.635954365364267],
+    [-374.8172607421875, -6.619587562578274],
+    [-374.1033935546875, -6.617681179427804],
+    [-373.01318359375, -6.614762741096185],
+    [-370.0938720703125, -6.60690568753706],
+    [-364.5230712890625, -6.591738907156094],
+    [-361.3756103515625, -6.583066984213974],
+    [-358.1136474609375, -6.573999516974134],
+    [-350.8861083984375, -6.553610904389896],
+    [-350.7060546875, -6.553097634736138],
+    [-345.5616455078125, -6.538320325468202],
+    [-342.386962890625, -6.529090881007076],
+    [-341.9425048828125, -6.527791927233787],
+    [-337.3883056640625, -6.514383886150781],
+    [-328.8133544921875, -6.488639771044976],
+    [-326.1348876953125, -6.480460592697477],
+    [-313.12744140625, -6.439759999015992],
+    [-311.6180419921875, -6.434927968512049],
+    [-303.40478515625, -6.4082177348965725],
+    [-291.9320068359375, -6.369671035834965],
+    [-289.791015625, -6.362310184909175],
+    [-288.07568359375, -6.356373428913315],
+    [-282.76220703125, -6.337756593913614],
+    [-278.9659423828125, -6.32424009706147],
+    [-276.1881103515625, -6.314232650754295],
+    [-269.843994140625, -6.290994606392703],
+    [-256.47509765625, -6.240182555852785],
+    [-248.91619873046875, -6.2102675039793604],
+    [-245.71783447265625, -6.197335184435549],
+    [-244.9049072265625, -6.194021350132335],
+    [-242.49176025390625, -6.184119163536406],
+    [-223.97491455078125, -6.104686221071835],
+    [-223.0770263671875, -6.100669325836893],
+    [-221.50177001953125, -6.093582856519022],
+    [-214.1610107421875, -6.0598807500687935],
+    [-202.9705810546875, -6.0062142965262515],
+    [-200.1683349609375, -5.9923121073369945],
+    [-198.0869140625, -5.981859446096083],
+    [-191.8330078125, -5.9497792165852905],
+    [-183.4495849609375, -5.90509449745879],
+    [-182.9005126953125, -5.902097012275789],
+    [-167.5517578125, -5.8144483910067954],
+    [-162.87738037109375, -5.786154254111214],
+    [-159.6142578125, -5.765917008989405],
+    [-150.01629638671875, -5.703902219845274],
+    [-148.34051513671875, -5.6926689504460395],
+    [-147.23760986328125, -5.685206387751923],
+    [-143.65484619140625, -5.660572815631807],
+    [-138.70599365234375, -5.625516713960633],
+    [-119.55416870117188, -5.476934234171879],
+    [-118.44155883789062, -5.467584665632571],
+    [-112.7041015625, -5.417932675603434],
+    [-111.43020629882812, -5.406565756574079],
+    [-107.77297973632812, -5.373195678988387],
+    [-107.6795654296875, -5.3723285712183735],
+    [-105.091796875, -5.348004040102253],
+    [-101.261474609375, -5.31087758970896],
+    [-95.79150390625, -5.255348419702703],
+    [-91.26885986328125, -5.206986845736275],
+    [-87.33349609375, -5.162914035396619],
+    [-78.23873901367188, -5.052952927749896],
+    [-77.912353515625, -5.048772883924985],
+    [-76.83489990234375, -5.034848487644809],
+    [-61.255645751953125, -4.808269821238499],
+    [-54.41380310058594, -4.689849459883311],
+    [-43.967193603515625, -4.476720236388958],
+    [-42.01084899902344, -4.431216695067421],
+    [-30.609375, -4.114720236218123],
+    [-26.711166381835938, -3.9785790831656023],
+    [-25.241317749023438, -3.9220215830953484],
+    [-14.624359130859375, -3.3770026324620295],
+    [-12.431087493896484, -3.214961448471211],
+    [-10.235607147216797, -3.021397455139021],
+    [-9.41094970703125, -2.937831931335705],
+    [-1.635939121246338, -1.267878515574959],
+    [1.6504814008555524e-12, 1.6504814008555524e-12],
+    [2.0654207510961697e-12, 2.0654207510961697e-12],
+    [6.933230031758164e-12, 6.933230031758164e-12],
+    [1.3351444949627478e-11, 1.3351444949627478e-11],
+    [1.6399812063916386e-11, 1.6399812063916386e-11],
+    [5.730159402528301e-11, 5.730159402528301e-11],
+    [1.113731329382972e-10, 1.113731329382972e-10],
+    [1.4214707189097453e-10, 1.4214707189097453e-10],
+    [3.8006320313144215e-10, 3.8006320313144215e-10],
+    [6.09162720266454e-10, 6.09162720266454e-10],
+    [1.0221641311147778e-9, 1.0221641311147778e-9],
+    [2.8819222563924995e-9, 2.8819222563924995e-9],
+    [4.7627768395841485e-9, 4.7627768395841485e-9],
+    [8.854133426439148e-9, 8.854133426439148e-9],
+    [2.3050326092288742e-8, 2.305032609228874e-8],
+    [5.9392490925347374e-8, 5.939249092534734e-8],
+    [1.166764889148908e-7, 1.1667648891489053e-7],
+    [2.3799674409019644e-7, 2.379967440901942e-7],
+    [4.684659415943315e-7, 4.6846594159431437e-7],
+    [9.382699772686465e-7, 9.382699772685088e-7],
+    [0.00000110398559627356, 0.0000011039855962733358],
+    [0.0000032917760108830407, 0.000003291776010877096],
+    [0.00000751721381675452, 0.000007517213816683722],
+    [0.000015114666894078255, 0.000015114666893502755],
+    [0.00002986399340443313, 0.00002986399339999406],
+    [0.00003387028118595481, 0.000033870281179478836],
+    [0.00009066011989489198, 0.00009066011977069884],
+    [0.00021949532674625516, 0.00021949532498377364],
+    [0.00043952150736004114, 0.00043952149320897676],
+    [0.0006333151832222939, 0.0006333151408864353],
+    [0.001115123275667429, 0.0011151230445582744],
+    [0.001962467096745968, 0.0019624658370807177],
+    [0.005553754046559334, 0.005553725496786973],
+    [0.008691128343343735, 0.008691018931968294],
+    [0.02993336319923401, 0.02992889492062484],
+    [0.05124260485172272, 0.05122020579778827],
+    [0.11201295256614685, 0.1117800293787828],
+    [0.23480379581451416, 0.23269806521543376],
+    [0.4898730516433716, 0.4721357117742938],
+    [0.7518312931060791, 0.694611571189336],
+    [1.655740737915039, 1.2781607348262256],
+    [3.5958566665649414, 1.9917262343245115],
+    [3.662705421447754, 2.009484184971722],
+    [4.142845153808594, 2.128787712416205],
+    [5.957065582275391, 2.4846967934155475],
+    [10.890350341796875, 3.083125584533294],
+    [27.3714599609375, 4.002981567623351],
+    [29.58606719970703, 4.080736210902826],
+    [30.79753875732422, 4.120845430011113],
+    [38.78157043457031, 4.351258506393416],
+    [46.88148498535156, 4.540883728536112],
+    [47.21551513671875, 4.547981853382592],
+    [47.2205810546875, 4.5480891170767],
+    [49.72361755371094, 4.599728302509061],
+    [61.557464599609375, 4.8131842711857535],
+    [67.82162475585938, 4.910082619934558],
+    [68.82363891601562, 4.924747230639767],
+    [73.75466918945312, 4.993937439635391],
+    [80.95669555664062, 5.087099712053554],
+    [85.26406860351562, 5.1389346970196295],
+    [85.2677001953125, 5.138977285472121],
+    [92.8238525390625, 5.223879832616765],
+    [94.50357055664062, 5.241812789460327],
+    [116.044677734375, 5.447141014648796],
+    [123.77554321289062, 5.511633288238573],
+    [132.3592529296875, 5.578681289305598],
+    [139.7633056640625, 5.633110296634631],
+    [143.9609375, 5.662701238627725],
+    [146.31298828125, 5.678906941005323],
+    [155.0980224609375, 5.737214893086866],
+    [155.47784423828125, 5.739660763047893],
+    [155.74066162109375, 5.741349685869528],
+    [163.60546875, 5.790614371552514],
+    [178.735107421875, 5.879059869096351],
+    [179.70269775390625, 5.884458728291027],
+    [179.81976318359375, 5.885109945587401],
+    [181.3594970703125, 5.893636014368936],
+    [194.82861328125, 5.965274032538233],
+    [195.23284912109375, 5.967346683696556],
+    [199.07666015625, 5.986843466070591],
+    [205.77423095703125, 6.019932686217942],
+    [206.04608154296875, 6.021252909681261],
+    [209.36480712890625, 6.037231102920489],
+    [210.703857421875, 6.043606439928324],
+    [215.2139892578125, 6.06478541011501],
+    [225.83892822265625, 6.112974120371601],
+    [226.95465087890625, 6.117902255760311],
+    [232.79864501953125, 6.1433256889594094],
+    [240.647216796875, 6.176483527820343],
+    [243.1324462890625, 6.186757751007361],
+    [251.26702880859375, 6.219667373726848],
+    [253.72906494140625, 6.229418088083555],
+    [254.6866455078125, 6.233184983047428],
+    [257.2001953125, 6.243005711460192],
+    [257.7401123046875, 6.245102704489327],
+    [261.731201171875, 6.260468857392134],
+    [263.75, 6.268152459140511],
+    [265.5167236328125, 6.2748285545831655],
+    [273.9171142578125, 6.305976070434008],
+    [278.897705078125, 6.32399546069982],
+    [279.167236328125, 6.324961403980197],
+    [292.207275390625, 6.370613506132747],
+    [293.5975341796875, 6.375359978930309],
+    [293.9749755859375, 6.3766447200146],
+    [295.1998291015625, 6.380802563199264],
+    [297.2799072265625, 6.387824152942429],
+    [297.9285888671875, 6.390003820200831],
+    [298.1058349609375, 6.3905985680679],
+    [300.2803955078125, 6.397866642974941],
+    [307.531005859375, 6.421725738171608],
+    [308.1754150390625, 6.423818963102848],
+    [309.7344970703125, 6.428865255911759],
+    [314.2847900390625, 6.443449261058927],
+    [314.7236328125, 6.444844602076255],
+    [320.8406982421875, 6.464094341970107],
+    [321.2459716796875, 6.465356699668166],
+    [321.9031982421875, 6.467400466944125],
+    [323.457763671875, 6.472218114936839],
+    [330.82861328125, 6.4947499213823265],
+    [335.008544921875, 6.507305446835735],
+    [340.7171630859375, 6.524202033435675],
+    [348.4677734375, 6.546694993078936],
+    [349.1292724609375, 6.548591493378012],
+    [372.4288330078125, 6.613194950203132],
+    [376.7574462890625, 6.6247505436339065],
+    [378.4306640625, 6.629181796246806],
+    [390.9031982421875, 6.6616087711302185],
+    [405.7918701171875, 6.698989091751707],
+    [407.3646240234375, 6.702857353572475],
+    [413.3758544921875, 6.717505881986416],
+    [415.7354736328125, 6.723197804327891],
+    [417.193603515625, 6.726699007993023],
+    [420.874755859375, 6.735483889307782],
+    [429.2635498046875, 6.755219602793124],
+    [429.756103515625, 6.756366380816258],
+    [433.9931640625, 6.766177290841293],
+    [434.0106201171875, 6.766217511883346],
+    [440.073974609375, 6.780091308338912],
+    [450.2220458984375, 6.802889310303153],
+    [455.017578125, 6.813484439494547],
+    [457.1668701171875, 6.818196843455478],
+    [457.5068359375, 6.818940201487998],
+    [459.2913818359375, 6.822833193143805],
+    [459.492431640625, 6.82327083544577],
+    [459.743896484375, 6.823817951018],
+    [464.888427734375, 6.834945773756887],
+    [464.96630859375, 6.835113285253827],
+    [467.6949462890625, 6.840964582694129],
+    [468.86767578125, 6.84346890521034],
+    [470.5927734375, 6.847141429556457],
+    [481.109619140625, 6.869243403190376],
+    [487.4595947265625, 6.882355637062964],
+    [488.521484375, 6.884531678915821],
+    [492.8812255859375, 6.89341643293734],
+    [494.0684814453125, 6.895822338701104],
+    [496.4613037109375, 6.900653737167637],
+    [716.154052734375, 7.2670429692740965],
+    [1799.92578125, 8.188647968122073],
+    [3564.845703125, 8.872023251113289],
+    [7139.869140625, 9.566596912986167],
+    [12081.22265625, 10.092554861905608],
+    [22810.2421875, 10.728112113864427],
+    [46598.96875, 11.442480870715618],
+    [108493.375, 12.28759157077177],
+    [153860.8125, 12.636950838344218],
+    [307019.5, 13.327813723030063],
+    [682577.25, 14.126778167009777],
+    [1788919, 15.090269265334971],
+    [3769169, 15.835512291283944],
+    [4327820, 15.973721689554742],
+    [11044024, 16.910547205715446],
+    [21423208, 17.573132558903225],
+    [62828288, 18.649063156437965],
+    [70207360, 18.760110887365155],
+    [154231424, 19.547111966180875],
+    [294509056, 20.193967491567523],
+    [1070557184, 21.484592263156223],
+    [1957922816, 22.088297141021556],
+    [3912507392, 22.780591462699917],
+    [7279233024, 23.401438520318692],
+    [9665245184, 23.684949498080787],
+    [22627590144, 24.5355829820426],
+    [60601991168, 25.520740767599584],
+    [134018236416, 26.31438890085422],
+    [204864946176, 26.73876398039979],
+    [284346286080, 27.06660583008718],
+    [914576637952, 28.234874284944635],
+    [1581915832320, 28.78280496108106]
+];
+
+for (let [x, y] of sinh_data)
+    assertNear(Math.asinh(x), y);
+
+for (var i = 0; i <= 80; i++) {
+    var x = (i - 40) / 4;
+    var y = Math.sinh(x);
+    var z = Math.asinh(y);
+    assertNear(z, x);
+}
+
+for (var i = -20; i < 20; i++)
+  assertNear(Math.asinh(Math.sinh(i)), i);
+
+assertNear(Math.asinh(1e300), 691.4686750787737);
+assertNear(Math.asinh(1e-300), 1e-300);
+assertNear(Math.asinh(1e-5), 0.000009999999999833334);
+assertNear(Math.asinh(0.3), 0.29567304756342244);
+assertNear(Math.asinh(1), 0.881373587019543);
+
+reportCompare(0, 0, "ok");
+
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/asinh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.asinh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.asinh(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.asinh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.asinh(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.asinh(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.asinh(-Infinity), -Infinity);
+
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/atanh-approx.js
@@ -0,0 +1,278 @@
+for (var i = -1; i < 1; i += 0.05)
+    assertNear(Math.atanh(Math.tanh(i)), i);
+
+var tanh_data = [
+    [-0.9999983310699463, -6.998237084679027],
+    [-0.9999978542327881, -6.87257975132917],
+    [-0.999992847442627, -6.2705920974657525],
+    [-0.9999861717224121, -5.940967614084813],
+    [-0.9999828338623047, -5.832855225378502],
+    [-0.9999399185180664, -5.20646301208756],
+    [-0.9998834133148193, -4.8749821841810785],
+    [-0.9998509883880615, -4.752279497280338],
+    [-0.9996016025543213, -4.260504202858904],
+    [-0.9993612766265869, -4.0244334353203115],
+    [-0.9989283084869385, -3.7655641082999236],
+    [-0.9969782829284668, -3.246782610980921],
+    [-0.9950058460235596, -2.9950671179940938],
+    [-0.9942638874053955, -2.9256242749609536],
+    [-0.990715742111206, -2.6839646283308363],
+    [-0.9903340339660645, -2.663723350226518],
+    [-0.9760982990264893, -2.207464998348322],
+    [-0.975830078125, -2.201817459680556],
+    [-0.9728245735168457, -2.1424542308291437],
+    [-0.9643559455871582, -2.0046686756020917],
+    [-0.9377224445343018, -1.7188337346177065],
+    [-0.9362406730651855, -1.7066940482565154],
+    [-0.9310147762298584, -1.6659543005533146],
+    [-0.9284839630126953, -1.6472838718760747],
+    [-0.9270248413085938, -1.6368067340881562],
+    [-0.9075665473937988, -1.5135473477311114],
+    [-0.897477388381958, -1.4590986086331497],
+    [-0.8920106887817383, -1.431681573516303],
+    [-0.8776559829711914, -1.365471286049011],
+    [-0.864722728729248, -1.3117705583444539],
+    [-0.8482067584991455, -1.249725893334944],
+    [-0.8056559562683105, -1.1145246028592257],
+    [-0.8048388957977295, -1.112200609756455],
+    [-0.7801985740661621, -1.0458778330822556],
+    [-0.7749934196472168, -1.032711173436253],
+    [-0.7619285583496094, -1.0007967281362184],
+    [-0.7504425048828125, -0.9739672824457072],
+    [-0.7495596408843994, -0.9719492983286864],
+    [-0.7481319904327393, -0.968698942014487],
+    [-0.7459518909454346, -0.9637657636705832],
+    [-0.7401137351989746, -0.9507308314464193],
+    [-0.7289731502532959, -0.9265325319867653],
+    [-0.7226788997650146, -0.9132299082876396],
+    [-0.7161557674407959, -0.8997082193533088],
+    [-0.7017018795013428, -0.8706453720344796],
+    [-0.7013418674468994, -0.86993650130945],
+    [-0.691054105758667, -0.8499705913361888],
+    [-0.6847054958343506, -0.837919455842005],
+    [-0.6838164329528809, -0.8362476144993315],
+    [-0.6747090816497803, -0.8193374156276964],
+    [-0.6575610637664795, -0.7885046044142132],
+    [-0.6522045135498047, -0.7791255597799839],
+    [-0.6261923313140869, -0.7351275788820003],
+    [-0.623173713684082, -0.7301771459970386],
+    [-0.6067488193511963, -0.7037597526130627],
+    [-0.5838055610656738, -0.6682166303197608],
+    [-0.579524040222168, -0.6617457665293066],
+    [-0.5760939121246338, -0.656596458857398],
+    [-0.5654678344726562, -0.6408350116350283],
+    [-0.5578761100769043, -0.6297442839791668],
+    [-0.5523209571838379, -0.6217149641475687],
+    [-0.5396339893341064, -0.6036390747171698],
+    [-0.5128989219665527, -0.5666556256064771],
+    [-0.5087778568267822, -0.5610793900942042],
+    [-0.4977825880050659, -0.546353950571504],
+    [-0.4913865327835083, -0.5378865967606703],
+    [-0.48976075649261475, -0.5357455496477738],
+    [-0.48493504524230957, -0.5294166456244711],
+    [-0.4479050636291504, -0.4820764946679979],
+    [-0.4461095333099365, -0.4798325976916711],
+    [-0.4429593086242676, -0.47590653371561276],
+    [-0.42827916145324707, -0.45778739362936793],
+    [-0.40590059757232666, -0.4306933608076879],
+    [-0.40029656887054443, -0.4240020382545707],
+    [-0.3961341381072998, -0.4190551379319939],
+    [-0.3836275339126587, -0.40430627175908734],
+    [-0.36686253547668457, -0.3847928551425507],
+    [-0.3657644987106323, -0.38352464227459343],
+    [-0.33507001399993896, -0.3485286317501442],
+    [-0.32572221755981445, -0.3380352468276522],
+    [-0.3191967010498047, -0.3307524237890151],
+    [-0.3000025749206543, -0.3095224337886503],
+    [-0.29665136337280273, -0.3058438250228025],
+    [-0.2944457530975342, -0.3034271164344305],
+    [-0.2872810363769531, -0.29560018347246825],
+    [-0.27738428115844727, -0.28484608203169437],
+    [-0.2390844225883484, -0.2438028008332661],
+    [-0.23685944080352783, -0.24144425169391517],
+    [-0.2253856658935547, -0.2293228153248168],
+    [-0.22283810377120972, -0.22664053064745143],
+    [-0.21552443504333496, -0.21895773601143995],
+    [-0.2153375744819641, -0.21876178107952995],
+    [-0.21016258001327515, -0.21334143320771737],
+    [-0.20250272750854492, -0.2053409277979887],
+    [-0.19156384468078613, -0.19396008474133075],
+    [-0.18251943588256836, -0.18458771439322938],
+    [-0.17464947700500488, -0.17645844608618066],
+    [-0.15646183490753174, -0.15775766677189154],
+    [-0.15580910444259644, -0.15708862621964176],
+    [-0.15365445613861084, -0.15488112515549593],
+    [-0.122499018907547, -0.12311733609904851],
+    [-0.1088167130947113, -0.10924929296737837],
+    [-0.08792558312416077, -0.08815322150790302],
+    [-0.08401328325271606, -0.08421178632314608],
+    [-0.06121261417865753, -0.06128924075509796],
+    [-0.05341699719429016, -0.05346789060550386],
+    [-0.05047759413719177, -0.05052053189238029],
+    [-0.02924579381942749, -0.029254136237332657],
+    [-0.02485968917608261, -0.02486481220617492],
+    [-0.020469173789024353, -0.02047203328100153],
+    [-0.01882001757621765, -0.018822240021756347],
+    [-0.016152501106262207, -0.016153906073109205],
+    [-0.0032715508714318275, -0.003271562543358962],
+    [1.6504814008555524e-12, 1.6504814008555524e-12],
+    [2.0654207510961697e-12, 2.0654207510961697e-12],
+    [6.933230031758164e-12, 6.933230031758164e-12],
+    [1.3351444949627478e-11, 1.3351444949627478e-11],
+    [1.6399812063916386e-11, 1.6399812063916386e-11],
+    [5.730159402528301e-11, 5.730159402528301e-11],
+    [1.113731329382972e-10, 1.113731329382972e-10],
+    [1.4214707189097453e-10, 1.4214707189097453e-10],
+    [3.8006320313144215e-10, 3.8006320313144215e-10],
+    [6.09162720266454e-10, 6.09162720266454e-10],
+    [1.0221641311147778e-9, 1.0221641311147778e-9],
+    [2.8819222563924995e-9, 2.8819222563924995e-9],
+    [4.7627768395841485e-9, 4.7627768395841485e-9],
+    [8.854133426439148e-9, 8.854133426439148e-9],
+    [2.3050326092288742e-8, 2.3050326092288745e-8],
+    [5.9392490925347374e-8, 5.939249092534745e-8],
+    [1.166764889148908e-7, 1.1667648891489133e-7],
+    [2.3799674409019644e-7, 2.3799674409020094e-7],
+    [4.684659415943315e-7, 4.684659415943658e-7],
+    [9.382699772686465e-7, 9.382699772689218e-7],
+    [0.00000110398559627356, 0.0000011039855962740086],
+    [0.0000032917760108830407, 0.0000032917760108949305],
+    [0.00000751721381675452, 0.000007517213816896115],
+    [0.000015114666894078255, 0.000015114666895229252],
+    [0.00002986399340443313, 0.00002986399341331128],
+    [0.00003387028118595481, 0.000033870281198906756],
+    [0.00009066011989489198, 0.00009066012014327826],
+    [0.00021949532674625516, 0.0002194953302712184],
+    [0.00043952150736004114, 0.0004395215356621756],
+    [0.0006333151832222939, 0.0006333152678940465],
+    [0.001115123275667429, 0.0011151237378863419],
+    [0.001962467096745968, 0.001962469616086656],
+    [0.005553754046559334, 0.005553811147953338],
+    [0.007324676960706711, 0.0073248079567425],
+    [0.008691128343343735, 0.008691347183450786],
+    [0.011912941932678223, 0.011913505535037906],
+    [0.02993336319923401, 0.029942308168570204],
+    [0.05124260485172272, 0.05128752666822782],
+    [0.05473744869232178, 0.05479221508125444],
+    [0.06158891320228577, 0.061666963819518306],
+    [0.09375360608100891, 0.09402975380882211],
+    [0.09442159533500671, 0.09470370926367391],
+    [0.09443172812461853, 0.09471393321406026],
+    [0.09943729639053345, 0.09976699249016487],
+    [0.11201295256614685, 0.11248498303558895],
+    [0.12310260534286499, 0.12373016402339168],
+    [0.13562965393066406, 0.13647060950861248],
+    [0.13763350248336792, 0.13851257866094746],
+    [0.14749455451965332, 0.14857829980464834],
+    [0.1618971824645996, 0.16333433166790448],
+    [0.17051106691360474, 0.17219298693637355],
+    [0.17051833868026733, 0.17220047646299907],
+    [0.18562912940979004, 0.18780647318150087],
+    [0.18898820877075195, 0.1912876932893582],
+    [0.23206615447998047, 0.23637212433914523],
+    [0.23480379581451416, 0.2392675448267427],
+    [0.2646920680999756, 0.27114729033023005],
+    [0.2794986963272095, 0.2871382059344433],
+    [0.28789305686950684, 0.2962673858386819],
+    [0.292596697807312, 0.30140373665239234],
+    [0.3101649284362793, 0.320727882769785],
+    [0.3109246492385864, 0.3215686893944558],
+    [0.31145012378692627, 0.3221505056451929],
+    [0.3271782398223877, 0.3396649461699478],
+    [0.3574345111846924, 0.37394153436545424],
+    [0.3593693971633911, 0.37616159223090223],
+    [0.35960352420806885, 0.37643046596933716],
+    [0.3626827001571655, 0.3799714809649667],
+    [0.38961827754974365, 0.4113499159905353],
+    [0.3904266357421875, 0.41230330080214],
+    [0.3981136083602905, 0.4214052375603139],
+    [0.411507248878479, 0.43742438709579096],
+    [0.4120509624481201, 0.43807911823743495],
+    [0.41868770122528076, 0.4460997186945703],
+    [0.42136549949645996, 0.4493511447897729],
+    [0.4516327381134033, 0.48674948990473677],
+    [0.4538639783859253, 0.4895560176112375],
+    [0.4655507802963257, 0.5043748446613433],
+    [0.48124635219573975, 0.5246050193978663],
+    [0.48621630668640137, 0.5310932154891663],
+    [0.4898730516433716, 0.5358932909903701],
+    [0.5024838447570801, 0.5526234425942533],
+    [0.5074074268341064, 0.5592320547729962],
+    [0.5093221664428711, 0.5618140818296767],
+    [0.5143489837646484, 0.5686253097655146],
+    [0.5154285430908203, 0.5700943191671631],
+    [0.5234100818634033, 0.5810250825991418],
+    [0.5274472236633301, 0.5866018515043636],
+    [0.5309803485870361, 0.5915094458340507],
+    [0.5477793216705322, 0.6152030999229688],
+    [0.5577394962310791, 0.6295459624918965],
+    [0.5582785606384277, 0.6303287742357745],
+    [0.5843560695648193, 0.6690521906099505],
+    [0.5871362686157227, 0.6732844960442398],
+    [0.5878911018371582, 0.6744372167164567],
+    [0.5903406143188477, 0.6781887236623534],
+    [0.5945003032684326, 0.684597775489552],
+    [0.5957975387573242, 0.6866065102131665],
+    [0.5961520671844482, 0.6871563252400655],
+    [0.6005008220672607, 0.6939300827887145],
+    [0.6150004863739014, 0.7169242329194352],
+    [0.6162893772125244, 0.7189998055497108],
+    [0.6194069385528564, 0.7240422748778544],
+    [0.6285066604614258, 0.7389438896054792],
+    [0.6293842792510986, 0.7403958734869583],
+    [0.6416172981262207, 0.7609178886018204],
+    [0.6424276828765869, 0.7622965466812235],
+    [0.6437420845031738, 0.7645378650643101],
+    [0.6468508243560791, 0.769864795178161],
+    [0.6615910530090332, 0.7956379107512945],
+    [0.669950008392334, 0.8106524185805045],
+    [0.6813662052154541, 0.8316597473423232],
+    [0.6968657970428467, 0.8611812790659296],
+    [0.6981887817382812, 0.8637579113749143],
+    [0.7447831630706787, 0.9611360201710216],
+    [0.7518312931060791, 0.9771540941752986],
+    [0.7534394264221191, 0.9808634133542229],
+    [0.7567856311798096, 0.9886489208209699],
+    [0.7817282676696777, 1.0497991719828956],
+    [0.8115026950836182, 1.1314141444187586],
+    [0.814647912979126, 1.1406947755584418],
+    [0.8266689777374268, 1.1775230833699681],
+    [0.8313877582550049, 1.1926138225701433],
+    [0.8343038558959961, 1.2021323323039612],
+    [0.8416652679443359, 1.2268570644335162],
+    [0.8584413528442383, 1.2873896671573652],
+    [0.8678996562957764, 1.3245040433929398],
+    [0.8679344654083252, 1.3246451309261607],
+    [0.8800599575042725, 1.3760334877782177],
+    [0.9003539085388184, 1.4740852961194106],
+    [0.9099440574645996, 1.5271990851861994],
+    [0.9142425060272217, 1.5527768948273004],
+    [0.9149219989776611, 1.556931837197936],
+    [0.9184908866882324, 1.5792896628381612],
+    [0.9188928604125977, 1.5818663359427627],
+    [0.919395923614502, 1.5851082843320008],
+    [0.9296839237213135, 1.6560555223295368],
+    [0.9298396110534668, 1.6572041418041492],
+    [0.9352962970733643, 1.6990986433619266],
+    [0.9376416206359863, 1.718164398807965],
+    [0.9410912990570068, 1.7475084077246632],
+    [0.962122917175293, 1.9737180163455101],
+    [0.9748215675354004, 2.1811227771083783],
+    [0.9769454002380371, 2.2257214499698255],
+    [0.985663890838623, 2.4654635601650536],
+    [0.9880380630493164, 2.5565869228142004],
+    [0.9928233623504639, 2.8132383539094192],
+    [1e-300, 1e-300],
+    [0.00001, 0.000010000000000333334],
+    [0.3, 0.3095196042031117],
+    [1e-30, 1e-30],
+    [1e-10, 1e-10],
+];
+
+for (let [x, y] of tanh_data)
+    assertNear(Math.atanh(x), y);
+
+assertNear(Math.atanh(+3 / 5), +Math.log(2));
+assertNear(Math.atanh(-3 / 5), -Math.log(2));
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/atanh-exact.js
@@ -0,0 +1,35 @@
+// Properties of Math.atanh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.atanh(NaN), NaN);
+
+// If x is less than −1, the result is NaN.
+assertEq(Math.atanh(-ONE_PLUS_EPSILON), NaN);
+assertEq(Math.atanh(-Number.MAX_VALUE), NaN);
+assertEq(Math.atanh(-Infinity), NaN);
+
+for (var i = -5; i < -1; i += 0.1)
+    assertEq(Math.atanh(i), NaN);
+
+// If x is greater than 1, the result is NaN.
+assertEq(Math.atanh(ONE_PLUS_EPSILON), NaN);
+assertEq(Math.atanh(Number.MAX_VALUE), NaN);
+assertEq(Math.atanh(Infinity), NaN);
+
+for (var i = +5; i > +1; i -= 0.1)
+    assertEq(Math.atanh(i), NaN);
+
+// If x is −1, the result is −∞.
+assertEq(Math.atanh(-1), -Infinity);
+
+// If x is +1, the result is +∞.
+assertEq(Math.atanh(+1), Infinity);
+
+// If x is +0, the result is +0.
+assertEq(Math.atanh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.atanh(-0), -0);
+
+
+reportCompare(0, 0, "ok");
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/cbrt-approx.js
@@ -0,0 +1,18 @@
+assertEq(Math.cbrt(1), 1);
+assertEq(Math.cbrt(-1), -1);
+
+assertNear(Math.cbrt(1e-300), 1e-100);
+assertNear(Math.cbrt(-1e-300), -1e-100);
+
+var cbrt_data = [
+    [ Math.E, 1.3956124250860895 ], 
+    [ Math.PI, 1.4645918875615231 ], 
+    [ Math.LN2, 0.8849970445005177 ], 
+    [ Math.SQRT2, 1.1224620483093728 ]
+];
+
+for (let [x, y] of cbrt_data)
+    assertNear(Math.cbrt(x), y);
+
+reportCompare(0, 0, "ok");
+
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/cbrt-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.cbrt that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.cbrt(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.cbrt(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.cbrt(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.cbrt(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.cbrt(-Infinity), -Infinity);
+
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/cosh-approx.js
@@ -0,0 +1,275 @@
+for (var i = -20; i < 20; i++)
+    assertNear(Math.cosh(i), (Math.exp(i) + Math.exp(-i)) / 2);
+
+assertNear(Math.cosh(1e5), Infinity);
+assertNear(Math.cosh(1e-30), 1);
+assertNear(Math.cosh(1e-10), 1);
+
+var cosh_data = [
+    [0.0016914556651292944, 1.0000014305114746],
+    [0.001953124689559275, 1.0000019073486328],
+    [0.003782208044661295, 1.000007152557373],
+    [0.005258943946801101, 1.000013828277588],
+    [0.005859366618129203, 1.0000171661376953],
+    [0.010961831992188852, 1.0000600814819336],
+    [0.015285472131830425, 1.0001168251037598],
+    [0.017249319093529877, 1.0001487731933594],
+    [0.028218171738655373, 1.0003981590270996],
+    [0.03573281468231457, 1.000638484954834],
+    [0.046287402472878776, 1.0010714530944824],
+    [0.07771996527168971, 1.0030217170715332],
+    [0.0998975930860278, 1.0049939155578613],
+    [0.13615938768032465, 1.0092840194702148],
+    [0.21942279004958354, 1.024169921875],
+    [0.3511165938166055, 1.0622773170471191],
+    [0.48975026711288183, 1.1223440170288086],
+    [0.692556883708491,  1.2495574951171875],
+    [0.954530572221414,  1.4912219047546387],
+    [1.307581416910453,  1.983847141265869],
+    [1.4035188779741334, 2.1576128005981445],
+    [1.5250070845427517, 2.406397819519043],
+    [1.8905372013072799, 3.386958122253418],
+    [2.1735673399948254, 4.451677322387695],
+    [2.625091127868242,  6.939132690429686],
+    [2.737434918695162,  7.756023406982421],
+    [2.8740317167801948, 8.88236999511719],
+    [2.97998639328949,   9.869171142578123],
+    [3.516549380542481,  16.848876953125],
+    [3.51867003468025,   16.884582519531254],
+    [3.593185165198829,  18.18859100341797],
+    [3.6273672142963385, 18.82012176513672],
+    [3.646553244410946,  19.184181213378906],
+    [3.872413451393967,  24.03952026367187],
+    [3.972085568933329,  26.556991577148434],
+    [4.022209178119238,  27.921104431152337],
+    [4.168428891496629,  32.31466674804686],
+    [4.240546229861005,  34.730087280273445],
+    [4.290698214968891,  36.51556396484376],
+    [4.352722738491574,  38.851287841796875],
+    [4.594386162629449,  49.46875],
+    [4.598500387004538,  49.67265319824219],
+    [4.7152173401856095, 55.821014404296896],
+    [4.73822104001982,   57.119781494140604],
+    [4.793733825338029,  60.37983703613279],
+    [4.8435923769530165, 63.46618652343747],
+    [4.849190310904695,  63.82241821289062],
+    [4.85767897228448,   64.36642456054685],
+    [4.880061548144127,  65.82318115234375],
+    [4.921430721025434,  68.60302734374997],
+    [4.94406835208057,   70.17358398437497],
+    [4.967000841791218,  71.80126953124997],
+    [5.016014824864732,  75.40786743164065],
+    [5.017205657609766,  75.49771118164062],
+    [5.0506448716550825, 78.06475830078126],
+    [5.0707363201405276, 79.64892578125],
+    [5.073517411135063,  79.87072753906253],
+    [5.101574796209937,  82.14324951171874],
+    [5.152357710985635,  86.4221496582031],
+    [5.167705692500117,  87.75869750976562],
+    [5.2390637098028074, 94.24942016601562],
+    [5.247023676519904,  95.00259399414062],
+    [5.258134994273664,  96.06402587890626],
+    [5.289261389093961,  99.10101318359374],
+    [5.345425863147171,  104.82595825195315],
+    [5.3555664787245885, 105.89431762695308],
+    [5.363617180711895,  106.750244140625],
+    [5.388152468690488,  109.40167236328122],
+    [5.405320225963013,  111.2959899902344],
+    [5.417698597745429,  112.68215942382815],
+    [5.445406415908933,  115.8478698730469],
+    [5.501396249028249,  122.51895141601562],
+    [5.531718947357248,  126.29083251953128],
+    [5.544277233951787,  127.88677978515626],
+    [5.547444176085567,  128.29241943359372],
+    [5.556786759298988,  129.49658203125006],
+    [5.625710723366437,  138.7365112304687],
+    [5.628934733085022,  139.18450927734378],
+    [5.634566685055491,  139.97058105468747],
+    [5.660401141376928,  143.63366699218747],
+    [5.698541939965668,  149.21765136718753],
+    [5.7078698961812995, 150.6160278320313],
+    [5.714741890601693,  151.6546020507813],
+    [5.735111323217677,  154.77532958984378],
+    [5.761781191641161,  158.95861816406253],
+    [5.763503378028959,  159.23260498046878],
+    [5.810483079631769,  166.89166259765622],
+    [5.824362807770767,  169.22418212890625],
+    [5.833939098607025,  170.85247802734372],
+    [5.861586030831371,  175.64184570312503],
+    [5.866335876872544,  176.47808837890625],
+    [5.869449614294116,  177.02844238281247],
+    [5.879497954012966,  178.81622314453122],
+    [5.893213844044451,  181.28570556640625],
+    [5.944588630523773,  190.84246826171866],
+    [5.947493525920713,  191.39764404296875],
+    [5.962341215900494,  194.26062011718753],
+    [5.9656082276276,    194.89630126953122],
+    [5.9749284849312865, 196.7212524414062],
+    [5.975165500176202,  196.76788330078128],
+    [5.981706804024238,  198.05920410156241],
+    [5.991310884439669,  199.9705200195312],
+    [6.004868209578554,  202.70001220703122],
+    [6.0159406892865155, 204.95684814453116],
+    [6.025476453825986,  206.92059326171866],
+    [6.047172064627678,  211.45886230468741],
+    [6.0479418642231595, 211.62170410156256],
+    [6.050479329955437,  212.1593627929687],
+    [6.086466833749719,  219.93341064453125],
+    [6.101870903204913,  223.3474731445312],
+    [6.1249427443985525, 228.56036376953128],
+    [6.129204755426344,  229.53656005859375],
+    [6.136241935513706,  231.1575317382813],
+    [6.153688953514383,  235.22589111328134],
+    [6.1619244798633215, 237.17108154296884],
+    [6.165012268502458,  237.90454101562506],
+    [6.187036941752032,  243.202392578125],
+    [6.191527178125454,  244.29687500000003],
+    [6.196001570568187,  245.3923950195312],
+    [6.197677082130341,  245.80389404296875],
+    [6.2133379061260285, 249.68365478515622],
+    [6.223871642756905,  252.3276367187501],
+    [6.228398760115369,  253.47253417968756],
+    [6.269692237869835,  264.1583251953126],
+    [6.276143287577458,  265.8679199218749],
+    [6.305884283737176,  273.89379882812494],
+    [6.306492908028797,  274.0605468750001],
+    [6.3065018163217115, 274.06298828125006],
+    [6.31104892482331,   275.3120117187501],
+    [6.3322712125431915, 281.2171630859374],
+    [6.343324976847916,  284.34289550781244],
+    [6.345081883725142,  284.84289550781256],
+    [6.353683609448096,  287.30358886718756],
+    [6.366114643735997,  290.8973388671876],
+    [6.373476431987165,  293.0467529296875],
+    [6.3734826803404045, 293.04858398437494],
+    [6.3862671775996915, 296.819091796875],
+    [6.389086936901673,  297.6572265625],
+    [6.424562459508495,  308.4062500000001],
+    [6.4506171773701535, 316.5472412109376],
+    [6.462221144761522,  320.24182128906256],
+    [6.468740575092418,  322.33642578125],
+    [6.472375224718483,  323.5101318359374],
+    [6.485834999462654,  327.8939208984375],
+    [6.486412623146554,  328.08337402343744],
+    [6.486812521370483,  328.214599609375],
+    [6.498698952535687,  332.1391601562501],
+    [6.521175044233963,  339.6888427734376],
+    [6.522595306993373,  340.171630859375],
+    [6.522766822935215,  340.2299804687499],
+    [6.52502285413445,   340.99841308593744],
+    [6.5445411825986985, 347.7194824218749],
+    [6.5451209675856825, 347.9211425781249],
+    [6.55061885367159,   349.8392333984375],
+    [6.560126626713879,  353.1812744140626],
+    [6.560510895819139,  353.31701660156244],
+    [6.565186990039135,  354.97302246093756],
+    [6.567067660815945,  355.64123535156233],
+    [6.588081320423386,  363.19360351562517],
+    [6.5896131163651415, 363.7503662109376],
+    [6.597598047275183,  366.66650390624983],
+    [6.608222493065004,  370.5828857421874],
+    [6.611563301604297,  371.822998046875],
+    [6.622421213257873,  375.88220214843756],
+    [6.625684248051368,  377.11071777343744],
+    [6.626950731244344,  377.58862304687483],
+    [6.630267034079059,  378.8428955078124],
+    [6.630977920761718,  379.11230468749994],
+    [6.636217452968849,  381.10388183593756],
+    [6.638857149899159,  382.1112060546874],
+    [6.641161660644278,  382.9927978515625],
+    [6.652047018118426,  387.1845703124999],
+    [6.658445560711748,  389.66992187499994],
+    [6.658790721334144,  389.8044433593749],
+    [6.675345858154136,  396.3114013671875],
+    [6.677094789236718,  397.00512695312494],
+    [6.6775691166680895, 397.1934814453124],
+    [6.679106750673113,  397.80468749999994],
+    [6.681712590609845,  398.84265136718744],
+    [6.682523938576487,  399.16638183593744],
+    [6.68274532345516,   399.2547607421874],
+    [6.685459416477178,  400.3398437499999],
+    [6.694456277839498,  403.9578857421875],
+    [6.6952522228540765, 404.27954101562517],
+    [6.6971746771142415, 405.05749511718744],
+    [6.702764738337774,  407.328125],
+    [6.7033022311799595, 407.54711914062506],
+    [6.710763953621196,  410.59948730468756],
+    [6.711256159037373,  410.8016357421876],
+    [6.712054288828399,  411.12963867187494],
+    [6.713939407502346,  411.9053955078124],
+    [6.722828986708716,  415.5833740234374],
+    [6.727835453862132,  417.66918945312506],
+    [6.734632628835641,  420.51782226562506],
+    [6.743787740494532,  424.38537597656233],
+    [6.744565219553757,  424.71545410156244],
+    [6.7715720212680655, 436.3419189453125],
+    [6.776510146304201,  438.50195312500017],
+    [6.778412462065226,  439.33691406250017],
+    [6.79247934060035,   445.5606689453126],
+    [6.809016260337229,  452.9901123046875],
+    [6.810747231716348,  453.7749023437499],
+    [6.817335895109251,  456.7745361328125],
+    [6.819910421197311,  457.9520263671875],
+    [6.821497844004013,  458.6795654296874],
+    [6.8254946428721475, 460.51647949218767],
+    [6.828433164406687,  461.87170410156256],
+    [6.834543470287694,  464.70251464843756],
+    [6.839609377592375,  467.06262207031267],
+    [6.839627933844213,  467.0712890625001],
+    [6.846084943645239,  470.09692382812494],
+    [6.856799276049143,  475.16076660156233],
+    [6.861822721577315,  477.5537109374998],
+    [6.864066049482581,  478.62622070312517],
+    [6.864420497333681,  478.79589843750017],
+    [6.866278653973069,  479.68640136718733],
+    [6.866487814627139,  479.7867431640625],
+    [6.8667493311188395, 479.9122314453126],
+    [6.872084270243208,  482.4793701171875],
+    [6.872164723177875,  482.5181884765627],
+    [6.874982560453874,  483.87976074218767],
+    [6.876191234145179,  484.46496582031233],
+    [6.877966548833207,  485.3258056640624],
+    [6.888721726428236,  490.57373046875006],
+    [6.89515989558997,   493.74230957031244],
+    [6.896232568812718,  494.2722167968751],
+    [6.900624415355815,  496.44775390624983],
+    [6.901816998553275,  497.0401611328125],
+    [6.9042162822876465, 498.23413085937483],
+    [7.193052598670793,  665.0791015625001],
+    [7.758155143419732,  1170.29150390625],
+    [8.323023697145112,  2058.795898437501],
+    [9.36298131161099,   5824.533203125004],
+    [9.810748008110926,  9114.308593750004],
+    [11.047341056314202, 31388.40624999998],
+    [11.584925435512535, 53732.765624999956],
+    [12.366958539207397, 117455.0937500001],
+    [13.107089828327874, 246210.62499999983],
+    [13.84248373881162,  513670.1250000003],
+    [14.27084873575108,  788353.2499999999],
+    [15.060339852215408, 1736170.999999999],
+    [15.835873313657556, 3770530.0000000005],
+    [15.977474039173265, 4344089.999999998],
+    [16.943967899150145, 11419360.000000006],
+    [17.943394339560967, 31023239.99999997],
+    [18.214035936745432, 40665424.00000006],
+    [19.374560581709215, 129788063.99999991],
+    [19.927723623778547, 225668224.00000027],
+    [20.619308638400597, 450631936.0000006],
+    [21.129986093026698, 750941952.0000008],
+    [22.05159150215413,  1887358976.0000033],
+    [22.734966842639743, 3738011648.0000052],
+    [23.42954051928097,  7486695423.99999],
+    [23.955498471391667, 12668080127.99998],
+    [24.591055724582848, 23918272512],
+    [25.305424481799395, 48862560256.00005],
+    [26.150535181949436, 113763549183.99998],
+    [26.499894449532565, 161334755328.00018],
+    [27.19075733422632,  321933279232.0004],
+    [27.989721778208146, 715734122496],
+    [28.953212876533797, 1875817529343.9976],
+];
+
+for (let [x, y] of cosh_data)
+    assertNear(Math.cosh(x), y);
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/cosh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.cosh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.cosh(NaN), NaN);
+
+// If x is +0, the result is 1.
+assertEq(Math.cosh(+0), 1);
+
+// If x is −0, the result is 1.
+assertEq(Math.cosh(-0), 1);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.cosh(Infinity), Infinity);
+
+// If x is −∞, the result is +∞.
+assertEq(Math.cosh(-Infinity), Infinity);
+
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/expm1-approx.js
@@ -0,0 +1,24 @@
+assertNear(Math.expm1(1e-300), 1e-300);
+assertNear(Math.expm1(1e-100), 1e-100);
+assertNear(Math.expm1(1e-14), 1.000000000000005e-14);
+assertNear(Math.expm1(1e-6), 0.0000010000005000001665);
+
+var expm1_data = [
+    [ -1.875817529344e-70, -1.875817529344e-70 ],
+    [ -7.09962844069878e-15, -7.099628440698755e-15 ],
+    [ -2.114990849122478e-10, -2.1149908488988187e-10 ],
+    [ -0.0000031404608812881633, -0.000003140455950046052 ],
+
+    [ 1.875817529344e-70, 1.875817529344e-70 ],
+    [ 6.261923313140869e-30, 6.261923313140869e-30 ],
+    [ 7.09962844069878e-15, 7.099628440698805e-15 ],
+    [ 1.3671879628418538e-12, 1.3671879628427884e-12 ],
+    [ 2.114990849122478e-10, 2.1149908493461373e-10 ],
+    [ 1.6900931765206906e-8, 1.6900931908027652e-8 ],
+    [ 0.0000031404608812881633, 0.0000031404658125405988 ]
+];
+
+for (let [x, y] of expm1_data)
+    assertNear(Math.expm1(x), y);
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/expm1-exact.js
@@ -0,0 +1,20 @@
+// Properties of Math.expm1 that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.expm1(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.expm1(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.expm1(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.expm1(Infinity), Infinity);
+
+// If x is −∞, the result is -1.
+assertEq(Math.expm1(-Infinity), -1);
+
+
+reportCompare(0, 0, "ok");
+
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/hypot-approx.js
@@ -0,0 +1,14 @@
+for (var i = -20; i < 20; i++)
+    assertEq(Math.hypot(+0, i), Math.abs(i));
+
+for (var i = -20; i < 20; i++)
+    assertEq(Math.hypot(-0, i), Math.abs(i));
+
+for (var i = 1, j = 1; i < 2; i += 0.05, j += 0.05)
+    assertNear(Math.hypot(i, j), Math.sqrt(i * i + j * j));
+
+assertNear(Math.hypot(1e300, 1e300), 1.4142135623730952e+300);
+assertNear(Math.hypot(1e-300, 1e-300), 1.414213562373095e-300);
+assertNear(Math.hypot(1e3, 1e-3), 1000.0000000005);
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/hypot-exact.js
@@ -0,0 +1,58 @@
+// Properties of Math.hypot that are guaranteed by the spec.
+
+// If any argument is +∞, the result is +∞.
+// If any argument is −∞, the result is +∞.
+for (let inf of [Infinity, -Infinity]) {
+    assertEq(Math.hypot(inf, 0), Infinity);
+    assertEq(Math.hypot(0, inf), Infinity);
+    assertEq(Math.hypot(inf, inf), Infinity);
+    assertEq(Math.hypot(inf, -inf), Infinity);
+
+    assertEq(Math.hypot(inf, -0), Infinity);
+    assertEq(Math.hypot(-0, inf), Infinity);
+    assertEq(Math.hypot(inf, Math.MIN_VALUE), Infinity);
+    assertEq(Math.hypot(Math.MIN_VALUE, inf), Infinity);
+    assertEq(Math.hypot(inf, 1), Infinity);
+    assertEq(Math.hypot(1, inf), Infinity);
+
+    assertEq(Math.hypot(inf, 0, 0), Infinity);
+    assertEq(Math.hypot(0, inf, 0), Infinity);
+    assertEq(Math.hypot(0, 0, inf), Infinity);
+
+    assertEq(Math.hypot(inf, NaN), Infinity);
+    assertEq(Math.hypot(NaN, inf), Infinity);
+
+    assertEq(Math.hypot(inf, NaN, NaN), Infinity);
+    assertEq(Math.hypot(NaN, inf, NaN), Infinity);
+    assertEq(Math.hypot(NaN, NaN, inf), Infinity);
+}
+
+// If no argument is +∞ or −∞, and any argument is NaN, the result is NaN.
+assertEq(Math.hypot(), NaN);
+assertEq(Math.hypot(1), NaN);
+
+assertEq(Math.hypot(NaN, 0), NaN);
+assertEq(Math.hypot(0, NaN), NaN);
+
+assertEq(Math.hypot(NaN, NaN), NaN);
+
+assertEq(Math.hypot(NaN, 0, 0), NaN);
+assertEq(Math.hypot(0, NaN, 0), NaN);
+assertEq(Math.hypot(0, 0, NaN), NaN);
+
+assertEq(Math.hypot(Number.MAX_VALUE, Number.MIN_VALUE, NaN), NaN);
+
+// If all arguments are either +0 or -0, the result is +0.
+assertEq(Math.hypot(-0, -0), +0);
+assertEq(Math.hypot(+0, -0), +0);
+
+assertEq(Math.hypot(-0, -0, -0), +0);
+assertEq(Math.hypot(+0, -0, -0), +0);
+assertEq(Math.hypot(-0, +0, -0), +0);
+assertEq(Math.hypot(+0, +0, -0), +0);
+
+// The length property of the hypot function is 2.
+assertEq(Math.hypot.length, 2);
+
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/log10-approx.js
@@ -0,0 +1,9 @@
+for (var i = -10; i < 10; i++)
+    assertNear(Math.log10(Math.pow(10, i)), i);
+
+assertNear(Math.log10(2), 0.3010299956639812);
+assertNear(Math.log10(7), 0.8450980400142568);
+assertNear(Math.log10(Math.E), Math.LOG10E);
+
+reportCompare(0, 0, 'ok');
+
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/log10-exact.js
@@ -0,0 +1,30 @@
+// Properties of Math.log10 that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.log10(NaN), NaN);
+
+// If x is less than 0, the result is NaN.
+assertEq(Math.log10(-1e-10), NaN);
+assertEq(Math.log10(-1e-5), NaN);
+assertEq(Math.log10(-1e-1), NaN);
+assertEq(Math.log10(-Number.MIN_VALUE), NaN);
+assertEq(Math.log10(-Number.MAX_VALUE), NaN);
+assertEq(Math.log10(-Infinity), NaN);
+
+for (var i = -1; i > -10; i--)
+    assertEq(Math.log10(i), NaN);
+
+// If x is +0, the result is −∞.
+assertEq(Math.log10(+0), -Infinity);
+
+// If x is −0, the result is −∞.
+assertEq(Math.log10(-0), -Infinity);
+
+// If x is 1, the result is +0.
+assertEq(Math.log10(1), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.log10(Infinity), Infinity);
+
+
+reportCompare(0, 0, 'ok');
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/log1p-approx.js
@@ -0,0 +1,20 @@
+assertNear(Math.log1p(1e-300), 1e-300);
+assertNear(Math.log1p(1e-15), 9.999999999999995e-16);
+assertNear(Math.log1p(1e-6), 9.999995000003334e-7);
+
+var log1p_data = [
+    [ 1.875817529344e-70, 1.875817529344e-70 ],
+    [ 6.261923313140869e-30, 6.261923313140869e-30 ],
+    [ 7.09962844069878e-15, 7.099628440698755e-15 ],
+    [ 1.3671879628418538e-12, 1.3671879628409192e-12 ],
+    [ 2.114990849122478e-10, 2.1149908488988187e-10 ],
+    [ 1.6900931765206906e-8, 1.690093162238616e-8 ],
+    [ 0.0000709962844069878, 0.00007099376429006658 ],
+    [ 0.0016793412882520897, 0.00167793277137076 ],
+    [ 0.011404608812881634, 0.011340066517988035 ],
+];
+
+for (let [x, y] of log1p_data)
+    assertNear(Math.log1p(x), y);
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/log1p-exact.js
@@ -0,0 +1,29 @@
+// Properties of Math.log1p that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.log1p(NaN), NaN);
+
+// If x is less than -1, the result is NaN.
+assertEq(Math.log1p(-1 - 1e-10), NaN);
+assertEq(Math.log1p(-1 - 1e-5), NaN);
+assertEq(Math.log1p(-1 - 1e-1), NaN);
+assertEq(Math.log1p(-ONE_PLUS_EPSILON), NaN);
+
+for (var i = -2; i > -20; i--)
+    assertEq(Math.log1p(i), NaN);
+
+// If x is -1, the result is -∞.
+assertEq(Math.log1p(-1), -Infinity);
+
+// If x is +0, the result is +0.
+assertEq(Math.log1p(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.log1p(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.log1p(Infinity), Infinity);
+
+
+reportCompare(0, 0, "ok");
+
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/log2-approx.js
@@ -0,0 +1,8 @@
+for (var i = -10; i < 10; i++)
+    assertNear(Math.log2(Math.pow(2, i)), i);
+
+assertNear(Math.log2(5), 2.321928094887362);
+assertNear(Math.log2(7), 2.807354922057604);
+assertNear(Math.log2(Math.E), Math.LOG2E);
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/log2-exact.js
@@ -0,0 +1,30 @@
+// Properties of Math.log2 that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.log2(NaN), NaN);
+
+// If x is less than 0, the result is NaN.
+assertEq(Math.log2(-1e-10), NaN);
+assertEq(Math.log2(-1e-5), NaN);
+assertEq(Math.log2(-1e-1), NaN);
+assertEq(Math.log2(-Number.MIN_VALUE), NaN);
+assertEq(Math.log2(-Number.MAX_VALUE), NaN);
+assertEq(Math.log2(-Infinity), NaN);
+
+for (var i = -1; i > -10; i--)
+    assertEq(Math.log2(i), NaN);
+
+// If x is +0, the result is −∞.
+assertEq(Math.log2(+0), -Infinity);
+
+// If x is −0, the result is −∞.
+assertEq(Math.log2(-0), -Infinity);
+
+// If x is 1, the result is +0.
+assertEq(Math.log2(1), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.log2(Infinity), Infinity);
+
+
+reportCompare(0, 0, 'ok');
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/shell.js
@@ -0,0 +1,11 @@
+// The nearest representable values to +1.0.
+const ONE_PLUS_EPSILON = 1 + Math.pow(2, -52);  // 0.9999999999999999
+const ONE_MINUS_EPSILON = 1 - Math.pow(2, -53);  // 1.0000000000000002
+
+function assertNear(actual, expected) {
+    var error = Math.abs(actual - expected);
+
+    if (error > 1e-300 && error > Math.abs(actual) * 1e-12)
+        throw 'Assertion failed: got "' + actual + '", expected "' + expected + '" (rel error = ' + (error / Math.abs(actual)) + ')';
+}
+
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/sign.js
@@ -0,0 +1,34 @@
+// If x is NaN, the result is NaN.
+assertEq(Math.sign(NaN), NaN);
+
+// If x is −0, the result is −0.
+assertEq(Math.sign(-0), -0);
+
+// If x is +0, the result is +0.
+assertEq(Math.sign(+0), +0);
+
+// If x is negative and not −0, the result is −1.
+assertEq(Math.sign(-Number.MIN_VALUE), -1);
+assertEq(Math.sign(-Number.MAX_VALUE), -1);
+assertEq(Math.sign(-Infinity), -1);
+
+for (var i = -1; i > -20; i--)
+    assertEq(Math.sign(i), -1);
+
+assertEq(Math.sign(-1e-300), -1);
+assertEq(Math.sign(-0x80000000), -1);
+
+// If x is positive and not +0, the result is +1.
+assertEq(Math.sign(Number.MIN_VALUE), +1);
+assertEq(Math.sign(Number.MAX_VALUE), +1);
+assertEq(Math.sign(Infinity), +1);
+
+for (var i = 1; i < 20; i++)
+    assertEq(Math.sign(i), +1);
+
+assertEq(Math.sign(+1e-300), +1);
+assertEq(Math.sign(0x80000000), +1);
+assertEq(Math.sign(0xffffffff), +1);
+
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/sinh-approx.js
@@ -0,0 +1,296 @@
+for (var i = -20; i < 20; i++)
+    assertNear(Math.sinh(i), (Math.exp(i) - Math.exp(-i)) / 2);
+
+assertNear(Math.sinh(1e5), Infinity);
+assertNear(Math.sinh(1e-30), 1e-30);
+assertNear(Math.sinh(1e-10), 1e-10);
+
+var sinh_data = [
+    [-6.902103625349695, -497.1816406250001],
+    [-6.898143347143859, -495.21655273437517],
+    [-6.883664481302669, -488.0980224609375],
+    [-6.880304842490273, -486.46093750000006],
+    [-6.871561546509046, -482.2261962890624],
+    [-6.841973895837549, -468.167236328125],
+    [-6.836376331805493, -465.5539550781251],
+    [-6.833654100575195, -464.2883300781251],
+    [-6.8320816635009045, -463.55883789062483],
+    [-6.8108680173663085, -453.82861328125],
+    [-6.799689165151487, -448.78356933593756],
+    [-6.793579326246197, -446.0499267578126],
+    [-6.762510387544996, -432.4046630859374],
+    [-6.743225720989222, -424.14575195312506],
+    [-6.691758395994307, -402.86828613281244],
+    [-6.690743430063694, -402.4595947265625],
+    [-6.6596501292114505, -390.1383056640624],
+    [-6.652956360641761, -387.5355224609375],
+    [-6.635954365364267, -381.00231933593767],
+    [-6.619587562578274, -374.81726074218744],
+    [-6.617681179427804, -374.10339355468744],
+    [-6.614762741096185, -373.0131835937501],
+    [-6.60690568753706,  -370.0938720703124],
+    [-6.591738907156094, -364.5230712890626],
+    [-6.583066984213974, -361.3756103515625],
+    [-6.573999516974134, -358.1136474609374],
+    [-6.553610904389896, -350.8861083984376],
+    [-6.553097634736138, -350.7060546875001],
+    [-6.538320325468202, -345.56164550781267],
+    [-6.529090881007076, -342.386962890625],
+    [-6.527791927233787, -341.94250488281256],
+    [-6.514383886150781, -337.38830566406244],
+    [-6.488639771044976, -328.8133544921875],
+    [-6.480460592697477, -326.13488769531256],
+    [-6.439759999015992, -313.1274414062499],
+    [-6.434927968512049, -311.61804199218744],
+    [-6.4082177348965725, -303.4047851562501],
+    [-6.369671035834965, -291.93200683593756],
+    [-6.362310184909175, -289.79101562500006],
+    [-6.356373428913315, -288.0756835937499],
+    [-6.337756593913614, -282.76220703125006],
+    [-6.32424009706147,  -278.96594238281256],
+    [-6.314232650754295, -276.18811035156256],
+    [-6.290994606392703, -269.8439941406249],
+    [-6.240182555852785, -256.4750976562499],
+    [-6.2102675039793604, -248.9161987304687],
+    [-6.197335184435549, -245.71783447265628],
+    [-6.194021350132335, -244.90490722656253],
+    [-6.184119163536406, -242.4917602539062],
+    [-6.104686221071835, -223.97491455078116],
+    [-6.100669325836893, -223.07702636718747],
+    [-6.093582856519022, -221.50177001953122],
+    [-6.0598807500687935, -214.16101074218741],
+    [-6.0062142965262515, -202.97058105468741],
+    [-5.9923121073369945, -200.1683349609375],
+    [-5.981859446096083, -198.08691406249997],
+    [-5.9497792165852905, -191.83300781250006],
+    [-5.90509449745879,  -183.44958496093747],
+    [-5.902097012275789, -182.90051269531256],
+    [-5.8144483910067954, -167.55175781250006],
+    [-5.786154254111214, -162.8773803710938],
+    [-5.765917008989405, -159.61425781250006],
+    [-5.703902219845274, -150.0162963867188],
+    [-5.6926689504460395, -148.34051513671872],
+    [-5.685206387751923, -147.23760986328122],
+    [-5.660572815631807, -143.6548461914062],
+    [-5.625516713960633, -138.70599365234375],
+    [-5.476934234171879, -119.55416870117192],
+    [-5.467584665632571, -118.4415588378906],
+    [-5.417932675603434, -112.70410156250004],
+    [-5.406565756574079, -111.43020629882811],
+    [-5.373195678988387, -107.77297973632808],
+    [-5.3723285712183735, -107.67956542968749],
+    [-5.348004040102253, -105.09179687499999],
+    [-5.31087758970896,  -101.261474609375],
+    [-5.255348419702703, -95.79150390624997],
+    [-5.206986845736275, -91.26885986328122],
+    [-5.162914035396619, -87.33349609375003],
+    [-5.052952927749896, -78.23873901367186],
+    [-5.048772883924985, -77.91235351562501],
+    [-5.034848487644809, -76.83489990234378],
+    [-4.808269821238499, -61.25564575195312],
+    [-4.689849459883311, -54.413803100585945],
+    [-4.476720236388958, -43.96719360351561],
+    [-4.431216695067421, -42.01084899902342],
+    [-4.114720236218123, -30.60937499999999],
+    [-3.9785790831656023, -26.711166381835938],
+    [-3.9220215830953484, -25.24131774902344],
+    [-3.3770026324620295, -14.624359130859379],
+    [-3.214961448471211, -12.431087493896483],
+    [-3.021397455139021, -10.235607147216797],
+    [-2.937831931335705, -9.41094970703125],
+    [-1.267878515574959, -1.6359391212463381],
+    [1.6504814008555524e-12, 1.6504814008555524e-12],
+    [2.0654207510961697e-12, 2.0654207510961697e-12],
+    [6.933230031758164e-12, 6.933230031758164e-12],
+    [1.3351444949627478e-11, 1.3351444949627478e-11],
+    [1.6399812063916386e-11, 1.6399812063916386e-11],
+    [5.730159402528301e-11, 5.730159402528301e-11],
+    [1.113731329382972e-10, 1.113731329382972e-10],
+    [1.4214707189097453e-10, 1.4214707189097453e-10],
+    [3.8006320313144215e-10, 3.8006320313144215e-10],
+    [6.09162720266454e-10, 6.09162720266454e-10],
+    [1.0221641311147778e-9, 1.0221641311147778e-9],
+    [2.8819222563924995e-9, 2.8819222563924995e-9],
+    [4.7627768395841485e-9, 4.7627768395841485e-9],
+    [8.854133426439148e-9, 8.854133426439148e-9],
+    [2.305032609228874e-8, 2.3050326092288742e-8],
+    [5.939249092534734e-8, 5.9392490925347374e-8],
+    [1.1667648891489053e-7, 1.166764889148908e-7],
+    [2.379967440901942e-7, 2.3799674409019644e-7],
+    [4.6846594159431437e-7, 4.684659415943315e-7],
+    [9.382699772685088e-7, 9.382699772686465e-7],
+    [0.0000011039855962733358, 0.00000110398559627356],
+    [0.000003291776010877096, 0.0000032917760108830407],
+    [0.000007517213816683722, 0.00000751721381675452],
+    [0.000015114666893502755, 0.000015114666894078255],
+    [0.00002986399339999406, 0.00002986399340443313],
+    [0.000033870281179478836, 0.00003387028118595481],
+    [0.00009066011977069884, 0.00009066011989489198],
+    [0.00021949532498377364, 0.00021949532674625516],
+    [0.00043952149320897676, 0.00043952150736004114],
+    [0.0006333151408864353, 0.0006333151832222939],
+    [0.0011151230445582744, 0.001115123275667429],
+    [0.0019624658370807177, 0.001962467096745968],
+    [0.005553725496786973, 0.005553754046559334],
+    [0.008691018931968294, 0.008691128343343735],
+    [0.02992889492062484, 0.02993336319923401],
+    [0.05122020579778827, 0.05124260485172272],
+    [0.1117800293787828, 0.11201295256614685],
+    [0.23269806521543376, 0.23480379581451416],
+    [0.4721357117742938, 0.4898730516433716],
+    [0.694611571189336,  0.7518312931060792],
+    [1.2781607348262256, 1.6557407379150393],
+    [1.9917262343245115, 3.5958566665649414],
+    [2.009484184971722,  3.6627054214477544],
+    [2.128787712416205,  4.142845153808595],
+    [2.4846967934155475, 5.95706558227539],
+    [3.083125584533294,  10.890350341796875],
+    [4.002981567623351,  27.3714599609375],
+    [4.080736210902826,  29.586067199707028],
+    [4.120845430011113,  30.79753875732421],
+    [4.351258506393416,  38.78157043457031],
+    [4.540883728536112,  46.88148498535155],
+    [4.547981853382592,  47.21551513671875],
+    [4.5480891170767,    47.220581054687514],
+    [4.599728302509061,  49.72361755371096],
+    [4.8131842711857535, 61.557464599609396],
+    [4.910082619934558,  67.82162475585939],
+    [4.924747230639767,  68.82363891601564],
+    [4.993937439635391,  73.75466918945312],
+    [5.087099712053554,  80.95669555664065],
+    [5.1389346970196295, 85.26406860351562],
+    [5.138977285472121,  85.26770019531251],
+    [5.223879832616765,  92.82385253906247],
+    [5.241812789460327,  94.50357055664062],
+    [5.447141014648796,  116.04467773437499],
+    [5.511633288238573,  123.77554321289061],
+    [5.578681289305598,  132.3592529296875],
+    [5.633110296634631,  139.76330566406253],
+    [5.662701238627725,  143.96093750000003],
+    [5.678906941005323,  146.31298828124997],
+    [5.737214893086866,  155.0980224609375],
+    [5.739660763047893,  155.4778442382812],
+    [5.741349685869528,  155.74066162109372],
+    [5.790614371552514,  163.60546874999994],
+    [5.879059869096351,  178.73510742187494],
+    [5.884458728291027,  179.70269775390622],
+    [5.885109945587401,  179.8197631835937],
+    [5.893636014368936,  181.35949707031256],
+    [5.965274032538233,  194.82861328125003],
+    [5.967346683696556,  195.23284912109375],
+    [5.986843466070591,  199.07666015624994],
+    [6.019932686217942,  205.77423095703134],
+    [6.021252909681261,  206.0460815429687],
+    [6.037231102920489,  209.36480712890634],
+    [6.043606439928324,  210.70385742187506],
+    [6.06478541011501,   215.21398925781244],
+    [6.112974120371601,  225.83892822265622],
+    [6.117902255760311,  226.95465087890622],
+    [6.1433256889594094, 232.79864501953136],
+    [6.176483527820343,  240.64721679687503],
+    [6.186757751007361,  243.13244628906241],
+    [6.219667373726848,  251.26702880859372],
+    [6.229418088083555,  253.72906494140634],
+    [6.233184983047428,  254.68664550781241],
+    [6.243005711460192,  257.20019531250006],
+    [6.245102704489327,  257.74011230468744],
+    [6.260468857392134,  261.73120117187506],
+    [6.268152459140511,  263.74999999999994],
+    [6.2748285545831655, 265.5167236328125],
+    [6.305976070434008,  273.9171142578125],
+    [6.32399546069982,   278.8977050781249],
+    [6.324961403980197,  279.16723632812506],
+    [6.370613506132747,  292.20727539062494],
+    [6.375359978930309,  293.59753417968744],
+    [6.3766447200146,    293.9749755859376],
+    [6.380802563199264,  295.19982910156244],
+    [6.387824152942429,  297.27990722656244],
+    [6.390003820200831,  297.9285888671876],
+    [6.3905985680679,    298.10583496093744],
+    [6.397866642974941,  300.2803955078125],
+    [6.421725738171608,  307.5310058593751],
+    [6.423818963102848,  308.17541503906244],
+    [6.428865255911759,  309.7344970703124],
+    [6.443449261058927,  314.28479003906244],
+    [6.444844602076255,  314.7236328125],
+    [6.464094341970107,  320.84069824218756],
+    [6.465356699668166,  321.24597167968744],
+    [6.467400466944125,  321.90319824218756],
+    [6.472218114936839,  323.457763671875],
+    [6.4947499213823265, 330.8286132812501],
+    [6.507305446835735,  335.00854492187483],
+    [6.524202033435675,  340.71716308593756],
+    [6.546694993078936,  348.46777343749994],
+    [6.548591493378012,  349.1292724609374],
+    [6.613194950203132,  372.4288330078126],
+    [6.6247505436339065, 376.7574462890626],
+    [6.629181796246806,  378.43066406249994],
+    [6.6616087711302185, 390.9031982421874],
+    [6.698989091751707,  405.79187011718744],
+    [6.702857353572475,  407.3646240234375],
+    [6.717505881986416,  413.37585449218756],
+    [6.723197804327891,  415.73547363281256],
+    [6.726699007993023,  417.1936035156251],
+    [6.735483889307782,  420.87475585937483],
+    [6.755219602793124,  429.26354980468756],
+    [6.756366380816258,  429.75610351562506],
+    [6.766177290841293,  433.99316406250006],
+    [6.766217511883346,  434.01062011718767],
+    [6.780091308338912,  440.0739746093749],
+    [6.802889310303153,  450.22204589843744],
+    [6.813484439494547,  455.017578125],
+    [6.818196843455478,  457.16687011718744],
+    [6.818940201487998,  457.50683593749994],
+    [6.822833193143805,  459.29138183593756],
+    [6.82327083544577,   459.49243164062506],
+    [6.823817951018,     459.743896484375],
+    [6.834945773756887,  464.8884277343749],
+    [6.835113285253827,  464.96630859375017],
+    [6.840964582694129,  467.6949462890624],
+    [6.84346890521034,   468.86767578125017],
+    [6.847141429556457,  470.5927734375002],
+    [6.869243403190376,  481.10961914062483],
+    [6.882355637062964,  487.4595947265624],
+    [6.884531678915821,  488.5214843750001],
+    [6.89341643293734,   492.8812255859376],
+    [6.895822338701104,  494.06848144531233],
+    [6.900653737167637,  496.46130371093733],
+    [7.2670429692740965, 716.1540527343751],
+    [8.188647968122073,  1799.925781250001],
+    [8.872023251113289,  3564.8457031250014],
+    [9.566596912986167,  7139.869140625004],
+    [10.092554861905608, 12081.222656249996],
+    [10.728112113864427, 22810.24218749999],
+    [11.442480870715618, 46598.96875000003],
+    [12.28759157077177,  108493.37500000009],
+    [12.636950838344218, 153860.81249999988],
+    [13.327813723030063, 307019.4999999998],
+    [14.126778167009777, 682577.25],
+    [15.090269265334971, 1788919.000000001],
+    [15.835512291283944, 3769169],
+    [15.973721689554742, 4327820.000000002],
+    [16.910547205715446, 11044023.999999983],
+    [17.573132558903225, 21423208.000000004],
+    [18.649063156437965, 62828288.00000006],
+    [18.760110887365155, 70207360.00000012],
+    [19.547111966180875, 154231424.00000012],
+    [20.193967491567523, 294509055.9999997],
+    [21.484592263156223, 1070557183.9999999],
+    [22.088297141021556, 1957922816.0000024],
+    [22.780591462699917, 3912507392.0000005],
+    [23.401438520318692, 7279233024.000007],
+    [23.684949498080787, 9665245184.000017],
+    [24.5355829820426,   22627590144.000004],
+    [25.520740767599584, 60601991168.00004],
+    [26.31438890085422,  134018236416.00002],
+    [26.73876398039979,  204864946175.99973],
+    [27.06660583008718,  284346286080.00024],
+    [28.234874284944635, 914576637951.9989],
+    [28.78280496108106,  1581915832319.9973]
+];
+
+for (let [x, y] of sinh_data)
+    assertNear(Math.sinh(x), y);
+
+reportCompare(0, 0, "ok");
+
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/sinh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.sinh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.sinh(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.sinh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.sinh(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.sinh(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.sinh(-Infinity), -Infinity);
+
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/tanh-approx.js
@@ -0,0 +1,277 @@
+for (var i = -20; i < 20; i++)
+    assertNear(Math.tanh(i), (Math.exp(i) - Math.exp(-i)) / (Math.exp(i) + Math.exp(-i)));
+
+assertEq(Math.tanh(1e300), 1);
+
+var tanh_data = [
+    [-0.9999983310699463, -6.998237084679027],
+    [-0.9999978542327881, -6.87257975132917],
+    [-0.999992847442627, -6.2705920974657525],
+    [-0.9999861717224121, -5.940967614084813],
+    [-0.9999828338623047, -5.832855225378502],
+    [-0.9999399185180664, -5.20646301208756],
+    [-0.9998834133148193, -4.8749821841810785],
+    [-0.9998509883880615, -4.752279497280338],
+    [-0.9996016025543213, -4.260504202858904],
+    [-0.9993612766265869, -4.0244334353203115],
+    [-0.9989283084869385, -3.7655641082999236],
+    [-0.9969782829284668, -3.246782610980921],
+    [-0.9950058460235596, -2.9950671179940938],
+    [-0.9942638874053955, -2.9256242749609536],
+    [-0.990715742111206, -2.6839646283308363],
+    [-0.9903340339660645, -2.663723350226518],
+    [-0.9760982990264893, -2.207464998348322],
+    [-0.975830078125, -2.201817459680556],
+    [-0.9728245735168457, -2.1424542308291437],
+    [-0.9643559455871582, -2.0046686756020917],
+    [-0.9377224445343018, -1.7188337346177065],
+    [-0.9362406730651855, -1.7066940482565154],
+    [-0.9310147762298584, -1.6659543005533146],
+    [-0.9284839630126953, -1.6472838718760747],
+    [-0.9270248413085938, -1.6368067340881562],
+    [-0.9075665473937988, -1.5135473477311114],
+    [-0.897477388381958, -1.4590986086331497],
+    [-0.8920106887817383, -1.431681573516303],
+    [-0.8776559829711914, -1.365471286049011],
+    [-0.864722728729248, -1.3117705583444539],
+    [-0.8482067584991455, -1.249725893334944],
+    [-0.8056559562683105, -1.1145246028592257],
+    [-0.8048388957977295, -1.112200609756455],
+    [-0.7801985740661621, -1.0458778330822556],
+    [-0.7749934196472168, -1.032711173436253],
+    [-0.7619285583496094, -1.0007967281362184],
+    [-0.7504425048828125, -0.9739672824457072],
+    [-0.7495596408843994, -0.9719492983286864],
+    [-0.7481319904327393, -0.968698942014487],
+    [-0.7459518909454346, -0.9637657636705832],
+    [-0.7401137351989746, -0.9507308314464193],
+    [-0.7289731502532959, -0.9265325319867653],
+    [-0.7226788997650146, -0.9132299082876396],
+    [-0.7161557674407959, -0.8997082193533088],
+    [-0.7017018795013428, -0.8706453720344796],
+    [-0.7013418674468994, -0.86993650130945],
+    [-0.691054105758667, -0.8499705913361888],
+    [-0.6847054958343506, -0.837919455842005],
+    [-0.6838164329528809, -0.8362476144993315],
+    [-0.6747090816497803, -0.8193374156276964],
+    [-0.6575610637664795, -0.7885046044142132],
+    [-0.6522045135498047, -0.7791255597799839],
+    [-0.6261923313140869, -0.7351275788820003],
+    [-0.623173713684082, -0.7301771459970386],
+    [-0.6067488193511963, -0.7037597526130627],
+    [-0.5838055610656738, -0.6682166303197608],
+    [-0.579524040222168, -0.6617457665293066],
+    [-0.5760939121246338, -0.656596458857398],
+    [-0.5654678344726562, -0.6408350116350283],
+    [-0.5578761100769043, -0.6297442839791668],
+    [-0.5523209571838379, -0.6217149641475687],
+    [-0.5396339893341064, -0.6036390747171698],
+    [-0.5128989219665527, -0.5666556256064771],
+    [-0.5087778568267822, -0.5610793900942042],
+    [-0.4977825880050659, -0.546353950571504],
+    [-0.4913865327835083, -0.5378865967606703],
+    [-0.48976075649261475, -0.5357455496477738],
+    [-0.48493504524230957, -0.5294166456244711],
+    [-0.4479050636291504, -0.4820764946679979],
+    [-0.4461095333099365, -0.4798325976916711],
+    [-0.4429593086242676, -0.47590653371561276],
+    [-0.42827916145324707, -0.45778739362936793],
+    [-0.40590059757232666, -0.4306933608076879],
+    [-0.40029656887054443, -0.4240020382545707],
+    [-0.3961341381072998, -0.4190551379319939],
+    [-0.3836275339126587, -0.40430627175908734],
+    [-0.36686253547668457, -0.3847928551425507],
+    [-0.3657644987106323, -0.38352464227459343],
+    [-0.33507001399993896, -0.3485286317501442],
+    [-0.32572221755981445, -0.3380352468276522],
+    [-0.3191967010498047, -0.3307524237890151],
+    [-0.3000025749206543, -0.3095224337886503],
+    [-0.29665136337280273, -0.3058438250228025],
+    [-0.2944457530975342, -0.3034271164344305],
+    [-0.2872810363769531, -0.29560018347246825],
+    [-0.27738428115844727, -0.28484608203169437],
+    [-0.2390844225883484, -0.2438028008332661],
+    [-0.23685944080352783, -0.24144425169391517],
+    [-0.2253856658935547, -0.2293228153248168],
+    [-0.22283810377120972, -0.22664053064745143],
+    [-0.21552443504333496, -0.21895773601143995],
+    [-0.2153375744819641, -0.21876178107952995],
+    [-0.21016258001327515, -0.21334143320771737],
+    [-0.20250272750854492, -0.2053409277979887],
+    [-0.19156384468078613, -0.19396008474133075],
+    [-0.18251943588256836, -0.18458771439322938],
+    [-0.17464947700500488, -0.17645844608618066],
+    [-0.15646183490753174, -0.15775766677189154],
+    [-0.15580910444259644, -0.15708862621964176],
+    [-0.15365445613861084, -0.15488112515549593],
+    [-0.122499018907547, -0.12311733609904851],
+    [-0.1088167130947113, -0.10924929296737837],
+    [-0.08792558312416077, -0.08815322150790302],
+    [-0.08401328325271606, -0.08421178632314608],
+    [-0.06121261417865753, -0.06128924075509796],
+    [-0.05341699719429016, -0.05346789060550386],
+    [-0.05047759413719177, -0.05052053189238029],
+    [-0.02924579381942749, -0.029254136237332657],
+    [-0.02485968917608261, -0.02486481220617492],
+    [-0.020469173789024353, -0.02047203328100153],
+    [-0.01882001757621765, -0.018822240021756347],
+    [-0.016152501106262207, -0.016153906073109205],
+    [-0.0032715508714318275, -0.003271562543358962],
+    [1.6504814008555524e-12, 1.6504814008555524e-12],
+    [2.0654207510961697e-12, 2.0654207510961697e-12],
+    [6.933230031758164e-12, 6.933230031758164e-12],
+    [1.3351444949627478e-11, 1.3351444949627478e-11],
+    [1.6399812063916386e-11, 1.6399812063916386e-11],
+    [5.730159402528301e-11, 5.730159402528301e-11],
+    [1.113731329382972e-10, 1.113731329382972e-10],
+    [1.4214707189097453e-10, 1.4214707189097453e-10],
+    [3.8006320313144215e-10, 3.8006320313144215e-10],
+    [6.09162720266454e-10, 6.09162720266454e-10],
+    [1.0221641311147778e-9, 1.0221641311147778e-9],
+    [2.8819222563924995e-9, 2.8819222563924995e-9],
+    [4.7627768395841485e-9, 4.7627768395841485e-9],
+    [8.854133426439148e-9, 8.854133426439148e-9],
+    [2.3050326092288742e-8, 2.3050326092288745e-8],
+    [5.9392490925347374e-8, 5.939249092534745e-8],
+    [1.166764889148908e-7, 1.1667648891489133e-7],
+    [2.3799674409019644e-7, 2.3799674409020094e-7],
+    [4.684659415943315e-7, 4.684659415943658e-7],
+    [9.382699772686465e-7, 9.382699772689218e-7],
+    [0.00000110398559627356, 0.0000011039855962740086],
+    [0.0000032917760108830407, 0.0000032917760108949305],
+    [0.00000751721381675452, 0.000007517213816896115],
+    [0.000015114666894078255, 0.000015114666895229252],
+    [0.00002986399340443313, 0.00002986399341331128],
+    [0.00003387028118595481, 0.000033870281198906756],
+    [0.00009066011989489198, 0.00009066012014327826],
+    [0.00021949532674625516, 0.0002194953302712184],
+    [0.00043952150736004114, 0.0004395215356621756],
+    [0.0006333151832222939, 0.0006333152678940465],
+    [0.001115123275667429, 0.0011151237378863419],
+    [0.001962467096745968, 0.001962469616086656],
+    [0.005553754046559334, 0.005553811147953338],
+    [0.007324676960706711, 0.0073248079567425],
+    [0.008691128343343735, 0.008691347183450786],
+    [0.011912941932678223, 0.011913505535037906],
+    [0.02993336319923401, 0.029942308168570204],
+    [0.05124260485172272, 0.05128752666822782],
+    [0.05473744869232178, 0.05479221508125444],
+    [0.06158891320228577, 0.061666963819518306],
+    [0.09375360608100891, 0.09402975380882211],
+    [0.09442159533500671, 0.09470370926367391],
+    [0.09443172812461853, 0.09471393321406026],
+    [0.09943729639053345, 0.09976699249016487],
+    [0.11201295256614685, 0.11248498303558895],
+    [0.12310260534286499, 0.12373016402339168],
+    [0.13562965393066406, 0.13647060950861248],
+    [0.13763350248336792, 0.13851257866094746],
+    [0.14749455451965332, 0.14857829980464834],
+    [0.1618971824645996, 0.16333433166790448],
+    [0.17051106691360474, 0.17219298693637355],
+    [0.17051833868026733, 0.17220047646299907],
+    [0.18562912940979004, 0.18780647318150087],
+    [0.18898820877075195, 0.1912876932893582],
+    [0.23206615447998047, 0.23637212433914523],
+    [0.23480379581451416, 0.2392675448267427],
+    [0.2646920680999756, 0.27114729033023005],
+    [0.2794986963272095, 0.2871382059344433],
+    [0.28789305686950684, 0.2962673858386819],
+    [0.292596697807312, 0.30140373665239234],
+    [0.3101649284362793, 0.320727882769785],
+    [0.3109246492385864, 0.3215686893944558],
+    [0.31145012378692627, 0.3221505056451929],
+    [0.3271782398223877, 0.3396649461699478],
+    [0.3574345111846924, 0.37394153436545424],
+    [0.3593693971633911, 0.37616159223090223],
+    [0.35960352420806885, 0.37643046596933716],
+    [0.3626827001571655, 0.3799714809649667],
+    [0.38961827754974365, 0.4113499159905353],
+    [0.3904266357421875, 0.41230330080214],
+    [0.3981136083602905, 0.4214052375603139],
+    [0.411507248878479, 0.43742438709579096],
+    [0.4120509624481201, 0.43807911823743495],
+    [0.41868770122528076, 0.4460997186945703],
+    [0.42136549949645996, 0.4493511447897729],
+    [0.4516327381134033, 0.48674948990473677],
+    [0.4538639783859253, 0.4895560176112375],
+    [0.4655507802963257, 0.5043748446613433],
+    [0.48124635219573975, 0.5246050193978663],
+    [0.48621630668640137, 0.5310932154891663],
+    [0.4898730516433716, 0.5358932909903701],
+    [0.5024838447570801, 0.5526234425942533],
+    [0.5074074268341064, 0.5592320547729962],
+    [0.5093221664428711, 0.5618140818296767],
+    [0.5143489837646484, 0.5686253097655146],
+    [0.5154285430908203, 0.5700943191671631],
+    [0.5234100818634033, 0.5810250825991418],
+    [0.5274472236633301, 0.5866018515043636],
+    [0.5309803485870361, 0.5915094458340507],
+    [0.5477793216705322, 0.6152030999229688],
+    [0.5577394962310791, 0.6295459624918965],
+    [0.5582785606384277, 0.6303287742357745],
+    [0.5843560695648193, 0.6690521906099505],
+    [0.5871362686157227, 0.6732844960442398],
+    [0.5878911018371582, 0.6744372167164567],
+    [0.5903406143188477, 0.6781887236623534],
+    [0.5945003032684326, 0.684597775489552],
+    [0.5957975387573242, 0.6866065102131665],
+    [0.5961520671844482, 0.6871563252400655],
+    [0.6005008220672607, 0.6939300827887145],
+    [0.6150004863739014, 0.7169242329194352],
+    [0.6162893772125244, 0.7189998055497108],
+    [0.6194069385528564, 0.7240422748778544],
+    [0.6285066604614258, 0.7389438896054792],
+    [0.6293842792510986, 0.7403958734869583],
+    [0.6416172981262207, 0.7609178886018204],
+    [0.6424276828765869, 0.7622965466812235],
+    [0.6437420845031738, 0.7645378650643101],
+    [0.6468508243560791, 0.769864795178161],
+    [0.6615910530090332, 0.7956379107512945],
+    [0.669950008392334, 0.8106524185805045],
+    [0.6813662052154541, 0.8316597473423232],
+    [0.6968657970428467, 0.8611812790659296],
+    [0.6981887817382812, 0.8637579113749143],
+    [0.7447831630706787, 0.9611360201710216],
+    [0.7518312931060791, 0.9771540941752986],
+    [0.7534394264221191, 0.9808634133542229],
+    [0.7567856311798096, 0.9886489208209699],
+    [0.7817282676696777, 1.0497991719828956],
+    [0.8115026950836182, 1.1314141444187586],
+    [0.814647912979126, 1.1406947755584418],
+    [0.8266689777374268, 1.1775230833699681],
+    [0.8313877582550049, 1.1926138225701433],
+    [0.8343038558959961, 1.2021323323039612],
+    [0.8416652679443359, 1.2268570644335162],
+    [0.8584413528442383, 1.2873896671573652],
+    [0.8678996562957764, 1.3245040433929398],
+    [0.8679344654083252, 1.3246451309261607],
+    [0.8800599575042725, 1.3760334877782177],
+    [0.9003539085388184, 1.4740852961194106],
+    [0.9099440574645996, 1.5271990851861994],
+    [0.9142425060272217, 1.5527768948273004],
+    [0.9149219989776611, 1.556931837197936],
+    [0.9184908866882324, 1.5792896628381612],
+    [0.9188928604125977, 1.5818663359427627],
+    [0.919395923614502, 1.5851082843320008],
+    [0.9296839237213135, 1.6560555223295368],
+    [0.9298396110534668, 1.6572041418041492],
+    [0.9352962970733643, 1.6990986433619266],
+    [0.9376416206359863, 1.718164398807965],
+    [0.9410912990570068, 1.7475084077246632],
+    [0.962122917175293, 1.9737180163455101],
+    [0.9748215675354004, 2.1811227771083783],
+    [0.9769454002380371, 2.2257214499698255],
+    [0.985663890838623, 2.4654635601650536],
+    [0.9880380630493164, 2.5565869228142004],
+    [0.9928233623504639, 2.8132383539094192],
+    [1e-300, 1e-300],
+    [0.00001, 0.000010000000000333334],
+    [0.3, 0.3095196042031117],
+    [1e-30, 1e-30],
+    [1e-10, 1e-10],
+];
+
+for (let [x, y] of tanh_data)
+    assertNear(Math.tanh(y), x);
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/tanh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.tanh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.tanh(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.tanh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.tanh(-0), -0);
+
+// If x is +∞, the result is +1.
+assertEq(Math.tanh(Number.POSITIVE_INFINITY), +1);
+
+// If x is −∞, the result is -1.
+assertEq(Math.tanh(Number.NEGATIVE_INFINITY), -1);
+
+
+reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/Math/trunc.js
@@ -0,0 +1,50 @@
+// If x is NaN, the result is NaN.
+assertEq(Math.trunc(NaN), NaN);
+
+// If x is −0, the result is −0.
+assertEq(Math.trunc(-0), -0);
+
+// If x is +0, the result is +0.
+assertEq(Math.trunc(+0), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.trunc(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.trunc(-Infinity), -Infinity);
+
+// Other boundary cases.
+var MAX_NONINTEGER_VALUE       = 4503599627370495.5;
+var TRUNC_MAX_NONINTEGER_VALUE = 4503599627370495;
+
+assertEq(Math.trunc(Number.MIN_VALUE), +0);
+assertEq(Math.trunc(ONE_MINUS_EPSILON), +0);
+assertEq(Math.trunc(ONE_PLUS_EPSILON), 1);
+assertEq(Math.trunc(MAX_NONINTEGER_VALUE), TRUNC_MAX_NONINTEGER_VALUE);
+assertEq(Math.trunc(Number.MAX_VALUE), Number.MAX_VALUE);
+
+assertEq(Math.trunc(-Number.MIN_VALUE), -0);
+assertEq(Math.trunc(-ONE_MINUS_EPSILON), -0);
+assertEq(Math.trunc(-ONE_PLUS_EPSILON), -1);
+assertEq(Math.trunc(-MAX_NONINTEGER_VALUE), -TRUNC_MAX_NONINTEGER_VALUE);
+assertEq(Math.trunc(-Number.MAX_VALUE), -Number.MAX_VALUE);
+
+// Other cases.
+for (var i = 1, f = 1.1; i < 20; i++, f += 1.0)
+    assertEq(Math.trunc(f), i);
+
+for (var i = -1, f = -1.1; i > -20; i--, f -= 1.0)
+    assertEq(Math.trunc(f), i);
+
+assertEq(Math.trunc(1e40 + 0.5), 1e40);
+
+assertEq(Math.trunc(1e300), 1e300);
+assertEq(Math.trunc(-1e300), -1e300);
+assertEq(Math.trunc(1e-300), 0);
+assertEq(Math.trunc(-1e-300), -0);
+
+assertEq(Math.trunc(+0.9999), +0);
+assertEq(Math.trunc(-0.9999), -0);
+
+
+reportCompare(0, 0, "ok");
--- a/js/src/tests/ecma_6/shell.js
+++ b/js/src/tests/ecma_6/shell.js
@@ -0,0 +1,12 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// explicitly turn on js185
+if (typeof version != 'undefined')
+{
+  version(185);
+}
+