combine.c (combine_simplify_rtx): Use gen_unary to distribute the NOT for De Morgan...
authorRichard Henderson <rth@cygnus.com>
Mon, 18 Sep 2000 18:24:32 +0000 (11:24 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 18 Sep 2000 18:24:32 +0000 (11:24 -0700)
        * combine.c (combine_simplify_rtx): Use gen_unary to distribute
        the NOT for De Morgan's rule.
        * simplify-rtx.c (simplify_unary_operation): Simplify a BImode NOT
        of a comparison to the reverse comparison.

From-SVN: r36506

gcc/ChangeLog
gcc/combine.c
gcc/simplify-rtx.c

index a4612dd21a442490a6e039034895a5850af23257..2e1a280d33b9318667e286ed186da1e1e9906afd 100644 (file)
@@ -1,5 +1,10 @@
 2000-09-18  Richard Henderson  <rth@cygnus.com>
 
+       * combine.c (combine_simplify_rtx): Use gen_unary to distribute
+       the NOT for De Morgan's rule.
+       * simplify-rtx.c (simplify_unary_operation): Simplify a BImode NOT
+       of a comparison to the reverse comparison.
+
        * combine.c (try_combine): Allow split to create a single insn.
 
        * machmode.def: Add BImode.  Add a column for bitsize.
index 07c7e6733f48b4216af96ecff5e9a8500c444bea..033bfac8d640f04743c4e68554193a1013b42459 100644 (file)
@@ -3933,21 +3933,17 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
       if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
        {
          rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
+         enum machine_mode op_mode;
 
-         if (GET_CODE (in1) == NOT)
-           in1 = XEXP (in1, 0);
-         else
-           in1 = gen_rtx_combine (NOT, GET_MODE (in1), in1);
+         op_mode = GET_MODE (in1);
+         in1 = gen_unary (NOT, op_mode, op_mode, in1);
 
-         if (GET_CODE (in2) == NOT)
-           in2 = XEXP (in2, 0);
-         else if (GET_CODE (in2) == CONST_INT
-                  && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
-           in2 = GEN_INT (GET_MODE_MASK (mode) & ~INTVAL (in2));
-         else
-           in2 = gen_rtx_combine (NOT, GET_MODE (in2), in2);
+         op_mode = GET_MODE (in2);
+         if (op_mode == VOIDmode)
+           op_mode = mode;
+         in2 = gen_unary (NOT, op_mode, op_mode, in2);
 
-         if (GET_CODE (in2) == NOT)
+         if (GET_CODE (in2) == NOT && GET_CODE (in1) != NOT)
            {
              rtx tem = in2;
              in2 = in1; in1 = tem;
index 1e130768eed7d84e2b75daa6eb46e934a9c80492..eb1ac584dbb8b1c587a38192b4cf9981fabc2603 100644 (file)
@@ -583,10 +583,21 @@ simplify_unary_operation (code, mode, op, op_mode)
         aren't constant.  */
       switch (code)
        {
-       case NEG:
        case NOT:
-         /* (not (not X)) == X, similarly for NEG.  */
-         if (GET_CODE (op) == code)
+         /* (not (not X)) == X.  */
+         if (GET_CODE (op) == NOT)
+           return XEXP (op, 0);
+
+         /* (not (eq X Y)) == (ne X Y), etc.  */
+         if (mode == BImode && GET_RTX_CLASS (GET_CODE (op)) == '<'
+             && can_reverse_comparison_p (op, NULL_RTX))
+           return gen_rtx_fmt_ee (reverse_condition (GET_CODE (op)),
+                                  op_mode, XEXP (op, 0), XEXP (op, 1));
+         break;
+
+       case NEG:
+         /* (neg (neg X)) == X.  */
+         if (GET_CODE (op) == NEG)
            return XEXP (op, 0);
          break;