On 19/08/16 12:48, Matthew Wahab wrote:
> Hello,
> 
> Test gcc.c-torture/execute/ieee/pr72824-2.c fails for arm targets
> because the code generated to move a vector of signed and unsigned zeros
> treats it as a vector of unsigned zeros.
> 
> That is, an assignment x = { 0.f, -0.f, 0.f, -0.f } is treated as the
> assignment x = { 0.f, 0.f, 0.f, 0.f }.
> 
> This is due to config/arm/arm.c/neon_valid_immediate using real_equal to
> compare the vector elements. This patch replaces the check, using
> const_vec_duplicate_p instead. It doesn't add a new test because
> pr72824-2.c is enough to check the behaviour.
> 
> Tested for arm-none-linux-gnueabihf with native bootstrap and make check
> and for arm-none-eabi with cross-compiled check-gcc.
> 
> 2016-08-19  Matthew Wahab  <matthew.wa...@arm.com>
> 
>     PR target/77281
>     * config/arm/arm.c (neon_valid_immediate): Delete declaration.
>     Use const_vec_duplicate to check for duplicated elements.
> 
> Ok for trunk?

OK.

Thanks.

R.

> Matthew
> 
> 0001-ARM-Fix-a-wrong-test-for-vectors-of-the-same-constan.patch
> 
> 
> From 90c1c86b7a3d8bc6ac07363aea5fba8f29ef3e96 Mon Sep 17 00:00:00 2001
> From: Matthew Wahab <matthew.wa...@arm.com>
> Date: Wed, 17 Aug 2016 14:43:48 +0100
> Subject: [PATCH] [ARM] Fix a wrong test for vectors of the same constants.
> 
> ---
>  gcc/config/arm/arm.c | 13 ++++---------
>  1 file changed, 4 insertions(+), 9 deletions(-)
> 
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index a6afdcc..c1d010c 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -12471,7 +12471,6 @@ neon_valid_immediate (rtx op, machine_mode mode, int 
> inverse,
>    if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
>      {
>        rtx el0 = CONST_VECTOR_ELT (op, 0);
> -      const REAL_VALUE_TYPE *r0;
>  
>        if (!vfp3_const_double_rtx (el0) && el0 != CONST0_RTX (GET_MODE (el0)))
>          return -1;
> @@ -12480,14 +12479,10 @@ neon_valid_immediate (rtx op, machine_mode mode, 
> int inverse,
>        if (GET_MODE_INNER (mode) == HFmode)
>       return -1;
>  
> -      r0 = CONST_DOUBLE_REAL_VALUE (el0);
> -
> -      for (i = 1; i < n_elts; i++)
> -        {
> -          rtx elt = CONST_VECTOR_ELT (op, i);
> -          if (!real_equal (r0, CONST_DOUBLE_REAL_VALUE (elt)))
> -            return -1;
> -        }
> +      /* All elements in the vector must be the same.  Note that 0.0 and -0.0
> +      are distinct in this context.  */
> +      if (!const_vec_duplicate_p (op))
> +     return -1;
>  
>        if (modconst)
>          *modconst = CONST_VECTOR_ELT (op, 0);
> 

Reply via email to