OSDN Git Service

* simplify-rtx.c (simplify_subreg): Use the correct mode when
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Dec 2006 04:35:05 +0000 (04:35 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Dec 2006 04:35:05 +0000 (04:35 +0000)
determining whether a SUBREG of a CONCAT refers to the first or
second component.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120101 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/simplify-rtx.c

index aeb0ab4..40f7c77 100644 (file)
@@ -1,3 +1,9 @@
+2006-12-20  Roger Sayle  <roger@eyesopen.com>
+
+       * simplify-rtx.c (simplify_subreg): Use the correct mode when
+       determining whether a SUBREG of a CONCAT refers to the first or
+       second component.
+
 2006-12-21  Ben Elliston  <bje@au.ibm.com>
 
        * config/spu/spu.c (spu_builtin_mul_widen_even): Remove unused
index 149ee6b..2199c63 100644 (file)
@@ -4648,13 +4648,22 @@ simplify_subreg (enum machine_mode outermode, rtx op,
      of real and imaginary part.  */
   if (GET_CODE (op) == CONCAT)
     {
-      unsigned int inner_size, final_offset;
+      unsigned int part_size, final_offset;
       rtx part, res;
 
-      inner_size = GET_MODE_UNIT_SIZE (innermode);
-      part = byte < inner_size ? XEXP (op, 0) : XEXP (op, 1);
-      final_offset = byte % inner_size;
-      if (final_offset + GET_MODE_SIZE (outermode) > inner_size)
+      part_size = GET_MODE_UNIT_SIZE (GET_MODE (XEXP (op, 0)));
+      if (byte < part_size)
+       {
+         part = XEXP (op, 0);
+         final_offset = byte;
+       }
+      else
+       {
+         part = XEXP (op, 1);
+         final_offset = byte - part_size;
+       }
+
+      if (final_offset + GET_MODE_SIZE (outermode) > part_size)
        return NULL_RTX;
 
       res = simplify_subreg (outermode, part, GET_MODE (part), final_offset);