Home | History | Annotate | Line # | Download | only in aarch64
      1      1.1  mrg ;; Machine description for AArch64 SVE2.
      2  1.1.1.2  mrg ;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
      3      1.1  mrg ;; Contributed by ARM Ltd.
      4      1.1  mrg ;;
      5      1.1  mrg ;; This file is part of GCC.
      6      1.1  mrg ;;
      7      1.1  mrg ;; GCC is free software; you can redistribute it and/or modify it
      8      1.1  mrg ;; under the terms of the GNU General Public License as published by
      9      1.1  mrg ;; the Free Software Foundation; either version 3, or (at your option)
     10      1.1  mrg ;; any later version.
     11      1.1  mrg ;;
     12      1.1  mrg ;; GCC is distributed in the hope that it will be useful, but
     13      1.1  mrg ;; WITHOUT ANY WARRANTY; without even the implied warranty of
     14      1.1  mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15      1.1  mrg ;; General Public License for more details.
     16      1.1  mrg ;;
     17      1.1  mrg ;; You should have received a copy of the GNU General Public License
     18      1.1  mrg ;; along with GCC; see the file COPYING3.  If not see
     19      1.1  mrg ;; <http://www.gnu.org/licenses/>.
     20      1.1  mrg 
     21      1.1  mrg ;; The file is organised into the following sections (search for the full
     22      1.1  mrg ;; line):
     23      1.1  mrg ;;
     24      1.1  mrg ;; == Moves
     25      1.1  mrg ;; ---- Non-temporal gather loads
     26      1.1  mrg ;; ---- Non-temporal scatter stores
     27      1.1  mrg ;;
     28      1.1  mrg ;; == Uniform binary arithmnetic
     29      1.1  mrg ;; ---- [INT] Multiplication
     30      1.1  mrg ;; ---- [INT] Scaled high-part multiplication
     31      1.1  mrg ;; ---- [INT] General binary arithmetic that maps to unspecs
     32      1.1  mrg ;; ---- [INT] Saturating binary arithmetic
     33      1.1  mrg ;; ---- [INT] Saturating left shifts
     34      1.1  mrg ;;
     35      1.1  mrg ;; == Uniform ternary arithmnetic
     36      1.1  mrg ;; ---- [INT] General ternary arithmetic that maps to unspecs
     37      1.1  mrg ;; ---- [INT] Multiply-and-accumulate operations
     38      1.1  mrg ;; ---- [INT] Binary logic operations with rotation
     39      1.1  mrg ;; ---- [INT] Ternary logic operations
     40      1.1  mrg ;; ---- [INT] Shift-and-accumulate operations
     41      1.1  mrg ;; ---- [INT] Shift-and-insert operations
     42      1.1  mrg ;; ---- [INT] Sum of absolute differences
     43      1.1  mrg ;;
     44      1.1  mrg ;; == Extending arithmetic
     45      1.1  mrg ;; ---- [INT] Wide binary arithmetic
     46      1.1  mrg ;; ---- [INT] Long binary arithmetic
     47      1.1  mrg ;; ---- [INT] Long left shifts
     48      1.1  mrg ;; ---- [INT] Long binary arithmetic with accumulation
     49      1.1  mrg ;; ---- [FP] Long multiplication with accumulation
     50      1.1  mrg ;;
     51      1.1  mrg ;; == Narrowing arithnetic
     52      1.1  mrg ;; ---- [INT] Narrowing unary arithmetic
     53      1.1  mrg ;; ---- [INT] Narrowing binary arithmetic
     54      1.1  mrg ;; ---- [INT] Narrowing right shifts
     55      1.1  mrg ;;
     56      1.1  mrg ;; == Pairwise arithmetic
     57      1.1  mrg ;; ---- [INT] Pairwise arithmetic
     58      1.1  mrg ;; ---- [FP] Pairwise arithmetic
     59      1.1  mrg ;; ---- [INT] Pairwise arithmetic with accumulation
     60      1.1  mrg ;;
     61      1.1  mrg ;; == Complex arithmetic
     62      1.1  mrg ;; ---- [INT] Complex binary operations
     63      1.1  mrg ;; ---- [INT] Complex ternary operations
     64      1.1  mrg ;; ---- [INT] Complex dot product
     65      1.1  mrg ;;
     66      1.1  mrg ;; == Conversions
     67      1.1  mrg ;; ---- [FP<-FP] Widening conversions
     68      1.1  mrg ;; ---- [FP<-FP] Narrowing conversions
     69      1.1  mrg ;;
     70      1.1  mrg ;; == Other arithmetic
     71      1.1  mrg ;; ---- [INT] Reciprocal approximation
     72      1.1  mrg ;; ---- [INT<-FP] Base-2 logarithm
     73      1.1  mrg ;; ---- [INT] Polynomial multiplication
     74      1.1  mrg ;;
     75      1.1  mrg ;; == Permutation
     76      1.1  mrg ;; ---- [INT,FP] General permutes
     77      1.1  mrg ;; ---- [INT] Optional bit-permute extensions
     78      1.1  mrg ;;
     79      1.1  mrg ;; == General
     80      1.1  mrg ;; ---- Check for aliases between pointers
     81      1.1  mrg ;; ---- Histogram processing
     82      1.1  mrg ;; ---- String matching
     83      1.1  mrg ;;
     84      1.1  mrg ;; == Crypotographic extensions
     85      1.1  mrg ;; ---- Optional AES extensions
     86      1.1  mrg ;; ---- Optional SHA-3 extensions
     87      1.1  mrg ;; ---- Optional SM4 extensions
     88      1.1  mrg 
     89      1.1  mrg ;; =========================================================================
     90      1.1  mrg ;; == Moves
     91      1.1  mrg ;; =========================================================================
     92      1.1  mrg 
     93      1.1  mrg ;; -------------------------------------------------------------------------
     94      1.1  mrg ;; ---- Non-temporal gather loads
     95      1.1  mrg ;; -------------------------------------------------------------------------
     96      1.1  mrg ;; Includes gather forms of:
     97      1.1  mrg ;; - LDNT1B
     98      1.1  mrg ;; - LDNT1D
     99      1.1  mrg ;; - LDNT1H
    100      1.1  mrg ;; - LDNT1W
    101      1.1  mrg ;; -------------------------------------------------------------------------
    102      1.1  mrg 
    103      1.1  mrg ;; Non-extending loads.
    104      1.1  mrg (define_insn "@aarch64_gather_ldnt<mode>"
    105      1.1  mrg   [(set (match_operand:SVE_FULL_SD 0 "register_operand" "=w, w")
    106      1.1  mrg 	(unspec:SVE_FULL_SD
    107      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
    108      1.1  mrg 	   (match_operand:DI 2 "aarch64_reg_or_zero" "Z, r")
    109      1.1  mrg 	   (match_operand:<V_INT_EQUIV> 3 "register_operand" "w, w")
    110      1.1  mrg 	   (mem:BLK (scratch))]
    111      1.1  mrg 	  UNSPEC_LDNT1_GATHER))]
    112      1.1  mrg   "TARGET_SVE2"
    113      1.1  mrg   "@
    114      1.1  mrg    ldnt1<Vesize>\t%0.<Vetype>, %1/z, [%3.<Vetype>]
    115      1.1  mrg    ldnt1<Vesize>\t%0.<Vetype>, %1/z, [%3.<Vetype>, %2]"
    116      1.1  mrg )
    117      1.1  mrg 
    118      1.1  mrg ;; Extending loads.
    119      1.1  mrg (define_insn_and_rewrite "@aarch64_gather_ldnt_<ANY_EXTEND:optab><SVE_FULL_SDI:mode><SVE_PARTIAL_I:mode>"
    120      1.1  mrg   [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, w")
    121      1.1  mrg 	(unspec:SVE_FULL_SDI
    122      1.1  mrg 	  [(match_operand:<SVE_FULL_SDI:VPRED> 4 "general_operand" "UplDnm, UplDnm")
    123      1.1  mrg 	   (ANY_EXTEND:SVE_FULL_SDI
    124      1.1  mrg 	     (unspec:SVE_PARTIAL_I
    125      1.1  mrg 	       [(match_operand:<SVE_FULL_SDI:VPRED> 1 "register_operand" "Upl, Upl")
    126      1.1  mrg 		(match_operand:DI 2 "aarch64_reg_or_zero" "Z, r")
    127      1.1  mrg 		(match_operand:<SVE_FULL_SDI:V_INT_EQUIV> 3 "register_operand" "w, w")
    128      1.1  mrg 		(mem:BLK (scratch))]
    129      1.1  mrg 	       UNSPEC_LDNT1_GATHER))]
    130      1.1  mrg 	  UNSPEC_PRED_X))]
    131      1.1  mrg   "TARGET_SVE2
    132      1.1  mrg    && (~<SVE_FULL_SDI:narrower_mask> & <SVE_PARTIAL_I:self_mask>) == 0"
    133      1.1  mrg   "@
    134      1.1  mrg    ldnt1<ANY_EXTEND:s><SVE_PARTIAL_I:Vesize>\t%0.<SVE_FULL_SDI:Vetype>, %1/z, [%3.<SVE_FULL_SDI:Vetype>]
    135      1.1  mrg    ldnt1<ANY_EXTEND:s><SVE_PARTIAL_I:Vesize>\t%0.<SVE_FULL_SDI:Vetype>, %1/z, [%3.<SVE_FULL_SDI:Vetype>, %2]"
    136      1.1  mrg   "&& !CONSTANT_P (operands[4])"
    137      1.1  mrg   {
    138      1.1  mrg     operands[4] = CONSTM1_RTX (<SVE_FULL_SDI:VPRED>mode);
    139      1.1  mrg   }
    140      1.1  mrg )
    141      1.1  mrg 
    142      1.1  mrg ;; -------------------------------------------------------------------------
    143      1.1  mrg ;; ---- Non-temporal scatter stores
    144      1.1  mrg ;; -------------------------------------------------------------------------
    145      1.1  mrg ;; Includes scatter forms of:
    146      1.1  mrg ;; - STNT1B
    147      1.1  mrg ;; - STNT1D
    148      1.1  mrg ;; - STNT1H
    149      1.1  mrg ;; - STNT1W
    150      1.1  mrg ;; -------------------------------------------------------------------------
    151      1.1  mrg 
    152      1.1  mrg ;; Non-truncating stores.
    153      1.1  mrg (define_insn "@aarch64_scatter_stnt<mode>"
    154      1.1  mrg   [(set (mem:BLK (scratch))
    155      1.1  mrg 	(unspec:BLK
    156      1.1  mrg 	  [(match_operand:<VPRED> 0 "register_operand" "Upl, Upl")
    157      1.1  mrg 	   (match_operand:DI 1 "aarch64_reg_or_zero" "Z, r")
    158      1.1  mrg 	   (match_operand:<V_INT_EQUIV> 2 "register_operand" "w, w")
    159      1.1  mrg 	   (match_operand:SVE_FULL_SD 3 "register_operand" "w, w")]
    160      1.1  mrg 
    161      1.1  mrg 	  UNSPEC_STNT1_SCATTER))]
    162      1.1  mrg   "TARGET_SVE"
    163      1.1  mrg   "@
    164      1.1  mrg    stnt1<Vesize>\t%3.<Vetype>, %0, [%2.<Vetype>]
    165      1.1  mrg    stnt1<Vesize>\t%3.<Vetype>, %0, [%2.<Vetype>, %1]"
    166      1.1  mrg )
    167      1.1  mrg 
    168      1.1  mrg ;; Truncating stores.
    169      1.1  mrg (define_insn "@aarch64_scatter_stnt_<SVE_FULL_SDI:mode><SVE_PARTIAL_I:mode>"
    170      1.1  mrg   [(set (mem:BLK (scratch))
    171      1.1  mrg 	(unspec:BLK
    172      1.1  mrg 	  [(match_operand:<SVE_FULL_SDI:VPRED> 0 "register_operand" "Upl, Upl")
    173      1.1  mrg 	   (match_operand:DI 1 "aarch64_reg_or_zero" "Z, r")
    174      1.1  mrg 	   (match_operand:<SVE_FULL_SDI:V_INT_EQUIV> 2 "register_operand" "w, w")
    175      1.1  mrg 	   (truncate:SVE_PARTIAL_I
    176      1.1  mrg 	     (match_operand:SVE_FULL_SDI 3 "register_operand" "w, w"))]
    177      1.1  mrg 	  UNSPEC_STNT1_SCATTER))]
    178      1.1  mrg   "TARGET_SVE2
    179      1.1  mrg    && (~<SVE_FULL_SDI:narrower_mask> & <SVE_PARTIAL_I:self_mask>) == 0"
    180      1.1  mrg   "@
    181      1.1  mrg    stnt1<SVE_PARTIAL_I:Vesize>\t%3.<SVE_FULL_SDI:Vetype>, %0, [%2.<SVE_FULL_SDI:Vetype>]
    182      1.1  mrg    stnt1<SVE_PARTIAL_I:Vesize>\t%3.<SVE_FULL_SDI:Vetype>, %0, [%2.<SVE_FULL_SDI:Vetype>, %1]"
    183      1.1  mrg )
    184      1.1  mrg 
    185      1.1  mrg ;; =========================================================================
    186      1.1  mrg ;; == Uniform binary arithmnetic
    187      1.1  mrg ;; =========================================================================
    188      1.1  mrg 
    189      1.1  mrg ;; -------------------------------------------------------------------------
    190      1.1  mrg ;; ---- [INT] Multiplication
    191      1.1  mrg ;; -------------------------------------------------------------------------
    192      1.1  mrg ;; Includes the lane forms of:
    193      1.1  mrg ;; - MUL
    194      1.1  mrg ;; -------------------------------------------------------------------------
    195      1.1  mrg 
    196      1.1  mrg (define_insn "@aarch64_mul_lane_<mode>"
    197      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w")
    198      1.1  mrg 	(mult:SVE_FULL_HSDI
    199      1.1  mrg 	  (unspec:SVE_FULL_HSDI
    200      1.1  mrg 	    [(match_operand:SVE_FULL_HSDI 2 "register_operand" "<sve_lane_con>")
    201      1.1  mrg 	     (match_operand:SI 3 "const_int_operand")]
    202      1.1  mrg 	    UNSPEC_SVE_LANE_SELECT)
    203      1.1  mrg 	  (match_operand:SVE_FULL_HSDI 1 "register_operand" "w")))]
    204      1.1  mrg   "TARGET_SVE2"
    205      1.1  mrg   "mul\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>[%3]"
    206      1.1  mrg )
    207      1.1  mrg 
    208      1.1  mrg ;; -------------------------------------------------------------------------
    209      1.1  mrg ;; ---- [INT] Scaled high-part multiplication
    210      1.1  mrg ;; -------------------------------------------------------------------------
    211      1.1  mrg ;; The patterns in this section are synthetic.
    212      1.1  mrg ;; -------------------------------------------------------------------------
    213      1.1  mrg 
    214      1.1  mrg ;; Unpredicated integer multiply-high-with-(round-and-)scale.
    215      1.1  mrg (define_expand "<su>mulh<r>s<mode>3"
    216      1.1  mrg   [(set (match_operand:SVE_FULL_BHSI 0 "register_operand")
    217      1.1  mrg 	(unspec:SVE_FULL_BHSI
    218      1.1  mrg 	  [(match_dup 3)
    219      1.1  mrg 	   (unspec:SVE_FULL_BHSI
    220      1.1  mrg 	     [(match_operand:SVE_FULL_BHSI 1 "register_operand")
    221      1.1  mrg 	      (match_operand:SVE_FULL_BHSI 2 "register_operand")]
    222      1.1  mrg 	     MULHRS)]
    223      1.1  mrg 	  UNSPEC_PRED_X))]
    224      1.1  mrg   "TARGET_SVE2"
    225      1.1  mrg   {
    226      1.1  mrg     operands[3] = aarch64_ptrue_reg (<VPRED>mode);
    227      1.1  mrg 
    228      1.1  mrg     rtx prod_b = gen_reg_rtx (<VWIDE>mode);
    229      1.1  mrg     rtx prod_t = gen_reg_rtx (<VWIDE>mode);
    230      1.1  mrg     emit_insn (gen_aarch64_sve_<su>mullb<Vwide> (prod_b, operands[1],
    231      1.1  mrg 						 operands[2]));
    232      1.1  mrg     emit_insn (gen_aarch64_sve_<su>mullt<Vwide> (prod_t, operands[1],
    233      1.1  mrg 						 operands[2]));
    234      1.1  mrg 
    235      1.1  mrg     rtx shift = GEN_INT (GET_MODE_UNIT_BITSIZE (<MODE>mode) - 1);
    236      1.1  mrg     emit_insn (gen_aarch64_sve_<r>shrnb<Vwide> (operands[0], prod_b, shift));
    237      1.1  mrg     emit_insn (gen_aarch64_sve_<r>shrnt<Vwide> (operands[0], operands[0],
    238      1.1  mrg 						prod_t, shift));
    239      1.1  mrg 
    240      1.1  mrg     DONE;
    241      1.1  mrg   }
    242      1.1  mrg )
    243      1.1  mrg 
    244      1.1  mrg ;; -------------------------------------------------------------------------
    245      1.1  mrg ;; ---- [INT] General binary arithmetic that maps to unspecs
    246      1.1  mrg ;; -------------------------------------------------------------------------
    247      1.1  mrg ;; Includes:
    248      1.1  mrg ;; - SHADD
    249      1.1  mrg ;; - SHSUB
    250      1.1  mrg ;; - SHSUBR
    251      1.1  mrg ;; - SQRSHL
    252      1.1  mrg ;; - SQRSHLR
    253      1.1  mrg ;; - SRHADD
    254      1.1  mrg ;; - SRSHL
    255      1.1  mrg ;; - SRSHLR
    256      1.1  mrg ;; - SUQADD
    257      1.1  mrg ;; - UHADD
    258      1.1  mrg ;; - UHSUB
    259      1.1  mrg ;; - UHSUBR
    260      1.1  mrg ;; - UQRSHL
    261      1.1  mrg ;; - UQRSHLR
    262      1.1  mrg ;; - URHADD
    263      1.1  mrg ;; - URSHL
    264      1.1  mrg ;; - URSHLR
    265      1.1  mrg ;; - USQADD
    266      1.1  mrg ;; -------------------------------------------------------------------------
    267      1.1  mrg 
    268      1.1  mrg ;; Integer average (floor).
    269      1.1  mrg (define_expand "<u>avg<mode>3_floor"
    270      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
    271      1.1  mrg 	(unspec:SVE_FULL_I
    272      1.1  mrg 	  [(match_dup 3)
    273      1.1  mrg 	   (unspec:SVE_FULL_I
    274      1.1  mrg 	     [(match_operand:SVE_FULL_I 1 "register_operand")
    275      1.1  mrg 	      (match_operand:SVE_FULL_I 2 "register_operand")]
    276      1.1  mrg 	     HADD)]
    277      1.1  mrg 	  UNSPEC_PRED_X))]
    278      1.1  mrg   "TARGET_SVE2"
    279      1.1  mrg   {
    280      1.1  mrg     operands[3] = force_reg (<VPRED>mode, CONSTM1_RTX (<VPRED>mode));
    281      1.1  mrg   }
    282      1.1  mrg )
    283      1.1  mrg 
    284      1.1  mrg ;; Integer average (rounding).
    285      1.1  mrg (define_expand "<u>avg<mode>3_ceil"
    286      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
    287      1.1  mrg 	(unspec:SVE_FULL_I
    288      1.1  mrg 	  [(match_dup 3)
    289      1.1  mrg 	   (unspec:SVE_FULL_I
    290      1.1  mrg 	     [(match_operand:SVE_FULL_I 1 "register_operand")
    291      1.1  mrg 	      (match_operand:SVE_FULL_I 2 "register_operand")]
    292      1.1  mrg 	     RHADD)]
    293      1.1  mrg 	  UNSPEC_PRED_X))]
    294      1.1  mrg   "TARGET_SVE2"
    295      1.1  mrg   {
    296      1.1  mrg     operands[3] = force_reg (<VPRED>mode, CONSTM1_RTX (<VPRED>mode));
    297      1.1  mrg   }
    298      1.1  mrg )
    299      1.1  mrg 
    300      1.1  mrg ;; The immediate form of SQADD acts as an immediate form of SUQADD
    301      1.1  mrg ;; over its full range.  In contrast to the ss_plus pattern, we do
    302      1.1  mrg ;; not need to treat byte immediates specially.  E.g.:
    303      1.1  mrg ;;
    304      1.1  mrg ;;	SQADD	Z0.B, Z0.B, #128
    305      1.1  mrg ;;
    306      1.1  mrg ;; is equivalent to:
    307      1.1  mrg ;;
    308      1.1  mrg ;;	MOV	Z1.B, #128
    309      1.1  mrg ;;	SUQADD	Z0.B, P0/M, Z0.B, Z1.B
    310      1.1  mrg ;;
    311      1.1  mrg ;; even though it's not equivalent to:
    312      1.1  mrg ;;
    313      1.1  mrg ;;	MOV	Z1.B, #128
    314      1.1  mrg ;;	SQADD	Z0.B, P0/M, Z0.B, Z1.B	// Saturating subtraction of 128
    315      1.1  mrg (define_insn "@aarch64_sve_suqadd<mode>_const"
    316      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    317      1.1  mrg 	(unspec:SVE_FULL_I
    318      1.1  mrg 	  [(match_operand:SVE_FULL_I 1 "register_operand" "0, w")
    319      1.1  mrg 	   (match_operand:SVE_FULL_I 2 "aarch64_sve_arith_immediate")]
    320      1.1  mrg 	  UNSPEC_SUQADD))]
    321      1.1  mrg   "TARGET_SVE2"
    322      1.1  mrg   "@
    323      1.1  mrg    sqadd\t%0.<Vetype>, %0.<Vetype>, #%D2
    324      1.1  mrg    movprfx\t%0, %1\;sqadd\t%0.<Vetype>, %0.<Vetype>, #%D2"
    325      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    326      1.1  mrg )
    327      1.1  mrg 
    328      1.1  mrg ;; General predicated binary arithmetic.  All operations handled here
    329      1.1  mrg ;; are commutative or have a reversed form.
    330      1.1  mrg (define_insn "@aarch64_pred_<sve_int_op><mode>"
    331      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, w, ?&w")
    332      1.1  mrg 	(unspec:SVE_FULL_I
    333      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl")
    334      1.1  mrg 	   (unspec:SVE_FULL_I
    335      1.1  mrg 	     [(match_operand:SVE_FULL_I 2 "register_operand" "0, w, w")
    336      1.1  mrg 	      (match_operand:SVE_FULL_I 3 "register_operand" "w, 0, w")]
    337      1.1  mrg 	     SVE2_COND_INT_BINARY_REV)]
    338      1.1  mrg 	  UNSPEC_PRED_X))]
    339      1.1  mrg   "TARGET_SVE2"
    340      1.1  mrg   "@
    341      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    342      1.1  mrg    <sve_int_op_rev>\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
    343      1.1  mrg    movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
    344      1.1  mrg   [(set_attr "movprfx" "*,*,yes")]
    345      1.1  mrg )
    346      1.1  mrg 
    347      1.1  mrg ;; Predicated binary arithmetic with merging.
    348      1.1  mrg (define_expand "@cond_<sve_int_op><mode>"
    349      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
    350      1.1  mrg 	(unspec:SVE_FULL_I
    351      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand")
    352      1.1  mrg 	   (unspec:SVE_FULL_I
    353      1.1  mrg 	     [(match_dup 5)
    354      1.1  mrg 	      (unspec:SVE_FULL_I
    355      1.1  mrg 		[(match_operand:SVE_FULL_I 2 "register_operand")
    356      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand")]
    357      1.1  mrg 		SVE2_COND_INT_BINARY)]
    358      1.1  mrg 	     UNSPEC_PRED_X)
    359      1.1  mrg 	   (match_operand:SVE_FULL_I 4 "aarch64_simd_reg_or_zero")]
    360      1.1  mrg 	  UNSPEC_SEL))]
    361      1.1  mrg   "TARGET_SVE2"
    362      1.1  mrg   {
    363      1.1  mrg     operands[5] = CONSTM1_RTX (<MODE>mode);
    364      1.1  mrg   }
    365      1.1  mrg )
    366      1.1  mrg 
    367      1.1  mrg ;; Predicated binary arithmetic, merging with the first input.
    368      1.1  mrg (define_insn_and_rewrite "*cond_<sve_int_op><mode>_2"
    369      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    370      1.1  mrg 	(unspec:SVE_FULL_I
    371      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
    372      1.1  mrg 	   (unspec:SVE_FULL_I
    373      1.1  mrg 	     [(match_operand 4)
    374      1.1  mrg 	      (unspec:SVE_FULL_I
    375      1.1  mrg 		[(match_operand:SVE_FULL_I 2 "register_operand" "0, w")
    376      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "w, w")]
    377      1.1  mrg 		SVE2_COND_INT_BINARY)]
    378      1.1  mrg 	     UNSPEC_PRED_X)
    379      1.1  mrg 	   (match_dup 2)]
    380      1.1  mrg 	  UNSPEC_SEL))]
    381      1.1  mrg   "TARGET_SVE2"
    382      1.1  mrg   "@
    383      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    384      1.1  mrg    movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
    385      1.1  mrg   "&& !CONSTANT_P (operands[4])"
    386      1.1  mrg   {
    387      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
    388      1.1  mrg   }
    389      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    390      1.1  mrg )
    391      1.1  mrg 
    392      1.1  mrg ;; Predicated binary arithmetic, merging with the second input.
    393      1.1  mrg (define_insn_and_rewrite "*cond_<sve_int_op><mode>_3"
    394      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    395      1.1  mrg 	(unspec:SVE_FULL_I
    396      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
    397      1.1  mrg 	   (unspec:SVE_FULL_I
    398      1.1  mrg 	     [(match_operand 4)
    399      1.1  mrg 	      (unspec:SVE_FULL_I
    400      1.1  mrg 		[(match_operand:SVE_FULL_I 2 "register_operand" "w, w")
    401      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "0, w")]
    402      1.1  mrg 		SVE2_COND_INT_BINARY_REV)]
    403      1.1  mrg 	     UNSPEC_PRED_X)
    404      1.1  mrg 	   (match_dup 3)]
    405      1.1  mrg 	  UNSPEC_SEL))]
    406      1.1  mrg   "TARGET_SVE2"
    407      1.1  mrg   "@
    408      1.1  mrg    <sve_int_op_rev>\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
    409      1.1  mrg    movprfx\t%0, %3\;<sve_int_op_rev>\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>"
    410      1.1  mrg   "&& !CONSTANT_P (operands[4])"
    411      1.1  mrg   {
    412      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
    413      1.1  mrg   }
    414      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    415      1.1  mrg )
    416      1.1  mrg 
    417      1.1  mrg ;; Predicated binary operations, merging with an independent value.
    418      1.1  mrg (define_insn_and_rewrite "*cond_<sve_int_op><mode>_any"
    419      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=&w, &w, &w, &w, ?&w")
    420      1.1  mrg 	(unspec:SVE_FULL_I
    421      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl, Upl, Upl")
    422      1.1  mrg 	   (unspec:SVE_FULL_I
    423      1.1  mrg 	     [(match_operand 5)
    424      1.1  mrg 	      (unspec:SVE_FULL_I
    425      1.1  mrg 		[(match_operand:SVE_FULL_I 2 "register_operand" "0, w, w, w, w")
    426      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "w, 0, w, w, w")]
    427      1.1  mrg 		SVE2_COND_INT_BINARY_REV)]
    428      1.1  mrg 	     UNSPEC_PRED_X)
    429      1.1  mrg 	   (match_operand:SVE_FULL_I 4 "aarch64_simd_reg_or_zero" "Dz, Dz, Dz, 0, w")]
    430      1.1  mrg 	  UNSPEC_SEL))]
    431      1.1  mrg   "TARGET_SVE2
    432      1.1  mrg    && !rtx_equal_p (operands[2], operands[4])
    433      1.1  mrg    && !rtx_equal_p (operands[3], operands[4])"
    434      1.1  mrg   "@
    435      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    436      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op_rev>\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
    437      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    438      1.1  mrg    movprfx\t%0.<Vetype>, %1/m, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    439      1.1  mrg    #"
    440      1.1  mrg   "&& 1"
    441      1.1  mrg   {
    442      1.1  mrg     if (reload_completed
    443      1.1  mrg         && register_operand (operands[4], <MODE>mode)
    444      1.1  mrg         && !rtx_equal_p (operands[0], operands[4]))
    445      1.1  mrg       {
    446      1.1  mrg 	emit_insn (gen_vcond_mask_<mode><vpred> (operands[0], operands[2],
    447      1.1  mrg 						 operands[4], operands[1]));
    448      1.1  mrg 	operands[4] = operands[2] = operands[0];
    449      1.1  mrg       }
    450      1.1  mrg     else if (!CONSTANT_P (operands[5]))
    451      1.1  mrg       operands[5] = CONSTM1_RTX (<VPRED>mode);
    452      1.1  mrg     else
    453      1.1  mrg       FAIL;
    454      1.1  mrg   }
    455      1.1  mrg   [(set_attr "movprfx" "yes")]
    456      1.1  mrg )
    457      1.1  mrg 
    458      1.1  mrg ;; Predicated binary operations with no reverse form, merging with zero.
    459      1.1  mrg ;; At present we don't generate these patterns via a cond_* optab,
    460      1.1  mrg ;; so there's no correctness requirement to handle merging with an
    461      1.1  mrg ;; independent value.
    462      1.1  mrg (define_insn_and_rewrite "*cond_<sve_int_op><mode>_z"
    463      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=&w, &w")
    464      1.1  mrg 	(unspec:SVE_FULL_I
    465      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
    466      1.1  mrg 	   (unspec:SVE_FULL_I
    467      1.1  mrg 	     [(match_operand 5)
    468      1.1  mrg 	      (unspec:SVE_FULL_I
    469      1.1  mrg 		[(match_operand:SVE_FULL_I 2 "register_operand" "0, w")
    470      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "w, w")]
    471      1.1  mrg 		SVE2_COND_INT_BINARY_NOREV)]
    472      1.1  mrg 	     UNSPEC_PRED_X)
    473      1.1  mrg 	   (match_operand:SVE_FULL_I 4 "aarch64_simd_imm_zero")]
    474      1.1  mrg 	  UNSPEC_SEL))]
    475      1.1  mrg   "TARGET_SVE2"
    476      1.1  mrg   "@
    477      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    478      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
    479      1.1  mrg   "&& !CONSTANT_P (operands[5])"
    480      1.1  mrg   {
    481      1.1  mrg     operands[5] = CONSTM1_RTX (<VPRED>mode);
    482      1.1  mrg   }
    483      1.1  mrg   [(set_attr "movprfx" "yes")]
    484      1.1  mrg )
    485      1.1  mrg 
    486      1.1  mrg ;; -------------------------------------------------------------------------
    487      1.1  mrg ;; ---- [INT] Saturating binary arithmetic
    488      1.1  mrg ;; -------------------------------------------------------------------------
    489      1.1  mrg ;; Includes:
    490      1.1  mrg ;; - SQDMULH
    491      1.1  mrg ;; - SQRDMULH
    492      1.1  mrg ;; -------------------------------------------------------------------------
    493      1.1  mrg 
    494      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
    495      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w")
    496      1.1  mrg 	(unspec:SVE_FULL_I
    497      1.1  mrg 	  [(match_operand:SVE_FULL_I 1 "register_operand" "w")
    498      1.1  mrg 	   (match_operand:SVE_FULL_I 2 "register_operand" "w")]
    499      1.1  mrg 	  SVE2_INT_BINARY))]
    500      1.1  mrg   "TARGET_SVE2"
    501      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
    502      1.1  mrg )
    503      1.1  mrg 
    504      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op>_lane_<mode>"
    505      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w")
    506      1.1  mrg 	(unspec:SVE_FULL_HSDI
    507      1.1  mrg 	  [(match_operand:SVE_FULL_HSDI 1 "register_operand" "w")
    508      1.1  mrg 	   (unspec:SVE_FULL_HSDI
    509      1.1  mrg 	     [(match_operand:SVE_FULL_HSDI 2 "register_operand" "<sve_lane_con>")
    510      1.1  mrg 	      (match_operand:SI 3 "const_int_operand")]
    511      1.1  mrg 	     UNSPEC_SVE_LANE_SELECT)]
    512      1.1  mrg 	  SVE2_INT_BINARY_LANE))]
    513      1.1  mrg   "TARGET_SVE2"
    514      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>[%3]"
    515      1.1  mrg )
    516      1.1  mrg 
    517      1.1  mrg ;; -------------------------------------------------------------------------
    518      1.1  mrg ;; ---- [INT] Saturating left shifts
    519      1.1  mrg ;; -------------------------------------------------------------------------
    520      1.1  mrg ;; Includes:
    521      1.1  mrg ;; - SQSHL
    522      1.1  mrg ;; - SQSHLR
    523      1.1  mrg ;; - UQSHL
    524      1.1  mrg ;; - UQSHLR
    525      1.1  mrg ;; -------------------------------------------------------------------------
    526      1.1  mrg 
    527      1.1  mrg ;; Predicated left shifts.
    528      1.1  mrg (define_insn "@aarch64_pred_<sve_int_op><mode>"
    529      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, w, w, ?&w, ?&w")
    530      1.1  mrg 	(unspec:SVE_FULL_I
    531      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl, Upl, Upl")
    532      1.1  mrg 	   (unspec:SVE_FULL_I
    533      1.1  mrg 	     [(match_operand:SVE_FULL_I 2 "register_operand" "0, 0, w, w, w")
    534      1.1  mrg 	      (match_operand:SVE_FULL_I 3 "aarch64_sve_<lr>shift_operand" "D<lr>, w, 0, D<lr>, w")]
    535      1.1  mrg 	     SVE2_COND_INT_SHIFT)]
    536      1.1  mrg 	  UNSPEC_PRED_X))]
    537      1.1  mrg   "TARGET_SVE2"
    538      1.1  mrg   "@
    539      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
    540      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    541      1.1  mrg    <sve_int_op>r\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
    542      1.1  mrg    movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
    543      1.1  mrg    movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
    544      1.1  mrg   [(set_attr "movprfx" "*,*,*,yes,yes")]
    545      1.1  mrg )
    546      1.1  mrg 
    547      1.1  mrg ;; Predicated left shifts with merging.
    548      1.1  mrg (define_expand "@cond_<sve_int_op><mode>"
    549      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
    550      1.1  mrg 	(unspec:SVE_FULL_I
    551      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand")
    552      1.1  mrg 	   (unspec:SVE_FULL_I
    553      1.1  mrg 	     [(match_dup 5)
    554      1.1  mrg 	      (unspec:SVE_FULL_I
    555      1.1  mrg 		[(match_operand:SVE_FULL_I 2 "register_operand")
    556      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "aarch64_sve_<lr>shift_operand")]
    557      1.1  mrg 		SVE2_COND_INT_SHIFT)]
    558      1.1  mrg 	     UNSPEC_PRED_X)
    559      1.1  mrg 	   (match_operand:SVE_FULL_I 4 "register_operand")]
    560      1.1  mrg 	  UNSPEC_SEL))]
    561      1.1  mrg   "TARGET_SVE2"
    562      1.1  mrg   {
    563      1.1  mrg     operands[5] = CONSTM1_RTX (<VPRED>mode);
    564      1.1  mrg   }
    565      1.1  mrg )
    566      1.1  mrg 
    567      1.1  mrg ;; Predicated left shifts, merging with the first input.
    568      1.1  mrg (define_insn_and_rewrite "*cond_<sve_int_op><mode>_2"
    569      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, w, ?&w, ?&w")
    570      1.1  mrg 	(unspec:SVE_FULL_I
    571      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl, Upl")
    572      1.1  mrg 	   (unspec:SVE_FULL_I
    573      1.1  mrg 	     [(match_operand 4)
    574      1.1  mrg 	      (unspec:SVE_FULL_I
    575      1.1  mrg 		[(match_operand:SVE_FULL_I 2 "register_operand" "0, 0, w, w")
    576      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "aarch64_sve_<lr>shift_operand" "D<lr>, w, D<lr>, w")]
    577      1.1  mrg 		SVE2_COND_INT_SHIFT)]
    578      1.1  mrg 	     UNSPEC_PRED_X)
    579      1.1  mrg 	   (match_dup 2)]
    580      1.1  mrg 	  UNSPEC_SEL))]
    581      1.1  mrg   "TARGET_SVE2"
    582      1.1  mrg   "@
    583      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
    584      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    585      1.1  mrg    movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
    586      1.1  mrg    movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
    587      1.1  mrg   "&& !CONSTANT_P (operands[4])"
    588      1.1  mrg   {
    589      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
    590      1.1  mrg   }
    591      1.1  mrg   [(set_attr "movprfx" "*,*,yes,yes")]
    592      1.1  mrg )
    593      1.1  mrg 
    594      1.1  mrg ;; Predicated left shifts, merging with the second input.
    595      1.1  mrg (define_insn_and_rewrite "*cond_<sve_int_op><mode>_3"
    596      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    597      1.1  mrg 	(unspec:SVE_FULL_I
    598      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
    599      1.1  mrg 	   (unspec:SVE_FULL_I
    600      1.1  mrg 	     [(match_operand 4)
    601      1.1  mrg 	      (unspec:SVE_FULL_I
    602      1.1  mrg 		[(match_operand:SVE_FULL_I 2 "register_operand" "w, w")
    603      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "0, w")]
    604      1.1  mrg 		SVE2_COND_INT_SHIFT)]
    605      1.1  mrg 	     UNSPEC_PRED_X)
    606      1.1  mrg 	   (match_dup 3)]
    607      1.1  mrg 	  UNSPEC_SEL))]
    608      1.1  mrg   "TARGET_SVE2"
    609      1.1  mrg   "@
    610      1.1  mrg    <sve_int_op>r\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
    611      1.1  mrg    movprfx\t%0, %3\;<sve_int_op>r\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>"
    612      1.1  mrg   "&& !CONSTANT_P (operands[4])"
    613      1.1  mrg   {
    614      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
    615      1.1  mrg   }
    616      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    617      1.1  mrg )
    618      1.1  mrg 
    619      1.1  mrg ;; Predicated left shifts, merging with an independent value.
    620      1.1  mrg (define_insn_and_rewrite "*cond_<sve_int_op><mode>_any"
    621      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=&w, &w, &w, &w, &w, &w, &w, ?&w, ?&w")
    622      1.1  mrg 	(unspec:SVE_FULL_I
    623      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl, Upl, Upl, Upl, Upl, Upl, Upl")
    624      1.1  mrg 	   (unspec:SVE_FULL_I
    625      1.1  mrg 	     [(match_operand 5)
    626      1.1  mrg 	      (unspec:SVE_FULL_I
    627      1.1  mrg 		[(match_operand:SVE_FULL_I 2 "register_operand" "0, 0, w, w, w, w, w, w, w")
    628      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "aarch64_sve_<lr>shift_operand" "D<lr>, w, 0, D<lr>, w, D<lr>, w, D<lr>, w")]
    629      1.1  mrg 		SVE2_COND_INT_SHIFT)]
    630      1.1  mrg 	     UNSPEC_PRED_X)
    631      1.1  mrg 	   (match_operand:SVE_FULL_I 4 "aarch64_simd_reg_or_zero" "Dz, Dz, Dz, Dz, Dz, 0, 0, w, w")]
    632      1.1  mrg 	  UNSPEC_SEL))]
    633      1.1  mrg   "TARGET_SVE2
    634      1.1  mrg    && !rtx_equal_p (operands[2], operands[4])
    635      1.1  mrg    && (CONSTANT_P (operands[4]) || !rtx_equal_p (operands[3], operands[4]))"
    636      1.1  mrg   "@
    637      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
    638      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    639      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>r\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
    640      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
    641      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    642      1.1  mrg    movprfx\t%0.<Vetype>, %1/m, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
    643      1.1  mrg    movprfx\t%0.<Vetype>, %1/m, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    644      1.1  mrg   #
    645      1.1  mrg   #"
    646      1.1  mrg   "&& 1"
    647      1.1  mrg   {
    648      1.1  mrg     if (reload_completed
    649      1.1  mrg         && register_operand (operands[4], <MODE>mode)
    650      1.1  mrg         && !rtx_equal_p (operands[0], operands[4]))
    651      1.1  mrg       {
    652      1.1  mrg 	emit_insn (gen_vcond_mask_<mode><vpred> (operands[0], operands[2],
    653      1.1  mrg 						 operands[4], operands[1]));
    654      1.1  mrg 	operands[4] = operands[2] = operands[0];
    655      1.1  mrg       }
    656      1.1  mrg     else if (!CONSTANT_P (operands[5]))
    657      1.1  mrg       operands[5] = CONSTM1_RTX (<VPRED>mode);
    658      1.1  mrg     else
    659      1.1  mrg       FAIL;
    660      1.1  mrg   }
    661      1.1  mrg   [(set_attr "movprfx" "yes")]
    662      1.1  mrg )
    663      1.1  mrg 
    664      1.1  mrg ;; =========================================================================
    665      1.1  mrg ;; == Uniform ternary arithmnetic
    666      1.1  mrg ;; =========================================================================
    667      1.1  mrg 
    668      1.1  mrg ;; -------------------------------------------------------------------------
    669      1.1  mrg ;; ---- [INT] General ternary arithmetic that maps to unspecs
    670      1.1  mrg ;; -------------------------------------------------------------------------
    671      1.1  mrg ;; Includes:
    672      1.1  mrg ;; - ADCLB
    673      1.1  mrg ;; - ADCLT
    674      1.1  mrg ;; - EORBT
    675      1.1  mrg ;; - EORTB
    676      1.1  mrg ;; - SBCLB
    677      1.1  mrg ;; - SBCLT
    678      1.1  mrg ;; - SQRDMLAH
    679      1.1  mrg ;; - SQRDMLSH
    680      1.1  mrg ;; -------------------------------------------------------------------------
    681      1.1  mrg 
    682      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
    683      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    684      1.1  mrg 	(unspec:SVE_FULL_I
    685      1.1  mrg 	  [(match_operand:SVE_FULL_I 2 "register_operand" "w, w")
    686      1.1  mrg 	   (match_operand:SVE_FULL_I 3 "register_operand" "w, w")
    687      1.1  mrg 	   (match_operand:SVE_FULL_I 1 "register_operand" "0, w")]
    688      1.1  mrg 	  SVE2_INT_TERNARY))]
    689      1.1  mrg   "TARGET_SVE2"
    690      1.1  mrg   "@
    691      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>
    692      1.1  mrg    movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>"
    693      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    694      1.1  mrg )
    695      1.1  mrg 
    696      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op>_lane_<mode>"
    697      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
    698      1.1  mrg 	(unspec:SVE_FULL_HSDI
    699      1.1  mrg 	  [(match_operand:SVE_FULL_HSDI 2 "register_operand" "w, w")
    700      1.1  mrg 	   (unspec:SVE_FULL_HSDI
    701      1.1  mrg 	     [(match_operand:SVE_FULL_HSDI 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
    702      1.1  mrg 	      (match_operand:SI 4 "const_int_operand")]
    703      1.1  mrg 	     UNSPEC_SVE_LANE_SELECT)
    704      1.1  mrg 	   (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")]
    705      1.1  mrg 	  SVE2_INT_TERNARY_LANE))]
    706      1.1  mrg   "TARGET_SVE2"
    707      1.1  mrg   "@
    708      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]
    709      1.1  mrg    movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]"
    710      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    711      1.1  mrg )
    712      1.1  mrg 
    713      1.1  mrg ;; -------------------------------------------------------------------------
    714      1.1  mrg ;; ---- [INT] Multiply-and-accumulate operations
    715      1.1  mrg ;; -------------------------------------------------------------------------
    716      1.1  mrg ;; Includes the lane forms of:
    717      1.1  mrg ;; - MLA
    718      1.1  mrg ;; - MLS
    719      1.1  mrg ;; -------------------------------------------------------------------------
    720      1.1  mrg 
    721      1.1  mrg (define_insn "@aarch64_sve_add_mul_lane_<mode>"
    722      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
    723      1.1  mrg 	(plus:SVE_FULL_HSDI
    724      1.1  mrg 	  (mult:SVE_FULL_HSDI
    725      1.1  mrg 	    (unspec:SVE_FULL_HSDI
    726      1.1  mrg 	      [(match_operand:SVE_FULL_HSDI 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
    727      1.1  mrg 	       (match_operand:SI 4 "const_int_operand")]
    728      1.1  mrg 	      UNSPEC_SVE_LANE_SELECT)
    729      1.1  mrg 	    (match_operand:SVE_FULL_HSDI 2 "register_operand" "w, w"))
    730      1.1  mrg 	  (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")))]
    731      1.1  mrg   "TARGET_SVE2"
    732      1.1  mrg   "@
    733      1.1  mrg    mla\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]
    734      1.1  mrg    movprfx\t%0, %1\;mla\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]"
    735      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    736      1.1  mrg )
    737      1.1  mrg 
    738      1.1  mrg (define_insn "@aarch64_sve_sub_mul_lane_<mode>"
    739      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
    740      1.1  mrg 	(minus:SVE_FULL_HSDI
    741      1.1  mrg 	  (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")
    742      1.1  mrg 	  (mult:SVE_FULL_HSDI
    743      1.1  mrg 	    (unspec:SVE_FULL_HSDI
    744      1.1  mrg 	      [(match_operand:SVE_FULL_HSDI 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
    745      1.1  mrg 	       (match_operand:SI 4 "const_int_operand")]
    746      1.1  mrg 	      UNSPEC_SVE_LANE_SELECT)
    747      1.1  mrg 	    (match_operand:SVE_FULL_HSDI 2 "register_operand" "w, w"))))]
    748      1.1  mrg   "TARGET_SVE2"
    749      1.1  mrg   "@
    750      1.1  mrg    mls\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]
    751      1.1  mrg    movprfx\t%0, %1\;mls\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]"
    752      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    753      1.1  mrg )
    754      1.1  mrg 
    755      1.1  mrg ;; -------------------------------------------------------------------------
    756      1.1  mrg ;; ---- [INT] Binary logic operations with rotation
    757      1.1  mrg ;; -------------------------------------------------------------------------
    758      1.1  mrg ;; Includes:
    759      1.1  mrg ;; - XAR
    760      1.1  mrg ;; -------------------------------------------------------------------------
    761      1.1  mrg 
    762      1.1  mrg (define_insn "@aarch64_sve2_xar<mode>"
    763      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    764      1.1  mrg 	(rotatert:SVE_FULL_I
    765      1.1  mrg 	  (xor:SVE_FULL_I
    766      1.1  mrg 	    (match_operand:SVE_FULL_I 1 "register_operand" "%0, w")
    767      1.1  mrg 	    (match_operand:SVE_FULL_I 2 "register_operand" "w, w"))
    768      1.1  mrg 	  (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm")))]
    769      1.1  mrg   "TARGET_SVE2"
    770      1.1  mrg   "@
    771      1.1  mrg   xar\t%0.<Vetype>, %0.<Vetype>, %2.<Vetype>, #%3
    772      1.1  mrg   movprfx\t%0, %1\;xar\t%0.<Vetype>, %0.<Vetype>, %2.<Vetype>, #%3"
    773      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    774      1.1  mrg )
    775      1.1  mrg 
    776      1.1  mrg ;; -------------------------------------------------------------------------
    777      1.1  mrg ;; ---- [INT] Ternary logic operations
    778      1.1  mrg ;; -------------------------------------------------------------------------
    779      1.1  mrg ;; Includes:
    780      1.1  mrg ;; - BCAX
    781      1.1  mrg ;; - BSL
    782      1.1  mrg ;; - BSL1N
    783      1.1  mrg ;; - BSL2N
    784      1.1  mrg ;; - EOR3
    785      1.1  mrg ;; - NBSL
    786      1.1  mrg ;; -------------------------------------------------------------------------
    787      1.1  mrg 
    788      1.1  mrg ;; Unpredicated exclusive OR of AND.
    789      1.1  mrg (define_expand "@aarch64_sve2_bcax<mode>"
    790      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
    791      1.1  mrg 	(xor:SVE_FULL_I
    792      1.1  mrg 	  (and:SVE_FULL_I
    793      1.1  mrg 	    (unspec:SVE_FULL_I
    794      1.1  mrg 	      [(match_dup 4)
    795      1.1  mrg 	       (not:SVE_FULL_I
    796      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand"))]
    797      1.1  mrg 	      UNSPEC_PRED_X)
    798      1.1  mrg 	    (match_operand:SVE_FULL_I 2 "register_operand"))
    799      1.1  mrg 	  (match_operand:SVE_FULL_I 1 "register_operand")))]
    800      1.1  mrg   "TARGET_SVE2"
    801      1.1  mrg   {
    802      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
    803      1.1  mrg   }
    804      1.1  mrg )
    805      1.1  mrg 
    806      1.1  mrg (define_insn_and_rewrite "*aarch64_sve2_bcax<mode>"
    807      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    808      1.1  mrg 	(xor:SVE_FULL_I
    809      1.1  mrg 	  (and:SVE_FULL_I
    810      1.1  mrg 	    (unspec:SVE_FULL_I
    811      1.1  mrg 	      [(match_operand 4)
    812      1.1  mrg 	       (not:SVE_FULL_I
    813      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))]
    814      1.1  mrg 	      UNSPEC_PRED_X)
    815      1.1  mrg 	    (match_operand:SVE_FULL_I 2 "register_operand" "w, w"))
    816      1.1  mrg 	  (match_operand:SVE_FULL_I 1 "register_operand" "0, w")))]
    817      1.1  mrg   "TARGET_SVE2"
    818      1.1  mrg   "@
    819      1.1  mrg   bcax\t%0.d, %0.d, %2.d, %3.d
    820      1.1  mrg   movprfx\t%0, %1\;bcax\t%0.d, %0.d, %2.d, %3.d"
    821      1.1  mrg   "&& !CONSTANT_P (operands[4])"
    822      1.1  mrg   {
    823      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
    824      1.1  mrg   }
    825      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    826      1.1  mrg )
    827      1.1  mrg 
    828      1.1  mrg ;; Unpredicated 3-way exclusive OR.
    829      1.1  mrg (define_insn "@aarch64_sve2_eor3<mode>"
    830      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, w, w, ?&w")
    831      1.1  mrg 	(xor:SVE_FULL_I
    832      1.1  mrg 	  (xor:SVE_FULL_I
    833      1.1  mrg 	    (match_operand:SVE_FULL_I 1 "register_operand" "0, w, w, w")
    834      1.1  mrg 	    (match_operand:SVE_FULL_I 2 "register_operand" "w, 0, w, w"))
    835      1.1  mrg 	  (match_operand:SVE_FULL_I 3 "register_operand" "w, w, 0, w")))]
    836      1.1  mrg   "TARGET_SVE2"
    837      1.1  mrg   "@
    838      1.1  mrg   eor3\t%0.d, %0.d, %2.d, %3.d
    839      1.1  mrg   eor3\t%0.d, %0.d, %1.d, %3.d
    840      1.1  mrg   eor3\t%0.d, %0.d, %1.d, %2.d
    841      1.1  mrg   movprfx\t%0, %1\;eor3\t%0.d, %0.d, %2.d, %3.d"
    842      1.1  mrg   [(set_attr "movprfx" "*,*,*,yes")]
    843      1.1  mrg )
    844      1.1  mrg 
    845      1.1  mrg ;; Use NBSL for vector NOR.
    846      1.1  mrg (define_insn_and_rewrite "*aarch64_sve2_nor<mode>"
    847      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    848      1.1  mrg 	(unspec:SVE_FULL_I
    849      1.1  mrg 	  [(match_operand 3)
    850      1.1  mrg 	   (and:SVE_FULL_I
    851      1.1  mrg 	     (not:SVE_FULL_I
    852      1.1  mrg 	       (match_operand:SVE_FULL_I 1 "register_operand" "%0, w"))
    853      1.1  mrg 	     (not:SVE_FULL_I
    854      1.1  mrg 	       (match_operand:SVE_FULL_I 2 "register_operand" "w, w")))]
    855      1.1  mrg 	  UNSPEC_PRED_X))]
    856      1.1  mrg   "TARGET_SVE2"
    857      1.1  mrg   "@
    858      1.1  mrg   nbsl\t%0.d, %0.d, %2.d, %0.d
    859      1.1  mrg   movprfx\t%0, %1\;nbsl\t%0.d, %0.d, %2.d, %0.d"
    860      1.1  mrg   "&& !CONSTANT_P (operands[3])"
    861      1.1  mrg   {
    862      1.1  mrg     operands[3] = CONSTM1_RTX (<VPRED>mode);
    863      1.1  mrg   }
    864      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    865      1.1  mrg )
    866      1.1  mrg 
    867      1.1  mrg ;; Use NBSL for vector NAND.
    868      1.1  mrg (define_insn_and_rewrite "*aarch64_sve2_nand<mode>"
    869      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    870      1.1  mrg 	(unspec:SVE_FULL_I
    871      1.1  mrg 	  [(match_operand 3)
    872      1.1  mrg 	   (ior:SVE_FULL_I
    873      1.1  mrg 	     (not:SVE_FULL_I
    874      1.1  mrg 	       (match_operand:SVE_FULL_I 1 "register_operand" "%0, w"))
    875      1.1  mrg 	     (not:SVE_FULL_I
    876      1.1  mrg 	       (match_operand:SVE_FULL_I 2 "register_operand" "w, w")))]
    877      1.1  mrg 	  UNSPEC_PRED_X))]
    878      1.1  mrg   "TARGET_SVE2"
    879      1.1  mrg   "@
    880      1.1  mrg   nbsl\t%0.d, %0.d, %2.d, %2.d
    881      1.1  mrg   movprfx\t%0, %1\;nbsl\t%0.d, %0.d, %2.d, %2.d"
    882      1.1  mrg   "&& !CONSTANT_P (operands[3])"
    883      1.1  mrg   {
    884      1.1  mrg     operands[3] = CONSTM1_RTX (<VPRED>mode);
    885      1.1  mrg   }
    886      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    887      1.1  mrg )
    888      1.1  mrg 
    889      1.1  mrg ;; Unpredicated bitwise select.
    890      1.1  mrg ;; (op3 ? bsl_mov : bsl_dup) == (((bsl_mov ^ bsl_dup) & op3) ^ bsl_dup)
    891      1.1  mrg (define_expand "@aarch64_sve2_bsl<mode>"
    892      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
    893      1.1  mrg 	(xor:SVE_FULL_I
    894      1.1  mrg 	  (and:SVE_FULL_I
    895      1.1  mrg 	    (xor:SVE_FULL_I
    896      1.1  mrg 	      (match_operand:SVE_FULL_I 1 "register_operand")
    897      1.1  mrg 	      (match_operand:SVE_FULL_I 2 "register_operand"))
    898      1.1  mrg 	    (match_operand:SVE_FULL_I 3 "register_operand"))
    899      1.1  mrg 	  (match_dup 2)))]
    900      1.1  mrg   "TARGET_SVE2"
    901      1.1  mrg )
    902      1.1  mrg 
    903      1.1  mrg (define_insn "*aarch64_sve2_bsl<mode>"
    904      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    905      1.1  mrg 	(xor:SVE_FULL_I
    906      1.1  mrg 	  (and:SVE_FULL_I
    907      1.1  mrg 	    (xor:SVE_FULL_I
    908      1.1  mrg 	      (match_operand:SVE_FULL_I 1 "register_operand" "<bsl_1st>, w")
    909      1.1  mrg 	      (match_operand:SVE_FULL_I 2 "register_operand" "<bsl_2nd>, w"))
    910      1.1  mrg 	    (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))
    911      1.1  mrg 	  (match_dup BSL_DUP)))]
    912      1.1  mrg   "TARGET_SVE2"
    913      1.1  mrg   "@
    914      1.1  mrg   bsl\t%0.d, %0.d, %<bsl_dup>.d, %3.d
    915      1.1  mrg   movprfx\t%0, %<bsl_mov>\;bsl\t%0.d, %0.d, %<bsl_dup>.d, %3.d"
    916      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    917      1.1  mrg )
    918      1.1  mrg 
    919      1.1  mrg ;; Unpredicated bitwise inverted select.
    920      1.1  mrg ;; (~(op3 ? bsl_mov : bsl_dup)) == (~(((bsl_mov ^ bsl_dup) & op3) ^ bsl_dup))
    921      1.1  mrg (define_expand "@aarch64_sve2_nbsl<mode>"
    922      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
    923      1.1  mrg 	(unspec:SVE_FULL_I
    924      1.1  mrg 	  [(match_dup 4)
    925      1.1  mrg 	   (not:SVE_FULL_I
    926      1.1  mrg 	     (xor:SVE_FULL_I
    927      1.1  mrg 	       (and:SVE_FULL_I
    928      1.1  mrg 		 (xor:SVE_FULL_I
    929      1.1  mrg 		   (match_operand:SVE_FULL_I 1 "register_operand")
    930      1.1  mrg 		   (match_operand:SVE_FULL_I 2 "register_operand"))
    931      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand"))
    932      1.1  mrg 	       (match_dup 2)))]
    933      1.1  mrg 	  UNSPEC_PRED_X))]
    934      1.1  mrg   "TARGET_SVE2"
    935      1.1  mrg   {
    936      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
    937      1.1  mrg   }
    938      1.1  mrg )
    939      1.1  mrg 
    940      1.1  mrg (define_insn_and_rewrite "*aarch64_sve2_nbsl<mode>"
    941      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    942      1.1  mrg 	(unspec:SVE_FULL_I
    943      1.1  mrg 	  [(match_operand 4)
    944      1.1  mrg 	   (not:SVE_FULL_I
    945      1.1  mrg 	     (xor:SVE_FULL_I
    946      1.1  mrg 	       (and:SVE_FULL_I
    947      1.1  mrg 		 (xor:SVE_FULL_I
    948      1.1  mrg 		   (match_operand:SVE_FULL_I 1 "register_operand" "<bsl_1st>, w")
    949      1.1  mrg 		   (match_operand:SVE_FULL_I 2 "register_operand" "<bsl_2nd>, w"))
    950      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))
    951      1.1  mrg 	       (match_dup BSL_DUP)))]
    952      1.1  mrg 	  UNSPEC_PRED_X))]
    953      1.1  mrg   "TARGET_SVE2"
    954      1.1  mrg   "@
    955      1.1  mrg   nbsl\t%0.d, %0.d, %<bsl_dup>.d, %3.d
    956      1.1  mrg   movprfx\t%0, %<bsl_mov>\;nbsl\t%0.d, %0.d, %<bsl_dup>.d, %3.d"
    957      1.1  mrg   "&& !CONSTANT_P (operands[4])"
    958      1.1  mrg   {
    959      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
    960      1.1  mrg   }
    961      1.1  mrg   [(set_attr "movprfx" "*,yes")]
    962      1.1  mrg )
    963      1.1  mrg 
    964      1.1  mrg ;; Unpredicated bitwise select with inverted first operand.
    965      1.1  mrg ;; (op3 ? ~bsl_mov : bsl_dup) == ((~(bsl_mov ^ bsl_dup) & op3) ^ bsl_dup)
    966      1.1  mrg (define_expand "@aarch64_sve2_bsl1n<mode>"
    967      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
    968      1.1  mrg 	(xor:SVE_FULL_I
    969      1.1  mrg 	  (and:SVE_FULL_I
    970      1.1  mrg 	    (unspec:SVE_FULL_I
    971      1.1  mrg 	      [(match_dup 4)
    972      1.1  mrg 	       (not:SVE_FULL_I
    973      1.1  mrg 		 (xor:SVE_FULL_I
    974      1.1  mrg 		   (match_operand:SVE_FULL_I 1 "register_operand")
    975      1.1  mrg 		   (match_operand:SVE_FULL_I 2 "register_operand")))]
    976      1.1  mrg 	      UNSPEC_PRED_X)
    977      1.1  mrg 	    (match_operand:SVE_FULL_I 3 "register_operand"))
    978      1.1  mrg 	  (match_dup 2)))]
    979      1.1  mrg   "TARGET_SVE2"
    980      1.1  mrg   {
    981      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
    982      1.1  mrg   }
    983      1.1  mrg )
    984      1.1  mrg 
    985      1.1  mrg (define_insn_and_rewrite "*aarch64_sve2_bsl1n<mode>"
    986      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
    987      1.1  mrg 	(xor:SVE_FULL_I
    988      1.1  mrg 	  (and:SVE_FULL_I
    989      1.1  mrg 	    (unspec:SVE_FULL_I
    990      1.1  mrg 	      [(match_operand 4)
    991      1.1  mrg 	       (not:SVE_FULL_I
    992      1.1  mrg 		 (xor:SVE_FULL_I
    993      1.1  mrg 		   (match_operand:SVE_FULL_I 1 "register_operand" "<bsl_1st>, w")
    994      1.1  mrg 		   (match_operand:SVE_FULL_I 2 "register_operand" "<bsl_2nd>, w")))]
    995      1.1  mrg 	      UNSPEC_PRED_X)
    996      1.1  mrg 	    (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))
    997      1.1  mrg 	  (match_dup BSL_DUP)))]
    998      1.1  mrg   "TARGET_SVE2"
    999      1.1  mrg   "@
   1000      1.1  mrg   bsl1n\t%0.d, %0.d, %<bsl_dup>.d, %3.d
   1001      1.1  mrg   movprfx\t%0, %<bsl_mov>\;bsl1n\t%0.d, %0.d, %<bsl_dup>.d, %3.d"
   1002      1.1  mrg   "&& !CONSTANT_P (operands[4])"
   1003      1.1  mrg   {
   1004      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
   1005      1.1  mrg   }
   1006      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1007      1.1  mrg )
   1008      1.1  mrg 
   1009      1.1  mrg ;; Unpredicated bitwise select with inverted second operand.
   1010      1.1  mrg ;; (bsl_dup ? bsl_mov : ~op3) == ((bsl_dup & bsl_mov) | (~op3 & ~bsl_dup))
   1011      1.1  mrg (define_expand "@aarch64_sve2_bsl2n<mode>"
   1012      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
   1013      1.1  mrg 	(ior:SVE_FULL_I
   1014      1.1  mrg 	  (and:SVE_FULL_I
   1015      1.1  mrg 	    (match_operand:SVE_FULL_I 1 "register_operand")
   1016      1.1  mrg 	    (match_operand:SVE_FULL_I 3 "register_operand"))
   1017      1.1  mrg 	  (unspec:SVE_FULL_I
   1018      1.1  mrg 	    [(match_dup 4)
   1019      1.1  mrg 	     (and:SVE_FULL_I
   1020      1.1  mrg 	       (not:SVE_FULL_I
   1021      1.1  mrg 		 (match_operand:SVE_FULL_I 2 "register_operand"))
   1022      1.1  mrg 	       (not:SVE_FULL_I
   1023      1.1  mrg 		 (match_dup 3)))]
   1024      1.1  mrg 	    UNSPEC_PRED_X)))]
   1025      1.1  mrg   "TARGET_SVE2"
   1026      1.1  mrg   {
   1027      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
   1028      1.1  mrg   }
   1029      1.1  mrg )
   1030      1.1  mrg 
   1031      1.1  mrg (define_insn_and_rewrite "*aarch64_sve2_bsl2n<mode>"
   1032      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
   1033      1.1  mrg 	(ior:SVE_FULL_I
   1034      1.1  mrg 	  (and:SVE_FULL_I
   1035      1.1  mrg 	    (match_operand:SVE_FULL_I 1 "register_operand" "<bsl_1st>, w")
   1036      1.1  mrg 	    (match_operand:SVE_FULL_I 2 "register_operand" "<bsl_2nd>, w"))
   1037      1.1  mrg 	  (unspec:SVE_FULL_I
   1038      1.1  mrg 	    [(match_operand 4)
   1039      1.1  mrg 	     (and:SVE_FULL_I
   1040      1.1  mrg 	       (not:SVE_FULL_I
   1041      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))
   1042      1.1  mrg 	       (not:SVE_FULL_I
   1043      1.1  mrg 		 (match_dup BSL_DUP)))]
   1044      1.1  mrg 	    UNSPEC_PRED_X)))]
   1045      1.1  mrg   "TARGET_SVE2"
   1046      1.1  mrg   "@
   1047      1.1  mrg   bsl2n\t%0.d, %0.d, %3.d, %<bsl_dup>.d
   1048      1.1  mrg   movprfx\t%0, %<bsl_mov>\;bsl2n\t%0.d, %0.d, %3.d, %<bsl_dup>.d"
   1049      1.1  mrg   "&& !CONSTANT_P (operands[4])"
   1050      1.1  mrg   {
   1051      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
   1052      1.1  mrg   }
   1053      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1054      1.1  mrg )
   1055      1.1  mrg 
   1056      1.1  mrg ;; Unpredicated bitwise select with inverted second operand, alternative form.
   1057      1.1  mrg ;; (bsl_dup ? bsl_mov : ~op3) == ((bsl_dup & bsl_mov) | (~bsl_dup & ~op3))
   1058      1.1  mrg (define_insn_and_rewrite "*aarch64_sve2_bsl2n<mode>"
   1059      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
   1060      1.1  mrg 	(ior:SVE_FULL_I
   1061      1.1  mrg 	  (and:SVE_FULL_I
   1062      1.1  mrg 	    (match_operand:SVE_FULL_I 1 "register_operand" "<bsl_1st>, w")
   1063      1.1  mrg 	    (match_operand:SVE_FULL_I 2 "register_operand" "<bsl_2nd>, w"))
   1064      1.1  mrg 	  (unspec:SVE_FULL_I
   1065      1.1  mrg 	    [(match_operand 4)
   1066      1.1  mrg 	     (and:SVE_FULL_I
   1067      1.1  mrg 	       (not:SVE_FULL_I
   1068      1.1  mrg 		 (match_dup BSL_DUP))
   1069      1.1  mrg 	       (not:SVE_FULL_I
   1070      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "w, w")))]
   1071      1.1  mrg 	    UNSPEC_PRED_X)))]
   1072      1.1  mrg   "TARGET_SVE2"
   1073      1.1  mrg   "@
   1074      1.1  mrg   bsl2n\t%0.d, %0.d, %3.d, %<bsl_dup>.d
   1075      1.1  mrg   movprfx\t%0, %<bsl_mov>\;bsl2n\t%0.d, %0.d, %3.d, %<bsl_dup>.d"
   1076      1.1  mrg   "&& !CONSTANT_P (operands[4])"
   1077      1.1  mrg   {
   1078      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
   1079      1.1  mrg   }
   1080      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1081      1.1  mrg )
   1082      1.1  mrg 
   1083      1.1  mrg ;; -------------------------------------------------------------------------
   1084      1.1  mrg ;; ---- [INT] Shift-and-accumulate operations
   1085      1.1  mrg ;; -------------------------------------------------------------------------
   1086      1.1  mrg ;; Includes:
   1087      1.1  mrg ;; - SRSRA
   1088      1.1  mrg ;; - SSRA
   1089      1.1  mrg ;; - URSRA
   1090      1.1  mrg ;; - USRA
   1091      1.1  mrg ;; -------------------------------------------------------------------------
   1092      1.1  mrg 
   1093      1.1  mrg ;; Provide the natural unpredicated interface for SSRA and USRA.
   1094      1.1  mrg (define_expand "@aarch64_sve_add_<sve_int_op><mode>"
   1095      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
   1096      1.1  mrg 	(plus:SVE_FULL_I
   1097      1.1  mrg 	  (unspec:SVE_FULL_I
   1098      1.1  mrg 	    [(match_dup 4)
   1099      1.1  mrg 	     (SHIFTRT:SVE_FULL_I
   1100      1.1  mrg 	       (match_operand:SVE_FULL_I 2 "register_operand")
   1101      1.1  mrg 	       (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm"))]
   1102      1.1  mrg 	    UNSPEC_PRED_X)
   1103      1.1  mrg 	 (match_operand:SVE_FULL_I 1 "register_operand")))]
   1104      1.1  mrg   "TARGET_SVE2"
   1105      1.1  mrg   {
   1106      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
   1107      1.1  mrg   }
   1108      1.1  mrg )
   1109      1.1  mrg 
   1110      1.1  mrg ;; Pattern-match SSRA and USRA as a predicated operation whose predicate
   1111      1.1  mrg ;; isn't needed.
   1112      1.1  mrg (define_insn_and_rewrite "*aarch64_sve2_sra<mode>"
   1113      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
   1114      1.1  mrg 	(plus:SVE_FULL_I
   1115      1.1  mrg 	  (unspec:SVE_FULL_I
   1116      1.1  mrg 	    [(match_operand 4)
   1117      1.1  mrg 	     (SHIFTRT:SVE_FULL_I
   1118      1.1  mrg 	       (match_operand:SVE_FULL_I 2 "register_operand" "w, w")
   1119      1.1  mrg 	       (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm"))]
   1120      1.1  mrg 	    UNSPEC_PRED_X)
   1121      1.1  mrg 	 (match_operand:SVE_FULL_I 1 "register_operand" "0, w")))]
   1122      1.1  mrg   "TARGET_SVE2"
   1123      1.1  mrg   "@
   1124      1.1  mrg    <sra_op>sra\t%0.<Vetype>, %2.<Vetype>, #%3
   1125      1.1  mrg    movprfx\t%0, %1\;<sra_op>sra\t%0.<Vetype>, %2.<Vetype>, #%3"
   1126      1.1  mrg   "&& !CONSTANT_P (operands[4])"
   1127      1.1  mrg   {
   1128      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
   1129      1.1  mrg   }
   1130      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1131      1.1  mrg )
   1132      1.1  mrg 
   1133      1.1  mrg ;; SRSRA and URSRA.
   1134      1.1  mrg (define_insn "@aarch64_sve_add_<sve_int_op><mode>"
   1135      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
   1136      1.1  mrg 	(plus:SVE_FULL_I
   1137      1.1  mrg 	  (unspec:SVE_FULL_I
   1138      1.1  mrg 	    [(match_operand:SVE_FULL_I 2 "register_operand" "w, w")
   1139      1.1  mrg 	     (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm")]
   1140      1.1  mrg 	    VRSHR_N)
   1141      1.1  mrg 	 (match_operand:SVE_FULL_I 1 "register_operand" "0, w")))]
   1142      1.1  mrg   "TARGET_SVE2"
   1143      1.1  mrg   "@
   1144      1.1  mrg    <sur>sra\t%0.<Vetype>, %2.<Vetype>, #%3
   1145      1.1  mrg    movprfx\t%0, %1\;<sur>sra\t%0.<Vetype>, %2.<Vetype>, #%3"
   1146      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1147      1.1  mrg )
   1148      1.1  mrg 
   1149      1.1  mrg ;; -------------------------------------------------------------------------
   1150      1.1  mrg ;; ---- [INT] Shift-and-insert operations
   1151      1.1  mrg ;; -------------------------------------------------------------------------
   1152      1.1  mrg ;; Includes:
   1153      1.1  mrg ;; - SLI
   1154      1.1  mrg ;; - SRI
   1155      1.1  mrg ;; -------------------------------------------------------------------------
   1156      1.1  mrg 
   1157      1.1  mrg ;; These instructions do not take MOVPRFX.
   1158      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   1159      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w")
   1160      1.1  mrg 	(unspec:SVE_FULL_I
   1161      1.1  mrg 	  [(match_operand:SVE_FULL_I 1 "register_operand" "0")
   1162      1.1  mrg 	   (match_operand:SVE_FULL_I 2 "register_operand" "w")
   1163      1.1  mrg 	   (match_operand:SVE_FULL_I 3 "aarch64_simd_<lr>shift_imm")]
   1164      1.1  mrg 	  SVE2_INT_SHIFT_INSERT))]
   1165      1.1  mrg   "TARGET_SVE2"
   1166      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %2.<Vetype>, #%3"
   1167      1.1  mrg )
   1168      1.1  mrg 
   1169      1.1  mrg ;; -------------------------------------------------------------------------
   1170      1.1  mrg ;; ---- [INT] Sum of absolute differences
   1171      1.1  mrg ;; -------------------------------------------------------------------------
   1172      1.1  mrg ;; Includes:
   1173      1.1  mrg ;; - SABA
   1174      1.1  mrg ;; - UABA
   1175      1.1  mrg ;; -------------------------------------------------------------------------
   1176      1.1  mrg 
   1177      1.1  mrg ;; Provide the natural unpredicated interface for SABA and UABA.
   1178      1.1  mrg (define_expand "@aarch64_sve2_<su>aba<mode>"
   1179      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
   1180      1.1  mrg 	(plus:SVE_FULL_I
   1181      1.1  mrg 	  (minus:SVE_FULL_I
   1182      1.1  mrg 	    (unspec:SVE_FULL_I
   1183      1.1  mrg 	      [(match_dup 4)
   1184      1.1  mrg 	       (USMAX:SVE_FULL_I
   1185      1.1  mrg 		 (match_operand:SVE_FULL_I 2 "register_operand" "w, w")
   1186      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))]
   1187      1.1  mrg 	      UNSPEC_PRED_X)
   1188      1.1  mrg 	    (unspec:SVE_FULL_I
   1189      1.1  mrg 	      [(match_dup 4)
   1190      1.1  mrg 	       (<max_opp>:SVE_FULL_I
   1191      1.1  mrg 		 (match_dup 2)
   1192      1.1  mrg 		 (match_dup 3))]
   1193      1.1  mrg 	      UNSPEC_PRED_X))
   1194      1.1  mrg 	  (match_operand:SVE_FULL_I 1 "register_operand" "0, w")))]
   1195      1.1  mrg   "TARGET_SVE2"
   1196      1.1  mrg   {
   1197      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
   1198      1.1  mrg   }
   1199      1.1  mrg )
   1200      1.1  mrg 
   1201      1.1  mrg ;; Pattern-match SABA and UABA as an absolute-difference-and-accumulate
   1202      1.1  mrg ;; operation whose predicates aren't needed.
   1203      1.1  mrg (define_insn "*aarch64_sve2_<su>aba<mode>"
   1204      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
   1205      1.1  mrg 	(plus:SVE_FULL_I
   1206      1.1  mrg 	  (minus:SVE_FULL_I
   1207      1.1  mrg 	    (unspec:SVE_FULL_I
   1208      1.1  mrg 	      [(match_operand 4)
   1209      1.1  mrg 	       (USMAX:SVE_FULL_I
   1210      1.1  mrg 		 (match_operand:SVE_FULL_I 2 "register_operand" "w, w")
   1211      1.1  mrg 		 (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))]
   1212      1.1  mrg 	      UNSPEC_PRED_X)
   1213      1.1  mrg 	    (unspec:SVE_FULL_I
   1214      1.1  mrg 	      [(match_operand 5)
   1215      1.1  mrg 	       (<max_opp>:SVE_FULL_I
   1216      1.1  mrg 		 (match_dup 2)
   1217      1.1  mrg 		 (match_dup 3))]
   1218      1.1  mrg 	      UNSPEC_PRED_X))
   1219      1.1  mrg 	  (match_operand:SVE_FULL_I 1 "register_operand" "0, w")))]
   1220      1.1  mrg   "TARGET_SVE2"
   1221      1.1  mrg   "@
   1222      1.1  mrg    <su>aba\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>
   1223      1.1  mrg    movprfx\t%0, %1\;<su>aba\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>"
   1224      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1225      1.1  mrg )
   1226      1.1  mrg 
   1227      1.1  mrg ;; =========================================================================
   1228      1.1  mrg ;; == Extending arithmetic
   1229      1.1  mrg ;; =========================================================================
   1230      1.1  mrg 
   1231      1.1  mrg ;; -------------------------------------------------------------------------
   1232      1.1  mrg ;; ---- [INT] Wide binary arithmetic
   1233      1.1  mrg ;; -------------------------------------------------------------------------
   1234      1.1  mrg ;; Includes:
   1235      1.1  mrg ;; - SADDWB
   1236      1.1  mrg ;; - SADDWT
   1237      1.1  mrg ;; - SSUBWB
   1238      1.1  mrg ;; - SSUBWT
   1239      1.1  mrg ;; - UADDWB
   1240      1.1  mrg ;; - UADDWT
   1241      1.1  mrg ;; - USUBWB
   1242      1.1  mrg ;; - USUBWT
   1243      1.1  mrg ;; -------------------------------------------------------------------------
   1244      1.1  mrg 
   1245      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   1246      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w")
   1247      1.1  mrg 	(unspec:SVE_FULL_HSDI
   1248      1.1  mrg 	  [(match_operand:SVE_FULL_HSDI 1 "register_operand" "w")
   1249      1.1  mrg 	   (match_operand:<VNARROW> 2 "register_operand" "w")]
   1250      1.1  mrg 	  SVE2_INT_BINARY_WIDE))]
   1251      1.1  mrg   "TARGET_SVE2"
   1252      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Ventype>"
   1253      1.1  mrg )
   1254      1.1  mrg 
   1255      1.1  mrg ;; -------------------------------------------------------------------------
   1256      1.1  mrg ;; ---- [INT] Long binary arithmetic
   1257      1.1  mrg ;; -------------------------------------------------------------------------
   1258      1.1  mrg ;; Includes:
   1259      1.1  mrg ;; - SABDLB
   1260      1.1  mrg ;; - SABDLT
   1261      1.1  mrg ;; - SADDLB
   1262      1.1  mrg ;; - SADDLBT
   1263      1.1  mrg ;; - SADDLT
   1264      1.1  mrg ;; - SMULLB
   1265      1.1  mrg ;; - SMULLT
   1266      1.1  mrg ;; - SQDMULLB
   1267      1.1  mrg ;; - SQDMULLT
   1268      1.1  mrg ;; - SSUBLB
   1269      1.1  mrg ;; - SSUBLBT
   1270      1.1  mrg ;; - SSUBLT
   1271      1.1  mrg ;; - SSUBLTB
   1272      1.1  mrg ;; - UABDLB
   1273      1.1  mrg ;; - UABDLT
   1274      1.1  mrg ;; - UADDLB
   1275      1.1  mrg ;; - UADDLT
   1276      1.1  mrg ;; - UMULLB
   1277      1.1  mrg ;; - UMULLT
   1278      1.1  mrg ;; - USUBLB
   1279      1.1  mrg ;; - USUBLT
   1280      1.1  mrg ;; -------------------------------------------------------------------------
   1281      1.1  mrg 
   1282      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   1283      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w")
   1284      1.1  mrg 	(unspec:SVE_FULL_HSDI
   1285      1.1  mrg 	  [(match_operand:<VNARROW> 1 "register_operand" "w")
   1286      1.1  mrg 	   (match_operand:<VNARROW> 2 "register_operand" "w")]
   1287      1.1  mrg 	  SVE2_INT_BINARY_LONG))]
   1288      1.1  mrg   "TARGET_SVE2"
   1289      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>"
   1290      1.1  mrg )
   1291      1.1  mrg 
   1292      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op>_lane_<mode>"
   1293      1.1  mrg   [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w")
   1294      1.1  mrg 	(unspec:SVE_FULL_SDI
   1295      1.1  mrg 	  [(match_operand:<VNARROW> 1 "register_operand" "w")
   1296      1.1  mrg 	   (unspec:<VNARROW>
   1297      1.1  mrg 	     [(match_operand:<VNARROW> 2 "register_operand" "<sve_lane_con>")
   1298      1.1  mrg 	      (match_operand:SI 3 "const_int_operand")]
   1299      1.1  mrg 	     UNSPEC_SVE_LANE_SELECT)]
   1300      1.1  mrg 	  SVE2_INT_BINARY_LONG_LANE))]
   1301      1.1  mrg   "TARGET_SVE2"
   1302      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>[%3]"
   1303      1.1  mrg )
   1304      1.1  mrg 
   1305      1.1  mrg ;; -------------------------------------------------------------------------
   1306      1.1  mrg ;; ---- [INT] Long left shifts
   1307      1.1  mrg ;; -------------------------------------------------------------------------
   1308      1.1  mrg ;; Includes:
   1309      1.1  mrg ;; - SSHLLB
   1310      1.1  mrg ;; - SSHLLT
   1311      1.1  mrg ;; - USHLLB
   1312      1.1  mrg ;; - USHLLT
   1313      1.1  mrg ;; -------------------------------------------------------------------------
   1314      1.1  mrg 
   1315      1.1  mrg ;; The immediate range is enforced before generating the instruction.
   1316      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   1317      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w")
   1318      1.1  mrg 	(unspec:SVE_FULL_HSDI
   1319      1.1  mrg 	  [(match_operand:<VNARROW> 1 "register_operand" "w")
   1320      1.1  mrg 	   (match_operand:DI 2 "const_int_operand")]
   1321      1.1  mrg 	  SVE2_INT_SHIFT_IMM_LONG))]
   1322      1.1  mrg   "TARGET_SVE2"
   1323      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1.<Ventype>, #%2"
   1324      1.1  mrg )
   1325      1.1  mrg 
   1326      1.1  mrg ;; -------------------------------------------------------------------------
   1327      1.1  mrg ;; ---- [INT] Long binary arithmetic with accumulation
   1328      1.1  mrg ;; -------------------------------------------------------------------------
   1329      1.1  mrg ;; Includes:
   1330      1.1  mrg ;; - SABALB
   1331      1.1  mrg ;; - SABALT
   1332      1.1  mrg ;; - SMLALB
   1333      1.1  mrg ;; - SMLALT
   1334      1.1  mrg ;; - SMLSLB
   1335      1.1  mrg ;; - SMLSLT
   1336      1.1  mrg ;; - SQDMLALB
   1337      1.1  mrg ;; - SQDMLALBT
   1338      1.1  mrg ;; - SQDMLALT
   1339      1.1  mrg ;; - SQDMLSLB
   1340      1.1  mrg ;; - SQDMLSLBT
   1341      1.1  mrg ;; - SQDMLSLT
   1342      1.1  mrg ;; - UABALB
   1343      1.1  mrg ;; - UABALT
   1344      1.1  mrg ;; - UMLALB
   1345      1.1  mrg ;; - UMLALT
   1346      1.1  mrg ;; - UMLSLB
   1347      1.1  mrg ;; - UMLSLT
   1348      1.1  mrg ;; -------------------------------------------------------------------------
   1349      1.1  mrg 
   1350      1.1  mrg ;; Non-saturating MLA operations.
   1351      1.1  mrg (define_insn "@aarch64_sve_add_<sve_int_op><mode>"
   1352      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
   1353      1.1  mrg 	(plus:SVE_FULL_HSDI
   1354      1.1  mrg 	  (unspec:SVE_FULL_HSDI
   1355      1.1  mrg 	    [(match_operand:<VNARROW> 2 "register_operand" "w, w")
   1356      1.1  mrg 	     (match_operand:<VNARROW> 3 "register_operand" "w, w")]
   1357      1.1  mrg 	    SVE2_INT_ADD_BINARY_LONG)
   1358      1.1  mrg 	  (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")))]
   1359      1.1  mrg   "TARGET_SVE2"
   1360      1.1  mrg   "@
   1361      1.1  mrg    <sve_int_add_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>
   1362      1.1  mrg    movprfx\t%0, %1\;<sve_int_add_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>"
   1363      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1364      1.1  mrg )
   1365      1.1  mrg 
   1366      1.1  mrg ;; Non-saturating MLA operations with lane select.
   1367      1.1  mrg (define_insn "@aarch64_sve_add_<sve_int_op>_lane_<mode>"
   1368      1.1  mrg   [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
   1369      1.1  mrg 	(plus:SVE_FULL_SDI
   1370      1.1  mrg 	  (unspec:SVE_FULL_SDI
   1371      1.1  mrg 	    [(match_operand:<VNARROW> 2 "register_operand" "w, w")
   1372      1.1  mrg 	     (unspec:<VNARROW>
   1373      1.1  mrg 	       [(match_operand:<VNARROW> 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
   1374      1.1  mrg 		(match_operand:SI 4 "const_int_operand")]
   1375      1.1  mrg 	       UNSPEC_SVE_LANE_SELECT)]
   1376      1.1  mrg 	    SVE2_INT_ADD_BINARY_LONG_LANE)
   1377      1.1  mrg 	  (match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")))]
   1378      1.1  mrg   "TARGET_SVE2"
   1379      1.1  mrg   "@
   1380      1.1  mrg    <sve_int_add_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]
   1381      1.1  mrg    movprfx\t%0, %1\;<sve_int_add_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]"
   1382      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1383      1.1  mrg )
   1384      1.1  mrg 
   1385      1.1  mrg ;; Saturating MLA operations.
   1386      1.1  mrg (define_insn "@aarch64_sve_qadd_<sve_int_op><mode>"
   1387      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
   1388      1.1  mrg 	(ss_plus:SVE_FULL_HSDI
   1389      1.1  mrg 	  (unspec:SVE_FULL_HSDI
   1390      1.1  mrg 	    [(match_operand:<VNARROW> 2 "register_operand" "w, w")
   1391      1.1  mrg 	     (match_operand:<VNARROW> 3 "register_operand" "w, w")]
   1392      1.1  mrg 	    SVE2_INT_QADD_BINARY_LONG)
   1393      1.1  mrg 	  (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")))]
   1394      1.1  mrg   "TARGET_SVE2"
   1395      1.1  mrg   "@
   1396      1.1  mrg    <sve_int_qadd_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>
   1397      1.1  mrg    movprfx\t%0, %1\;<sve_int_qadd_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>"
   1398      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1399      1.1  mrg )
   1400      1.1  mrg 
   1401      1.1  mrg ;; Saturating MLA operations with lane select.
   1402      1.1  mrg (define_insn "@aarch64_sve_qadd_<sve_int_op>_lane_<mode>"
   1403      1.1  mrg   [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
   1404      1.1  mrg 	(ss_plus:SVE_FULL_SDI
   1405      1.1  mrg 	  (unspec:SVE_FULL_SDI
   1406      1.1  mrg 	    [(match_operand:<VNARROW> 2 "register_operand" "w, w")
   1407      1.1  mrg 	     (unspec:<VNARROW>
   1408      1.1  mrg 	       [(match_operand:<VNARROW> 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
   1409      1.1  mrg 		(match_operand:SI 4 "const_int_operand")]
   1410      1.1  mrg 	       UNSPEC_SVE_LANE_SELECT)]
   1411      1.1  mrg 	    SVE2_INT_QADD_BINARY_LONG_LANE)
   1412      1.1  mrg 	  (match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")))]
   1413      1.1  mrg   "TARGET_SVE2"
   1414      1.1  mrg   "@
   1415      1.1  mrg    <sve_int_qadd_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]
   1416      1.1  mrg    movprfx\t%0, %1\;<sve_int_qadd_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]"
   1417      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1418      1.1  mrg )
   1419      1.1  mrg 
   1420      1.1  mrg ;; Non-saturating MLS operations.
   1421      1.1  mrg (define_insn "@aarch64_sve_sub_<sve_int_op><mode>"
   1422      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
   1423      1.1  mrg 	(minus:SVE_FULL_HSDI
   1424      1.1  mrg 	  (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")
   1425      1.1  mrg 	  (unspec:SVE_FULL_HSDI
   1426      1.1  mrg 	    [(match_operand:<VNARROW> 2 "register_operand" "w, w")
   1427      1.1  mrg 	     (match_operand:<VNARROW> 3 "register_operand" "w, w")]
   1428      1.1  mrg 	    SVE2_INT_SUB_BINARY_LONG)))]
   1429      1.1  mrg   "TARGET_SVE2"
   1430      1.1  mrg   "@
   1431      1.1  mrg    <sve_int_sub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>
   1432      1.1  mrg    movprfx\t%0, %1\;<sve_int_sub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>"
   1433      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1434      1.1  mrg )
   1435      1.1  mrg 
   1436      1.1  mrg ;; Non-saturating MLS operations with lane select.
   1437      1.1  mrg (define_insn "@aarch64_sve_sub_<sve_int_op>_lane_<mode>"
   1438      1.1  mrg   [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
   1439      1.1  mrg 	(minus:SVE_FULL_SDI
   1440      1.1  mrg 	  (match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")
   1441      1.1  mrg 	  (unspec:SVE_FULL_SDI
   1442      1.1  mrg 	    [(match_operand:<VNARROW> 2 "register_operand" "w, w")
   1443      1.1  mrg 	     (unspec:<VNARROW>
   1444      1.1  mrg 	       [(match_operand:<VNARROW> 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
   1445      1.1  mrg 		(match_operand:SI 4 "const_int_operand")]
   1446      1.1  mrg 	       UNSPEC_SVE_LANE_SELECT)]
   1447      1.1  mrg 	    SVE2_INT_SUB_BINARY_LONG_LANE)))]
   1448      1.1  mrg   "TARGET_SVE2"
   1449      1.1  mrg   "@
   1450      1.1  mrg    <sve_int_sub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]
   1451      1.1  mrg    movprfx\t%0, %1\;<sve_int_sub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]"
   1452      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1453      1.1  mrg )
   1454      1.1  mrg 
   1455      1.1  mrg ;; Saturating MLS operations.
   1456      1.1  mrg (define_insn "@aarch64_sve_qsub_<sve_int_op><mode>"
   1457      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
   1458      1.1  mrg 	(ss_minus:SVE_FULL_HSDI
   1459      1.1  mrg 	  (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")
   1460      1.1  mrg 	  (unspec:SVE_FULL_HSDI
   1461      1.1  mrg 	    [(match_operand:<VNARROW> 2 "register_operand" "w, w")
   1462      1.1  mrg 	     (match_operand:<VNARROW> 3 "register_operand" "w, w")]
   1463      1.1  mrg 	    SVE2_INT_QSUB_BINARY_LONG)))]
   1464      1.1  mrg   "TARGET_SVE2"
   1465      1.1  mrg   "@
   1466      1.1  mrg    <sve_int_qsub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>
   1467      1.1  mrg    movprfx\t%0, %1\;<sve_int_qsub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>"
   1468      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1469      1.1  mrg )
   1470      1.1  mrg 
   1471      1.1  mrg ;; Saturating MLS operations with lane select.
   1472      1.1  mrg (define_insn "@aarch64_sve_qsub_<sve_int_op>_lane_<mode>"
   1473      1.1  mrg   [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
   1474      1.1  mrg 	(ss_minus:SVE_FULL_SDI
   1475      1.1  mrg 	  (match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")
   1476      1.1  mrg 	  (unspec:SVE_FULL_SDI
   1477      1.1  mrg 	    [(match_operand:<VNARROW> 2 "register_operand" "w, w")
   1478      1.1  mrg 	     (unspec:<VNARROW>
   1479      1.1  mrg 	       [(match_operand:<VNARROW> 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
   1480      1.1  mrg 		(match_operand:SI 4 "const_int_operand")]
   1481      1.1  mrg 	       UNSPEC_SVE_LANE_SELECT)]
   1482      1.1  mrg 	    SVE2_INT_QSUB_BINARY_LONG_LANE)))]
   1483      1.1  mrg   "TARGET_SVE2"
   1484      1.1  mrg   "@
   1485      1.1  mrg    <sve_int_qsub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]
   1486      1.1  mrg    movprfx\t%0, %1\;<sve_int_qsub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]"
   1487      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1488      1.1  mrg )
   1489      1.1  mrg ;; -------------------------------------------------------------------------
   1490      1.1  mrg ;; ---- [FP] Long multiplication with accumulation
   1491      1.1  mrg ;; -------------------------------------------------------------------------
   1492      1.1  mrg ;; Includes:
   1493      1.1  mrg ;; - FMLALB
   1494      1.1  mrg ;; - FMLALT
   1495      1.1  mrg ;; - FMLSLB
   1496      1.1  mrg ;; - FMLSLT
   1497      1.1  mrg ;; -------------------------------------------------------------------------
   1498      1.1  mrg 
   1499      1.1  mrg (define_insn "@aarch64_sve_<sve_fp_op><mode>"
   1500      1.1  mrg   [(set (match_operand:VNx4SF_ONLY 0 "register_operand" "=w, ?&w")
   1501      1.1  mrg 	(unspec:VNx4SF_ONLY
   1502      1.1  mrg 	  [(match_operand:<VNARROW> 1 "register_operand" "w, w")
   1503      1.1  mrg 	   (match_operand:<VNARROW> 2 "register_operand" "w, w")
   1504      1.1  mrg 	   (match_operand:VNx4SF_ONLY 3 "register_operand" "0, w")]
   1505      1.1  mrg 	  SVE2_FP_TERNARY_LONG))]
   1506      1.1  mrg   "TARGET_SVE2"
   1507      1.1  mrg   "@
   1508      1.1  mrg    <sve_fp_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>
   1509      1.1  mrg    movprfx\t%0, %3\;<sve_fp_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>"
   1510      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1511      1.1  mrg )
   1512      1.1  mrg 
   1513      1.1  mrg (define_insn "@aarch64_<sve_fp_op>_lane_<mode>"
   1514      1.1  mrg   [(set (match_operand:VNx4SF_ONLY 0 "register_operand" "=w, ?&w")
   1515      1.1  mrg 	(unspec:VNx4SF_ONLY
   1516      1.1  mrg 	  [(match_operand:<VNARROW> 1 "register_operand" "w, w")
   1517      1.1  mrg 	   (unspec:<VNARROW>
   1518      1.1  mrg 	     [(match_operand:<VNARROW> 2 "register_operand" "<sve_lane_con>, <sve_lane_con>")
   1519      1.1  mrg 	      (match_operand:SI 3 "const_int_operand")]
   1520      1.1  mrg 	     UNSPEC_SVE_LANE_SELECT)
   1521      1.1  mrg 	   (match_operand:VNx4SF_ONLY 4 "register_operand" "0, w")]
   1522      1.1  mrg 	  SVE2_FP_TERNARY_LONG_LANE))]
   1523      1.1  mrg   "TARGET_SVE2"
   1524      1.1  mrg   "@
   1525      1.1  mrg    <sve_fp_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>[%3]
   1526      1.1  mrg    movprfx\t%0, %4\;<sve_fp_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>[%3]"
   1527      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1528      1.1  mrg )
   1529      1.1  mrg 
   1530      1.1  mrg ;; =========================================================================
   1531      1.1  mrg ;; == Narrowing arithnetic
   1532      1.1  mrg ;; =========================================================================
   1533      1.1  mrg 
   1534      1.1  mrg ;; -------------------------------------------------------------------------
   1535      1.1  mrg ;; ---- [INT] Narrowing unary arithmetic
   1536      1.1  mrg ;; -------------------------------------------------------------------------
   1537      1.1  mrg ;; Includes:
   1538      1.1  mrg ;; - SQXTNB
   1539      1.1  mrg ;; - SQXTNT
   1540      1.1  mrg ;; - SQXTUNB
   1541      1.1  mrg ;; - SQXTUNT
   1542      1.1  mrg ;; - UQXTNB
   1543      1.1  mrg ;; - UQXTNT
   1544      1.1  mrg ;; -------------------------------------------------------------------------
   1545      1.1  mrg 
   1546      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   1547      1.1  mrg   [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
   1548      1.1  mrg 	(unspec:<VNARROW>
   1549      1.1  mrg 	  [(match_operand:SVE_FULL_HSDI 1 "register_operand" "w")]
   1550      1.1  mrg 	  SVE2_INT_UNARY_NARROWB))]
   1551      1.1  mrg   "TARGET_SVE2"
   1552      1.1  mrg   "<sve_int_op>\t%0.<Ventype>, %1.<Vetype>"
   1553      1.1  mrg )
   1554      1.1  mrg 
   1555      1.1  mrg ;; These instructions do not take MOVPRFX.
   1556      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   1557      1.1  mrg   [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
   1558      1.1  mrg 	(unspec:<VNARROW>
   1559      1.1  mrg 	  [(match_operand:<VNARROW> 1 "register_operand" "0")
   1560      1.1  mrg 	   (match_operand:SVE_FULL_HSDI 2 "register_operand" "w")]
   1561      1.1  mrg 	  SVE2_INT_UNARY_NARROWT))]
   1562      1.1  mrg   "TARGET_SVE2"
   1563      1.1  mrg   "<sve_int_op>\t%0.<Ventype>, %2.<Vetype>"
   1564      1.1  mrg )
   1565      1.1  mrg 
   1566      1.1  mrg ;; -------------------------------------------------------------------------
   1567      1.1  mrg ;; ---- [INT] Narrowing binary arithmetic
   1568      1.1  mrg ;; -------------------------------------------------------------------------
   1569      1.1  mrg ;; Includes:
   1570      1.1  mrg ;; - ADDHNB
   1571      1.1  mrg ;; - ADDHNT
   1572      1.1  mrg ;; - RADDHNB
   1573      1.1  mrg ;; - RADDHNT
   1574      1.1  mrg ;; - RSUBHNB
   1575      1.1  mrg ;; - RSUBHNT
   1576      1.1  mrg ;; - SUBHNB
   1577      1.1  mrg ;; - SUBHNT
   1578      1.1  mrg ;; -------------------------------------------------------------------------
   1579      1.1  mrg 
   1580      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   1581      1.1  mrg   [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
   1582      1.1  mrg 	(unspec:<VNARROW>
   1583      1.1  mrg 	  [(match_operand:SVE_FULL_HSDI 1 "register_operand" "w")
   1584      1.1  mrg 	   (match_operand:SVE_FULL_HSDI 2 "register_operand" "w")]
   1585      1.1  mrg 	  SVE2_INT_BINARY_NARROWB))]
   1586      1.1  mrg   "TARGET_SVE2"
   1587      1.1  mrg   "<sve_int_op>\t%0.<Ventype>, %1.<Vetype>, %2.<Vetype>"
   1588      1.1  mrg )
   1589      1.1  mrg 
   1590      1.1  mrg ;; These instructions do not take MOVPRFX.
   1591      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   1592      1.1  mrg   [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
   1593      1.1  mrg 	(unspec:<VNARROW>
   1594      1.1  mrg 	  [(match_operand:<VNARROW> 1 "register_operand" "0")
   1595      1.1  mrg 	   (match_operand:SVE_FULL_HSDI 2 "register_operand" "w")
   1596      1.1  mrg 	   (match_operand:SVE_FULL_HSDI 3 "register_operand" "w")]
   1597      1.1  mrg 	  SVE2_INT_BINARY_NARROWT))]
   1598      1.1  mrg   "TARGET_SVE2"
   1599      1.1  mrg   "<sve_int_op>\t%0.<Ventype>, %2.<Vetype>, %3.<Vetype>"
   1600      1.1  mrg )
   1601      1.1  mrg 
   1602      1.1  mrg ;; -------------------------------------------------------------------------
   1603      1.1  mrg ;; ---- [INT] Narrowing right shifts
   1604      1.1  mrg ;; -------------------------------------------------------------------------
   1605      1.1  mrg ;; Includes:
   1606      1.1  mrg ;; - RSHRNB
   1607      1.1  mrg ;; - RSHRNT
   1608      1.1  mrg ;; - SHRNB
   1609      1.1  mrg ;; - SHRNT
   1610      1.1  mrg ;; - SQRSHRNB
   1611      1.1  mrg ;; - SQRSHRNT
   1612      1.1  mrg ;; - SQRSHRUNB
   1613      1.1  mrg ;; - SQRSHRUNT
   1614      1.1  mrg ;; - SQSHRNB
   1615      1.1  mrg ;; - SQSHRNT
   1616      1.1  mrg ;; - SQSHRUNB
   1617      1.1  mrg ;; - SQSHRUNT
   1618      1.1  mrg ;; - UQRSHRNB
   1619      1.1  mrg ;; - UQRSHRNT
   1620      1.1  mrg ;; - UQSHRNB
   1621      1.1  mrg ;; - UQSHRNT
   1622      1.1  mrg ;; -------------------------------------------------------------------------
   1623      1.1  mrg 
   1624      1.1  mrg ;; The immediate range is enforced before generating the instruction.
   1625      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   1626      1.1  mrg   [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
   1627      1.1  mrg 	(unspec:<VNARROW>
   1628      1.1  mrg 	  [(match_operand:SVE_FULL_HSDI 1 "register_operand" "w")
   1629      1.1  mrg 	   (match_operand:DI 2 "const_int_operand")]
   1630      1.1  mrg 	  SVE2_INT_SHIFT_IMM_NARROWB))]
   1631      1.1  mrg   "TARGET_SVE2"
   1632      1.1  mrg   "<sve_int_op>\t%0.<Ventype>, %1.<Vetype>, #%2"
   1633      1.1  mrg )
   1634      1.1  mrg 
   1635      1.1  mrg ;; The immediate range is enforced before generating the instruction.
   1636      1.1  mrg ;; These instructions do not take MOVPRFX.
   1637      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   1638      1.1  mrg   [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
   1639      1.1  mrg 	(unspec:<VNARROW>
   1640      1.1  mrg 	  [(match_operand:<VNARROW> 1 "register_operand" "0")
   1641      1.1  mrg 	   (match_operand:SVE_FULL_HSDI 2 "register_operand" "w")
   1642      1.1  mrg 	   (match_operand:DI 3 "const_int_operand")]
   1643      1.1  mrg 	  SVE2_INT_SHIFT_IMM_NARROWT))]
   1644      1.1  mrg   "TARGET_SVE2"
   1645      1.1  mrg   "<sve_int_op>\t%0.<Ventype>, %2.<Vetype>, #%3"
   1646      1.1  mrg )
   1647      1.1  mrg 
   1648      1.1  mrg ;; =========================================================================
   1649      1.1  mrg ;; == Pairwise arithmetic
   1650      1.1  mrg ;; =========================================================================
   1651      1.1  mrg 
   1652      1.1  mrg ;; -------------------------------------------------------------------------
   1653      1.1  mrg ;; ---- [INT] Pairwise arithmetic
   1654      1.1  mrg ;; -------------------------------------------------------------------------
   1655      1.1  mrg ;; Includes:
   1656      1.1  mrg ;; - ADDP
   1657      1.1  mrg ;; - SMAXP
   1658      1.1  mrg ;; - SMINP
   1659      1.1  mrg ;; - UMAXP
   1660      1.1  mrg ;; - UMINP
   1661      1.1  mrg ;; -------------------------------------------------------------------------
   1662      1.1  mrg 
   1663      1.1  mrg (define_insn "@aarch64_pred_<sve_int_op><mode>"
   1664      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
   1665      1.1  mrg 	(unspec:SVE_FULL_I
   1666      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
   1667      1.1  mrg 	   (match_operand:SVE_FULL_I 2 "register_operand" "0, w")
   1668      1.1  mrg 	   (match_operand:SVE_FULL_I 3 "register_operand" "w, w")]
   1669      1.1  mrg 	  SVE2_INT_BINARY_PAIR))]
   1670      1.1  mrg   "TARGET_SVE2"
   1671      1.1  mrg   "@
   1672      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
   1673      1.1  mrg    movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
   1674      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1675      1.1  mrg )
   1676      1.1  mrg 
   1677      1.1  mrg ;; -------------------------------------------------------------------------
   1678      1.1  mrg ;; ---- [FP] Pairwise arithmetic
   1679      1.1  mrg ;; -------------------------------------------------------------------------
   1680      1.1  mrg ;; Includes:
   1681      1.1  mrg ;; - FADDP
   1682      1.1  mrg ;; - FMAXP
   1683      1.1  mrg ;; - FMAXNMP
   1684      1.1  mrg ;; - FMINP
   1685      1.1  mrg ;; - FMINNMP
   1686      1.1  mrg ;; -------------------------------------------------------------------------
   1687      1.1  mrg 
   1688      1.1  mrg (define_insn "@aarch64_pred_<sve_fp_op><mode>"
   1689      1.1  mrg   [(set (match_operand:SVE_FULL_F 0 "register_operand" "=w, ?&w")
   1690      1.1  mrg 	(unspec:SVE_FULL_F
   1691      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
   1692      1.1  mrg 	   (match_operand:SVE_FULL_F 2 "register_operand" "0, w")
   1693      1.1  mrg 	   (match_operand:SVE_FULL_F 3 "register_operand" "w, w")]
   1694      1.1  mrg 	  SVE2_FP_BINARY_PAIR))]
   1695      1.1  mrg   "TARGET_SVE2"
   1696      1.1  mrg   "@
   1697      1.1  mrg    <sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
   1698      1.1  mrg    movprfx\t%0, %2\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
   1699      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1700      1.1  mrg )
   1701      1.1  mrg 
   1702      1.1  mrg ;; -------------------------------------------------------------------------
   1703      1.1  mrg ;; ---- [INT] Pairwise arithmetic with accumulation
   1704      1.1  mrg ;; -------------------------------------------------------------------------
   1705      1.1  mrg ;; Includes:
   1706      1.1  mrg ;; - SADALP
   1707      1.1  mrg ;; - UADALP
   1708      1.1  mrg ;; -------------------------------------------------------------------------
   1709      1.1  mrg 
   1710      1.1  mrg ;; Predicated pairwise absolute difference and accumulate with merging.
   1711      1.1  mrg (define_expand "@cond_<sve_int_op><mode>"
   1712      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand")
   1713      1.1  mrg 	(unspec:SVE_FULL_HSDI
   1714      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand")
   1715      1.1  mrg 	   (unspec:SVE_FULL_HSDI
   1716      1.1  mrg 	     [(match_dup 1)
   1717      1.1  mrg 	      (match_operand:SVE_FULL_HSDI 2 "register_operand")
   1718      1.1  mrg 	      (match_operand:<VNARROW> 3 "register_operand")]
   1719      1.1  mrg 	     SVE2_INT_BINARY_PAIR_LONG)
   1720      1.1  mrg 	   (match_operand:SVE_FULL_HSDI 4 "aarch64_simd_reg_or_zero")]
   1721      1.1  mrg 	  UNSPEC_SEL))]
   1722      1.1  mrg   "TARGET_SVE2"
   1723      1.1  mrg {
   1724      1.1  mrg   /* Only target code is aware of these operations, so we don't need
   1725      1.1  mrg      to handle the fully-general case.  */
   1726      1.1  mrg   gcc_assert (rtx_equal_p (operands[2], operands[4])
   1727      1.1  mrg 	      || CONSTANT_P (operands[4]));
   1728      1.1  mrg })
   1729      1.1  mrg 
   1730      1.1  mrg ;; Predicated pairwise absolute difference and accumulate, merging with
   1731      1.1  mrg ;; the first input.
   1732      1.1  mrg (define_insn_and_rewrite "*cond_<sve_int_op><mode>_2"
   1733      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
   1734      1.1  mrg 	(unspec:SVE_FULL_HSDI
   1735      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
   1736      1.1  mrg 	   (unspec:SVE_FULL_HSDI
   1737      1.1  mrg 	     [(match_operand 4)
   1738      1.1  mrg 	      (match_operand:SVE_FULL_HSDI 2 "register_operand" "0, w")
   1739      1.1  mrg 	      (match_operand:<VNARROW> 3 "register_operand" "w, w")]
   1740      1.1  mrg 	     SVE2_INT_BINARY_PAIR_LONG)
   1741      1.1  mrg 	   (match_dup 2)]
   1742      1.1  mrg 	  UNSPEC_SEL))]
   1743      1.1  mrg   "TARGET_SVE2"
   1744      1.1  mrg   "@
   1745      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %1/m, %3.<Ventype>
   1746      1.1  mrg    movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %3.<Ventype>"
   1747      1.1  mrg   "&& !CONSTANT_P (operands[4])"
   1748      1.1  mrg   {
   1749      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
   1750      1.1  mrg   }
   1751      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1752      1.1  mrg )
   1753      1.1  mrg 
   1754      1.1  mrg ;; Predicated pairwise absolute difference and accumulate, merging with zero.
   1755      1.1  mrg (define_insn_and_rewrite "*cond_<sve_int_op><mode>_z"
   1756      1.1  mrg   [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=&w, &w")
   1757      1.1  mrg 	(unspec:SVE_FULL_HSDI
   1758      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
   1759      1.1  mrg 	   (unspec:SVE_FULL_HSDI
   1760      1.1  mrg 	     [(match_operand 5)
   1761      1.1  mrg 	      (match_operand:SVE_FULL_HSDI 2 "register_operand" "0, w")
   1762      1.1  mrg 	      (match_operand:<VNARROW> 3 "register_operand" "w, w")]
   1763      1.1  mrg 	     SVE2_INT_BINARY_PAIR_LONG)
   1764      1.1  mrg 	   (match_operand:SVE_FULL_HSDI 4 "aarch64_simd_imm_zero")]
   1765      1.1  mrg 	  UNSPEC_SEL))]
   1766      1.1  mrg   "TARGET_SVE2"
   1767      1.1  mrg   "@
   1768      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %3.<Ventype>
   1769      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %3.<Ventype>"
   1770      1.1  mrg   "&& !CONSTANT_P (operands[5])"
   1771      1.1  mrg   {
   1772      1.1  mrg     operands[5] = CONSTM1_RTX (<VPRED>mode);
   1773      1.1  mrg   }
   1774      1.1  mrg   [(set_attr "movprfx" "yes")]
   1775      1.1  mrg )
   1776      1.1  mrg 
   1777      1.1  mrg ;; =========================================================================
   1778      1.1  mrg ;; == Complex arithmetic
   1779      1.1  mrg ;; =========================================================================
   1780      1.1  mrg 
   1781      1.1  mrg ;; -------------------------------------------------------------------------
   1782      1.1  mrg ;; ---- [INT] Complex binary operations
   1783      1.1  mrg ;; -------------------------------------------------------------------------
   1784      1.1  mrg ;; Includes:
   1785      1.1  mrg ;; - CADD
   1786      1.1  mrg ;; - SQCADD
   1787      1.1  mrg ;; -------------------------------------------------------------------------
   1788      1.1  mrg 
   1789      1.1  mrg (define_insn "@aarch64_sve_<optab><mode>"
   1790      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
   1791      1.1  mrg 	(unspec:SVE_FULL_I
   1792      1.1  mrg 	  [(match_operand:SVE_FULL_I 1 "register_operand" "0, w")
   1793      1.1  mrg 	   (match_operand:SVE_FULL_I 2 "register_operand" "w, w")]
   1794      1.1  mrg 	  SVE2_INT_CADD))]
   1795      1.1  mrg   "TARGET_SVE2"
   1796      1.1  mrg   "@
   1797      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %0.<Vetype>, %2.<Vetype>, #<rot>
   1798      1.1  mrg    movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %0.<Vetype>, %2.<Vetype>, #<rot>"
   1799      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1800      1.1  mrg )
   1801      1.1  mrg 
   1802  1.1.1.2  mrg ;; unpredicated optab pattern for auto-vectorizer
   1803  1.1.1.2  mrg (define_expand "cadd<rot><mode>3"
   1804  1.1.1.2  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
   1805  1.1.1.2  mrg 	(unspec:SVE_FULL_I
   1806  1.1.1.2  mrg 	  [(match_operand:SVE_FULL_I 1 "register_operand")
   1807  1.1.1.2  mrg 	   (match_operand:SVE_FULL_I 2 "register_operand")]
   1808  1.1.1.2  mrg 	  SVE2_INT_CADD_OP))]
   1809  1.1.1.2  mrg   "TARGET_SVE2"
   1810  1.1.1.2  mrg )
   1811  1.1.1.2  mrg 
   1812      1.1  mrg ;; -------------------------------------------------------------------------
   1813      1.1  mrg ;; ---- [INT] Complex ternary operations
   1814      1.1  mrg ;; -------------------------------------------------------------------------
   1815      1.1  mrg ;; Includes:
   1816      1.1  mrg ;; - CMLA
   1817      1.1  mrg ;; - SQRDCMLA
   1818      1.1  mrg ;; -------------------------------------------------------------------------
   1819      1.1  mrg 
   1820      1.1  mrg (define_insn "@aarch64_sve_<optab><mode>"
   1821      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
   1822      1.1  mrg 	(unspec:SVE_FULL_I
   1823      1.1  mrg 	  [(match_operand:SVE_FULL_I 1 "register_operand" "0, w")
   1824      1.1  mrg 	   (match_operand:SVE_FULL_I 2 "register_operand" "w, w")
   1825      1.1  mrg 	   (match_operand:SVE_FULL_I 3 "register_operand" "w, w")]
   1826      1.1  mrg 	  SVE2_INT_CMLA))]
   1827      1.1  mrg   "TARGET_SVE2"
   1828      1.1  mrg   "@
   1829      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>, #<rot>
   1830      1.1  mrg    movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>, #<rot>"
   1831      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1832      1.1  mrg )
   1833      1.1  mrg 
   1834      1.1  mrg (define_insn "@aarch64_<optab>_lane_<mode>"
   1835      1.1  mrg   [(set (match_operand:SVE_FULL_HSI 0 "register_operand" "=w, ?&w")
   1836      1.1  mrg 	(unspec:SVE_FULL_HSI
   1837      1.1  mrg 	  [(match_operand:SVE_FULL_HSI 1 "register_operand" "0, w")
   1838      1.1  mrg 	   (match_operand:SVE_FULL_HSI 2 "register_operand" "w, w")
   1839      1.1  mrg 	   (unspec:SVE_FULL_HSI
   1840      1.1  mrg 	     [(match_operand:SVE_FULL_HSI 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
   1841      1.1  mrg 	      (match_operand:SI 4 "const_int_operand")]
   1842      1.1  mrg 	     UNSPEC_SVE_LANE_SELECT)]
   1843      1.1  mrg 	  SVE2_INT_CMLA))]
   1844      1.1  mrg   "TARGET_SVE2"
   1845      1.1  mrg   "@
   1846      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4], #<rot>
   1847      1.1  mrg    movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4], #<rot>"
   1848      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1849      1.1  mrg )
   1850      1.1  mrg 
   1851  1.1.1.2  mrg ;; unpredicated optab pattern for auto-vectorizer
   1852  1.1.1.2  mrg ;; The complex mla/mls operations always need to expand to two instructions.
   1853  1.1.1.2  mrg ;; The first operation does half the computation and the second does the
   1854  1.1.1.2  mrg ;; remainder.  Because of this, expand early.
   1855  1.1.1.2  mrg (define_expand "cml<fcmac1><conj_op><mode>4"
   1856  1.1.1.2  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
   1857  1.1.1.2  mrg 	(plus:SVE_FULL_I (match_operand:SVE_FULL_I 1 "register_operand")
   1858  1.1.1.2  mrg 	  (unspec:SVE_FULL_I
   1859  1.1.1.2  mrg 	    [(match_operand:SVE_FULL_I 2 "register_operand")
   1860  1.1.1.2  mrg 	     (match_operand:SVE_FULL_I 3 "register_operand")]
   1861  1.1.1.2  mrg 	    SVE2_INT_CMLA_OP)))]
   1862  1.1.1.2  mrg   "TARGET_SVE2"
   1863  1.1.1.2  mrg {
   1864  1.1.1.2  mrg   rtx tmp = gen_reg_rtx (<MODE>mode);
   1865  1.1.1.2  mrg   emit_insn (gen_aarch64_sve_cmla<sve_rot1><mode> (tmp, operands[1],
   1866  1.1.1.2  mrg 						   operands[3], operands[2]));
   1867  1.1.1.2  mrg   emit_insn (gen_aarch64_sve_cmla<sve_rot2><mode> (operands[0], tmp,
   1868  1.1.1.2  mrg 						   operands[3], operands[2]));
   1869  1.1.1.2  mrg   DONE;
   1870  1.1.1.2  mrg })
   1871  1.1.1.2  mrg 
   1872  1.1.1.2  mrg ;; unpredicated optab pattern for auto-vectorizer
   1873  1.1.1.2  mrg ;; The complex mul operations always need to expand to two instructions.
   1874  1.1.1.2  mrg ;; The first operation does half the computation and the second does the
   1875  1.1.1.2  mrg ;; remainder.  Because of this, expand early.
   1876  1.1.1.2  mrg (define_expand "cmul<conj_op><mode>3"
   1877  1.1.1.2  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand")
   1878  1.1.1.2  mrg 	(unspec:SVE_FULL_I
   1879  1.1.1.2  mrg 	  [(match_operand:SVE_FULL_I 1 "register_operand")
   1880  1.1.1.2  mrg 	   (match_operand:SVE_FULL_I 2 "register_operand")]
   1881  1.1.1.2  mrg 	  SVE2_INT_CMUL_OP))]
   1882  1.1.1.2  mrg   "TARGET_SVE2"
   1883  1.1.1.2  mrg {
   1884  1.1.1.2  mrg   rtx accum = force_reg (<MODE>mode, CONST0_RTX (<MODE>mode));
   1885  1.1.1.2  mrg   rtx tmp = gen_reg_rtx (<MODE>mode);
   1886  1.1.1.2  mrg   emit_insn (gen_aarch64_sve_cmla<sve_rot1><mode> (tmp, accum,
   1887  1.1.1.2  mrg 						   operands[2], operands[1]));
   1888  1.1.1.2  mrg   emit_insn (gen_aarch64_sve_cmla<sve_rot2><mode> (operands[0], tmp,
   1889  1.1.1.2  mrg 						   operands[2], operands[1]));
   1890  1.1.1.2  mrg   DONE;
   1891  1.1.1.2  mrg })
   1892  1.1.1.2  mrg 
   1893      1.1  mrg ;; -------------------------------------------------------------------------
   1894      1.1  mrg ;; ---- [INT] Complex dot product
   1895      1.1  mrg ;; -------------------------------------------------------------------------
   1896      1.1  mrg ;; Includes:
   1897      1.1  mrg ;; - CDOT
   1898      1.1  mrg ;; -------------------------------------------------------------------------
   1899      1.1  mrg 
   1900      1.1  mrg (define_insn "@aarch64_sve_<optab><mode>"
   1901      1.1  mrg   [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
   1902      1.1  mrg 	(unspec:SVE_FULL_SDI
   1903      1.1  mrg 	  [(match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")
   1904      1.1  mrg 	   (match_operand:<VSI2QI> 2 "register_operand" "w, w")
   1905      1.1  mrg 	   (match_operand:<VSI2QI> 3 "register_operand" "w, w")]
   1906      1.1  mrg 	  SVE2_INT_CDOT))]
   1907      1.1  mrg   "TARGET_SVE2"
   1908      1.1  mrg   "@
   1909      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %2.<Vetype_fourth>, %3.<Vetype_fourth>, #<rot>
   1910      1.1  mrg    movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype_fourth>, %3.<Vetype_fourth>, #<rot>"
   1911      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1912      1.1  mrg )
   1913      1.1  mrg 
   1914      1.1  mrg (define_insn "@aarch64_<optab>_lane_<mode>"
   1915      1.1  mrg   [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
   1916      1.1  mrg 	(unspec:SVE_FULL_SDI
   1917      1.1  mrg 	  [(match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")
   1918      1.1  mrg 	   (match_operand:<VSI2QI> 2 "register_operand" "w, w")
   1919      1.1  mrg 	   (unspec:<VSI2QI>
   1920      1.1  mrg 	     [(match_operand:<VSI2QI> 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
   1921      1.1  mrg 	      (match_operand:SI 4 "const_int_operand")]
   1922      1.1  mrg 	     UNSPEC_SVE_LANE_SELECT)]
   1923      1.1  mrg 	  SVE2_INT_CDOT))]
   1924      1.1  mrg   "TARGET_SVE2"
   1925      1.1  mrg   "@
   1926      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %2.<Vetype_fourth>, %3.<Vetype_fourth>[%4], #<rot>
   1927      1.1  mrg    movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype_fourth>, %3.<Vetype_fourth>[%4], #<rot>"
   1928      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   1929      1.1  mrg )
   1930      1.1  mrg 
   1931      1.1  mrg ;; =========================================================================
   1932      1.1  mrg ;; == Conversions
   1933      1.1  mrg ;; =========================================================================
   1934      1.1  mrg 
   1935      1.1  mrg ;; -------------------------------------------------------------------------
   1936      1.1  mrg ;; ---- [FP<-FP] Widening conversions
   1937      1.1  mrg ;; -------------------------------------------------------------------------
   1938      1.1  mrg ;; Includes:
   1939      1.1  mrg ;; - FCVTLT
   1940      1.1  mrg ;; -------------------------------------------------------------------------
   1941      1.1  mrg 
   1942      1.1  mrg ;; Predicated convert long top.
   1943      1.1  mrg (define_insn "@aarch64_pred_<sve_fp_op><mode>"
   1944      1.1  mrg   [(set (match_operand:SVE_FULL_SDF 0 "register_operand" "=w")
   1945      1.1  mrg 	(unspec:SVE_FULL_SDF
   1946      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl")
   1947      1.1  mrg 	   (match_operand:SI 3 "aarch64_sve_gp_strictness")
   1948      1.1  mrg 	   (match_operand:<VNARROW> 2 "register_operand" "0")]
   1949      1.1  mrg 	  SVE2_COND_FP_UNARY_LONG))]
   1950      1.1  mrg   "TARGET_SVE2"
   1951      1.1  mrg   "<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Ventype>"
   1952      1.1  mrg )
   1953      1.1  mrg 
   1954      1.1  mrg ;; Predicated convert long top with merging.
   1955      1.1  mrg (define_expand "@cond_<sve_fp_op><mode>"
   1956      1.1  mrg   [(set (match_operand:SVE_FULL_SDF 0 "register_operand")
   1957      1.1  mrg 	(unspec:SVE_FULL_SDF
   1958      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand")
   1959      1.1  mrg 	   (unspec:SVE_FULL_SDF
   1960      1.1  mrg 	     [(match_dup 1)
   1961      1.1  mrg 	      (const_int SVE_STRICT_GP)
   1962      1.1  mrg 	      (match_operand:<VNARROW> 2 "register_operand")]
   1963      1.1  mrg 	     SVE2_COND_FP_UNARY_LONG)
   1964      1.1  mrg 	   (match_operand:SVE_FULL_SDF 3 "register_operand")]
   1965      1.1  mrg 	  UNSPEC_SEL))]
   1966      1.1  mrg   "TARGET_SVE2"
   1967      1.1  mrg )
   1968      1.1  mrg 
   1969      1.1  mrg ;; These instructions do not take MOVPRFX.
   1970      1.1  mrg (define_insn_and_rewrite "*cond_<sve_fp_op><mode>_relaxed"
   1971      1.1  mrg   [(set (match_operand:SVE_FULL_SDF 0 "register_operand" "=w")
   1972      1.1  mrg 	(unspec:SVE_FULL_SDF
   1973      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl")
   1974      1.1  mrg 	   (unspec:SVE_FULL_SDF
   1975      1.1  mrg 	     [(match_operand 4)
   1976      1.1  mrg 	      (const_int SVE_RELAXED_GP)
   1977      1.1  mrg 	      (match_operand:<VNARROW> 2 "register_operand" "w")]
   1978      1.1  mrg 	     SVE2_COND_FP_UNARY_LONG)
   1979      1.1  mrg 	   (match_operand:SVE_FULL_SDF 3 "register_operand" "0")]
   1980      1.1  mrg 	  UNSPEC_SEL))]
   1981      1.1  mrg   "TARGET_SVE2"
   1982      1.1  mrg   "<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Ventype>"
   1983      1.1  mrg   "&& !rtx_equal_p (operands[1], operands[4])"
   1984      1.1  mrg   {
   1985      1.1  mrg     operands[4] = copy_rtx (operands[1]);
   1986      1.1  mrg   }
   1987      1.1  mrg )
   1988      1.1  mrg 
   1989      1.1  mrg (define_insn "*cond_<sve_fp_op><mode>_strict"
   1990      1.1  mrg   [(set (match_operand:SVE_FULL_SDF 0 "register_operand" "=w")
   1991      1.1  mrg 	(unspec:SVE_FULL_SDF
   1992      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl")
   1993      1.1  mrg 	   (unspec:SVE_FULL_SDF
   1994      1.1  mrg 	     [(match_dup 1)
   1995      1.1  mrg 	      (const_int SVE_STRICT_GP)
   1996      1.1  mrg 	      (match_operand:<VNARROW> 2 "register_operand" "w")]
   1997      1.1  mrg 	     SVE2_COND_FP_UNARY_LONG)
   1998      1.1  mrg 	   (match_operand:SVE_FULL_SDF 3 "register_operand" "0")]
   1999      1.1  mrg 	  UNSPEC_SEL))]
   2000      1.1  mrg   "TARGET_SVE2"
   2001      1.1  mrg   "<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Ventype>"
   2002      1.1  mrg )
   2003      1.1  mrg 
   2004      1.1  mrg ;; -------------------------------------------------------------------------
   2005      1.1  mrg ;; ---- [FP<-FP] Narrowing conversions
   2006      1.1  mrg ;; -------------------------------------------------------------------------
   2007      1.1  mrg ;; Includes:
   2008      1.1  mrg ;; - FCVTNT
   2009      1.1  mrg ;; - FCVTX
   2010      1.1  mrg ;; - FCVTXNT
   2011      1.1  mrg ;; -------------------------------------------------------------------------
   2012      1.1  mrg 
   2013      1.1  mrg ;; Predicated FCVTNT.  This doesn't give a natural aarch64_pred_*/cond_*
   2014      1.1  mrg ;; pair because the even elements always have to be supplied for active
   2015      1.1  mrg ;; elements, even if the inactive elements don't matter.
   2016      1.1  mrg ;;
   2017      1.1  mrg ;; These instructions do not take MOVPRFX.
   2018      1.1  mrg (define_insn "@aarch64_sve_cvtnt<mode>"
   2019      1.1  mrg   [(set (match_operand:SVE_FULL_HSF 0 "register_operand" "=w")
   2020      1.1  mrg 	(unspec:SVE_FULL_HSF
   2021      1.1  mrg 	  [(match_operand:<VWIDE_PRED> 2 "register_operand" "Upl")
   2022      1.1  mrg 	   (const_int SVE_STRICT_GP)
   2023      1.1  mrg 	   (match_operand:SVE_FULL_HSF 1 "register_operand" "0")
   2024      1.1  mrg 	   (match_operand:<VWIDE> 3 "register_operand" "w")]
   2025      1.1  mrg 	  UNSPEC_COND_FCVTNT))]
   2026      1.1  mrg   "TARGET_SVE2"
   2027      1.1  mrg   "fcvtnt\t%0.<Vetype>, %2/m, %3.<Vewtype>"
   2028      1.1  mrg )
   2029      1.1  mrg 
   2030      1.1  mrg ;; Predicated FCVTX (equivalent to what would be FCVTXNB, except that
   2031      1.1  mrg ;; it supports MOVPRFX).
   2032      1.1  mrg (define_insn "@aarch64_pred_<sve_fp_op><mode>"
   2033      1.1  mrg   [(set (match_operand:VNx4SF_ONLY 0 "register_operand" "=w, ?&w")
   2034      1.1  mrg 	(unspec:VNx4SF_ONLY
   2035      1.1  mrg 	  [(match_operand:<VWIDE_PRED> 1 "register_operand" "Upl, Upl")
   2036      1.1  mrg 	   (match_operand:SI 3 "aarch64_sve_gp_strictness")
   2037      1.1  mrg 	   (match_operand:<VWIDE> 2 "register_operand" "0, w")]
   2038      1.1  mrg 	  SVE2_COND_FP_UNARY_NARROWB))]
   2039      1.1  mrg   "TARGET_SVE2"
   2040      1.1  mrg   "@
   2041      1.1  mrg    <sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>
   2042      1.1  mrg    movprfx\t%0, %2\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>"
   2043      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   2044      1.1  mrg )
   2045      1.1  mrg 
   2046      1.1  mrg ;; Predicated FCVTX with merging.
   2047      1.1  mrg (define_expand "@cond_<sve_fp_op><mode>"
   2048      1.1  mrg   [(set (match_operand:VNx4SF_ONLY 0 "register_operand")
   2049      1.1  mrg 	(unspec:VNx4SF_ONLY
   2050      1.1  mrg 	  [(match_operand:<VWIDE_PRED> 1 "register_operand")
   2051      1.1  mrg 	   (unspec:VNx4SF_ONLY
   2052      1.1  mrg 	     [(match_dup 1)
   2053      1.1  mrg 	      (const_int SVE_STRICT_GP)
   2054      1.1  mrg 	      (match_operand:<VWIDE> 2 "register_operand")]
   2055      1.1  mrg 	     SVE2_COND_FP_UNARY_NARROWB)
   2056      1.1  mrg 	   (match_operand:VNx4SF_ONLY 3 "aarch64_simd_reg_or_zero")]
   2057      1.1  mrg 	  UNSPEC_SEL))]
   2058      1.1  mrg   "TARGET_SVE2"
   2059      1.1  mrg )
   2060      1.1  mrg 
   2061      1.1  mrg (define_insn_and_rewrite "*cond_<sve_fp_op><mode>_any_relaxed"
   2062      1.1  mrg   [(set (match_operand:VNx4SF_ONLY 0 "register_operand" "=&w, &w, &w")
   2063      1.1  mrg 	(unspec:VNx4SF_ONLY
   2064      1.1  mrg 	  [(match_operand:<VWIDE_PRED> 1 "register_operand" "Upl, Upl, Upl")
   2065      1.1  mrg 	   (unspec:VNx4SF_ONLY
   2066      1.1  mrg 	     [(match_operand 4)
   2067      1.1  mrg 	      (const_int SVE_RELAXED_GP)
   2068      1.1  mrg 	      (match_operand:<VWIDE> 2 "register_operand" "w, w, w")]
   2069      1.1  mrg 	     SVE2_COND_FP_UNARY_NARROWB)
   2070      1.1  mrg 	   (match_operand:VNx4SF_ONLY 3 "aarch64_simd_reg_or_zero" "0, Dz, w")]
   2071      1.1  mrg 	  UNSPEC_SEL))]
   2072      1.1  mrg   "TARGET_SVE2 && !rtx_equal_p (operands[2], operands[3])"
   2073      1.1  mrg   "@
   2074      1.1  mrg    <sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>
   2075      1.1  mrg    movprfx\t%0.<Vewtype>, %1/z, %2.<Vewtype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>
   2076      1.1  mrg    movprfx\t%0, %3\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>"
   2077      1.1  mrg   "&& !rtx_equal_p (operands[1], operands[4])"
   2078      1.1  mrg   {
   2079      1.1  mrg     operands[4] = copy_rtx (operands[1]);
   2080      1.1  mrg   }
   2081      1.1  mrg   [(set_attr "movprfx" "*,yes,yes")]
   2082      1.1  mrg )
   2083      1.1  mrg 
   2084      1.1  mrg (define_insn "*cond_<sve_fp_op><mode>_any_strict"
   2085      1.1  mrg   [(set (match_operand:VNx4SF_ONLY 0 "register_operand" "=&w, &w, &w")
   2086      1.1  mrg 	(unspec:VNx4SF_ONLY
   2087      1.1  mrg 	  [(match_operand:<VWIDE_PRED> 1 "register_operand" "Upl, Upl, Upl")
   2088      1.1  mrg 	   (unspec:VNx4SF_ONLY
   2089      1.1  mrg 	     [(match_dup 1)
   2090      1.1  mrg 	      (const_int SVE_STRICT_GP)
   2091      1.1  mrg 	      (match_operand:<VWIDE> 2 "register_operand" "w, w, w")]
   2092      1.1  mrg 	     SVE2_COND_FP_UNARY_NARROWB)
   2093      1.1  mrg 	   (match_operand:VNx4SF_ONLY 3 "aarch64_simd_reg_or_zero" "0, Dz, w")]
   2094      1.1  mrg 	  UNSPEC_SEL))]
   2095      1.1  mrg   "TARGET_SVE2 && !rtx_equal_p (operands[2], operands[3])"
   2096      1.1  mrg   "@
   2097      1.1  mrg    <sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>
   2098      1.1  mrg    movprfx\t%0.<Vewtype>, %1/z, %2.<Vewtype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>
   2099      1.1  mrg    movprfx\t%0, %3\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>"
   2100      1.1  mrg   [(set_attr "movprfx" "*,yes,yes")]
   2101      1.1  mrg )
   2102      1.1  mrg 
   2103      1.1  mrg ;; Predicated FCVTXNT.  This doesn't give a natural aarch64_pred_*/cond_*
   2104      1.1  mrg ;; pair because the even elements always have to be supplied for active
   2105      1.1  mrg ;; elements, even if the inactive elements don't matter.
   2106      1.1  mrg ;;
   2107      1.1  mrg ;; These instructions do not take MOVPRFX.
   2108      1.1  mrg (define_insn "@aarch64_sve2_cvtxnt<mode>"
   2109      1.1  mrg   [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
   2110      1.1  mrg 	(unspec:<VNARROW>
   2111      1.1  mrg 	  [(match_operand:<VPRED> 2 "register_operand" "Upl")
   2112      1.1  mrg 	   (const_int SVE_STRICT_GP)
   2113      1.1  mrg 	   (match_operand:<VNARROW> 1 "register_operand" "0")
   2114      1.1  mrg 	   (match_operand:VNx2DF_ONLY 3 "register_operand" "w")]
   2115      1.1  mrg 	  UNSPEC_COND_FCVTXNT))]
   2116      1.1  mrg   "TARGET_SVE2"
   2117      1.1  mrg   "fcvtxnt\t%0.<Ventype>, %2/m, %3.<Vetype>"
   2118      1.1  mrg )
   2119      1.1  mrg 
   2120      1.1  mrg ;; =========================================================================
   2121      1.1  mrg ;; == Other arithmetic
   2122      1.1  mrg ;; =========================================================================
   2123      1.1  mrg 
   2124      1.1  mrg ;; -------------------------------------------------------------------------
   2125      1.1  mrg ;; ---- [INT] Reciprocal approximation
   2126      1.1  mrg ;; -------------------------------------------------------------------------
   2127      1.1  mrg ;; Includes:
   2128      1.1  mrg ;; - URECPE
   2129      1.1  mrg ;; - URSQRTE
   2130      1.1  mrg ;; -------------------------------------------------------------------------
   2131      1.1  mrg 
   2132      1.1  mrg ;; Predicated integer unary operations.
   2133      1.1  mrg (define_insn "@aarch64_pred_<sve_int_op><mode>"
   2134      1.1  mrg   [(set (match_operand:VNx4SI_ONLY 0 "register_operand" "=w, ?&w")
   2135      1.1  mrg 	(unspec:VNx4SI_ONLY
   2136      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
   2137      1.1  mrg 	   (unspec:VNx4SI_ONLY
   2138      1.1  mrg 	     [(match_operand:VNx4SI_ONLY 2 "register_operand" "0, w")]
   2139      1.1  mrg 	     SVE2_U32_UNARY)]
   2140      1.1  mrg 	  UNSPEC_PRED_X))]
   2141      1.1  mrg   "TARGET_SVE2"
   2142      1.1  mrg   "@
   2143      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
   2144      1.1  mrg    movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
   2145      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   2146      1.1  mrg )
   2147      1.1  mrg 
   2148      1.1  mrg ;; Predicated integer unary operations with merging.
   2149      1.1  mrg (define_expand "@cond_<sve_int_op><mode>"
   2150      1.1  mrg   [(set (match_operand:VNx4SI_ONLY 0 "register_operand")
   2151      1.1  mrg 	(unspec:VNx4SI_ONLY
   2152      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand")
   2153      1.1  mrg 	   (unspec:VNx4SI_ONLY
   2154      1.1  mrg 	     [(match_dup 4)
   2155      1.1  mrg 	      (unspec:VNx4SI_ONLY
   2156      1.1  mrg 		[(match_operand:VNx4SI_ONLY 2 "register_operand")]
   2157      1.1  mrg 		SVE2_U32_UNARY)]
   2158      1.1  mrg 	     UNSPEC_PRED_X)
   2159      1.1  mrg 	   (match_operand:VNx4SI_ONLY 3 "aarch64_simd_reg_or_zero")]
   2160      1.1  mrg 	  UNSPEC_SEL))]
   2161      1.1  mrg   "TARGET_SVE2"
   2162      1.1  mrg   {
   2163      1.1  mrg     operands[4] = CONSTM1_RTX (<MODE>mode);
   2164      1.1  mrg   }
   2165      1.1  mrg )
   2166      1.1  mrg 
   2167      1.1  mrg (define_insn_and_rewrite "*cond_<sve_int_op><mode>"
   2168      1.1  mrg   [(set (match_operand:VNx4SI_ONLY 0 "register_operand" "=w, ?&w, ?&w")
   2169      1.1  mrg 	(unspec:VNx4SI_ONLY
   2170      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl")
   2171      1.1  mrg 	   (unspec:VNx4SI_ONLY
   2172      1.1  mrg 	     [(match_operand 4)
   2173      1.1  mrg 	      (unspec:VNx4SI_ONLY
   2174      1.1  mrg 		[(match_operand:VNx4SI_ONLY 2 "register_operand" "w, w, w")]
   2175      1.1  mrg 		SVE2_U32_UNARY)]
   2176      1.1  mrg 	     UNSPEC_PRED_X)
   2177      1.1  mrg 	   (match_operand:VNx4SI_ONLY 3 "aarch64_simd_reg_or_zero" "0, Dz, w")]
   2178      1.1  mrg 	  UNSPEC_SEL))]
   2179      1.1  mrg   "TARGET_SVE2"
   2180      1.1  mrg   "@
   2181      1.1  mrg    <sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
   2182      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
   2183      1.1  mrg    movprfx\t%0, %3\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
   2184      1.1  mrg   "&& !CONSTANT_P (operands[4])"
   2185      1.1  mrg   {
   2186      1.1  mrg     operands[4] = CONSTM1_RTX (<VPRED>mode);
   2187      1.1  mrg   }
   2188      1.1  mrg   [(set_attr "movprfx" "*,yes,yes")]
   2189      1.1  mrg )
   2190      1.1  mrg 
   2191      1.1  mrg ;; -------------------------------------------------------------------------
   2192      1.1  mrg ;; ---- [INT<-FP] Base-2 logarithm
   2193      1.1  mrg ;; -------------------------------------------------------------------------
   2194      1.1  mrg ;; Includes:
   2195      1.1  mrg ;; - FLOGB
   2196      1.1  mrg ;; -------------------------------------------------------------------------
   2197      1.1  mrg 
   2198      1.1  mrg ;; Predicated FLOGB.
   2199      1.1  mrg (define_insn "@aarch64_pred_<sve_fp_op><mode>"
   2200      1.1  mrg   [(set (match_operand:<V_INT_EQUIV> 0 "register_operand" "=w, ?&w")
   2201      1.1  mrg 	(unspec:<V_INT_EQUIV>
   2202      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
   2203      1.1  mrg 	   (match_operand:SI 3 "aarch64_sve_gp_strictness")
   2204      1.1  mrg 	   (match_operand:SVE_FULL_F 2 "register_operand" "0, w")]
   2205      1.1  mrg 	  SVE2_COND_INT_UNARY_FP))]
   2206      1.1  mrg   "TARGET_SVE2"
   2207      1.1  mrg   "@
   2208      1.1  mrg    <sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
   2209      1.1  mrg    movprfx\t%0, %2\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
   2210      1.1  mrg   [(set_attr "movprfx" "*,yes")]
   2211      1.1  mrg )
   2212      1.1  mrg 
   2213      1.1  mrg ;; Predicated FLOGB with merging.
   2214      1.1  mrg (define_expand "@cond_<sve_fp_op><mode>"
   2215      1.1  mrg   [(set (match_operand:<V_INT_EQUIV> 0 "register_operand")
   2216      1.1  mrg 	(unspec:<V_INT_EQUIV>
   2217      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand")
   2218      1.1  mrg 	   (unspec:<V_INT_EQUIV>
   2219      1.1  mrg 	     [(match_dup 1)
   2220      1.1  mrg 	      (const_int SVE_STRICT_GP)
   2221      1.1  mrg 	      (match_operand:SVE_FULL_F 2 "register_operand")]
   2222      1.1  mrg 	     SVE2_COND_INT_UNARY_FP)
   2223      1.1  mrg 	   (match_operand:<V_INT_EQUIV> 3 "aarch64_simd_reg_or_zero")]
   2224      1.1  mrg 	  UNSPEC_SEL))]
   2225      1.1  mrg   "TARGET_SVE2"
   2226      1.1  mrg )
   2227      1.1  mrg 
   2228      1.1  mrg (define_insn_and_rewrite "*cond_<sve_fp_op><mode>"
   2229      1.1  mrg   [(set (match_operand:<V_INT_EQUIV> 0 "register_operand" "=&w, ?&w, ?&w")
   2230      1.1  mrg 	(unspec:<V_INT_EQUIV>
   2231      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl")
   2232      1.1  mrg 	   (unspec:<V_INT_EQUIV>
   2233      1.1  mrg 	     [(match_operand 4)
   2234      1.1  mrg 	      (const_int SVE_RELAXED_GP)
   2235      1.1  mrg 	      (match_operand:SVE_FULL_F 2 "register_operand" "w, w, w")]
   2236      1.1  mrg 	     SVE2_COND_INT_UNARY_FP)
   2237      1.1  mrg 	   (match_operand:<V_INT_EQUIV> 3 "aarch64_simd_reg_or_zero" "0, Dz, w")]
   2238      1.1  mrg 	  UNSPEC_SEL))]
   2239      1.1  mrg   "TARGET_SVE2 && !rtx_equal_p (operands[2], operands[3])"
   2240      1.1  mrg   "@
   2241      1.1  mrg    <sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
   2242      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
   2243      1.1  mrg    movprfx\t%0, %3\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
   2244      1.1  mrg   "&& !rtx_equal_p (operands[1], operands[4])"
   2245      1.1  mrg   {
   2246      1.1  mrg     operands[4] = copy_rtx (operands[1]);
   2247      1.1  mrg   }
   2248      1.1  mrg   [(set_attr "movprfx" "*,yes,yes")]
   2249      1.1  mrg )
   2250      1.1  mrg 
   2251      1.1  mrg (define_insn "*cond_<sve_fp_op><mode>_strict"
   2252      1.1  mrg   [(set (match_operand:<V_INT_EQUIV> 0 "register_operand" "=&w, ?&w, ?&w")
   2253      1.1  mrg 	(unspec:<V_INT_EQUIV>
   2254      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl")
   2255      1.1  mrg 	   (unspec:<V_INT_EQUIV>
   2256      1.1  mrg 	     [(match_dup 1)
   2257      1.1  mrg 	      (const_int SVE_STRICT_GP)
   2258      1.1  mrg 	      (match_operand:SVE_FULL_F 2 "register_operand" "w, w, w")]
   2259      1.1  mrg 	     SVE2_COND_INT_UNARY_FP)
   2260      1.1  mrg 	   (match_operand:<V_INT_EQUIV> 3 "aarch64_simd_reg_or_zero" "0, Dz, w")]
   2261      1.1  mrg 	  UNSPEC_SEL))]
   2262      1.1  mrg   "TARGET_SVE2 && !rtx_equal_p (operands[2], operands[3])"
   2263      1.1  mrg   "@
   2264      1.1  mrg    <sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
   2265      1.1  mrg    movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
   2266      1.1  mrg    movprfx\t%0, %3\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
   2267      1.1  mrg   [(set_attr "movprfx" "*,yes,yes")]
   2268      1.1  mrg )
   2269      1.1  mrg 
   2270      1.1  mrg ;; -------------------------------------------------------------------------
   2271      1.1  mrg ;; ---- [INT] Polynomial multiplication
   2272      1.1  mrg ;; -------------------------------------------------------------------------
   2273      1.1  mrg ;; Includes:
   2274      1.1  mrg ;; - PMUL
   2275      1.1  mrg ;; - PMULLB
   2276      1.1  mrg ;; - PMULLT
   2277      1.1  mrg ;; -------------------------------------------------------------------------
   2278      1.1  mrg 
   2279      1.1  mrg ;; Uniform PMUL.
   2280      1.1  mrg (define_insn "@aarch64_sve2_pmul<mode>"
   2281      1.1  mrg   [(set (match_operand:VNx16QI_ONLY 0 "register_operand" "=w")
   2282      1.1  mrg 	(unspec:VNx16QI_ONLY
   2283      1.1  mrg 	  [(match_operand:VNx16QI_ONLY 1 "register_operand" "w")
   2284      1.1  mrg 	   (match_operand:VNx16QI_ONLY 2 "register_operand" "w")]
   2285      1.1  mrg 	  UNSPEC_PMUL))]
   2286      1.1  mrg   "TARGET_SVE2"
   2287      1.1  mrg   "pmul\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
   2288      1.1  mrg )
   2289      1.1  mrg 
   2290      1.1  mrg ;; Extending PMUL, with the results modeled as wider vectors.
   2291      1.1  mrg ;; This representation is only possible for .H and .D, not .Q.
   2292      1.1  mrg (define_insn "@aarch64_sve_<optab><mode>"
   2293      1.1  mrg   [(set (match_operand:SVE_FULL_HDI 0 "register_operand" "=w")
   2294      1.1  mrg 	(unspec:SVE_FULL_HDI
   2295      1.1  mrg 	  [(match_operand:<VNARROW> 1 "register_operand" "w")
   2296      1.1  mrg 	   (match_operand:<VNARROW> 2 "register_operand" "w")]
   2297      1.1  mrg 	  SVE2_PMULL))]
   2298      1.1  mrg   "TARGET_SVE2"
   2299      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>"
   2300      1.1  mrg )
   2301      1.1  mrg 
   2302      1.1  mrg ;; Extending PMUL, with the results modeled as pairs of values.
   2303      1.1  mrg ;; This representation works for .H, .D and .Q, with .Q requiring
   2304      1.1  mrg ;; the AES extension.  (This is enforced by the mode iterator.)
   2305      1.1  mrg (define_insn "@aarch64_sve_<optab><mode>"
   2306      1.1  mrg   [(set (match_operand:SVE2_PMULL_PAIR_I 0 "register_operand" "=w")
   2307      1.1  mrg 	(unspec:SVE2_PMULL_PAIR_I
   2308      1.1  mrg 	  [(match_operand:SVE2_PMULL_PAIR_I 1 "register_operand" "w")
   2309      1.1  mrg 	   (match_operand:SVE2_PMULL_PAIR_I 2 "register_operand" "w")]
   2310      1.1  mrg 	  SVE2_PMULL_PAIR))]
   2311      1.1  mrg   "TARGET_SVE2"
   2312      1.1  mrg   "<sve_int_op>\t%0.<Vewtype>, %1.<Vetype>, %2.<Vetype>"
   2313      1.1  mrg )
   2314      1.1  mrg 
   2315      1.1  mrg ;; =========================================================================
   2316      1.1  mrg ;; == Permutation
   2317      1.1  mrg ;; =========================================================================
   2318      1.1  mrg 
   2319      1.1  mrg ;; -------------------------------------------------------------------------
   2320      1.1  mrg ;; ---- [INT,FP] General permutes
   2321      1.1  mrg ;; -------------------------------------------------------------------------
   2322      1.1  mrg ;; Includes:
   2323      1.1  mrg ;; - TBL (vector pair form)
   2324      1.1  mrg ;; - TBX
   2325      1.1  mrg ;; -------------------------------------------------------------------------
   2326      1.1  mrg 
   2327      1.1  mrg ;; TBL on a pair of data vectors.
   2328      1.1  mrg (define_insn "@aarch64_sve2_tbl2<mode>"
   2329      1.1  mrg   [(set (match_operand:SVE_FULL 0 "register_operand" "=w")
   2330      1.1  mrg 	(unspec:SVE_FULL
   2331      1.1  mrg 	  [(match_operand:<VDOUBLE> 1 "register_operand" "w")
   2332      1.1  mrg 	   (match_operand:<V_INT_EQUIV> 2 "register_operand" "w")]
   2333      1.1  mrg 	  UNSPEC_TBL2))]
   2334      1.1  mrg   "TARGET_SVE2"
   2335      1.1  mrg   "tbl\t%0.<Vetype>, %1, %2.<Vetype>"
   2336      1.1  mrg )
   2337      1.1  mrg 
   2338      1.1  mrg ;; TBX.  These instructions do not take MOVPRFX.
   2339      1.1  mrg (define_insn "@aarch64_sve2_tbx<mode>"
   2340      1.1  mrg   [(set (match_operand:SVE_FULL 0 "register_operand" "=w")
   2341      1.1  mrg 	(unspec:SVE_FULL
   2342      1.1  mrg 	  [(match_operand:SVE_FULL 1 "register_operand" "0")
   2343      1.1  mrg 	   (match_operand:SVE_FULL 2 "register_operand" "w")
   2344      1.1  mrg 	   (match_operand:<V_INT_EQUIV> 3 "register_operand" "w")]
   2345      1.1  mrg 	  UNSPEC_TBX))]
   2346      1.1  mrg   "TARGET_SVE2"
   2347      1.1  mrg   "tbx\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>"
   2348      1.1  mrg )
   2349      1.1  mrg 
   2350      1.1  mrg ;; -------------------------------------------------------------------------
   2351      1.1  mrg ;; ---- [INT] Optional bit-permute extensions
   2352      1.1  mrg ;; -------------------------------------------------------------------------
   2353      1.1  mrg ;; Includes:
   2354      1.1  mrg ;; - BDEP
   2355      1.1  mrg ;; - BEXT
   2356      1.1  mrg ;; - BGRP
   2357      1.1  mrg ;; -------------------------------------------------------------------------
   2358      1.1  mrg 
   2359      1.1  mrg (define_insn "@aarch64_sve_<sve_int_op><mode>"
   2360      1.1  mrg   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w")
   2361      1.1  mrg 	(unspec:SVE_FULL_I
   2362      1.1  mrg 	  [(match_operand:SVE_FULL_I 1 "register_operand" "w")
   2363      1.1  mrg 	   (match_operand:SVE_FULL_I 2 "register_operand" "w")]
   2364      1.1  mrg 	  SVE2_INT_BITPERM))]
   2365      1.1  mrg   "TARGET_SVE2_BITPERM"
   2366      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
   2367      1.1  mrg )
   2368      1.1  mrg 
   2369      1.1  mrg ;; =========================================================================
   2370      1.1  mrg ;; == General
   2371      1.1  mrg ;; =========================================================================
   2372      1.1  mrg 
   2373      1.1  mrg ;; -------------------------------------------------------------------------
   2374      1.1  mrg ;; ---- Check for aliases between pointers
   2375      1.1  mrg ;; -------------------------------------------------------------------------
   2376      1.1  mrg ;; The patterns in this section are synthetic: WHILERW and WHILEWR are
   2377      1.1  mrg ;; defined in aarch64-sve.md instead.
   2378      1.1  mrg ;; -------------------------------------------------------------------------
   2379      1.1  mrg 
   2380      1.1  mrg ;; Use WHILERW and WHILEWR to accelerate alias checks.  This is only
   2381      1.1  mrg ;; possible if the accesses we're checking are exactly the same size
   2382      1.1  mrg ;; as an SVE vector.
   2383      1.1  mrg (define_expand "check_<raw_war>_ptrs<mode>"
   2384      1.1  mrg   [(match_operand:GPI 0 "register_operand")
   2385      1.1  mrg    (unspec:VNx16BI
   2386      1.1  mrg      [(match_operand:GPI 1 "register_operand")
   2387      1.1  mrg       (match_operand:GPI 2 "register_operand")
   2388      1.1  mrg       (match_operand:GPI 3 "aarch64_bytes_per_sve_vector_operand")
   2389      1.1  mrg       (match_operand:GPI 4 "const_int_operand")]
   2390      1.1  mrg      SVE2_WHILE_PTR)]
   2391      1.1  mrg   "TARGET_SVE2"
   2392      1.1  mrg {
   2393      1.1  mrg   /* Use the widest predicate mode we can.  */
   2394      1.1  mrg   unsigned int align = INTVAL (operands[4]);
   2395      1.1  mrg   if (align > 8)
   2396      1.1  mrg     align = 8;
   2397      1.1  mrg   machine_mode pred_mode = aarch64_sve_pred_mode (align).require ();
   2398      1.1  mrg 
   2399      1.1  mrg   /* Emit a WHILERW or WHILEWR, setting the condition codes based on
   2400      1.1  mrg      the result.  */
   2401      1.1  mrg   emit_insn (gen_while_ptest
   2402      1.1  mrg 	     (<SVE2_WHILE_PTR:unspec>, <MODE>mode, pred_mode,
   2403      1.1  mrg 	      gen_rtx_SCRATCH (pred_mode), operands[1], operands[2],
   2404      1.1  mrg 	      CONSTM1_RTX (VNx16BImode), CONSTM1_RTX (pred_mode)));
   2405      1.1  mrg 
   2406      1.1  mrg   /* Set operand 0 to true if the last bit of the predicate result is set,
   2407      1.1  mrg      i.e. if all elements are free of dependencies.  */
   2408      1.1  mrg   rtx cc_reg = gen_rtx_REG (CC_NZCmode, CC_REGNUM);
   2409      1.1  mrg   rtx cmp = gen_rtx_LTU (<MODE>mode, cc_reg, const0_rtx);
   2410      1.1  mrg   emit_insn (gen_aarch64_cstore<mode> (operands[0], cmp, cc_reg));
   2411      1.1  mrg   DONE;
   2412      1.1  mrg })
   2413      1.1  mrg 
   2414      1.1  mrg ;; -------------------------------------------------------------------------
   2415      1.1  mrg ;; ---- Histogram processing
   2416      1.1  mrg ;; -------------------------------------------------------------------------
   2417      1.1  mrg ;; Includes:
   2418      1.1  mrg ;; - HISTCNT
   2419      1.1  mrg ;; - HISTSEG
   2420      1.1  mrg ;; -------------------------------------------------------------------------
   2421      1.1  mrg 
   2422      1.1  mrg (define_insn "@aarch64_sve2_histcnt<mode>"
   2423      1.1  mrg   [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w")
   2424      1.1  mrg 	(unspec:SVE_FULL_SDI
   2425      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl")
   2426      1.1  mrg 	   (match_operand:SVE_FULL_SDI 2 "register_operand" "w")
   2427      1.1  mrg 	   (match_operand:SVE_FULL_SDI 3 "register_operand" "w")]
   2428      1.1  mrg 	  UNSPEC_HISTCNT))]
   2429      1.1  mrg   "TARGET_SVE2"
   2430      1.1  mrg   "histcnt\t%0.<Vetype>, %1/z, %2.<Vetype>, %3.<Vetype>"
   2431      1.1  mrg )
   2432      1.1  mrg 
   2433      1.1  mrg (define_insn "@aarch64_sve2_histseg<mode>"
   2434      1.1  mrg   [(set (match_operand:VNx16QI_ONLY 0 "register_operand" "=w")
   2435      1.1  mrg 	(unspec:VNx16QI_ONLY
   2436      1.1  mrg 	  [(match_operand:VNx16QI_ONLY 1 "register_operand" "w")
   2437      1.1  mrg 	   (match_operand:VNx16QI_ONLY 2 "register_operand" "w")]
   2438      1.1  mrg 	  UNSPEC_HISTSEG))]
   2439      1.1  mrg   "TARGET_SVE2"
   2440      1.1  mrg   "histseg\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
   2441      1.1  mrg )
   2442      1.1  mrg 
   2443      1.1  mrg ;; -------------------------------------------------------------------------
   2444      1.1  mrg ;; ---- String matching
   2445      1.1  mrg ;; -------------------------------------------------------------------------
   2446      1.1  mrg ;; Includes:
   2447      1.1  mrg ;; - MATCH
   2448      1.1  mrg ;; - NMATCH
   2449      1.1  mrg ;; -------------------------------------------------------------------------
   2450      1.1  mrg 
   2451      1.1  mrg ;; Predicated string matching.
   2452      1.1  mrg (define_insn "@aarch64_pred_<sve_int_op><mode>"
   2453      1.1  mrg   [(set (match_operand:<VPRED> 0 "register_operand" "=Upa")
   2454      1.1  mrg 	(unspec:<VPRED>
   2455      1.1  mrg 	  [(match_operand:<VPRED> 1 "register_operand" "Upl")
   2456      1.1  mrg 	   (match_operand:SI 2 "aarch64_sve_ptrue_flag")
   2457      1.1  mrg 	   (unspec:<VPRED>
   2458      1.1  mrg 	     [(match_operand:SVE_FULL_BHI 3 "register_operand" "w")
   2459      1.1  mrg 	      (match_operand:SVE_FULL_BHI 4 "register_operand" "w")]
   2460      1.1  mrg 	     SVE2_MATCH)]
   2461      1.1  mrg 	  UNSPEC_PRED_Z))
   2462      1.1  mrg    (clobber (reg:CC_NZC CC_REGNUM))]
   2463      1.1  mrg   "TARGET_SVE2"
   2464      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1/z, %3.<Vetype>, %4.<Vetype>"
   2465      1.1  mrg )
   2466      1.1  mrg 
   2467      1.1  mrg ;; Predicated string matching in which both the flag and predicate results
   2468      1.1  mrg ;; are interesting.
   2469      1.1  mrg (define_insn_and_rewrite "*aarch64_pred_<sve_int_op><mode>_cc"
   2470      1.1  mrg   [(set (reg:CC_NZC CC_REGNUM)
   2471      1.1  mrg 	(unspec:CC_NZC
   2472      1.1  mrg 	  [(match_operand:VNx16BI 1 "register_operand" "Upl")
   2473      1.1  mrg 	   (match_operand 4)
   2474      1.1  mrg 	   (match_operand:SI 5 "aarch64_sve_ptrue_flag")
   2475      1.1  mrg 	   (unspec:<VPRED>
   2476      1.1  mrg 	     [(match_operand 6)
   2477      1.1  mrg 	      (match_operand:SI 7 "aarch64_sve_ptrue_flag")
   2478      1.1  mrg 	      (unspec:<VPRED>
   2479      1.1  mrg 		[(match_operand:SVE_FULL_BHI 2 "register_operand" "w")
   2480      1.1  mrg 		 (match_operand:SVE_FULL_BHI 3 "register_operand" "w")]
   2481      1.1  mrg 		SVE2_MATCH)]
   2482      1.1  mrg 	     UNSPEC_PRED_Z)]
   2483      1.1  mrg 	  UNSPEC_PTEST))
   2484      1.1  mrg    (set (match_operand:<VPRED> 0 "register_operand" "=Upa")
   2485      1.1  mrg 	(unspec:<VPRED>
   2486      1.1  mrg 	  [(match_dup 6)
   2487      1.1  mrg 	   (match_dup 7)
   2488      1.1  mrg 	   (unspec:<VPRED>
   2489      1.1  mrg 	     [(match_dup 2)
   2490      1.1  mrg 	      (match_dup 3)]
   2491      1.1  mrg 	     SVE2_MATCH)]
   2492      1.1  mrg 	  UNSPEC_PRED_Z))]
   2493      1.1  mrg   "TARGET_SVE2
   2494      1.1  mrg    && aarch64_sve_same_pred_for_ptest_p (&operands[4], &operands[6])"
   2495      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1/z, %2.<Vetype>, %3.<Vetype>"
   2496      1.1  mrg   "&& !rtx_equal_p (operands[4], operands[6])"
   2497      1.1  mrg   {
   2498      1.1  mrg     operands[6] = copy_rtx (operands[4]);
   2499      1.1  mrg     operands[7] = operands[5];
   2500      1.1  mrg   }
   2501      1.1  mrg )
   2502      1.1  mrg 
   2503      1.1  mrg ;; Predicated string matching in which only the flags result is interesting.
   2504      1.1  mrg (define_insn_and_rewrite "*aarch64_pred_<sve_int_op><mode>_ptest"
   2505      1.1  mrg   [(set (reg:CC_NZC CC_REGNUM)
   2506      1.1  mrg 	(unspec:CC_NZC
   2507      1.1  mrg 	  [(match_operand:VNx16BI 1 "register_operand" "Upl")
   2508      1.1  mrg 	   (match_operand 4)
   2509      1.1  mrg 	   (match_operand:SI 5 "aarch64_sve_ptrue_flag")
   2510      1.1  mrg 	   (unspec:<VPRED>
   2511      1.1  mrg 	     [(match_operand 6)
   2512      1.1  mrg 	      (match_operand:SI 7 "aarch64_sve_ptrue_flag")
   2513      1.1  mrg 	      (unspec:<VPRED>
   2514      1.1  mrg 		[(match_operand:SVE_FULL_BHI 2 "register_operand" "w")
   2515      1.1  mrg 		 (match_operand:SVE_FULL_BHI 3 "register_operand" "w")]
   2516      1.1  mrg 		SVE2_MATCH)]
   2517      1.1  mrg 	     UNSPEC_PRED_Z)]
   2518      1.1  mrg 	  UNSPEC_PTEST))
   2519      1.1  mrg    (clobber (match_scratch:<VPRED> 0 "=Upa"))]
   2520      1.1  mrg   "TARGET_SVE2
   2521      1.1  mrg    && aarch64_sve_same_pred_for_ptest_p (&operands[4], &operands[6])"
   2522      1.1  mrg   "<sve_int_op>\t%0.<Vetype>, %1/z, %2.<Vetype>, %3.<Vetype>"
   2523      1.1  mrg   "&& !rtx_equal_p (operands[4], operands[6])"
   2524      1.1  mrg   {
   2525      1.1  mrg     operands[6] = copy_rtx (operands[4]);
   2526      1.1  mrg     operands[7] = operands[5];
   2527      1.1  mrg   }
   2528      1.1  mrg )
   2529      1.1  mrg 
   2530      1.1  mrg ;; =========================================================================
   2531      1.1  mrg ;; == Crypotographic extensions
   2532      1.1  mrg ;; =========================================================================
   2533      1.1  mrg 
   2534      1.1  mrg ;; -------------------------------------------------------------------------
   2535      1.1  mrg ;; ---- Optional AES extensions
   2536      1.1  mrg ;; -------------------------------------------------------------------------
   2537      1.1  mrg ;; Includes:
   2538      1.1  mrg ;; - AESD
   2539      1.1  mrg ;; - AESE
   2540      1.1  mrg ;; - AESIMC
   2541      1.1  mrg ;; - AESMC
   2542      1.1  mrg ;; -------------------------------------------------------------------------
   2543      1.1  mrg 
   2544      1.1  mrg ;; AESD and AESE.
   2545      1.1  mrg (define_insn "aarch64_sve2_aes<aes_op>"
   2546      1.1  mrg   [(set (match_operand:VNx16QI 0 "register_operand" "=w")
   2547      1.1  mrg 	(unspec:VNx16QI
   2548      1.1  mrg 	  [(xor:VNx16QI
   2549      1.1  mrg 	     (match_operand:VNx16QI 1 "register_operand" "%0")
   2550      1.1  mrg 	     (match_operand:VNx16QI 2 "register_operand" "w"))]
   2551      1.1  mrg           CRYPTO_AES))]
   2552      1.1  mrg   "TARGET_SVE2_AES"
   2553      1.1  mrg   "aes<aes_op>\t%0.b, %0.b, %2.b"
   2554      1.1  mrg   [(set_attr "type" "crypto_aese")]
   2555      1.1  mrg )
   2556      1.1  mrg 
   2557      1.1  mrg ;; AESMC and AESIMC.  These instructions do not take MOVPRFX.
   2558      1.1  mrg (define_insn "aarch64_sve2_aes<aesmc_op>"
   2559      1.1  mrg   [(set (match_operand:VNx16QI 0 "register_operand" "=w")
   2560      1.1  mrg 	(unspec:VNx16QI
   2561      1.1  mrg 	  [(match_operand:VNx16QI 1 "register_operand" "0")]
   2562      1.1  mrg 	  CRYPTO_AESMC))]
   2563      1.1  mrg   "TARGET_SVE2_AES"
   2564      1.1  mrg   "aes<aesmc_op>\t%0.b, %0.b"
   2565      1.1  mrg   [(set_attr "type" "crypto_aesmc")]
   2566      1.1  mrg )
   2567      1.1  mrg 
   2568      1.1  mrg ;; When AESE/AESMC and AESD/AESIMC fusion is enabled, we really want
   2569      1.1  mrg ;; to keep the two together and enforce the register dependency without
   2570      1.1  mrg ;; scheduling or register allocation messing up the order or introducing
   2571      1.1  mrg ;; moves inbetween.  Mash the two together during combine.
   2572      1.1  mrg 
   2573      1.1  mrg (define_insn "*aarch64_sve2_aese_fused"
   2574      1.1  mrg   [(set (match_operand:VNx16QI 0 "register_operand" "=w")
   2575      1.1  mrg 	(unspec:VNx16QI
   2576      1.1  mrg 	  [(unspec:VNx16QI
   2577      1.1  mrg 	     [(xor:VNx16QI
   2578      1.1  mrg 		(match_operand:VNx16QI 1 "register_operand" "%0")
   2579      1.1  mrg 		(match_operand:VNx16QI 2 "register_operand" "w"))]
   2580      1.1  mrg 	     UNSPEC_AESE)]
   2581      1.1  mrg 	  UNSPEC_AESMC))]
   2582      1.1  mrg   "TARGET_SVE2_AES && aarch64_fusion_enabled_p (AARCH64_FUSE_AES_AESMC)"
   2583      1.1  mrg   "aese\t%0.b, %0.b, %2.b\;aesmc\t%0.b, %0.b"
   2584      1.1  mrg   [(set_attr "type" "crypto_aese")
   2585      1.1  mrg    (set_attr "length" "8")]
   2586      1.1  mrg )
   2587      1.1  mrg 
   2588      1.1  mrg (define_insn "*aarch64_sve2_aesd_fused"
   2589      1.1  mrg   [(set (match_operand:VNx16QI 0 "register_operand" "=w")
   2590      1.1  mrg 	(unspec:VNx16QI
   2591      1.1  mrg 	  [(unspec:VNx16QI
   2592      1.1  mrg 	     [(xor:VNx16QI
   2593      1.1  mrg 		(match_operand:VNx16QI 1 "register_operand" "%0")
   2594      1.1  mrg 		(match_operand:VNx16QI 2 "register_operand" "w"))]
   2595      1.1  mrg 	     UNSPEC_AESD)]
   2596      1.1  mrg 	  UNSPEC_AESIMC))]
   2597      1.1  mrg   "TARGET_SVE2_AES && aarch64_fusion_enabled_p (AARCH64_FUSE_AES_AESMC)"
   2598      1.1  mrg   "aesd\t%0.b, %0.b, %2.b\;aesimc\t%0.b, %0.b"
   2599      1.1  mrg   [(set_attr "type" "crypto_aese")
   2600      1.1  mrg    (set_attr "length" "8")]
   2601      1.1  mrg )
   2602      1.1  mrg 
   2603      1.1  mrg ;; -------------------------------------------------------------------------
   2604      1.1  mrg ;; ---- Optional SHA-3 extensions
   2605      1.1  mrg ;; -------------------------------------------------------------------------
   2606      1.1  mrg ;; Includes:
   2607      1.1  mrg ;; - RAX1
   2608      1.1  mrg ;; -------------------------------------------------------------------------
   2609      1.1  mrg 
   2610      1.1  mrg (define_insn "aarch64_sve2_rax1"
   2611      1.1  mrg   [(set (match_operand:VNx2DI 0 "register_operand" "=w")
   2612      1.1  mrg 	(xor:VNx2DI
   2613      1.1  mrg 	  (rotate:VNx2DI
   2614      1.1  mrg 	    (match_operand:VNx2DI 2 "register_operand" "w")
   2615      1.1  mrg 	    (const_int 1))
   2616      1.1  mrg 	  (match_operand:VNx2DI 1 "register_operand" "w")))]
   2617      1.1  mrg   "TARGET_SVE2_SHA3"
   2618      1.1  mrg   "rax1\t%0.d, %1.d, %2.d"
   2619      1.1  mrg   [(set_attr "type" "crypto_sha3")]
   2620      1.1  mrg )
   2621      1.1  mrg 
   2622      1.1  mrg ;; -------------------------------------------------------------------------
   2623      1.1  mrg ;; ---- Optional SM4 extensions
   2624      1.1  mrg ;; -------------------------------------------------------------------------
   2625      1.1  mrg ;; Includes:
   2626      1.1  mrg ;; - SM4E
   2627      1.1  mrg ;; - SM4EKEY
   2628      1.1  mrg ;; -------------------------------------------------------------------------
   2629      1.1  mrg 
   2630      1.1  mrg ;; These instructions do not take MOVPRFX.
   2631      1.1  mrg (define_insn "aarch64_sve2_sm4e"
   2632      1.1  mrg   [(set (match_operand:VNx4SI 0 "register_operand" "=w")
   2633      1.1  mrg 	(unspec:VNx4SI
   2634      1.1  mrg 	  [(match_operand:VNx4SI 1 "register_operand" "0")
   2635      1.1  mrg 	   (match_operand:VNx4SI 2 "register_operand" "w")]
   2636      1.1  mrg 	  UNSPEC_SM4E))]
   2637      1.1  mrg   "TARGET_SVE2_SM4"
   2638      1.1  mrg   "sm4e\t%0.s, %0.s, %2.s"
   2639      1.1  mrg   [(set_attr "type" "crypto_sm4")]
   2640      1.1  mrg )
   2641      1.1  mrg 
   2642      1.1  mrg (define_insn "aarch64_sve2_sm4ekey"
   2643      1.1  mrg   [(set (match_operand:VNx4SI 0 "register_operand" "=w")
   2644      1.1  mrg 	(unspec:VNx4SI
   2645      1.1  mrg 	  [(match_operand:VNx4SI 1 "register_operand" "w")
   2646      1.1  mrg 	   (match_operand:VNx4SI 2 "register_operand" "w")]
   2647      1.1  mrg 	  UNSPEC_SM4EKEY))]
   2648      1.1  mrg   "TARGET_SVE2_SM4"
   2649      1.1  mrg   "sm4ekey\t%0.s, %1.s, %2.s"
   2650      1.1  mrg   [(set_attr "type" "crypto_sm4")]
   2651      1.1  mrg )
   2652