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] NEON DImode not


On 29/02/12 14:48, Andrew Stubbs wrote:
> Hi all,
> 
> This patch adds support for the DImode not operation in NEON.
> 
> Currently the compiler must move the value to core registers, invert it 
> there, and move it back again. This is bonkers because the VMVN 
> instruction will do the job perfectly.
> 
> The patch adds a pattern to support VMVN in DImode (in addition to the 
> vector modes already supported) and retains the support for doing 
> bitwise not in core registers where appropriate.
> 
> OK for 4.8?
> 
> Andrew
> 
> 
> neon-not64.patch
> 
> 
> 2012-02-29  Andrew Stubbs  <ams@codesourcery.com>
> 
> 	gcc/
> 	* config/arm/arm.md (one_cmpldi2): Rename to one_cmpldi2_internal
> 	and replace with a new define_expand.
> 	(one_cmpldi2_internal): Exclude splitting for VFP registers.
> 	* config/arm/neon.md (one_cmpldi2_neon): New pattern.
> 
> ---
>  gcc/config/arm/arm.md  |   13 ++++++++++---
>  gcc/config/arm/neon.md |   14 ++++++++++++++
>  2 files changed, 24 insertions(+), 3 deletions(-)
> 
> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
> index 751997f..93fde58 100644
> --- a/gcc/config/arm/arm.md
> +++ b/gcc/config/arm/arm.md
> @@ -4206,12 +4206,19 @@
>    "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP_DOUBLE)"
>    "")
>  
> -(define_insn_and_split "one_cmpldi2"
> +(define_expand "one_cmpldi2"
> +  [(set (match_operand:DI 0 "s_register_operand" "")
> +	(not:DI (match_operand:DI 1 "s_register_operand" "")))]
> +  "TARGET_32BIT"
> +  "")
> +
> +(define_insn_and_split "*one_cmpldi2_internal"
>    [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
>  	(not:DI (match_operand:DI 1 "s_register_operand" "0,r")))]
> -  "TARGET_32BIT"
> +  "TARGET_32BIT && !TARGET_NEON"
>    "#"
> -  "TARGET_32BIT && reload_completed"
> +  "TARGET_32BIT && reload_completed
> +   && arm_general_register_operand (operands[0], DImode)"
>    [(set (match_dup 0) (not:SI (match_dup 1)))
>     (set (match_dup 2) (not:SI (match_dup 3)))]
>    "
> diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
> index d7caa37..f34d266 100644
> --- a/gcc/config/arm/neon.md
> +++ b/gcc/config/arm/neon.md
> @@ -896,6 +896,20 @@
>    [(set_attr "neon_type" "neon_int_1")]
>  )
>  
> +(define_insn "*one_cmpldi2_neon"
> +  [(set (match_operand:DI 0 "s_register_operand"	 "=w,?&r,?&r,?w")
> +        (not:DI (match_operand:DI 1 "s_register_operand" " w,  0,  r, w")))]
> +  "TARGET_NEON"
> +  "@
> +   vmvn\t%P0, %P1
> +   #
> +   #
> +   vmvn\t%P0, %P1"
> +  [(set_attr "neon_type" "neon_int_1,*,*,neon_int_1")
> +   (set_attr "arch" "nota8,*,*,onlya8")
> +   (set_attr "length" "*,8,8,*")]
> +)
> +
>  (define_insn "abs<mode>2"
>    [(set (match_operand:VDQW 0 "s_register_operand" "=w")
>  	(abs:VDQW (match_operand:VDQW 1 "s_register_operand" "w")))]


Why can't we have a single insn that deals with the have-neon and
dont-have-neon cases?

R.


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