This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][ARM] Handle simple SImode PLUS and MINUS operations in rtx costs


On 24/03/14 17:21, Kyrill Tkachov wrote:
> Hi all,
> 
> I noticed that we don't handle simple reg-to-reg arithmetic operations in the 
> arm rtx cost functions. We should be adding the cost of alu.arith to the costs 
> of the operands. This patch does that. Since we don't have any cost tables yet 
> that have a non-zero value for that field it shouldn't affect code-gen for any 
> current cores.
> 
> Bootstrapped and tested on arm-none-linux-gnueabihf.
> 
> Ok for next stage1?
> 
> Thanks,
> Kyrill
> 
> 2014-03-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
> 
>      * config/arm/arm.c (arm_new_rtx_costs): Handle reg-to-reg PLUS
>      and MINUS RTXs.
> 

I think the convention for big switch statements like this is to write

	* config/arm/arm.c (arm_new_rtx_costs, case PLUS, MINUS): ....

However...

> 
> rtx-costs-plus-minus.patch
> 
> 
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index bf5d1b2..3102b67 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -9428,6 +9428,14 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer_code,
>  	      *cost += rtx_cost (XEXP (x, 1), code, 1, speed_p);
>  	      return true;
>  	    }
> +	  else if (REG_P (XEXP (x, 0)))
> +	    {
> +	      *cost += rtx_cost (XEXP (x, 0), code, 0, speed_p)
> +	               + rtx_cost (XEXP (x, 1), code, 1, speed_p);
> +	      if (speed_p)
> +	        *cost += extra_cost->alu.arith;
> +	      return true;
> +	    }
>  

This still doesn't handle the case where the first operand is not a
register.  Furthermore, the only difference between this and what we had
before is that we now add alu.arith to the overall cost.  But we want to
do that anyway.

I think you really just need

	  else if (speed_p)
	    *cost += extra_cost.alu_arith;

and then let recursion (return false) handle the cost of non-register
operands (register will always cost as zero).

>  	  return false;
>  	}
> @@ -9663,6 +9671,14 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer_code,
>  	      *cost += rtx_cost (XEXP (x, 0), PLUS, 0, speed_p);
>  	      return true;
>  	    }
> +	  else if (REG_P (XEXP (x, 1)))
> +	    {
> +	      *cost += rtx_cost (XEXP (x, 0), PLUS, 0, speed_p)
> +	               + rtx_cost (XEXP (x, 1), PLUS, 1, speed_p);
> +	      if (speed_p)
> +	        *cost += extra_cost->alu.arith;
> +	      return true;
> +	    }

The same here.

>  	  return false;
>  	}
>  
> 
R.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]