public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Sandiford <richard.sandiford@arm.com>
To: Evandro Menezes via Gcc-patches <gcc-patches@gcc.gnu.org>
Cc: "evandro+gcc\@gcc.gnu.org" <evandro+gcc@gcc.gnu.org>,
	 Evandro Menezes <ebahapo@icloud.com>,
	 Kyrylo Tkachov <Kyrylo.Tkachov@arm.com>,
	 Tamar Christina <Tamar.Christina@arm.com>
Subject: Re: [PATCH] aarch64: Add SVE instruction types
Date: Mon, 15 May 2023 10:00:34 +0100	[thread overview]
Message-ID: <mpt8rdq7yvh.fsf@arm.com> (raw)
In-Reply-To: <1D567E08-9EBB-4EF7-9626-BA95D8E0EB36@icloud.com> (Evandro Menezes via Gcc-patches's message of "Sat, 13 May 2023 00:08:09 +0100")

Evandro Menezes via Gcc-patches <gcc-patches@gcc.gnu.org> writes:
> This patch adds the attribute `type` to most SVE1 instructions, as in the other
> instructions.

Thanks for doing this.

Could you say what criteria you used for picking the granularity?  Other
maintainers might disagree, but personally I'd prefer to distinguish two
instructions only if:

(a) a scheduling description really needs to distinguish them or
(b) grouping them together would be very artificial (because they're
    logically unrelated)

It's always possible to split types later if new scheduling descriptions
require it.  Because of that, I don't think we should try to predict ahead
of time what future scheduling descriptions will need.

Of course, this depends on having results that show that scheduling
makes a significant difference on an SVE core.  I think one of the
problems here is that, when a different scheduling model changes the
performance of a particular test, it's difficult to tell whether
the gain/loss is caused by the model being more/less accurate than
the previous one, or if it's due to important "secondary" effects
on register live ranges.  Instinctively, I'd have expected these
secondary effects to dominate on OoO cores.

Richard

>
> --
> Evandro Menezes
>
>
>
> From be61df66d1a86bc7ec415eb23504002831c67c51 Mon Sep 17 00:00:00 2001
> From: Evandro Menezes <evandro@gcc.gnu.org>
> Date: Mon, 8 May 2023 17:39:10 -0500
> Subject: [PATCH 2/3] aarch64: Add SVE instruction types
>
> gcc/ChangeLog:
>
> 	* config/aarch64/aarch64-sve.md: Use the instruction types.
> 	* config/arm/types.md: (sve_loop_p, sve_loop_ps, sve_loop_gs,
> 	  sve_loop_end, sve_logic_p, sve_logic_ps, sve_cnt_p,
> 	  sve_cnt_pv, sve_cnt_pvx, sve_rev_p, sve_sel_p, sve_set_p,
> 	  sve_set_ps, sve_trn_p, sve_upk_p, sve_zip_p, sve_arith,
> 	  sve_arith_r, sve_arith_sat, sve_arith_sat_x, sve_arith_x,
> 	  sve_logic, sve_logic_r, sve_logic_x, sve_shift, sve_shift_d,
> 	  sve_shift_dx, sve_shift_x, sve_compare_s, sve_cnt, sve_cnt_x,
> 	  sve_copy, sve_copy_g, sve_move, sve_move_x, sve_move_g,
> 	  sve_permute, sve_splat, sve_splat_m, sve_splat_g, sve_cext,
> 	  sve_cext_x, sve_cext_g, sve_ext, sve_ext_x, sve_sext,
> 	  sve_sext_x, sve_uext, sve_uext_x, sve_index, sve_index_g,
> 	  sve_ins, sve_ins_x, sve_ins_g, sve_ins_gx, sve_rev, sve_rev_x,
> 	  sve_tbl, sve_trn, sve_upk, sve_zip, sve_int_to_fp,
> 	  sve_int_to_fp_x, sve_fp_to_int, sve_fp_to_int_x, sve_fp_to_fp,
> 	  sve_fp_to_fp_x, sve_fp_round, sve_fp_round_x, sve_bf_to_fp,
> 	  sve_bf_to_fp_x, sve_div, sve_div_x, sve_dot, sve_dot_x,
> 	  sve_mla, sve_mla_x, sve_mmla, sve_mmla_x, sve_mul, sve_mul_x,
> 	  sve_prfx, sve_fp_arith, sve_fp_arith_a, sve_fp_arith_c,
> 	  sve_fp_arith_cx, sve_fp_arith_r, sve_fp_arith_x,
> 	  sve_fp_compare, sve_fp_copy, sve_fp_move, sve_fp_move_x,
> 	  sve_fp_div_d, sve_fp_div_dx, sve_fp_div_s, sve_fp_div_sx
> 	  sve_fp_dot, sve_fp_mla, sve_fp_mla_x, sve_fp_mla_c,
> 	  sve_fp_mla_cx, sve_fp_mla_t, sve_fp_mla_tx, sve_fp_mmla,
> 	  sve_fp_mmla_x, sve_fp_mul, sve_fp_mul_x, sve_fp_sqrt_d,
> 	  sve_fp_sqrt_dx, sve_fp_sqrt_s, sve_fp_sqrt_sx, sve_fp_trig,
> 	  sve_fp_trig_x, sve_fp_estimate, sve_fp_step, sve_bf_dot,
> 	  sve_bf_dot_x, sve_bf_mla, sve_bf_mla_x, sve_bf_mmla,
> 	  sve_bf_mmla_x, sve_ldr, sve_ldr_p, sve_load1,
> 	  sve_load1_gather_d, sve_load1_gather_dl, sve_load1_gather_du,
> 	  sve_load1_gather_s, sve_load1_gather_sl, sve_load1_gather_su,
> 	  sve_load2, sve_load3, sve_load4, sve_str, sve_str_p,
> 	  sve_store1, sve_store1_scatter, sve_store2, sve_store3,
> 	  sve_store4, sve_rd_ffr, sve_rd_ffr_p, sve_rd_ffr_ps,
> 	  sve_wr_ffr): New types.
>
> Signed-off-by: Evandro Menezes <evandro@gcc.gnu.org>
> ---
>  gcc/config/aarch64/aarch64-sve.md | 632 ++++++++++++++++++++++--------
>  gcc/config/arm/types.md           | 342 ++++++++++++++++
>  2 files changed, 819 insertions(+), 155 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64-sve.md b/gcc/config/aarch64/aarch64-sve.md
> index 2898b85376b..58c5cb2ddbc 100644
> --- a/gcc/config/aarch64/aarch64-sve.md
> +++ b/gcc/config/aarch64/aarch64-sve.md
> @@ -699,6 +699,7 @@
>     str\t%1, %0
>     mov\t%0.d, %1.d
>     * return aarch64_output_sve_mov_immediate (operands[1]);"
> +  [(set_attr "type" "sve_ldr, sve_str, sve_move, *")] 
>  )
>  
>  ;; Unpredicated moves that cannot use LDR and STR, i.e. partial vectors
> @@ -714,6 +715,7 @@
>    "@
>     mov\t%0.d, %1.d
>     * return aarch64_output_sve_mov_immediate (operands[1]);"
> +  [(set_attr "type" "sve_move, sve_move_x")]
>  )
>  
>  ;; Handle memory reloads for modes that can't use LDR and STR.  We use
> @@ -758,6 +760,8 @@
>    "&& register_operand (operands[0], <MODE>mode)
>     && register_operand (operands[2], <MODE>mode)"
>    [(set (match_dup 0) (match_dup 2))]
> +  ""
> +  [(set_attr "type" "sve_load1, sve_store1, *")]
>  )
>  
>  ;; A pattern for optimizing SUBREGs that have a reinterpreting effect
> @@ -778,6 +782,7 @@
>      aarch64_split_sve_subreg_move (operands[0], operands[1], operands[2]);
>      DONE;
>    }
> +  [(set_attr "type" "sve_rev")]
>  )
>  
>  ;; Reinterpret operand 1 in operand 0's mode, without changing its contents.
> @@ -959,6 +964,7 @@
>     str\t%1, %0
>     ldr\t%0, %1
>     * return aarch64_output_sve_mov_immediate (operands[1]);"
> +  [(set_attr "type" "sve_logic_p, sve_str_p, sve_ldr_p, *")]
>  )
>  
>  ;; Match PTRUES Pn.B when both the predicate and flags are useful.
> @@ -984,6 +990,7 @@
>    {
>      operands[2] = operands[3] = CONSTM1_RTX (VNx16BImode);
>    }
> +  [(set_attr "type" "sve_set_ps")]
>  )
>  
>  ;; Match PTRUES Pn.[HSD] when both the predicate and flags are useful.
> @@ -1011,6 +1018,7 @@
>      operands[2] = CONSTM1_RTX (VNx16BImode);
>      operands[3] = CONSTM1_RTX (<MODE>mode);
>    }
> +  [(set_attr "type" "sve_set_ps")]
>  )
>  
>  ;; Match PTRUES Pn.B when only the flags result is useful (which is
> @@ -1036,6 +1044,7 @@
>    {
>      operands[2] = operands[3] = CONSTM1_RTX (VNx16BImode);
>    }
> +  [(set_attr "type" "sve_set_ps")]
>  )
>  
>  ;; Match PTRUES Pn.[HWD] when only the flags result is useful (which is
> @@ -1063,6 +1072,7 @@
>      operands[2] = CONSTM1_RTX (VNx16BImode);
>      operands[3] = CONSTM1_RTX (<MODE>mode);
>    }
> +  [(set_attr "type" "sve_set_ps")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -1086,6 +1096,7 @@
>    "@
>     setffr
>     wrffr\t%0.b"
> +  [(set_attr "type" "sve_wr_ffr, sve_wr_ffr")]
>  )
>  
>  ;; [L2 in the block comment above about FFR handling]
> @@ -1125,6 +1136,7 @@
>  	(reg:VNx16BI FFRT_REGNUM))]
>    "TARGET_SVE"
>    "rdffr\t%0.b"
> +  [(set_attr "type" "sve_rd_ffr")]
>  )
>  
>  ;; Likewise with zero predication.
> @@ -1135,6 +1147,7 @@
>  	  (match_operand:VNx16BI 1 "register_operand" "Upa")))]
>    "TARGET_SVE"
>    "rdffr\t%0.b, %1/z"
> +  [(set_attr "type" "sve_rd_ffr_p")]
>  )
>  
>  ;; Read the FFR to test for a fault, without using the predicate result.
> @@ -1151,6 +1164,7 @@
>     (clobber (match_scratch:VNx16BI 0 "=Upa"))]
>    "TARGET_SVE"
>    "rdffrs\t%0.b, %1/z"
> +  [(set_attr "type" "sve_rd_ffr_ps")]
>  )
>  
>  ;; Same for unpredicated RDFFR when tested with a known PTRUE.
> @@ -1165,6 +1179,7 @@
>     (clobber (match_scratch:VNx16BI 0 "=Upa"))]
>    "TARGET_SVE"
>    "rdffrs\t%0.b, %1/z"
> +  [(set_attr "type" "sve_rd_ffr_ps")]
>  )
>  
>  ;; Read the FFR with zero predication and test the result.
> @@ -1184,6 +1199,7 @@
>  	  (match_dup 1)))]
>    "TARGET_SVE"
>    "rdffrs\t%0.b, %1/z"
> +  [(set_attr "type" "sve_rd_ffr_ps")]
>  )
>  
>  ;; Same for unpredicated RDFFR when tested with a known PTRUE.
> @@ -1199,6 +1215,7 @@
>  	(reg:VNx16BI FFRT_REGNUM))]
>    "TARGET_SVE"
>    "rdffrs\t%0.b, %1/z"
> +  [(set_attr "type" "sve_rd_ffr_ps")]
>  )
>  
>  ;; [R3 in the block comment above about FFR handling]
> @@ -1248,6 +1265,7 @@
>  	  UNSPEC_LD1_SVE))]
>    "TARGET_SVE"
>    "ld1<Vesize>\t%0.<Vctype>, %2/z, %1"
> +  [(set_attr "type" "sve_load1")]
>  )
>  
>  ;; Unpredicated LD[234].
> @@ -1272,6 +1290,7 @@
>  	  UNSPEC_LDN))]
>    "TARGET_SVE"
>    "ld<vector_count><Vesize>\t%0, %2/z, %1"
> +  [(set_attr "type" "sve_load<vector_count>")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -1303,6 +1322,7 @@
>    {
>      operands[3] = CONSTM1_RTX (<SVE_HSDI:VPRED>mode);
>    }
> +  [(set_attr "type" "sve_load1")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -1329,6 +1349,7 @@
>  	  SVE_LDFF1_LDNF1))]
>    "TARGET_SVE"
>    "ld<fn>f1<Vesize>\t%0.<Vetype>, %2/z, %1"
> +  [(set_attr "type" "sve_load1")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -1367,6 +1388,7 @@
>    {
>      operands[3] = CONSTM1_RTX (<SVE_HSDI:VPRED>mode);
>    }
> +  [(set_attr "type" "sve_load1")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -1388,6 +1410,7 @@
>  	  UNSPEC_LDNT1_SVE))]
>    "TARGET_SVE"
>    "ldnt1<Vesize>\t%0.<Vetype>, %2/z, %1"
> +  [(set_attr "type" "sve_load1")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -1435,6 +1458,8 @@
>     ld1<Vesize>\t%0.s, %5/z, [%1, %2.s, uxtw]
>     ld1<Vesize>\t%0.s, %5/z, [%1, %2.s, sxtw %p4]
>     ld1<Vesize>\t%0.s, %5/z, [%1, %2.s, uxtw %p4]"
> +  [(set_attr "type" "sve_load1_gather_s, sve_load1_gather_s, sve_load1_gather_su,
> +                     sve_load1_gather_su, sve_load1_gather_sl, sve_load1_gather_sl")]
>  )
>  
>  ;; Predicated gather loads for 64-bit elements.  The value of operand 3
> @@ -1455,6 +1480,8 @@
>     ld1<Vesize>\t%0.d, %5/z, [%2.d, #%1]
>     ld1<Vesize>\t%0.d, %5/z, [%1, %2.d]
>     ld1<Vesize>\t%0.d, %5/z, [%1, %2.d, lsl %p4]"
> +  [(set_attr "type" "sve_load1_gather_d, sve_load1_gather_d,
> +                     sve_load1_gather_du, sve_load1_gather_dl")]
>  )
>  
>  ;; Likewise, but with the offset being extended from 32 bits.
> @@ -1480,6 +1507,7 @@
>    {
>      operands[6] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; Likewise, but with the offset being truncated to 32 bits and then
> @@ -1507,6 +1535,7 @@
>    {
>      operands[6] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; Likewise, but with the offset being truncated to 32 bits and then
> @@ -1527,6 +1556,7 @@
>    "@
>     ld1<Vesize>\t%0.d, %5/z, [%1, %2.d, uxtw]
>     ld1<Vesize>\t%0.d, %5/z, [%1, %2.d, uxtw %p4]"
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -1569,6 +1599,8 @@
>    {
>      operands[6] = CONSTM1_RTX (VNx4BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_s, sve_load1_gather_s, sve_load1_gather_su,
> +                     sve_load1_gather_su, sve_load1_gather_sl, sve_load1_gather_sl")]
>  )
>  
>  ;; Predicated extending gather loads for 64-bit elements.  The value of
> @@ -1597,6 +1629,8 @@
>    {
>      operands[6] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_d, sve_load1_gather_d,
> +                     sve_load1_gather_du, sve_load1_gather_dl")]
>  )
>  
>  ;; Likewise, but with the offset being extended from 32 bits.
> @@ -1627,6 +1661,7 @@
>      operands[6] = CONSTM1_RTX (VNx2BImode);
>      operands[7] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; Likewise, but with the offset being truncated to 32 bits and then
> @@ -1659,6 +1694,7 @@
>      operands[6] = CONSTM1_RTX (VNx2BImode);
>      operands[7] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; Likewise, but with the offset being truncated to 32 bits and then
> @@ -1687,6 +1723,7 @@
>    {
>      operands[7] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -1718,6 +1755,8 @@
>     ldff1w\t%0.s, %5/z, [%1, %2.s, uxtw]
>     ldff1w\t%0.s, %5/z, [%1, %2.s, sxtw %p4]
>     ldff1w\t%0.s, %5/z, [%1, %2.s, uxtw %p4]"
> +  [(set_attr "type" "sve_load1_gather_s, sve_load1_gather_s, sve_load1_gather_su,
> +                     sve_load1_gather_su, sve_load1_gather_sl, sve_load1_gather_sl")]
>  )
>  
>  ;; Predicated first-faulting gather loads for 64-bit elements.  The value
> @@ -1739,6 +1778,8 @@
>     ldff1d\t%0.d, %5/z, [%2.d, #%1]
>     ldff1d\t%0.d, %5/z, [%1, %2.d]
>     ldff1d\t%0.d, %5/z, [%1, %2.d, lsl %p4]"
> +  [(set_attr "type" "sve_load1_gather_d, sve_load1_gather_d,
> +                     sve_load1_gather_du, sve_load1_gather_dl")]
>  )
>  
>  ;; Likewise, but with the offset being sign-extended from 32 bits.
> @@ -1766,6 +1807,7 @@
>    {
>      operands[6] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; Likewise, but with the offset being zero-extended from 32 bits.
> @@ -1786,6 +1828,7 @@
>    "@
>     ldff1d\t%0.d, %5/z, [%1, %2.d, uxtw]
>     ldff1d\t%0.d, %5/z, [%1, %2.d, uxtw %p4]"
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -1829,6 +1872,8 @@
>    {
>      operands[6] = CONSTM1_RTX (VNx4BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_s, sve_load1_gather_s, sve_load1_gather_su,
> +                     sve_load1_gather_su, sve_load1_gather_sl, sve_load1_gather_sl")]
>  )
>  
>  ;; Predicated extending first-faulting gather loads for 64-bit elements.
> @@ -1858,6 +1903,8 @@
>    {
>      operands[6] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_d, sve_load1_gather_d,
> +                     sve_load1_gather_du, sve_load1_gather_dl")]
>  )
>  
>  ;; Likewise, but with the offset being sign-extended from 32 bits.
> @@ -1890,6 +1937,7 @@
>      operands[6] = CONSTM1_RTX (VNx2BImode);
>      operands[7] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; Likewise, but with the offset being zero-extended from 32 bits.
> @@ -1918,6 +1966,7 @@
>    {
>      operands[7] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; =========================================================================
> @@ -1950,6 +1999,7 @@
>      operands[1] = gen_rtx_MEM (<MODE>mode, operands[1]);
>      return aarch64_output_sve_prefetch ("prf<Vesize>", operands[2], "%0, %1");
>    }
> +  [(set_attr "type" "sve_ldr")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -1998,6 +2048,8 @@
>      const char *const *parts = insns[which_alternative];
>      return aarch64_output_sve_prefetch (parts[0], operands[6], parts[1]);
>    }
> +  [(set_attr "type" "sve_load1_gather_s, sve_load1_gather_s, sve_load1_gather_su,
> +                     sve_load1_gather_su, sve_load1_gather_sl, sve_load1_gather_sl")]
>  )
>  
>  ;; Predicated gather prefetches for 64-bit elements.  The value of operand 3
> @@ -2025,6 +2077,8 @@
>      const char *const *parts = insns[which_alternative];
>      return aarch64_output_sve_prefetch (parts[0], operands[6], parts[1]);
>    }
> +  [(set_attr "type" "sve_load1_gather_d, sve_load1_gather_d,
> +                     sve_load1_gather_du, sve_load1_gather_dl")]
>  )
>  
>  ;; Likewise, but with the offset being sign-extended from 32 bits.
> @@ -2058,6 +2112,7 @@
>    {
>      operands[9] = copy_rtx (operands[0]);
>    }
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; Likewise, but with the offset being zero-extended from 32 bits.
> @@ -2084,6 +2139,7 @@
>      const char *const *parts = insns[which_alternative];
>      return aarch64_output_sve_prefetch (parts[0], operands[6], parts[1]);
>    }
> +  [(set_attr "type" "sve_load1_gather_su, sve_load1_gather_sl")]
>  )
>  
>  ;; =========================================================================
> @@ -2122,6 +2178,7 @@
>  	  UNSPEC_ST1_SVE))]
>    "TARGET_SVE"
>    "st1<Vesize>\t%1.<Vctype>, %2, %0"
> +  [(set_attr "type" "sve_store1")]
>  )
>  
>  ;; Unpredicated ST[234].  This is always a full update, so the dependence
> @@ -2152,6 +2209,7 @@
>  	  UNSPEC_STN))]
>    "TARGET_SVE"
>    "st<vector_count><Vesize>\t%1, %2, %0"
> +  [(set_attr "type" "sve_store<vector_count>")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -2174,6 +2232,7 @@
>  	  UNSPEC_ST1_SVE))]
>    "TARGET_SVE"
>    "st1<VNx8_NARROW:Vesize>\t%1.<VNx8_WIDE:Vetype>, %2, %0"
> +  [(set_attr "type" "sve_store1")]
>  )
>  
>  ;; Predicated truncate and store, with 4 elements per 128-bit block.
> @@ -2187,6 +2246,7 @@
>  	  UNSPEC_ST1_SVE))]
>    "TARGET_SVE"
>    "st1<VNx4_NARROW:Vesize>\t%1.<VNx4_WIDE:Vetype>, %2, %0"
> +  [(set_attr "type" "sve_store1")]
>  )
>  
>  ;; Predicated truncate and store, with 2 elements per 128-bit block.
> @@ -2200,6 +2260,7 @@
>  	  UNSPEC_ST1_SVE))]
>    "TARGET_SVE"
>    "st1<VNx2_NARROW:Vesize>\t%1.<VNx2_WIDE:Vetype>, %2, %0"
> +  [(set_attr "type" "sve_store1")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -2221,6 +2282,7 @@
>  	  UNSPEC_STNT1_SVE))]
>    "TARGET_SVE"
>    "stnt1<Vesize>\t%1.<Vetype>, %2, %0"
> +  [(set_attr "type" "sve_store1")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -2268,6 +2330,8 @@
>     st1<Vesize>\t%4.s, %5, [%0, %1.s, uxtw]
>     st1<Vesize>\t%4.s, %5, [%0, %1.s, sxtw %p3]
>     st1<Vesize>\t%4.s, %5, [%0, %1.s, uxtw %p3]"
> +  [(set_attr "type" "sve_store1_scatter, sve_store1_scatter, sve_store1_scatter,
> +                     sve_store1_scatter, sve_store1_scatter, sve_store1_scatter")]
>  )
>  
>  ;; Predicated scatter stores for 64-bit elements.  The value of operand 2
> @@ -2288,6 +2352,8 @@
>     st1<Vesize>\t%4.d, %5, [%1.d, #%0]
>     st1<Vesize>\t%4.d, %5, [%0, %1.d]
>     st1<Vesize>\t%4.d, %5, [%0, %1.d, lsl %p3]"
> +  [(set_attr "type" "sve_store1_scatter, sve_store1_scatter,
> +                     sve_store1_scatter, sve_store1_scatter")]
>  )
>  
>  ;; Likewise, but with the offset being extended from 32 bits.
> @@ -2313,6 +2379,7 @@
>    {
>      operands[6] = CONSTM1_RTX (<VPRED>mode);
>    }
> +  [(set_attr "type" "sve_store1_scatter, sve_store1_scatter")]
>  )
>  
>  ;; Likewise, but with the offset being truncated to 32 bits and then
> @@ -2340,6 +2407,7 @@
>    {
>      operands[6] = CONSTM1_RTX (<VPRED>mode);
>    }
> +  [(set_attr "type" "sve_store1_scatter, sve_store1_scatter")]
>  )
>  
>  ;; Likewise, but with the offset being truncated to 32 bits and then
> @@ -2360,6 +2428,7 @@
>    "@
>     st1<Vesize>\t%4.d, %5, [%0, %1.d, uxtw]
>     st1<Vesize>\t%4.d, %5, [%0, %1.d, uxtw %p3]"
> +  [(set_attr "type" "sve_store1_scatter, sve_store1_scatter")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -2392,6 +2461,8 @@
>     st1<VNx4_NARROW:Vesize>\t%4.s, %5, [%0, %1.s, uxtw]
>     st1<VNx4_NARROW:Vesize>\t%4.s, %5, [%0, %1.s, sxtw %p3]
>     st1<VNx4_NARROW:Vesize>\t%4.s, %5, [%0, %1.s, uxtw %p3]"
> +  [(set_attr "type" "sve_store1_scatter, sve_store1_scatter, sve_store1_scatter,
> +                     sve_store1_scatter, sve_store1_scatter, sve_store1_scatter")]
>  )
>  
>  ;; Predicated truncating scatter stores for 64-bit elements.  The value of
> @@ -2413,6 +2484,8 @@
>     st1<VNx2_NARROW:Vesize>\t%4.d, %5, [%1.d, #%0]
>     st1<VNx2_NARROW:Vesize>\t%4.d, %5, [%0, %1.d]
>     st1<VNx2_NARROW:Vesize>\t%4.d, %5, [%0, %1.d, lsl %p3]"
> +  [(set_attr "type" "sve_store1_scatter, sve_store1_scatter,
> +                     sve_store1_scatter, sve_store1_scatter")]
>  )
>  
>  ;; Likewise, but with the offset being sign-extended from 32 bits.
> @@ -2440,6 +2513,7 @@
>    {
>      operands[6] = copy_rtx (operands[5]);
>    }
> +  [(set_attr "type" "sve_store1_scatter, sve_store1_scatter")]
>  )
>  
>  ;; Likewise, but with the offset being zero-extended from 32 bits.
> @@ -2460,6 +2534,7 @@
>    "@
>     st1<VNx2_NARROW:Vesize>\t%4.d, %5, [%0, %1.d, uxtw]
>     st1<VNx2_NARROW:Vesize>\t%4.d, %5, [%0, %1.d, uxtw %p3]"
> +  [(set_attr "type" "sve_store1_scatter, sve_store1_scatter")]
>  )
>  
>  ;; =========================================================================
> @@ -2529,7 +2604,8 @@
>  				   CONST0_RTX (<MODE>mode)));
>      DONE;
>    }
> -  [(set_attr "length" "4,4,8")]
> +  [(set_attr "length" "4,4,8")
> +   (set_attr "type" "sve_move, sve_move, sve_load1")]
>  )
>  
>  ;; Duplicate an Advanced SIMD vector to fill an SVE vector (LE version).
> @@ -2562,6 +2638,7 @@
>      emit_insn (gen_aarch64_sve_ld1rq<mode> (operands[0], operands[1], gp));
>      DONE;
>    }
> +  [(set_attr "type" "sve_splat, sve_load1")]
>  )
>  
>  ;; Duplicate an Advanced SIMD vector to fill an SVE vector (BE version).
> @@ -2583,6 +2660,7 @@
>      operands[1] = gen_rtx_REG (<MODE>mode, REGNO (operands[1]));
>      return "dup\t%0.q, %1.q[0]";
>    }
> +  [(set_attr "type" "sve_splat")]
>  )
>  
>  ;; This is used for vec_duplicate<mode>s from memory, but can also
> @@ -2598,6 +2676,7 @@
>  	  UNSPEC_SEL))]
>    "TARGET_SVE"
>    "ld1r<Vesize>\t%0.<Vetype>, %1/z, %2"
> +  [(set_attr "type" "sve_load1")]
>  )
>  
>  ;; Load 128 bits from memory under predicate control and duplicate to
> @@ -2613,6 +2692,7 @@
>      operands[1] = gen_rtx_MEM (<VEL>mode, XEXP (operands[1], 0));
>      return "ld1rq<Vesize>\t%0.<Vetype>, %2/z, %1";
>    }
> +  [(set_attr "type" "sve_load1")]
>  )
>  
>  (define_insn "@aarch64_sve_ld1ro<mode>"
> @@ -2627,6 +2707,7 @@
>      operands[1] = gen_rtx_MEM (<VEL>mode, XEXP (operands[1], 0));
>      return "ld1ro<Vesize>\t%0.<Vetype>, %2/z, %1";
>    }
> +  [(set_attr "type" "sve_load1")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -2659,7 +2740,8 @@
>     insr\t%0.<Vetype>, %<Vetype>2
>     movprfx\t%0, %1\;insr\t%0.<Vetype>, %<vwcore>2
>     movprfx\t%0, %1\;insr\t%0.<Vetype>, %<Vetype>2"
> -  [(set_attr "movprfx" "*,*,yes,yes")]
> +  [(set_attr "movprfx" "*,*,yes,yes")
> +   (set_attr "type" "sve_ins_g, sve_ins, sve_ins_gx, sve_ins_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -2679,6 +2761,7 @@
>     index\t%0.<Vctype>, #%1, %<vccore>2
>     index\t%0.<Vctype>, %<vccore>1, #%2
>     index\t%0.<Vctype>, %<vccore>1, %<vccore>2"
> +  [(set_attr "type" "sve_index_g, sve_index_g, sve_index_g")]
>  )
>  
>  ;; Optimize {x, x, x, x, ...} + {0, n, 2*n, 3*n, ...} if n is in range
> @@ -2694,6 +2777,7 @@
>      operands[2] = aarch64_check_zero_based_sve_index_immediate (operands[2]);
>      return "index\t%0.<Vctype>, %<vccore>1, #%2";
>    }
> +  [(set_attr "type" "sve_index_g")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -2846,6 +2930,7 @@
>      operands[0] = gen_rtx_REG (<MODE>mode, REGNO (operands[0]));
>      return "dup\t%0.<Vetype>, %1.<Vetype>[%2]";
>    }
> +  [(set_attr "type" "sve_splat")]
>  )
>  
>  ;; Extract an element outside the range of DUP.  This pattern requires the
> @@ -2863,7 +2948,8 @@
>  	    ? "ext\t%0.b, %0.b, %0.b, #%2"
>  	    : "movprfx\t%0, %1\;ext\t%0.b, %0.b, %1.b, #%2");
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_ext, sve_ext_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -2886,6 +2972,7 @@
>    "@
>     last<ab>\t%<vwcore>0, %1, %2.<Vetype>
>     last<ab>\t%<Vetype>0, %1, %2.<Vetype>"
> +  [(set_attr "type" "sve_ins_g, sve_ins")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -2955,7 +3042,8 @@
>    "@
>     <sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
>     movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_arith, sve_arith_x")]
>  )
>  
>  ;; Predicated integer unary arithmetic with merging.
> @@ -2983,7 +3071,8 @@
>    "@
>     <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>
>     movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_arith, sve_arith_x")]
>  )
>  
>  ;; Predicated integer unary arithmetic, merging with an independent value.
> @@ -3006,7 +3095,8 @@
>     <sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
>     movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
>     movprfx\t%0, %3\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_arith, sve_arith_x, sve_arith_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -3032,7 +3122,8 @@
>    "@
>     <sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
>     movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_rev, sve_rev_x")]
>  )
>  
>  ;; Another way of expressing the REVB, REVH and REVW patterns, with this
> @@ -3051,7 +3142,8 @@
>    "@
>     rev<SVE_ALL:Vcwtype>\t%0.<PRED_HSD:Vetype>, %1/m, %2.<PRED_HSD:Vetype>
>     movprfx\t%0, %2\;rev<SVE_ALL:Vcwtype>\t%0.<PRED_HSD:Vetype>, %1/m, %2.<PRED_HSD:Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_rev, sve_rev")]
>  )
>  
>  ;; Predicated integer unary operations with merging.
> @@ -3069,7 +3161,8 @@
>     <sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
>     movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
>     movprfx\t%0, %3\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_rev, sve_rev_x, sve_rev_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -3110,7 +3203,8 @@
>    "@
>     <su>xt<SVE_PARTIAL_I:Vesize>\t%0.<SVE_HSDI:Vetype>, %1/m, %2.<SVE_HSDI:Vetype>
>     movprfx\t%0, %2\;<su>xt<SVE_PARTIAL_I:Vesize>\t%0.<SVE_HSDI:Vetype>, %1/m, %2.<SVE_HSDI:Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_<su>ext, sve_<su>ext_x")]
>  )
>  
>  ;; Predicated truncate-and-sign-extend operations.
> @@ -3127,7 +3221,8 @@
>    "@
>     sxt<SVE_PARTIAL_I:Vesize>\t%0.<SVE_FULL_HSDI:Vetype>, %1/m, %2.<SVE_FULL_HSDI:Vetype>
>     movprfx\t%0, %2\;sxt<SVE_PARTIAL_I:Vesize>\t%0.<SVE_FULL_HSDI:Vetype>, %1/m, %2.<SVE_FULL_HSDI:Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_sext, sve_sext_x")]
>  )
>  
>  ;; Predicated truncate-and-sign-extend operations with merging.
> @@ -3146,7 +3241,8 @@
>     sxt<SVE_PARTIAL_I:Vesize>\t%0.<SVE_FULL_HSDI:Vetype>, %1/m, %2.<SVE_FULL_HSDI:Vetype>
>     movprfx\t%0.<SVE_FULL_HSDI:Vetype>, %1/z, %2.<SVE_FULL_HSDI:Vetype>\;sxt<SVE_PARTIAL_I:Vesize>\t%0.<SVE_FULL_HSDI:Vetype>, %1/m, %2.<SVE_FULL_HSDI:Vetype>
>     movprfx\t%0, %3\;sxt<SVE_PARTIAL_I:Vesize>\t%0.<SVE_FULL_HSDI:Vetype>, %1/m, %2.<SVE_FULL_HSDI:Vetype>"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_sext, sve_sext_x, sve_sext_x")]
>  )
>  
>  ;; Predicated truncate-and-zero-extend operations, merging with the
> @@ -3167,7 +3263,8 @@
>    "@
>     uxt%e3\t%0.<Vetype>, %1/m, %0.<Vetype>
>     movprfx\t%0, %2\;uxt%e3\t%0.<Vetype>, %1/m, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_uext, sve_sext_x")]
>  )
>  
>  ;; Predicated truncate-and-zero-extend operations, merging with an
> @@ -3192,7 +3289,8 @@
>     uxt%e3\t%0.<Vetype>, %1/m, %2.<Vetype>
>     movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;uxt%e3\t%0.<Vetype>, %1/m, %2.<Vetype>
>     movprfx\t%0, %4\;uxt%e3\t%0.<Vetype>, %1/m, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_uext, sve_sext_x, sve_sext_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -3263,7 +3361,8 @@
>    "@
>     cnot\t%0.<Vetype>, %1/m, %2.<Vetype>
>     movprfx\t%0, %2\;cnot\t%0.<Vetype>, %1/m, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_logic, sve_logic_x")]
>  )
>  
>  ;; Predicated logical inverse with merging.
> @@ -3319,7 +3418,8 @@
>    {
>      operands[5] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_logic, sve_logic_x")]
>  )
>  
>  ;; Predicated logical inverse, merging with an independent value.
> @@ -3356,7 +3456,8 @@
>    {
>      operands[5] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_logic, sve_logic_x, sve_logic_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -3374,6 +3475,7 @@
>  	  SVE_FP_UNARY_INT))]
>    "TARGET_SVE"
>    "<sve_fp_op>\t%0.<Vetype>, %1.<Vetype>"
> +  [(set_attr "type" "sve_fp_trig")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -3617,6 +3719,7 @@
>  	  (match_operand:PRED_ALL 1 "register_operand" "Upa")))]
>    "TARGET_SVE"
>    "not\t%0.b, %1/z, %2.b"
> +  [(set_attr "type" "sve_logic_p")]
>  )
>  
>  ;; =========================================================================
> @@ -3820,7 +3923,9 @@
>     movprfx\t%0, %1\;add\t%0.<Vetype>, %0.<Vetype>, #%D2
>     movprfx\t%0, %1\;sub\t%0.<Vetype>, %0.<Vetype>, #%N2
>     add\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,*,*,yes,yes,*")]
> +  [(set_attr "movprfx" "*,*,*,yes,yes,*")
> +   (set_attr "type" "sve_arith, sve_arith, sve_cnt_p,
> +                     sve_arith_x, sve_arith_x, sve_arith")]
>  )
>  
>  ;; Merging forms are handled through SVE_INT_BINARY.
> @@ -3843,7 +3948,8 @@
>     sub\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>
>     subr\t%0.<Vetype>, %0.<Vetype>, #%D1
>     movprfx\t%0, %2\;subr\t%0.<Vetype>, %0.<Vetype>, #%D1"
> -  [(set_attr "movprfx" "*,*,yes")]
> +  [(set_attr "movprfx" "*,*,yes")
> +   (set_attr "type" "sve_arith, sve_arith, sve_arith_x")]
>  )
>  
>  ;; Merging forms are handled through SVE_INT_BINARY.
> @@ -3865,6 +3971,7 @@
>  	  UNSPEC_ADR))]
>    "TARGET_SVE"
>    "adr\t%0.<Vetype>, [%1.<Vetype>, %2.<Vetype>]"
> +  [(set_attr "type" "sve_arith")]
>  )
>  
>  ;; Same, but with the offset being sign-extended from the low 32 bits.
> @@ -3885,6 +3992,7 @@
>    {
>      operands[3] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_arith")]
>  )
>  
>  ;; Same, but with the offset being zero-extended from the low 32 bits.
> @@ -3898,6 +4006,7 @@
>  	  UNSPEC_ADR))]
>    "TARGET_SVE"
>    "adr\t%0.d, [%1.d, %2.d, uxtw]"
> +  [(set_attr "type" "sve_arith")]
>  )
>  
>  ;; Same, matching as a PLUS rather than unspec.
> @@ -3910,6 +4019,7 @@
>  	  (match_operand:VNx2DI 1 "register_operand" "w")))]
>    "TARGET_SVE"
>    "adr\t%0.d, [%1.d, %2.d, uxtw]"
> +  [(set_attr "type" "sve_arith")]
>  )
>  
>  ;; ADR with a nonzero shift.
> @@ -3945,6 +4055,7 @@
>    {
>      operands[4] = CONSTM1_RTX (<VPRED>mode);
>    }
> +  [(set_attr "type" "sve_arith")]
>  )
>  
>  ;; Same, but with the index being sign-extended from the low 32 bits.
> @@ -3969,6 +4080,7 @@
>    {
>      operands[5] = operands[4] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_arith")]
>  )
>  
>  ;; Same, but with the index being zero-extended from the low 32 bits.
> @@ -3990,6 +4102,7 @@
>    {
>      operands[5] = CONSTM1_RTX (VNx2BImode);
>    }
> +  [(set_attr "type" "sve_arith")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -4035,7 +4148,8 @@
>    "@
>     <su>abd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;<su>abd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_arith, sve_arith_x")]
>  )
>  
>  (define_expand "@aarch64_cond_<su>abd<mode>"
> @@ -4091,7 +4205,8 @@
>    {
>      operands[4] = operands[5] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_arith, sve_arith_x")]
>  )
>  
>  ;; Predicated integer absolute difference, merging with the second input.
> @@ -4122,7 +4237,8 @@
>    {
>      operands[4] = operands[5] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_arith, sve_arith_x")]
>  )
>  
>  ;; Predicated integer absolute difference, merging with an independent value.
> @@ -4169,7 +4285,8 @@
>      else
>        FAIL;
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_arith_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -4194,7 +4311,8 @@
>     movprfx\t%0, %1\;<binqops_op>\t%0.<Vetype>, %0.<Vetype>, #%D2
>     movprfx\t%0, %1\;<binqops_op_rev>\t%0.<Vetype>, %0.<Vetype>, #%N2
>     <binqops_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,*,yes,yes,*")]
> +  [(set_attr "movprfx" "*,*,yes,yes,*")
> +   (set_attr "type" "sve_arith_sat, sve_arith_sat, sve_arith_sat_x, sve_arith_sat_x, sve_arith_sat")]
>  )
>  
>  ;; Unpredicated saturating unsigned addition and subtraction.
> @@ -4208,7 +4326,8 @@
>     <binqops_op>\t%0.<Vetype>, %0.<Vetype>, #%D2
>     movprfx\t%0, %1\;<binqops_op>\t%0.<Vetype>, %0.<Vetype>, #%D2
>     <binqops_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes,*")]
> +  [(set_attr "movprfx" "*,yes,*")
> +   (set_attr "type" "sve_arith_sat, sve_arith_sat_x, sve_arith_sat")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -4249,7 +4368,8 @@
>    "@
>     <su>mulh\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;<su>mulh\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_mul, sve_mul_x")]
>  )
>  
>  ;; Predicated highpart multiplications with merging.
> @@ -4286,7 +4406,9 @@
>    "@
>     <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")])
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_mul, sve_mul_x")]
> +)
>  
>  ;; Predicated highpart multiplications, merging with zero.
>  (define_insn "*cond_<optab><mode>_z"
> @@ -4303,7 +4425,9 @@
>    "@
>     movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "yes")])
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_mul_x")]
> +)
>  
>  ;; -------------------------------------------------------------------------
>  ;; ---- [INT] Division
> @@ -4344,7 +4468,8 @@
>     <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     <sve_int_op>r\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
>     movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,*,yes")]
> +  [(set_attr "movprfx" "*,*,yes")
> +   (set_attr "type" "sve_div, sve_div, sve_div_x")]
>  )
>  
>  ;; Predicated integer division with merging.
> @@ -4374,7 +4499,8 @@
>    "@
>     <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_div, sve_div_x")]
>  )
>  
>  ;; Predicated integer division, merging with the second input.
> @@ -4391,7 +4517,8 @@
>    "@
>     <sve_int_op_rev>\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
>     movprfx\t%0, %3\;<sve_int_op_rev>\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_div, sve_div_x")]
>  )
>  
>  ;; Predicated integer division, merging with an independent value.
> @@ -4421,7 +4548,8 @@
>  					     operands[4], operands[1]));
>      operands[4] = operands[2] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_div_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -4444,7 +4572,8 @@
>     <logical>\t%0.<Vetype>, %0.<Vetype>, #%C2
>     movprfx\t%0, %1\;<logical>\t%0.<Vetype>, %0.<Vetype>, #%C2
>     <logical>\t%0.d, %1.d, %2.d"
> -  [(set_attr "movprfx" "*,yes,*")]
> +  [(set_attr "movprfx" "*,yes,*")
> +   (set_attr "type" "sve_logic, sve_logic_x, sve_logic")]
>  )
>  
>  ;; Merging forms are handled through SVE_INT_BINARY.
> @@ -4487,6 +4616,7 @@
>    {
>      operands[3] = CONSTM1_RTX (<VPRED>mode);
>    }
> +  [(set_attr "type" "sve_logic")]
>  )
>  
>  ;; Predicated BIC with merging.
> @@ -4517,7 +4647,8 @@
>    "@
>     bic\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;bic\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_logic, sve_logic_x")]
>  )
>  
>  ;; Predicated integer BIC, merging with an independent value.
> @@ -4545,7 +4676,8 @@
>  					     operands[4], operands[1]));
>      operands[4] = operands[2] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_logic_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -4623,7 +4755,8 @@
>     && !register_operand (operands[3], <MODE>mode)"
>    [(set (match_dup 0) (ASHIFT:SVE_I (match_dup 2) (match_dup 3)))]
>    ""
> -  [(set_attr "movprfx" "*,*,*,yes")]
> +  [(set_attr "movprfx" "*,*,*,yes")
> +   (set_attr "type" "sve_shift, sve_shift, sve_shift, sve_shift_x")]
>  )
>  
>  ;; Unpredicated shift operations by a constant (post-RA only).
> @@ -4636,6 +4769,7 @@
>  	  (match_operand:SVE_I 2 "aarch64_simd_<lr>shift_imm")))]
>    "TARGET_SVE && reload_completed"
>    "<shift>\t%0.<Vetype>, %1.<Vetype>, #%2"
> +  [(set_attr "type" "sve_shift")]
>  )
>  
>  ;; Predicated integer shift, merging with the first input.
> @@ -4652,7 +4786,8 @@
>    "@
>     <shift>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
>     movprfx\t%0, %2\;<shift>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_shift, sve_shift_x")]
>  )
>  
>  ;; Predicated integer shift, merging with an independent value.
> @@ -4678,7 +4813,8 @@
>  					     operands[4], operands[1]));
>      operands[4] = operands[2] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_shift_x")]
>  )
>  
>  ;; Unpredicated shifts of narrow elements by 64-bit amounts.
> @@ -4690,6 +4826,7 @@
>  	  SVE_SHIFT_WIDE))]
>    "TARGET_SVE"
>    "<sve_int_op>\t%0.<Vetype>, %1.<Vetype>, %2.d"
> +  [(set_attr "type" "sve_shift")]
>  )
>  
>  ;; Merging predicated shifts of narrow elements by 64-bit amounts.
> @@ -4722,7 +4859,9 @@
>    "@
>     <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.d
>     movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.d"
> -  [(set_attr "movprfx" "*, yes")])
> +  [(set_attr "movprfx" "*, yes")
> +   (set_attr "type" "sve_shift, sve_shift_x")]
> +)
>  
>  ;; Predicated shifts of narrow elements by 64-bit amounts, merging with zero.
>  (define_insn "*cond_<sve_int_op><mode>_z"
> @@ -4739,7 +4878,9 @@
>    "@
>     movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.d
>     movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.d"
> -  [(set_attr "movprfx" "yes")])
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_shift_x")]
> +)
>  
>  ;; -------------------------------------------------------------------------
>  ;; ---- [INT] Shifts (rounding towards 0)
> @@ -4781,7 +4922,9 @@
>    "@
>     asrd\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
>     movprfx\t%0, %2\;asrd\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3"
> -  [(set_attr "movprfx" "*,yes")])
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_shift_d, sve_shift_dx")]
> +)
>  
>  ;; Predicated shift with merging.
>  (define_expand "@cond_<sve_int_op><mode>"
> @@ -4825,7 +4968,9 @@
>    {
>      operands[4] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes")])
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_shift, sve_shift_x")]
> +)
>  
>  ;; Predicated shift, merging with an independent value.
>  (define_insn_and_rewrite "*cond_<sve_int_op><mode>_any"
> @@ -4854,7 +4999,8 @@
>  					     operands[4], operands[1]));
>      operands[4] = operands[2] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_shift_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -4876,6 +5022,7 @@
>  	  SVE_FP_BINARY_INT))]
>    "TARGET_SVE"
>    "<sve_fp_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
> +  [(set_attr "type" "sve_fp_trig")]
>  )
>  
>  ;; Predicated floating-point binary operations that take an integer
> @@ -4892,7 +5039,8 @@
>    "@
>     <sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_trig, sve_fp_trig_x")]
>  )
>  
>  ;; Predicated floating-point binary operations with merging, taking an
> @@ -4934,7 +5082,8 @@
>    {
>      operands[4] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_trig, sve_fp_trig_x")]
>  )
>  
>  (define_insn "*cond_<optab><mode>_2_strict"
> @@ -4953,7 +5102,8 @@
>    "@
>     <sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_trig, sve_fp_trig_x")]
>  )
>  
>  ;; Predicated floating-point binary operations that take an integer as
> @@ -4992,7 +5142,8 @@
>      else
>        FAIL;
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_trig_x")]
>  )
>  
>  (define_insn_and_rewrite "*cond_<optab><mode>_any_strict"
> @@ -5021,7 +5172,8 @@
>  					     operands[4], operands[1]));
>      operands[4] = operands[2] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_trig_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -5042,7 +5194,8 @@
>  	  (match_operand:SVE_FULL_F 1 "register_operand" "w")
>  	  (match_operand:SVE_FULL_F 2 "register_operand" "w")))]
>    "TARGET_SVE && reload_completed"
> -  "<sve_fp_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>")
> +  "<sve_fp_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
> +)
>  
>  ;; -------------------------------------------------------------------------
>  ;; ---- [FP] General binary arithmetic corresponding to unspecs
> @@ -5421,7 +5574,9 @@
>     && INTVAL (operands[4]) == SVE_RELAXED_GP"
>    [(set (match_dup 0) (plus:SVE_FULL_F (match_dup 2) (match_dup 3)))]
>    ""
> -  [(set_attr "movprfx" "*,*,*,*,yes,yes,yes")]
> +  [(set_attr "movprfx" "*,*,*,*,yes,yes,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith, sve_fp_arith, sve_fp_arith,
> +                     sve_fp_arith_x, sve_fp_arith_x, sve_fp_arith_x")]
>  )
>  
>  ;; Predicated floating-point addition of a constant, merging with the
> @@ -5448,7 +5603,8 @@
>    {
>      operands[4] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,*,yes,yes")]
> +  [(set_attr "movprfx" "*,*,yes,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith, sve_fp_arith_x, sve_fp_arith_x")]
>  )
>  
>  (define_insn "*cond_add<mode>_2_const_strict"
> @@ -5469,7 +5625,8 @@
>     fsub\t%0.<Vetype>, %1/m, %0.<Vetype>, #%N3
>     movprfx\t%0, %2\;fadd\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
>     movprfx\t%0, %2\;fsub\t%0.<Vetype>, %1/m, %0.<Vetype>, #%N3"
> -  [(set_attr "movprfx" "*,*,yes,yes")]
> +  [(set_attr "movprfx" "*,*,yes,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith, sve_fp_arith_x, sve_fp_arith_x")]
>  )
>  
>  ;; Predicated floating-point addition of a constant, merging with an
> @@ -5509,7 +5666,8 @@
>      else
>        FAIL;
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_arith_x")]
>  )
>  
>  (define_insn_and_rewrite "*cond_add<mode>_any_const_strict"
> @@ -5540,7 +5698,8 @@
>  					     operands[4], operands[1]));
>      operands[4] = operands[2] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_arith_x")]
>  )
>  
>  ;; Register merging forms are handled through SVE_COND_FP_BINARY.
> @@ -5565,7 +5724,8 @@
>    "@
>     fcadd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>, #<rot>
>     movprfx\t%0, %2\;fcadd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>, #<rot>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith_c, sve_fp_arith_cx")]
>  )
>  
>  ;; Predicated FCADD with merging.
> @@ -5619,7 +5779,8 @@
>    {
>      operands[4] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith_c, sve_fp_arith_cx")]
>  )
>  
>  (define_insn "*cond_<optab><mode>_2_strict"
> @@ -5638,7 +5799,8 @@
>    "@
>     fcadd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>, #<rot>
>     movprfx\t%0, %2\;fcadd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>, #<rot>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith_c, sve_fp_arith_cx")]
>  )
>  
>  ;; Predicated FCADD, merging with an independent value.
> @@ -5675,7 +5837,8 @@
>      else
>        FAIL;
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_arith_cx")]
>  )
>  
>  (define_insn_and_rewrite "*cond_<optab><mode>_any_strict"
> @@ -5704,7 +5867,8 @@
>  					     operands[4], operands[1]));
>      operands[4] = operands[2] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_arith_cx")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -5739,7 +5903,9 @@
>     && INTVAL (operands[4]) == SVE_RELAXED_GP"
>    [(set (match_dup 0) (minus:SVE_FULL_F (match_dup 2) (match_dup 3)))]
>    ""
> -  [(set_attr "movprfx" "*,*,*,*,yes,yes")]
> +  [(set_attr "movprfx" "*,*,*,*,yes,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith, sve_fp_arith,
> +                     sve_fp_arith, sve_fp_arith_x, sve_fp_arith_x")]
>  )
>  
>  ;; Predicated floating-point subtraction from a constant, merging with the
> @@ -5764,7 +5930,8 @@
>    {
>      operands[4] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith_x")]
>  )
>  
>  (define_insn "*cond_sub<mode>_3_const_strict"
> @@ -5783,7 +5950,8 @@
>    "@
>     fsubr\t%0.<Vetype>, %1/m, %0.<Vetype>, #%2
>     movprfx\t%0, %3\;fsubr\t%0.<Vetype>, %1/m, %0.<Vetype>, #%2"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith_x")]
>  )
>  
>  ;; Predicated floating-point subtraction from a constant, merging with an
> @@ -5820,7 +5988,8 @@
>      else
>        FAIL;
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_arith_x")]
>  )
>  
>  (define_insn_and_rewrite "*cond_sub<mode>_const_strict"
> @@ -5848,7 +6017,8 @@
>                                               operands[4], operands[1]));
>      operands[4] = operands[3] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_arith_x")]
>  )
>  ;; Register merging forms are handled through SVE_COND_FP_BINARY.
>  
> @@ -5896,7 +6066,8 @@
>    {
>      operands[5] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith_x")]
>  )
>  
>  (define_insn "*aarch64_pred_abd<mode>_strict"
> @@ -5915,7 +6086,8 @@
>    "@
>     fabd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;fabd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith_x")]
>  )
>  
>  (define_expand "@aarch64_cond_abd<mode>"
> @@ -5968,7 +6140,8 @@
>      operands[4] = copy_rtx (operands[1]);
>      operands[5] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith_x")]
>  )
>  
>  (define_insn "*aarch64_cond_abd<mode>_2_strict"
> @@ -5991,7 +6164,8 @@
>    "@
>     fabd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;fabd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith_x")]
>  )
>  
>  ;; Predicated floating-point absolute difference, merging with the second
> @@ -6022,7 +6196,8 @@
>      operands[4] = copy_rtx (operands[1]);
>      operands[5] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith_x")]
>  )
>  
>  (define_insn "*aarch64_cond_abd<mode>_3_strict"
> @@ -6045,7 +6220,8 @@
>    "@
>     fabd\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
>     movprfx\t%0, %3\;fabd\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith_x")]
>  )
>  
>  ;; Predicated floating-point absolute difference, merging with an
> @@ -6094,7 +6270,8 @@
>      else
>        FAIL;
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_arith_x")]
>  )
>  
>  (define_insn_and_rewrite "*aarch64_cond_abd<mode>_any_strict"
> @@ -6130,7 +6307,8 @@
>  					     operands[4], operands[1]));
>      operands[4] = operands[3] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_arith_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -6163,7 +6341,9 @@
>     && INTVAL (operands[4]) == SVE_RELAXED_GP"
>    [(set (match_dup 0) (mult:SVE_FULL_F (match_dup 2) (match_dup 3)))]
>    ""
> -  [(set_attr "movprfx" "*,*,*,yes,yes")]
> +  [(set_attr "movprfx" "*,*,*,yes,yes")
> +   (set_attr "type" "sve_fp_mul, *, sve_fp_mul,
> +                     sve_fp_mul_x, sve_fp_mul_x")]
>  )
>  
>  ;; Merging forms are handled through SVE_COND_FP_BINARY and
> @@ -6180,6 +6360,7 @@
>  	  (match_operand:SVE_FULL_F 1 "register_operand" "w")))]
>    "TARGET_SVE"
>    "fmul\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>[%3]"
> +  [(set_attr "type" "sve_fp_mul")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -6243,6 +6424,7 @@
>  	  LOGICALF))]
>    "TARGET_SVE"
>    "<logicalf_op>\t%0.d, %1.d, %2.d"
> +  [(set_attr "type" "sve_logic")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -6363,7 +6545,9 @@
>     <sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
>     movprfx\t%0, %2\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,*,yes,yes")]
> +  [(set_attr "movprfx" "*,*,yes,yes")
> +   (set_attr "type" "sve_fp_arith, sve_fp_arith,
> +                     sve_fp_arith_x, sve_fp_arith_x")]
>  )
>  
>  ;; Merging forms are handled through SVE_COND_FP_BINARY and
> @@ -6390,6 +6574,7 @@
>  		      (match_operand:PRED_ALL 2 "register_operand" "Upa")))]
>    "TARGET_SVE"
>    "and\t%0.b, %1/z, %2.b, %2.b"
> +  [(set_attr "type" "sve_logic_p")]
>  )
>  
>  ;; Unpredicated predicate EOR and ORR.
> @@ -6416,6 +6601,7 @@
>  	  (match_operand:PRED_ALL 1 "register_operand" "Upa")))]
>    "TARGET_SVE"
>    "<logical>\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_logic_p")]
>  )
>  
>  ;; Perform a logical operation on operands 2 and 3, using operand 1 as
> @@ -6438,6 +6624,7 @@
>  		      (match_dup 4)))]
>    "TARGET_SVE"
>    "<logical>s\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_logic_ps")]
>  )
>  
>  ;; Same with just the flags result.
> @@ -6456,6 +6643,7 @@
>     (clobber (match_scratch:VNx16BI 0 "=Upa"))]
>    "TARGET_SVE"
>    "<logical>s\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_logic_ps")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -6476,6 +6664,7 @@
>  	  (match_operand:PRED_ALL 1 "register_operand" "Upa")))]
>    "TARGET_SVE"
>    "<nlogical>\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_logic_p")]
>  )
>  
>  ;; Same, but set the flags as a side-effect.
> @@ -6499,6 +6688,7 @@
>  		      (match_dup 4)))]
>    "TARGET_SVE"
>    "<nlogical>s\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_logic_ps")]
>  )
>  
>  ;; Same with just the flags result.
> @@ -6518,6 +6708,7 @@
>     (clobber (match_scratch:VNx16BI 0 "=Upa"))]
>    "TARGET_SVE"
>    "<nlogical>s\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_logic_ps")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -6538,6 +6729,7 @@
>  	  (match_operand:PRED_ALL 1 "register_operand" "Upa")))]
>    "TARGET_SVE"
>    "<logical_nn>\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_logic")]
>  )
>  
>  ;; Same, but set the flags as a side-effect.
> @@ -6562,6 +6754,7 @@
>  		      (match_dup 4)))]
>    "TARGET_SVE"
>    "<logical_nn>s\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_logic_ps")]
>  )
>  
>  ;; Same with just the flags result.
> @@ -6582,6 +6775,7 @@
>     (clobber (match_scratch:VNx16BI 0 "=Upa"))]
>    "TARGET_SVE"
>    "<logical_nn>s\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_logic_ps")]
>  )
>  
>  ;; =========================================================================
> @@ -6631,7 +6825,8 @@
>     mad\t%0.<Vetype>, %1/m, %3.<Vetype>, %4.<Vetype>
>     mla\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %4\;mla\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,*,yes")]
> +  [(set_attr "movprfx" "*,*,yes")
> +   (set_attr "type" "sve_mla, sve_mla, sve_mla_x")]
>  )
>  
>  ;; Predicated integer addition of product with merging.
> @@ -6673,7 +6868,8 @@
>    "@
>     mad\t%0.<Vetype>, %1/m, %3.<Vetype>, %4.<Vetype>
>     movprfx\t%0, %2\;mad\t%0.<Vetype>, %1/m, %3.<Vetype>, %4.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_mla, sve_mla_x")]
>  )
>  
>  ;; Predicated integer addition of product, merging with the third input.
> @@ -6692,7 +6888,8 @@
>    "@
>     mla\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %4\;mla\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_mla, sve_mla_x")]
>  )
>  
>  ;; Predicated integer addition of product, merging with an independent value.
> @@ -6726,7 +6923,8 @@
>  					     operands[5], operands[1]));
>      operands[5] = operands[4] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_mla_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -6772,7 +6970,8 @@
>     msb\t%0.<Vetype>, %1/m, %3.<Vetype>, %4.<Vetype>
>     mls\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %4\;mls\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,*,yes")]
> +  [(set_attr "movprfx" "*,*,yes")
> +   (set_attr "type" "sve_mla, sve_mla, sve_mla_x")]
>  )
>  
>  ;; Predicated integer subtraction of product with merging.
> @@ -6814,7 +7013,8 @@
>    "@
>     msb\t%0.<Vetype>, %1/m, %3.<Vetype>, %4.<Vetype>
>     movprfx\t%0, %2\;msb\t%0.<Vetype>, %1/m, %3.<Vetype>, %4.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_mla, sve_mla_x")]
>  )
>  
>  ;; Predicated integer subtraction of product, merging with the third input.
> @@ -6833,7 +7033,8 @@
>    "@
>     mls\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %4\;mls\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_mla, sve_mla_x")]
>  )
>  
>  ;; Predicated integer subtraction of product, merging with an
> @@ -6868,7 +7069,8 @@
>  					     operands[5], operands[1]));
>      operands[5] = operands[4] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_mla_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -6894,7 +7096,8 @@
>    "@
>     <sur>dot\\t%0.<Vetype>, %1.<Vetype_fourth>, %2.<Vetype_fourth>
>     movprfx\t%0, %3\;<sur>dot\\t%0.<Vetype>, %1.<Vetype_fourth>, %2.<Vetype_fourth>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_dot, sve_dot_x")]
>  )
>  
>  ;; Four-element integer dot-product by selected lanes with accumulation.
> @@ -6913,7 +7116,8 @@
>    "@
>     <sur>dot\\t%0.<Vetype>, %1.<Vetype_fourth>, %2.<Vetype_fourth>[%3]
>     movprfx\t%0, %4\;<sur>dot\\t%0.<Vetype>, %1.<Vetype_fourth>, %2.<Vetype_fourth>[%3]"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_dot, sve_dot_x")]
>  )
>  
>  (define_insn "@<sur>dot_prod<vsi2qi>"
> @@ -6928,7 +7132,8 @@
>    "@
>     <sur>dot\\t%0.s, %1.b, %2.b
>     movprfx\t%0, %3\;<sur>dot\\t%0.s, %1.b, %2.b"
> -   [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_dot, sve_dot_x")]
>  )
>  
>  (define_insn "@aarch64_<sur>dot_prod_lane<vsi2qi>"
> @@ -6946,7 +7151,8 @@
>    "@
>     <sur>dot\\t%0.s, %1.b, %2.b[%3]
>     movprfx\t%0, %4\;<sur>dot\\t%0.s, %1.b, %2.b[%3]"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_dot, sve_dot_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -7000,7 +7206,8 @@
>    "@
>     <sur>mmla\\t%0.s, %2.b, %3.b
>     movprfx\t%0, %1\;<sur>mmla\\t%0.s, %2.b, %3.b"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_mmla, sve_mmla_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -7048,7 +7255,8 @@
>     <sve_fmla_op>\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>
>     <sve_fmad_op>\t%0.<Vetype>, %1/m, %3.<Vetype>, %4.<Vetype>
>     movprfx\t%0, %4\;<sve_fmla_op>\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,*,yes")]
> +  [(set_attr "movprfx" "*,*,yes")
> +   (set_attr "type" "sve_fp_mla, sve_fp_mla, sve_fp_mla_x")]
>  )
>  
>  ;; Predicated floating-point ternary operations with merging.
> @@ -7096,7 +7304,8 @@
>    {
>      operands[5] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_mla, sve_fp_mla_x")]
>  )
>  
>  (define_insn "*cond_<optab><mode>_2_strict"
> @@ -7116,7 +7325,8 @@
>    "@
>     <sve_fmad_op>\t%0.<Vetype>, %1/m, %3.<Vetype>, %4.<Vetype>
>     movprfx\t%0, %2\;<sve_fmad_op>\t%0.<Vetype>, %1/m, %3.<Vetype>, %4.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_mla, sve_fp_mla_x")]
>  )
>  
>  ;; Predicated floating-point ternary operations, merging with the
> @@ -7142,7 +7352,8 @@
>    {
>      operands[5] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_mla, sve_fp_mla_x")]
>  )
>  
>  (define_insn "*cond_<optab><mode>_4_strict"
> @@ -7162,7 +7373,8 @@
>    "@
>     <sve_fmla_op>\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %4\;<sve_fmla_op>\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_mla, sve_fp_mla_x")]
>  )
>  
>  ;; Predicated floating-point ternary operations, merging with an
> @@ -7206,7 +7418,8 @@
>      else
>        FAIL;
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_mla_x")]
>  )
>  
>  (define_insn_and_rewrite "*cond_<optab><mode>_any_strict"
> @@ -7241,7 +7454,8 @@
>  					     operands[5], operands[1]));
>      operands[5] = operands[4] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_mla_x")]
>  )
>  
>  ;; Unpredicated FMLA and FMLS by selected lanes.  It doesn't seem worth using
> @@ -7260,7 +7474,8 @@
>    "@
>     <sve_fp_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>[%3]
>     movprfx\t%0, %4\;<sve_fp_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>[%3]"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_mla, sve_fp_mla_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -7284,7 +7499,8 @@
>    "@
>     fcmla\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>, #<rot>
>     movprfx\t%0, %4\;fcmla\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>, #<rot>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_mla_c, sve_fp_mla_cx")]
>  )
>  
>  ;; unpredicated optab pattern for auto-vectorizer
> @@ -7382,7 +7598,8 @@
>    {
>      operands[5] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_mla_c, sve_fp_mla_cx")]
>  )
>  
>  (define_insn "*cond_<optab><mode>_4_strict"
> @@ -7402,7 +7619,8 @@
>    "@
>     fcmla\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>, #<rot>
>     movprfx\t%0, %4\;fcmla\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>, #<rot>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_mla_c, sve_fp_mla_cx")]
>  )
>  
>  ;; Predicated FCMLA, merging with an independent value.
> @@ -7440,7 +7658,8 @@
>      else
>        FAIL;
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_mla_cx")]
>  )
>  
>  (define_insn_and_rewrite "*cond_<optab><mode>_any_strict"
> @@ -7470,7 +7689,8 @@
>  					     operands[5], operands[1]));
>      operands[5] = operands[4] = operands[0];
>    }
> -  [(set_attr "movprfx" "yes")]
> +  [(set_attr "movprfx" "yes")
> +   (set_attr "type" "sve_fp_mla_cx")]
>  )
>  
>  ;; Unpredicated FCMLA with indexing.
> @@ -7488,7 +7708,8 @@
>    "@
>     fcmla\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>[%3], #<rot>
>     movprfx\t%0, %4\;fcmla\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>[%3], #<rot>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_mla_c, sve_fp_mla_cx")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -7509,7 +7730,8 @@
>    "@
>     ftmad\t%0.<Vetype>, %0.<Vetype>, %2.<Vetype>, #%3
>     movprfx\t%0, %1\;ftmad\t%0.<Vetype>, %0.<Vetype>, %2.<Vetype>, #%3"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_trig, sve_fp_trig_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -7571,7 +7793,8 @@
>    "@
>     <sve_fp_op>\\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %1\;<sve_fp_op>\\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_mmla, sve_fp_mmla_x")]
>  )
>  
>  ;; =========================================================================
> @@ -7639,7 +7862,9 @@
>     movprfx\t%0.<Vetype>, %3/z, %0.<Vetype>\;fmov\t%0.<Vetype>, %3/m, #%1
>     movprfx\t%0, %2\;mov\t%0.<Vetype>, %3/m, #%I1
>     movprfx\t%0, %2\;fmov\t%0.<Vetype>, %3/m, #%1"
> -  [(set_attr "movprfx" "*,*,*,*,yes,yes,yes")]
> +  [(set_attr "movprfx" "*,*,*,*,yes,yes,yes")
> +   (set_attr "type" "sve_move, sve_move, sve_move, sve_fp_move,
> +                     sve_fp_move_x, sve_move_x, sve_move_x")]
>  )
>  
>  ;; Optimize selects between a duplicated scalar variable and another vector,
> @@ -7662,7 +7887,9 @@
>     movprfx\t%0.<Vetype>, %3/z, %0.<Vetype>\;mov\t%0.<Vetype>, %3/m, %<Vetype>1
>     movprfx\t%0, %2\;mov\t%0.<Vetype>, %3/m, %<vwcore>1
>     movprfx\t%0, %2\;mov\t%0.<Vetype>, %3/m, %<Vetype>1"
> -  [(set_attr "movprfx" "*,*,yes,yes,yes,yes")]
> +  [(set_attr "movprfx" "*,*,yes,yes,yes,yes")
> +   (set_attr "type" "sve_move, sve_move,
> +                     sve_move_x, sve_move_x, sve_move_x, sve_move_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -7813,6 +8040,7 @@
>    "@
>     cmp<cmp_op>\t%0.<Vetype>, %1/z, %3.<Vetype>, #%4
>     cmp<cmp_op>\t%0.<Vetype>, %1/z, %3.<Vetype>, %4.<Vetype>"
> +  [(set_attr "type" "sve_compare_s, sve_compare_s")]
>  )
>  
>  ;; Predicated integer comparisons in which both the flag and predicate
> @@ -7849,6 +8077,7 @@
>      operands[6] = copy_rtx (operands[4]);
>      operands[7] = operands[5];
>    }
> +  [(set_attr "type" "sve_compare_s, sve_compare_s")]
>  )
>  
>  ;; Predicated integer comparisons in which only the flags result is
> @@ -7878,6 +8107,7 @@
>      operands[6] = copy_rtx (operands[4]);
>      operands[7] = operands[5];
>    }
> +  [(set_attr "type" "sve_compare_s, sve_compare_s")]
>  )
>  
>  ;; Predicated integer comparisons, formed by combining a PTRUE-predicated
> @@ -7925,6 +8155,7 @@
>     (clobber (reg:CC_NZC CC_REGNUM))]
>    "TARGET_SVE"
>    "cmp<cmp_op>\t%0.<Vetype>, %1/z, %3.<Vetype>, %4.d"
> +  [(set_attr "type" "sve_compare_s")]
>  )
>  
>  ;; Predicated integer wide comparisons in which both the flag and
> @@ -7956,6 +8187,7 @@
>    "TARGET_SVE
>     && aarch64_sve_same_pred_for_ptest_p (&operands[4], &operands[6])"
>    "cmp<cmp_op>\t%0.<Vetype>, %1/z, %2.<Vetype>, %3.d"
> +  [(set_attr "type" "sve_compare_s")]
>  )
>  
>  ;; Predicated integer wide comparisons in which only the flags result
> @@ -7979,6 +8211,7 @@
>    "TARGET_SVE
>     && aarch64_sve_same_pred_for_ptest_p (&operands[4], &operands[6])"
>    "cmp<cmp_op>\t%0.<Vetype>, %1/z, %2.<Vetype>, %3.d"
> +  [(set_attr "type" "sve_compare_s")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8007,6 +8240,7 @@
>     (clobber (reg:CC_NZC CC_REGNUM))]
>    "TARGET_SVE"
>    "while<cmp_op>\t%0.<PRED_ALL:Vetype>, %<w>1, %<w>2"
> +  [(set_attr "type" "sve_loop_gs")]
>  )
>  
>  ;; The WHILE instructions set the flags in the same way as a PTEST with
> @@ -8036,6 +8270,7 @@
>      operands[3] = CONSTM1_RTX (VNx16BImode);
>      operands[4] = CONSTM1_RTX (<PRED_ALL:MODE>mode);
>    }
> +  [(set_attr "type" "sve_loop_gs")]
>  )
>  
>  ;; Same, but handle the case in which only the flags result is useful.
> @@ -8060,6 +8295,7 @@
>      operands[3] = CONSTM1_RTX (VNx16BImode);
>      operands[4] = CONSTM1_RTX (<PRED_ALL:MODE>mode);
>    }
> +  [(set_attr "type" "sve_loop_gs")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8104,6 +8340,7 @@
>    "@
>     fcm<cmp_op>\t%0.<Vetype>, %1/z, %3.<Vetype>, #0.0
>     fcm<cmp_op>\t%0.<Vetype>, %1/z, %3.<Vetype>, %4.<Vetype>"
> +  [(set_attr "type" "sve_fp_compare, sve_fp_compare")]
>  )
>  
>  ;; Same for unordered comparisons.
> @@ -8117,6 +8354,7 @@
>  	  UNSPEC_COND_FCMUO))]
>    "TARGET_SVE"
>    "fcmuo\t%0.<Vetype>, %1/z, %3.<Vetype>, %4.<Vetype>"
> +  [(set_attr "type" "sve_fp_compare")]
>  )
>  
>  ;; Floating-point comparisons predicated on a PTRUE, with the results ANDed
> @@ -8204,10 +8442,10 @@
>  	  (not:<VPRED>
>  	    (match_dup 5))
>  	  (match_dup 4)))]
> -{
> -  if (can_create_pseudo_p ())
> -    operands[5] = gen_reg_rtx (<VPRED>mode);
> -}
> +  {
> +    if (can_create_pseudo_p ())
> +      operands[5] = gen_reg_rtx (<VPRED>mode);
> +  }
>  )
>  
>  ;; Make sure that we expand to a nor when the operand 4 of
> @@ -8245,10 +8483,10 @@
>  	    (not:<VPRED>
>  	      (match_dup 4)))
>  	  (match_dup 1)))]
> -{
> -  if (can_create_pseudo_p ())
> -    operands[5] = gen_reg_rtx (<VPRED>mode);
> -}
> +  {
> +    if (can_create_pseudo_p ())
> +      operands[5] = gen_reg_rtx (<VPRED>mode);
> +  }
>  )
>  
>  (define_insn_and_split "*fcmuo<mode>_bic_combine"
> @@ -8280,10 +8518,10 @@
>  	  (not:<VPRED>
>  	    (match_dup 5))
>  	  (match_dup 4)))]
> -{
> -  if (can_create_pseudo_p ())
> -    operands[5] = gen_reg_rtx (<VPRED>mode);
> -}
> +  {
> +    if (can_create_pseudo_p ())
> +      operands[5] = gen_reg_rtx (<VPRED>mode);
> +  }
>  )
>  
>  ;; Same for unordered comparisons.
> @@ -8320,10 +8558,10 @@
>  	    (not:<VPRED>
>  	      (match_dup 4)))
>  	  (match_dup 1)))]
> -{
> -  if (can_create_pseudo_p ())
> -    operands[5] = gen_reg_rtx (<VPRED>mode);
> -}
> +  {
> +    if (can_create_pseudo_p ())
> +      operands[5] = gen_reg_rtx (<VPRED>mode);
> +  }
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8380,6 +8618,7 @@
>      operands[5] = copy_rtx (operands[1]);
>      operands[6] = copy_rtx (operands[1]);
>    }
> +  [(set_attr "type" "sve_fp_compare")]
>  )
>  
>  (define_insn "*aarch64_pred_fac<cmp_op><mode>_strict"
> @@ -8400,6 +8639,7 @@
>  	  SVE_COND_FP_ABS_CMP))]
>    "TARGET_SVE"
>    "fac<cmp_op>\t%0.<Vetype>, %1/z, %2.<Vetype>, %3.<Vetype>"
> +  [(set_attr "type" "sve_fp_compare")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8420,6 +8660,7 @@
>  	    (match_operand:PRED_ALL 2 "register_operand" "Upa"))))]
>    "TARGET_SVE"
>    "sel\t%0.b, %3, %1.b, %2.b"
> +  [(set_attr "type" "sve_sel_p")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8468,6 +8709,7 @@
>  		       UNSPEC_PTEST))]
>    "TARGET_SVE"
>    "ptest\t%0, %3.b"
> +  [(set_attr "type" "sve_set_ps")]
>  )
>  
>  ;; =========================================================================
> @@ -8495,6 +8737,7 @@
>    "@
>     clast<ab>\t%<vwcore>0, %2, %<vwcore>0, %3.<Vetype>
>     clast<ab>\t%<Vetype>0, %2, %<Vetype>0, %3.<Vetype>"
> +  [(set_attr "type" "sve_cext, sve_cext")]
>  )
>  
>  (define_insn "@aarch64_fold_extract_vector_<last_op>_<mode>"
> @@ -8508,6 +8751,8 @@
>    "@
>     clast<ab>\t%0.<Vetype>, %2, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %1\;clast<ab>\t%0.<Vetype>, %2, %0.<Vetype>, %3.<Vetype>"
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cext, sve_cext_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8548,6 +8793,7 @@
>  		   SVE_INT_ADDV))]
>    "TARGET_SVE && <max_elem_bits> >= <elem_bits>"
>    "<su>addv\t%d0, %1, %2.<Vetype>"
> +  [(set_attr "type" "sve_arith_r")]
>  )
>  
>  ;; Unpredicated integer reductions.
> @@ -8570,6 +8816,7 @@
>  		      SVE_INT_REDUCTION))]
>    "TARGET_SVE"
>    "<sve_int_op>\t%<Vetype>0, %1, %2.<Vetype>"
> +  [(set_attr "type" "sve_arith_r")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8614,6 +8861,7 @@
>  		      SVE_FP_REDUCTION))]
>    "TARGET_SVE"
>    "<sve_fp_op>\t%<Vetype>0, %1, %2.<Vetype>"
> +  [(set_attr "type" "sve_fp_arith_r")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8645,6 +8893,7 @@
>  		      UNSPEC_FADDA))]
>    "TARGET_SVE"
>    "fadda\t%<Vetype>0, %3, %<Vetype>0, %2.<Vetype>"
> +  [(set_attr "type" "sve_fp_arith_a")]
>  )
>  
>  ;; =========================================================================
> @@ -8679,6 +8928,7 @@
>  	  UNSPEC_TBL))]
>    "TARGET_SVE"
>    "tbl\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
> +  [(set_attr "type" "sve_tbl")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8699,6 +8949,7 @@
>  	  UNSPEC_SVE_COMPACT))]
>    "TARGET_SVE"
>    "compact\t%0.<Vetype>, %1, %2.<Vetype>"
> +  [(set_attr "type" "sve_cext")]
>  )
>  
>  ;; Duplicate one element of a vector.
> @@ -8711,6 +8962,7 @@
>    "TARGET_SVE
>     && IN_RANGE (INTVAL (operands[2]) * <container_bits> / 8, 0, 63)"
>    "dup\t%0.<Vctype>, %1.<Vctype>[%2]"
> +  [(set_attr "type" "sve_splat")]
>  )
>  
>  ;; Use DUP.Q to duplicate a 128-bit segment of a register.
> @@ -8747,6 +8999,7 @@
>      operands[2] = gen_int_mode (byte / 16, DImode);
>      return "dup\t%0.q, %1.q[%2]";
>    }
> +  [(set_attr "type" "sve_splat")]
>  )
>  
>  ;; Reverse the order of elements within a full vector.
> @@ -8756,7 +9009,9 @@
>  	  [(match_operand:SVE_ALL 1 "register_operand" "w")]
>  	  UNSPEC_REV))]
>    "TARGET_SVE"
> -  "rev\t%0.<Vctype>, %1.<Vctype>")
> +  "rev\t%0.<Vctype>, %1.<Vctype>"
> +  [(set_attr "type" "sve_rev")]
> +)
>  
>  ;; -------------------------------------------------------------------------
>  ;; ---- [INT,FP] Special-purpose binary permutes
> @@ -8784,7 +9039,8 @@
>    "@
>     splice\t%0.<Vetype>, %1, %0.<Vetype>, %3.<Vetype>
>     movprfx\t%0, %2\;splice\t%0.<Vetype>, %1, %0.<Vetype>, %3.<Vetype>"
> -  [(set_attr "movprfx" "*, yes")]
> +  [(set_attr "movprfx" "*, yes")
> +   (set_attr "type" "sve_cext, sve_cext_x")]
>  )
>  
>  ;; Permutes that take half the elements from one vector and half the
> @@ -8797,6 +9053,7 @@
>  	  PERMUTE))]
>    "TARGET_SVE"
>    "<perm_insn>\t%0.<Vctype>, %1.<Vctype>, %2.<Vctype>"
> +  [(set_attr "type" "sve_ext")]
>  )
>  
>  ;; Apply PERMUTE to 128-bit sequences.  The behavior of these patterns
> @@ -8809,6 +9066,7 @@
>  	  PERMUTEQ))]
>    "TARGET_SVE_F64MM"
>    "<perm_insn>\t%0.q, %1.q, %2.q"
> +  [(set_attr "type" "sve_ext")]
>  )
>  
>  ;; Concatenate two vectors and extract a subvector.  Note that the
> @@ -8828,7 +9086,8 @@
>  	    ? "ext\\t%0.b, %0.b, %2.b, #%3"
>  	    : "movprfx\t%0, %1\;ext\\t%0.b, %0.b, %2.b, #%3");
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_ext, sve_ext_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8843,7 +9102,9 @@
>  	(unspec:PRED_ALL [(match_operand:PRED_ALL 1 "register_operand" "Upa")]
>  			 UNSPEC_REV))]
>    "TARGET_SVE"
> -  "rev\t%0.<Vetype>, %1.<Vetype>")
> +  "rev\t%0.<Vetype>, %1.<Vetype>"
> +  [(set_attr "type" "sve_rev_p")]
> +)
>  
>  ;; -------------------------------------------------------------------------
>  ;; ---- [PRED] Special-purpose binary permutes
> @@ -8866,6 +9127,7 @@
>  			 PERMUTE))]
>    "TARGET_SVE"
>    "<perm_insn>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
> +  [(set_attr "type" "sve_trn_p")]
>  )
>  
>  ;; Special purpose permute used by the predicate generation instructions.
> @@ -8880,6 +9142,7 @@
>  			UNSPEC_TRN1_CONV))]
>    "TARGET_SVE"
>    "trn1\t%0.<PRED_ALL:Vetype>, %1.<PRED_ALL:Vetype>, %2.<PRED_ALL:Vetype>"
> +  [(set_attr "type" "sve_trn_p")]
>  )
>  
>  ;; =========================================================================
> @@ -8903,6 +9166,7 @@
>  	  UNSPEC_PACK))]
>    "TARGET_SVE"
>    "uzp1\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
> +  [(set_attr "type" "sve_zip")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8939,6 +9203,7 @@
>  	  UNPACK))]
>    "TARGET_SVE"
>    "<su>unpk<perm_hilo>\t%0.<Vewtype>, %1.<Vetype>"
> +  [(set_attr "type" "sve_upk")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -8976,7 +9241,8 @@
>    "@
>     fcvtz<su>\t%0.<SVE_FULL_HSDI:Vetype>, %1/m, %2.<SVE_FULL_F:Vetype>
>     movprfx\t%0, %2\;fcvtz<su>\t%0.<SVE_FULL_HSDI:Vetype>, %1/m, %2.<SVE_FULL_F:Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_to_int, sve_fp_to_int_x")]
>  )
>  
>  ;; Predicated narrowing float-to-integer conversion.
> @@ -8991,7 +9257,8 @@
>    "@
>     fcvtz<su>\t%0.<VNx4SI_ONLY:Vetype>, %1/m, %2.<VNx2DF_ONLY:Vetype>
>     movprfx\t%0, %2\;fcvtz<su>\t%0.<VNx4SI_ONLY:Vetype>, %1/m, %2.<VNx2DF_ONLY:Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_to_int, sve_fp_to_int_x")]
>  )
>  
>  ;; Predicated float-to-integer conversion with merging, either to the same
> @@ -9035,7 +9302,8 @@
>    {
>      operands[4] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_fp_to_int, sve_fp_to_int_x, sve_fp_to_int_x")]
>  )
>  
>  (define_insn "*cond_<optab>_nontrunc<SVE_FULL_F:mode><SVE_FULL_HSDI:mode>_strict"
> @@ -9054,7 +9322,8 @@
>     fcvtz<su>\t%0.<SVE_FULL_HSDI:Vetype>, %1/m, %2.<SVE_FULL_F:Vetype>
>     movprfx\t%0.<SVE_FULL_HSDI:Vetype>, %1/z, %2.<SVE_FULL_HSDI:Vetype>\;fcvtz<su>\t%0.<SVE_FULL_HSDI:Vetype>, %1/m, %2.<SVE_FULL_F:Vetype>
>     movprfx\t%0, %3\;fcvtz<su>\t%0.<SVE_FULL_HSDI:Vetype>, %1/m, %2.<SVE_FULL_F:Vetype>"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_fp_to_int, sve_fp_to_int_x, sve_fp_to_int_x")]
>  )
>  
>  ;; Predicated narrowing float-to-integer conversion with merging.
> @@ -9088,7 +9357,8 @@
>     fcvtz<su>\t%0.<VNx4SI_ONLY:Vetype>, %1/m, %2.<VNx2DF_ONLY:Vetype>
>     movprfx\t%0.<VNx2DF_ONLY:Vetype>, %1/z, %2.<VNx2DF_ONLY:Vetype>\;fcvtz<su>\t%0.<VNx4SI_ONLY:Vetype>, %1/m, %2.<VNx2DF_ONLY:Vetype>
>     movprfx\t%0, %3\;fcvtz<su>\t%0.<VNx4SI_ONLY:Vetype>, %1/m, %2.<VNx2DF_ONLY:Vetype>"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_fp_to_int, sve_fp_to_int_x, sve_fp_to_int_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -9163,7 +9433,8 @@
>    "@
>     <su>cvtf\t%0.<SVE_FULL_F:Vetype>, %1/m, %2.<SVE_FULL_HSDI:Vetype>
>     movprfx\t%0, %2\;<su>cvtf\t%0.<SVE_FULL_F:Vetype>, %1/m, %2.<SVE_FULL_HSDI:Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_int_to_fp, sve_int_to_fp_x")]
>  )
>  
>  ;; Predicated widening integer-to-float conversion.
> @@ -9178,7 +9449,8 @@
>    "@
>     <su>cvtf\t%0.<VNx2DF_ONLY:Vetype>, %1/m, %2.<VNx4SI_ONLY:Vetype>
>     movprfx\t%0, %2\;<su>cvtf\t%0.<VNx2DF_ONLY:Vetype>, %1/m, %2.<VNx4SI_ONLY:Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_int_to_fp, sve_int_to_fp_x")]
>  )
>  
>  ;; Predicated integer-to-float conversion with merging, either to the same
> @@ -9222,7 +9494,8 @@
>    {
>      operands[4] = copy_rtx (operands[1]);
>    }
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_int_to_fp, sve_int_to_fp_x, sve_int_to_fp_x")]
>  )
>  
>  (define_insn "*cond_<optab>_nonextend<SVE_FULL_HSDI:mode><SVE_FULL_F:mode>_strict"
> @@ -9241,7 +9514,8 @@
>     <su>cvtf\t%0.<SVE_FULL_F:Vetype>, %1/m, %2.<SVE_FULL_HSDI:Vetype>
>     movprfx\t%0.<SVE_FULL_HSDI:Vetype>, %1/z, %2.<SVE_FULL_HSDI:Vetype>\;<su>cvtf\t%0.<SVE_FULL_F:Vetype>, %1/m, %2.<SVE_FULL_HSDI:Vetype>
>     movprfx\t%0, %3\;<su>cvtf\t%0.<SVE_FULL_F:Vetype>, %1/m, %2.<SVE_FULL_HSDI:Vetype>"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_int_to_fp, sve_int_to_fp_x, sve_int_to_fp_x")]
>  )
>  
>  ;; Predicated widening integer-to-float conversion with merging.
> @@ -9275,7 +9549,8 @@
>     <su>cvtf\t%0.<VNx2DF_ONLY:Vetype>, %1/m, %2.<VNx4SI_ONLY:Vetype>
>     movprfx\t%0.<VNx2DF_ONLY:Vetype>, %1/z, %2.<VNx2DF_ONLY:Vetype>\;<su>cvtf\t%0.<VNx2DF_ONLY:Vetype>, %1/m, %2.<VNx4SI_ONLY:Vetype>
>     movprfx\t%0, %3\;<su>cvtf\t%0.<VNx2DF_ONLY:Vetype>, %1/m, %2.<VNx4SI_ONLY:Vetype>"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_int_to_fp, sve_int_to_fp_x, sve_int_to_fp_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -9361,7 +9636,8 @@
>    "@
>     fcvt\t%0.<SVE_FULL_HSF:Vetype>, %1/m, %2.<SVE_FULL_SDF:Vetype>
>     movprfx\t%0, %2\;fcvt\t%0.<SVE_FULL_HSF:Vetype>, %1/m, %2.<SVE_FULL_SDF:Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_to_fp, sve_fp_to_fp_x")]
>  )
>  
>  ;; Predicated float-to-float truncation with merging.
> @@ -9395,7 +9671,8 @@
>     fcvt\t%0.<SVE_FULL_HSF:Vetype>, %1/m, %2.<SVE_FULL_SDF:Vetype>
>     movprfx\t%0.<SVE_FULL_SDF:Vetype>, %1/z, %2.<SVE_FULL_SDF:Vetype>\;fcvt\t%0.<SVE_FULL_HSF:Vetype>, %1/m, %2.<SVE_FULL_SDF:Vetype>
>     movprfx\t%0, %3\;fcvt\t%0.<SVE_FULL_HSF:Vetype>, %1/m, %2.<SVE_FULL_SDF:Vetype>"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_fp_to_fp, sve_fp_to_fp_x, sve_fp_to_fp_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -9418,7 +9695,8 @@
>    "@
>     bfcvt\t%0.h, %1/m, %2.s
>     movprfx\t%0, %2\;bfcvt\t%0.h, %1/m, %2.s"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_to_fp, sve_fp_to_fp_x")]
>  )
>  
>  ;; Predicated BFCVT with merging.
> @@ -9452,7 +9730,8 @@
>     bfcvt\t%0.h, %1/m, %2.s
>     movprfx\t%0.s, %1/z, %2.s\;bfcvt\t%0.h, %1/m, %2.s
>     movprfx\t%0, %3\;bfcvt\t%0.h, %1/m, %2.s"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_fp_to_fp, sve_fp_to_fp_x, sve_fp_to_fp_x")]
>  )
>  
>  ;; Predicated BFCVTNT.  This doesn't give a natural aarch64_pred_*/cond_*
> @@ -9470,6 +9749,7 @@
>  	  UNSPEC_COND_FCVTNT))]
>    "TARGET_SVE_BF16"
>    "bfcvtnt\t%0.h, %2/m, %3.s"
> +  [(set_attr "type" "sve_fp_to_fp")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -9518,7 +9798,8 @@
>    "@
>     fcvt\t%0.<SVE_FULL_SDF:Vetype>, %1/m, %2.<SVE_FULL_HSF:Vetype>
>     movprfx\t%0, %2\;fcvt\t%0.<SVE_FULL_SDF:Vetype>, %1/m, %2.<SVE_FULL_HSF:Vetype>"
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_fp_to_fp, sve_fp_to_fp_x")]
>  )
>  
>  ;; Predicated float-to-float extension with merging.
> @@ -9552,7 +9833,8 @@
>     fcvt\t%0.<SVE_FULL_SDF:Vetype>, %1/m, %2.<SVE_FULL_HSF:Vetype>
>     movprfx\t%0.<SVE_FULL_SDF:Vetype>, %1/z, %2.<SVE_FULL_SDF:Vetype>\;fcvt\t%0.<SVE_FULL_SDF:Vetype>, %1/m, %2.<SVE_FULL_HSF:Vetype>
>     movprfx\t%0, %3\;fcvt\t%0.<SVE_FULL_SDF:Vetype>, %1/m, %2.<SVE_FULL_HSF:Vetype>"
> -  [(set_attr "movprfx" "*,yes,yes")]
> +  [(set_attr "movprfx" "*,yes,yes")
> +   (set_attr "type" "sve_fp_to_fp, sve_fp_to_fp_x, sve_fp_to_fp_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -9572,6 +9854,7 @@
>  	  UNSPEC_PACK))]
>    "TARGET_SVE"
>    "uzp1\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
> +  [(set_attr "type" "sve_zip_p")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -9605,6 +9888,7 @@
>  			UNPACK_UNSIGNED))]
>    "TARGET_SVE"
>    "punpk<perm_hilo>\t%0.h, %1.b"
> +  [(set_attr "type" "sve_upk_p")]
>  )
>  
>  ;; =========================================================================
> @@ -9635,6 +9919,7 @@
>    "@
>     brk<brk_op>\t%0.b, %1/z, %2.b
>     brk<brk_op>\t%0.b, %1/m, %2.b"
> +  [(set_attr "type" "sve_loop_p, sve_loop_p")]
>  )
>  
>  ;; Same, but also producing a flags result.
> @@ -9658,6 +9943,7 @@
>  	  SVE_BRK_UNARY))]
>    "TARGET_SVE"
>    "brk<brk_op>s\t%0.b, %1/z, %2.b"
> +  [(set_attr "type" "sve_loop_ps")]
>  )
>  
>  ;; Same, but with only the flags result being interesting.
> @@ -9676,6 +9962,7 @@
>     (clobber (match_scratch:VNx16BI 0 "=Upa"))]
>    "TARGET_SVE"
>    "brk<brk_op>s\t%0.b, %1/z, %2.b"
> +  [(set_attr "type" "sve_loop_ps")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -9700,6 +9987,7 @@
>  	  SVE_BRK_BINARY))]
>    "TARGET_SVE"
>    "brk<brk_op>\t%0.b, %1/z, %2.b, %<brk_reg_opno>.b"
> +  [(set_attr "type" "sve_loop_p")]
>  )
>  
>  ;; BRKN, producing both a predicate and a flags result.  Unlike other
> @@ -9730,6 +10018,7 @@
>      operands[4] = CONST0_RTX (VNx16BImode);
>      operands[5] = CONST0_RTX (VNx16BImode);
>    }
> +  [(set_attr "type" "sve_loop_ps")]
>  )
>  
>  ;; Same, but with only the flags result being interesting.
> @@ -9754,6 +10043,7 @@
>      operands[4] = CONST0_RTX (VNx16BImode);
>      operands[5] = CONST0_RTX (VNx16BImode);
>    }
> +  [(set_attr "type" "sve_loop_ps")]
>  )
>  
>  ;; BRKPA and BRKPB, producing both a predicate and a flags result.
> @@ -9777,6 +10067,7 @@
>  	  SVE_BRKP))]
>    "TARGET_SVE"
>    "brk<brk_op>s\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_loop_ps")]
>  )
>  
>  ;; Same, but with only the flags result being interesting.
> @@ -9795,6 +10086,7 @@
>     (clobber (match_scratch:VNx16BI 0 "=Upa"))]
>    "TARGET_SVE"
>    "brk<brk_op>s\t%0.b, %1/z, %2.b, %3.b"
> +  [(set_attr "type" "sve_loop_ps")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -9815,6 +10107,7 @@
>     (clobber (reg:CC_NZC CC_REGNUM))]
>    "TARGET_SVE && <max_elem_bits> >= <elem_bits>"
>    "<sve_pred_op>\t%0.<Vetype>, %1, %0.<Vetype>"
> +  [(set_attr "type" "sve_set_ps")]
>  )
>  
>  ;; Same, but also producing a flags result.
> @@ -9845,6 +10138,7 @@
>      operands[4] = operands[2];
>      operands[5] = operands[3];
>    }
> +  [(set_attr "type" "sve_set_ps")]
>  )
>  
>  ;; Same, but with only the flags result being interesting.
> @@ -9870,6 +10164,7 @@
>      operands[4] = operands[2];
>      operands[5] = operands[3];
>    }
> +  [(set_attr "type" "sve_set_ps")]
>  )
>  
>  ;; =========================================================================
> @@ -9902,6 +10197,7 @@
>    {
>      return aarch64_output_sve_cnt_pat_immediate ("cnt", "%x0", operands + 1);
>    }
> +  [(set_attr "type" "sve_cnt")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -9928,6 +10224,7 @@
>      return aarch64_output_sve_cnt_pat_immediate ("<inc_dec>", "%x0",
>  						 operands + 2);
>    }
> +  [(set_attr "type" "sve_cnt")]
>  )
>  
>  ;; Increment an SImode register by the number of elements in an svpattern
> @@ -9944,6 +10241,7 @@
>    {
>      return aarch64_output_sve_cnt_pat_immediate ("inc", "%x0", operands + 2);
>    }
> +  [(set_attr "type" "sve_cnt")]
>  )
>  
>  ;; Increment an SImode register by the number of elements in an svpattern
> @@ -9965,6 +10263,7 @@
>      return aarch64_output_sve_cnt_pat_immediate ("<inc_dec>", registers,
>  						 operands + 2);
>    }
> +  [(set_attr "type" "sve_cnt")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -9995,7 +10294,8 @@
>      return aarch64_output_sve_cnt_pat_immediate ("<inc_dec>", "%0.<Vetype>",
>  						 operands + 2);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt, sve_cnt_x")]
>  )
>  
>  ;; Increment a vector of SIs by the number of elements in an svpattern.
> @@ -10016,7 +10316,8 @@
>      return aarch64_output_sve_cnt_pat_immediate ("<inc_dec>", "%0.<Vetype>",
>  						 operands + 2);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt, sve_cnt_x")]
>  )
>  
>  ;; Increment a vector of HIs by the number of elements in an svpattern.
> @@ -10051,7 +10352,8 @@
>      return aarch64_output_sve_cnt_pat_immediate ("<inc_dec>", "%0.<Vetype>",
>  						 operands + 2);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt, sve_cnt_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -10078,6 +10380,7 @@
>      return aarch64_output_sve_cnt_pat_immediate ("<inc_dec>", "%x0",
>  						 operands + 2);
>    }
> +  [(set_attr "type" "sve_cnt")]
>  )
>  
>  ;; Decrement an SImode register by the number of elements in an svpattern
> @@ -10094,6 +10397,7 @@
>    {
>      return aarch64_output_sve_cnt_pat_immediate ("dec", "%x0", operands + 2);
>    }
> +  [(set_attr "type" "sve_cnt")]
>  )
>  
>  ;; Decrement an SImode register by the number of elements in an svpattern
> @@ -10115,6 +10419,7 @@
>      return aarch64_output_sve_cnt_pat_immediate ("<inc_dec>", registers,
>  						 operands + 2);
>    }
> +  [(set_attr "type" "sve_cnt")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -10145,7 +10450,8 @@
>      return aarch64_output_sve_cnt_pat_immediate ("<inc_dec>", "%0.<Vetype>",
>  						 operands + 2);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt, sve_cnt_x")]
>  )
>  
>  ;; Decrement a vector of SIs by the number of elements in an svpattern.
> @@ -10166,7 +10472,8 @@
>      return aarch64_output_sve_cnt_pat_immediate ("<inc_dec>", "%0.<Vetype>",
>  						 operands + 2);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt, sve_cnt_x")]
>  )
>  
>  ;; Decrement a vector of HIs by the number of elements in an svpattern.
> @@ -10201,7 +10508,8 @@
>      return aarch64_output_sve_cnt_pat_immediate ("<inc_dec>", "%0.<Vetype>",
>  						 operands + 2);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt, sve_cnt_x")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -10221,7 +10529,9 @@
>  		      (match_operand:PRED_ALL 3 "register_operand" "Upa")]
>  		     UNSPEC_CNTP)))]
>    "TARGET_SVE"
> -  "cntp\t%x0, %1, %3.<Vetype>")
> +  "cntp\t%x0, %1, %3.<Vetype>"
> +  [(set_attr "type" "sve_cnt_p")]
> +)
>  
>  ;; -------------------------------------------------------------------------
>  ;; ---- [INT] Increment by the number of elements in a predicate (scalar)
> @@ -10264,6 +10574,7 @@
>    {
>      operands[3] = CONSTM1_RTX (<PRED_ALL:MODE>mode);
>    }
> +  [(set_attr "type" "sve_cnt_p")]
>  )
>  
>  ;; Increment an SImode register by the number of set bits in a predicate
> @@ -10283,6 +10594,7 @@
>    {
>      operands[3] = CONSTM1_RTX (<MODE>mode);
>    }
> +  [(set_attr "type" "sve_cnt_p")]
>  )
>  
>  ;; Increment an SImode register by the number of set bits in a predicate
> @@ -10324,6 +10636,7 @@
>    {
>      operands[3] = CONSTM1_RTX (<PRED_ALL:MODE>mode);
>    }
> +  [(set_attr "type" "sve_cnt_p")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -10373,7 +10686,8 @@
>    {
>      operands[3] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt_pv, sve_cnt_pvx")]
>  )
>  
>  ;; Increment a vector of SIs by the number of set bits in a predicate.
> @@ -10412,7 +10726,8 @@
>    {
>      operands[3] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt_pv, sve_cnt_pvx")]
>  )
>  
>  ;; Increment a vector of HIs by the number of set bits in a predicate.
> @@ -10453,7 +10768,8 @@
>    {
>      operands[4] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt_pv, sve_cnt_pvx")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -10497,6 +10813,7 @@
>    {
>      operands[3] = CONSTM1_RTX (<PRED_ALL:MODE>mode);
>    }
> +  [(set_attr "type" "sve_cnt_p")]
>  )
>  
>  ;; Decrement an SImode register by the number of set bits in a predicate
> @@ -10516,6 +10833,7 @@
>    {
>      operands[3] = CONSTM1_RTX (<MODE>mode);
>    }
> +  [(set_attr "type" "sve_cnt_p")]
>  )
>  
>  ;; Decrement an SImode register by the number of set bits in a predicate
> @@ -10557,6 +10875,7 @@
>    {
>      operands[3] = CONSTM1_RTX (<PRED_ALL:MODE>mode);
>    }
> +  [(set_attr "type" "sve_cnt_p")]
>  )
>  
>  ;; -------------------------------------------------------------------------
> @@ -10606,7 +10925,8 @@
>    {
>      operands[3] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt_pv, sve_cnt_pvx")]
>  )
>  
>  ;; Decrement a vector of SIs by the number of set bits in a predicate.
> @@ -10645,7 +10965,8 @@
>    {
>      operands[3] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt_pv, sve_cnt_pvx")]
>  )
>  
>  ;; Decrement a vector of HIs by the number of set bits in a predicate.
> @@ -10686,5 +11007,6 @@
>    {
>      operands[4] = CONSTM1_RTX (<VPRED>mode);
>    }
> -  [(set_attr "movprfx" "*,yes")]
> -)
> +  [(set_attr "movprfx" "*,yes")
> +   (set_attr "type" "sve_cnt_pv, sve_cnt_pvx")]
> +)
> \ No newline at end of file
> diff --git a/gcc/config/arm/types.md b/gcc/config/arm/types.md
> index 83e29563c8e..baccdd02860 100644
> --- a/gcc/config/arm/types.md
> +++ b/gcc/config/arm/types.md
> @@ -562,6 +562,183 @@
>  ; crypto_sha256_slow
>  ; crypto_pmull
>  ;
> +; The classification below is for SVE instructions.
> +;
> +; SVE Suffixes:
> +; a: accumulated result
> +; c: complex math
> +; d: double precision
> +; g: GPR operand
> +; l: scaled
> +; p: predicate operand
> +; r: reduced result
> +; s: change flags
> +; s: single precision
> +; t: trigonometry math
> +; u: unscaled
> +; v: vector operand
> +; x: prefixed
> +;
> +; sve_loop_p
> +; sve_loop_ps
> +; sve_loop_gs
> +; sve_loop_end
> +;
> +; sve_logic_p
> +; sve_logic_ps
> +;
> +; sve_cnt_p
> +; sve_cnt_pv
> +; sve_cnt_pvx
> +; sve_rev_p
> +; sve_sel_p
> +; sve_set_p
> +; sve_set_ps
> +; sve_trn_p
> +; sve_upk_p
> +; sve_zip_p
> +;
> +; sve_arith
> +; sve_arith_sat
> +; sve_arith_sat_x
> +; sve_arith_r
> +; sve_arith_x
> +; sve_logic
> +; sve_logic_r
> +; sve_logic_x
> +;
> +; sve_shift
> +; sve_shift_d
> +; sve_shift_dx
> +; sve_shift_x
> +;
> +; sve_compare_s
> +;
> +; sve_cnt
> +; sve_cnt_x
> +; sve_copy
> +; sve_copy_g
> +; sve_move
> +; sve_move_x
> +; sve_move_g
> +; sve_permute
> +; sve_splat
> +; sve_splat_m
> +; sve_splat_g
> +; sve_cext
> +; sve_cext_x
> +; sve_cext_g
> +; sve_ext
> +; sve_ext_x
> +; sve_sext
> +; sve_sext_x
> +; sve_uext
> +; sve_uext_x
> +; sve_index
> +; sve_index_g
> +; sve_ins
> +; sve_ins_x
> +; sve_ins_g
> +; sve_ins_gx
> +; sve_rev
> +; sve_rev_x
> +; sve_tbl
> +; sve_trn
> +; sve_upk
> +; sve_zip
> +;
> +; sve_int_to_fp
> +; sve_int_to_fp_x
> +; sve_fp_round
> +; sve_fp_round_x
> +; sve_fp_to_int
> +; sve_fp_to_int_x
> +; sve_fp_to_fp
> +; sve_fp_to_fp_x
> +; sve_bf_to_fp
> +; sve_bf_to_fp_x
> +;
> +; sve_div
> +; sve_div_x
> +; sve_dot
> +; sve_dot_x
> +; sve_mla
> +; sve_mla_x
> +; sve_mmla
> +; sve_mmla_x
> +; sve_mul
> +; sve_mul_x
> +;
> +; sve_prfx
> +;
> +; sve_fp_arith
> +; sve_fp_arith_a
> +; sve_fp_arith_c
> +; sve_fp_arith_cx
> +; sve_fp_arith_r
> +; sve_fp_arith_x
> +;
> +; sve_fp_compare
> +; sve_fp_copy
> +; sve_fp_move
> +; sve_fp_move_x
> +;
> +; sve_fp_div_d
> +; sve_fp_div_dx
> +; sve_fp_div_s
> +; sve_fp_div_sx
> +; sve_fp_dot
> +; sve_fp_mla
> +; sve_fp_mla_x
> +; sve_fp_mla_c
> +; sve_fp_mla_cx
> +; sve_fp_mla_t
> +; sve_fp_mla_tx
> +; sve_fp_mmla
> +; sve_fp_mmla_x
> +; sve_fp_mul
> +; sve_fp_mul_x
> +; sve_fp_sqrt_d
> +; sve_fp_sqrt_s
> +; sve_fp_trig
> +; sve_fp_trig_x
> +;
> +; sve_fp_estimate,
> +; sve_fp_step,
> +;
> +; sve_bf_dot
> +; sve_bf_dot_x
> +; sve_bf_mla
> +; sve_bf_mla_x
> +; sve_bf_mmla
> +; sve_bf_mmla_x
> +;
> +; sve_ldr
> +; sve_ldr_p
> +; sve_load1
> +; sve_load1_gather_d
> +; sve_load1_gather_dl
> +; sve_load1_gather_du
> +; sve_load1_gather_s
> +; sve_load1_gather_sl
> +; sve_load1_gather_su
> +; sve_load2
> +; sve_load3
> +; sve_load4
> +;
> +; sve_str
> +; sve_str_p
> +; sve_store1
> +; sve_store1_scatter
> +; sve_store2
> +; sve_store3
> +; sve_store4
> +;
> +; sve_rd_ffr
> +; sve_rd_ffr_p
> +; sve_rd_ffr_ps
> +; sve_wr_ffr
> +;
>  ; The classification below is for coprocessor instructions
>  ;
>  ; coproc
> @@ -1120,6 +1297,171 @@
>    crypto_sha3,\
>    crypto_sm3,\
>    crypto_sm4,\
> +\
> +  sve_loop_p,\
> +  sve_loop_ps,\
> +  sve_loop_gs,\
> +  sve_loop_end,\
> +\
> +  sve_logic_p,\
> +  sve_logic_ps,\
> +\
> +  sve_cnt_p,\
> +  sve_cnt_pv,\
> +  sve_cnt_pvx,\
> +  sve_rev_p,\
> +  sve_sel_p,\
> +  sve_set_p,\
> +  sve_set_ps,\
> +  sve_trn_p,\
> +  sve_upk_p,\
> +  sve_zip_p,\
> +\
> +  sve_arith,\
> +  sve_arith_sat,\
> +  sve_arith_sat_x,\
> +  sve_arith_r,\
> +  sve_arith_x,\
> +  sve_logic,\
> +  sve_logic_r,\
> +  sve_logic_x,\
> +\
> +  sve_shift,\
> +  sve_shift_d,\
> +  sve_shift_dx,\
> +  sve_shift_x,\
> +\
> +  sve_compare_s,\
> +\
> +  sve_cnt,\
> +  sve_cnt_x,\
> +  sve_copy,\
> +  sve_copy_g,\
> +  sve_move,\
> +  sve_move_x,\
> +  sve_move_g,\
> +  sve_permute,\
> +  sve_splat,\
> +  sve_splat_m,\
> +  sve_splat_g,\
> +  sve_cext,\
> +  sve_cext_x,\
> +  sve_cext_g,\
> +  sve_ext,\
> +  sve_ext_x,\
> +  sve_sext,\
> +  sve_sext_x,\
> +  sve_uext,\
> +  sve_uext_x,\
> +  sve_index,\
> +  sve_index_g,\
> +  sve_ins,\
> +  sve_ins_x,\
> +  sve_ins_g,\
> +  sve_ins_gx,\
> +  sve_rev,\
> +  sve_rev_x,\
> +  sve_tbl,\
> +  sve_trn,\
> +  sve_upk,\
> +  sve_zip,\
> +\
> +  sve_int_to_fp,\
> +  sve_int_to_fp_x,\
> +  sve_fp_round,\
> +  sve_fp_round_x,\
> +  sve_fp_to_int,\
> +  sve_fp_to_int_x,\
> +  sve_fp_to_fp,\
> +  sve_fp_to_fp_x,\
> +  sve_bf_to_fp,\
> +  sve_bf_to_fp_x,\
> +\
> +  sve_div,\
> +  sve_div_x,\
> +  sve_dot,\
> +  sve_dot_x,\
> +  sve_mla,\
> +  sve_mla_x,\
> +  sve_mmla,\
> +  sve_mmla_x,\
> +  sve_mul,\
> +  sve_mul_x,\
> +\
> +  sve_prfx,\
> +\
> +  sve_fp_arith,\
> +  sve_fp_arith_a,\
> +  sve_fp_arith_c,\
> +  sve_fp_arith_cx,\
> +  sve_fp_arith_r,\
> +  sve_fp_arith_x,\
> +\
> +  sve_fp_compare,\
> +  sve_fp_copy,\
> +  sve_fp_move,\
> +  sve_fp_move_x,\
> +\
> +  sve_fp_div_d,\
> +  sve_fp_div_dx,\
> +  sve_fp_div_s,\
> +  sve_fp_div_sx,\
> +  sve_fp_dot,\
> +  sve_fp_mla,\
> +  sve_fp_mla_x,\
> +  sve_fp_mla_c,\
> +  sve_fp_mla_cx,\
> +  sve_fp_mla_t,\
> +  sve_fp_mla_tx,\
> +  sve_fp_mmla,\
> +  sve_fp_mmla_x,\
> +  sve_fp_mul,\
> +  sve_fp_mul_x,\
> +  sve_fp_sqrt_d,\
> +  sve_fp_sqrt_dx,\
> +  sve_fp_sqrt_s,\
> +  sve_fp_sqrt_sx,\
> +  sve_fp_trig,\
> +  sve_fp_trig_x,\
> +\
> +  sve_fp_estimate,
> +  sve_fp_estimate_x,
> +  sve_fp_step,
> +  sve_fp_step_x,
> +\
> +  sve_bf_dot,\
> +  sve_bf_dot_x,\
> +  sve_bf_mla,\
> +  sve_bf_mla_x,\
> +  sve_bf_mmla,\
> +  sve_bf_mmla_x,\
> +\
> +  sve_ldr,\
> +  sve_ldr_p,\
> +  sve_load1,\
> +  sve_load1_gather_d,\
> +  sve_load1_gather_dl,\
> +  sve_load1_gather_du,\
> +  sve_load1_gather_s,\
> +  sve_load1_gather_sl,\
> +  sve_load1_gather_su,\
> +  sve_load2,\
> +  sve_load3,\
> +  sve_load4,\
> +\
> +  sve_str,\
> +  sve_str_p,\
> +  sve_store1,\
> +  sve_store1_scatter,\
> +  sve_store2,\
> +  sve_store3,\
> +  sve_store4,\
> +\
> +  sve_rd_ffr,\
> +  sve_rd_ffr_p,\
> +  sve_rd_ffr_ps,\
> +  sve_wr_ffr,\
> +\
>    coproc,\
>    tme,\
>    memtag,\

  reply	other threads:[~2023-05-15  9:00 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-12 23:08 Evandro Menezes
2023-05-15  9:00 ` Richard Sandiford [this message]
2023-05-15  9:49   ` Kyrylo Tkachov
2023-05-15 20:13     ` Evandro Menezes
2023-05-16  8:36       ` Kyrylo Tkachov
2023-05-16 20:12         ` Evandro Menezes
2023-09-13  0:54         ` Evandro Menezes
2023-05-15 19:59   ` Evandro Menezes

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=mpt8rdq7yvh.fsf@arm.com \
    --to=richard.sandiford@arm.com \
    --cc=Kyrylo.Tkachov@arm.com \
    --cc=Tamar.Christina@arm.com \
    --cc=ebahapo@icloud.com \
    --cc=evandro+gcc@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    /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).