public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Sandiford <richard.sandiford@arm.com>
To: Tamar Christina <tamar.christina@arm.com>
Cc: gcc-patches@gcc.gnu.org,  nd@arm.com,  Richard.Earnshaw@arm.com,
	 Marcus.Shawcroft@arm.com,  Kyrylo.Tkachov@arm.com
Subject: Re: [PATCH]AArch64 Rewrite simd move immediate patterns to new syntax
Date: Wed, 27 Sep 2023 11:41:47 +0100	[thread overview]
Message-ID: <mpt1qejx5hw.fsf@arm.com> (raw)
In-Reply-To: <patch-17721-tamar@arm.com> (Tamar Christina's message of "Wed, 27 Sep 2023 01:52:52 +0100")

Tamar Christina <tamar.christina@arm.com> writes:
> Hi All,
>
> This rewrites the simd MOV patterns to use the new compact syntax.
> No change in semantics is expected.  This will be needed in follow on patches.
>
> This also merges the splits into the define_insn which will also be needed soon.
>
> Bootstrapped Regtested on aarch64-none-linux-gnu and no issues.
>
> Ok for master?
>
> Thanks,
> Tamar
>
> gcc/ChangeLog:
>
> 	PR tree-optimization/109154
> 	* config/aarch64/aarch64-simd.md (*aarch64_simd_mov<VDMOV:mode>):
> 	Rewrite to new syntax.
> 	(*aarch64_simd_mov<VQMOV:mode): Rewrite to new syntax and merge in
> 	splits.
>
> --- inline copy of patch -- 
> diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md
> index e955691f1be8830efacc237465119764ce2a4942..7b4d5a37a9795fefda785aaacc246918826ed0a2 100644
> --- a/gcc/config/aarch64/aarch64-simd.md
> +++ b/gcc/config/aarch64/aarch64-simd.md
> @@ -143,54 +143,57 @@ (define_insn "aarch64_dup_lane_<vswap_width_name><mode>"
>  )
>  
>  (define_insn "*aarch64_simd_mov<VDMOV:mode>"
> -  [(set (match_operand:VDMOV 0 "nonimmediate_operand"
> -		"=w, r, m,  m, m,  w, ?r, ?w, ?r,  w,  w")
> -	(match_operand:VDMOV 1 "general_operand"
> -		"m,  m, Dz, w, r,  w,  w,  r,  r, Dn, Dz"))]
> +  [(set (match_operand:VDMOV 0 "nonimmediate_operand")
> +	(match_operand:VDMOV 1 "general_operand"))]
>    "TARGET_FLOAT
>     && (register_operand (operands[0], <MODE>mode)
>         || aarch64_simd_reg_or_zero (operands[1], <MODE>mode))"
> -  "@
> -   ldr\t%d0, %1
> -   ldr\t%x0, %1
> -   str\txzr, %0
> -   str\t%d1, %0
> -   str\t%x1, %0
> -   * return TARGET_SIMD ? \"mov\t%0.<Vbtype>, %1.<Vbtype>\" : \"fmov\t%d0, %d1\";
> -   * return TARGET_SIMD ? \"umov\t%0, %1.d[0]\" : \"fmov\t%x0, %d1\";
> -   fmov\t%d0, %1
> -   mov\t%0, %1
> -   * return aarch64_output_simd_mov_immediate (operands[1], 64);
> -   fmov\t%d0, xzr"
> -  [(set_attr "type" "neon_load1_1reg<q>, load_8, store_8, neon_store1_1reg<q>,\
> -		     store_8, neon_logic<q>, neon_to_gp<q>, f_mcr,\
> -		     mov_reg, neon_move<q>, f_mcr")
> -   (set_attr "arch" "*,*,*,*,*,*,*,*,*,simd,*")]
> -)
> -
> -(define_insn "*aarch64_simd_mov<VQMOV:mode>"
> -  [(set (match_operand:VQMOV 0 "nonimmediate_operand"
> -		"=w, Umn,  m,  w, ?r, ?w, ?r, w,  w")
> -	(match_operand:VQMOV 1 "general_operand"
> -		"m,  Dz, w,  w,  w,  r,  r, Dn, Dz"))]
> +  {@ [cons: =0, 1; attrs: type, arch]
> +     [w , m ; neon_load1_1reg<q> , *   ] ldr\t%d0, %1
> +     [r , m ; load_8             , *   ] ldr\t%x0, %1
> +     [m , Dz; store_8            , *   ] str\txzr, %0
> +     [m , w ; neon_store1_1reg<q>, *   ] str\t%d1, %0
> +     [m , r ; store_8            , *   ] str\t%x1, %0
> +     [w , w ; neon_logic<q>      , simd] mov\t%0.<Vbtype>, %1.<Vbtype>
> +     [w , w ; neon_logic<q>      , *   ] fmov\t%d0, %d1
> +     [?r, w ; neon_to_gp<q>      , simd] umov\t%0, %1.d[0]
> +     [?r, w ; neon_to_gp<q>      , *   ] fmov\t%x0, %d1
> +     [?w, r ; f_mcr              , *   ] fmov\t%d0, %1
> +     [?r, r ; mov_reg            , *   ] mov\t%0, %1
> +     [w , Dn; neon_move<q>       , simd] << aarch64_output_simd_mov_immediate (operands[1], 64);
> +     [w , Dz; f_mcr              , *   ] fmov\t%d0, xzr
> +  }
> +)
> +
> +(define_insn_and_split "*aarch64_simd_mov<VQMOV:mode>"
> +  [(set (match_operand:VQMOV 0 "nonimmediate_operand")
> +	(match_operand:VQMOV 1 "general_operand"))]
>    "TARGET_FLOAT
>     && (register_operand (operands[0], <MODE>mode)
>         || aarch64_simd_reg_or_zero (operands[1], <MODE>mode))"
> -  "@
> -   ldr\t%q0, %1
> -   stp\txzr, xzr, %0
> -   str\t%q1, %0
> -   mov\t%0.<Vbtype>, %1.<Vbtype>
> -   #
> -   #
> -   #
> -   * return aarch64_output_simd_mov_immediate (operands[1], 128);
> -   fmov\t%d0, xzr"
> -  [(set_attr "type" "neon_load1_1reg<q>, store_16, neon_store1_1reg<q>,\
> -		     neon_logic<q>, multiple, multiple,\
> -		     multiple, neon_move<q>, fmov")
> -   (set_attr "length" "4,4,4,4,8,8,8,4,4")
> -   (set_attr "arch" "*,*,*,simd,*,*,*,simd,*")]
> +  {@ [cons: =0, 1; attrs: type, arch, length]
> +     [w  , m ; neon_load1_1reg<q> , *   , 4] ldr\t%q0, %1
> +     [Umn, Dz; store_16           , *   , 4] stp\txzr, xzr, %0
> +     [m  , w ; neon_store1_1reg<q>, *   , 4] str\t%q1, %0
> +     [w  , w ; neon_logic<q>      , simd, 4] mov\t%0.<Vbtype>, %1.<Vbtype>
> +     [?r , w ; multiple           , *   , 8] #
> +     [?w , r ; multiple           , *   , 8] #
> +     [?r , r ; multiple           , *   , 8] #
> +     [w  , Dn; neon_move<q>       , simd, 4] << aarch64_output_simd_mov_immediate (operands[1], 128);
> +     [w  , Dz; fmov               , *   , 4] fmov\t%d0, xzr
> +  }
> +  "&& reload_completed
> +   && !(FP_REGNUM_P (REGNO (operands[0]))
> +	&& FP_REGNUM_P (REGNO (operands[1])))"

Won't this also trigger for the load, store, and Dn alternatives?

Looks OK otherwise.

Thanks,
Richard

> +  [(const_int 0)]
> +  {
> +    if (GP_REGNUM_P (REGNO (operands[0]))
> +	&& GP_REGNUM_P (REGNO (operands[1])))
> +      aarch64_simd_emit_reg_reg_move (operands, DImode, 2);
> +    else
> +      aarch64_split_simd_move (operands[0], operands[1]);
> +    DONE;
> +  }
>  )
>  
>  ;; When storing lane zero we can use the normal STR and its more permissive
> @@ -276,33 +279,6 @@ (define_insn "vec_store_pair<VQ:mode><VQ2:mode>"
>    [(set_attr "type" "neon_stp_q")]
>  )
>  
> -
> -(define_split
> -  [(set (match_operand:VQMOV 0 "register_operand" "")
> -	(match_operand:VQMOV 1 "register_operand" ""))]
> -  "TARGET_FLOAT
> -   && reload_completed
> -   && GP_REGNUM_P (REGNO (operands[0]))
> -   && GP_REGNUM_P (REGNO (operands[1]))"
> -  [(const_int 0)]
> -{
> -  aarch64_simd_emit_reg_reg_move (operands, DImode, 2);
> -  DONE;
> -})
> -
> -(define_split
> -  [(set (match_operand:VQMOV 0 "register_operand" "")
> -        (match_operand:VQMOV 1 "register_operand" ""))]
> -  "TARGET_FLOAT
> -   && reload_completed
> -   && ((FP_REGNUM_P (REGNO (operands[0])) && GP_REGNUM_P (REGNO (operands[1])))
> -       || (GP_REGNUM_P (REGNO (operands[0])) && FP_REGNUM_P (REGNO (operands[1]))))"
> -  [(const_int 0)]
> -{
> -  aarch64_split_simd_move (operands[0], operands[1]);
> -  DONE;
> -})
> -
>  (define_expand "@aarch64_split_simd_mov<mode>"
>    [(set (match_operand:VQMOV 0)
>  	(match_operand:VQMOV 1))]

      parent reply	other threads:[~2023-09-27 10:41 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-27  0:52 Tamar Christina
2023-09-27  1:27 ` Ramana Radhakrishnan
2023-09-27  2:40   ` Tamar Christina
2023-09-27 10:41 ` Richard Sandiford [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=mpt1qejx5hw.fsf@arm.com \
    --to=richard.sandiford@arm.com \
    --cc=Kyrylo.Tkachov@arm.com \
    --cc=Marcus.Shawcroft@arm.com \
    --cc=Richard.Earnshaw@arm.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=nd@arm.com \
    --cc=tamar.christina@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).