On September 28, 2019 8:34:59 AM GMT+02:00, Alan Modra <amo...@gmail.com> wrote: >Tested on powerpc64le-linux and powerpc64-linux. OK?
Ok. Thanks, Richard. >pr91656-3.c didn't really need to be changed since popcount doesn't >care which bits are set, but I figured it was better to make the test >set the low 16 bits of the 64-bit value in both big and litte endian. > > 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. > >diff --git a/gcc/testsuite/gcc.dg/torture/pr91656-1.c >b/gcc/testsuite/gcc.dg/torture/pr91656-1.c >index 6c1e73c7f01..fae17de1112 100644 >--- a/gcc/testsuite/gcc.dg/torture/pr91656-1.c >+++ b/gcc/testsuite/gcc.dg/torture/pr91656-1.c >@@ -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; >diff --git a/gcc/testsuite/gcc.dg/torture/pr91656-2.c >b/gcc/testsuite/gcc.dg/torture/pr91656-2.c >index 90374becae0..29a619b280e 100644 >--- a/gcc/testsuite/gcc.dg/torture/pr91656-2.c >+++ b/gcc/testsuite/gcc.dg/torture/pr91656-2.c >@@ -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; > } >diff --git a/gcc/testsuite/gcc.dg/torture/pr91656-3.c >b/gcc/testsuite/gcc.dg/torture/pr91656-3.c >index 8e65d24a21d..f84e51af4a4 100644 >--- a/gcc/testsuite/gcc.dg/torture/pr91656-3.c >+++ b/gcc/testsuite/gcc.dg/torture/pr91656-3.c >@@ -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; > }