Fix endian issue in pr91656 testcases
authorAlan Modra <amodra@gmail.com>
Sat, 28 Sep 2019 07:12:14 +0000 (16:42 +0930)
committerAlan Modra <amodra@gcc.gnu.org>
Sat, 28 Sep 2019 07:12:14 +0000 (16:42 +0930)
PR testsuite/91676
PR rtl-optimization/91656
* gcc.dg/torture/pr91656-1.c: Correct for big and pdp endian.
* gcc.dg/torture/pr91656-2.c: Likewise.
* gcc.dg/torture/pr91656-3.c: Likewise.

From-SVN: r276236

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr91656-1.c
gcc/testsuite/gcc.dg/torture/pr91656-2.c
gcc/testsuite/gcc.dg/torture/pr91656-3.c

index 163e38d5b6c534ac3e9fcfec3db2d4b71fde5908..8fadb03e97395e82307b78cd45474b9965d78dee 100644 (file)
@@ -1,3 +1,11 @@
+2019-09-28  Alan Modra  <amodra@gmail.com>
+
+       PR testsuite/91676
+       PR rtl-optimization/91656
+       * gcc.dg/torture/pr91656-1.c: Correct for big and pdp endian.
+       * gcc.dg/torture/pr91656-2.c: Likewise.
+       * gcc.dg/torture/pr91656-3.c: Likewise.
+
 2019-09-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/88203
index 6c1e73c7f0188e4f629f27eb45b868954f850ff0..fae17de11128a7fec5a32ec4b4809039b4e8f946 100644 (file)
@@ -6,7 +6,17 @@ int a, b, c, d, e;
 static __attribute__ ((__noipa__))
 int foo (int i)
 {
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
   __builtin_memmove (&i, &e, 1);
+#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+  __builtin_memmove ((char *) &i + sizeof (i) - 1,
+                    (char *) &e + sizeof (e) - 1, 1);
+#elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__
+  __builtin_memmove ((char *) &i + sizeof (i) - 2,
+                    (char *) &e + sizeof (e) - 2, 1);
+#else
+#error "endian unknown?"
+#endif
   if (a > 0)
     i /= e;
   e /= 5;
index 90374becae0de6e69fff13ea0e95efc949ee0457..29a619b280eebcf4e4634c083209037fae6a1386 100644 (file)
@@ -12,7 +12,17 @@ d (u16 g)
 {
   u64 f = __builtin_bswap64 (c);
   f = g == a;
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
   __builtin_memmove (&f, &e, 1);
+#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+  __builtin_memmove ((char *) &f + sizeof (f) - 1,
+                    (char *) &e + sizeof (e) - 1, 1);
+#elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__
+  __builtin_memmove ((char *) &f + sizeof (f) - 2,
+                    (char *) &e + sizeof (e) - 2, 1);
+#else
+#error "endian unknown?"
+#endif
   e >>= b;
   return a + f;
 }
index 8e65d24a21dec957ee6c61da2410a54d3baa940f..f84e51af4a453812567e86e570744d0e87e6b397 100644 (file)
@@ -10,7 +10,14 @@ int
 d (u16 e, u64 f)
 {
   b |= e;
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
   __builtin_memset (&f, e, 2);
+#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ \
+       || __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__)
+  __builtin_memset ((char *) &f + sizeof (f) - 2, e, 2);
+#else
+#error "endian unknown?"
+#endif
   a = (u16) - e >= 2 ? : __builtin_popcountll (f);
   return a + c;
 }