summaryrefslogtreecommitdiff
path: root/test/pftest.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/pftest.c')
-rw-r--r--test/pftest.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/test/pftest.c b/test/pftest.c
new file mode 100644
index 0000000000000..99d78ee451c1a
--- /dev/null
+++ b/test/pftest.c
@@ -0,0 +1,158 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 2009 by David M. Gay
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+source-code copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation.
+
+THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+****************************************************************/
+#include "stdio1.h"
+#include "gdtoa.h"
+#include <string.h>
+
+#undef allow_Quad
+#undef want_Quad
+#undef want_Ux
+#define want_LD
+typedef union Ud {double x; unsigned int u[2]; } Ud;
+#ifdef __x86_64 /*{{*/
+#define want_Ux
+#ifndef NO_GDTOA_i386_Quad /*{*/
+typedef union UQ {__float128 x; unsigned int u[4]; } UQ;
+#define allow_Quad(x) x
+#define want_Quad
+#endif /*}*/
+#else /*}{*/
+#ifdef __i386 /*{{*/
+#define want_Ux
+#else /*}{*/
+#ifdef __sparc /*{{*/
+typedef union UQ {long double x; unsigned int u[4]; } Ux;
+#else /*}{*/
+#ifdef __INTEL_COMPILER /*{*/
+#undef want_Quad
+#undef want_Ux
+#undef want_LD
+#endif /*}*/
+#endif /*}}*/
+#endif /*}}*/
+#endif /*}}*/
+
+#ifndef allow_Quad
+#define allow_Quad(x) /*nothing*/
+#endif
+
+#ifdef want_Ux /*{{*/
+typedef union Ux {long double x; unsigned short u[5]; } Ux;
+#else /*}{*/
+#ifdef __sparc
+#define want_Ux
+#endif
+#endif /*}}*/
+
+ int
+main(void)
+{
+ Ud d;
+ allow_Quad(UQ q;)
+ char *b, buf[256], fmt[32], *s;
+#ifdef want_Ux
+ Ux x;
+ x.x = 0.;
+#endif
+ int k;
+
+ k = 0;
+ strcpy(fmt, "%.g");
+ d.x = 0.;
+ allow_Quad(q.x = 0.;)
+ while(fgets(buf, sizeof(buf), stdin)) {
+ for(b = buf; *b && *b != '\n'; ++b);
+ *b = 0;
+ if (b == buf)
+ continue;
+ b = buf;
+ if (*b == '%') {
+ for(k = 0; *b > ' '; ++b)
+#ifdef want_LD /*{{*/
+ switch(*b) {
+ case 'L':
+ k = 1;
+#ifdef want_Quad
+ break;
+ case 'q':
+ if (k >= 1)
+ k = 2;
+#endif
+ }
+#else /*}{*/
+ ;
+#endif /*}}*/
+ if (*b)
+ *b++ = 0;
+ if (b - buf < sizeof(fmt)) {
+ strcpy(fmt, buf);
+ }
+ }
+ if (*b) {
+ switch(k) {
+ case 0:
+ d.x = strtod(b,&s);
+ break;
+ case 1:
+#ifdef want_Ux
+#ifdef __sparc
+ strtopQ(b,&s,&x.x);
+#else
+ strtopx(b,&s,&x.x);
+#endif
+#else
+ strtopQ(b,&s,&q.x);
+#endif
+ break;
+ allow_Quad(case 2: strtopQ(b,&s,&q.x);)
+ }
+ if (*s)
+ printf("Ignoring \"%s\"\n", s);
+ }
+ switch(k) {
+ case 0:
+ printf("d.x = %.g = #%x %x; %s ==> ", d.x, d.u[1], d.u[0], fmt);
+ printf(fmt, d.x);
+ break;
+ case 1:
+#ifdef __sparc
+ printf("x.x = %.Lg = #%x %x %x %x; %s ==> ", x.x,
+ x.u[0], x.u[1], x.u[2], x.u[3], fmt);
+#else
+ printf("x.x = %.Lg = #%x %x %x %x %x; %s ==> ", x.x,
+ x.u[4], x.u[3], x.u[2], x.u[1], x.u[0], fmt);
+#endif
+ printf(fmt, x.x);
+#ifdef want_Quad
+ break;
+ case 2:
+ printf("q.x = %.Lqg = #%x %x %x %x; %s ==> ", q.x,
+ q.u[3], q.u[2], q.u[1], q.u[0], fmt);
+ printf(fmt, q.x);
+#endif
+ }
+ putchar('\n');
+ }
+ return 0;
+ }