This fixes the vectorization regressions present on the SPARC by switching 
from vcond[u] patterns to vec_cmp[u] + vcond_mask_ patterns.  While I was at 
it, I merged the patterns for V4HI/V2SI and V8QI enabled with VIS 3/VIS 4 to 
follow the model of those enabled with VIS 4B, and standardized the mnemonics 
to the version documented in the Oracle SPARC architecture 2015.

Bootstrapped/regtested on SPARC64/Solaris 10.4, applied on the mainline.


2024-11-24  Eric Botcazou  <ebotca...@adacore.com>

        PR target/117715
        * config/sparc/sparc-protos.h (sparc_expand_vcond): Rename to...
        (sparc_expand_vcond_mask): ...this.
        * config/sparc/sparc.cc (TARGET_VECTORIZE_GET_MASK_MODE): Define.
        (sparc_vis_init_builtins): Adjust the CODE_FOR_* identifiers.
        (sparc_get_mask_mode): New function.
        (sparc_expand_vcond): Rename to...
        (sparc_expand_vcond_mask): ...this and adjust.
        * config/sparc/sparc.md (unspec): Remove UNSPEC_FCMP & UNSPEC_FUCMP
        and rename UNSPEC_FPUCMPSHL into UNSPEC_FPCMPUSHL.
        (fcmp<gcond:code><GCM:gcm_name><P:mode>_vis): Merge into...
        (fpcmp<gcond:code>8<P:mode>_vis): Merge into...
        (fpcmp<fpcmpcond:code><FPCMP:vbits><P:mode>_vis): ...this.
        (fucmp<gcond:code>8<P:mode>_vis): Merge into...
        (fpcmpu<gcond:code><GCM:gcm_name><P:mode>_vis): Merge into...
        (fpcmpu<fpcmpucond:signed_code><FPCMP:vbits><P:mode>_vis): ...this.
        (vec_cmp<FPCMP:mode><P:mode>): New expander.
        (vec_cmpu<FPCMP:mode><P:mode>): Likewise.
        (vcond<GCM:mode><GCM:mode>): Delete.
        (vcondv8qiv8qi): Likewise.
        (vcondu<GCM:mode><GCM:mode>): Likewise.
        (vconduv8qiv8qi): Likewise.
        (vcond_mask_<FPCMP:mode><P:mode>): New expander.
        (fpcmp<fpcscond:code><FPCSMODE:vbits><P:mode>shl): Adjust.
        (fpcmpu<fpcsucond:code><FPCSMODE:vbits><P:mode>shl): Likewise.
        (fpcmpde<FPCSMODE:vbits><P:mode>shl): Likewise.
        (fpcmpur<FPCSMODE:vbits><P:mode>shl): Likewise.
        * doc/md.texi (vcond_mask_len_): Fix pasto.
        

2024-11-24  Eric Botcazou  <ebotca...@adacore.com>

        * gcc.target/sparc/20230328-1.c: Adjust to new mnemonics.
        * gcc.target/sparc/20230328-4.c: Likewise.
        * gcc.target/sparc/fcmp.c: Likewise.
        * gcc.target/sparc/fucmp.c: Likewise.

-- 
Eric Botcazou
diff --git a/gcc/config/sparc/sparc-protos.h b/gcc/config/sparc/sparc-protos.h
index bc306083e5f..333f48e82da 100644
--- a/gcc/config/sparc/sparc-protos.h
+++ b/gcc/config/sparc/sparc-protos.h
@@ -106,7 +106,7 @@ extern void sparc_expand_compare_and_swap (rtx op[]);
 extern void sparc_expand_vector_init (rtx, rtx);
 extern void sparc_expand_vec_perm_bmask(machine_mode, rtx);
 extern bool sparc_expand_conditional_move (machine_mode, rtx *);
-extern void sparc_expand_vcond (machine_mode, rtx *, int, int);
+extern void sparc_expand_vcond_mask (machine_mode, rtx *, int);
 unsigned int sparc_regmode_natural_size (machine_mode);
 #endif /* RTX_CODE */
 
diff --git a/gcc/config/sparc/sparc.cc b/gcc/config/sparc/sparc.cc
index 3935a97fac8..f1944e510e5 100644
--- a/gcc/config/sparc/sparc.cc
+++ b/gcc/config/sparc/sparc.cc
@@ -719,6 +719,7 @@ static HOST_WIDE_INT sparc_constant_alignment (const_tree, HOST_WIDE_INT);
 static bool sparc_vectorize_vec_perm_const (machine_mode, machine_mode,
 					    rtx, rtx, rtx,
 					    const vec_perm_indices &);
+static opt_machine_mode sparc_get_mask_mode (machine_mode);
 static bool sparc_can_follow_jump (const rtx_insn *, const rtx_insn *);
 static HARD_REG_SET sparc_zero_call_used_regs (HARD_REG_SET);
 static machine_mode sparc_c_mode_for_floating_type (enum tree_index);
@@ -972,6 +973,9 @@ char sparc_hard_reg_printed[8];
 #undef TARGET_VECTORIZE_VEC_PERM_CONST
 #define TARGET_VECTORIZE_VEC_PERM_CONST sparc_vectorize_vec_perm_const
 
+#undef TARGET_VECTORIZE_GET_MASK_MODE
+#define TARGET_VECTORIZE_GET_MASK_MODE sparc_get_mask_mode
+
 #undef TARGET_CAN_FOLLOW_JUMP
 #define TARGET_CAN_FOLLOW_JUMP sparc_can_follow_jump
 
@@ -11271,40 +11275,40 @@ sparc_vis_init_builtins (void)
   /* Pixel compare.  */
   if (TARGET_ARCH64)
     {
-      def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fcmple16di_vis,
+      def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fpcmple16di_vis,
 			 SPARC_BUILTIN_FCMPLE16, di_ftype_v4hi_v4hi);
-      def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fcmple32di_vis,
+      def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fpcmple32di_vis,
 			 SPARC_BUILTIN_FCMPLE32, di_ftype_v2si_v2si);
-      def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fcmpne16di_vis,
+      def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fpcmpne16di_vis,
 			 SPARC_BUILTIN_FCMPNE16, di_ftype_v4hi_v4hi);
-      def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fcmpne32di_vis,
+      def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fpcmpne32di_vis,
 			 SPARC_BUILTIN_FCMPNE32, di_ftype_v2si_v2si);
-      def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fcmpgt16di_vis,
+      def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fpcmpgt16di_vis,
 			 SPARC_BUILTIN_FCMPGT16, di_ftype_v4hi_v4hi);
-      def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fcmpgt32di_vis,
+      def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fpcmpgt32di_vis,
 			 SPARC_BUILTIN_FCMPGT32, di_ftype_v2si_v2si);
-      def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fcmpeq16di_vis,
+      def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fpcmpeq16di_vis,
 			 SPARC_BUILTIN_FCMPEQ16, di_ftype_v4hi_v4hi);
-      def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fcmpeq32di_vis,
+      def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fpcmpeq32di_vis,
 			 SPARC_BUILTIN_FCMPEQ32, di_ftype_v2si_v2si);
     }
   else
     {
-      def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fcmple16si_vis,
+      def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fpcmple16si_vis,
 			 SPARC_BUILTIN_FCMPLE16, si_ftype_v4hi_v4hi);
-      def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fcmple32si_vis,
+      def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fpcmple32si_vis,
 			 SPARC_BUILTIN_FCMPLE32, si_ftype_v2si_v2si);
-      def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fcmpne16si_vis,
+      def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fpcmpne16si_vis,
 			 SPARC_BUILTIN_FCMPNE16, si_ftype_v4hi_v4hi);
-      def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fcmpne32si_vis,
+      def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fpcmpne32si_vis,
 			 SPARC_BUILTIN_FCMPNE32, si_ftype_v2si_v2si);
-      def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fcmpgt16si_vis,
+      def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fpcmpgt16si_vis,
 			 SPARC_BUILTIN_FCMPGT16, si_ftype_v4hi_v4hi);
-      def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fcmpgt32si_vis,
+      def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fpcmpgt32si_vis,
 			 SPARC_BUILTIN_FCMPGT32, si_ftype_v2si_v2si);
-      def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fcmpeq16si_vis,
+      def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fpcmpeq16si_vis,
 			 SPARC_BUILTIN_FCMPEQ16, si_ftype_v4hi_v4hi);
-      def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fcmpeq32si_vis,
+      def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fpcmpeq32si_vis,
 			 SPARC_BUILTIN_FCMPEQ32, si_ftype_v2si_v2si);
     }
 
@@ -11471,24 +11475,24 @@ sparc_vis_init_builtins (void)
 
       if (TARGET_ARCH64)
 	{
-	  def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fucmple8di_vis,
+	  def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fpcmpule8di_vis,
 			     SPARC_BUILTIN_FUCMPLE8, di_ftype_v8qi_v8qi);
-	  def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fucmpne8di_vis,
+	  def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fpcmpne8di_vis,
 			     SPARC_BUILTIN_FUCMPNE8, di_ftype_v8qi_v8qi);
-	  def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fucmpgt8di_vis,
+	  def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fpcmpugt8di_vis,
 			     SPARC_BUILTIN_FUCMPGT8, di_ftype_v8qi_v8qi);
-	  def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fucmpeq8di_vis,
+	  def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fpcmpeq8di_vis,
 			     SPARC_BUILTIN_FUCMPEQ8, di_ftype_v8qi_v8qi);
 	}
       else
 	{
-	  def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fucmple8si_vis,
+	  def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fpcmpule8si_vis,
 			     SPARC_BUILTIN_FUCMPLE8, si_ftype_v8qi_v8qi);
-	  def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fucmpne8si_vis,
+	  def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fpcmpne8si_vis,
 			     SPARC_BUILTIN_FUCMPNE8, si_ftype_v8qi_v8qi);
-	  def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fucmpgt8si_vis,
+	  def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fpcmpugt8si_vis,
 			     SPARC_BUILTIN_FUCMPGT8, si_ftype_v8qi_v8qi);
-	  def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fucmpeq8si_vis,
+	  def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fpcmpeq8si_vis,
 			     SPARC_BUILTIN_FUCMPEQ8, si_ftype_v8qi_v8qi);
 	}
 
@@ -13105,6 +13109,14 @@ sparc_vectorize_vec_perm_const (machine_mode vmode, machine_mode op_mode,
   return true;
 }
 
+/* Implement TARGET_VECTORIZE_GET_MASK_MODE.  */
+
+static opt_machine_mode
+sparc_get_mask_mode (machine_mode)
+{
+  return Pmode;
+}
+
 /* Implement TARGET_FRAME_POINTER_REQUIRED.  */
 
 static bool
@@ -13679,43 +13691,20 @@ sparc_expand_conditional_move (machine_mode mode, rtx *operands)
 }
 
 /* Emit code to conditionally move a combination of OPERANDS[1] and OPERANDS[2]
-   into OPERANDS[0] in MODE, depending on the outcome of the comparison of
-   OPERANDS[4] and OPERANDS[5].  OPERANDS[3] is the operator of the condition.
-   FCODE is the machine code to be used for OPERANDS[3] and CCODE the machine
-   code to be used for the condition mask.  */
+   into OPERANDS[0] in MODE, depending on the mask in OPERANDS[3].  CODE is the
+   machine code to be used for the cmask instruction.  */
 
 void
-sparc_expand_vcond (machine_mode mode, rtx *operands, int ccode, int fcode)
-{
-  enum rtx_code code = signed_condition (GET_CODE (operands[3]));
-  rtx mask, cop0, cop1, fcmp, cmask, bshuf, gsr;
-
-  mask = gen_reg_rtx (Pmode);
-  cop0 = operands[4];
-  cop1 = operands[5];
-  if (code == LT || code == GE)
-    {
-      code = swap_condition (code);
-      std::swap (cop0, cop1);
-    }
-
-  gsr = gen_rtx_REG (DImode, SPARC_GSR_REG);
-
-  fcmp = gen_rtx_UNSPEC (Pmode,
-			 gen_rtvec (1, gen_rtx_fmt_ee (code, mode, cop0, cop1)),
-			 fcode);
-
-  cmask = gen_rtx_UNSPEC (DImode,
-			  gen_rtvec (2, mask, gsr),
-			  ccode);
-
-  bshuf = gen_rtx_UNSPEC (mode,
-			  gen_rtvec (3, operands[1], operands[2], gsr),
-			  UNSPEC_BSHUFFLE);
-
-  emit_insn (gen_rtx_SET (mask, fcmp));
+sparc_expand_vcond_mask (machine_mode mode, rtx *operands, int code)
+{
+  rtx gsr = gen_rtx_REG (DImode, SPARC_GSR_REG);
+  rtx cmask = gen_rtx_UNSPEC (DImode,
+			      gen_rtvec (2, operands[3], gsr),
+			      code);
+  rtx bshuf = gen_rtx_UNSPEC (mode,
+			      gen_rtvec (3, operands[1], operands[2], gsr),
+			      UNSPEC_BSHUFFLE);
   emit_insn (gen_rtx_SET (gsr, cmask));
-
   emit_insn (gen_rtx_SET (operands[0], bshuf));
 }
 
diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md
index 9703a2097e6..0de9a7b6394 100644
--- a/gcc/config/sparc/sparc.md
+++ b/gcc/config/sparc/sparc.md
@@ -56,7 +56,6 @@
   UNSPEC_MUL8UL
   UNSPEC_MULDUL
   UNSPEC_ALIGNDATA
-  UNSPEC_FCMP
   UNSPEC_PDIST
   UNSPEC_EDGE8
   UNSPEC_EDGE8L
@@ -83,7 +82,6 @@
   UNSPEC_CMASK32
   UNSPEC_FCHKSM16
   UNSPEC_PDISTN
-  UNSPEC_FUCMP
   UNSPEC_FHADD
   UNSPEC_FHSUB
   UNSPEC_XMUL
@@ -97,7 +95,7 @@
 
   UNSPEC_DICTUNPACK
   UNSPEC_FPCMPSHL
-  UNSPEC_FPUCMPSHL
+  UNSPEC_FPCMPUSHL
   UNSPEC_FPCMPDESHL
   UNSPEC_FPCMPURSHL
 ])
@@ -8984,95 +8982,78 @@
   "edge32l\t%r1, %r2, %0"
   [(set_attr "type" "edge")])
 
-(define_code_iterator gcond [le ne gt eq])
-(define_mode_iterator GCM [V4HI V2SI])
-(define_mode_attr gcm_name [(V4HI "16") (V2SI "32")])
-
-(define_insn "fcmp<gcond:code><GCM:gcm_name><P:mode>_vis"
-  [(set (match_operand:P 0 "register_operand" "=r")
-  	(unspec:P [(gcond:GCM (match_operand:GCM 1 "register_operand" "e")
-		              (match_operand:GCM 2 "register_operand" "e"))]
-	 UNSPEC_FCMP))]
-  "TARGET_VIS"
-  "fcmp<gcond:code><GCM:gcm_name>\t%1, %2, %0"
-  [(set_attr "type" "viscmp")])
+(define_mode_iterator FPCMP [V8QI V4HI V2SI])
+(define_code_iterator fpcmpcond [eq ne le gt])
+(define_code_iterator fpcmpucond [leu gtu])
+(define_code_attr signed_code [(leu "le") (gtu "gt")])
 
-(define_insn "fpcmp<gcond:code>8<P:mode>_vis"
+(define_insn "fpcmp<fpcmpcond:code><FPCMP:vbits><P:mode>_vis"
   [(set (match_operand:P 0 "register_operand" "=r")
-  	(unspec:P [(gcond:V8QI (match_operand:V8QI 1 "register_operand" "e")
-		               (match_operand:V8QI 2 "register_operand" "e"))]
-	 UNSPEC_FCMP))]
-  "TARGET_VIS4"
-  "fpcmp<gcond:code>8\t%1, %2, %0"
+	(fpcmpcond:P (match_operand:FPCMP 1 "register_operand" "e")
+		     (match_operand:FPCMP 2 "register_operand" "e")))]
+  "TARGET_VIS
+   && (<FPCMP:MODE>mode != V8QImode
+       || (TARGET_VIS3 && (<fpcmpcond:CODE> == EQ || <fpcmpcond:CODE> == NE))
+       || TARGET_VIS4)"
+  "fpcmp<fpcmpcond:code><FPCMP:vbits>\t%1, %2, %0"
   [(set_attr "type" "viscmp")])
 
-(define_expand "vcond<GCM:mode><GCM:mode>"
-  [(match_operand:GCM 0 "register_operand" "")
-   (match_operand:GCM 1 "register_operand" "")
-   (match_operand:GCM 2 "register_operand" "")
-   (match_operator 3 ""
-     [(match_operand:GCM 4 "register_operand" "")
-      (match_operand:GCM 5 "register_operand" "")])]
+(define_expand "vec_cmp<FPCMP:mode><P:mode>"
+  [(set (match_operand:P 0 "register_operand" "")
+        (match_operator:P 1 "comparison_operator"
+          [(match_operand:FPCMP 2 "register_operand" "")
+           (match_operand:FPCMP 3 "register_operand" "")]))]
   "TARGET_VIS3"
 {
-  sparc_expand_vcond (<MODE>mode, operands, UNSPEC_CMASK<gcm_name>, UNSPEC_FCMP);
-  DONE;
-})
+  enum rtx_code code = GET_CODE (operands[1]);
 
-(define_expand "vcondv8qiv8qi"
-  [(match_operand:V8QI 0 "register_operand" "")
-   (match_operand:V8QI 1 "register_operand" "")
-   (match_operand:V8QI 2 "register_operand" "")
-   (match_operator 3 ""
-     [(match_operand:V8QI 4 "register_operand" "")
-      (match_operand:V8QI 5 "register_operand" "")])]
-  "TARGET_VIS4"
-{
-  sparc_expand_vcond (V8QImode, operands, UNSPEC_CMASK8, UNSPEC_FCMP);
-  DONE;
-})
+  /* VIS 4 is required for ordering comparisons if the mode is V8QI.  */
+  if (<FPCMP:MODE>mode == V8QImode && code != EQ && code != NE && !TARGET_VIS4)
+    FAIL;
 
-(define_insn "fucmp<gcond:code>8<P:mode>_vis"
-  [(set (match_operand:P 0 "register_operand" "=r")
-	(unspec:P [(gcond:V8QI (match_operand:V8QI 1 "register_operand" "e")
-		               (match_operand:V8QI 2 "register_operand" "e"))]
-	 UNSPEC_FUCMP))]
-  "TARGET_VIS3"
-  "fucmp<gcond:code>8\t%1, %2, %0"
-  [(set_attr "type" "viscmp")])
+  if (code == LT || code == GE)
+    {
+      PUT_CODE (operands[1], swap_condition (code));
+      std::swap (operands[2], operands[3]);
+    }
+})
 
-(define_insn "fpcmpu<gcond:code><GCM:gcm_name><P:mode>_vis"
+(define_insn "fpcmpu<fpcmpucond:signed_code><FPCMP:vbits><P:mode>_vis"
   [(set (match_operand:P 0 "register_operand" "=r")
-	(unspec:P [(gcond:GCM (match_operand:GCM 1 "register_operand" "e")
-		              (match_operand:GCM 2 "register_operand" "e"))]
-	 UNSPEC_FUCMP))]
-  "TARGET_VIS4"
-  "fpcmpu<gcond:code><GCM:gcm_name>\t%1, %2, %0"
+	(fpcmpucond:P (match_operand:FPCMP 1 "register_operand" "e")
+		      (match_operand:FPCMP 2 "register_operand" "e")))]
+  "TARGET_VIS3 && (<FPCMP:MODE>mode == V8QImode || TARGET_VIS4)"
+  "fpcmpu<fpcmpucond:signed_code><FPCMP:vbits>\t%1, %2, %0"
   [(set_attr "type" "viscmp")])
 
-(define_expand "vcondu<GCM:mode><GCM:mode>"
-  [(match_operand:GCM 0 "register_operand" "")
-   (match_operand:GCM 1 "register_operand" "")
-   (match_operand:GCM 2 "register_operand" "")
-   (match_operator 3 ""
-     [(match_operand:GCM 4 "register_operand" "")
-      (match_operand:GCM 5 "register_operand" "")])]
-  "TARGET_VIS4"
+(define_expand "vec_cmpu<FPCMP:mode><P:mode>"
+  [(set (match_operand:P 0 "register_operand" "")
+        (match_operator:P 1 "comparison_operator"
+          [(match_operand:FPCMP 2 "register_operand" "")
+           (match_operand:FPCMP 3 "register_operand" "")]))]
+  "TARGET_VIS3"
 {
-  sparc_expand_vcond (<MODE>mode, operands, UNSPEC_CMASK<gcm_name>, UNSPEC_FUCMP);
-  DONE;
+  enum rtx_code code = GET_CODE (operands[1]);
+
+  /* VIS 4 is required for ordering comparisons if the mode is not V8QI.  */
+  if (<FPCMP:MODE>mode != V8QImode && code != EQ && code != NE && !TARGET_VIS4)
+    FAIL;
+
+  if (code == LTU || code == GEU)
+    {
+      PUT_CODE (operands[1], swap_condition (code));
+      std::swap (operands[2], operands[3]);
+    }
 })
 
-(define_expand "vconduv8qiv8qi"
-  [(match_operand:V8QI 0 "register_operand" "")
-   (match_operand:V8QI 1 "register_operand" "")
-   (match_operand:V8QI 2 "register_operand" "")
-   (match_operator 3 ""
-     [(match_operand:V8QI 4 "register_operand" "")
-      (match_operand:V8QI 5 "register_operand" "")])]
+(define_expand "vcond_mask_<FPCMP:mode><P:mode>"
+  [(match_operand:FPCMP 0 "register_operand" "")
+   (match_operand:FPCMP 1 "register_operand" "")
+   (match_operand:FPCMP 2 "register_operand" "")
+   (match_operand:P     3 "register_operand" "")]
   "TARGET_VIS3"
 {
-  sparc_expand_vcond (V8QImode, operands, UNSPEC_CMASK8, UNSPEC_FUCMP);
+  sparc_expand_vcond_mask (<FPCMP:MODE>mode, operands, UNSPEC_CMASK<vbits>);
   DONE;
 })
 
@@ -9252,6 +9233,8 @@
 (define_code_attr vis3_shift_patname
   [(ashift "ashl") (ss_ashift "ssashl") (lshiftrt "lshr") (ashiftrt "ashr")])
    
+(define_mode_iterator GCM [V4HI V2SI])
+
 (define_insn "v<vis3_shift_patname><GCM:mode>3"
   [(set (match_operand:GCM 0 "register_operand" "=<vconstr>")
 	(vis3_shift:GCM (match_operand:GCM 1 "register_operand" "<vconstr>")
@@ -9485,7 +9468,7 @@
 
 ;; VIS4B instructions.
 
-(define_mode_iterator DUMODE [V2SI V4HI V8QI])
+(define_mode_iterator DUMODE [V8QI V4HI V2SI])
 
 (define_insn "dictunpack<DUMODE:vbits>"
   [(set (match_operand:DUMODE 0 "register_operand" "=e")
@@ -9497,48 +9480,44 @@
   [(set_attr "type" "fga")
    (set_attr "subtype" "other")])
 
-(define_mode_iterator FPCSMODE [V2SI V4HI V8QI])
-(define_code_iterator fpcscond [le gt eq ne])
-(define_code_iterator fpcsucond [le gt])
-
-(define_insn "fpcmp<fpcscond:code><FPCSMODE:vbits><P:mode>shl"
+(define_insn "fpcmp<fpcmpcond:code><FPCMP:vbits><P:mode>shl"
   [(set (match_operand:P 0 "register_operand" "=r")
-        (unspec:P [(fpcscond:FPCSMODE (match_operand:FPCSMODE 1 "register_operand" "e")
-                                      (match_operand:FPCSMODE 2 "register_operand" "e"))
+        (unspec:P [(fpcmpcond:FPCMP (match_operand:FPCMP 1 "register_operand" "e")
+                                    (match_operand:FPCMP 2 "register_operand" "e"))
                    (match_operand:SI 3 "imm2_operand" "q")]
          UNSPEC_FPCMPSHL))]
    "TARGET_VIS4B"
-   "fpcmp<fpcscond:code><FPCSMODE:vbits>shl\t%1, %2, %3, %0"
+   "fpcmp<fpcmpcond:code><FPCMP:vbits>shl\t%1, %2, %3, %0"
    [(set_attr "type" "viscmp")])
 
-(define_insn "fpcmpu<fpcsucond:code><FPCSMODE:vbits><P:mode>shl"
+(define_insn "fpcmpu<fpcmpucond:signed_code><FPCMP:vbits><P:mode>shl"
   [(set (match_operand:P 0 "register_operand" "=r")
-        (unspec:P [(fpcsucond:FPCSMODE (match_operand:FPCSMODE 1 "register_operand" "e")
-                                       (match_operand:FPCSMODE 2 "register_operand" "e"))
+        (unspec:P [(fpcmpucond:FPCMP (match_operand:FPCMP 1 "register_operand" "e")
+                                     (match_operand:FPCMP 2 "register_operand" "e"))
                    (match_operand:SI 3 "imm2_operand" "q")]
-         UNSPEC_FPUCMPSHL))]
+         UNSPEC_FPCMPUSHL))]
    "TARGET_VIS4B"
-   "fpcmpu<fpcsucond:code><FPCSMODE:vbits>shl\t%1, %2, %3, %0"
+   "fpcmpu<fpcmpucond:signed_code><FPCMP:vbits>shl\t%1, %2, %3, %0"
    [(set_attr "type" "viscmp")])
 
-(define_insn "fpcmpde<FPCSMODE:vbits><P:mode>shl"
+(define_insn "fpcmpde<FPCMP:vbits><P:mode>shl"
   [(set (match_operand:P 0 "register_operand" "=r")
-        (unspec:P [(match_operand:FPCSMODE 1 "register_operand" "e")
-                   (match_operand:FPCSMODE 2 "register_operand" "e")
+        (unspec:P [(match_operand:FPCMP 1 "register_operand" "e")
+                   (match_operand:FPCMP 2 "register_operand" "e")
                    (match_operand:SI 3 "imm2_operand" "q")]
          UNSPEC_FPCMPDESHL))]
    "TARGET_VIS4B"
-   "fpcmpde<FPCSMODE:vbits>shl\t%1, %2, %3, %0"
+   "fpcmpde<FPCMP:vbits>shl\t%1, %2, %3, %0"
    [(set_attr "type" "viscmp")])
 
-(define_insn "fpcmpur<FPCSMODE:vbits><P:mode>shl"
+(define_insn "fpcmpur<FPCMP:vbits><P:mode>shl"
   [(set (match_operand:P 0 "register_operand" "=r")
-        (unspec:P [(match_operand:FPCSMODE 1 "register_operand" "e")
-                   (match_operand:FPCSMODE 2 "register_operand" "e")
+        (unspec:P [(match_operand:FPCMP 1 "register_operand" "e")
+                   (match_operand:FPCMP 2 "register_operand" "e")
                    (match_operand:SI 3 "imm2_operand" "q")]
          UNSPEC_FPCMPURSHL))]
    "TARGET_VIS4B"
-   "fpcmpur<FPCSMODE:vbits>shl\t%1, %2, %3, %0"
+   "fpcmpur<FPCMP:vbits>shl\t%1, %2, %3, %0"
    [(set_attr "type" "viscmp")])
 
 (include "sync.md")
diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi
index c8f1424a042..9b76609dee3 100644
--- a/gcc/doc/md.texi
+++ b/gcc/doc/md.texi
@@ -5388,7 +5388,7 @@ Similar to @code{vcond@var{m}@var{n}} but operand 3 holds a pre-computed
 result of vector comparison.
 
 @cindex @code{vcond_mask_len_@var{m}@var{n}} instruction pattern
-@item @samp{vcond_mask_@var{m}@var{n}}
+@item @samp{vcond_mask_len_@var{m}@var{n}}
 Set each element of operand 0 to the corresponding element of operand 2
 or operand 3.  Choose operand 2 if both the element index is less than
 operand 4 plus operand 5 and the corresponding element of operand 1
diff --git a/gcc/testsuite/gcc.target/sparc/20230328-1.c b/gcc/testsuite/gcc.target/sparc/20230328-1.c
index becdc2ed3b3..49acf0b5d58 100644
--- a/gcc/testsuite/gcc.target/sparc/20230328-1.c
+++ b/gcc/testsuite/gcc.target/sparc/20230328-1.c
@@ -16,4 +16,4 @@ void foo (void)
     s.ub[i] = s.ub[i] > v;
 }
 
-/* { dg-final { scan-assembler "fucmpgt8\t%" } } */
+/* { dg-final { scan-assembler "fpcmpugt8\t%" } } */
diff --git a/gcc/testsuite/gcc.target/sparc/20230328-4.c b/gcc/testsuite/gcc.target/sparc/20230328-4.c
index f3e4ecef7b8..d51eb06b9d0 100644
--- a/gcc/testsuite/gcc.target/sparc/20230328-4.c
+++ b/gcc/testsuite/gcc.target/sparc/20230328-4.c
@@ -16,4 +16,4 @@ void foo (void)
     s.ub[i] = s.ub[i] > v;
 }
 
-/* { dg-final { scan-assembler "fcmpgt16\t%" } } */
+/* { dg-final { scan-assembler "fpcmpgt16\t%" } } */
diff --git a/gcc/testsuite/gcc.target/sparc/fcmp.c b/gcc/testsuite/gcc.target/sparc/fcmp.c
index 959a674e1e7..b08a81ae452 100644
--- a/gcc/testsuite/gcc.target/sparc/fcmp.c
+++ b/gcc/testsuite/gcc.target/sparc/fcmp.c
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-mcpu=ultrasparc -mvis" } */
+
 typedef int vec32 __attribute__((vector_size(8)));
 typedef short vec16 __attribute__((vector_size(8)));
 
@@ -43,11 +44,11 @@ long test_fcmpeq32 (vec32 a, vec32 b)
   return __builtin_vis_fcmpeq32 (a, b);
 }
 
-/* { dg-final { scan-assembler "fcmple16\t%" } } */
-/* { dg-final { scan-assembler "fcmple32\t%" } } */
-/* { dg-final { scan-assembler "fcmpne16\t%" } } */
-/* { dg-final { scan-assembler "fcmpne32\t%" } } */
-/* { dg-final { scan-assembler "fcmpgt16\t%" } } */
-/* { dg-final { scan-assembler "fcmpgt32\t%" } } */
-/* { dg-final { scan-assembler "fcmpeq16\t%" } } */
-/* { dg-final { scan-assembler "fcmpeq32\t%" } } */
+/* { dg-final { scan-assembler "fpcmple16\t%" } } */
+/* { dg-final { scan-assembler "fpcmple32\t%" } } */
+/* { dg-final { scan-assembler "fpcmpne16\t%" } } */
+/* { dg-final { scan-assembler "fpcmpne32\t%" } } */
+/* { dg-final { scan-assembler "fpcmpgt16\t%" } } */
+/* { dg-final { scan-assembler "fpcmpgt32\t%" } } */
+/* { dg-final { scan-assembler "fpcmpeq16\t%" } } */
+/* { dg-final { scan-assembler "fpcmpeq32\t%" } } */
diff --git a/gcc/testsuite/gcc.target/sparc/fucmp.c b/gcc/testsuite/gcc.target/sparc/fucmp.c
index 6e8f1b3418e..c4542806e34 100644
--- a/gcc/testsuite/gcc.target/sparc/fucmp.c
+++ b/gcc/testsuite/gcc.target/sparc/fucmp.c
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-mvis3" } */
+
 typedef unsigned char vec8 __attribute__((vector_size(8)));
 
 long test_fucmple8 (vec8 a, vec8 b)
@@ -22,7 +23,7 @@ long test_fucmpeq8 (vec8 a, vec8 b)
   return __builtin_vis_fucmpeq8 (a, b);
 }
 
-/* { dg-final { scan-assembler "fucmple8\t%" } } */
-/* { dg-final { scan-assembler "fucmpne8\t%" } } */
-/* { dg-final { scan-assembler "fucmpgt8\t%" } } */
-/* { dg-final { scan-assembler "fucmpeq8\t%" } } */
+/* { dg-final { scan-assembler "fpcmpule8\t%" } } */
+/* { dg-final { scan-assembler "fpcmpne8\t%" } } */
+/* { dg-final { scan-assembler "fpcmpugt8\t%" } } */
+/* { dg-final { scan-assembler "fpcmpeq8\t%" } } */

Reply via email to