https://gcc.gnu.org/g:164e3e66a61ce2ca30f78e9129c8f9592a9fe0fa

commit r15-6077-g164e3e66a61ce2ca30f78e9129c8f9592a9fe0fa
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Tue Dec 10 13:21:55 2024 +0000

    aarch64: Remove vcond{,u} optabs
    
    Prompted by Richard E's arm patch, this one removes the aarch64
    support for the vcond{,u} optabs.
    
    gcc/
            * config/aarch64/aarch64-protos.h (aarch64_expand_sve_vcond): 
Delete.
            * config/aarch64/aarch64-simd.md (<su><maxmin>v2di3): Expand into
            separate vec_cmp and vcond_mask instructions, instead of using 
vcond.
            (vcond<mode><mode>, vcond<v_cmp_mixed><mode>, vcondu<mode><mode>)
            (vcondu<mode><v_cmp_mixed>): Delete.
            * config/aarch64/aarch64-sve.md (vcond<SVE_ALL:mode><SVE_I:mode>)
            (vcondu<SVE_ALL:mode><SVE_I:mode>, vcond<mode><v_fp_equiv>): 
Likewise.
            * config/aarch64/aarch64.cc (aarch64_expand_sve_vcond): Likewise.
            * config/aarch64/iterators.md (V_FP_EQUIV, v_fp_equiv, V_cmp_mixed)
            (v_cmp_mixed): Likewise.

Diff:
---
 gcc/config/aarch64/aarch64-protos.h |   1 -
 gcc/config/aarch64/aarch64-simd.md  | 126 ++----------------------------------
 gcc/config/aarch64/aarch64-sve.md   |  58 -----------------
 gcc/config/aarch64/aarch64.cc       |  30 ---------
 gcc/config/aarch64/iterators.md     |  20 ------
 5 files changed, 4 insertions(+), 231 deletions(-)

diff --git a/gcc/config/aarch64/aarch64-protos.h 
b/gcc/config/aarch64/aarch64-protos.h
index d058864e5077..51951ae80023 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -1094,7 +1094,6 @@ void aarch64_finish_ldpstp_peephole (rtx *, bool,
 
 void aarch64_expand_sve_vec_cmp_int (rtx, rtx_code, rtx, rtx);
 bool aarch64_expand_sve_vec_cmp_float (rtx, rtx_code, rtx, rtx, bool);
-void aarch64_expand_sve_vcond (machine_mode, machine_mode, rtx *);
 
 bool aarch64_prepare_sve_int_fma (rtx *, rtx_code);
 bool aarch64_prepare_sve_cond_int_fma (rtx *, rtx_code);
diff --git a/gcc/config/aarch64/aarch64-simd.md 
b/gcc/config/aarch64/aarch64-simd.md
index fa72e6a6a604..6228065c9f28 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -1783,9 +1783,11 @@
       gcc_unreachable ();
     }
 
+  rtx mask = gen_reg_rtx (V2DImode);
   cmp_fmt = gen_rtx_fmt_ee (cmp_operator, V2DImode, operands[1], operands[2]);
-  emit_insn (gen_vcondv2div2di (operands[0], operands[1],
-              operands[2], cmp_fmt, operands[1], operands[2]));
+  emit_insn (gen_vec_cmpv2div2di (mask, cmp_fmt, operands[1], operands[2]));
+  emit_insn (gen_vcond_mask_v2div2di (operands[0], operands[1],
+                                     operands[2], mask));
   DONE;
 })
 
@@ -4199,126 +4201,6 @@
   DONE;
 })
 
-(define_expand "vcond<mode><mode>"
-  [(set (match_operand:VALLDI 0 "register_operand")
-       (if_then_else:VALLDI
-         (match_operator 3 "comparison_operator"
-           [(match_operand:VALLDI 4 "register_operand")
-            (match_operand:VALLDI 5 "nonmemory_operand")])
-         (match_operand:VALLDI 1 "nonmemory_operand")
-         (match_operand:VALLDI 2 "nonmemory_operand")))]
-  "TARGET_SIMD"
-{
-  rtx mask = gen_reg_rtx (<V_INT_EQUIV>mode);
-  enum rtx_code code = GET_CODE (operands[3]);
-
-  /* NE is handled as !EQ in vec_cmp patterns, we can explicitly invert
-     it as well as switch operands 1/2 in order to avoid the additional
-     NOT instruction.  */
-  if (code == NE)
-    {
-      operands[3] = gen_rtx_fmt_ee (EQ, GET_MODE (operands[3]),
-                                   operands[4], operands[5]);
-      std::swap (operands[1], operands[2]);
-    }
-  emit_insn (gen_vec_cmp<mode><v_int_equiv> (mask, operands[3],
-                                            operands[4], operands[5]));
-  emit_insn (gen_vcond_mask_<mode><v_int_equiv> (operands[0], operands[1],
-                                                operands[2], mask));
-
-  DONE;
-})
-
-(define_expand "vcond<v_cmp_mixed><mode>"
-  [(set (match_operand:<V_cmp_mixed> 0 "register_operand")
-       (if_then_else:<V_cmp_mixed>
-         (match_operator 3 "comparison_operator"
-           [(match_operand:VDQF_COND 4 "register_operand")
-            (match_operand:VDQF_COND 5 "nonmemory_operand")])
-         (match_operand:<V_cmp_mixed> 1 "nonmemory_operand")
-         (match_operand:<V_cmp_mixed> 2 "nonmemory_operand")))]
-  "TARGET_SIMD"
-{
-  rtx mask = gen_reg_rtx (<V_INT_EQUIV>mode);
-  enum rtx_code code = GET_CODE (operands[3]);
-
-  /* NE is handled as !EQ in vec_cmp patterns, we can explicitly invert
-     it as well as switch operands 1/2 in order to avoid the additional
-     NOT instruction.  */
-  if (code == NE)
-    {
-      operands[3] = gen_rtx_fmt_ee (EQ, GET_MODE (operands[3]),
-                                   operands[4], operands[5]);
-      std::swap (operands[1], operands[2]);
-    }
-  emit_insn (gen_vec_cmp<mode><v_int_equiv> (mask, operands[3],
-                                            operands[4], operands[5]));
-  emit_insn (gen_vcond_mask_<v_cmp_mixed><v_int_equiv> (
-                                               operands[0], operands[1],
-                                               operands[2], mask));
-
-  DONE;
-})
-
-(define_expand "vcondu<mode><mode>"
-  [(set (match_operand:VSDQ_I_DI 0 "register_operand")
-       (if_then_else:VSDQ_I_DI
-         (match_operator 3 "comparison_operator"
-           [(match_operand:VSDQ_I_DI 4 "register_operand")
-            (match_operand:VSDQ_I_DI 5 "nonmemory_operand")])
-         (match_operand:VSDQ_I_DI 1 "nonmemory_operand")
-         (match_operand:VSDQ_I_DI 2 "nonmemory_operand")))]
-  "TARGET_SIMD"
-{
-  rtx mask = gen_reg_rtx (<MODE>mode);
-  enum rtx_code code = GET_CODE (operands[3]);
-
-  /* NE is handled as !EQ in vec_cmp patterns, we can explicitly invert
-     it as well as switch operands 1/2 in order to avoid the additional
-     NOT instruction.  */
-  if (code == NE)
-    {
-      operands[3] = gen_rtx_fmt_ee (EQ, GET_MODE (operands[3]),
-                                   operands[4], operands[5]);
-      std::swap (operands[1], operands[2]);
-    }
-  emit_insn (gen_vec_cmp<mode><mode> (mask, operands[3],
-                                     operands[4], operands[5]));
-  emit_insn (gen_vcond_mask_<mode><v_int_equiv> (operands[0], operands[1],
-                                                operands[2], mask));
-  DONE;
-})
-
-(define_expand "vcondu<mode><v_cmp_mixed>"
-  [(set (match_operand:VDQF 0 "register_operand")
-       (if_then_else:VDQF
-         (match_operator 3 "comparison_operator"
-           [(match_operand:<V_cmp_mixed> 4 "register_operand")
-            (match_operand:<V_cmp_mixed> 5 "nonmemory_operand")])
-         (match_operand:VDQF 1 "nonmemory_operand")
-         (match_operand:VDQF 2 "nonmemory_operand")))]
-  "TARGET_SIMD"
-{
-  rtx mask = gen_reg_rtx (<V_INT_EQUIV>mode);
-  enum rtx_code code = GET_CODE (operands[3]);
-
-  /* NE is handled as !EQ in vec_cmp patterns, we can explicitly invert
-     it as well as switch operands 1/2 in order to avoid the additional
-     NOT instruction.  */
-  if (code == NE)
-    {
-      operands[3] = gen_rtx_fmt_ee (EQ, GET_MODE (operands[3]),
-                                   operands[4], operands[5]);
-      std::swap (operands[1], operands[2]);
-    }
-  emit_insn (gen_vec_cmp<v_cmp_mixed><v_cmp_mixed> (
-                                                 mask, operands[3],
-                                                 operands[4], operands[5]));
-  emit_insn (gen_vcond_mask_<mode><v_int_equiv> (operands[0], operands[1],
-                                                operands[2], mask));
-  DONE;
-})
-
 ;; Patterns for AArch64 SIMD Intrinsics.
 
 ;; Lane extraction with sign extension to general purpose register.
diff --git a/gcc/config/aarch64/aarch64-sve.md 
b/gcc/config/aarch64/aarch64-sve.md
index 9afd11d34762..04326bca0e74 100644
--- a/gcc/config/aarch64/aarch64-sve.md
+++ b/gcc/config/aarch64/aarch64-sve.md
@@ -124,7 +124,6 @@
 ;;
 ;; == Comparisons and selects
 ;; ---- [INT,FP] Select based on predicates
-;; ---- [INT,FP] Compare and select
 ;; ---- [INT] Comparisons
 ;; ---- [INT] While tests
 ;; ---- [FP] Direct comparisons
@@ -8062,63 +8061,6 @@
   }
 )
 
-;; -------------------------------------------------------------------------
-;; ---- [INT,FP] Compare and select
-;; -------------------------------------------------------------------------
-;; The patterns in this section are synthetic.
-;; -------------------------------------------------------------------------
-
-;; Integer (signed) vcond.  Don't enforce an immediate range here, since it
-;; depends on the comparison; leave it to aarch64_expand_sve_vcond instead.
-(define_expand "vcond<SVE_ALL:mode><SVE_I:mode>"
-  [(set (match_operand:SVE_ALL 0 "register_operand")
-       (if_then_else:SVE_ALL
-         (match_operator 3 "comparison_operator"
-           [(match_operand:SVE_I 4 "register_operand")
-            (match_operand:SVE_I 5 "nonmemory_operand")])
-         (match_operand:SVE_ALL 1 "nonmemory_operand")
-         (match_operand:SVE_ALL 2 "nonmemory_operand")))]
-  "TARGET_SVE && <SVE_ALL:container_bits> == <SVE_I:container_bits>"
-  {
-    aarch64_expand_sve_vcond (<SVE_ALL:MODE>mode, <SVE_I:MODE>mode, operands);
-    DONE;
-  }
-)
-
-;; Integer vcondu.  Don't enforce an immediate range here, since it
-;; depends on the comparison; leave it to aarch64_expand_sve_vcond instead.
-(define_expand "vcondu<SVE_ALL:mode><SVE_I:mode>"
-  [(set (match_operand:SVE_ALL 0 "register_operand")
-       (if_then_else:SVE_ALL
-         (match_operator 3 "comparison_operator"
-           [(match_operand:SVE_I 4 "register_operand")
-            (match_operand:SVE_I 5 "nonmemory_operand")])
-         (match_operand:SVE_ALL 1 "nonmemory_operand")
-         (match_operand:SVE_ALL 2 "nonmemory_operand")))]
-  "TARGET_SVE && <SVE_ALL:container_bits> == <SVE_I:container_bits>"
-  {
-    aarch64_expand_sve_vcond (<SVE_ALL:MODE>mode, <SVE_I:MODE>mode, operands);
-    DONE;
-  }
-)
-
-;; Floating-point vcond.  All comparisons except FCMUO allow a zero operand;
-;; aarch64_expand_sve_vcond handles the case of an FCMUO with zero.
-(define_expand "vcond<mode><v_fp_equiv>"
-  [(set (match_operand:SVE_FULL_HSD 0 "register_operand")
-       (if_then_else:SVE_FULL_HSD
-         (match_operator 3 "comparison_operator"
-           [(match_operand:<V_FP_EQUIV> 4 "register_operand")
-            (match_operand:<V_FP_EQUIV> 5 "aarch64_simd_reg_or_zero")])
-         (match_operand:SVE_FULL_HSD 1 "nonmemory_operand")
-         (match_operand:SVE_FULL_HSD 2 "nonmemory_operand")))]
-  "TARGET_SVE"
-  {
-    aarch64_expand_sve_vcond (<MODE>mode, <V_FP_EQUIV>mode, operands);
-    DONE;
-  }
-)
-
 ;; -------------------------------------------------------------------------
 ;; ---- [INT] Comparisons
 ;; -------------------------------------------------------------------------
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index de6a4fba3b66..ac93d076bd11 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -27026,36 +27026,6 @@ aarch64_expand_sve_vec_cmp_float (rtx target, rtx_code 
code,
   return false;
 }
 
-/* Expand an SVE vcond pattern with operands OPS.  DATA_MODE is the mode
-   of the data being selected and CMP_MODE is the mode of the values being
-   compared.  */
-
-void
-aarch64_expand_sve_vcond (machine_mode data_mode, machine_mode cmp_mode,
-                         rtx *ops)
-{
-  machine_mode pred_mode = aarch64_get_mask_mode (cmp_mode).require ();
-  rtx pred = gen_reg_rtx (pred_mode);
-  if (FLOAT_MODE_P (cmp_mode))
-    {
-      if (aarch64_expand_sve_vec_cmp_float (pred, GET_CODE (ops[3]),
-                                           ops[4], ops[5], true))
-       std::swap (ops[1], ops[2]);
-    }
-  else
-    aarch64_expand_sve_vec_cmp_int (pred, GET_CODE (ops[3]), ops[4], ops[5]);
-
-  if (!aarch64_sve_reg_or_dup_imm (ops[1], data_mode))
-    ops[1] = force_reg (data_mode, ops[1]);
-  /* The "false" value can only be zero if the "true" value is a constant.  */
-  if (register_operand (ops[1], data_mode)
-      || !aarch64_simd_reg_or_zero (ops[2], data_mode))
-    ops[2] = force_reg (data_mode, ops[2]);
-
-  rtvec vec = gen_rtvec (3, pred, ops[1], ops[2]);
-  emit_set_insn (ops[0], gen_rtx_UNSPEC (data_mode, vec, UNSPEC_SEL));
-}
-
 /* Return true if:
 
    (a) MODE1 and MODE2 use the same layout for bytes that are common
diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md
index 47caddfe0c0f..89c72b24aeb7 100644
--- a/gcc/config/aarch64/iterators.md
+++ b/gcc/config/aarch64/iterators.md
@@ -2040,16 +2040,6 @@
 (define_mode_attr vq_int_equiv [(DF   "v2di")   (SF   "v4si")
 ])
 
-;; Floating-point equivalent of selected modes.
-(define_mode_attr V_FP_EQUIV [(VNx8HI "VNx8HF") (VNx8HF "VNx8HF")
-                             (VNx8BF "VNx8HF")
-                             (VNx4SI "VNx4SF") (VNx4SF "VNx4SF")
-                             (VNx2DI "VNx2DF") (VNx2DF "VNx2DF")])
-(define_mode_attr v_fp_equiv [(VNx8HI "vnx8hf") (VNx8HF "vnx8hf")
-                             (VNx8BF "vnx8hf")
-                             (VNx4SI "vnx4sf") (VNx4SF "vnx4sf")
-                             (VNx2DI "vnx2df") (VNx2DF "vnx2df")])
-
 ;; Maps full and partial vector modes of any element type to a full-vector
 ;; integer mode with the same number of units.
 (define_mode_attr V_INT_CONTAINER [(VNx16QI "VNx16QI") (VNx8QI "VNx8HI")
@@ -2079,16 +2069,6 @@
                                   (VNx4SF "vnx4si") (VNx2SF "vnx2di")
                                   (VNx2DF "vnx2di")])
 
-;; Mode for vector conditional operations where the comparison has
-;; different type from the lhs.
-(define_mode_attr V_cmp_mixed [(V2SI "V2SF") (V4SI "V4SF")
-                              (V2DI "V2DF") (V2SF "V2SI")
-                              (V4SF "V4SI") (V2DF "V2DI")])
-
-(define_mode_attr v_cmp_mixed [(V2SI "v2sf") (V4SI "v4sf")
-                              (V2DI "v2df") (V2SF "v2si")
-                              (V4SF "v4si") (V2DF "v2di")])
-
 ;; Lower case element modes (as used in shift immediate patterns).
 (define_mode_attr ve_mode [(V8QI "qi") (V16QI "qi")
                           (V4HI "hi") (V8HI  "hi")

Reply via email to