--- /dev/null
+diff -Nrup a/math/libm-test.inc b/math/libm-test.inc
+--- a/math/libm-test.inc 2010-05-04 05:27:23.000000000 -0600
++++ b/math/libm-test.inc 2012-08-06 09:54:00.821929695 -0600
+@@ -2018,6 +2018,142 @@ cos_test (void)
+
+
+ static void
++cos_test_tonearest (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(cos) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (cos_tonearest);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TONEAREST))
++ {
++ TEST_f_f (cos, 1, 0.5403023058681397174009366074429766037323L);
++ TEST_f_f (cos, 2, -0.4161468365471423869975682295007621897660L);
++ TEST_f_f (cos, 3, -0.9899924966004454572715727947312613023937L);
++ TEST_f_f (cos, 4, -0.6536436208636119146391681830977503814241L);
++ TEST_f_f (cos, 5, 0.2836621854632262644666391715135573083344L);
++ TEST_f_f (cos, 6, 0.9601702866503660205456522979229244054519L);
++ TEST_f_f (cos, 7, 0.7539022543433046381411975217191820122183L);
++ TEST_f_f (cos, 8, -0.1455000338086135258688413818311946826093L);
++ TEST_f_f (cos, 9, -0.9111302618846769883682947111811653112463L);
++ TEST_f_f (cos, 10, -0.8390715290764524522588639478240648345199L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (cos_tonearest);
++}
++
++
++static void
++cos_test_towardzero (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(cos) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (cos_towardzero);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TOWARDZERO))
++ {
++ TEST_f_f (cos, 1, 0.5403023058681397174009366074429766037323L);
++ TEST_f_f (cos, 2, -0.4161468365471423869975682295007621897660L);
++ TEST_f_f (cos, 3, -0.9899924966004454572715727947312613023937L);
++ TEST_f_f (cos, 4, -0.6536436208636119146391681830977503814241L);
++ TEST_f_f (cos, 5, 0.2836621854632262644666391715135573083344L);
++ TEST_f_f (cos, 6, 0.9601702866503660205456522979229244054519L);
++ TEST_f_f (cos, 7, 0.7539022543433046381411975217191820122183L);
++ TEST_f_f (cos, 8, -0.1455000338086135258688413818311946826093L);
++ TEST_f_f (cos, 9, -0.9111302618846769883682947111811653112463L);
++ TEST_f_f (cos, 10, -0.8390715290764524522588639478240648345199L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (cos_towardzero);
++}
++
++
++static void
++cos_test_downward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(cos) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (cos_downward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_DOWNWARD))
++ {
++ TEST_f_f (cos, 1, 0.5403023058681397174009366074429766037323L);
++ TEST_f_f (cos, 2, -0.4161468365471423869975682295007621897660L);
++ TEST_f_f (cos, 3, -0.9899924966004454572715727947312613023937L);
++ TEST_f_f (cos, 4, -0.6536436208636119146391681830977503814241L);
++ TEST_f_f (cos, 5, 0.2836621854632262644666391715135573083344L);
++ TEST_f_f (cos, 6, 0.9601702866503660205456522979229244054519L);
++ TEST_f_f (cos, 7, 0.7539022543433046381411975217191820122183L);
++ TEST_f_f (cos, 8, -0.1455000338086135258688413818311946826093L);
++ TEST_f_f (cos, 9, -0.9111302618846769883682947111811653112463L);
++ TEST_f_f (cos, 10, -0.8390715290764524522588639478240648345199L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (cos_downward);
++}
++
++
++static void
++cos_test_upward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(cos) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (cos_upward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_UPWARD))
++ {
++ TEST_f_f (cos, 1, 0.5403023058681397174009366074429766037323L);
++ TEST_f_f (cos, 2, -0.4161468365471423869975682295007621897660L);
++ TEST_f_f (cos, 3, -0.9899924966004454572715727947312613023937L);
++ TEST_f_f (cos, 4, -0.6536436208636119146391681830977503814241L);
++ TEST_f_f (cos, 5, 0.2836621854632262644666391715135573083344L);
++ TEST_f_f (cos, 6, 0.9601702866503660205456522979229244054519L);
++ TEST_f_f (cos, 7, 0.7539022543433046381411975217191820122183L);
++ TEST_f_f (cos, 8, -0.1455000338086135258688413818311946826093L);
++ TEST_f_f (cos, 9, -0.9111302618846769883682947111811653112463L);
++ TEST_f_f (cos, 10, -0.8390715290764524522588639478240648345199L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (cos_upward);
++}
++
++
++static void
+ cosh_test (void)
+ {
+ errno = 0;
+@@ -2043,6 +2179,114 @@ cosh_test (void)
+
+
+ static void
++cosh_test_tonearest (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(cosh) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (cosh_tonearest);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TONEAREST))
++ {
++ TEST_f_f (cosh, 22, 1792456423.065795780980053377632656584997L);
++ TEST_f_f (cosh, 23, 4872401723.124451300068625740569997090344L);
++ TEST_f_f (cosh, 24, 13244561064.92173614708845674912733665919L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (cosh_tonearest);
++}
++
++
++static void
++cosh_test_towardzero (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(cosh) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (cosh_towardzero);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TOWARDZERO))
++ {
++ TEST_f_f (cosh, 22, 1792456423.065795780980053377632656584997L);
++ TEST_f_f (cosh, 23, 4872401723.124451300068625740569997090344L);
++ TEST_f_f (cosh, 24, 13244561064.92173614708845674912733665919L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (cosh_towardzero);
++}
++
++
++static void
++cosh_test_downward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(cosh) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (cosh_downward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_DOWNWARD))
++ {
++ TEST_f_f (cosh, 22, 1792456423.065795780980053377632656584997L);
++ TEST_f_f (cosh, 23, 4872401723.124451300068625740569997090344L);
++ TEST_f_f (cosh, 24, 13244561064.92173614708845674912733665919L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (cosh_downward);
++}
++
++
++static void
++cosh_test_upward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(cosh) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (cosh_upward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_UPWARD))
++ {
++ TEST_f_f (cosh, 22, 1792456423.065795780980053377632656584997L);
++ TEST_f_f (cosh, 23, 4872401723.124451300068625740569997090344L);
++ TEST_f_f (cosh, 24, 13244561064.92173614708845674912733665919L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (cosh_upward);
++}
++
++
++static void
+ cpow_test (void)
+ {
+ errno = 0;
+@@ -2527,6 +2771,114 @@ exp_test (void)
+
+
+ static void
++exp_test_tonearest (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(exp) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (exp_tonearest);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TONEAREST))
++ {
++ TEST_f_f (exp, 1, M_El);
++ TEST_f_f (exp, 2, M_E2l);
++ TEST_f_f (exp, 3, M_E3l);
++ }
++
++ fesetround (save_round_mode);
++
++ END (exp_tonearest);
++}
++
++
++static void
++exp_test_towardzero (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(exp) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (exp_towardzero);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TOWARDZERO))
++ {
++ TEST_f_f (exp, 1, M_El);
++ TEST_f_f (exp, 2, M_E2l);
++ TEST_f_f (exp, 3, M_E3l);
++ }
++
++ fesetround (save_round_mode);
++
++ END (exp_towardzero);
++}
++
++
++static void
++exp_test_downward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(exp) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (exp_downward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_DOWNWARD))
++ {
++ TEST_f_f (exp, 1, M_El);
++ TEST_f_f (exp, 2, M_E2l);
++ TEST_f_f (exp, 3, M_E3l);
++ }
++
++ fesetround (save_round_mode);
++
++ END (exp_downward);
++}
++
++
++static void
++exp_test_upward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(exp) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (exp_upward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_UPWARD))
++ {
++ TEST_f_f (exp, 1, M_El);
++ TEST_f_f (exp, 2, M_E2l);
++ TEST_f_f (exp, 3, M_E3l);
++ }
++
++ fesetround (save_round_mode);
++
++ END (exp_upward);
++}
++
++
++static void
+ exp10_test (void)
+ {
+ errno = 0;
+@@ -4848,22 +5200,127 @@ pow_test (void)
+ END (pow);
+ }
+
++
+ static void
+-remainder_test (void)
++pow_test_tonearest (void)
+ {
++ int save_round_mode;
+ errno = 0;
+- FUNC(remainder) (1.625, 1.0);
++ FUNC(pow) (0, 0);
+ if (errno == ENOSYS)
+ /* Function not implemented. */
+ return;
+
+- START (remainder);
++ START (pow_tonearest);
+
+- TEST_ff_f (remainder, 1, 0, nan_value, INVALID_EXCEPTION);
+- TEST_ff_f (remainder, 1, minus_zero, nan_value, INVALID_EXCEPTION);
+- TEST_ff_f (remainder, plus_infty, 1, nan_value, INVALID_EXCEPTION);
+- TEST_ff_f (remainder, minus_infty, 1, nan_value, INVALID_EXCEPTION);
+- TEST_ff_f (remainder, nan_value, nan_value, nan_value);
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TONEAREST))
++ {
++ TEST_ff_f (pow, 1.0625L, 1.125L, 1.070582293028761362162622578677070098674L);
++ TEST_ff_f (pow, 1.5L, 1.03125L, 1.519127098714743184071644334163037684948L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (pow_tonearest);
++}
++
++
++static void
++pow_test_towardzero (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(pow) (0, 0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (pow_towardzero);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TOWARDZERO))
++ {
++ TEST_ff_f (pow, 1.0625L, 1.125L, 1.070582293028761362162622578677070098674L);
++ TEST_ff_f (pow, 1.5L, 1.03125L, 1.519127098714743184071644334163037684948L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (pow_towardzero);
++}
++
++
++static void
++pow_test_downward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(pow) (0, 0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (pow_downward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_DOWNWARD))
++ {
++ TEST_ff_f (pow, 1.0625L, 1.125L, 1.070582293028761362162622578677070098674L);
++ TEST_ff_f (pow, 1.5L, 1.03125L, 1.519127098714743184071644334163037684948L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (pow_downward);
++}
++
++
++static void
++pow_test_upward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(pow) (0, 0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (pow_upward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_UPWARD))
++ {
++ TEST_ff_f (pow, 1.0625L, 1.125L, 1.070582293028761362162622578677070098674L);
++ TEST_ff_f (pow, 1.5L, 1.03125L, 1.519127098714743184071644334163037684948L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (pow_upward);
++}
++
++
++static void
++remainder_test (void)
++{
++ errno = 0;
++ FUNC(remainder) (1.625, 1.0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (remainder);
++
++ TEST_ff_f (remainder, 1, 0, nan_value, INVALID_EXCEPTION);
++ TEST_ff_f (remainder, 1, minus_zero, nan_value, INVALID_EXCEPTION);
++ TEST_ff_f (remainder, plus_infty, 1, nan_value, INVALID_EXCEPTION);
++ TEST_ff_f (remainder, minus_infty, 1, nan_value, INVALID_EXCEPTION);
++ TEST_ff_f (remainder, nan_value, nan_value, nan_value);
+
+ TEST_ff_f (remainder, 1.625, 1.0, -0.375);
+ TEST_ff_f (remainder, -1.625, 1.0, 0.375);
+@@ -5545,6 +6002,7 @@ sin_test (void)
+
+ #ifdef TEST_DOUBLE
+ TEST_f_f (sin, 0.80190127184058835, 0.71867942238767868);
++ TEST_f_f (sin, 2.522464e-1, 2.4957989804940911e-1);
+ #endif
+
+ END (sin);
+@@ -5553,6 +6011,142 @@ sin_test (void)
+
+
+ static void
++sin_test_tonearest (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(sin) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (sin_tonearest);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TONEAREST))
++ {
++ TEST_f_f (sin, 1, 0.8414709848078965066525023216302989996226L);
++ TEST_f_f (sin, 2, 0.9092974268256816953960198659117448427023L);
++ TEST_f_f (sin, 3, 0.1411200080598672221007448028081102798469L);
++ TEST_f_f (sin, 4, -0.7568024953079282513726390945118290941359L);
++ TEST_f_f (sin, 5, -0.9589242746631384688931544061559939733525L);
++ TEST_f_f (sin, 6, -0.2794154981989258728115554466118947596280L);
++ TEST_f_f (sin, 7, 0.6569865987187890903969990915936351779369L);
++ TEST_f_f (sin, 8, 0.9893582466233817778081235982452886721164L);
++ TEST_f_f (sin, 9, 0.4121184852417565697562725663524351793439L);
++ TEST_f_f (sin, 10, -0.5440211108893698134047476618513772816836L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (sin_tonearest);
++}
++
++
++static void
++sin_test_towardzero (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(sin) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (sin_towardzero);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TOWARDZERO))
++ {
++ TEST_f_f (sin, 1, 0.8414709848078965066525023216302989996226L);
++ TEST_f_f (sin, 2, 0.9092974268256816953960198659117448427023L);
++ TEST_f_f (sin, 3, 0.1411200080598672221007448028081102798469L);
++ TEST_f_f (sin, 4, -0.7568024953079282513726390945118290941359L);
++ TEST_f_f (sin, 5, -0.9589242746631384688931544061559939733525L);
++ TEST_f_f (sin, 6, -0.2794154981989258728115554466118947596280L);
++ TEST_f_f (sin, 7, 0.6569865987187890903969990915936351779369L);
++ TEST_f_f (sin, 8, 0.9893582466233817778081235982452886721164L);
++ TEST_f_f (sin, 9, 0.4121184852417565697562725663524351793439L);
++ TEST_f_f (sin, 10, -0.5440211108893698134047476618513772816836L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (sin_towardzero);
++}
++
++
++static void
++sin_test_downward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(sin) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (sin_downward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_DOWNWARD))
++ {
++ TEST_f_f (sin, 1, 0.8414709848078965066525023216302989996226L);
++ TEST_f_f (sin, 2, 0.9092974268256816953960198659117448427023L);
++ TEST_f_f (sin, 3, 0.1411200080598672221007448028081102798469L);
++ TEST_f_f (sin, 4, -0.7568024953079282513726390945118290941359L);
++ TEST_f_f (sin, 5, -0.9589242746631384688931544061559939733525L);
++ TEST_f_f (sin, 6, -0.2794154981989258728115554466118947596280L);
++ TEST_f_f (sin, 7, 0.6569865987187890903969990915936351779369L);
++ TEST_f_f (sin, 8, 0.9893582466233817778081235982452886721164L);
++ TEST_f_f (sin, 9, 0.4121184852417565697562725663524351793439L);
++ TEST_f_f (sin, 10, -0.5440211108893698134047476618513772816836L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (sin_downward);
++}
++
++
++static void
++sin_test_upward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(sin) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (sin_upward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_UPWARD))
++ {
++ TEST_f_f (sin, 1, 0.8414709848078965066525023216302989996226L);
++ TEST_f_f (sin, 2, 0.9092974268256816953960198659117448427023L);
++ TEST_f_f (sin, 3, 0.1411200080598672221007448028081102798469L);
++ TEST_f_f (sin, 4, -0.7568024953079282513726390945118290941359L);
++ TEST_f_f (sin, 5, -0.9589242746631384688931544061559939733525L);
++ TEST_f_f (sin, 6, -0.2794154981989258728115554466118947596280L);
++ TEST_f_f (sin, 7, 0.6569865987187890903969990915936351779369L);
++ TEST_f_f (sin, 8, 0.9893582466233817778081235982452886721164L);
++ TEST_f_f (sin, 9, 0.4121184852417565697562725663524351793439L);
++ TEST_f_f (sin, 10, -0.5440211108893698134047476618513772816836L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (sin_upward);
++}
++
++
++static void
+ sincos_test (void)
+ {
+ FLOAT sin_res, cos_res;
+@@ -5610,6 +6204,115 @@ sinh_test (void)
+ END (sinh);
+ }
+
++
++static void
++sinh_test_tonearest (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(sinh) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (sinh_tonearest);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TONEAREST))
++ {
++ TEST_f_f (sinh, 22, 1792456423.065795780701106568345764104225L);
++ TEST_f_f (sinh, 23, 4872401723.124451299966006944252978187305L);
++ TEST_f_f (sinh, 24, 13244561064.92173614705070540368454568168L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (sinh_tonearest);
++}
++
++
++static void
++sinh_test_towardzero (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(sinh) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (sinh_towardzero);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TOWARDZERO))
++ {
++ TEST_f_f (sinh, 22, 1792456423.065795780701106568345764104225L);
++ TEST_f_f (sinh, 23, 4872401723.124451299966006944252978187305L);
++ TEST_f_f (sinh, 24, 13244561064.92173614705070540368454568168L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (sinh_towardzero);
++}
++
++
++static void
++sinh_test_downward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(sinh) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (sinh_downward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_DOWNWARD))
++ {
++ TEST_f_f (sinh, 22, 1792456423.065795780701106568345764104225L);
++ TEST_f_f (sinh, 23, 4872401723.124451299966006944252978187305L);
++ TEST_f_f (sinh, 24, 13244561064.92173614705070540368454568168L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (sinh_downward);
++}
++
++
++static void
++sinh_test_upward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(sinh) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (sinh_upward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_UPWARD))
++ {
++ TEST_f_f (sinh, 22, 1792456423.065795780701106568345764104225L);
++ TEST_f_f (sinh, 23, 4872401723.124451299966006944252978187305L);
++ TEST_f_f (sinh, 24, 13244561064.92173614705070540368454568168L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (sinh_upward);
++}
++
++
+ static void
+ sqrt_test (void)
+ {
+@@ -5673,6 +6376,143 @@ tan_test (void)
+ END (tan);
+ }
+
++
++static void
++tan_test_tonearest (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(tan) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (tan_tonearest);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TONEAREST))
++ {
++ TEST_f_f (tan, 1, 1.5574077246549022305069748074583601730873L);
++ TEST_f_f (tan, 2, -2.1850398632615189916433061023136825434320L);
++ TEST_f_f (tan, 3, -0.1425465430742778052956354105339134932261L);
++ TEST_f_f (tan, 4, 1.1578212823495775831373424182673239231198L);
++ TEST_f_f (tan, 5, -3.3805150062465856369827058794473439087096L);
++ TEST_f_f (tan, 6, -0.2910061913847491570536995888681755428312L);
++ TEST_f_f (tan, 7, 0.8714479827243187364564508896003135663222L);
++ TEST_f_f (tan, 8, -6.7997114552203786999252627596086333648814L);
++ TEST_f_f (tan, 9, -0.4523156594418098405903708757987855343087L);
++ TEST_f_f (tan, 10, 0.6483608274590866712591249330098086768169L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (tan_tonearest);
++}
++
++
++static void
++tan_test_towardzero (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(tan) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (tan_towardzero);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_TOWARDZERO))
++ {
++ TEST_f_f (tan, 1, 1.5574077246549022305069748074583601730873L);
++ TEST_f_f (tan, 2, -2.1850398632615189916433061023136825434320L);
++ TEST_f_f (tan, 3, -0.1425465430742778052956354105339134932261L);
++ TEST_f_f (tan, 4, 1.1578212823495775831373424182673239231198L);
++ TEST_f_f (tan, 5, -3.3805150062465856369827058794473439087096L);
++ TEST_f_f (tan, 6, -0.2910061913847491570536995888681755428312L);
++ TEST_f_f (tan, 7, 0.8714479827243187364564508896003135663222L);
++ TEST_f_f (tan, 8, -6.7997114552203786999252627596086333648814L);
++ TEST_f_f (tan, 9, -0.4523156594418098405903708757987855343087L);
++ TEST_f_f (tan, 10, 0.6483608274590866712591249330098086768169L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (tan_towardzero);
++}
++
++
++static void
++tan_test_downward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(tan) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (tan_downward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_DOWNWARD))
++ {
++ TEST_f_f (tan, 1, 1.5574077246549022305069748074583601730873L);
++ TEST_f_f (tan, 2, -2.1850398632615189916433061023136825434320L);
++ TEST_f_f (tan, 3, -0.1425465430742778052956354105339134932261L);
++ TEST_f_f (tan, 4, 1.1578212823495775831373424182673239231198L);
++ TEST_f_f (tan, 5, -3.3805150062465856369827058794473439087096L);
++ TEST_f_f (tan, 6, -0.2910061913847491570536995888681755428312L);
++ TEST_f_f (tan, 7, 0.8714479827243187364564508896003135663222L);
++ TEST_f_f (tan, 8, -6.7997114552203786999252627596086333648814L);
++ TEST_f_f (tan, 9, -0.4523156594418098405903708757987855343087L);
++ TEST_f_f (tan, 10, 0.6483608274590866712591249330098086768169L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (tan_downward);
++}
++
++
++static void
++tan_test_upward (void)
++{
++ int save_round_mode;
++ errno = 0;
++ FUNC(tan) (0);
++ if (errno == ENOSYS)
++ /* Function not implemented. */
++ return;
++
++ START (tan_upward);
++
++ save_round_mode = fegetround ();
++
++ if (!fesetround (FE_UPWARD))
++ {
++ TEST_f_f (tan, 1, 1.5574077246549022305069748074583601730873L);
++ TEST_f_f (tan, 2, -2.1850398632615189916433061023136825434320L);
++ TEST_f_f (tan, 3, -0.1425465430742778052956354105339134932261L);
++ TEST_f_f (tan, 4, 1.1578212823495775831373424182673239231198L);
++ TEST_f_f (tan, 5, -3.3805150062465856369827058794473439087096L);
++ TEST_f_f (tan, 6, -0.2910061913847491570536995888681755428312L);
++ TEST_f_f (tan, 7, 0.8714479827243187364564508896003135663222L);
++ TEST_f_f (tan, 8, -6.7997114552203786999252627596086333648814L);
++ TEST_f_f (tan, 9, -0.4523156594418098405903708757987855343087L);
++ TEST_f_f (tan, 10, 0.6483608274590866712591249330098086768169L);
++ }
++
++ fesetround (save_round_mode);
++
++ END (tan_upward);
++}
++
++
+ static void
+ tanh_test (void)
+ {
+@@ -6171,20 +7011,44 @@ main (int argc, char **argv)
+ atan_test ();
+ atan2_test ();
+ cos_test ();
++ cos_test_tonearest ();
++ cos_test_towardzero ();
++ cos_test_downward ();
++ cos_test_upward ();
+ sin_test ();
++ sin_test_tonearest ();
++ sin_test_towardzero ();
++ sin_test_downward ();
++ sin_test_upward ();
+ sincos_test ();
+ tan_test ();
++ tan_test_tonearest ();
++ tan_test_towardzero ();
++ tan_test_downward ();
++ tan_test_upward ();
+
+ /* Hyperbolic functions: */
+ acosh_test ();
+ asinh_test ();
+ atanh_test ();
+ cosh_test ();
++ cosh_test_tonearest ();
++ cosh_test_towardzero ();
++ cosh_test_downward ();
++ cosh_test_upward ();
+ sinh_test ();
++ sinh_test_tonearest ();
++ sinh_test_towardzero ();
++ sinh_test_downward ();
++ sinh_test_upward ();
+ tanh_test ();
+
+ /* Exponential and logarithmic functions: */
+ exp_test ();
++ exp_test_tonearest ();
++ exp_test_towardzero ();
++ exp_test_downward ();
++ exp_test_upward ();
+ exp10_test ();
+ exp2_test ();
+ expm1_test ();
+@@ -6207,6 +7071,10 @@ main (int argc, char **argv)
+ fabs_test ();
+ hypot_test ();
+ pow_test ();
++ pow_test_tonearest ();
++ pow_test_towardzero ();
++ pow_test_downward ();
++ pow_test_upward ();
+ sqrt_test ();
+
+ /* Error and gamma functions: */
+diff -Nrup a/math/math_private.h b/math/math_private.h
+--- a/math/math_private.h 2010-05-04 05:27:23.000000000 -0600
++++ b/math/math_private.h 2012-08-06 09:54:00.821929695 -0600
+@@ -357,4 +357,41 @@ extern void __docos (double __x, double
+ #define math_force_eval(x) __asm __volatile ("" : : "m" (x))
+ #endif
+
++
++/* The standards only specify one variant of the fenv.h interfaces.
++ But at least for some architectures we can be more efficient if we
++ know what operations are going to be performed. Therefore we
++ define additional interfaces. By default they refer to the normal
++ interfaces. */
++#define libc_fegetround() fegetround ()
++#define libc_fegetroundf() fegetround ()
++#define libc_fegetroundl() fegetround ()
++
++#define libc_fesetround(r) (void) fesetround (r)
++#define libc_fesetroundf(r) (void) fesetround (r)
++#define libc_fesetroundl(r) (void) fesetround (r)
++
++#define libc_feholdexcept(e) (void) feholdexcept (e)
++#define libc_feholdexceptf(e) (void) feholdexcept (e)
++#define libc_feholdexceptl(e) (void) feholdexcept (e)
++
++#define libc_feholdexcept_setround(e, r) \
++ do { feholdexcept (e); fesetround (r); } while (0)
++#define libc_feholdexcept_setroundf(e, r) \
++ do { feholdexcept (e); fesetround (r); } while (0)
++#define libc_feholdexcept_setroundl(e, r) \
++ do { feholdexcept (e); fesetround (r); } while (0)
++
++#define libc_fetestexcept(e) fetestexcept (e)
++#define libc_fetestexceptf(e) fetestexcept (e)
++#define libc_fetestexceptl(e) fetestexcept (e)
++
++#define libc_fesetenv(e) (void) fesetenv (e)
++#define libc_fesetenvf(e) (void) fesetenv (e)
++#define libc_fesetenvl(e) (void) fesetenv (e)
++
++#define libc_feupdateenv(e) (void) feupdateenv (e)
++#define libc_feupdateenvf(e) (void) feupdateenv (e)
++#define libc_feupdateenvl(e) (void) feupdateenv (e)
++
+ #endif /* _MATH_PRIVATE_H_ */
+diff -Nrup a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
+--- a/sysdeps/i386/fpu/libm-test-ulps 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/i386/fpu/libm-test-ulps 2012-08-06 11:29:16.370874961 -0600
+@@ -9,18 +9,12 @@ ldouble: 1
+ Test "asin (-0.5) == -pi/6":
+ ildouble: 1
+ ldouble: 1
+-Test "asin (-1.0) == -pi/2":
+-ildouble: 1
+-ldouble: 1
+ Test "asin (0.5) == pi/6":
+ ildouble: 1
+ ldouble: 1
+ Test "asin (0.75) == 0.848062078981481008052944338998418080":
+ ildouble: 1
+ ldouble: 1
+-Test "asin (1.0) == pi/2":
+-ildouble: 1
+-ldouble: 1
+
+ # atanh
+ Test "atanh (0.75) == 0.972955074527656652552676371721589865":
+@@ -35,20 +29,6 @@ ildouble: 2
+ ldouble: 2
+
+ # cacosh
+-Test "Real part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+-double: 1
+-float: 9
+-idouble: 1
+-ifloat: 9
+-ildouble: 6
+-ldouble: 6
+-Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+-double: 1
+-float: 4
+-idouble: 1
+-ifloat: 4
+-ildouble: 1
+-ldouble: 1
+ Test "Real part of: cacosh (0.75 + 1.25 i) == 1.13239363160530819522266333696834467 + 1.11752014915610270578240049553777969 i":
+ ildouble: 1
+ ldouble: 1
+@@ -124,8 +104,6 @@ ldouble: 1
+ Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i":
+ float: 1
+ ifloat: 1
+-ildouble: 1
+-ldouble: 1
+ Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i":
+ double: 1
+ idouble: 1
+@@ -149,9 +127,7 @@ float: 1
+ idouble: 1
+ ifloat: 1
+ Test "Imaginary part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+
+ # cexp
+@@ -186,8 +162,6 @@ ifloat: 1
+ Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i":
+ double: 1
+ idouble: 1
+-ildouble: 1
+-ldouble: 1
+ Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i":
+ double: 1
+ float: 1
+@@ -262,27 +236,175 @@ ifloat: 1
+ # cos
+ Test "cos (M_PI_6l * 2.0) == 0.5":
+ double: 1
+-float: 1
+ idouble: 1
+-ifloat: 1
+ Test "cos (M_PI_6l * 4.0) == -0.5":
+ double: 2
+ float: 1
+ idouble: 2
+ ifloat: 1
++
++# cos_downward
++Test "cos_downward (1) == 0.5403023058681397174009366074429766037323":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (10) == -0.8390715290764524522588639478240648345199":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++Test "cos_downward (3) == -0.9899924966004454572715727947312613023937":
++double: 1
++idouble: 1
++Test "cos_downward (4) == -0.6536436208636119146391681830977503814241":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (5) == 0.2836621854632262644666391715135573083344":
++float: 1
++ifloat: 1
++Test "cos_downward (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (8) == -0.1455000338086135258688413818311946826093":
++ildouble: 1
++ldouble: 1
++Test "cos_downward (9) == -0.9111302618846769883682947111811653112463":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# cos_tonearest
++Test "cos_tonearest (8) == -0.1455000338086135258688413818311946826093":
++ildouble: 1
++ldouble: 1
++Test "cos_tonearest (9) == -0.9111302618846769883682947111811653112463":
++ildouble: 1
++ldouble: 1
++
++# cos_towardzero
++Test "cos_towardzero (1) == 0.5403023058681397174009366074429766037323":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (10) == -0.8390715290764524522588639478240648345199":
+ ildouble: 1
+ ldouble: 1
+-Test "cos (pi/2) == 0":
++Test "cos_towardzero (2) == -0.4161468365471423869975682295007621897660":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
++Test "cos_towardzero (3) == -0.9899924966004454572715727947312613023937":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (4) == -0.6536436208636119146391681830977503814241":
++double: 1
++idouble: 1
++Test "cos_towardzero (5) == 0.2836621854632262644666391715135573083344":
++float: 1
++ifloat: 1
++Test "cos_towardzero (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (8) == -0.1455000338086135258688413818311946826093":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
+
+-# cosh
+-Test "cosh (0.75) == 1.29468328467684468784170818539018176":
++# cos_upward
++Test "cos_upward (1) == 0.5403023058681397174009366074429766037323":
++float: 1
++ifloat: 1
++Test "cos_upward (10) == -0.8390715290764524522588639478240648345199":
++ildouble: 1
++ldouble: 1
++Test "cos_upward (2) == -0.4161468365471423869975682295007621897660":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_upward (3) == -0.9899924966004454572715727947312613023937":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_upward (4) == -0.6536436208636119146391681830977503814241":
++double: 1
++idouble: 1
++Test "cos_upward (5) == 0.2836621854632262644666391715135573083344":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "cos_upward (6) == 0.9601702866503660205456522979229244054519":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
+ ildouble: 1
++ldouble: 1
++Test "cos_upward (7) == 0.7539022543433046381411975217191820122183":
++double: 1
++idouble: 1
++Test "cos_upward (8) == -0.1455000338086135258688413818311946826093":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++
++# cosh_downward
++Test "cosh_downward (22) == 1792456423.065795780980053377632656584997":
++double: 1
++float: 1
++ldouble: 2
++Test "cosh_downward (23) == 4872401723.124451300068625740569997090344":
++double: 1
++float: 1
++ldouble: 1
++Test "cosh_downward (24) == 13244561064.92173614708845674912733665919":
++float: 1
++ldouble: 1
++
++# cosh_tonearest
++Test "cosh_tonearest (22) == 1792456423.065795780980053377632656584997":
++ldouble: 1
++
++# cosh_towardzero
++Test "cosh_towardzero (22) == 1792456423.065795780980053377632656584997":
++double: 1
++float: 1
++ldouble: 2
++Test "cosh_towardzero (23) == 4872401723.124451300068625740569997090344":
++double: 1
++float: 1
++ldouble: 1
++Test "cosh_towardzero (24) == 13244561064.92173614708845674912733665919":
++float: 1
++ldouble: 1
++
++# cosh_upward
++Test "cosh_upward (23) == 4872401723.124451300068625740569997090344":
++ldouble: 1
++Test "cosh_upward (24) == 13244561064.92173614708845674912733665919":
++double: 1
+
+ # cpow
+ Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i":
+@@ -353,12 +475,8 @@ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-ildouble: 2
+-ldouble: 2
+ Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+@@ -370,40 +488,36 @@ ifloat: 1
+ Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i":
+ double: 1
+ idouble: 1
+-ildouble: 439
+-ldouble: 439
++ildouble: 1
++ldouble: 1
+ Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i":
+ float: 1
+ ifloat: 1
+-ildouble: 2
+-ldouble: 2
++ildouble: 1
++ldouble: 1
+ Test "Real part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i":
+ ildouble: 1
+ ldouble: 1
+ Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 3
+ ldouble: 3
+
+ # ctanh
+ Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i":
+-ildouble: 5
+-ldouble: 5
++ildouble: 3
++ldouble: 3
+ Test "Imaginary part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i":
+ float: 1
+ ifloat: 1
+-ildouble: 25
+-ldouble: 25
++ildouble: 1
++ldouble: 1
+ Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
+ float: 1
+ ifloat: 1
+ Test "Real part of: ctanh (0.75 + 1.25 i) == 1.37260757053378320258048606571226857 + 0.385795952609750664177596760720790220 i":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ Test "Imaginary part of: ctanh (0.75 + 1.25 i) == 1.37260757053378320258048606571226857 + 0.385795952609750664177596760720790220 i":
+ double: 1
+@@ -419,9 +533,6 @@ double: 1
+ idouble: 1
+
+ # erfc
+-Test "erfc (0.75) == 0.288844366346484868401062165408589223":
+-float: 1
+-ifloat: 1
+ Test "erfc (1.25) == 0.0770998717435417698634765188027188596":
+ ildouble: 1
+ ldouble: 1
+@@ -434,14 +545,6 @@ idouble: 1
+ ildouble: 1
+ ldouble: 1
+
+-# exp
+-Test "exp (0.75) == 2.11700001661267466854536981983709561":
+-ildouble: 1
+-Test "exp (1000.0) == 0.197007111401704699388887935224332313e435":
+-ildouble: 754
+-Test "exp (50.0) == 5184705528587072464087.45332293348538":
+-ildouble: 16
+-
+ # exp10
+ Test "exp10 (-1) == 0.1":
+ ildouble: 1
+@@ -453,6 +556,51 @@ Test "exp10 (3) == 1000":
+ ildouble: 8
+ ldouble: 8
+
++# exp_downward
++Test "exp_downward (1) == e":
++ildouble: 1
++ldouble: 1
++Test "exp_downward (2) == e^2":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "exp_downward (3) == e^3":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# exp_towardzero
++Test "exp_towardzero (1) == e":
++ildouble: 1
++ldouble: 1
++Test "exp_towardzero (2) == e^2":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "exp_towardzero (3) == e^3":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# exp_upward
++Test "exp_upward (1) == e":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++
+ # expm1
+ Test "expm1 (1) == M_El - 1.0":
+ ildouble: 1
+@@ -485,26 +633,24 @@ float: 1
+ # j0
+ Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "j0 (10.0) == -0.245935764451348335197760862485328754":
+-double: 3
++double: 1
+ float: 1
+-idouble: 3
++idouble: 1
+ ifloat: 1
+ Test "j0 (2.0) == 0.223890779141235668051827454649948626":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "j0 (8.0) == 0.171650807137553906090869407851972001":
+@@ -512,13 +658,8 @@ float: 1
+ ifloat: 1
+
+ # j1
+-Test "j1 (0.75) == 0.349243602174862192523281016426251335":
+-double: 1
+-idouble: 1
+ Test "j1 (10.0) == 0.0434727461688614366697487680258592883":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+@@ -526,9 +667,7 @@ Test "j1 (2.0) == 0.57672480775687338720
+ double: 1
+ idouble: 1
+ Test "j1 (8.0) == 0.234636346853914624381276651590454612":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+@@ -536,38 +675,31 @@ ldouble: 1
+ # jn
+ Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "jn (0, 10.0) == -0.245935764451348335197760862485328754":
+-double: 3
++double: 1
+ float: 1
+-idouble: 3
++idouble: 1
+ ifloat: 1
+ Test "jn (0, 2.0) == 0.223890779141235668051827454649948626":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "jn (0, 8.0) == 0.171650807137553906090869407851972001":
+ float: 1
+ ifloat: 1
+-Test "jn (1, 0.75) == 0.349243602174862192523281016426251335":
+-double: 1
+-idouble: 1
+ Test "jn (1, 10.0) == 0.0434727461688614366697487680258592883":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+@@ -575,9 +707,7 @@ Test "jn (1, 2.0) == 0.57672480775687338
+ double: 1
+ idouble: 1
+ Test "jn (1, 8.0) == 0.234636346853914624381276651590454612":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+@@ -589,9 +719,7 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "jn (10, 0.125) == 0.250543369809369890173993791865771547e-18":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ Test "jn (10, 0.75) == 0.149621713117596814698712483621682835e-10":
+ float: 1
+@@ -606,38 +734,32 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "jn (10, 10.0) == 0.207486106633358857697278723518753428":
+-double: 5
+-float: 2
+-idouble: 5
+-ifloat: 2
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
+ ildouble: 2
+ ldouble: 2
+ Test "jn (10, 2.0) == 0.251538628271673670963516093751820639e-6":
+-double: 2
+-idouble: 2
+ ildouble: 1
+ ldouble: 1
+ Test "jn (3, -1.0) == -0.0195633539826684059189053216217515083":
+ ildouble: 1
+ ldouble: 1
+ Test "jn (3, 0.75) == 0.848438342327410884392755236884386804e-2":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ Test "jn (3, 1.0) == 0.0195633539826684059189053216217515083":
+ ildouble: 1
+ ldouble: 1
+ Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563":
+-double: 5
+-float: 2
+-idouble: 5
+-ifloat: 2
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "jn (3, 2.0) == 0.128943249474402051098793332969239835":
+-double: 1
+-idouble: 1
+ ildouble: 1
+ ldouble: 1
+
+@@ -648,9 +770,7 @@ idouble: 1
+ ildouble: 1
+ ldouble: 1
+ Test "lgamma (0.7) == 0.260867246531666514385732417016759578":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1":
+ double: 1
+@@ -660,11 +780,6 @@ ifloat: 2
+ ildouble: 1
+ ldouble: 1
+
+-# log
+-Test "log (e) == 1":
+-float: 1
+-ifloat: 1
+-
+ # log10
+ Test "log10 (0.75) == -0.124938736608299953132449886193870744":
+ ildouble: 1
+@@ -675,20 +790,179 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+-# sincos
+-Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
++# pow_downward
++Test "pow_downward (1.0625, 1.125) == 1.070582293028761362162622578677070098674":
+ double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "pow_downward (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
+ float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# pow_towardzero
++Test "pow_towardzero (1.0625, 1.125) == 1.070582293028761362162622578677070098674":
++double: 1
+ idouble: 1
++ildouble: 1
++ldouble: 1
++Test "pow_towardzero (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
++float: 1
+ ifloat: 1
+-Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res":
++ildouble: 1
++ldouble: 1
++
++# pow_upward
++Test "pow_upward (1.0625, 1.125) == 1.070582293028761362162622578677070098674":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "pow_upward (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++
++# sin_downward
++Test "sin_downward (1) == 0.8414709848078965066525023216302989996226":
++ildouble: 1
++ldouble: 1
++Test "sin_downward (10) == -0.5440211108893698134047476618513772816836":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "sin_downward (2) == 0.9092974268256816953960198659117448427023":
++double: 1
++idouble: 1
++Test "sin_downward (3) == 0.1411200080598672221007448028081102798469":
++ildouble: 1
++ldouble: 1
++Test "sin_downward (4) == -0.7568024953079282513726390945118290941359":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "sin_downward (5) == -0.9589242746631384688931544061559939733525":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "sin_downward (6) == -0.2794154981989258728115554466118947596280":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
++Test "sin_downward (7) == 0.6569865987187890903969990915936351779369":
+ ildouble: 1
+ ldouble: 1
+-Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res":
++Test "sin_downward (8) == 0.9893582466233817778081235982452886721164":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "sin_downward (9) == 0.4121184852417565697562725663524351793439":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# sin_tonearest
++Test "sin_tonearest (10) == -0.5440211108893698134047476618513772816836":
++ildouble: 1
++ldouble: 1
++Test "sin_tonearest (4) == -0.7568024953079282513726390945118290941359":
++ildouble: 1
++ldouble: 1
++Test "sin_tonearest (9) == 0.4121184852417565697562725663524351793439":
++ildouble: 1
++ldouble: 1
++
++# sin_towardzero
++Test "sin_towardzero (1) == 0.8414709848078965066525023216302989996226":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (10) == -0.5440211108893698134047476618513772816836":
++float: 1
++ifloat: 1
++Test "sin_towardzero (2) == 0.9092974268256816953960198659117448427023":
++double: 1
++idouble: 1
++Test "sin_towardzero (3) == 0.1411200080598672221007448028081102798469":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (4) == -0.7568024953079282513726390945118290941359":
++float: 1
++ifloat: 1
++Test "sin_towardzero (5) == -0.9589242746631384688931544061559939733525":
++float: 1
++ifloat: 1
++Test "sin_towardzero (6) == -0.2794154981989258728115554466118947596280":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (7) == 0.6569865987187890903969990915936351779369":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (8) == 0.9893582466233817778081235982452886721164":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (9) == 0.4121184852417565697562725663524351793439":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# sin_upward
++Test "sin_upward (1) == 0.8414709848078965066525023216302989996226":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++Test "sin_upward (10) == -0.5440211108893698134047476618513772816836":
++float: 1
++ifloat: 1
++Test "sin_upward (2) == 0.9092974268256816953960198659117448427023":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sin_upward (3) == 0.1411200080598672221007448028081102798469":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++Test "sin_upward (4) == -0.7568024953079282513726390945118290941359":
++float: 1
++ifloat: 1
++Test "sin_upward (5) == -0.9589242746631384688931544061559939733525":
++float: 1
++ifloat: 1
++Test "sin_upward (6) == -0.2794154981989258728115554466118947596280":
++ildouble: 1
++ldouble: 1
++Test "sin_upward (7) == 0.6569865987187890903969990915936351779369":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++Test "sin_upward (8) == 0.9893582466233817778081235982452886721164":
++float: 1
++ifloat: 1
++
++# sincos
++Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
++double: 1
++idouble: 1
++Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res":
+ double: 1
+ float: 1
+ idouble: 1
+@@ -698,66 +972,237 @@ ldouble: 1
+
+ # sinh
+ Test "sinh (0.75) == 0.822316731935829980703661634446913849":
+-double: 1
+ ildouble: 1
+
+-# tan
+-Test "tan (pi/4) == 1":
++# sinh_downward
++Test "sinh_downward (22) == 1792456423.065795780701106568345764104225":
+ double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ldouble: 4
++Test "sinh_downward (23) == 4872401723.124451299966006944252978187305":
++double: 1
++float: 1
+ idouble: 1
++ifloat: 1
++Test "sinh_downward (24) == 13244561064.92173614705070540368454568168":
++float: 1
++ifloat: 1
++ldouble: 5
+
+-# tgamma
+-Test "tgamma (-0.5) == -2 sqrt (pi)":
+-double: 2
++# sinh_tonearest
++Test "sinh_tonearest (22) == 1792456423.065795780701106568345764104225":
++ldouble: 3
++Test "sinh_tonearest (23) == 4872401723.124451299966006944252978187305":
++ldouble: 1
++Test "sinh_tonearest (24) == 13244561064.92173614705070540368454568168":
++ldouble: 6
++
++# sinh_towardzero
++Test "sinh_towardzero (22) == 1792456423.065795780701106568345764104225":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ldouble: 4
++Test "sinh_towardzero (23) == 4872401723.124451299966006944252978187305":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++Test "sinh_towardzero (24) == 13244561064.92173614705070540368454568168":
++float: 1
++ifloat: 1
++ldouble: 5
++
++# sinh_upward
++Test "sinh_upward (22) == 1792456423.065795780701106568345764104225":
++ldouble: 16
++Test "sinh_upward (23) == 4872401723.124451299966006944252978187305":
++ldouble: 27
++Test "sinh_upward (24) == 13244561064.92173614705070540368454568168":
++double: 1
++idouble: 1
++ldouble: 7
++
++# tan_downward
++Test "tan_downward (1) == 1.5574077246549022305069748074583601730873":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++Test "tan_downward (10) == 0.6483608274590866712591249330098086768169":
++float: 1
++ifloat: 1
++Test "tan_downward (2) == -2.1850398632615189916433061023136825434320":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++Test "tan_downward (3) == -0.1425465430742778052956354105339134932261":
++double: 1
++idouble: 1
++Test "tan_downward (4) == 1.1578212823495775831373424182673239231198":
+ float: 1
+-idouble: 2
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "tgamma (0.5) == sqrt (pi)":
++Test "tan_downward (5) == -3.3805150062465856369827058794473439087096":
++ildouble: 1
++ldouble: 1
++Test "tan_downward (6) == -0.2910061913847491570536995888681755428312":
++double: 1
+ float: 1
++idouble: 1
+ ifloat: 1
+-Test "tgamma (0.7) == 1.29805533264755778568117117915281162":
++Test "tan_downward (7) == 0.8714479827243187364564508896003135663222":
++double: 1
++idouble: 1
++Test "tan_downward (8) == -6.7997114552203786999252627596086333648814":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_downward (9) == -0.4523156594418098405903708757987855343087":
++float: 1
++ifloat: 1
++
++# tan_tonearest
++Test "tan_tonearest (6) == -0.2910061913847491570536995888681755428312":
++ildouble: 1
++ldouble: 1
++Test "tan_tonearest (8) == -6.7997114552203786999252627596086333648814":
++ildouble: 1
++ldouble: 1
++Test "tan_tonearest (9) == -0.4523156594418098405903708757987855343087":
++ildouble: 1
++ldouble: 1
++
++# tan_towardzero
++Test "tan_towardzero (1) == 1.5574077246549022305069748074583601730873":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-Test "tgamma (4) == 6":
++Test "tan_towardzero (10) == 0.6483608274590866712591249330098086768169":
++float: 1
++ifloat: 1
++Test "tan_towardzero (2) == -2.1850398632615189916433061023136825434320":
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (3) == -0.1425465430742778052956354105339134932261":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (4) == 1.1578212823495775831373424182673239231198":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (5) == -3.3805150062465856369827058794473439087096":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++Test "tan_towardzero (6) == -0.2910061913847491570536995888681755428312":
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (7) == 0.8714479827243187364564508896003135663222":
++double: 1
++idouble: 1
++Test "tan_towardzero (8) == -6.7997114552203786999252627596086333648814":
++double: 1
++idouble: 1
++ildouble: 2
++ldouble: 2
++Test "tan_towardzero (9) == -0.4523156594418098405903708757987855343087":
++double: 1
++idouble: 1
+ ildouble: 1
+ ldouble: 1
+
+-# y0
+-Test "y0 (0.125) == -1.38968062514384052915582277745018693":
++# tan_upward
++Test "tan_upward (1) == 1.5574077246549022305069748074583601730873":
+ ildouble: 1
+ ldouble: 1
+-Test "y0 (0.75) == -0.137172769385772397522814379396581855":
++Test "tan_upward (10) == 0.6483608274590866712591249330098086768169":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "tan_upward (2) == -2.1850398632615189916433061023136825434320":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (3) == -0.1425465430742778052956354105339134932261":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_upward (4) == 1.1578212823495775831373424182673239231198":
++double: 1
++idouble: 1
++Test "tan_upward (5) == -3.3805150062465856369827058794473439087096":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-Test "y0 (1.0) == 0.0882569642156769579829267660235151628":
++Test "tan_upward (6) == -0.2910061913847491570536995888681755428312":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (7) == 0.8714479827243187364564508896003135663222":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_upward (8) == -6.7997114552203786999252627596086333648814":
++double: 1
++idouble: 1
++ildouble: 2
++ldouble: 2
++Test "tan_upward (9) == -0.4523156594418098405903708757987855343087":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++
++# tgamma
++Test "tgamma (-0.5) == -2 sqrt (pi)":
+ double: 2
+ float: 1
+ idouble: 2
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "y0 (1.5) == 0.382448923797758843955068554978089862":
++Test "tgamma (0.5) == sqrt (pi)":
++float: 1
++ifloat: 1
++Test "tgamma (0.7) == 1.29805533264755778568117117915281162":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-Test "y0 (10.0) == 0.0556711672835993914244598774101900481":
++
++# y0
++Test "y0 (0.125) == -1.38968062514384052915582277745018693":
++ildouble: 1
++ldouble: 1
++Test "y0 (0.75) == -0.137172769385772397522814379396581855":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
++Test "y0 (1.0) == 0.0882569642156769579829267660235151628":
++ildouble: 1
++ldouble: 1
++Test "y0 (10.0) == 0.0556711672835993914244598774101900481":
++float: 1
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "y0 (8.0) == 0.223521489387566220527323400498620359":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+@@ -766,9 +1211,6 @@ ldouble: 1
+ Test "y1 (0.125) == -5.19993611253477499595928744876579921":
+ ildouble: 1
+ ldouble: 1
+-Test "y1 (1.0) == -0.781212821300288716547150000047964821":
+-double: 1
+-idouble: 1
+ Test "y1 (10.0) == 0.249015424206953883923283474663222803":
+ double: 2
+ float: 2
+@@ -782,9 +1224,7 @@ ifloat: 2
+ ildouble: 1
+ ldouble: 1
+ Test "y1 (8.0) == -0.158060461731247494255555266187483550":
+-double: 1
+ float: 2
+-idouble: 1
+ ifloat: 2
+ ildouble: 1
+ ldouble: 1
+@@ -799,37 +1239,21 @@ float: 1
+ idouble: 1
+ ifloat: 1
+ Test "yn (0, 1.0) == 0.0882569642156769579829267660235151628":
+-double: 2
+-float: 1
+-idouble: 2
+-ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "yn (0, 1.5) == 0.382448923797758843955068554978089862":
+-double: 1
+-float: 1
+-idouble: 1
+-ifloat: 1
+ Test "yn (0, 10.0) == 0.0556711672835993914244598774101900481":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "yn (0, 8.0) == 0.223521489387566220527323400498620359":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "yn (1, 0.125) == -5.19993611253477499595928744876579921":
+ ildouble: 1
+ ldouble: 1
+-Test "yn (1, 1.0) == -0.781212821300288716547150000047964821":
+-double: 1
+-idouble: 1
+ Test "yn (1, 10.0) == 0.249015424206953883923283474663222803":
+ double: 2
+ float: 2
+@@ -843,17 +1267,13 @@ ifloat: 2
+ ildouble: 1
+ ldouble: 1
+ Test "yn (1, 8.0) == -0.158060461731247494255555266187483550":
+-double: 1
+ float: 2
+-idouble: 1
+ ifloat: 2
+ ildouble: 1
+ ldouble: 1
+ Test "yn (10, 0.125) == -127057845771019398.252538486899753195":
+ double: 1
+-float: 1
+ idouble: 1
+-ifloat: 1
+ ildouble: 2
+ ldouble: 2
+ Test "yn (10, 0.75) == -2133501638.90573424452445412893839236":
+@@ -862,28 +1282,22 @@ ifloat: 1
+ ildouble: 4
+ ldouble: 4
+ Test "yn (10, 1.0) == -121618014.278689189288130426667971145":
+-double: 1
+ float: 2
+-idouble: 1
+ ifloat: 2
+ Test "yn (10, 10.0) == -0.359814152183402722051986577343560609":
+ double: 1
+-float: 3
++float: 1
+ idouble: 1
+-ifloat: 3
++ifloat: 1
+ Test "yn (10, 2.0) == -129184.542208039282635913145923304214":
+-double: 2
+ float: 3
+-idouble: 2
+ ifloat: 3
+ Test "yn (3, 0.125) == -2612.69757350066712600220955744091741":
+ ildouble: 1
+ ldouble: 1
+ Test "yn (3, 0.75) == -12.9877176234475433186319774484809207":
+ double: 1
+-float: 1
+ idouble: 1
+-ifloat: 1
+ ildouble: 2
+ ldouble: 2
+ Test "yn (3, 10.0) == -0.251362657183837329779204747654240998":
+@@ -892,15 +1306,13 @@ float: 1
+ idouble: 1
+ ifloat: 1
+ Test "yn (3, 2.0) == -1.12778377684042778608158395773179238":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+
+ # Maximal error of functions:
+ Function: "acos":
+-ildouble: 622
+-ldouble: 622
++ildouble: 1
++ldouble: 1
+
+ Function: "asin":
+ ildouble: 1
+@@ -917,18 +1329,6 @@ ildouble: 2
+ ldouble: 2
+
+ Function: Real part of "cacosh":
+-double: 1
+-float: 9
+-idouble: 1
+-ifloat: 9
+-ildouble: 6
+-ldouble: 6
+-
+-Function: Imaginary part of "cacosh":
+-double: 1
+-float: 4
+-idouble: 1
+-ifloat: 4
+ ildouble: 1
+ ldouble: 1
+
+@@ -1033,8 +1433,6 @@ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-ildouble: 1
+-ldouble: 1
+
+ Function: "cos":
+ double: 2
+@@ -1044,16 +1442,58 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+-Function: "cosh":
++Function: "cos_downward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "cos_tonearest":
+ ildouble: 1
++ldouble: 1
++
++Function: "cos_towardzero":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "cos_upward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "cosh_downward":
++double: 1
++float: 1
++ldouble: 2
++
++Function: "cosh_tonearest":
++ldouble: 1
++
++Function: "cosh_towardzero":
++double: 1
++float: 1
++ldouble: 2
++
++Function: "cosh_upward":
++double: 1
++ldouble: 1
+
+ Function: Real part of "cpow":
+ double: 1
+ float: 4
+ idouble: 1
+ ifloat: 4
+-ildouble: 763
+-ldouble: 763
++ildouble: 6
++ldouble: 6
+
+ Function: Imaginary part of "cpow":
+ double: 2
+@@ -1086,38 +1526,32 @@ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-ildouble: 2
+-ldouble: 2
+
+ Function: Real part of "ctan":
+ double: 1
+ idouble: 1
+-ildouble: 439
+-ldouble: 439
++ildouble: 1
++ldouble: 1
+
+ Function: Imaginary part of "ctan":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 3
+ ldouble: 3
+
+ Function: Real part of "ctanh":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+-ildouble: 5
+-ldouble: 5
++ildouble: 3
++ldouble: 3
+
+ Function: Imaginary part of "ctanh":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-ildouble: 25
+-ldouble: 25
++ildouble: 1
++ldouble: 1
+
+ Function: "erf":
+ double: 1
+@@ -1125,19 +1559,36 @@ idouble: 1
+
+ Function: "erfc":
+ double: 1
+-float: 1
+ idouble: 1
+-ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+-Function: "exp":
+-ildouble: 754
+-
+ Function: "exp10":
+ ildouble: 8
+ ldouble: 8
+
++Function: "exp_downward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "exp_towardzero":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "exp_upward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++
+ Function: "expm1":
+ ildouble: 1
+
+@@ -1151,10 +1602,10 @@ Function: "hypot":
+ float: 1
+
+ Function: "j0":
+-double: 3
+-float: 2
+-idouble: 3
+-ifloat: 2
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+@@ -1167,10 +1618,10 @@ ildouble: 1
+ ldouble: 1
+
+ Function: "jn":
+-double: 5
+-float: 2
+-idouble: 5
+-ifloat: 2
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
+ ildouble: 2
+ ldouble: 2
+
+@@ -1192,6 +1643,58 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
++Function: "pow_downward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "pow_towardzero":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "pow_upward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_downward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_tonearest":
++ildouble: 1
++ldouble: 1
++
++Function: "sin_towardzero":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_upward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
+ Function: "sincos":
+ double: 1
+ float: 1
+@@ -1201,13 +1704,62 @@ ildouble: 1
+ ldouble: 1
+
+ Function: "sinh":
+-double: 1
+ ildouble: 1
+
++Function: "sinh_downward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ldouble: 5
++
++Function: "sinh_tonearest":
++ldouble: 6
++
++Function: "sinh_towardzero":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ldouble: 5
++
++Function: "sinh_upward":
++double: 1
++idouble: 1
++ldouble: 27
++
+ Function: "tan":
+ double: 1
+ idouble: 1
+
++Function: "tan_downward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "tan_tonearest":
++ildouble: 1
++ldouble: 1
++
++Function: "tan_towardzero":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "tan_upward":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
+ Function: "tgamma":
+ double: 2
+ float: 1
+@@ -1217,9 +1769,9 @@ ildouble: 1
+ ldouble: 1
+
+ Function: "y0":
+-double: 2
++double: 1
+ float: 1
+-idouble: 2
++idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+diff -Nrup a/sysdeps/ieee754/dbl-64/e_exp.c b/sysdeps/ieee754/dbl-64/e_exp.c
+--- a/sysdeps/ieee754/dbl-64/e_exp.c 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/ieee754/dbl-64/e_exp.c 2012-08-06 09:54:00.823929687 -0600
+@@ -1,7 +1,7 @@
+ /*
+ * IBM Accurate Mathematical Library
+ * written by International Business Machines Corp.
+- * Copyright (C) 2001 Free Software Foundation
++ * Copyright (C) 2001-2012 Free Software Foundation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+@@ -39,6 +39,7 @@
+ #include "MathLib.h"
+ #include "uexp.tbl"
+ #include "math_private.h"
++#include <fenv.h>
+
+ double __slowexp(double);
+
+@@ -53,6 +54,10 @@ double __ieee754_exp(double x) {
+ int4 k;
+ #endif
+ int4 i,j,m,n,ex;
++ fenv_t env;
++ double retval;
++
++ libc_feholdexcept_setround (&env, FE_TONEAREST);
+
+ junk1.x = x;
+ m = junk1.i[HIGH_HALF];
+@@ -85,18 +90,19 @@ double __ieee754_exp(double x) {
+ rem=(bet + bet*eps)+al*eps;
+ res = al + rem;
+ cor = (al - res) + rem;
+- if (res == (res+cor*err_0)) return res*binexp.x;
+- else return __slowexp(x); /*if error is over bound */
++ if (res == (res+cor*err_0)) { retval = res*binexp.x; goto ret; }
++ else { retval = __slowexp(x); goto ret; } /*if error is over bound */
+ }
+
+- if (n <= smallint) return 1.0;
++ if (n <= smallint) { retval = 1.0; goto ret; }
+
+ if (n >= badint) {
+- if (n > infint) return(x+x); /* x is NaN */
+- if (n < infint) return ( (x>0) ? (hhuge*hhuge) : (tiny*tiny) );
++ if (n > infint) { retval = x+x; goto ret; } /* x is NaN */
++ if (n < infint) { retval = (x>0) ? (hhuge*hhuge) : (tiny*tiny); goto ret; }
+ /* x is finite, cause either overflow or underflow */
+- if (junk1.i[LOW_HALF] != 0) return (x+x); /* x is NaN */
+- return ((x>0)?inf.x:zero ); /* |x| = inf; return either inf or 0 */
++ if (junk1.i[LOW_HALF] != 0) { retval = x+x; goto ret; } /* x is NaN */
++ retval = (x>0)?inf.x:zero; /* |x| = inf; return either inf or 0 */
++ goto ret;
+ }
+
+ y = x*log2e.x + three51.x;
+@@ -121,8 +127,8 @@ double __ieee754_exp(double x) {
+ if (res < 1.0) {res+=res; cor+=cor; ex-=1;}
+ if (ex >=-1022) {
+ binexp.i[HIGH_HALF] = (1023+ex)<<20;
+- if (res == (res+cor*err_0)) return res*binexp.x;
+- else return __slowexp(x); /*if error is over bound */
++ if (res == (res+cor*err_0)) { retval = res*binexp.x; goto ret; }
++ else { retval = __slowexp(x); goto ret; } /*if error is over bound */
+ }
+ ex = -(1022+ex);
+ binexp.i[HIGH_HALF] = (1023-ex)<<20;
+@@ -135,15 +141,19 @@ double __ieee754_exp(double x) {
+ cor = (t-res)+y;
+ if (res == (res + eps*cor))
+ { binexp.i[HIGH_HALF] = 0x00100000;
+- return (res-1.0)*binexp.x;
++ retval = (res-1.0)*binexp.x;
++ goto ret;
+ }
+- else return __slowexp(x); /* if error is over bound */
++ else { retval = __slowexp(x); goto ret; } /* if error is over bound */
+ }
+ else {
+ binexp.i[HIGH_HALF] =(junk1.i[LOW_HALF]+767)<<20;
+- if (res == (res+cor*err_0)) return res*binexp.x*t256.x;
+- else return __slowexp(x);
++ if (res == (res+cor*err_0)) { retval = res*binexp.x*t256.x; goto ret; }
++ else { retval = __slowexp(x); goto ret; }
+ }
++ ret:
++ libc_feupdateenv (&env);
++ return retval;
+ }
+
+ /************************************************************************/
+diff -Nrup a/sysdeps/ieee754/dbl-64/e_exp2.c b/sysdeps/ieee754/dbl-64/e_exp2.c
+--- a/sysdeps/ieee754/dbl-64/e_exp2.c 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/ieee754/dbl-64/e_exp2.c 2012-08-06 09:54:00.824929683 -0600
+@@ -24,9 +24,6 @@
+ 17 (1), March 1991, pp. 26-45.
+ It has been slightly modified to compute 2^x instead of e^x.
+ */
+-#ifndef _GNU_SOURCE
+-#define _GNU_SOURCE
+-#endif
+ #include <stdlib.h>
+ #include <float.h>
+ #include <ieee754.h>
+@@ -37,13 +34,8 @@
+
+ #include "t_exp2.h"
+
+-/* XXX I know the assembler generates a warning about incorrect section
+- attributes. But without the attribute here the compiler places the
+- constants in the .data section. Ideally the constant is placed in
+- .rodata.cst8 so that it can be merged, but gcc sucks, it ICEs when
+- we try to force this section on it. --drepper */
+-static const volatile double TWO1023 = 8.988465674311579539e+307;
+-static const volatile double TWOM1000 = 9.3326361850321887899e-302;
++static const double TWO1023 = 8.988465674311579539e+307;
++static const double TWOM1000 = 9.3326361850321887899e-302;
+
+ double
+ __ieee754_exp2 (double x)
+@@ -60,11 +52,7 @@ __ieee754_exp2 (double x)
+ union ieee754_double ex2_u, scale_u;
+ fenv_t oldenv;
+
+- feholdexcept (&oldenv);
+-#ifdef FE_TONEAREST
+- /* If we don't have this, it's too bad. */
+- fesetround (FE_TONEAREST);
+-#endif
++ libc_feholdexcept_setround (&oldenv, FE_TONEAREST);
+
+ /* 1. Argument reduction.
+ Choose integers ex, -256 <= t < 256, and some real
+@@ -108,9 +96,10 @@ __ieee754_exp2 (double x)
+ * x + .055504110254308625)
+ * x + .240226506959100583)
+ * x + .69314718055994495) * ex2_u.d;
++ math_opt_barrier (x22);
+
+ /* 5. Return (2^x2-1) * 2^(t/512+e+ex) + 2^(t/512+e+ex). */
+- fesetenv (&oldenv);
++ libc_fesetenv (&oldenv);
+
+ result = x22 * x + ex2_u.d;
+
+diff -Nrup a/sysdeps/ieee754/dbl-64/e_pow.c b/sysdeps/ieee754/dbl-64/e_pow.c
+--- a/sysdeps/ieee754/dbl-64/e_pow.c 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/ieee754/dbl-64/e_pow.c 2012-08-06 09:54:00.824929683 -0600
+@@ -42,6 +42,7 @@
+ #include "MathLib.h"
+ #include "upow.tbl"
+ #include "math_private.h"
++#include <fenv.h>
+
+
+ double __exp1(double x, double xx, double error);
+@@ -79,6 +80,11 @@ double __ieee754_pow(double x, double y)
+ (u.i[HIGH_HALF]==0 && u.i[LOW_HALF]!=0)) &&
+ /* 2^-1023< x<= 2^-1023 * 0x1.0000ffffffff */
+ (v.i[HIGH_HALF]&0x7fffffff) < 0x4ff00000) { /* if y<-1 or y>1 */
++ fenv_t env;
++ double retval;
++
++ libc_feholdexcept_setround (&env, FE_TONEAREST);
++
+ z = log1(x,&aa,&error); /* x^y =e^(y log (X)) */
+ t = y*134217729.0;
+ y1 = t - (t-y);
+@@ -92,7 +98,10 @@ double __ieee754_pow(double x, double y)
+ a2 = (a-a1)+aa;
+ error = error*ABS(y);
+ t = __exp1(a1,a2,1.9e16*error); /* return -10 or 0 if wasn't computed exactly */
+- return (t>0)?t:power1(x,y);
++ retval = (t>0)?t:power1(x,y);
++
++ libc_feupdateenv (&env);
++ return retval;
+ }
+
+ if (x == 0) {
+diff -Nrup a/sysdeps/ieee754/dbl-64/s_sin.c b/sysdeps/ieee754/dbl-64/s_sin.c
+--- a/sysdeps/ieee754/dbl-64/s_sin.c 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/ieee754/dbl-64/s_sin.c 2012-08-06 09:54:00.827929671 -0600
+@@ -55,6 +55,7 @@
+ #include "MathLib.h"
+ #include "sincos.tbl"
+ #include "math_private.h"
++#include <fenv.h>
+
+ static const double
+ sn3 = -1.66666666666664880952546298448555E-01,
+@@ -97,12 +98,16 @@ double __sin(double x){
+ #if 0
+ int4 nn;
+ #endif
++ fenv_t env;
++ double retval = 0;
++
++ libc_feholdexcept_setround (&env, FE_TONEAREST);
+
+ u.x = x;
+ m = u.i[HIGH_HALF];
+ k = 0x7fffffff&m; /* no sign */
+ if (k < 0x3e500000) /* if x->0 =>sin(x)=x */
+- return x;
++ { retval = x; goto ret; }
+ /*---------------------------- 2^-26 < |x|< 0.25 ----------------------*/
+ else if (k < 0x3fd00000){
+ xx = x*x;
+@@ -110,7 +115,8 @@ double __sin(double x){
+ t = ((((s5.x*xx + s4.x)*xx + s3.x)*xx + s2.x)*xx + s1.x)*(xx*x);
+ res = x+t;
+ cor = (x-res)+t;
+- return (res == res + 1.07*cor)? res : slow(x);
++ retval = (res == res + 1.07*cor)? res : slow(x);
++ goto ret;
+ } /* else if (k < 0x3fd00000) */
+ /*---------------------------- 0.25<|x|< 0.855469---------------------- */
+ else if (k < 0x3feb6000) {
+@@ -127,7 +133,8 @@ double __sin(double x){
+ cor=(ssn+s*ccs-sn*c)+cs*s;
+ res=sn+cor;
+ cor=(sn-res)+cor;
+- return (res==res+1.025*cor)? res : slow1(x);
++ retval = (res==res+1.096*cor)? res : slow1(x);
++ goto ret;
+ } /* else if (k < 0x3feb6000) */
+
+ /*----------------------- 0.855469 <|x|<2.426265 ----------------------*/
+@@ -153,7 +160,8 @@ double __sin(double x){
+ cor=(ccs-s*ssn-cs*c)-sn*s;
+ res=cs+cor;
+ cor=(cs-res)+cor;
+- return (res==res+1.020*cor)? ((m>0)?res:-res) : slow2(x);
++ retval = (res==res+1.020*cor)? ((m>0)?res:-res) : slow2(x);
++ goto ret;
+ } /* else if (k < 0x400368fd) */
+
+ /*-------------------------- 2.426265<|x|< 105414350 ----------------------*/
+@@ -179,7 +187,8 @@ double __sin(double x){
+ res = a+t;
+ cor = (a-res)+t;
+ cor = (cor>0)? 1.02*cor+eps : 1.02*cor -eps;
+- return (res == res + cor)? res : sloww(a,da,x);
++ retval = (res == res + cor)? res : sloww(a,da,x);
++ goto ret;
+ }
+ else {
+ if (a>0)
+@@ -200,7 +209,8 @@ double __sin(double x){
+ res=sn+cor;
+ cor=(sn-res)+cor;
+ cor = (cor>0)? 1.035*cor+eps : 1.035*cor-eps;
+- return (res==res+cor)? ((m)?res:-res) : sloww1(a,da,x);
++ retval = (res==res+cor)? ((m)?res:-res) : sloww1(a,da,x);
++ goto ret;
+ }
+ break;
+
+@@ -222,7 +232,8 @@ double __sin(double x){
+ res=cs+cor;
+ cor=(cs-res)+cor;
+ cor = (cor>0)? 1.025*cor+eps : 1.025*cor-eps;
+- return (res==res+cor)? ((n&2)?-res:res) : sloww2(a,da,x,n);
++ retval = (res==res+cor)? ((n&2)?-res:res) : sloww2(a,da,x,n);
++ goto ret;
+
+ break;
+
+@@ -258,7 +269,8 @@ double __sin(double x){
+ res = a+t;
+ cor = (a-res)+t;
+ cor = (cor>0)? 1.02*cor+eps : 1.02*cor -eps;
+- return (res == res + cor)? res : bsloww(a,da,x,n);
++ retval = (res == res + cor)? res : bsloww(a,da,x,n);
++ goto ret;
+ }
+ else {
+ if (a>0) {m=1;t=a;db=da;}
+@@ -277,7 +289,8 @@ double __sin(double x){
+ res=sn+cor;
+ cor=(sn-res)+cor;
+ cor = (cor>0)? 1.035*cor+eps : 1.035*cor-eps;
+- return (res==res+cor)? ((m)?res:-res) : bsloww1(a,da,x,n);
++ retval = (res==res+cor)? ((m)?res:-res) : bsloww1(a,da,x,n);
++ goto ret;
+ }
+ break;
+
+@@ -299,7 +312,8 @@ double __sin(double x){
+ res=cs+cor;
+ cor=(cs-res)+cor;
+ cor = (cor>0)? 1.025*cor+eps : 1.025*cor-eps;
+- return (res==res+cor)? ((n&2)?-res:res) : bsloww2(a,da,x,n);
++ retval = (res==res+cor)? ((n&2)?-res:res) : bsloww2(a,da,x,n);
++ goto ret;
+
+ break;
+
+@@ -313,17 +327,20 @@ double __sin(double x){
+ n = __branred(x,&a,&da);
+ switch (n) {
+ case 0:
+- if (a*a < 0.01588) return bsloww(a,da,x,n);
+- else return bsloww1(a,da,x,n);
++ if (a*a < 0.01588) retval = bsloww(a,da,x,n);
++ else retval = bsloww1(a,da,x,n);
++ goto ret;
+ break;
+ case 2:
+- if (a*a < 0.01588) return bsloww(-a,-da,x,n);
+- else return bsloww1(-a,-da,x,n);
++ if (a*a < 0.01588) retval = bsloww(-a,-da,x,n);
++ else retval = bsloww1(-a,-da,x,n);
++ goto ret;
+ break;
+
+ case 1:
+ case 3:
+- return bsloww2(a,da,x,n);
++ retval = bsloww2(a,da,x,n);
++ goto ret;
+ break;
+ }
+
+@@ -333,9 +350,13 @@ double __sin(double x){
+ else {
+ if (k == 0x7ff00000 && u.i[LOW_HALF] == 0)
+ __set_errno (EDOM);
+- return x / x;
++ retval = x / x;
++ goto ret;
+ }
+- return 0; /* unreachable */
++
++ ret:
++ libc_feupdateenv (&env);
++ return retval;
+ }
+
+
+@@ -350,11 +371,16 @@ double __cos(double x)
+ mynumber u,v;
+ int4 k,m,n;
+
++ fenv_t env;
++ double retval = 0;
++
++ libc_feholdexcept_setround (&env, FE_TONEAREST);
++
+ u.x = x;
+ m = u.i[HIGH_HALF];
+ k = 0x7fffffff&m;
+
+- if (k < 0x3e400000 ) return 1.0; /* |x|<2^-27 => cos(x)=1 */
++ if (k < 0x3e400000 ) { retval = 1.0; goto ret; } /* |x|<2^-27 => cos(x)=1 */
+
+ else if (k < 0x3feb6000 ) {/* 2^-27 < |x| < 0.855469 */
+ y=ABS(x);
+@@ -371,7 +397,8 @@ double __cos(double x)
+ cor=(ccs-s*ssn-cs*c)-sn*s;
+ res=cs+cor;
+ cor=(cs-res)+cor;
+- return (res==res+1.020*cor)? res : cslow2(x);
++ retval = (res==res+1.020*cor)? res : cslow2(x);
++ goto ret;
+
+ } /* else if (k < 0x3feb6000) */
+
+@@ -385,7 +412,8 @@ double __cos(double x)
+ res = a+t;
+ cor = (a-res)+t;
+ cor = (cor>0)? 1.02*cor+1.0e-31 : 1.02*cor -1.0e-31;
+- return (res == res + cor)? res : csloww(a,da,x);
++ retval = (res == res + cor)? res : csloww(a,da,x);
++ goto ret;
+ }
+ else {
+ if (a>0) {m=1;t=a;db=da;}
+@@ -404,7 +432,8 @@ double __cos(double x)
+ res=sn+cor;
+ cor=(sn-res)+cor;
+ cor = (cor>0)? 1.035*cor+1.0e-31 : 1.035*cor-1.0e-31;
+- return (res==res+cor)? ((m)?res:-res) : csloww1(a,da,x);
++ retval = (res==res+cor)? ((m)?res:-res) : csloww1(a,da,x);
++ goto ret;
+ }
+
+ } /* else if (k < 0x400368fd) */
+@@ -431,7 +460,8 @@ double __cos(double x)
+ res = a+t;
+ cor = (a-res)+t;
+ cor = (cor>0)? 1.02*cor+eps : 1.02*cor -eps;
+- return (res == res + cor)? res : csloww(a,da,x);
++ retval = (res == res + cor)? res : csloww(a,da,x);
++ goto ret;
+ }
+ else {
+ if (a>0) {m=1;t=a;db=da;}
+@@ -450,7 +480,8 @@ double __cos(double x)
+ res=sn+cor;
+ cor=(sn-res)+cor;
+ cor = (cor>0)? 1.035*cor+eps : 1.035*cor-eps;
+- return (res==res+cor)? ((m)?res:-res) : csloww1(a,da,x);
++ retval = (res==res+cor)? ((m)?res:-res) : csloww1(a,da,x);
++ goto ret;
+ }
+ break;
+
+@@ -471,7 +502,8 @@ double __cos(double x)
+ res=cs+cor;
+ cor=(cs-res)+cor;
+ cor = (cor>0)? 1.025*cor+eps : 1.025*cor-eps;
+- return (res==res+cor)? ((n)?-res:res) : csloww2(a,da,x,n);
++ retval = (res==res+cor)? ((n)?-res:res) : csloww2(a,da,x,n);
++ goto ret;
+
+ break;
+
+@@ -506,7 +538,8 @@ double __cos(double x)
+ res = a+t;
+ cor = (a-res)+t;
+ cor = (cor>0)? 1.02*cor+eps : 1.02*cor -eps;
+- return (res == res + cor)? res : bsloww(a,da,x,n);
++ retval = (res == res + cor)? res : bsloww(a,da,x,n);
++ goto ret;
+ }
+ else {
+ if (a>0) {m=1;t=a;db=da;}
+@@ -525,7 +558,8 @@ double __cos(double x)
+ res=sn+cor;
+ cor=(sn-res)+cor;
+ cor = (cor>0)? 1.035*cor+eps : 1.035*cor-eps;
+- return (res==res+cor)? ((m)?res:-res) : bsloww1(a,da,x,n);
++ retval = (res==res+cor)? ((m)?res:-res) : bsloww1(a,da,x,n);
++ goto ret;
+ }
+ break;
+
+@@ -546,7 +580,8 @@ double __cos(double x)
+ res=cs+cor;
+ cor=(cs-res)+cor;
+ cor = (cor>0)? 1.025*cor+eps : 1.025*cor-eps;
+- return (res==res+cor)? ((n)?-res:res) : bsloww2(a,da,x,n);
++ retval = (res==res+cor)? ((n)?-res:res) : bsloww2(a,da,x,n);
++ goto ret;
+ break;
+
+ }
+@@ -558,17 +593,20 @@ double __cos(double x)
+ n = __branred(x,&a,&da);
+ switch (n) {
+ case 1:
+- if (a*a < 0.01588) return bsloww(-a,-da,x,n);
+- else return bsloww1(-a,-da,x,n);
++ if (a*a < 0.01588) retval = bsloww(-a,-da,x,n);
++ else retval = bsloww1(-a,-da,x,n);
++ goto ret;
+ break;
+ case 3:
+- if (a*a < 0.01588) return bsloww(a,da,x,n);
+- else return bsloww1(a,da,x,n);
++ if (a*a < 0.01588) retval = bsloww(a,da,x,n);
++ else retval = bsloww1(a,da,x,n);
++ goto ret;
+ break;
+
+ case 0:
+ case 2:
+- return bsloww2(a,da,x,n);
++ retval = bsloww2(a,da,x,n);
++ goto ret;
+ break;
+ }
+
+@@ -580,10 +618,13 @@ double __cos(double x)
+ else {
+ if (k == 0x7ff00000 && u.i[LOW_HALF] == 0)
+ __set_errno (EDOM);
+- return x / x; /* |x| > 2^1024 */
++ retval = x / x; /* |x| > 2^1024 */
++ goto ret;
+ }
+- return 0;
+
++ ret:
++ libc_feupdateenv (&env);
++ return retval;
+ }
+
+ /************************************************************************/
+diff -Nrup a/sysdeps/ieee754/dbl-64/s_tan.c b/sysdeps/ieee754/dbl-64/s_tan.c
+--- a/sysdeps/ieee754/dbl-64/s_tan.c 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/ieee754/dbl-64/s_tan.c 2012-08-06 09:54:00.828929666 -0600
+@@ -40,6 +40,8 @@
+ #include "mpa.h"
+ #include "MathLib.h"
+ #include "math.h"
++#include "math_private.h"
++#include <fenv.h>
+
+ static double tanMp(double);
+ void __mptan(double, mp_no *, int);
+@@ -58,21 +60,27 @@ double tan(double x) {
+ mp_no mpy;
+ #endif
+
++ fenv_t env;
++ double retval;
++
+ int __branred(double, double *, double *);
+ int __mpranred(double, mp_no *, int);
+
++ libc_feholdexcept_setround (&env, FE_TONEAREST);
++
+ /* x=+-INF, x=NaN */
+ num.d = x; ux = num.i[HIGH_HALF];
+ if ((ux&0x7ff00000)==0x7ff00000) {
+ if ((ux&0x7fffffff)==0x7ff00000)
+ __set_errno (EDOM);
+- return x-x;
++ retval = x-x;
++ goto ret;
+ }
+
+ w=(x<ZERO) ? -x : x;
+
+ /* (I) The case abs(x) <= 1.259e-8 */
+- if (w<=g1.d) return x;
++ if (w<=g1.d) { retval = x; goto ret; }
+
+ /* (II) The case 1.259e-8 < abs(x) <= 0.0608 */
+ if (w<=g2.d) {
+@@ -80,7 +88,7 @@ double tan(double x) {
+ /* First stage */
+ x2 = x*x;
+ t2 = x*x2*(d3.d+x2*(d5.d+x2*(d7.d+x2*(d9.d+x2*d11.d))));
+- if ((y=x+(t2-u1.d*t2)) == x+(t2+u1.d*t2)) return y;
++ if ((y=x+(t2-u1.d*t2)) == x+(t2+u1.d*t2)) { retval = y; goto ret; }
+
+ /* Second stage */
+ c1 = x2*(a15.d+x2*(a17.d+x2*(a19.d+x2*(a21.d+x2*(a23.d+x2*(a25.d+
+@@ -100,8 +108,9 @@ double tan(double x) {
+ MUL2(x2,xx2,c2,cc2,c1,cc1,t1,t2,t3,t4,t5,t6,t7,t8)
+ MUL2(x ,zero.d,c1,cc1,c2,cc2,t1,t2,t3,t4,t5,t6,t7,t8)
+ ADD2(x ,zero.d,c2,cc2,c1,cc1,t1,t2)
+- if ((y=c1+(cc1-u2.d*c1)) == c1+(cc1+u2.d*c1)) return y;
+- return tanMp(x);
++ if ((y=c1+(cc1-u2.d*c1)) == c1+(cc1+u2.d*c1)) { retval = y; goto ret; }
++ retval = tanMp(x);
++ goto ret;
+ }
+
+ /* (III) The case 0.0608 < abs(x) <= 0.787 */
+@@ -112,10 +121,10 @@ double tan(double x) {
+ z = w-xfg[i][0].d; z2 = z*z; s = (x<ZERO) ? MONE : ONE;
+ pz = z+z*z2*(e0.d+z2*e1.d);
+ fi = xfg[i][1].d; gi = xfg[i][2].d; t2 = pz*(gi+fi)/(gi-pz);
+- if ((y=fi+(t2-fi*u3.d))==fi+(t2+fi*u3.d)) return (s*y);
++ if ((y=fi+(t2-fi*u3.d))==fi+(t2+fi*u3.d)) { retval = (s*y); goto ret; }
+ t3 = (t2<ZERO) ? -t2 : t2;
+ t4 = fi*ua3.d+t3*ub3.d;
+- if ((y=fi+(t2-t4))==fi+(t2+t4)) return (s*y);
++ if ((y=fi+(t2-t4))==fi+(t2+t4)) { retval = (s*y); goto ret; }
+
+ /* Second stage */
+ ffi = xfg[i][3].d;
+@@ -133,8 +142,9 @@ double tan(double x) {
+ SUB2(one.d,zero.d,c3,cc3,c1,cc1,t1,t2)
+ DIV2(c2,cc2,c1,cc1,c3,cc3,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+
+- if ((y=c3+(cc3-u4.d*c3))==c3+(cc3+u4.d*c3)) return (s*y);
+- return tanMp(x);
++ if ((y=c3+(cc3-u4.d*c3))==c3+(cc3+u4.d*c3)) { retval = (s*y); goto ret; }
++ retval = tanMp(x);
++ goto ret;
+ }
+
+ /* (---) The case 0.787 < abs(x) <= 25 */
+@@ -152,7 +162,7 @@ double tan(double x) {
+ else {ya= a; yya= da; sy= ONE;}
+
+ /* (IV),(V) The case 0.787 < abs(x) <= 25, abs(y) <= 1e-7 */
+- if (ya<=gy1.d) return tanMp(x);
++ if (ya<=gy1.d) { retval = tanMp(x); goto ret; }
+
+ /* (VI) The case 0.787 < abs(x) <= 25, 1e-7 < abs(y) <= 0.0608 */
+ if (ya<=gy2.d) {
+@@ -162,10 +172,10 @@ double tan(double x) {
+ /* First stage -cot */
+ EADD(a,t2,b,db)
+ DIV2(one.d,zero.d,b,db,c,dc,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c+(dc-u6.d*c))==c+(dc+u6.d*c)) return (-y); }
++ if ((y=c+(dc-u6.d*c))==c+(dc+u6.d*c)) { retval = (-y); goto ret; } }
+ else {
+ /* First stage tan */
+- if ((y=a+(t2-u5.d*a))==a+(t2+u5.d*a)) return y; }
++ if ((y=a+(t2-u5.d*a))==a+(t2+u5.d*a)) { retval = y; goto ret; } }
+ /* Second stage */
+ /* Range reduction by algorithm ii */
+ t = (x*hpinv.d + toint.d);
+@@ -203,11 +213,12 @@ double tan(double x) {
+ if (n) {
+ /* Second stage -cot */
+ DIV2(one.d,zero.d,c1,cc1,c2,cc2,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c2+(cc2-u8.d*c2)) == c2+(cc2+u8.d*c2)) return (-y); }
++ if ((y=c2+(cc2-u8.d*c2)) == c2+(cc2+u8.d*c2)) { retval = (-y); goto ret; } }
+ else {
+ /* Second stage tan */
+- if ((y=c1+(cc1-u7.d*c1)) == c1+(cc1+u7.d*c1)) return y; }
+- return tanMp(x);
++ if ((y=c1+(cc1-u7.d*c1)) == c1+(cc1+u7.d*c1)) { retval = y; goto ret; } }
++ retval = tanMp(x);
++ goto ret;
+ }
+
+ /* (VII) The case 0.787 < abs(x) <= 25, 0.0608 < abs(y) <= 0.787 */
+@@ -221,17 +232,17 @@ double tan(double x) {
+ if (n) {
+ /* -cot */
+ t2 = pz*(fi+gi)/(fi+pz);
+- if ((y=gi-(t2-gi*u10.d))==gi-(t2+gi*u10.d)) return (-sy*y);
++ if ((y=gi-(t2-gi*u10.d))==gi-(t2+gi*u10.d)) { retval = (-sy*y); goto ret; }
+ t3 = (t2<ZERO) ? -t2 : t2;
+ t4 = gi*ua10.d+t3*ub10.d;
+- if ((y=gi-(t2-t4))==gi-(t2+t4)) return (-sy*y); }
++ if ((y=gi-(t2-t4))==gi-(t2+t4)) { retval = (-sy*y); goto ret; } }
+ else {
+ /* tan */
+ t2 = pz*(gi+fi)/(gi-pz);
+- if ((y=fi+(t2-fi*u9.d))==fi+(t2+fi*u9.d)) return (sy*y);
++ if ((y=fi+(t2-fi*u9.d))==fi+(t2+fi*u9.d)) { retval = (sy*y); goto ret; }
+ t3 = (t2<ZERO) ? -t2 : t2;
+ t4 = fi*ua9.d+t3*ub9.d;
+- if ((y=fi+(t2-t4))==fi+(t2+t4)) return (sy*y); }
++ if ((y=fi+(t2-t4))==fi+(t2+t4)) { retval = (sy*y); goto ret; } }
+
+ /* Second stage */
+ ffi = xfg[i][3].d;
+@@ -252,13 +263,14 @@ double tan(double x) {
+ if (n) {
+ /* -cot */
+ DIV2(c1,cc1,c2,cc2,c3,cc3,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c3+(cc3-u12.d*c3))==c3+(cc3+u12.d*c3)) return (-sy*y); }
++ if ((y=c3+(cc3-u12.d*c3))==c3+(cc3+u12.d*c3)) { retval = (-sy*y); goto ret; } }
+ else {
+ /* tan */
+ DIV2(c2,cc2,c1,cc1,c3,cc3,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c3+(cc3-u11.d*c3))==c3+(cc3+u11.d*c3)) return (sy*y); }
++ if ((y=c3+(cc3-u11.d*c3))==c3+(cc3+u11.d*c3)) { retval = (sy*y); goto ret; } }
+
+- return tanMp(x);
++ retval = tanMp(x);
++ goto ret;
+ }
+
+ /* (---) The case 25 < abs(x) <= 1e8 */
+@@ -280,7 +292,7 @@ double tan(double x) {
+ else {ya= a; yya= da; sy= ONE;}
+
+ /* (+++) The case 25 < abs(x) <= 1e8, abs(y) <= 1e-7 */
+- if (ya<=gy1.d) return tanMp(x);
++ if (ya<=gy1.d) { retval = tanMp(x); goto ret; }
+
+ /* (VIII) The case 25 < abs(x) <= 1e8, 1e-7 < abs(y) <= 0.0608 */
+ if (ya<=gy2.d) {
+@@ -290,10 +302,10 @@ double tan(double x) {
+ /* First stage -cot */
+ EADD(a,t2,b,db)
+ DIV2(one.d,zero.d,b,db,c,dc,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c+(dc-u14.d*c))==c+(dc+u14.d*c)) return (-y); }
++ if ((y=c+(dc-u14.d*c))==c+(dc+u14.d*c)) { retval = (-y); goto ret; } }
+ else {
+ /* First stage tan */
+- if ((y=a+(t2-u13.d*a))==a+(t2+u13.d*a)) return y; }
++ if ((y=a+(t2-u13.d*a))==a+(t2+u13.d*a)) { retval = y; goto ret; } }
+
+ /* Second stage */
+ MUL2(a,da,a,da,x2,xx2,t1,t2,t3,t4,t5,t6,t7,t8)
+@@ -317,11 +329,12 @@ double tan(double x) {
+ if (n) {
+ /* Second stage -cot */
+ DIV2(one.d,zero.d,c1,cc1,c2,cc2,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c2+(cc2-u16.d*c2)) == c2+(cc2+u16.d*c2)) return (-y); }
++ if ((y=c2+(cc2-u16.d*c2)) == c2+(cc2+u16.d*c2)) { retval = (-y); goto ret; } }
+ else {
+ /* Second stage tan */
+- if ((y=c1+(cc1-u15.d*c1)) == c1+(cc1+u15.d*c1)) return (y); }
+- return tanMp(x);
++ if ((y=c1+(cc1-u15.d*c1)) == c1+(cc1+u15.d*c1)) { retval = (y); goto ret; } }
++ retval = tanMp(x);
++ goto ret;
+ }
+
+ /* (IX) The case 25 < abs(x) <= 1e8, 0.0608 < abs(y) <= 0.787 */
+@@ -334,17 +347,17 @@ double tan(double x) {
+ if (n) {
+ /* -cot */
+ t2 = pz*(fi+gi)/(fi+pz);
+- if ((y=gi-(t2-gi*u18.d))==gi-(t2+gi*u18.d)) return (-sy*y);
++ if ((y=gi-(t2-gi*u18.d))==gi-(t2+gi*u18.d)) { retval = (-sy*y); goto ret; }
+ t3 = (t2<ZERO) ? -t2 : t2;
+ t4 = gi*ua18.d+t3*ub18.d;
+- if ((y=gi-(t2-t4))==gi-(t2+t4)) return (-sy*y); }
++ if ((y=gi-(t2-t4))==gi-(t2+t4)) { retval = (-sy*y); goto ret; } }
+ else {
+ /* tan */
+ t2 = pz*(gi+fi)/(gi-pz);
+- if ((y=fi+(t2-fi*u17.d))==fi+(t2+fi*u17.d)) return (sy*y);
++ if ((y=fi+(t2-fi*u17.d))==fi+(t2+fi*u17.d)) { retval = (sy*y); goto ret; }
+ t3 = (t2<ZERO) ? -t2 : t2;
+ t4 = fi*ua17.d+t3*ub17.d;
+- if ((y=fi+(t2-t4))==fi+(t2+t4)) return (sy*y); }
++ if ((y=fi+(t2-t4))==fi+(t2+t4)) { retval = (sy*y); goto ret; } }
+
+ /* Second stage */
+ ffi = xfg[i][3].d;
+@@ -365,12 +378,13 @@ double tan(double x) {
+ if (n) {
+ /* -cot */
+ DIV2(c1,cc1,c2,cc2,c3,cc3,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c3+(cc3-u20.d*c3))==c3+(cc3+u20.d*c3)) return (-sy*y); }
++ if ((y=c3+(cc3-u20.d*c3))==c3+(cc3+u20.d*c3)) { retval = (-sy*y); goto ret; } }
+ else {
+ /* tan */
+ DIV2(c2,cc2,c1,cc1,c3,cc3,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c3+(cc3-u19.d*c3))==c3+(cc3+u19.d*c3)) return (sy*y); }
+- return tanMp(x);
++ if ((y=c3+(cc3-u19.d*c3))==c3+(cc3+u19.d*c3)) { retval = (sy*y); goto ret; } }
++ retval = tanMp(x);
++ goto ret;
+ }
+
+ /* (---) The case 1e8 < abs(x) < 2**1024 */
+@@ -381,7 +395,7 @@ double tan(double x) {
+ else {ya= a; yya= da; sy= ONE;}
+
+ /* (+++) The case 1e8 < abs(x) < 2**1024, abs(y) <= 1e-7 */
+- if (ya<=gy1.d) return tanMp(x);
++ if (ya<=gy1.d) { retval = tanMp(x); goto ret; }
+
+ /* (X) The case 1e8 < abs(x) < 2**1024, 1e-7 < abs(y) <= 0.0608 */
+ if (ya<=gy2.d) {
+@@ -391,10 +405,10 @@ double tan(double x) {
+ /* First stage -cot */
+ EADD(a,t2,b,db)
+ DIV2(one.d,zero.d,b,db,c,dc,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c+(dc-u22.d*c))==c+(dc+u22.d*c)) return (-y); }
++ if ((y=c+(dc-u22.d*c))==c+(dc+u22.d*c)) { retval = (-y); goto ret; } }
+ else {
+ /* First stage tan */
+- if ((y=a+(t2-u21.d*a))==a+(t2+u21.d*a)) return y; }
++ if ((y=a+(t2-u21.d*a))==a+(t2+u21.d*a)) { retval = y; goto ret; } }
+
+ /* Second stage */
+ /* Reduction by algorithm iv */
+@@ -423,11 +437,12 @@ double tan(double x) {
+ if (n) {
+ /* Second stage -cot */
+ DIV2(one.d,zero.d,c1,cc1,c2,cc2,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c2+(cc2-u24.d*c2)) == c2+(cc2+u24.d*c2)) return (-y); }
++ if ((y=c2+(cc2-u24.d*c2)) == c2+(cc2+u24.d*c2)) { retval = (-y); goto ret; } }
+ else {
+ /* Second stage tan */
+- if ((y=c1+(cc1-u23.d*c1)) == c1+(cc1+u23.d*c1)) return y; }
+- return tanMp(x);
++ if ((y=c1+(cc1-u23.d*c1)) == c1+(cc1+u23.d*c1)) { retval = y; goto ret; } }
++ retval = tanMp(x);
++ goto ret;
+ }
+
+ /* (XI) The case 1e8 < abs(x) < 2**1024, 0.0608 < abs(y) <= 0.787 */
+@@ -440,17 +455,17 @@ double tan(double x) {
+ if (n) {
+ /* -cot */
+ t2 = pz*(fi+gi)/(fi+pz);
+- if ((y=gi-(t2-gi*u26.d))==gi-(t2+gi*u26.d)) return (-sy*y);
++ if ((y=gi-(t2-gi*u26.d))==gi-(t2+gi*u26.d)) { retval = (-sy*y); goto ret; }
+ t3 = (t2<ZERO) ? -t2 : t2;
+ t4 = gi*ua26.d+t3*ub26.d;
+- if ((y=gi-(t2-t4))==gi-(t2+t4)) return (-sy*y); }
++ if ((y=gi-(t2-t4))==gi-(t2+t4)) { retval = (-sy*y); goto ret; } }
+ else {
+ /* tan */
+ t2 = pz*(gi+fi)/(gi-pz);
+- if ((y=fi+(t2-fi*u25.d))==fi+(t2+fi*u25.d)) return (sy*y);
++ if ((y=fi+(t2-fi*u25.d))==fi+(t2+fi*u25.d)) { retval = (sy*y); goto ret; }
+ t3 = (t2<ZERO) ? -t2 : t2;
+ t4 = fi*ua25.d+t3*ub25.d;
+- if ((y=fi+(t2-t4))==fi+(t2+t4)) return (sy*y); }
++ if ((y=fi+(t2-t4))==fi+(t2+t4)) { retval = (sy*y); goto ret; } }
+
+ /* Second stage */
+ ffi = xfg[i][3].d;
+@@ -471,15 +486,19 @@ double tan(double x) {
+ if (n) {
+ /* -cot */
+ DIV2(c1,cc1,c2,cc2,c3,cc3,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c3+(cc3-u28.d*c3))==c3+(cc3+u28.d*c3)) return (-sy*y); }
++ if ((y=c3+(cc3-u28.d*c3))==c3+(cc3+u28.d*c3)) { retval = (-sy*y); goto ret; } }
+ else {
+ /* tan */
+ DIV2(c2,cc2,c1,cc1,c3,cc3,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
+- if ((y=c3+(cc3-u27.d*c3))==c3+(cc3+u27.d*c3)) return (sy*y); }
+- return tanMp(x);
++ if ((y=c3+(cc3-u27.d*c3))==c3+(cc3+u27.d*c3)) { retval = (sy*y); goto ret; } }
++ retval = tanMp(x);
++ goto ret;
++
++ ret:
++ libc_feupdateenv (&env);
++ return retval;
+ }
+
+-
+ /* multiple precision stage */
+ /* Convert x to multi precision number,compute tan(x) by mptan() routine */
+ /* and converts result back to double */
+diff -Nrup a/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c
+--- a/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c 2012-08-06 09:54:00.828929666 -0600
+@@ -24,22 +24,14 @@
+ #include "math.h"
+ #include "math_private.h"
+
+-#ifdef __STDC__
+ static const double
+-#else
+-static double
+-#endif
+ TWO52[2]={
+ 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
+ -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
+ };
+
+-#ifdef __STDC__
+- double __nearbyint(double x)
+-#else
+- double __nearbyint(x)
+- double x;
+-#endif
++double
++__nearbyint(double x)
+ {
+ fenv_t env;
+ int64_t i0,sx;
+@@ -47,20 +39,19 @@ TWO52[2]={
+ EXTRACT_WORDS64(i0,x);
+ sx = (i0>>63)&1;
+ j0 = ((i0>>52)&0x7ff)-0x3ff;
+- if(j0<52) {
++ if(__builtin_expect(j0<52, 1)) {
+ if(j0<0) {
+ if((i0&UINT64_C(0x7fffffffffffffff))==0) return x;
+ uint64_t i = i0 & UINT64_C(0xfffffffffffff);
+ i0 &= UINT64_C(0xfffe000000000000);
+ i0 |= (((i|-i) >> 12) & UINT64_C(0x8000000000000));
+ INSERT_WORDS64(x,i0);
+- feholdexcept (&env);
++ libc_feholdexcept (&env);
+ double w = TWO52[sx]+x;
+ double t = w-TWO52[sx];
+- fesetenv (&env);
+- EXTRACT_WORDS64(i0,t);
+- INSERT_WORDS64(t,(i0&UINT64_C(0x7fffffffffffffff))|(sx<<63));
+- return t;
++ math_opt_barrier(t);
++ libc_fesetenv (&env);
++ return copysign(t, x);
+ } else {
+ uint64_t i = UINT64_C(0x000fffffffffffff)>>j0;
+ if((i0&i)==0) return x; /* x is integral */
+@@ -73,10 +64,11 @@ TWO52[2]={
+ else return x; /* x is integral */
+ }
+ INSERT_WORDS64(x,i0);
+- feholdexcept (&env);
++ libc_feholdexcept (&env);
+ double w = TWO52[sx]+x;
+ double t = w-TWO52[sx];
+- fesetenv (&env);
++ math_opt_barrier (t);
++ libc_fesetenv (&env);
+ return t;
+ }
+ weak_alias (__nearbyint, nearbyint)
+diff -Nrup a/sysdeps/ieee754/flt-32/e_exp2f.c b/sysdeps/ieee754/flt-32/e_exp2f.c
+--- a/sysdeps/ieee754/flt-32/e_exp2f.c 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/ieee754/flt-32/e_exp2f.c 2012-08-06 09:54:00.829929661 -0600
+@@ -56,11 +56,7 @@ __ieee754_exp2f (float x)
+ union ieee754_float ex2_u, scale_u;
+ fenv_t oldenv;
+
+- feholdexcept (&oldenv);
+-#ifdef FE_TONEAREST
+- /* If we don't have this, it's too bad. */
+- fesetround (FE_TONEAREST);
+-#endif
++ libc_feholdexcept_setroundf (&oldenv, FE_TONEAREST);
+
+ /* 1. Argument reduction.
+ Choose integers ex, -128 <= t < 128, and some real
+@@ -103,7 +99,7 @@ __ieee754_exp2f (float x)
+ x22 = (.24022656679f * x + .69314736128f) * ex2_u.f;
+
+ /* 5. Return (2^x2-1) * 2^(t/512+e+ex) + 2^(t/512+e+ex). */
+- fesetenv (&oldenv);
++ libc_fesetenv (&oldenv);
+
+ result = x22 * x + ex2_u.f;
+
+diff -Nrup a/sysdeps/ieee754/flt-32/e_expf.c b/sysdeps/ieee754/flt-32/e_expf.c
+--- a/sysdeps/ieee754/flt-32/e_expf.c 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/ieee754/flt-32/e_expf.c 2012-08-06 09:54:00.829929661 -0600
+@@ -47,9 +47,6 @@
+ to perform an 'accurate table method' expf, because of the range reduction
+ overhead (compare exp2f).
+ */
+-#ifndef _GNU_SOURCE
+-#define _GNU_SOURCE
+-#endif
+ #include <float.h>
+ #include <ieee754.h>
+ #include <math.h>
+@@ -60,8 +57,8 @@
+ extern const float __exp_deltatable[178];
+ extern const double __exp_atable[355] /* __attribute__((mode(DF))) */;
+
+-static const volatile float TWOM100 = 7.88860905e-31;
+-static const volatile float TWO127 = 1.7014118346e+38;
++static const float TWOM100 = 7.88860905e-31;
++static const float TWO127 = 1.7014118346e+38;
+
+ float
+ __ieee754_expf (float x)
+@@ -86,10 +83,7 @@ __ieee754_expf (float x)
+ union ieee754_double ex2_u;
+ fenv_t oldenv;
+
+- feholdexcept (&oldenv);
+-#ifdef FE_TONEAREST
+- fesetround (FE_TONEAREST);
+-#endif
++ libc_feholdexcept_setroundf (&oldenv, FE_TONEAREST);
+
+ /* Calculate n. */
+ n = x * M_1_LN2 + THREEp22;
+@@ -119,7 +113,7 @@ __ieee754_expf (float x)
+ x22 = (0.5000000496709180453 * dx + 1.0000001192102037084) * dx + delta;
+
+ /* Return result. */
+- fesetenv (&oldenv);
++ libc_fesetenvf (&oldenv);
+
+ result = x22 * ex2_u.d + ex2_u.d;
+ return (float) result;
+diff -Nrup a/sysdeps/ieee754/flt-32/s_nearbyintf.c b/sysdeps/ieee754/flt-32/s_nearbyintf.c
+--- a/sysdeps/ieee754/flt-32/s_nearbyintf.c 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/ieee754/flt-32/s_nearbyintf.c 2012-08-06 09:54:00.891929402 -0600
+@@ -19,22 +19,14 @@
+ #include "math.h"
+ #include "math_private.h"
+
+-#ifdef __STDC__
+ static const float
+-#else
+-static float
+-#endif
+ TWO23[2]={
+ 8.3886080000e+06, /* 0x4b000000 */
+ -8.3886080000e+06, /* 0xcb000000 */
+ };
+
+-#ifdef __STDC__
+- float __nearbyintf(float x)
+-#else
+- float __nearbyintf(x)
+- float x;
+-#endif
++float
++__nearbyintf(float x)
+ {
+ fenv_t env;
+ int32_t i0,j0,sx;
+@@ -50,13 +42,13 @@ TWO23[2]={
+ i0 &= 0xfff00000;
+ i0 |= ((i1|-i1)>>9)&0x400000;
+ SET_FLOAT_WORD(x,i0);
+- feholdexcept (&env);
+- w = TWO23[sx]+x;
+- t = w-TWO23[sx];
+- fesetenv (&env);
++ libc_feholdexceptf (&env);
++ w = TWO23[sx]+x;
++ t = w-TWO23[sx];
++ libc_fesetenvf (&env);
+ GET_FLOAT_WORD(i0,t);
+ SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
+- return t;
++ return t;
+ } else {
+ i = (0x007fffff)>>j0;
+ if((i0&i)==0) return x; /* x is integral */
+@@ -64,14 +56,14 @@ TWO23[2]={
+ if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0);
+ }
+ } else {
+- if(j0==0x80) return x+x; /* inf or NaN */
++ if(__builtin_expect(j0==0x80, 0)) return x+x; /* inf or NaN */
+ else return x; /* x is integral */
+ }
+ SET_FLOAT_WORD(x,i0);
+- feholdexcept (&env);
++ libc_feholdexceptf (&env);
+ w = TWO23[sx]+x;
+ t = w-TWO23[sx];
+- fesetenv (&env);
++ libc_fesetenvf (&env);
+ return t;
+ }
+ weak_alias (__nearbyintf, nearbyintf)
+diff -Nrup a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
+--- a/sysdeps/powerpc/fpu/libm-test-ulps 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/powerpc/fpu/libm-test-ulps 2012-08-06 10:03:24.424569052 -0600
+@@ -37,16 +37,9 @@ ildouble: 1
+ ldouble: 1
+
+ # cacosh
+-Test "Real part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+-double: 1
+-float: 7
+-idouble: 1
+-ifloat: 7
+ Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+-double: 1
+-float: 3
+-idouble: 1
+-ifloat: 3
++float: 1
++ifloat: 1
+
+ # casin
+ Test "Real part of: casin (-2 - 3 i) == -0.57065278432109940071028387968566963 - 1.9833870299165354323470769028940395 i":
+@@ -84,8 +77,6 @@ ifloat: 1
+
+ # catan
+ Test "Real part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i":
+-float: 3
+-ifloat: 3
+ ildouble: 1
+ ldouble: 1
+ Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i":
+@@ -93,23 +84,14 @@ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-Test "Real part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i":
+-float: 4
+-ifloat: 4
+
+ # catanh
+ Test "Real part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i":
+ double: 4
+ idouble: 4
+-Test "Imaginary part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i":
+-float: 4
+-ifloat: 4
+ Test "Real part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i":
+ double: 1
+ idouble: 1
+-Test "Imaginary part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i":
+-float: 6
+-ifloat: 6
+
+ # cbrt
+ Test "cbrt (-27.0) == -3.0":
+@@ -167,8 +149,6 @@ ldouble: 1
+
+ # clog
+ Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680267437207826593 - 2.1587989303424641704769327722648368 i":
+-float: 3
+-ifloat: 3
+ ildouble: 1
+ ldouble: 1
+ Test "Real part of: clog (0.75 + 1.25 i) == 0.376885901188190075998919126749298416 + 1.03037682652431246378774332703115153 i":
+@@ -197,9 +177,7 @@ ildouble: 1
+ ldouble: 1
+ Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i":
+ double: 1
+-float: 5
+ idouble: 1
+-ifloat: 5
+ ildouble: 1
+ ldouble: 1
+ Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i":
+@@ -298,23 +276,165 @@ ldouble: 1
+ # cos
+ Test "cos (M_PI_6l * 2.0) == 0.5":
+ double: 1
+-float: 1
+ idouble: 1
+-ifloat: 1
+ Test "cos (M_PI_6l * 4.0) == -0.5":
+ double: 2
+ float: 1
+ idouble: 2
+ ifloat: 1
+-Test "cos (pi/2) == 0":
+-double: 1
++
++# cos_downward
++Test "cos_downward (1) == 0.5403023058681397174009366074429766037323":
++float: 1
++ifloat: 1
++ildouble: 4
++ldouble: 4
++Test "cos_downward (10) == -0.8390715290764524522588639478240648345199":
++ildouble: 1
++ldouble: 1
++Test "cos_downward (2) == -0.4161468365471423869975682295007621897660":
++float: 1
++ifloat: 1
++Test "cos_downward (3) == -0.9899924966004454572715727947312613023937":
++float: 1
++ifloat: 1
++Test "cos_downward (4) == -0.6536436208636119146391681830977503814241":
++float: 1
++ifloat: 1
++Test "cos_downward (5) == 0.2836621854632262644666391715135573083344":
++float: 1
++ifloat: 1
++Test "cos_downward (6) == 0.9601702866503660205456522979229244054519":
++ildouble: 1
++ldouble: 1
++Test "cos_downward (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++Test "cos_downward (8) == -0.1455000338086135258688413818311946826093":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "cos_downward (9) == -0.9111302618846769883682947111811653112463":
++ildouble: 1
++ldouble: 1
++
++# cos_tonearest
++Test "cos_tonearest (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++
++# cos_towardzero
++Test "cos_towardzero (1) == 0.5403023058681397174009366074429766037323":
++ildouble: 2
++ldouble: 2
++Test "cos_towardzero (10) == -0.8390715290764524522588639478240648345199":
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (2) == -0.4161468365471423869975682295007621897660":
++float: 1
++ifloat: 1
++Test "cos_towardzero (3) == -0.9899924966004454572715727947312613023937":
++float: 1
++ifloat: 1
++Test "cos_towardzero (4) == -0.6536436208636119146391681830977503814241":
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (5) == 0.2836621854632262644666391715135573083344":
++float: 1
++ifloat: 1
++Test "cos_towardzero (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++Test "cos_towardzero (8) == -0.1455000338086135258688413818311946826093":
+ float: 1
+-idouble: 1
+ ifloat: 1
+-Test "cos (16.0) == -0.9576594803233846418996372326511034717803"
+ ildouble: 2
+ ldouble: 2
+
++# cos_upward
++Test "cos_upward (1) == 0.5403023058681397174009366074429766037323":
++ildouble: 2
++ldouble: 2
++Test "cos_upward (10) == -0.8390715290764524522588639478240648345199":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_upward (4) == -0.6536436208636119146391681830977503814241":
++ildouble: 1
++ldouble: 1
++Test "cos_upward (5) == 0.2836621854632262644666391715135573083344":
++ildouble: 1
++ldouble: 1
++Test "cos_upward (6) == 0.9601702866503660205456522979229244054519":
++float: 1
++ifloat: 1
++Test "cos_upward (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_upward (9) == -0.9111302618846769883682947111811653112463":
++float: 2
++ifloat: 2
++
++# cosh_downward
++Test "cosh_downward (22) == 1792456423.065795780980053377632656584997":
++float: 1
++ifloat: 1
++ildouble: 5269156250720
++ldouble: 5269156250720
++Test "cosh_downward (23) == 4872401723.124451300068625740569997090344":
++float: 1
++ifloat: 1
++ildouble: 484603564240
++ldouble: 484603564240
++Test "cosh_downward (24) == 13244561064.92173614708845674912733665919":
++float: 1
++ifloat: 1
++ildouble: 89137844202
++ldouble: 89137844202
++
++# cosh_tonearest
++Test "cosh_tonearest (22) == 1792456423.065795780980053377632656584997":
++ildouble: 5269156250719
++ldouble: 5269156250719
++Test "cosh_tonearest (23) == 4872401723.124451300068625740569997090344":
++ildouble: 484603564240
++ldouble: 484603564240
++Test "cosh_tonearest (24) == 13244561064.92173614708845674912733665919":
++ildouble: 89137844202
++ldouble: 89137844202
++
++# cosh_towardzero
++Test "cosh_towardzero (22) == 1792456423.065795780980053377632656584997":
++float: 1
++ifloat: 1
++ildouble: 5269156250720
++ldouble: 5269156250720
++Test "cosh_towardzero (23) == 4872401723.124451300068625740569997090344":
++float: 1
++ifloat: 1
++ildouble: 484603564240
++ldouble: 484603564240
++Test "cosh_towardzero (24) == 13244561064.92173614708845674912733665919":
++float: 1
++ifloat: 1
++ildouble: 89137844202
++ldouble: 89137844202
++
++# cosh_upward
++Test "cosh_upward (22) == 1792456423.065795780980053377632656584997":
++ildouble: 5269156250719
++ldouble: 5269156250719
++Test "cosh_upward (23) == 4872401723.124451300068625740569997090344":
++ildouble: 484603564240
++ldouble: 484603564240
++Test "cosh_upward (24) == 13244561064.92173614708845674912733665919":
++ildouble: 89137844200
++ldouble: 89137844200
++
+ # cpow
+ Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i":
+ float: 1
+@@ -386,12 +506,6 @@ float: 1
+ ifloat: 1
+
+ # ctan
+-Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i":
+-double: 1
+-idouble: 1
+-Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i":
+-ildouble: 1
+-ldouble: 1
+ Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i":
+ double: 1
+ idouble: 1
+@@ -463,6 +577,33 @@ Test "exp2 (10) == 1024":
+ ildouble: 2
+ ldouble: 2
+
++# exp_downward
++Test "exp_downward (2) == e^2":
++float: 1
++ifloat: 1
++Test "exp_downward (3) == e^3":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# exp_towardzero
++Test "exp_towardzero (2) == e^2":
++float: 1
++ifloat: 1
++Test "exp_towardzero (3) == e^3":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# exp_upward
++Test "exp_upward (1) == e":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
+ # expm1
+ Test "expm1 (0.75) == 1.11700001661267466854536981983709561":
+ double: 1
+@@ -505,40 +646,27 @@ ifloat: 1
+ # j0
+ Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
+-ildouble: 1
+-ldouble: 1
++ifloat: 1
+ Test "j0 (10.0) == -0.245935764451348335197760862485328754":
+-double: 3
++double: 2
+ float: 1
+-idouble: 3
++idouble: 2
+ ifloat: 1
+-ildouble: 1
+-ldouble: 1
+-Test "j0 (2.0) == 0.223890779141235668051827454649948626":
+-float: 2
+-ifloat: 2
+ Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
+-ildouble: 1
+-ldouble: 1
++ifloat: 1
+ Test "j0 (8.0) == 0.171650807137553906090869407851972001":
+ float: 1
+ ifloat: 1
+-ildouble: 1
+-ldouble: 1
+
+ # j1
+ Test "j1 (10.0) == 0.0434727461688614366697487680258592883":
+ float: 2
+ ifloat: 2
+-ildouble: 1
+-ldouble: 1
+ Test "j1 (2.0) == 0.576724807756873387202448242269137087":
+ double: 1
+ idouble: 1
+@@ -551,38 +679,25 @@ ldouble: 1
+ # jn
+ Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
+-ildouble: 1
+-ldouble: 1
++ifloat: 1
+ Test "jn (0, 10.0) == -0.245935764451348335197760862485328754":
+-double: 3
++double: 2
+ float: 1
+-idouble: 3
++idouble: 2
+ ifloat: 1
+-ildouble: 1
+-ldouble: 1
+-Test "jn (0, 2.0) == 0.223890779141235668051827454649948626":
+-float: 2
+-ifloat: 2
+ Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
+-ildouble: 1
+-ldouble: 1
++ifloat: 1
+ Test "jn (0, 8.0) == 0.171650807137553906090869407851972001":
+ float: 1
+ ifloat: 1
+-ildouble: 1
+-ldouble: 1
+ Test "jn (1, 10.0) == 0.0434727461688614366697487680258592883":
+ float: 2
+ ifloat: 2
+-ildouble: 1
+-ldouble: 1
+ Test "jn (1, 2.0) == 0.576724807756873387202448242269137087":
+ double: 1
+ idouble: 1
+@@ -615,11 +730,8 @@ ifloat: 1
+ ildouble: 4
+ ldouble: 4
+ Test "jn (10, 2.0) == 0.251538628271673670963516093751820639e-6":
+-float: 4
+-ifloat: 4
+-Test "jn (3, -1.0) == -0.0195633539826684059189053216217515083":
+-ildouble: 1
+-ldouble: 1
++float: 3
++ifloat: 3
+ Test "jn (3, 0.125) == 0.406503832554912875023029337653442868e-4":
+ double: 1
+ float: 1
+@@ -628,21 +740,18 @@ ifloat: 1
+ Test "jn (3, 0.75) == 0.848438342327410884392755236884386804e-2":
+ double: 1
+ idouble: 1
+-Test "jn (3, 1.0) == 0.0195633539826684059189053216217515083":
+-ildouble: 1
+-ldouble: 1
+ Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563":
+ double: 3
+-float: 2
++float: 1
+ idouble: 3
+-ifloat: 2
++ifloat: 1
+ ildouble: 2
+ ldouble: 2
+ Test "jn (3, 2.0) == 0.128943249474402051098793332969239835":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
++ifloat: 1
+ ildouble: 2
+ ldouble: 2
+
+@@ -675,115 +784,350 @@ Test "log1p (-0.25) == -0.28768207245178
+ float: 1
+ ifloat: 1
+
+-# log2
+-Test "log2 (e) == M_LOG2El":
++# pow_downward
++Test "pow_downward (1.0625, 1.125) == 1.070582293028761362162622578677070098674":
+ ildouble: 1
+ ldouble: 1
+-
+-# sin
+-Test "sin (16.0) == -0.2879033166650652947844562482186175296207"
+-ildouble: 2
+-ldouble: 2
+-
+-# sincos
+-Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
+-double: 1
+-float: 1
+-idouble: 1
+-ifloat: 1
+-Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res":
+-double: 1
++Test "pow_downward (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
+ float: 1
+-idouble: 1
+ ifloat: 1
+-Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res":
+-double: 1
++
++# pow_towardzero
++Test "pow_towardzero (1.0625, 1.125) == 1.070582293028761362162622578677070098674":
++ildouble: 1
++ldouble: 1
++Test "pow_towardzero (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
+ float: 1
+-idouble: 1
+ ifloat: 1
+-Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res":
++
++# pow_upward
++Test "pow_upward (1.0625, 1.125) == 1.070582293028761362162622578677070098674":
+ float: 1
+ ifloat: 1
+-
+-# sinh
+-Test "sinh (0.75) == 0.822316731935829980703661634446913849":
++Test "pow_upward (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
+ ildouble: 1
+ ldouble: 1
+
+-# tan
+-Test "tan (pi/4) == 1":
+-double: 1
+-idouble: 1
++# sin_downward
++Test "sin_downward (1) == 0.8414709848078965066525023216302989996226":
++ildouble: 4
++ldouble: 4
++Test "sin_downward (10) == -0.5440211108893698134047476618513772816836":
++float: 1
++ifloat: 1
++Test "sin_downward (2) == 0.9092974268256816953960198659117448427023":
+ ildouble: 1
+ ldouble: 1
+-
+-# tanh
+-Test "tanh (-0.75) == -0.635148952387287319214434357312496495":
++Test "sin_downward (3) == 0.1411200080598672221007448028081102798469":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "sin_downward (4) == -0.7568024953079282513726390945118290941359":
+ ildouble: 1
+ ldouble: 1
+-Test "tanh (0.75) == 0.635148952387287319214434357312496495":
++Test "sin_downward (5) == -0.9589242746631384688931544061559939733525":
++float: 1
++ifloat: 1
++Test "sin_downward (6) == -0.2794154981989258728115554466118947596280":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "sin_downward (8) == 0.9893582466233817778081235982452886721164":
+ ildouble: 1
+ ldouble: 1
+
+-# tgamma
+-Test "tgamma (-0.5) == -2 sqrt (pi)":
+-double: 1
++# sin_tonearest
++Test "sin_tonearest (1) == 0.8414709848078965066525023216302989996226":
+ float: 1
+-idouble: 1
+ ifloat: 1
+-Test "tgamma (0.5) == sqrt (pi)":
++
++# sin_towardzero
++Test "sin_towardzero (1) == 0.8414709848078965066525023216302989996226":
+ float: 1
+ ifloat: 1
+-Test "tgamma (0.7) == 1.29805533264755778568117117915281162":
+-double: 1
++ildouble: 2
++ldouble: 2
++Test "sin_towardzero (10) == -0.5440211108893698134047476618513772816836":
+ float: 1
+-idouble: 1
+ ifloat: 1
+-
+-# y0
+-Test "y0 (0.125) == -1.38968062514384052915582277745018693":
++Test "sin_towardzero (2) == 0.9092974268256816953960198659117448427023":
+ ildouble: 1
+ ldouble: 1
+-Test "y0 (0.75) == -0.137172769385772397522814379396581855":
++Test "sin_towardzero (3) == 0.1411200080598672221007448028081102798469":
+ ildouble: 1
+ ldouble: 1
+-Test "y0 (1.0) == 0.0882569642156769579829267660235151628":
+-double: 2
++Test "sin_towardzero (4) == -0.7568024953079282513726390945118290941359":
++float: 1
++ifloat: 1
++Test "sin_towardzero (5) == -0.9589242746631384688931544061559939733525":
+ float: 1
+-idouble: 2
+ ifloat: 1
++Test "sin_towardzero (8) == 0.9893582466233817778081235982452886721164":
+ ildouble: 1
+ ldouble: 1
+-Test "y0 (1.5) == 0.382448923797758843955068554978089862":
+-double: 2
++Test "sin_towardzero (9) == 0.4121184852417565697562725663524351793439":
+ float: 1
+-idouble: 2
+ ifloat: 1
+-Test "y0 (10.0) == 0.0556711672835993914244598774101900481":
++ildouble: 1
++ldouble: 1
++
++# sin_upward
++Test "sin_upward (1) == 0.8414709848078965066525023216302989996226":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "sin_upward (2) == 0.9092974268256816953960198659117448427023":
++float: 2
++ifloat: 2
++Test "sin_upward (3) == 0.1411200080598672221007448028081102798469":
++ildouble: 1
++ldouble: 1
++Test "sin_upward (4) == -0.7568024953079282513726390945118290941359":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sin_upward (6) == -0.2794154981989258728115554466118947596280":
++ildouble: 1
++ldouble: 1
++Test "sin_upward (9) == 0.4121184852417565697562725663524351793439":
++float: 1
++ifloat: 1
++
++# sincos
++Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
++double: 1
++idouble: 1
++Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
++Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res":
++float: 1
++ifloat: 1
++
++# sinh
++Test "sinh (0.75) == 0.822316731935829980703661634446913849":
+ ildouble: 1
+ ldouble: 1
+-Test "y0 (2.0) == 0.510375672649745119596606592727157873":
++
++# sinh_downward
++Test "sinh_downward (22) == 1792456423.065795780701106568345764104225":
++float: 1
++ifloat: 1
++ildouble: 5269156250718
++ldouble: 5269156250718
++Test "sinh_downward (23) == 4872401723.124451299966006944252978187305":
++float: 1
++ifloat: 1
++ildouble: 484603564240
++ldouble: 484603564240
++Test "sinh_downward (24) == 13244561064.92173614705070540368454568168":
++float: 1
++ifloat: 1
++ildouble: 89137844201
++ldouble: 89137844201
++
++# sinh_tonearest
++Test "sinh_tonearest (22) == 1792456423.065795780701106568345764104225":
++ildouble: 5269156250719
++ldouble: 5269156250719
++Test "sinh_tonearest (23) == 4872401723.124451299966006944252978187305":
++ildouble: 484603564241
++ldouble: 484603564241
++Test "sinh_tonearest (24) == 13244561064.92173614705070540368454568168":
++ildouble: 89137844201
++ldouble: 89137844201
++
++# sinh_towardzero
++Test "sinh_towardzero (22) == 1792456423.065795780701106568345764104225":
++float: 1
++ifloat: 1
++ildouble: 5269156250718
++ldouble: 5269156250718
++Test "sinh_towardzero (23) == 4872401723.124451299966006944252978187305":
++float: 1
++ifloat: 1
++ildouble: 484603564240
++ldouble: 484603564240
++Test "sinh_towardzero (24) == 13244561064.92173614705070540368454568168":
++float: 1
++ifloat: 1
++ildouble: 89137844201
++ldouble: 89137844201
++
++# sinh_upward
++Test "sinh_upward (22) == 1792456423.065795780701106568345764104225":
++ildouble: 5269156250719
++ldouble: 5269156250719
++Test "sinh_upward (23) == 4872401723.124451299966006944252978187305":
++ildouble: 484603564241
++ldouble: 484603564241
++Test "sinh_upward (24) == 13244561064.92173614705070540368454568168":
++ildouble: 89137844202
++ldouble: 89137844202
++
++# tan
++Test "tan (pi/4) == 1":
++ildouble: 1
++ldouble: 1
++
++# tan_downward
++Test "tan_downward (1) == 1.5574077246549022305069748074583601730873":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "tan_downward (10) == 0.6483608274590866712591249330098086768169":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "tan_downward (2) == -2.1850398632615189916433061023136825434320":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_downward (6) == -0.2910061913847491570536995888681755428312":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_downward (8) == -6.7997114552203786999252627596086333648814":
++float: 1
++ifloat: 1
++Test "tan_downward (9) == -0.4523156594418098405903708757987855343087":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# tan_tonearest
++Test "tan_tonearest (10) == 0.6483608274590866712591249330098086768169":
++ildouble: 1
++ldouble: 1
++Test "tan_tonearest (4) == 1.1578212823495775831373424182673239231198":
++ildouble: 1
++ldouble: 1
++Test "tan_tonearest (7) == 0.8714479827243187364564508896003135663222":
++ildouble: 1
++ldouble: 1
++
++# tan_towardzero
++Test "tan_towardzero (10) == 0.6483608274590866712591249330098086768169":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "tan_towardzero (3) == -0.1425465430742778052956354105339134932261":
++float: 1
++ifloat: 1
++ildouble: 3
++ldouble: 3
++Test "tan_towardzero (4) == 1.1578212823495775831373424182673239231198":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (5) == -3.3805150062465856369827058794473439087096":
++float: 1
++ifloat: 1
++Test "tan_towardzero (6) == -0.2910061913847491570536995888681755428312":
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (7) == 0.8714479827243187364564508896003135663222":
++ildouble: 2
++ldouble: 2
++Test "tan_towardzero (9) == -0.4523156594418098405903708757987855343087":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# tan_upward
++Test "tan_upward (10) == 0.6483608274590866712591249330098086768169":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (3) == -0.1425465430742778052956354105339134932261":
++float: 1
++ifloat: 1
++ildouble: 3
++ldouble: 3
++Test "tan_upward (5) == -3.3805150062465856369827058794473439087096":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_upward (6) == -0.2910061913847491570536995888681755428312":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (7) == 0.8714479827243187364564508896003135663222":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (9) == -0.4523156594418098405903708757987855343087":
++ildouble: 1
++ldouble: 1
++
++# tanh
++Test "tanh (-0.75) == -0.635148952387287319214434357312496495":
++ildouble: 1
++ldouble: 1
++Test "tanh (0.75) == 0.635148952387287319214434357312496495":
++ildouble: 1
++ldouble: 1
++
++# tgamma
++Test "tgamma (-0.5) == -2 sqrt (pi)":
+ double: 1
++float: 1
+ idouble: 1
+-Test "y0 (8.0) == 0.223521489387566220527323400498620359":
++ifloat: 1
++Test "tgamma (0.5) == sqrt (pi)":
++float: 1
++ifloat: 1
++Test "tgamma (0.7) == 1.29805533264755778568117117915281162":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
++
++# y0
++Test "y0 (0.125) == -1.38968062514384052915582277745018693":
+ ildouble: 1
+ ldouble: 1
+-
+-# y1
+-Test "y1 (0.125) == -5.19993611253477499595928744876579921":
++Test "y0 (1.0) == 0.0882569642156769579829267660235151628":
++double: 2
++float: 1
++idouble: 2
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "y0 (1.5) == 0.382448923797758843955068554978089862":
++double: 2
++float: 1
++idouble: 2
++ifloat: 1
++Test "y0 (10.0) == 0.0556711672835993914244598774101900481":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++Test "y0 (2.0) == 0.510375672649745119596606592727157873":
+ double: 1
+ idouble: 1
+-Test "y1 (1.5) == -0.412308626973911295952829820633445323":
++Test "y0 (8.0) == 0.223521489387566220527323400498620359":
++double: 1
+ float: 1
++idouble: 1
+ ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# y1
+ Test "y1 (10.0) == 0.249015424206953883923283474663222803":
+ double: 3
+ float: 1
+@@ -794,30 +1138,27 @@ ldouble: 2
+ Test "y1 (2.0) == -0.107032431540937546888370772277476637":
+ double: 1
+ float: 1
+-idouble: 2
+-ifloat: 2
++idouble: 1
++ifloat: 1
+ Test "y1 (8.0) == -0.158060461731247494255555266187483550":
+ double: 1
+ float: 2
+ idouble: 1
+ ifloat: 2
+-ildouble: 2
+-ldouble: 2
++ildouble: 1
++ldouble: 1
+
+ # yn
+ Test "yn (0, 0.125) == -1.38968062514384052915582277745018693":
+ ildouble: 1
+ ldouble: 1
+-Test "yn (0, 0.75) == -0.137172769385772397522814379396581855":
+-ildouble: 1
+-ldouble: 1
+ Test "yn (0, 1.0) == 0.0882569642156769579829267660235151628":
+ double: 2
+ float: 1
+ idouble: 2
+ ifloat: 1
+-ildouble: 2
+-ldouble: 2
++ildouble: 1
++ldouble: 1
+ Test "yn (0, 1.5) == 0.382448923797758843955068554978089862":
+ double: 2
+ float: 1
+@@ -828,8 +1169,6 @@ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-ildouble: 2
+-ldouble: 2
+ Test "yn (0, 2.0) == 0.510375672649745119596606592727157873":
+ double: 1
+ idouble: 1
+@@ -838,14 +1177,8 @@ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-ildouble: 2
+-ldouble: 2
+-Test "yn (1, 0.125) == -5.19993611253477499595928744876579921":
+-double: 1
+-idouble: 1
+-Test "yn (1, 1.5) == -0.412308626973911295952829820633445323":
+-float: 2
+-ifloat: 2
++ildouble: 1
++ldouble: 1
+ Test "yn (1, 10.0) == 0.249015424206953883923283474663222803":
+ double: 3
+ float: 1
+@@ -863,14 +1196,8 @@ double: 1
+ float: 2
+ idouble: 1
+ ifloat: 2
+-ildouble: 2
+-ldouble: 2
+-Test "yn (3, 0.125) == -2612.69757350066712600220955744091741":
+-double: 1
+-idouble: 1
+-Test "yn (10, 0.125) == -127057845771019398.252538486899753195":
+-double: 1
+-idouble: 1
++ildouble: 1
++ldouble: 1
+ Test "yn (10, 0.75) == -2133501638.90573424452445412893839236":
+ double: 1
+ float: 2
+@@ -881,21 +1208,14 @@ float: 2
+ ifloat: 2
+ Test "yn (10, 10.0) == -0.359814152183402722051986577343560609":
+ double: 2
+-float: 2
+ idouble: 2
+-ifloat: 2
+-ildouble: 2
+-ldouble: 2
+ Test "yn (10, 2.0) == -129184.542208039282635913145923304214":
+ double: 3
+ float: 1
+ idouble: 3
+ ifloat: 1
+-ildouble: 2
+-ldouble: 2
+-Test "yn (3, 0.125) == -2612.69757350066712600220955744091741":
+-double: 1
+-idouble: 1
++ildouble: 1
++ldouble: 1
+ Test "yn (3, 0.75) == -12.9877176234475433186319774484809207":
+ float: 1
+ ifloat: 1
+@@ -904,8 +1224,8 @@ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-ildouble: 2
+-ldouble: 2
++ildouble: 1
++ldouble: 1
+ Test "yn (3, 2.0) == -1.12778377684042778608158395773179238":
+ double: 1
+ idouble: 1
+@@ -950,18 +1270,12 @@ ildouble: 1
+ ldouble: 1
+
+ Function: Real part of "cacosh":
+-double: 1
+-float: 7
+-idouble: 1
+-ifloat: 7
+ ildouble: 1
+ ldouble: 1
+
+ Function: Imaginary part of "cacosh":
+-double: 1
+-float: 3
+-idouble: 1
+-ifloat: 3
++float: 1
++ifloat: 1
+
+ Function: Real part of "casin":
+ double: 1
+@@ -992,8 +1306,6 @@ ildouble: 1
+ ldouble: 1
+
+ Function: Real part of "catan":
+-float: 4
+-ifloat: 4
+ ildouble: 1
+ ldouble: 1
+
+@@ -1009,10 +1321,6 @@ Function: Real part of "catanh":
+ double: 4
+ idouble: 4
+
+-Function: Imaginary part of "catanh":
+-float: 6
+-ifloat: 6
+-
+ Function: "cbrt":
+ double: 1
+ idouble: 1
+@@ -1066,8 +1374,6 @@ ildouble: 2
+ ldouble: 2
+
+ Function: Imaginary part of "clog":
+-float: 3
+-ifloat: 3
+ ildouble: 1
+ ldouble: 1
+
+@@ -1079,9 +1385,9 @@ ldouble: 3
+
+ Function: Imaginary part of "clog10":
+ double: 1
+-float: 5
++float: 1
+ idouble: 1
+-ifloat: 5
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+@@ -1093,10 +1399,54 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
++Function: "cos_downward":
++float: 1
++ifloat: 1
++ildouble: 4
++ldouble: 4
++
++Function: "cos_tonearest":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "cos_towardzero":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "cos_upward":
++float: 2
++ifloat: 2
++ildouble: 2
++ldouble: 2
++
+ Function: "cosh":
+ ildouble: 1
+ ldouble: 1
+
++Function: "cosh_downward":
++float: 1
++ifloat: 1
++ildouble: 5269156250720
++ldouble: 5269156250720
++
++Function: "cosh_tonearest":
++ildouble: 5269156250719
++ldouble: 5269156250719
++
++Function: "cosh_towardzero":
++float: 1
++ifloat: 1
++ildouble: 5269156250720
++ldouble: 5269156250720
++
++Function: "cosh_upward":
++ildouble: 5269156250719
++ldouble: 5269156250719
++
+ Function: Real part of "cpow":
+ double: 2
+ float: 5
+@@ -1113,10 +1463,6 @@ ifloat: 2
+ ildouble: 2
+ ldouble: 2
+
+-Function: Imaginary part of "cproj":
+-ildouble: 1
+-ldouble: 1
+-
+ Function: Real part of "csin":
+ ildouble: 1
+ ldouble: 1
+@@ -1146,8 +1492,6 @@ ildouble: 1
+ ldouble: 1
+
+ Function: Real part of "ctan":
+-double: 1
+-idouble: 1
+ ildouble: 1
+ ldouble: 1
+
+@@ -1201,6 +1545,28 @@ Function: "exp2":
+ ildouble: 2
+ ldouble: 2
+
++Function: "exp_downward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "exp_tonearest":
++ildouble: 1
++ldouble: 1
++
++Function: "exp_towardzero":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "exp_upward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
+ Function: "expm1":
+ double: 1
+ float: 1
+@@ -1218,10 +1584,10 @@ ildouble: 1
+ ldouble: 1
+
+ Function: "j0":
+-double: 3
+-float: 2
+-idouble: 3
+-ifloat: 2
++double: 2
++float: 1
++idouble: 2
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+@@ -1235,9 +1601,9 @@ ldouble: 1
+
+ Function: "jn":
+ double: 3
+-float: 4
++float: 3
+ idouble: 3
+-ifloat: 4
++ifloat: 3
+ ildouble: 4
+ ldouble: 4
+
+@@ -1264,8 +1630,6 @@ ldouble: 1
+ Function: "log1p":
+ float: 1
+ ifloat: 1
+-ildouble: 1
+-ldouble: 1
+
+ Function: "log2":
+ ildouble: 1
+@@ -1275,10 +1639,52 @@ Function: "pow":
+ ildouble: 1
+ ldouble: 1
+
++Function: "pow_downward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "pow_towardzero":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "pow_upward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
+ Function: "sin":
+ ildouble: 1
+ ldouble: 1
+
++Function: "sin_downward":
++float: 1
++ifloat: 1
++ildouble: 4
++ldouble: 4
++
++Function: "sin_tonearest":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_towardzero":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "sin_upward":
++float: 2
++ifloat: 2
++ildouble: 2
++ldouble: 2
++
+ Function: "sincos":
+ double: 1
+ float: 1
+@@ -1291,12 +1697,54 @@ Function: "sinh":
+ ildouble: 1
+ ldouble: 1
+
++Function: "sinh_downward":
++float: 1
++ifloat: 1
++ildouble: 5269156250718
++ldouble: 5269156250718
++
++Function: "sinh_tonearest":
++ildouble: 5269156250719
++ldouble: 5269156250719
++
++Function: "sinh_towardzero":
++float: 1
++ifloat: 1
++ildouble: 5269156250718
++ldouble: 5269156250718
++
++Function: "sinh_upward":
++ildouble: 5269156250719
++ldouble: 5269156250719
++
+ Function: "tan":
+ double: 1
+ idouble: 1
+ ildouble: 1
+ ldouble: 1
+
++Function: "tan_downward":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "tan_tonearest":
++ildouble: 1
++ldouble: 1
++
++Function: "tan_towardzero":
++float: 1
++ifloat: 1
++ildouble: 3
++ldouble: 3
++
++Function: "tan_upward":
++float: 1
++ifloat: 1
++ildouble: 3
++ldouble: 3
++
+ Function: "tanh":
+ ildouble: 1
+ ldouble: 1
+diff -Nrup a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
+--- a/sysdeps/s390/fpu/libm-test-ulps 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/s390/fpu/libm-test-ulps 2012-08-06 09:54:38.324772546 -0600
+@@ -31,16 +31,9 @@ ildouble: 1
+ ldouble: 1
+
+ # cacosh
+-Test "Real part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+-double: 1
+-float: 7
+-idouble: 1
+-ifloat: 7
+ Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+-double: 1
+-float: 3
+-idouble: 1
+-ifloat: 3
++float: 1
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+@@ -83,17 +76,11 @@ ildouble: 1
+ ldouble: 1
+
+ # catan
+-Test "Real part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i":
+-float: 3
+-ifloat: 3
+ Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-Test "Real part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i":
+-float: 4
+-ifloat: 4
+ Test "Imaginary part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i":
+ ildouble: 1
+ ldouble: 1
+@@ -102,17 +89,12 @@ ldouble: 1
+ Test "Real part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i":
+ double: 4
+ idouble: 4
+-Test "Imaginary part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i":
+-float: 4
+-ifloat: 4
+ Test "Real part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i":
+ double: 1
+ idouble: 1
+ ildouble: 1
+ ldouble: 1
+ Test "Imaginary part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i":
+-float: 6
+-ifloat: 6
+ ildouble: 1
+ ldouble: 1
+
+@@ -185,9 +167,6 @@ ildouble: 1
+ ldouble: 1
+
+ # clog
+-Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680267437207826593 - 2.1587989303424641704769327722648368 i":
+-float: 3
+-ifloat: 3
+ Test "Real part of: clog (0.75 + 1.25 i) == 0.376885901188190075998919126749298416 + 1.03037682652431246378774332703115153 i":
+ float: 1
+ ifloat: 1
+@@ -210,9 +189,7 @@ ildouble: 1
+ ldouble: 1
+ Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i":
+ double: 1
+-float: 5
+ idouble: 1
+-ifloat: 5
+ ildouble: 1
+ ldouble: 1
+ Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i":
+@@ -288,9 +265,7 @@ ifloat: 1
+ # cos
+ Test "cos (M_PI_6l * 2.0) == 0.5":
+ double: 1
+-float: 1
+ idouble: 1
+-ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "cos (M_PI_6l * 4.0) == -0.5":
+@@ -300,11 +275,159 @@ idouble: 2
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "cos (pi/2) == 0":
+-double: 1
++
++# cos_downward
++Test "cos_downward (1) == 0.5403023058681397174009366074429766037323":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (10) == -0.8390715290764524522588639478240648345199":
++ildouble: 1
++ldouble: 1
++Test "cos_downward (2) == -0.4161468365471423869975682295007621897660":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (3) == -0.9899924966004454572715727947312613023937":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (4) == -0.6536436208636119146391681830977503814241":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (5) == 0.2836621854632262644666391715135573083344":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (6) == 0.9601702866503660205456522979229244054519":
++ildouble: 1
++ldouble: 1
++Test "cos_downward (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (8) == -0.1455000338086135258688413818311946826093":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++# cos_tonearest
++Test "cos_tonearest (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++
++# cos_towardzero
++Test "cos_towardzero (1) == 0.5403023058681397174009366074429766037323":
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (10) == -0.8390715290764524522588639478240648345199":
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (2) == -0.4161468365471423869975682295007621897660":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (3) == -0.9899924966004454572715727947312613023937":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (4) == -0.6536436208636119146391681830977503814241":
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (5) == 0.2836621854632262644666391715135573083344":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (6) == 0.9601702866503660205456522979229244054519":
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (8) == -0.1455000338086135258688413818311946826093":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++# cos_upward
++Test "cos_upward (10) == -0.8390715290764524522588639478240648345199":
++float: 1
++ifloat: 1
++Test "cos_upward (6) == 0.9601702866503660205456522979229244054519":
++float: 1
++ifloat: 1
++Test "cos_upward (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++Test "cos_upward (9) == -0.9111302618846769883682947111811653112463":
++float: 2
++ifloat: 2
++ildouble: 1
++ldouble: 1
++
++# cosh_downward
++Test "cosh_downward (22) == 1792456423.065795780980053377632656584997":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cosh_downward (23) == 4872401723.124451300068625740569997090344":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cosh_downward (24) == 13244561064.92173614708845674912733665919":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# cosh_tonearest
++Test "cosh_tonearest (22) == 1792456423.065795780980053377632656584997":
++ildouble: 1
++ldouble: 1
++
++# cosh_towardzero
++Test "cosh_towardzero (22) == 1792456423.065795780980053377632656584997":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cosh_towardzero (23) == 4872401723.124451300068625740569997090344":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cosh_towardzero (24) == 13244561064.92173614708845674912733665919":
+ float: 1
+-idouble: 1
+ ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# cosh_upward
++Test "cosh_upward (22) == 1792456423.065795780980053377632656584997":
++ildouble: 1
++ldouble: 1
++Test "cosh_upward (23) == 4872401723.124451300068625740569997090344":
++ildouble: 1
++ldouble: 1
++Test "cosh_upward (24) == 13244561064.92173614708845674912733665919":
++ildouble: 1
++ldouble: 1
+
+ # cpow
+ Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i":
+@@ -393,8 +516,6 @@ ldouble: 1
+
+ # ctan
+ Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i":
+-double: 1
+-idouble: 1
+ ildouble: 1
+ ldouble: 1
+ Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i":
+@@ -467,6 +588,37 @@ Test "exp2 (10) == 1024":
+ ildouble: 2
+ ldouble: 2
+
++# exp_downward
++Test "exp_downward (2) == e^2":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "exp_downward (3) == e^3":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# exp_towardzero
++Test "exp_towardzero (2) == e^2":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "exp_towardzero (3) == e^3":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# exp_upward
++Test "exp_upward (1) == e":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
+ # expm1
+ Test "expm1 (0.75) == 1.11700001661267466854536981983709561":
+ double: 1
+@@ -513,29 +665,27 @@ ifloat: 1
+ # j0
+ Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
++ifloat: 1
+ Test "j0 (0.75) == 0.864242275166648623555731103820923211":
+ float: 1
+ ifloat: 1
+ Test "j0 (10.0) == -0.245935764451348335197760862485328754":
+-double: 3
++double: 2
+ float: 1
+-idouble: 3
++idouble: 2
+ ifloat: 1
+ ildouble: 2
+ ldouble: 2
+ Test "j0 (2.0) == 0.223890779141235668051827454649948626":
+-float: 2
+-ifloat: 2
+ ildouble: 2
+ ldouble: 2
+ Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
++ifloat: 1
+ Test "j0 (8.0) == 0.171650807137553906090869407851972001":
+ float: 1
+ ifloat: 1
+@@ -569,29 +719,27 @@ ldouble: 4
+ # jn
+ Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
++ifloat: 1
+ Test "jn (0, 0.75) == 0.864242275166648623555731103820923211":
+ float: 1
+ ifloat: 1
+ Test "jn (0, 10.0) == -0.245935764451348335197760862485328754":
+-double: 3
++double: 2
+ float: 1
+-idouble: 3
++idouble: 2
+ ifloat: 1
+ ildouble: 2
+ ldouble: 2
+ Test "jn (0, 2.0) == 0.223890779141235668051827454649948626":
+-float: 2
+-ifloat: 2
+ ildouble: 2
+ ldouble: 2
+ Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
++ifloat: 1
+ Test "jn (0, 8.0) == 0.171650807137553906090869407851972001":
+ float: 1
+ ifloat: 1
+@@ -640,15 +788,13 @@ Test "jn (10, 1.0) == 0.2630615123687453
+ ildouble: 1
+ ldouble: 1
+ Test "jn (10, 10.0) == 0.207486106633358857697278723518753428":
+-double: 4
+-float: 3
+-idouble: 4
+-ifloat: 3
++float: 1
++ifloat: 1
+ ildouble: 2
+ ldouble: 2
+ Test "jn (10, 2.0) == 0.251538628271673670963516093751820639e-6":
+-float: 4
+-ifloat: 4
++float: 3
++ifloat: 3
+ Test "jn (3, 0.125) == 0.406503832554912875023029337653442868e-4":
+ double: 1
+ float: 1
+@@ -661,16 +807,16 @@ idouble: 1
+ ifloat: 1
+ Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563":
+ double: 3
+-float: 2
++float: 1
+ idouble: 3
+-ifloat: 2
++ifloat: 1
+ ildouble: 2
+ ldouble: 2
+ Test "jn (3, 2.0) == 0.128943249474402051098793332969239835":
+ double: 1
+-float: 2
++float: 1
+ idouble: 1
+-ifloat: 2
++ifloat: 1
+
+ # lgamma
+ Test "lgamma (-0.5) == log(2*sqrt(pi))":
+@@ -713,71 +859,315 @@ Test "log2 (0.75) == -.41503749927884381
+ ildouble: 1
+ ldouble: 1
+
+-# sincos
+-Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
+-double: 1
++# pow_downward
++Test "pow_downward (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
+ float: 1
+-idouble: 1
+ ifloat: 1
+-ildouble: 1
+-ldouble: 1
+-Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res":
+-double: 1
++
++# pow_towardzero
++Test "pow_towardzero (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
++float: 1
++ifloat: 1
++
++# pow_upward
++Test "pow_upward (1.0625, 1.125) == 1.070582293028761362162622578677070098674":
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res":
+-double: 1
++
++# sin_downward
++Test "sin_downward (1) == 0.8414709848078965066525023216302989996226":
++ildouble: 1
++ldouble: 1
++Test "sin_downward (10) == -0.5440211108893698134047476618513772816836":
+ float: 1
+-idouble: 1
+ ifloat: 1
+-Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res":
++Test "sin_downward (2) == 0.9092974268256816953960198659117448427023":
++ildouble: 1
++ldouble: 1
++Test "sin_downward (3) == 0.1411200080598672221007448028081102798469":
+ float: 1
+ ifloat: 1
+-
+-# sqrt
+-Test "sqrt (2) == M_SQRT2l":
+ ildouble: 1
+ ldouble: 1
+-
+-# tan
+-Test "tan (pi/4) == 1":
+-double: 1
+-idouble: 1
+-
+-# tanh
+-Test "tanh (-0.75) == -0.635148952387287319214434357312496495":
++Test "sin_downward (4) == -0.7568024953079282513726390945118290941359":
+ ildouble: 1
+ ldouble: 1
+-Test "tanh (-1.0) == -0.7615941559557648881194582826047935904":
++Test "sin_downward (5) == -0.9589242746631384688931544061559939733525":
++float: 1
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "tanh (0.75) == 0.635148952387287319214434357312496495":
++Test "sin_downward (6) == -0.2794154981989258728115554466118947596280":
++float: 1
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "tanh (1.0) == 0.7615941559557648881194582826047935904":
++Test "sin_downward (8) == 0.9893582466233817778081235982452886721164":
+ ildouble: 1
+ ldouble: 1
+
+-# tgamma
+-Test "tgamma (-0.5) == -2 sqrt (pi)":
+-double: 1
++# sin_tonearest
++Test "sin_tonearest (1) == 0.8414709848078965066525023216302989996226":
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "tgamma (0.5) == sqrt (pi)":
++Test "sin_tonearest (3) == 0.1411200080598672221007448028081102798469":
++ildouble: 1
++ldouble: 1
++Test "sin_tonearest (6) == -0.2794154981989258728115554466118947596280":
++ildouble: 1
++ldouble: 1
++Test "sin_tonearest (9) == 0.4121184852417565697562725663524351793439":
++ildouble: 1
++ldouble: 1
++
++# sin_towardzero
++Test "sin_towardzero (1) == 0.8414709848078965066525023216302989996226":
+ float: 1
+ ifloat: 1
+-Test "tgamma (0.7) == 1.29805533264755778568117117915281162":
+-double: 1
++Test "sin_towardzero (10) == -0.5440211108893698134047476618513772816836":
+ float: 1
+-idouble: 1
+ ifloat: 1
+-Test "tgamma (4) == 6":
++Test "sin_towardzero (2) == 0.9092974268256816953960198659117448427023":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (3) == 0.1411200080598672221007448028081102798469":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (4) == -0.7568024953079282513726390945118290941359":
++float: 1
++ifloat: 1
++Test "sin_towardzero (5) == -0.9589242746631384688931544061559939733525":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (6) == -0.2794154981989258728115554466118947596280":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (8) == 0.9893582466233817778081235982452886721164":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (9) == 0.4121184852417565697562725663524351793439":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++# sin_upward
++Test "sin_upward (1) == 0.8414709848078965066525023216302989996226":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sin_upward (10) == -0.5440211108893698134047476618513772816836":
++ildouble: 1
++ldouble: 1
++Test "sin_upward (2) == 0.9092974268256816953960198659117448427023":
++float: 2
++ifloat: 2
++Test "sin_upward (3) == 0.1411200080598672221007448028081102798469":
++ildouble: 1
++ldouble: 1
++Test "sin_upward (4) == -0.7568024953079282513726390945118290941359":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sin_upward (7) == 0.6569865987187890903969990915936351779369":
++ildouble: 1
++ldouble: 1
++Test "sin_upward (9) == 0.4121184852417565697562725663524351793439":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# sincos
++Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
++double: 1
++idouble: 1
++ildouble: 1
++ldouble: 1
++Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res":
++float: 1
++ifloat: 1
++
++# sinh_downward
++Test "sinh_downward (22) == 1792456423.065795780701106568345764104225":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sinh_downward (23) == 4872401723.124451299966006944252978187305":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "sinh_downward (24) == 13244561064.92173614705070540368454568168":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# sinh_towardzero
++Test "sinh_towardzero (22) == 1792456423.065795780701106568345764104225":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sinh_towardzero (23) == 4872401723.124451299966006944252978187305":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "sinh_towardzero (24) == 13244561064.92173614705070540368454568168":
++float: 1
++ifloat: 1
++
++# sinh_upward
++Test "sinh_upward (22) == 1792456423.065795780701106568345764104225":
++ildouble: 1
++ldouble: 1
++Test "sinh_upward (23) == 4872401723.124451299966006944252978187305":
++ildouble: 1
++ldouble: 1
++Test "sinh_upward (24) == 13244561064.92173614705070540368454568168":
++ildouble: 1
++ldouble: 1
++
++# sqrt
++Test "sqrt (2) == M_SQRT2l":
++ildouble: 1
++ldouble: 1
++
++# tan_downward
++Test "tan_downward (1) == 1.5574077246549022305069748074583601730873":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_downward (10) == 0.6483608274590866712591249330098086768169":
++float: 1
++ifloat: 1
++Test "tan_downward (2) == -2.1850398632615189916433061023136825434320":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_downward (6) == -0.2910061913847491570536995888681755428312":
++float: 1
++ifloat: 1
++Test "tan_downward (8) == -6.7997114552203786999252627596086333648814":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_downward (9) == -0.4523156594418098405903708757987855343087":
++float: 1
++ifloat: 1
++
++# tan_towardzero
++Test "tan_towardzero (10) == 0.6483608274590866712591249330098086768169":
++float: 1
++ifloat: 1
++Test "tan_towardzero (3) == -0.1425465430742778052956354105339134932261":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (4) == 1.1578212823495775831373424182673239231198":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (5) == -3.3805150062465856369827058794473439087096":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (6) == -0.2910061913847491570536995888681755428312":
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (9) == -0.4523156594418098405903708757987855343087":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# tan_upward
++Test "tan_upward (1) == 1.5574077246549022305069748074583601730873":
++float: 1
++ifloat: 1
++Test "tan_upward (10) == 0.6483608274590866712591249330098086768169":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_upward (2) == -2.1850398632615189916433061023136825434320":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (3) == -0.1425465430742778052956354105339134932261":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_upward (4) == 1.1578212823495775831373424182673239231198":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (5) == -3.3805150062465856369827058794473439087096":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_upward (6) == -0.2910061913847491570536995888681755428312":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (9) == -0.4523156594418098405903708757987855343087":
++ildouble: 1
++ldouble: 1
++
++# tanh
++Test "tanh (-0.75) == -0.635148952387287319214434357312496495":
++ildouble: 1
++ldouble: 1
++Test "tanh (-1.0) == -0.7615941559557648881194582826047935904":
++ildouble: 1
++ldouble: 1
++Test "tanh (0.75) == 0.635148952387287319214434357312496495":
++ildouble: 1
++ldouble: 1
++Test "tanh (1.0) == 0.7615941559557648881194582826047935904":
++ildouble: 1
++ldouble: 1
++
++# tgamma
++Test "tgamma (-0.5) == -2 sqrt (pi)":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tgamma (0.5) == sqrt (pi)":
++float: 1
++ifloat: 1
++Test "tgamma (0.7) == 1.29805533264755778568117117915281162":
++double: 1
++float: 1
++idouble: 1
++ifloat: 1
++Test "tgamma (4) == 6":
+ ildouble: 1
+ ldouble: 1
+
+@@ -917,17 +1307,13 @@ ifloat: 2
+ ildouble: 5
+ ldouble: 5
+ Test "yn (10, 1.0) == -121618014.278689189288130426667971145":
+-double: 1
+ float: 2
+-idouble: 1
+ ifloat: 2
+ ildouble: 1
+ ldouble: 1
+ Test "yn (10, 10.0) == -0.359814152183402722051986577343560609":
+ double: 2
+-float: 2
+ idouble: 2
+-ifloat: 2
+ ildouble: 2
+ ldouble: 2
+ Test "yn (10, 2.0) == -129184.542208039282635913145923304214":
+@@ -941,9 +1327,7 @@ Test "yn (3, 0.125) == -2612.69757350066
+ double: 1
+ idouble: 1
+ Test "yn (3, 0.75) == -12.9877176234475433186319774484809207":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 2
+ ldouble: 2
+@@ -973,17 +1357,9 @@ Function: Imaginary part of "cacos":
+ ildouble: 1
+ ldouble: 1
+
+-Function: Real part of "cacosh":
+-double: 1
+-float: 7
+-idouble: 1
+-ifloat: 7
+-
+ Function: Imaginary part of "cacosh":
+-double: 1
+-float: 3
+-idouble: 1
+-ifloat: 3
++float: 1
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+@@ -1013,10 +1389,6 @@ ifloat: 6
+ ildouble: 2
+ ldouble: 2
+
+-Function: Real part of "catan":
+-float: 4
+-ifloat: 4
+-
+ Function: Imaginary part of "catan":
+ double: 1
+ float: 1
+@@ -1032,8 +1404,6 @@ ildouble: 1
+ ldouble: 1
+
+ Function: Imaginary part of "catanh":
+-float: 6
+-ifloat: 6
+ ildouble: 1
+ ldouble: 1
+
+@@ -1089,10 +1459,6 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+-Function: Imaginary part of "clog":
+-float: 3
+-ifloat: 3
+-
+ Function: Real part of "clog10":
+ float: 1
+ ifloat: 1
+@@ -1101,9 +1467,9 @@ ldouble: 1
+
+ Function: Imaginary part of "clog10":
+ double: 1
+-float: 5
++float: 1
+ idouble: 1
+-ifloat: 5
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+@@ -1115,6 +1481,48 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
++Function: "cos_downward":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "cos_tonearest":
++float: 1
++ifloat: 1
++
++Function: "cos_towardzero":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "cos_upward":
++float: 2
++ifloat: 2
++ildouble: 1
++ldouble: 1
++
++Function: "cosh_downward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "cosh_tonearest":
++ildouble: 1
++ldouble: 1
++
++Function: "cosh_towardzero":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "cosh_upward":
++ildouble: 1
++ldouble: 1
++
+ Function: Real part of "cpow":
+ double: 2
+ float: 4
+@@ -1162,8 +1570,6 @@ ildouble: 1
+ ldouble: 1
+
+ Function: Real part of "ctan":
+-double: 1
+-idouble: 1
+ ildouble: 1
+ ldouble: 1
+
+@@ -1211,6 +1617,24 @@ Function: "exp2":
+ ildouble: 2
+ ldouble: 2
+
++Function: "exp_downward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "exp_towardzero":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "exp_upward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
+ Function: "expm1":
+ double: 1
+ float: 1
+@@ -1228,10 +1652,10 @@ float: 1
+ ifloat: 1
+
+ Function: "j0":
+-double: 3
+-float: 2
+-idouble: 3
+-ifloat: 2
++double: 2
++float: 1
++idouble: 2
++ifloat: 1
+ ildouble: 2
+ ldouble: 2
+
+@@ -1244,10 +1668,10 @@ ildouble: 4
+ ldouble: 4
+
+ Function: "jn":
+-double: 4
+-float: 4
+-idouble: 4
+-ifloat: 4
++double: 3
++float: 3
++idouble: 3
++ifloat: 3
+ ildouble: 4
+ ldouble: 4
+
+@@ -1277,6 +1701,44 @@ Function: "log2":
+ ildouble: 1
+ ldouble: 1
+
++Function: "pow_downward":
++float: 1
++ifloat: 1
++
++Function: "pow_towardzero":
++float: 1
++ifloat: 1
++
++Function: "pow_upward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_downward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_tonearest":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_towardzero":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "sin_upward":
++float: 2
++ifloat: 2
++ildouble: 1
++ldouble: 1
++
+ Function: "sincos":
+ double: 1
+ float: 1
+@@ -1285,6 +1747,22 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
++Function: "sinh_downward":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "sinh_towardzero":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "sinh_upward":
++ildouble: 1
++ldouble: 1
++
+ Function: "sqrt":
+ ildouble: 1
+ ldouble: 1
+@@ -1293,6 +1771,24 @@ Function: "tan":
+ double: 1
+ idouble: 1
+
++Function: "tan_downward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "tan_towardzero":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "tan_upward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
+ Function: "tanh":
+ ildouble: 1
+ ldouble: 1
+diff -Nrup a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
+--- a/sysdeps/x86_64/fpu/libm-test-ulps 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/x86_64/fpu/libm-test-ulps 2012-08-06 11:02:14.602759422 -0600
+@@ -42,26 +42,13 @@ ldouble: 1
+
+ # cacos
+ Test "Imaginary part of: cacos (0.75 + 1.25 i) == 1.11752014915610270578240049553777969 - 1.13239363160530819522266333696834467 i":
+-float: 1
+-ifloat: 1
+ ildouble: 2
+ ldouble: 2
+
+ # cacosh
+-Test "Real part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+-double: 1
+-float: 7
+-idouble: 1
+-ifloat: 7
+-ildouble: 6
+-ldouble: 6
+ Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+-double: 1
+-float: 3
+-idouble: 1
+-ifloat: 3
+-ildouble: 1
+-ldouble: 1
++float: 1
++ifloat: 1
+ Test "Real part of: cacosh (0.75 + 1.25 i) == 1.13239363160530819522266333696834467 + 1.11752014915610270578240049553777969 i":
+ ildouble: 1
+ ldouble: 1
+@@ -75,8 +62,6 @@ ifloat: 1
+ ildouble: 2
+ ldouble: 2
+ Test "Imaginary part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i":
+-float: 1
+-ifloat: 1
+ ildouble: 2
+ ldouble: 2
+
+@@ -103,21 +88,15 @@ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-ldouble: 1
+ ildouble: 1
++ldouble: 1
+
+ # catan
+-Test "Real part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i":
+-float: 3
+-ifloat: 3
+ Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i":
+ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-Test "Real part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i":
+-float: 4
+-ifloat: 4
+
+ # catanh
+ Test "Real part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i":
+@@ -125,15 +104,9 @@ double: 4
+ idouble: 4
+ ildouble: 1
+ ldouble: 1
+-Test "Imaginary part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i":
+-float: 4
+-ifloat: 4
+ Test "Real part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i":
+ double: 1
+ idouble: 1
+-Test "Imaginary part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i":
+-float: 6
+-ifloat: 6
+
+ # cbrt
+ Test "cbrt (-0.001) == -0.1":
+@@ -152,14 +125,9 @@ ildouble: 1
+ ldouble: 1
+
+ # ccos
+-Test "Real part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i":
+-double: 1
+-idouble: 1
+ Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i":
+ float: 1
+ ifloat: 1
+-ildouble: 1
+-ldouble: 1
+ Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i":
+ double: 1
+ float: 1
+@@ -168,19 +136,17 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "Imaginary part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i":
+-ildouble: 1
+-ldouble: 1
+ float: 1
+ ifloat: 1
++ildouble: 1
++ldouble: 1
+
+ # ccosh
+ Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i":
+ float: 1
+ ifloat: 1
+ Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+@@ -205,9 +171,6 @@ ildouble: 1
+ ldouble: 1
+
+ # clog
+-Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680267437207826593 - 2.1587989303424641704769327722648368 i":
+-float: 3
+-ifloat: 3
+ Test "Real part of: clog (0.75 + 1.25 i) == 0.376885901188190075998919126749298416 + 1.03037682652431246378774332703115153 i":
+ float: 1
+ ifloat: 1
+@@ -227,11 +190,7 @@ idouble: 1
+ ifloat: 1
+ Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i":
+ double: 1
+-float: 5
+ idouble: 1
+-ifloat: 5
+-ildouble: 1
+-ldouble: 1
+ Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i":
+ double: 1
+ float: 1
+@@ -276,9 +235,7 @@ float: 1
+ idouble: 1
+ ifloat: 1
+ Test "Real part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+@@ -306,33 +263,164 @@ ifloat: 1
+ # cos
+ Test "cos (M_PI_6l * 2.0) == 0.5":
+ double: 1
+-float: 1
+ idouble: 1
+-ifloat: 1
+ Test "cos (M_PI_6l * 4.0) == -0.5":
+ double: 2
+ float: 1
+ idouble: 2
+ ifloat: 1
++
++# cos_downward
++Test "cos_downward (1) == 0.5403023058681397174009366074429766037323":
++float: 1
++ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "cos (pi/2) == 0":
+-double: 1
++Test "cos_downward (2) == -0.4161468365471423869975682295007621897660":
++float: 1
++ifloat: 1
++Test "cos_downward (3) == -0.9899924966004454572715727947312613023937":
++float: 1
++ifloat: 1
++Test "cos_downward (4) == -0.6536436208636119146391681830977503814241":
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "cos (0.80190127184058835) == 0.69534156199418473":
+-double: 1
+-idouble: 1
++Test "cos_downward (5) == 0.2836621854632262644666391715135573083344":
++float: 1
++ifloat: 1
++Test "cos_downward (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (8) == -0.1455000338086135258688413818311946826093":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_downward (9) == -0.9111302618846769883682947111811653112463":
++ildouble: 1
++ldouble: 1
++
++# cos_tonearest
++Test "cos_tonearest (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++Test "cos_tonearest (8) == -0.1455000338086135258688413818311946826093":
++ildouble: 1
++ldouble: 1
++Test "cos_tonearest (9) == -0.9111302618846769883682947111811653112463":
++ildouble: 1
++ldouble: 1
++
++# cos_towardzero
++Test "cos_towardzero (1) == 0.5403023058681397174009366074429766037323":
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (10) == -0.8390715290764524522588639478240648345199":
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (2) == -0.4161468365471423869975682295007621897660":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (3) == -0.9899924966004454572715727947312613023937":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (5) == 0.2836621854632262644666391715135573083344":
++float: 1
++ifloat: 1
++Test "cos_towardzero (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_towardzero (8) == -0.1455000338086135258688413818311946826093":
++float: 1
++ifloat: 1
++
++# cos_upward
++Test "cos_upward (10) == -0.8390715290764524522588639478240648345199":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_upward (2) == -0.4161468365471423869975682295007621897660":
++ildouble: 1
++ldouble: 1
++Test "cos_upward (3) == -0.9899924966004454572715727947312613023937":
++ildouble: 1
++ldouble: 1
++Test "cos_upward (5) == 0.2836621854632262644666391715135573083344":
++ildouble: 1
++ldouble: 1
++Test "cos_upward (6) == 0.9601702866503660205456522979229244054519":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cos_upward (7) == 0.7539022543433046381411975217191820122183":
++float: 1
++ifloat: 1
++Test "cos_upward (9) == -0.9111302618846769883682947111811653112463":
++float: 2
++ifloat: 2
++
++# cosh_downward
++Test "cosh_downward (22) == 1792456423.065795780980053377632656584997":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "cosh_downward (23) == 4872401723.124451300068625740569997090344":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cosh_downward (24) == 13244561064.92173614708845674912733665919":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# cosh_tonearest
++Test "cosh_tonearest (22) == 1792456423.065795780980053377632656584997":
++ildouble: 1
++ldouble: 1
++
++# cosh_towardzero
++Test "cosh_towardzero (22) == 1792456423.065795780980053377632656584997":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "cosh_towardzero (23) == 4872401723.124451300068625740569997090344":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "cosh_towardzero (24) == 13244561064.92173614708845674912733665919":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# cosh_upward
++Test "cosh_upward (23) == 4872401723.124451300068625740569997090344":
++ildouble: 1
++ldouble: 1
+
+ # cpow
+ Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i":
+ float: 1
+ ifloat: 1
+-ldouble: 1
+ ildouble: 1
++ldouble: 1
+ Test "Imaginary part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i":
+ float: 1
+ ifloat: 1
+@@ -363,9 +451,9 @@ ildouble: 1
+ ldouble: 1
+ Test "Real part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i":
+ double: 1
+-float: 5
++float: 4
+ idouble: 1
+-ifloat: 5
++ifloat: 4
+ Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i":
+ float: 2
+ ifloat: 2
+@@ -383,22 +471,11 @@ ldouble: 1
+ Test "Real part of: csin (0.75 + 1.25 i) == 1.28722291002649188575873510790565441 + 1.17210635989270256101081285116138863 i":
+ ildouble: 1
+ ldouble: 1
+-Test "Imaginary part of: csin (0.75 + 1.25 i) == 1.28722291002649188575873510790565441 + 1.17210635989270256101081285116138863 i":
+-float: 1
+-ifloat: 1
+-Test "Imaginary part of: csin (-2 - 3 i) == -9.15449914691142957346729954460983256 + 4.16890695996656435075481305885375484 i":
+-double: 1
+-idouble: 1
+
+ # csinh
+-Test "Real part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i":
+-double: 1
+-idouble: 1
+ Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i":
+ double: 1
+ idouble: 1
+-ildouble: 2
+-ldouble: 2
+ Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i":
+ float: 1
+ ifloat: 1
+@@ -418,37 +495,31 @@ ifloat: 1
+
+ # ctan
+ Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i":
+-double: 1
+-idouble: 1
+-ildouble: 439
+-ldouble: 439
++ildouble: 1
++ldouble: 1
+ Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i":
+-float: 1
+-ifloat: 1
+-ildouble: 2
+-ldouble: 2
++ildouble: 1
++ldouble: 1
+ Test "Real part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i":
+ ildouble: 1
+ ldouble: 1
+ Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i":
+ double: 1
+-float: 1
+ idouble: 1
+-ifloat: 1
+ ildouble: 3
+ ldouble: 3
+
+ # ctanh
+ Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i":
+-float: 2
+-ifloat: 2
+-ildouble: 5
+-ldouble: 5
+ double: 1
++float: 2
+ idouble: 1
++ifloat: 2
++ildouble: 3
++ldouble: 3
+ Test "Imaginary part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i":
+-ildouble: 25
+-ldouble: 25
++ildouble: 1
++ldouble: 1
+ Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
+ float: 1
+ ifloat: 1
+@@ -456,10 +527,10 @@ Test "Real part of: ctanh (0.75 + 1.25 i
+ double: 1
+ idouble: 1
+ Test "Imaginary part of: ctanh (0.75 + 1.25 i) == 1.37260757053378320258048606571226857 + 0.385795952609750664177596760720790220 i":
+-ildouble: 1
+-ldouble: 1
+ double: 1
+ idouble: 1
++ildouble: 1
++ldouble: 1
+
+ # erf
+ Test "erf (1.25) == 0.922900128256458230136523481197281140":
+@@ -481,26 +552,61 @@ ldouble: 1
+
+ # exp10
+ Test "exp10 (-1) == 0.1":
+-ildouble: 1
+-ldouble: 1
+-float: 1
+-ifloat: 1
+ double: 2
+-idouble: 2
+-Test "exp10 (0.75) == 5.62341325190349080394951039776481231":
+-ildouble: 2
+-ldouble: 2
+ float: 1
++idouble: 2
+ ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "exp10 (0.75) == 5.62341325190349080394951039776481231":
+ double: 1
++float: 1
+ idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
+ Test "exp10 (3) == 1000":
+-ildouble: 8
+-ldouble: 8
+-float: 2
+-ifloat: 2
+ double: 6
++float: 2
+ idouble: 6
++ifloat: 2
++ildouble: 3
++ldouble: 3
++
++# exp_downward
++Test "exp_downward (1) == e":
++ildouble: 1
++ldouble: 1
++Test "exp_downward (2) == e^2":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "exp_downward (3) == e^3":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# exp_towardzero
++Test "exp_towardzero (1) == e":
++ildouble: 1
++ldouble: 1
++Test "exp_towardzero (2) == e^2":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++Test "exp_towardzero (3) == e^3":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# exp_upward
++Test "exp_upward (1) == e":
++float: 1
++ifloat: 1
+
+ # expm1
+ Test "expm1 (0.75) == 1.11700001661267466854536981983709561":
+@@ -570,9 +676,7 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "j0 (8.0) == 0.171650807137553906090869407851972001":
+-double: 2
+ float: 1
+-idouble: 2
+ ifloat: 1
+
+ # j1
+@@ -617,9 +721,7 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+ Test "jn (0, 8.0) == 0.171650807137553906090869407851972001":
+-double: 2
+ float: 1
+-idouble: 2
+ ifloat: 1
+ Test "jn (1, 10.0) == 0.0434727461688614366697487680258592883":
+ float: 2
+@@ -714,12 +816,12 @@ ldouble: 1
+
+ # log10
+ Test "log10 (0.75) == -0.124938736608299953132449886193870744":
+-ildouble: 1
+-ldouble: 1
+-float: 2
+-ifloat: 2
+ double: 1
++float: 2
+ idouble: 1
++ifloat: 2
++ildouble: 1
++ldouble: 1
+ Test "log10 (e) == log10(e)":
+ float: 1
+ ifloat: 1
+@@ -731,37 +833,309 @@ Test "log1p (-0.25) == -0.28768207245178
+ float: 1
+ ifloat: 1
+
+-# sincos
+-Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
+-double: 1
+-float: 1
+-idouble: 1
+-ifloat: 1
+-Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res":
+-double: 1
+-float: 1
+-idouble: 1
+-ifloat: 1
++# pow_downward
++Test "pow_downward (1.0625, 1.125) == 1.070582293028761362162622578677070098674":
+ ildouble: 1
+ ldouble: 1
+-Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res":
+-double: 1
++Test "pow_downward (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+-Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res":
++
++# pow_towardzero
++Test "pow_towardzero (1.0625, 1.125) == 1.070582293028761362162622578677070098674":
++ildouble: 1
++ldouble: 1
++Test "pow_towardzero (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# pow_upward
++Test "pow_upward (1.0625, 1.125) == 1.070582293028761362162622578677070098674":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "pow_upward (1.5, 1.03125) == 1.519127098714743184071644334163037684948":
++ildouble: 1
++ldouble: 1
++
++# sin_downward
++Test "sin_downward (1) == 0.8414709848078965066525023216302989996226":
++ildouble: 1
++ldouble: 1
++Test "sin_downward (10) == -0.5440211108893698134047476618513772816836":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sin_downward (3) == 0.1411200080598672221007448028081102798469":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sin_downward (4) == -0.7568024953079282513726390945118290941359":
++ildouble: 1
++ldouble: 1
++Test "sin_downward (5) == -0.9589242746631384688931544061559939733525":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sin_downward (6) == -0.2794154981989258728115554466118947596280":
++float: 1
++ifloat: 1
++Test "sin_downward (7) == 0.6569865987187890903969990915936351779369":
++ildouble: 1
++ldouble: 1
++Test "sin_downward (8) == 0.9893582466233817778081235982452886721164":
++ildouble: 1
++ldouble: 1
++Test "sin_downward (9) == 0.4121184852417565697562725663524351793439":
++ildouble: 1
++ldouble: 1
++
++# sin_tonearest
++Test "sin_tonearest (1) == 0.8414709848078965066525023216302989996226":
++float: 1
++ifloat: 1
++Test "sin_tonearest (10) == -0.5440211108893698134047476618513772816836":
++ildouble: 1
++ldouble: 1
++Test "sin_tonearest (4) == -0.7568024953079282513726390945118290941359":
++ildouble: 1
++ldouble: 1
++Test "sin_tonearest (9) == 0.4121184852417565697562725663524351793439":
++ildouble: 1
++ldouble: 1
++
++# sin_towardzero
++Test "sin_towardzero (1) == 0.8414709848078965066525023216302989996226":
+ float: 1
+ ifloat: 1
+-Test "sincos (0.80190127184058835, &sin_res, &cos_res) puts 0.69534156199418473 in cos_res":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (10) == -0.5440211108893698134047476618513772816836":
++float: 1
++ifloat: 1
++Test "sin_towardzero (3) == 0.1411200080598672221007448028081102798469":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (4) == -0.7568024953079282513726390945118290941359":
++float: 1
++ifloat: 1
++Test "sin_towardzero (5) == -0.9589242746631384688931544061559939733525":
++float: 1
++ifloat: 1
++Test "sin_towardzero (6) == -0.2794154981989258728115554466118947596280":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (7) == 0.6569865987187890903969990915936351779369":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (8) == 0.9893582466233817778081235982452886721164":
++ildouble: 1
++ldouble: 1
++Test "sin_towardzero (9) == 0.4121184852417565697562725663524351793439":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# sin_upward
++Test "sin_upward (1) == 0.8414709848078965066525023216302989996226":
++float: 1
++ifloat: 1
++Test "sin_upward (2) == 0.9092974268256816953960198659117448427023":
++float: 2
++ifloat: 2
++ildouble: 1
++ldouble: 1
++Test "sin_upward (4) == -0.7568024953079282513726390945118290941359":
++float: 1
++ifloat: 1
++Test "sin_upward (6) == -0.2794154981989258728115554466118947596280":
++ildouble: 1
++ldouble: 1
++Test "sin_upward (9) == 0.4121184852417565697562725663524351793439":
++float: 1
++ifloat: 1
++
++# sincos
++Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
+ double: 1
+ idouble: 1
+-
+-# tan
+-Test "tan (pi/4) == 1":
++Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res":
+ double: 1
++float: 1
+ idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res":
++float: 1
++ifloat: 1
++
++# sinh_downward
++Test "sinh_downward (22) == 1792456423.065795780701106568345764104225":
++float: 1
++ifloat: 1
++ildouble: 4
++ldouble: 4
++Test "sinh_downward (23) == 4872401723.124451299966006944252978187305":
++float: 1
++ifloat: 1
++Test "sinh_downward (24) == 13244561064.92173614705070540368454568168":
++float: 1
++ifloat: 1
++ildouble: 5
++ldouble: 5
++
++# sinh_tonearest
++Test "sinh_tonearest (22) == 1792456423.065795780701106568345764104225":
++ildouble: 3
++ldouble: 3
++Test "sinh_tonearest (23) == 4872401723.124451299966006944252978187305":
++ildouble: 1
++ldouble: 1
++Test "sinh_tonearest (24) == 13244561064.92173614705070540368454568168":
++ildouble: 6
++ldouble: 6
++
++# sinh_towardzero
++Test "sinh_towardzero (22) == 1792456423.065795780701106568345764104225":
++float: 1
++ifloat: 1
++ildouble: 4
++ldouble: 4
++Test "sinh_towardzero (23) == 4872401723.124451299966006944252978187305":
++float: 1
++ifloat: 1
++Test "sinh_towardzero (24) == 13244561064.92173614705070540368454568168":
++float: 1
++ifloat: 1
++ildouble: 5
++ldouble: 5
++
++# sinh_upward
++Test "sinh_upward (22) == 1792456423.065795780701106568345764104225":
++ildouble: 16
++ldouble: 16
++Test "sinh_upward (23) == 4872401723.124451299966006944252978187305":
++ildouble: 27
++ldouble: 27
++Test "sinh_upward (24) == 13244561064.92173614705070540368454568168":
++ildouble: 7
++ldouble: 7
++
++# tan_downward
++Test "tan_downward (1) == 1.5574077246549022305069748074583601730873":
++float: 1
++ifloat: 1
++Test "tan_downward (10) == 0.6483608274590866712591249330098086768169":
++float: 1
++ifloat: 1
++Test "tan_downward (2) == -2.1850398632615189916433061023136825434320":
++float: 1
++ifloat: 1
++Test "tan_downward (4) == 1.1578212823495775831373424182673239231198":
++ildouble: 1
++ldouble: 1
++Test "tan_downward (5) == -3.3805150062465856369827058794473439087096":
++ildouble: 1
++ldouble: 1
++Test "tan_downward (6) == -0.2910061913847491570536995888681755428312":
++float: 1
++ifloat: 1
++Test "tan_downward (8) == -6.7997114552203786999252627596086333648814":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_downward (9) == -0.4523156594418098405903708757987855343087":
++float: 1
++ifloat: 1
++
++# tan_tonearest
++Test "tan_tonearest (6) == -0.2910061913847491570536995888681755428312":
++ildouble: 1
++ldouble: 1
++Test "tan_tonearest (8) == -6.7997114552203786999252627596086333648814":
++ildouble: 1
++ldouble: 1
++Test "tan_tonearest (9) == -0.4523156594418098405903708757987855343087":
++ildouble: 1
++ldouble: 1
++
++# tan_towardzero
++Test "tan_towardzero (10) == 0.6483608274590866712591249330098086768169":
++float: 1
++ifloat: 1
++Test "tan_towardzero (2) == -2.1850398632615189916433061023136825434320":
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (3) == -0.1425465430742778052956354105339134932261":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (4) == 1.1578212823495775831373424182673239231198":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (5) == -3.3805150062465856369827058794473439087096":
++float: 1
++ifloat: 1
++Test "tan_towardzero (6) == -0.2910061913847491570536995888681755428312":
++ildouble: 1
++ldouble: 1
++Test "tan_towardzero (8) == -6.7997114552203786999252627596086333648814":
++ildouble: 2
++ldouble: 2
++Test "tan_towardzero (9) == -0.4523156594418098405903708757987855343087":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++# tan_upward
++Test "tan_upward (1) == 1.5574077246549022305069748074583601730873":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_upward (10) == 0.6483608274590866712591249330098086768169":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_upward (2) == -2.1850398632615189916433061023136825434320":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (3) == -0.1425465430742778052956354105339134932261":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++Test "tan_upward (5) == -3.3805150062465856369827058794473439087096":
++float: 1
++ifloat: 1
++Test "tan_upward (6) == -0.2910061913847491570536995888681755428312":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (7) == 0.8714479827243187364564508896003135663222":
++ildouble: 1
++ldouble: 1
++Test "tan_upward (8) == -6.7997114552203786999252627596086333648814":
++ildouble: 2
++ldouble: 2
++Test "tan_upward (9) == -0.4523156594418098405903708757987855343087":
++ildouble: 1
++ldouble: 1
+
+ # tgamma
+ Test "tgamma (-0.5) == -2 sqrt (pi)":
+@@ -779,9 +1153,6 @@ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-Test "tgamma (4) == 6":
+-ildouble: 1
+-ldouble: 1
+
+ # y0
+ Test "y0 (0.125) == -1.38968062514384052915582277745018693":
+@@ -960,27 +1331,17 @@ ildouble: 1
+ ldouble: 1
+
+ Function: Imaginary part of "cacos":
+-float: 1
+-ifloat: 1
+ ildouble: 2
+ ldouble: 2
+
+ Function: Real part of "cacosh":
+-double: 1
+-float: 7
+-idouble: 1
+-ifloat: 7
+-ildouble: 6
+-ldouble: 6
+-
+-Function: Imaginary part of "cacosh":
+-double: 1
+-float: 3
+-idouble: 1
+-ifloat: 3
+ ildouble: 1
+ ldouble: 1
+
++Function: Imaginary part of "cacosh":
++float: 1
++ifloat: 1
++
+ Function: Real part of "casin":
+ double: 1
+ float: 1
+@@ -990,8 +1351,6 @@ ildouble: 2
+ ldouble: 2
+
+ Function: Imaginary part of "casin":
+-float: 1
+-ifloat: 1
+ ildouble: 2
+ ldouble: 2
+
+@@ -1011,10 +1370,6 @@ ifloat: 6
+ ildouble: 5
+ ldouble: 5
+
+-Function: Real part of "catan":
+-float: 4
+-ifloat: 4
+-
+ Function: Imaginary part of "catan":
+ double: 1
+ float: 1
+@@ -1027,10 +1382,6 @@ idouble: 4
+ ildouble: 1
+ ldouble: 1
+
+-Function: Imaginary part of "catanh":
+-float: 6
+-ifloat: 6
+-
+ Function: "cbrt":
+ double: 1
+ idouble: 1
+@@ -1058,9 +1409,7 @@ idouble: 1
+ ifloat: 1
+
+ Function: Imaginary part of "ccosh":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+@@ -1081,25 +1430,17 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+-Function: Imaginary part of "clog":
+-float: 3
+-ifloat: 3
+-
+ Function: Real part of "clog10":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
+ Function: Imaginary part of "clog10":
+ double: 1
+-float: 5
++float: 1
+ idouble: 1
+-ifloat: 5
+-ildouble: 1
+-ldouble: 1
++ifloat: 1
+
+ Function: "cos":
+ double: 2
+@@ -1109,11 +1450,55 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
++Function: "cos_downward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "cos_tonearest":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "cos_towardzero":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "cos_upward":
++float: 2
++ifloat: 2
++ildouble: 1
++ldouble: 1
++
++Function: "cosh_downward":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "cosh_tonearest":
++ildouble: 1
++ldouble: 1
++
++Function: "cosh_towardzero":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "cosh_upward":
++ildouble: 1
++ldouble: 1
++
+ Function: Real part of "cpow":
+ double: 2
+-float: 5
++float: 4
+ idouble: 2
+-ifloat: 5
++ifloat: 4
+ ildouble: 5
+ ldouble: 5
+
+@@ -1129,16 +1514,8 @@ Function: Real part of "csin":
+ ildouble: 1
+ ldouble: 1
+
+-Function: Imaginary part of "csin":
+-double: 1
+-float: 1
+-idouble: 1
+-ifloat: 1
+-
+ Function: Real part of "csinh":
+-double: 1
+ float: 1
+-idouble: 1
+ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+@@ -1148,24 +1525,18 @@ double: 1
+ float: 1
+ idouble: 1
+ ifloat: 1
+-ildouble: 2
+-ldouble: 2
+
+ Function: Real part of "csqrt":
+ float: 1
+ ifloat: 1
+
+ Function: Real part of "ctan":
+-double: 1
+-idouble: 1
+-ildouble: 439
+-ldouble: 439
++ildouble: 1
++ldouble: 1
+
+ Function: Imaginary part of "ctan":
+ double: 1
+-float: 1
+ idouble: 1
+-ifloat: 1
+ ildouble: 3
+ ldouble: 3
+
+@@ -1174,16 +1545,16 @@ double: 1
+ float: 2
+ idouble: 1
+ ifloat: 2
+-ildouble: 5
+-ldouble: 5
++ildouble: 3
++ldouble: 3
+
+ Function: Imaginary part of "ctanh":
+-float: 1
+-ifloat: 1
+-ildouble: 25
+-ldouble: 25
+ double: 1
++float: 1
+ idouble: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
+
+ Function: "erf":
+ double: 1
+@@ -1196,12 +1567,28 @@ ildouble: 1
+ ldouble: 1
+
+ Function: "exp10":
+-ildouble: 8
+-ldouble: 8
+-float: 2
+-ifloat: 2
+ double: 6
++float: 2
+ idouble: 6
++ifloat: 2
++ildouble: 3
++ldouble: 3
++
++Function: "exp_downward":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "exp_towardzero":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "exp_upward":
++float: 1
++ifloat: 1
+
+ Function: "expm1":
+ double: 1
+@@ -1250,17 +1637,59 @@ ildouble: 1
+ ldouble: 1
+
+ Function: "log10":
++double: 1
+ float: 2
++idouble: 1
+ ifloat: 2
+ ildouble: 1
+ ldouble: 1
+-double: 1
+-idouble: 1
+
+ Function: "log1p":
+ float: 1
+ ifloat: 1
+
++Function: "pow_downward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "pow_towardzero":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "pow_upward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_downward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_tonearest":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_towardzero":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "sin_upward":
++float: 2
++ifloat: 2
++ildouble: 1
++ldouble: 1
++
+ Function: "sincos":
+ double: 1
+ float: 1
+@@ -1269,10 +1698,52 @@ ifloat: 1
+ ildouble: 1
+ ldouble: 1
+
++Function: "sinh_downward":
++float: 1
++ifloat: 1
++ildouble: 5
++ldouble: 5
++
++Function: "sinh_tonearest":
++ildouble: 6
++ldouble: 6
++
++Function: "sinh_towardzero":
++float: 1
++ifloat: 1
++ildouble: 5
++ldouble: 5
++
++Function: "sinh_upward":
++ildouble: 27
++ldouble: 27
++
+ Function: "tan":
+ double: 1
+ idouble: 1
+
++Function: "tan_downward":
++float: 1
++ifloat: 1
++ildouble: 1
++ldouble: 1
++
++Function: "tan_tonearest":
++ildouble: 1
++ldouble: 1
++
++Function: "tan_towardzero":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
++Function: "tan_upward":
++float: 1
++ifloat: 1
++ildouble: 2
++ldouble: 2
++
+ Function: "tgamma":
+ double: 1
+ float: 1
+diff -Nrup a/sysdeps/x86_64/fpu/math_private.h b/sysdeps/x86_64/fpu/math_private.h
+--- a/sysdeps/x86_64/fpu/math_private.h 2010-05-04 05:27:23.000000000 -0600
++++ b/sysdeps/x86_64/fpu/math_private.h 2012-08-06 09:54:00.893929393 -0600
+@@ -56,3 +56,82 @@ do { \
+ } while (0)
+
+ #endif
++
++
++/* Specialized variants of the <fenv.h> interfaces which only handle
++ either the FPU or the SSE unit. */
++#undef libc_fegetround
++#define libc_fegetround() \
++ ({ \
++ unsigned int mxcsr; \
++ asm volatile ("stmxcsr %0" : "=m" (*&mxcsr)); \
++ (mxcsr & 0x6000) >> 3; \
++ })
++#undef libc_fegetroundf
++#define libc_fegetroundf() libc_fegetround ()
++// #define libc_fegetroundl() fegetround ()
++
++#undef libc_fesetround
++#define libc_fesetround(r) \
++ do { \
++ unsigned int mxcsr; \
++ asm ("stmxcsr %0" : "=m" (*&mxcsr)); \
++ mxcsr = (mxcsr & ~0x6000) | ((r) << 3); \
++ asm volatile ("ldmxcsr %0" : : "m" (*&mxcsr)); \
++ } while (0)
++#undef libc_fesetroundf
++#define libc_fesetroundf(r) libc_fesetround (r)
++// #define libc_fesetroundl(r) (void) fesetround (r)
++
++#undef libc_feholdexcept
++#define libc_feholdexcept(e) \
++ do { \
++ unsigned int mxcsr; \
++ asm ("stmxcsr %0" : "=m" (*&mxcsr)); \
++ (e)->__mxcsr = mxcsr; \
++ mxcsr = (mxcsr | 0x1f80) & ~0x3f; \
++ asm volatile ("ldmxcsr %0" : : "m" (*&mxcsr)); \
++ } while (0)
++#undef libc_feholdexceptf
++#define libc_feholdexceptf(e) libc_feholdexcept (e)
++// #define libc_feholdexceptl(e) (void) feholdexcept (e)
++
++#undef libc_feholdexcept_setround
++#define libc_feholdexcept_setround(e, r) \
++ do { \
++ unsigned int mxcsr; \
++ asm ("stmxcsr %0" : "=m" (*&mxcsr)); \
++ (e)->__mxcsr = mxcsr; \
++ mxcsr = ((mxcsr | 0x1f80) & ~0x603f) | ((r) << 3); \
++ asm volatile ("ldmxcsr %0" : : "m" (*&mxcsr)); \
++ } while (0)
++#undef libc_feholdexcept_setroundf
++#define libc_feholdexcept_setroundf(e, r) libc_feholdexcept_setround (e, r)
++// #define libc_feholdexcept_setroundl(e, r) ...
++
++#undef libc_fetestexcept
++#define libc_fetestexcept(e) \
++ ({ unsigned int mxcsr; asm volatile ("stmxcsr %0" : "=m" (*&mxcsr)); \
++ mxcsr & (e) & FE_ALL_EXCEPT; })
++#undef libc_fetestexceptf
++#define libc_fetestexceptf(e) libc_fetestexcept (e)
++// #define libc_fetestexceptl(e) fetestexcept (e)
++
++#undef libc_fesetenv
++#define libc_fesetenv(e) \
++ asm volatile ("ldmxcsr %0" : : "m" ((e)->__mxcsr))
++#undef libc_fesetenvf
++#define libc_fesetenvf(e) libc_fesetenv (e)
++// #define libc_fesetenvl(e) (void) fesetenv (e)
++
++#undef libc_feupdateenv
++#define libc_feupdateenv(e) \
++ do { \
++ unsigned int mxcsr; \
++ asm volatile ("stmxcsr %0" : "=m" (*&mxcsr)); \
++ asm volatile ("ldmxcsr %0" : : "m" ((e)->__mxcsr)); \
++ feraiseexcept (mxcsr & FE_ALL_EXCEPT); \
++ } while (0)
++#undef libc_feupdateenvf
++#define libc_feupdateenvf(e) libc_feupdateenv (e)
++// #define libc_feupdateenvl(e) (void) feupdateenv (e)