Another test.
authorJeff Law <law@gcc.gnu.org>
Wed, 6 May 1998 22:06:44 +0000 (16:06 -0600)
committerJeff Law <law@gcc.gnu.org>
Wed, 6 May 1998 22:06:44 +0000 (16:06 -0600)
From-SVN: r19604

gcc/testsuite/gcc.c-torture/compile/980506-2.c [new file with mode: 0644]

diff --git a/gcc/testsuite/gcc.c-torture/compile/980506-2.c b/gcc/testsuite/gcc.c-torture/compile/980506-2.c
new file mode 100644 (file)
index 0000000..6f6fe19
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * inspired by glibc-2.0.6/sysdeps/libm-ieee754/s_nextafterf.c
+ *
+ * gcc -O2 -S -DOP=+ gives faddp %st(1),%st
+ * gcc -O2 -S -DOP=* gives fmulp %st(1),%st
+ * gcc -O2 -S -DOP=- gives fsubrp %st(1),%st
+ * gcc -O2 -S -DOP=/ gives fdivrp %st(1),%st
+ */
+
+#ifndef OP
+#define OP *
+#endif
+
+typedef int int32_t __attribute__ ((__mode__ (  __SI__ ))) ;
+typedef unsigned int u_int32_t __attribute__ ((__mode__ (  __SI__ ))) ;
+
+typedef union
+{
+  float value;
+  u_int32_t word;
+} ieee_float_shape_type;
+
+float __nextafterf(float x, float y)
+{
+ int32_t hx,hy,ix,iy;
+
+ {
+  ieee_float_shape_type gf_u;
+  gf_u.value = x;
+  hx = gf_u.word;
+ }
+ {
+  ieee_float_shape_type gf_u;
+  gf_u.value = y;
+  hy = gf_u.word;
+ }
+ ix = hx&0x7fffffff;
+ iy = hy&0x7fffffff;
+
+ if ( ix > 0x7f800000 || iy > 0x7f800000 )
+    return x+y;
+ if (x == y) return x;
+ if (ix == 0)
+   {
+    {
+     ieee_float_shape_type sf_u;
+     sf_u.word = (hy&0x80000000) | 1;
+     x = sf_u.value;
+    }
+    y = x*x;
+    if (y == x) return y; else return x;
+   }
+ if (hx >= 0)
+   {
+    if (hx > hy)
+       hx -= 1;
+    else
+       hx += 1;
+   }
+ else
+   {
+    if (hy >= 0 || hx > hy)
+       hx -= 1;
+    else
+       hx += 1;
+   }
+ hy = hx & 0x7f800000;
+ if (hy >= 0x7f800000)
+    return x+x;
+ if (hy < 0x00800000)
+   {
+    y = x OP x;
+    if (y != x)
+      {
+       ieee_float_shape_type sf_u;
+       sf_u.word = hx;
+       y = sf_u.value;
+       return y;
+      }
+   }
+ {
+  ieee_float_shape_type sf_u;
+  sf_u.word = hx;
+  x = sf_u.value;
+ }
+ return x;
+}
+
+