summaryrefslogtreecommitdiff
path: root/src/math/powerpc
diff options
context:
space:
mode:
authorSzabolcs Nagy <nsz@port70.net>2018-09-20 23:14:11 +0000
committerRich Felker <dalias@aerifal.cx>2018-10-15 14:41:59 -0400
commit7c5f3bb955123ba65bbdedee0e4499ef78a5747c (patch)
treecb05a4518e85d56141d0e2e0ebb03ba312dfe470 /src/math/powerpc
parent1da534ada8a66424e0d23e94ab6750b689be6d64 (diff)
downloadmusl-7c5f3bb955123ba65bbdedee0e4499ef78a5747c.tar.gz
powerpc: add single instruction fabs, fabsf, fma, fmaf, sqrt, sqrtf
These are only available on hard float target and sqrt is not available in the base ISA, so further check is used.
Diffstat (limited to 'src/math/powerpc')
-rw-r--r--src/math/powerpc/fabs.c15
-rw-r--r--src/math/powerpc/fabsf.c15
-rw-r--r--src/math/powerpc/fma.c15
-rw-r--r--src/math/powerpc/fmaf.c15
-rw-r--r--src/math/powerpc/sqrt.c15
-rw-r--r--src/math/powerpc/sqrtf.c15
6 files changed, 90 insertions, 0 deletions
diff --git a/src/math/powerpc/fabs.c b/src/math/powerpc/fabs.c
new file mode 100644
index 00000000..f6ec4433
--- /dev/null
+++ b/src/math/powerpc/fabs.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _SOFT_FLOAT
+
+#include "../fabs.c"
+
+#else
+
+double fabs(double x)
+{
+ __asm__ ("fabs %0, %1" : "=d"(x) : "d"(x));
+ return x;
+}
+
+#endif
diff --git a/src/math/powerpc/fabsf.c b/src/math/powerpc/fabsf.c
new file mode 100644
index 00000000..d88b5911
--- /dev/null
+++ b/src/math/powerpc/fabsf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _SOFT_FLOAT
+
+#include "../fabsf.c"
+
+#else
+
+float fabsf(float x)
+{
+ __asm__ ("fabs %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#endif
diff --git a/src/math/powerpc/fma.c b/src/math/powerpc/fma.c
new file mode 100644
index 00000000..fd268f5f
--- /dev/null
+++ b/src/math/powerpc/fma.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _SOFT_FLOAT
+
+#include "../fma.c"
+
+#else
+
+double fma(double x, double y, double z)
+{
+ __asm__("fmadd %0, %1, %2, %3" : "=d"(x) : "d"(x), "d"(y), "d"(z));
+ return x;
+}
+
+#endif
diff --git a/src/math/powerpc/fmaf.c b/src/math/powerpc/fmaf.c
new file mode 100644
index 00000000..a99a2a3b
--- /dev/null
+++ b/src/math/powerpc/fmaf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _SOFT_FLOAT
+
+#include "../fmaf.c"
+
+#else
+
+float fmaf(float x, float y, float z)
+{
+ __asm__("fmadds %0, %1, %2, %3" : "=f"(x) : "f"(x), "f"(y), "f"(z));
+ return x;
+}
+
+#endif
diff --git a/src/math/powerpc/sqrt.c b/src/math/powerpc/sqrt.c
new file mode 100644
index 00000000..8718dbd0
--- /dev/null
+++ b/src/math/powerpc/sqrt.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if !defined _SOFT_FLOAT && defined _ARCH_PPCSQ
+
+double sqrt(double x)
+{
+ __asm__ ("fsqrt %0, %1\n" : "=d" (x) : "d" (x));
+ return x;
+}
+
+#else
+
+#include "../sqrt.c"
+
+#endif
diff --git a/src/math/powerpc/sqrtf.c b/src/math/powerpc/sqrtf.c
new file mode 100644
index 00000000..3431b672
--- /dev/null
+++ b/src/math/powerpc/sqrtf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if !defined _SOFT_FLOAT && defined _ARCH_PPCSQ
+
+float sqrtf(float x)
+{
+ __asm__ ("fsqrts %0, %1\n" : "=f" (x) : "f" (x));
+ return x;
+}
+
+#else
+
+#include "../sqrtf.c"
+
+#endif