Enhance testsuite c-torture test

David S. Miller davem@redhat.com
Fri May 10 11:30:00 GMT 2002


I've always liked conversion.c because it is good at finding all the
weird bugs in software FP support libraries :-)

Unfortunately it doesn't test long double, just float and double.
So I added the long double bits.

2002-05-10  David S. Miller  <davem@redhat.com>

	* gcc.c-torture/execute/conversion.c: Test long double too.

--- gcc.c-torture/execute/conversion.c.~1~	Thu May 18 19:54:38 2000
+++ gcc.c-torture/execute/conversion.c	Fri May 10 09:13:05 2002
@@ -22,6 +22,13 @@
   return u;
 }
 
+long double
+u2ld(u)
+     unsigned int u;
+{
+  return u;
+}
+
 float
 s2f(s)
      int s;
@@ -36,6 +43,13 @@
   return s;
 }
 
+long double
+s2ld(s)
+     int s;
+{
+  return s;
+}
+
 int
 fnear (float x, float y)
 {
@@ -50,6 +64,13 @@
   return t == 0 || x / t > 100000000000000.0;
 }
 
+int
+ldnear (double x, double y)
+{
+  double t = x - y;
+  return t == 0 || x / t > 100000000000000000000000000000000.0;
+}
+
 test_integer_to_float()
 {
   if (u2f(0U) != (float) 0U)				/* 0 */
@@ -70,6 +91,15 @@
   if (u2d(~((~0U) >> 1)) != (double) ~((~0U) >> 1))	/* 0x80000000 */
     abort();
 
+  if (u2ld(0U) != (long double) 0U)			/* 0 */
+    abort();
+  if (!ldnear (u2ld(~0U), (long double) ~0U))		/* 0xffffffff */
+    abort();
+  if (!ldnear (u2ld((~0U) >> 1),(long double) ((~0U) >> 1)))	/* 0x7fffffff */
+    abort();
+  if (u2ld(~((~0U) >> 1)) != (long double) ~((~0U) >> 1))	/* 0x80000000 */
+    abort();
+
   if (s2f(0) != (float) 0)				/* 0 */
     abort();
   if (!fnear (s2f(~0), (float) ~0))			/* 0xffffffff */
@@ -87,6 +117,15 @@
     abort();
   if (s2d((int)~((~0U) >> 1)) != (double)(int)~((~0U) >> 1)) /* 0x80000000 */
     abort();
+
+  if (s2ld(0) != (long double) 0)			/* 0 */
+    abort();
+  if (!ldnear (s2ld(~0), (long double) ~0))		/* 0xffffffff */
+    abort();
+  if (!ldnear (s2ld((int)((~0U) >> 1)), (long double)(int)((~0U) >> 1))) /* 0x7fffffff */
+    abort();
+  if (s2ld((int)~((~0U) >> 1)) != (long double)(int)~((~0U) >> 1)) /* 0x80000000 */
+    abort();
 }
 
 #if __GNUC__
@@ -104,6 +143,13 @@
   return u;
 }
 
+long double
+ull2ld(u)
+     unsigned long long int u;
+{
+  return u;
+}
+
 float
 sll2f(s)
      long long int s;
@@ -118,6 +164,13 @@
   return s;
 }
 
+long double
+sll2ld(s)
+     long long int s;
+{
+  return s;
+}
+
 test_longlong_integer_to_float()
 {
   if (ull2f(0ULL) != (float) 0ULL)			/* 0 */
@@ -147,6 +200,15 @@
   if (ull2d(~((~0ULL) >> 1)) != (double) ~((~0ULL) >> 1)) /* 0x80000000 */
     abort();
 
+  if (ull2ld(0ULL) != (long double) 0ULL)		/* 0 */
+    abort();
+  if (ull2ld(~0ULL) != (long double) ~0ULL)		/* 0xffffffff */
+    abort();
+  if (ull2ld((~0ULL) >> 1) != (long double) ((~0ULL) >> 1))	/* 0x7fffffff */
+    abort();
+  if (ull2ld(~((~0ULL) >> 1)) != (long double) ~((~0ULL) >> 1)) /* 0x80000000 */
+    abort();
+
   if (sll2f(0LL) != (float) 0LL)			/* 0 */
     abort();
   if (sll2f(~0LL) != (float) ~0LL)			/* 0xffffffff */
@@ -164,6 +226,15 @@
     abort();
   if (! dnear (sll2d((long long int)~((~0ULL) >> 1)), (double)(long long int)~((~0ULL) >> 1))) /* 0x80000000 */
     abort();
+
+  if (sll2ld(0LL) != (long double) 0LL)			/* 0 */
+    abort();
+  if (sll2ld(~0LL) != (long double) ~0LL)		/* 0xffffffff */
+    abort();
+  if (!ldnear (sll2ld((long long int)((~0ULL) >> 1)), (long double)(long long int)((~0ULL) >> 1))) /* 0x7fffffff */
+    abort();
+  if (! ldnear (sll2ld((long long int)~((~0ULL) >> 1)), (long double)(long long int)~((~0ULL) >> 1))) /* 0x80000000 */
+    abort();
 }
 #endif
 
@@ -179,6 +250,12 @@
   return (unsigned) d;
 }
 
+unsigned int
+ld2u(long double d)
+{
+  return (unsigned) d;
+}
+
 int
 f2s(float f)
 {
@@ -191,6 +268,12 @@
   return (int) d;
 }
 
+int
+ld2s(long double d)
+{
+  return (int) d;
+}
+
 test_float_to_integer()
 {
   if (f2u(0.0) != 0)
@@ -226,6 +309,25 @@
     abort();
  }
 
+ /* These tests require long double precision, so for hosts that don't offer
+    that much precision, just ignore these test.  */
+ if (sizeof (long double) >= 8) {
+  if (ld2u(0.0) != 0)
+    abort();
+  if (ld2u(0.999) != 0)
+    abort();
+  if (ld2u(1.0) != 1)
+    abort();
+  if (ld2u(1.99) != 1)
+    abort();
+  if (ld2u((long double) (~0U)) != ~0U)			/* 0xffffffff */
+    abort();
+  if (ld2u((long double) ((~0U) >> 1)) != (~0U) >> 1)	/* 0x7fffffff */
+    abort();
+  if (ld2u((long double) ~((~0U) >> 1)) != ~((~0U) >> 1))	/* 0x80000000 */
+    abort();
+ }
+
   if (f2s(0.0) != 0)
     abort();
   if (f2s(0.999) != 0)
@@ -265,6 +367,29 @@
   if (d2s((double)(int)~((~0U) >> 1)) != (int)~((~0U) >> 1)) /* 0x80000000 */
     abort();
  }
+
+ /* These tests require long double precision, so for hosts that don't offer
+    that much precision, just ignore these test.  */
+ if (sizeof (long double) >= 8) {
+  if (ld2s(0.0) != 0)
+    abort();
+  if (ld2s(0.999) != 0)
+    abort();
+  if (ld2s(1.0) != 1)
+    abort();
+  if (ld2s(1.99) != 1)
+    abort();
+  if (ld2s(-0.999) != 0)
+    abort();
+  if (ld2s(-1.0) != -1)
+    abort();
+  if (ld2s(-1.99) != -1)
+    abort();
+  if (ld2s((long double) ((~0U) >> 1)) != (~0U) >> 1)		/* 0x7fffffff */
+    abort();
+  if (ld2s((long double)(int)~((~0U) >> 1)) != (int)~((~0U) >> 1)) /* 0x80000000 */
+    abort();
+ }
 }
 
 #if __GNUC__
@@ -280,6 +405,12 @@
   return (unsigned long long int) d;
 }
 
+unsigned long long int
+ld2ull(long double d)
+{
+  return (unsigned long long int) d;
+}
+
 long long int
 f2sll(float f)
 {
@@ -292,6 +423,12 @@
   return (long long int) d;
 }
 
+long long int
+ld2sll(long double d)
+{
+  return (long long int) d;
+}
+
 test_float_to_longlong_integer()
 {
   if (f2ull(0.0) != 0LL)
@@ -322,6 +459,20 @@
   if (d2ull((double) ~((~0ULL) >> 1)) != ~((~0ULL) >> 1)) /* 0x80000000 */
     abort();
 
+  if (ld2ull(0.0) != 0LL)
+    abort();
+  if (ld2ull(0.999) != 0LL)
+    abort();
+  if (ld2ull(1.0) != 1LL)
+    abort();
+  if (ld2ull(1.99) != 1LL)
+    abort();
+  if (ld2ull((long double) ((~0ULL) >> 1)) != (~0ULL) >> 1 &&	/* 0x7fffffff */
+      ld2ull((long double) ((~0ULL) >> 1)) != ((~0ULL) >> 1) + 1)
+    abort();
+  if (ld2ull((long double) ~((~0ULL) >> 1)) != ~((~0ULL) >> 1)) /* 0x80000000 */
+    abort();
+
 
   if (f2sll(0.0) != 0LL)
     abort();
@@ -355,6 +506,23 @@
   if (d2sll(-1.99) != -1LL)
     abort();
   if (d2sll((double)(long long int)~((~0ULL) >> 1)) != (long long int)~((~0ULL) >> 1)) /* 0x80000000 */
+    abort();
+
+  if (ld2sll(0.0) != 0LL)
+    abort();
+  if (ld2sll(0.999) != 0LL)
+    abort();
+  if (ld2sll(1.0) != 1LL)
+    abort();
+  if (ld2sll(1.99) != 1LL)
+    abort();
+  if (ld2sll(-0.999) != 0LL)
+    abort();
+  if (ld2sll(-1.0) != -1LL)
+    abort();
+  if (ld2sll(-1.99) != -1LL)
+    abort();
+  if (ld2sll((long double)(long long int)~((~0ULL) >> 1)) != (long long int)~((~0ULL) >> 1)) /* 0x80000000 */
     abort();
 }
 #endif



More information about the Gcc-patches mailing list