diff options
author | Szabolcs Nagy <nsz@port70.net> | 2018-09-20 23:14:11 +0000 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2018-10-15 14:41:59 -0400 |
commit | 7c5f3bb955123ba65bbdedee0e4499ef78a5747c (patch) | |
tree | cb05a4518e85d56141d0e2e0ebb03ba312dfe470 | |
parent | 1da534ada8a66424e0d23e94ab6750b689be6d64 (diff) | |
download | musl-7c5f3bb955123ba65bbdedee0e4499ef78a5747c.tar.gz musl-7c5f3bb955123ba65bbdedee0e4499ef78a5747c.tar.xz musl-7c5f3bb955123ba65bbdedee0e4499ef78a5747c.zip |
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.
-rw-r--r-- | src/math/powerpc/fabs.c | 15 | ||||
-rw-r--r-- | src/math/powerpc/fabsf.c | 15 | ||||
-rw-r--r-- | src/math/powerpc/fma.c | 15 | ||||
-rw-r--r-- | src/math/powerpc/fmaf.c | 15 | ||||
-rw-r--r-- | src/math/powerpc/sqrt.c | 15 | ||||
-rw-r--r-- | src/math/powerpc/sqrtf.c | 15 |
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 |