i386.md (setcc splitters): Add four splitters to simplify compound compares that...
authorRichard Henderson <rth@redhat.com>
Thu, 11 Oct 2001 21:49:36 +0000 (14:49 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 11 Oct 2001 21:49:36 +0000 (14:49 -0700)
        * config/i386/i386.md (setcc splitters): Add four splitters to
        simplify compound compares that simplify_comparison can't handle.

From-SVN: r46203

gcc/ChangeLog
gcc/config/i386/i386.md

index 515710d4d3cba6412f331d42fbda0624beefc8f9..8992aa830010f0cb166fe62e1c9bf01b60d95552 100644 (file)
@@ -1,3 +1,8 @@
+2001-10-11  Richard Henderson  <rth@redhat.com>
+
+       * config/i386/i386.md (setcc splitters): Add four splitters to
+       simplify compound compares that simplify_comparison can't handle.
+
 2001-10-11  Zack Weinberg  <zack@codesourcery.com>
 
        * cpplex.c (digraph_spellings, token_spellings): Make static.
index 10c1b355bf8aec38b1047c2c87261dd4b0c589a3..01a9be026e70ed6289e5ad0963810f3cb8528dd4 100644 (file)
   [(set_attr "type" "setcc")
    (set_attr "mode" "QI")])
 
+;; In general it is not safe to assume too much about CCmode registers,
+;; so simplify-rtx stops when it sees a second one.  Under certain 
+;; conditions this is safe on x86, so help combine not create
+;;
+;;     seta    %al
+;;     testb   %al, %al
+;;     sete    %al
+
+(define_split 
+  [(set (match_operand:QI 0 "nonimmediate_operand" "")
+       (ne:QI (match_operator 1 "ix86_comparison_operator"
+                [(reg 17) (const_int 0)])
+           (const_int 0)))]
+  ""
+  [(set (match_dup 0) (match_dup 1))]
+{
+  PUT_MODE (operands[1], QImode);
+})
+
+(define_split 
+  [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" ""))
+       (ne:QI (match_operator 1 "ix86_comparison_operator"
+                [(reg 17) (const_int 0)])
+           (const_int 0)))]
+  ""
+  [(set (match_dup 0) (match_dup 1))]
+{
+  PUT_MODE (operands[1], QImode);
+})
+
+(define_split 
+  [(set (match_operand:QI 0 "nonimmediate_operand" "")
+       (eq:QI (match_operator 1 "ix86_comparison_operator"
+                [(reg 17) (const_int 0)])
+           (const_int 0)))]
+  ""
+  [(set (match_dup 0) (match_dup 1))]
+{
+  rtx new_op1 = copy_rtx (operands[1]);
+  operands[1] = new_op1;
+  PUT_MODE (new_op1, QImode);
+  PUT_CODE (new_op1, REVERSE_CONDITION (GET_CODE (new_op1),
+                                       GET_MODE (XEXP (new_op1, 0))));
+
+  /* Make sure that (a) the CCmode we have for the flags is strong
+     enough for the reversed compare or (b) we have a valid FP compare.  */
+  if (! ix86_comparison_operator (new_op1, VOIDmode))
+    FAIL;
+})
+
+(define_split 
+  [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" ""))
+       (eq:QI (match_operator 1 "ix86_comparison_operator"
+                [(reg 17) (const_int 0)])
+           (const_int 0)))]
+  ""
+  [(set (match_dup 0) (match_dup 1))]
+{
+  rtx new_op1 = copy_rtx (operands[1]);
+  operands[1] = new_op1;
+  PUT_MODE (new_op1, QImode);
+  PUT_CODE (new_op1, REVERSE_CONDITION (GET_CODE (new_op1),
+                                       GET_MODE (XEXP (new_op1, 0))));
+
+  /* Make sure that (a) the CCmode we have for the flags is strong
+     enough for the reversed compare or (b) we have a valid FP compare.  */
+  if (! ix86_comparison_operator (new_op1, VOIDmode))
+    FAIL;
+})
+
 ;; The SSE store flag instructions saves 0 or 0xffffffff to the result.
 ;; subsequent logical operations are used to imitate conditional moves.
 ;; 0xffffffff is NaN, but not in normalized form, so we can't represent