]> gcc.gnu.org Git - gcc.git/commitdiff
machmode.h (SCALAR_INT_MODE_P): New macro to test for scaler integer mode (MODE_INT...
authorGeoffrey Keating <geoffk@redhat.com>
Mon, 19 Aug 2002 18:18:12 +0000 (18:18 +0000)
committerSteve Ellcey <sje@gcc.gnu.org>
Mon, 19 Aug 2002 18:18:12 +0000 (18:18 +0000)
* machmode.h (SCALAR_INT_MODE_P): New macro to test for
scaler integer mode (MODE_INT or MODE_PARTIAL_INT).
* explow.c (trunc_int_for_mode): Abort when the mode is not
a scaler integer mode.
* combine.c (expand_compound_operation): Don't expand Vector
or Complex modes into shifts.
(expand_field_assignment): Don't do bitwise arithmatic and
shifts on Vector or Complex modes.
(simplify_comparison): Don't call trunc_int_for_mode
for VOIDmode.
* recog.c (general_operand): Likewise.
(immediate_operand): Likewise.
(nonmemory_operand): Likewise.

Co-Authored-By: Steve Ellcey <sje@cup.hp.com>
From-SVN: r56443

gcc/ChangeLog
gcc/combine.c
gcc/explow.c
gcc/machmode.h
gcc/recog.c

index 8d3077e41e1c616068186f7304fc876725f8d7a6..de73f2549eee61078a7f5f0b41792300c4e8f211 100644 (file)
@@ -1,3 +1,20 @@
+2002-08-19  Geoffrey Keating  <geoffk@redhat.com>
+           Steve Ellcey  <sje@cup.hp.com>
+
+       * machmode.h (SCALAR_INT_MODE_P): New macro to test for
+       scaler integer mode (MODE_INT or MODE_PARTIAL_INT).
+       * explow.c (trunc_int_for_mode): Abort when the mode is not
+       a scaler integer mode.
+       * combine.c (expand_compound_operation): Don't expand Vector
+       or Complex modes into shifts.
+       (expand_field_assignment): Don't do bitwise arithmatic and
+       shifts on Vector or Complex modes.
+       (simplify_comparison): Don't call trunc_int_for_mode
+       for VOIDmode.
+       * recog.c (general_operand): Likewise.
+       (immediate_operand): Likewise.
+       (nonmemory_operand): Likewise.
+
 2002-08-19  David Edelsohn  <edelsohn@gnu.org>
 
        * config/rs6000/rs6000.c (rs6000_emit_set_const): Inline
index 236ac2ef72c1e58f35efa5491c6136811222127f..4a2ae3c9743ce6cf0e5e9970e15d7e157a16ae64 100644 (file)
@@ -5634,6 +5634,12 @@ expand_compound_operation (x)
       if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
        return x;
 
+      /* Reject MODEs that aren't scalar integers because turning vector
+        or complex modes into shifts causes problems.  */
+
+      if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
+       return x;
+
       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
       /* If the inner object has VOIDmode (the only way this can happen
         is if it is an ASM_OPERANDS), we can't do anything since we don't
@@ -5655,6 +5661,12 @@ expand_compound_operation (x)
          || GET_MODE (XEXP (x, 0)) == VOIDmode)
        return x;
 
+      /* Reject MODEs that aren't scalar integers because turning vector
+        or complex modes into shifts causes problems.  */
+
+      if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
+       return x;
+
       len = INTVAL (XEXP (x, 1));
       pos = INTVAL (XEXP (x, 2));
 
@@ -5862,12 +5874,12 @@ expand_field_assignment (x)
 
       compute_mode = GET_MODE (inner);
 
-      /* Don't attempt bitwise arithmetic on non-integral modes.  */
-      if (! INTEGRAL_MODE_P (compute_mode))
+      /* Don't attempt bitwise arithmetic on non scalar integer modes.  */
+      if (! SCALAR_INT_MODE_P (compute_mode))
        {
          enum machine_mode imode;
 
-         /* Something is probably seriously wrong if this matches.  */
+         /* Don't do anything for vector or complex integral types.  */
          if (! FLOAT_MODE_P (compute_mode))
            break;
 
@@ -10177,7 +10189,9 @@ simplify_comparison (code, pop0, pop1)
 
       /* Get the constant we are comparing against and turn off all bits
         not on in our mode.  */
-      const_op = trunc_int_for_mode (INTVAL (op1), mode);
+      const_op = INTVAL (op1);
+      if (mode != VOIDmode)
+       const_op = trunc_int_for_mode (const_op, mode);
       op1 = GEN_INT (const_op);
 
       /* If we are comparing against a constant power of two and the value
index f61d009105a551fe64b39c30a07c4b1f518e15ca..4cda36541058ccc64b3efa3e8297b7faa171790c 100644 (file)
@@ -49,6 +49,10 @@ trunc_int_for_mode (c, mode)
 {
   int width = GET_MODE_BITSIZE (mode);
 
+  /* You want to truncate to a _what_?  */
+  if (! SCALAR_INT_MODE_P (mode))
+    abort ();
+
   /* Canonicalize BImode to 0 and STORE_FLAG_VALUE.  */
   if (mode == BImode)
     return c & 1 ? STORE_FLAG_VALUE : 0;
index f581cd041bd7bc74c5ca9e458f9ee00f6b33ee1c..c0c8c35f8d43cca331e9d5c2a71dbf64b6c946a7 100644 (file)
@@ -75,6 +75,11 @@ extern const enum mode_class mode_class[NUM_MACHINE_MODES];
   (GET_MODE_CLASS (MODE) == MODE_VECTOR_INT    \
    || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
 
+/* Nonzero if MODE is a scalar integral mode.  */
+#define SCALAR_INT_MODE_P(MODE)                        \
+  (GET_MODE_CLASS (MODE) == MODE_INT           \
+   || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT)
+
 /* Get the size in bytes of an object of mode MODE.  */
 
 extern const unsigned char mode_size[NUM_MACHINE_MODES];
index 6bb8670e166c283783ef8cb0663f424b9c5adf1a..a01abd5b79915df602d6b2284cf4ba85d610b8fc 100644 (file)
@@ -954,6 +954,7 @@ general_operand (op, mode)
     return 0;
 
   if (GET_CODE (op) == CONST_INT
+      && mode != VOIDmode
       && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
     return 0;
 
@@ -1159,6 +1160,7 @@ immediate_operand (op, mode)
     return 0;
 
   if (GET_CODE (op) == CONST_INT
+      && mode != VOIDmode
       && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
     return 0;
 
@@ -1241,6 +1243,7 @@ nonmemory_operand (op, mode)
        return 0;
 
       if (GET_CODE (op) == CONST_INT
+         && mode != VOIDmode
          && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
        return 0;
 
This page took 0.115297 seconds and 5 git commands to generate.