expmed.c (store_fixed_bit_field): Don't use a mode bigger than the mode of the memory...
authorAndrew Haley <aph@redhat.com>
Mon, 9 Jul 2001 15:25:34 +0000 (15:25 +0000)
committerAndrew Haley <aph@gcc.gnu.org>
Mon, 9 Jul 2001 15:25:34 +0000 (15:25 +0000)
2001-07-03  Andrew Haley  <aph@redhat.com>

        * expmed.c (store_fixed_bit_field): Don't use a mode bigger than
        the mode of the memory location.

From-SVN: r43864

gcc/ChangeLog
gcc/expmed.c

index 8e52cfcd62cb6f7ff7aede4d96b13f4231453923..9481d68d69ae14f7ed2bb2cc9e84fa59ba650931 100644 (file)
@@ -1,3 +1,8 @@
+2001-07-03  Andrew Haley  <aph@redhat.com>
+
+       * expmed.c (store_fixed_bit_field): Don't use a mode bigger than
+       the mode of the memory location.
+
 2001-07-09  Bo Thorsen  <bo@suse.co.uk>
 
        * config/i386/unix.h (ASM_OUTPUT_MI_THUNK): Fix x86-64 vtable support.
index 0a9b41cfdf4d2a7130bec15252a1ee0c5e84d496..d334f6dad1f61458e40815186eacf4f042dc7d79 100644 (file)
@@ -673,10 +673,15 @@ store_fixed_bit_field (op0, offset, bitsize, bitpos, value, struct_align)
     {
       /* Get the proper mode to use for this field.  We want a mode that
         includes the entire field.  If such a mode would be larger than
-        a word, we won't be doing the extraction the normal way.  */
+        a word, we won't be doing the extraction the normal way.  
+        We don't want a mode bigger than the destination.  */
 
+      mode = GET_MODE (op0);
+      if (GET_MODE_BITSIZE (mode) == 0
+          || GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (word_mode))
+        mode = word_mode;
       mode = get_best_mode (bitsize, bitpos + offset * BITS_PER_UNIT,
-                           struct_align, word_mode,
+                           struct_align, mode,
                            GET_CODE (op0) == MEM && MEM_VOLATILE_P (op0));
 
       if (mode == VOIDmode)