Index: src/third_party/fdlibm/fdlibm.js |
diff --git a/src/third_party/fdlibm/fdlibm.js b/src/third_party/fdlibm/fdlibm.js |
index de7133405bc83620da60eb972557a6ed0d44d74d..4c8d201eebccec8951f1e89b19cc0617c9ee59ba 100644 |
--- a/src/third_party/fdlibm/fdlibm.js |
+++ b/src/third_party/fdlibm/fdlibm.js |
@@ -134,103 +134,6 @@ macro REMPIO2(X) |
endmacro |
-// __kernel_sin(X, Y, IY) |
-// kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854 |
-// Input X is assumed to be bounded by ~pi/4 in magnitude. |
-// Input Y is the tail of X so that x = X + Y. |
-// |
-// Algorithm |
-// 1. Since ieee_sin(-x) = -ieee_sin(x), we need only to consider positive x. |
-// 2. ieee_sin(x) is approximated by a polynomial of degree 13 on |
-// [0,pi/4] |
-// 3 13 |
-// sin(x) ~ x + S1*x + ... + S6*x |
-// where |
-// |
-// |ieee_sin(x) 2 4 6 8 10 12 | -58 |
-// |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2 |
-// | x | |
-// |
-// 3. ieee_sin(X+Y) = ieee_sin(X) + sin'(X')*Y |
-// ~ ieee_sin(X) + (1-X*X/2)*Y |
-// For better accuracy, let |
-// 3 2 2 2 2 |
-// r = X *(S2+X *(S3+X *(S4+X *(S5+X *S6)))) |
-// then 3 2 |
-// sin(x) = X + (S1*X + (X *(r-Y/2)+Y)) |
-// |
-define S1 = -1.66666666666666324348e-01; |
-define S2 = 8.33333333332248946124e-03; |
-define S3 = -1.98412698298579493134e-04; |
-define S4 = 2.75573137070700676789e-06; |
-define S5 = -2.50507602534068634195e-08; |
-define S6 = 1.58969099521155010221e-10; |
- |
-macro RETURN_KERNELSIN(X, Y, SIGN) |
- var z = X * X; |
- var v = z * X; |
- var r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6))); |
- return (X - ((z * (0.5 * Y - v * r) - Y) - v * S1)) SIGN; |
-endmacro |
- |
-// __kernel_cos(X, Y) |
-// kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164 |
-// Input X is assumed to be bounded by ~pi/4 in magnitude. |
-// Input Y is the tail of X so that x = X + Y. |
-// |
-// Algorithm |
-// 1. Since ieee_cos(-x) = ieee_cos(x), we need only to consider positive x. |
-// 2. ieee_cos(x) is approximated by a polynomial of degree 14 on |
-// [0,pi/4] |
-// 4 14 |
-// cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x |
-// where the remez error is |
-// |
-// | 2 4 6 8 10 12 14 | -58 |
-// |ieee_cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2 |
-// | | |
-// |
-// 4 6 8 10 12 14 |
-// 3. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then |
-// ieee_cos(x) = 1 - x*x/2 + r |
-// since ieee_cos(X+Y) ~ ieee_cos(X) - ieee_sin(X)*Y |
-// ~ ieee_cos(X) - X*Y, |
-// a correction term is necessary in ieee_cos(x) and hence |
-// cos(X+Y) = 1 - (X*X/2 - (r - X*Y)) |
-// For better accuracy when x > 0.3, let qx = |x|/4 with |
-// the last 32 bits mask off, and if x > 0.78125, let qx = 0.28125. |
-// Then |
-// cos(X+Y) = (1-qx) - ((X*X/2-qx) - (r-X*Y)). |
-// Note that 1-qx and (X*X/2-qx) is EXACT here, and the |
-// magnitude of the latter is at least a quarter of X*X/2, |
-// thus, reducing the rounding error in the subtraction. |
-// |
-define C1 = 4.16666666666666019037e-02; |
-define C2 = -1.38888888888741095749e-03; |
-define C3 = 2.48015872894767294178e-05; |
-define C4 = -2.75573143513906633035e-07; |
-define C5 = 2.08757232129817482790e-09; |
-define C6 = -1.13596475577881948265e-11; |
- |
-macro RETURN_KERNELCOS(X, Y, SIGN) |
- var ix = %_DoubleHi(X) & 0x7fffffff; |
- var z = X * X; |
- var r = z * (C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * C6))))); |
- if (ix < 0x3fd33333) { // |x| ~< 0.3 |
- return (1 - (0.5 * z - (z * r - X * Y))) SIGN; |
- } else { |
- var qx; |
- if (ix > 0x3fe90000) { // |x| > 0.78125 |
- qx = 0.28125; |
- } else { |
- qx = %_ConstructDouble(%_DoubleHi(0.25 * X), 0); |
- } |
- var hz = 0.5 * z - qx; |
- return (1 - qx - (hz - (z * r - X * Y))) SIGN; |
- } |
-endmacro |
- |
- |
// kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854 |
// Input x is assumed to be bounded by ~pi/4 in magnitude. |
// Input y is the tail of x. |
@@ -345,47 +248,6 @@ function KernelTan(x, y, returnTan) { |
} |
} |
-function MathSinSlow(x) { |
- REMPIO2(x); |
- var sign = 1 - (n & 2); |
- if (n & 1) { |
- RETURN_KERNELCOS(y0, y1, * sign); |
- } else { |
- RETURN_KERNELSIN(y0, y1, * sign); |
- } |
-} |
- |
-function MathCosSlow(x) { |
- REMPIO2(x); |
- if (n & 1) { |
- var sign = (n & 2) - 1; |
- RETURN_KERNELSIN(y0, y1, * sign); |
- } else { |
- var sign = 1 - (n & 2); |
- RETURN_KERNELCOS(y0, y1, * sign); |
- } |
-} |
- |
-// ECMA 262 - 15.8.2.16 |
-function MathSin(x) { |
- x = +x; // Convert to number. |
- if ((%_DoubleHi(x) & 0x7fffffff) <= 0x3fe921fb) { |
- // |x| < pi/4, approximately. No reduction needed. |
- RETURN_KERNELSIN(x, 0, /* empty */); |
- } |
- return +MathSinSlow(x); |
-} |
- |
-// ECMA 262 - 15.8.2.7 |
-function MathCos(x) { |
- x = +x; // Convert to number. |
- if ((%_DoubleHi(x) & 0x7fffffff) <= 0x3fe921fb) { |
- // |x| < pi/4, approximately. No reduction needed. |
- RETURN_KERNELCOS(x, 0, /* empty */); |
- } |
- return +MathCosSlow(x); |
-} |
- |
// ECMA 262 - 15.8.2.18 |
function MathTan(x) { |
x = x * 1; // Convert to number. |
@@ -564,15 +426,10 @@ function MathTanh(x) { |
//------------------------------------------------------------------- |
utils.InstallFunctions(GlobalMath, DONT_ENUM, [ |
- "cos", MathCos, |
- "sin", MathSin, |
"tan", MathTan, |
"sinh", MathSinh, |
"cosh", MathCosh, |
"tanh", MathTanh |
]); |
-%SetForceInlineFlag(MathSin); |
-%SetForceInlineFlag(MathCos); |
- |
}) |