Helps for constants like 0xfffff70008000ul, 0xffffffff55555555ul,
0xffffffff550ffffful.

There doesn't appear to be any benefit to using xori; every test that
I expected to use it found an alternate solution of the same cost.

Cc: David Edelsohn <dje....@gmail.com>
---
        * config/rs6000/rs6000.c (genimm_ppc::exam_search): Test for
        inverting the second half-word.
        (genimm_ppc::generate): Handle XOR.
---
 gcc/config/rs6000/rs6000.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 9c08cca..40b29b0 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -8169,6 +8169,11 @@ genimm_ppc::exam_search (HOST_WIDE_INT c, int budget)
          return true;
        }
     }
+  if (exam_sub (c | 0xffff0000u, sub_budget))
+    {
+      opN (XOR, ~c & 0xffff0000u); /* XORIS */
+      return true;
+    }
 
   /* If C is a mask itself, apply it to all ones.  */
   if (exam_mask (-1, c, sub_budget))
@@ -8253,6 +8258,7 @@ genimm_ppc::generate (rtx dest, machine_mode mode) const
        case PLUS:
        case AND:
        case IOR:
+       case XOR:
        case ASHIFT:
          x = gen_rtx_fmt_ee (r, mode, op1, op2);
          break;
-- 
2.4.3

Reply via email to