OSDN Git Service

* function.c (purge_addressof_1): Fix typo in inequality: do
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Oct 1998 23:06:47 +0000 (23:06 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Oct 1998 23:06:47 +0000 (23:06 +0000)
        bitfield optimization for equal mode sizes.
        * expmed.c (store_bit_field): Don't take subregs of subregs in
        the movstrict case.  Tidy a potential problem in the multi-word case.
        (extract_bit_field): Likewise.

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

gcc/ChangeLog
gcc/expmed.c
gcc/function.c

index 3c21fd3..e6e5dab 100644 (file)
@@ -1,3 +1,11 @@
+Tue Oct 13 23:03:37 1998  Richard Henderson  <rth@cygnus.com>
+
+       * function.c (purge_addressof_1): Fix typo in inequality: do
+       bitfield optimization for equal mode sizes.
+       * expmed.c (store_bit_field): Don't take subregs of subregs in
+       the movstrict case.  Tidy a potential problem in the multi-word case.
+       (extract_bit_field): Likewise.
+
 Tue Oct 13 22:12:11 1998  Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
 
         * flow.c (find_basic_blocks): Emit NOPs after normal calls in this
index bb22245..1c9fcf5 100644 (file)
@@ -347,8 +347,22 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
       else
        {
          int icode = movstrict_optab->handlers[(int) fieldmode].insn_code;
-         if(! (*insn_operand_predicate[icode][1]) (value, fieldmode))
+         if (! (*insn_operand_predicate[icode][1]) (value, fieldmode))
            value = copy_to_mode_reg (fieldmode, value);
+
+         if (GET_CODE (op0) == SUBREG)
+           {
+             if (GET_MODE (SUBREG_REG (op0)) == fieldmode
+                 || GET_MODE_CLASS (fieldmode) == MODE_INT
+                 || GET_MODE_CLASS (fieldmode) == MODE_PARTIAL_INT)
+               op0 = SUBREG_REG (op0);
+             else
+               /* Else we've got some float mode source being extracted into
+                  a different float mode destination -- this combination of
+                  subregs results in Severe Tire Damage.  */
+               abort ();
+           }
+
          emit_insn (GEN_FCN (icode)
                   (gen_rtx_SUBREG (fieldmode, op0, offset), value));
        }
@@ -403,12 +417,16 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
   /* OFFSET is the number of words or bytes (UNIT says which)
      from STR_RTX to the first word or byte containing part of the field.  */
 
-  if (GET_CODE (op0) == REG)
+  if (GET_CODE (op0) != MEM)
     {
       if (offset != 0
          || GET_MODE_SIZE (GET_MODE (op0)) > UNITS_PER_WORD)
-       op0 = gen_rtx_SUBREG (TYPE_MODE (type_for_size (BITS_PER_WORD, 0)),
-                      op0, offset);
+       {
+         if (GET_CODE (op0) != REG)
+           op0 = copy_to_reg (op0);
+         op0 = gen_rtx_SUBREG (mode_for_size (BITS_PER_WORD, MODE_INT, 0),
+                               op0, offset);
+       }
       offset = 0;
     }
   else
@@ -539,7 +557,7 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
                {
                  /* Avoid making subreg of a subreg, or of a mem.  */
                  if (GET_CODE (value1) != REG)
-               value1 = copy_to_reg (value1);
+                   value1 = copy_to_reg (value1);
                  value1 = gen_rtx_SUBREG (maxmode, value1, 0);
                }
              else
@@ -1146,8 +1164,12 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
     {
       if (offset != 0
          || GET_MODE_SIZE (GET_MODE (op0)) > UNITS_PER_WORD)
-       op0 = gen_rtx_SUBREG (mode_for_size (BITS_PER_WORD, MODE_INT, 0),
-                             op0, offset);
+       {
+         if (GET_CODE (op0) != REG)
+           op0 = copy_to_reg (op0);
+         op0 = gen_rtx_SUBREG (mode_for_size (BITS_PER_WORD, MODE_INT, 0),
+                               op0, offset);
+       }
       offset = 0;
     }
   else
index 48018cf..3904b86 100644 (file)
@@ -2885,7 +2885,7 @@ purge_addressof_1 (loc, insn, force, store)
 
          /* Don't even consider working with paradoxical subregs,
             or the moral equivalent seen here.  */
-         if (size_x < size_sub
+         if (size_x <= size_sub
              && int_mode_for_mode (GET_MODE (sub)) != BLKmode)
            {
              /* Do a bitfield insertion to mirror what would happen