Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libm/machine/spu/headers/tgamma.h')
-rw-r--r--newlib/libm/machine/spu/headers/tgamma.h26
1 files changed, 25 insertions, 1 deletions
diff --git a/newlib/libm/machine/spu/headers/tgamma.h b/newlib/libm/machine/spu/headers/tgamma.h
index ea0c32e0f..bd2f31f27 100644
--- a/newlib/libm/machine/spu/headers/tgamma.h
+++ b/newlib/libm/machine/spu/headers/tgamma.h
@@ -1,6 +1,30 @@
+#include <errno.h>
+#include "headers/truncd2.h"
#include "headers/tgammad2.h"
static __inline double _tgamma(double x)
{
- return spu_extract(_tgammad2(spu_promote(x, 0)), 0);
+ double res;
+ vector double vx;
+ vector double truncx;
+ vector double vc = { 0.0, 0.0 };
+ vector unsigned long long cmpres;
+ vector signed int verrno, ferrno;
+ vector signed int fail = { EDOM, EDOM, EDOM, EDOM };
+
+ vx = spu_promote(x, 0);
+ res = spu_extract(_tgammad2(vx), 0);
+
+#ifndef _IEEE_LIBM
+ /*
+ * use vector truncd2 rather than splat x, and splat truncx.
+ */
+ truncx = _truncd2(vx);
+ cmpres = spu_cmpeq(truncx, vx);
+ verrno = spu_splats(errno);
+ ferrno = spu_sel(verrno, fail, (vector unsigned int) cmpres);
+ cmpres = spu_cmpgt(vc, vx);
+ errno = spu_extract(spu_sel(verrno, ferrno, (vector unsigned int) cmpres), 0);
+#endif
+ return res;
}