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",



Reply via email to