summaryrefslogtreecommitdiff
path: root/libstdc++-v3/libmath/stubs.c
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/libmath/stubs.c')
-rw-r--r--libstdc++-v3/libmath/stubs.c170
1 files changed, 157 insertions, 13 deletions
diff --git a/libstdc++-v3/libmath/stubs.c b/libstdc++-v3/libmath/stubs.c
index cba6f8441fc..9a0f5f63954 100644
--- a/libstdc++-v3/libmath/stubs.c
+++ b/libstdc++-v3/libmath/stubs.c
@@ -28,9 +28,13 @@
the GNU General Public License. */
#include <math.h>
-#include <config.h>
+#include "config.h"
-#ifndef _GLIBCPP_HAVE_ATAN2F
+/* For targets which do not have support for long double versions,
+ we use the crude approximation. We'll do better later. */
+
+
+#ifndef HAVE_ATAN2F
float
atan2f(float x, float y)
{
@@ -38,7 +42,16 @@ atan2f(float x, float y)
}
#endif
-#if !defined(_GLIBCPP_HAVE_COSF) && !defined(_GLIBCPP_HAVE___BUILTIN_COSF)
+#ifndef HAVE_ATAN2L
+long double
+atan2l(long double x, long double y)
+{
+ return atan2((double) x, (double) y);
+}
+#endif
+
+
+#if !defined(HAVE_COSF) && !defined(HAVE___BUILTIN_COSF)
float
cosf(float x)
{
@@ -46,7 +59,16 @@ cosf(float x)
}
#endif
-#ifndef _GLIBCPP_HAVE_COSHF
+#ifndef HAVE_COSL
+long double
+cosl(long double x)
+{
+ return cos((double) x);
+}
+#endif
+
+
+#ifndef HAVE_COSHF
float
coshf(float x)
{
@@ -54,7 +76,16 @@ coshf(float x)
}
#endif
-#ifndef _GLIBCPP_HAVE_EXPF
+#ifndef HAVE_COSHL
+long double
+coshl(long double x)
+{
+ return cosh((double) x);
+}
+#endif
+
+
+#ifndef HAVE_EXPF
float
expf(float x)
{
@@ -62,7 +93,49 @@ expf(float x)
}
#endif
-#ifndef _GLIBCPP_HAVE_LOGF
+#ifndef HAVE_EXPL
+long double
+expl(long double x)
+{
+ return exp((double) x);
+}
+#endif
+
+
+/* Compute the hypothenuse of a right triangle with side x and y. */
+#ifndef HAVE_HYPOTF
+float
+hypotf(float x, float y)
+{
+ float s = fabsf(x) + fabsf(y);
+ x /= s; y /= s;
+ return s * sqrtf(x * x + y * y);
+}
+#endif
+
+#ifndef HAVE_HYPOT
+double
+hypot(double x, double y)
+{
+ double s = fabs(x) + fabs(y);
+ x /= s; y /= s;
+ return s * sqrt(x * x + y * y);
+}
+#endif
+
+#ifndef HAVE_HYPOTL
+long double
+hypotl(long double x, long double y)
+{
+ long double s = fabsl(x) + fabsl(y);
+ x /= s; y /= s;
+ return s * sqrtl(x * x + y * y);
+}
+#endif
+
+
+
+#ifndef HAVE_LOGF
float
logf(float x)
{
@@ -70,7 +143,16 @@ logf(float x)
}
#endif
-#ifndef _GLIBCPP_HAVE_LOG10F
+#ifndef _GBLICPP_HAVE_LOGL
+long double
+logl(long double x)
+{
+ return log((double) x);
+}
+#endif
+
+
+#ifndef HAVE_LOG10F
float
log10f(float x)
{
@@ -78,7 +160,16 @@ log10f(float x)
}
#endif
-#ifndef _GLIBCPP_HAVE_POWF
+#ifndef HAVE_LOG10L
+long double
+log10l(long double x)
+{
+ return log10((double) x);
+}
+#endif
+
+
+#ifndef HAVE_POWF
float
powf(float x, float y)
{
@@ -86,7 +177,16 @@ powf(float x, float y)
}
#endif
-#if !defined(_GLIBCPP_HAVE_SINF) && !defined(_GLIBCPP_HAVE___BUILTIN_SINF)
+#ifndef HAVE_POWL
+long double
+powl(long double x, long double y)
+{
+ return pow((double) x, (double) y);
+}
+#endif
+
+
+#if !defined(HAVE_SINF) && !defined(HAVE___BUILTIN_SINF)
float
sinf(float x)
{
@@ -94,7 +194,16 @@ sinf(float x)
}
#endif
-#ifndef _GLIBCPP_HAVE_SINHF
+#ifndef HAVE_SINL
+long double
+sinl(long double x)
+{
+ return sin((double) x);
+}
+#endif
+
+
+#ifndef HAVE_SINHF
float
sinhf(float x)
{
@@ -102,7 +211,16 @@ sinhf(float x)
}
#endif
-#ifndef _GLIBCPP_HAVE_SQRTF
+#ifndef HAVE_SINHL
+long double
+sinhl(long double x)
+{
+ return sinh((double) x);
+}
+#endif
+
+
+#ifndef HAVE_SQRTF
float
sqrtf(float x)
{
@@ -110,7 +228,16 @@ sqrtf(float x)
}
#endif
-#ifndef _GLIBCPP_HAVE_TANF
+#ifndef HAVE_SQRTL
+long double
+sqrtl(long double x)
+{
+ return sqrt((double) x);
+}
+#endif
+
+
+#ifndef HAVE_TANF
float
tanf(float x)
{
@@ -118,10 +245,27 @@ tanf(float x)
}
#endif
-#ifndef _GLIBCPP_HAVE_TANHF
+#ifndef HAVE_TANL
+long double
+tanl(long double x)
+{
+ return tan((double) x);
+}
+#endif
+
+
+#ifndef HAVE_TANHF
float
tanhf(float x)
{
return (float) tanh(x);
}
#endif
+
+#ifndef HAVE_TANHL
+long double
+tanhl(long double x)
+{
+ return tanh((double) x);
+}
+#endif