From 7c5f3bb955123ba65bbdedee0e4499ef78a5747c Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Thu, 20 Sep 2018 23:14:11 +0000 Subject: [PATCH] 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. --- src/math/powerpc/fabs.c | 15 +++++++++++++++ src/math/powerpc/fabsf.c | 15 +++++++++++++++ src/math/powerpc/fma.c | 15 +++++++++++++++ src/math/powerpc/fmaf.c | 15 +++++++++++++++ src/math/powerpc/sqrt.c | 15 +++++++++++++++ src/math/powerpc/sqrtf.c | 15 +++++++++++++++ 6 files changed, 90 insertions(+) create mode 100644 src/math/powerpc/fabs.c create mode 100644 src/math/powerpc/fabsf.c create mode 100644 src/math/powerpc/fma.c create mode 100644 src/math/powerpc/fmaf.c create mode 100644 src/math/powerpc/sqrt.c create mode 100644 src/math/powerpc/sqrtf.c 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 + +#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 + +#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 + +#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 + +#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 + +#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 + +#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 -- 2.25.1