OSDN Git Service

*** empty log message ***
authorrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 19 Apr 1992 01:16:25 +0000 (01:16 +0000)
committerrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 19 Apr 1992 01:16:25 +0000 (01:16 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@787 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/expmed.c

index 4b0f77d..44dc7ec 100644 (file)
@@ -200,13 +200,18 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
 
   /* Note that the adjustment of BITPOS above has no effect on whether
      BITPOS is 0 in a REG bigger than a word.  */
-  if (GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD && GET_CODE (op0) != MEM
+  if (GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD
+      && (! STRICT_ALIGNMENT || GET_CODE (op0) != MEM)
       && bitpos == 0 && bitsize == GET_MODE_BITSIZE (fieldmode))
     {
       /* Storing in a full-word or multi-word field in a register
         can be done with just SUBREG.  */
       if (GET_MODE (op0) != fieldmode)
-       op0 = gen_rtx (SUBREG, fieldmode, op0, offset);
+       if (GET_CODE (op0) == REG)
+         op0 = gen_rtx (SUBREG, fieldmode, op0, offset);
+       else
+         op0 = change_address (op0, fieldmode,
+                               plus_constant (XEXP (op0, 0), offset));
       emit_move_insn (op0, value);
       return value;
     }