re PR target/50310 (ICE: in gen_vcondv2div2df, at config/i386/sse.md:1435 with -O...
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Tue, 6 Mar 2012 17:15:43 +0000 (17:15 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Tue, 6 Mar 2012 17:15:43 +0000 (17:15 +0000)
2012-03-05  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR target/50310
* config/rs6000/vector.md (vector_uneq<mode>): Add support for
UNEQ, LTGT, ORDERED, and UNORDERED IEEE vector comparisons.
(vector_ltgt<mode>): Likewise.
(vector_ordered<mode>): Likewise.
(vector_unordered<mode>): Likewise.
* config/rs6000/rs6000.c (rs6000_emit_vector_compare_inner):
Likewise.

From-SVN: r185007

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/vector.md

index e3bba82e6bd72327178ab5dd0321eecf7e50accb..6f5d9cbfd5d8af402292dd81b7b91a8aefe5f851 100644 (file)
@@ -1,3 +1,14 @@
+2012-03-06  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR target/50310
+       * config/rs6000/vector.md (vector_uneq<mode>): Add support for
+       UNEQ, LTGT, ORDERED, and UNORDERED IEEE vector comparisons.
+       (vector_ltgt<mode>): Likewise.
+       (vector_ordered<mode>): Likewise.
+       (vector_unordered<mode>): Likewise.
+       * config/rs6000/rs6000.c (rs6000_emit_vector_compare_inner):
+       Likewise.
+
 2012-03-06  Aldy Hernandez  <aldyh@redhat.com>
 
        * trans-mem.c: New typedef for tm_region_p.
index 04ea22b70dd10160b8bfb01870cd47b6e4ad97a3..5558f7769f5731de3a08a3b9f933787cc12a31e1 100644 (file)
@@ -16077,6 +16077,10 @@ rs6000_emit_vector_compare_inner (enum rtx_code code, rtx op0, rtx op1)
     case EQ:
     case GT:
     case GTU:
+    case ORDERED:
+    case UNORDERED:
+    case UNEQ:
+    case LTGT:
       mask = gen_reg_rtx (mode);
       emit_insn (gen_rtx_SET (VOIDmode,
                              mask,
index bcb23ac5de60d7fb973f87207f278fe8fa1a0a6e..6674054223b4d343f27b1923eca6c1bf1799c521 100644 (file)
   "VECTOR_UNIT_ALTIVEC_P (<MODE>mode)"
   "")
 
+(define_insn_and_split "*vector_uneq<mode>"
+  [(set (match_operand:VEC_F 0 "vfloat_operand" "")
+       (uneq:VEC_F (match_operand:VEC_F 1 "vfloat_operand" "")
+                   (match_operand:VEC_F 2 "vfloat_operand" "")))]
+  "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
+  "#"
+  ""
+  [(set (match_dup 3)
+       (gt:VEC_F (match_dup 1)
+                 (match_dup 2)))
+   (set (match_dup 4)
+       (gt:VEC_F (match_dup 2)
+                 (match_dup 1)))
+   (set (match_dup 0)
+       (not:VEC_F (ior:VEC_F (match_dup 3)
+                             (match_dup 4))))]
+  "
+{
+  operands[3] = gen_reg_rtx (<MODE>mode);
+  operands[4] = gen_reg_rtx (<MODE>mode);
+}")
+
+(define_insn_and_split "*vector_ltgt<mode>"
+  [(set (match_operand:VEC_F 0 "vfloat_operand" "")
+       (ltgt:VEC_F (match_operand:VEC_F 1 "vfloat_operand" "")
+                   (match_operand:VEC_F 2 "vfloat_operand" "")))]
+  "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
+  "#"
+  ""
+  [(set (match_dup 3)
+       (gt:VEC_F (match_dup 1)
+                 (match_dup 2)))
+   (set (match_dup 4)
+       (gt:VEC_F (match_dup 2)
+                 (match_dup 1)))
+   (set (match_dup 0)
+       (ior:VEC_F (match_dup 3)
+                  (match_dup 4)))]
+  "
+{
+  operands[3] = gen_reg_rtx (<MODE>mode);
+  operands[4] = gen_reg_rtx (<MODE>mode);
+}")
+
+(define_insn_and_split "*vector_ordered<mode>"
+  [(set (match_operand:VEC_F 0 "vfloat_operand" "")
+       (ordered:VEC_F (match_operand:VEC_F 1 "vfloat_operand" "")
+                      (match_operand:VEC_F 2 "vfloat_operand" "")))]
+  "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
+  "#"
+  ""
+  [(set (match_dup 3)
+       (ge:VEC_F (match_dup 1)
+                 (match_dup 2)))
+   (set (match_dup 4)
+       (ge:VEC_F (match_dup 2)
+                 (match_dup 1)))
+   (set (match_dup 0)
+       (ior:VEC_F (match_dup 3)
+                  (match_dup 4)))]
+  "
+{
+  operands[3] = gen_reg_rtx (<MODE>mode);
+  operands[4] = gen_reg_rtx (<MODE>mode);
+}")
+
+(define_insn_and_split "*vector_unordered<mode>"
+  [(set (match_operand:VEC_F 0 "vfloat_operand" "")
+       (unordered:VEC_F (match_operand:VEC_F 1 "vfloat_operand" "")
+                        (match_operand:VEC_F 2 "vfloat_operand" "")))]
+  "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
+  "#"
+  ""
+  [(set (match_dup 3)
+       (ge:VEC_F (match_dup 1)
+                 (match_dup 2)))
+   (set (match_dup 4)
+       (ge:VEC_F (match_dup 2)
+                 (match_dup 1)))
+   (set (match_dup 0)
+       (not:VEC_F (ior:VEC_F (match_dup 3)
+                             (match_dup 4))))]
+  "
+{
+  operands[3] = gen_reg_rtx (<MODE>mode);
+  operands[4] = gen_reg_rtx (<MODE>mode);
+}")
+
 ;; Note the arguments for __builtin_altivec_vsel are op2, op1, mask
 ;; which is in the reverse order that we want
 (define_expand "vector_select_<mode>"