[rs6000] Fix test case bcd4.c

Message ID e23d1236-6dc5-4d10-9607-f0f7adb3fa90@linux.ibm.com
State New
Headers
Series [rs6000] Fix test case bcd4.c |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 success Testing passed

Commit Message

HAO CHEN GUI April 17, 2024, 5:12 a.m. UTC
  Hi,
  This patch fixes loss of return statement in maxbcd of bcd-4.c. Without
return statement, it returns an invalid bcd number and make the test
noneffective. The patch also enables test to run on Power9 and Big Endian,
as all bcd instructions are supported from Power9.

  Bootstrapped and tested on powerpc64-linux BE and LE with no
regressions. Is it OK for the trunk?

Thanks
Gui Haochen


ChangeLog
rs6000: Fix bcd test case

gcc/testsuite/
	* gcc.target/powerpc/bcd-4.c: Enable the case to be tested on Power9.
	Enable the case to be run on big endian.  Fix function maxbcd and
	other misc. problems.


patch.diff
  

Comments

Kewen.Lin April 17, 2024, 7:26 a.m. UTC | #1
Hi,

on 2024/4/17 13:12, HAO CHEN GUI wrote:
> Hi,
>   This patch fixes loss of return statement in maxbcd of bcd-4.c. Without
> return statement, it returns an invalid bcd number and make the test
> noneffective. The patch also enables test to run on Power9 and Big Endian,
> as all bcd instructions are supported from Power9.
> 
>   Bootstrapped and tested on powerpc64-linux BE and LE with no
> regressions. Is it OK for the trunk?

OK with two nits below tweaked, thanks!

> 
> Thanks
> Gui Haochen
> 
> 
> ChangeLog
> rs6000: Fix bcd test case
> 
> gcc/testsuite/
> 	* gcc.target/powerpc/bcd-4.c: Enable the case to be tested on Power9.
> 	Enable the case to be run on big endian.  Fix function maxbcd and
> 	other misc. problems.
> 
> 
> patch.diff
> diff --git a/gcc/testsuite/gcc.target/powerpc/bcd-4.c b/gcc/testsuite/gcc.target/powerpc/bcd-4.c
> index 2c8554dfe82..8c0bac2720f 100644
> --- a/gcc/testsuite/gcc.target/powerpc/bcd-4.c
> +++ b/gcc/testsuite/gcc.target/powerpc/bcd-4.c
> @@ -1,7 +1,7 @@
>  /* { dg-do run } */
>  /* { dg-require-effective-target int128 } */
> -/* { dg-require-effective-target power10_hw } */
> -/* { dg-options "-mdejagnu-cpu=power10 -O2 -save-temps" } */
> +/* { dg-require-effective-target p9vector_hw } */
> +/* { dg-options "-mdejagnu-cpu=power9 -O2 -save-temps" } */
>  /* { dg-final { scan-assembler-times {\mbcdadd\M} 7 } } */
>  /* { dg-final { scan-assembler-times {\mbcdsub\M} 18 } } */
>  /* { dg-final { scan-assembler-times {\mbcds\M} 2 } } */
> @@ -44,10 +44,20 @@ vector unsigned char maxbcd(unsigned int sign)
>    vector unsigned char result;
>    int i;
> 
> +#ifdef _BIG_ENDIAN
> +  for (i = 0; i < 15; i++)
> +#else
>    for (i = 15; i > 0; i--)
> +#endif
>      result[i] = 0x99;
> 
> -  result[0] = sign << 4 | 0x9;
> +#ifdef _BIG_ENDIAN

Nit: I'd prefer __BIG_ENDIAN__, although both work in most cases,
RS6000_CPU_CPP_ENDIAN_BUILTINS in netbsd.h doesn't define _BIG_ENDIAN.

So could you do a global replacement with __BIG_ENDIAN__?

> +  result[15] = 0x90 | sign;
> +#else
> +  result[0] = 0x90 | sign;
> +#endif
> +
> +  return result;
>  }
> 
>  vector unsigned char num2bcd(long int a, int encoding)
> @@ -70,9 +80,17 @@ vector unsigned char num2bcd(long int a, int encoding)
> 
>    hi = a % 10;   // 1st digit
>    a = a / 10;
> +#ifdef _BIG_ENDIAN
> +  result[15] = hi << 4| sign;
> +#else
>    result[0] = hi << 4| sign;
> +#endif
> 
> +#ifdef _BIG_ENDIAN
> +  for (i = 14; i >= 0; i--)
> +#else
>    for (i = 1; i < 16; i++)
> +#endif
>      {
>        low = a % 10;
>        a = a / 10;
> @@ -117,7 +135,11 @@ int main ()
>      }
> 
>    /* result should be positive */
> +#ifdef _BIG_ENDIAN
> +  if ((result[15] & 0xF) != BCD_POS0)
> +#else
>    if ((result[0] & 0xF) != BCD_POS0)
> +#endif
>  #if DEBUG
>        printf("ERROR: __builtin_bcdadd sign of result is %d.  Does not match "
>  	     "expected_result = %d\n",
> @@ -150,7 +172,11 @@ int main ()
>      }
> 
>    /* Result should be positive, alternate encoding.  */
> +#ifdef _BIG_ENDIAN
> +  if ((result[15] & 0xF) != BCD_POS1)
> +#else
>    if ((result[0] & 0xF) != BCD_POS1)
> +#endif
>  #if DEBUG
>      printf("ERROR: __builtin_bcdadd sign of result is %d.  Does not "
>  	   "match expected_result = %d\n",
> @@ -183,7 +209,11 @@ int main ()
>      }
> 
>    /* result should be negative */
> +#ifdef _BIG_ENDIAN
> +  if ((result[15] & 0xF) != BCD_NEG)
> +#else
>    if ((result[0] & 0xF) != BCD_NEG)
> +#endif
>  #if DEBUG
>      printf("ERROR: __builtin_bcdadd sign, neg of result is %d.  Does not "
>  	   "match expected_result = %d\n",
> @@ -217,7 +247,11 @@ int main ()
>      }
> 
>    /* result should be positive, alt encoding */

Nit: This comment is inconsistent with the below check, may be:

/* result should be negative.  */

BR,
Kewen

> +#ifdef _BIG_ENDIAN
> +  if ((result[15] & 0xF) != BCD_NEG)
> +#else
>    if ((result[0] & 0xF) != BCD_NEG)
> +#endif
>  #if DEBUG
>      printf("ERROR: __builtin_bcdadd sign, of result is %d.  Does not match "
>  	   "expected_result = %d\n",
> @@ -250,7 +284,11 @@ int main ()
>      }
> 
>    /* result should be positive */
> +#ifdef _BIG_ENDIAN
> +  if ((result[15] & 0xF) != BCD_POS1)
> +#else
>    if ((result[0] & 0xF) != BCD_POS1)
> +#endif
>  #if DEBUG
>      printf("ERROR: __builtin_bcdsub sign, result is %d.  Does not match "
>  	   "expected_result = %d\n",
> @@ -283,7 +321,7 @@ int main ()
>      abort();
>  #endif
> 
> -  a = maxbcd(BCD_NEG);
> +  a = maxbcd(BCD_POS0);
>    b = maxbcd(BCD_NEG);
> 
>    if (__builtin_bcdsub_ofl (a, b, 0) == 0)
> @@ -462,8 +500,12 @@ int main ()
>      }
> 
>    /* result should be positive */
> +#ifdef _BIG_ENDIAN
> +  if ((result[15] & 0xF) != BCD_POS0)
> +#else
>    if ((result[0] & 0xF) != BCD_POS0)
> -#if 0
> +#endif
> +#if DEBUG
>      printf("ERROR: __builtin_bcdmul10 sign, result is %d.  Does not match "
>  	   "expected_result = %d\n",
>  	   result[0] & 0xF, BCD_POS1);
> @@ -492,7 +534,11 @@ int main ()
>      }
> 
>    /* result should be positive */
> +#ifdef _BIG_ENDIAN
> +  if ((result[15] & 0xF) != BCD_POS0)
> +#else
>    if ((result[0] & 0xF) != BCD_POS0)
> +#endif
>  #if DEBUG
>      printf("ERROR: __builtin_bcddiv10 sign, result is %d.  Does not match "
>  	   "expected_result = %d\n",
  

Patch

diff --git a/gcc/testsuite/gcc.target/powerpc/bcd-4.c b/gcc/testsuite/gcc.target/powerpc/bcd-4.c
index 2c8554dfe82..8c0bac2720f 100644
--- a/gcc/testsuite/gcc.target/powerpc/bcd-4.c
+++ b/gcc/testsuite/gcc.target/powerpc/bcd-4.c
@@ -1,7 +1,7 @@ 
 /* { dg-do run } */
 /* { dg-require-effective-target int128 } */
-/* { dg-require-effective-target power10_hw } */
-/* { dg-options "-mdejagnu-cpu=power10 -O2 -save-temps" } */
+/* { dg-require-effective-target p9vector_hw } */
+/* { dg-options "-mdejagnu-cpu=power9 -O2 -save-temps" } */
 /* { dg-final { scan-assembler-times {\mbcdadd\M} 7 } } */
 /* { dg-final { scan-assembler-times {\mbcdsub\M} 18 } } */
 /* { dg-final { scan-assembler-times {\mbcds\M} 2 } } */
@@ -44,10 +44,20 @@  vector unsigned char maxbcd(unsigned int sign)
   vector unsigned char result;
   int i;

+#ifdef _BIG_ENDIAN
+  for (i = 0; i < 15; i++)
+#else
   for (i = 15; i > 0; i--)
+#endif
     result[i] = 0x99;

-  result[0] = sign << 4 | 0x9;
+#ifdef _BIG_ENDIAN
+  result[15] = 0x90 | sign;
+#else
+  result[0] = 0x90 | sign;
+#endif
+
+  return result;
 }

 vector unsigned char num2bcd(long int a, int encoding)
@@ -70,9 +80,17 @@  vector unsigned char num2bcd(long int a, int encoding)

   hi = a % 10;   // 1st digit
   a = a / 10;
+#ifdef _BIG_ENDIAN
+  result[15] = hi << 4| sign;
+#else
   result[0] = hi << 4| sign;
+#endif

+#ifdef _BIG_ENDIAN
+  for (i = 14; i >= 0; i--)
+#else
   for (i = 1; i < 16; i++)
+#endif
     {
       low = a % 10;
       a = a / 10;
@@ -117,7 +135,11 @@  int main ()
     }

   /* result should be positive */
+#ifdef _BIG_ENDIAN
+  if ((result[15] & 0xF) != BCD_POS0)
+#else
   if ((result[0] & 0xF) != BCD_POS0)
+#endif
 #if DEBUG
       printf("ERROR: __builtin_bcdadd sign of result is %d.  Does not match "
 	     "expected_result = %d\n",
@@ -150,7 +172,11 @@  int main ()
     }

   /* Result should be positive, alternate encoding.  */
+#ifdef _BIG_ENDIAN
+  if ((result[15] & 0xF) != BCD_POS1)
+#else
   if ((result[0] & 0xF) != BCD_POS1)
+#endif
 #if DEBUG
     printf("ERROR: __builtin_bcdadd sign of result is %d.  Does not "
 	   "match expected_result = %d\n",
@@ -183,7 +209,11 @@  int main ()
     }

   /* result should be negative */
+#ifdef _BIG_ENDIAN
+  if ((result[15] & 0xF) != BCD_NEG)
+#else
   if ((result[0] & 0xF) != BCD_NEG)
+#endif
 #if DEBUG
     printf("ERROR: __builtin_bcdadd sign, neg of result is %d.  Does not "
 	   "match expected_result = %d\n",
@@ -217,7 +247,11 @@  int main ()
     }

   /* result should be positive, alt encoding */
+#ifdef _BIG_ENDIAN
+  if ((result[15] & 0xF) != BCD_NEG)
+#else
   if ((result[0] & 0xF) != BCD_NEG)
+#endif
 #if DEBUG
     printf("ERROR: __builtin_bcdadd sign, of result is %d.  Does not match "
 	   "expected_result = %d\n",
@@ -250,7 +284,11 @@  int main ()
     }

   /* result should be positive */
+#ifdef _BIG_ENDIAN
+  if ((result[15] & 0xF) != BCD_POS1)
+#else
   if ((result[0] & 0xF) != BCD_POS1)
+#endif
 #if DEBUG
     printf("ERROR: __builtin_bcdsub sign, result is %d.  Does not match "
 	   "expected_result = %d\n",
@@ -283,7 +321,7 @@  int main ()
     abort();
 #endif

-  a = maxbcd(BCD_NEG);
+  a = maxbcd(BCD_POS0);
   b = maxbcd(BCD_NEG);

   if (__builtin_bcdsub_ofl (a, b, 0) == 0)
@@ -462,8 +500,12 @@  int main ()
     }

   /* result should be positive */
+#ifdef _BIG_ENDIAN
+  if ((result[15] & 0xF) != BCD_POS0)
+#else
   if ((result[0] & 0xF) != BCD_POS0)
-#if 0
+#endif
+#if DEBUG
     printf("ERROR: __builtin_bcdmul10 sign, result is %d.  Does not match "
 	   "expected_result = %d\n",
 	   result[0] & 0xF, BCD_POS1);
@@ -492,7 +534,11 @@  int main ()
     }

   /* result should be positive */
+#ifdef _BIG_ENDIAN
+  if ((result[15] & 0xF) != BCD_POS0)
+#else
   if ((result[0] & 0xF) != BCD_POS0)
+#endif
 #if DEBUG
     printf("ERROR: __builtin_bcddiv10 sign, result is %d.  Does not match "
 	   "expected_result = %d\n",