(simplify_binary_operation...
authorJim Wilson <wilson@gcc.gnu.org>
Sat, 8 Jun 1996 02:36:34 +0000 (19:36 -0700)
committerJim Wilson <wilson@gcc.gnu.org>
Sat, 8 Jun 1996 02:36:34 +0000 (19:36 -0700)
(simplify_binary_operation, case MULT): Check for case
where width is larger than HOST_BITS_PER_WIDE_INT, and upper most
bit is set.  We can not generate a simple shift in this case.

From-SVN: r12238

gcc/cse.c

index 67b75ddefcfcc6b195757e7978bc77452aa7a7ec..2da71d92030a495630916fdcca5515a1d912e91a 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -3878,6 +3878,11 @@ simplify_binary_operation (code, mode, op0, op1)
             we are still generating RTL.  This test is a kludge.  */
          if (GET_CODE (op1) == CONST_INT
              && (val = exact_log2 (INTVAL (op1))) >= 0
+             /* If the mode is larger than the host word size, and the
+                uppermost bit is set, then this isn't a power of two due
+                to implicit sign extension.  */
+             && (width <= HOST_BITS_PER_WIDE_INT
+                 || val != HOST_BITS_PER_WIDE_INT - 1)
              && ! rtx_equal_function_value_matters)
            return gen_rtx (ASHIFT, mode, op0, GEN_INT (val));