]> gcc.gnu.org Git - gcc.git/commitdiff
combine.c (try_widen_shift_mode): Factor out code to check if an integer constant...
authorAdam Nemet <anemet@caviumnetworks.com>
Tue, 11 Aug 2009 17:31:09 +0000 (17:31 +0000)
committerAdam Nemet <nemet@gcc.gnu.org>
Tue, 11 Aug 2009 17:31:09 +0000 (17:31 +0000)
* combine.c (try_widen_shift_mode): Factor out code to check if an
        integer constant is a low-order bitmask from here ...
* rtlanal.c (low_bitmask_len): ... to here.
* rtl.h (low_bitmask_len): Declare.

From-SVN: r150656

gcc/ChangeLog
gcc/combine.c
gcc/rtl.h
gcc/rtlanal.c

index 8acb3b683353abb7ca710f7db84cbcaa28a337e7..2691d51d26d2ee56b2586200b02d31fcc33c6331 100644 (file)
@@ -1,3 +1,10 @@
+2009-08-11  Adam Nemet  <anemet@caviumnetworks.com>
+
+       * combine.c (try_widen_shift_mode): Factor out code to check if an
+        integer constant is a low-order bitmask from here ...
+       * rtlanal.c (low_bitmask_len): ... to here.
+       * rtl.h (low_bitmask_len): Declare.
+
 2009-08-11  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/8603
index 3a2c41205e5aa3276faa6a5070a5ceca1c59afc9..faa7e0dc03889632f2fb2096f9a7be545a735ec7 100644 (file)
@@ -9027,13 +9027,9 @@ try_widen_shift_mode (enum rtx_code code, rtx op, int count,
 
       /* We can also widen if the bits brought in will be masked off.  This
         operation is performed in ORIG_MODE.  */
-      if (outer_code == AND
-         && GET_MODE_BITSIZE (orig_mode) <= HOST_BITS_PER_WIDE_INT)
+      if (outer_code == AND)
        {
-         int care_bits;
-
-         outer_const &= GET_MODE_MASK (orig_mode);
-         care_bits = exact_log2 (outer_const + 1);
+         int care_bits = low_bitmask_len (orig_mode, outer_const);
 
          if (care_bits >= 0
              && GET_MODE_BITSIZE (orig_mode) - care_bits >= count)
index d5ae561d3afd57ee60f4efd1126398fed333d434..cf07348a3cb9abdb0f6f0e4172ebd629de5e4071 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1095,6 +1095,7 @@ extern unsigned HOST_WIDE_INT nonzero_bits (const_rtx, enum machine_mode);
 extern unsigned int num_sign_bit_copies (const_rtx, enum machine_mode);
 extern bool constant_pool_constant_p (rtx);
 extern bool truncated_to_mode (enum machine_mode, const_rtx);
+extern int low_bitmask_len (enum machine_mode, unsigned HOST_WIDE_INT);
 
 
 /* 1 if RTX is a subreg containing a reg that is already known to be
index 49289b65c37566d4df23e3e033c957e1d2af4318..aebcfa66904266e9ebab7f2ed882ca1cbd38bd98 100644 (file)
@@ -5032,3 +5032,20 @@ constant_pool_constant_p (rtx x)
   x = avoid_constant_pool_reference (x);
   return GET_CODE (x) == CONST_DOUBLE;
 }
+\f
+/* If M is a bitmask that selects a field of low-order bits within an item but
+   not the entire word, return the length of the field.  Return -1 otherwise.
+   M is used in machine mode MODE.  */
+
+int
+low_bitmask_len (enum machine_mode mode, unsigned HOST_WIDE_INT m)
+{
+  if (mode != VOIDmode)
+    {
+      if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
+       return -1;
+      m &= GET_MODE_MASK (mode);
+    }
+
+  return exact_log2 (m + 1);
+}
This page took 0.095503 seconds and 5 git commands to generate.