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