expr.c (expand_expr, [...]): Refine the test forcing usage of bitfield instructions...
authorOlivier Hainque <hainque@act-europe.fr>
Mon, 5 May 2003 17:56:35 +0000 (19:56 +0200)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 5 May 2003 17:56:35 +0000 (13:56 -0400)
        * expr.c (expand_expr, case BIT_FIELD_REF): Refine the test forcing
        usage of bitfield instructions for mode1 != BLKmode, only ignoring
        SLOW_UNALIGNED_ACCESS if the field is not byte aligned.
        (store_field): Likewise.

From-SVN: r66492

gcc/ChangeLog
gcc/expr.c

index 84bd445..0f8cad8 100644 (file)
@@ -1,3 +1,10 @@
+2003-05-05  Olivier Hainque  <hainque@act-europe.fr>
+
+        * expr.c (expand_expr, case BIT_FIELD_REF): Refine the test forcing
+        usage of bitfield instructions for mode1 != BLKmode, only ignoring
+        SLOW_UNALIGNED_ACCESS if the field is not byte aligned. 
+        (store_field): Likewise.
+
 2003-05-05  Aldy Hernandez  <aldyh@redhat.com>
 
         * config/rs6000/rs6000.c (rs6000_expand_binop_builtin): Add
index ba7db15..6659d61 100644 (file)
@@ -5626,9 +5626,10 @@ store_field (target, bitsize, bitpos, mode, exp, value_mode, unsignedp, type,
       /* If the field isn't aligned enough to store as an ordinary memref,
         store it as a bit field.  */
       || (mode != BLKmode
-         && ((SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target))
-              && (MEM_ALIGN (target) < GET_MODE_ALIGNMENT (mode)))
-             || bitpos % GET_MODE_ALIGNMENT (mode)))
+         && ((((MEM_ALIGN (target) < GET_MODE_ALIGNMENT (mode))
+               || bitpos % GET_MODE_ALIGNMENT (mode))
+              && SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target)))
+             || (bitpos % BITS_PER_UNIT != 0)))              
       /* If the RHS and field are a constant size and the size of the
         RHS isn't the same size as the bitfield, we must use bitfield
         operations.  */
@@ -7571,9 +7572,10 @@ expand_expr (exp, target, tmode, modifier)
            /* If the field isn't aligned enough to fetch as a memref,
               fetch it as a bit field.  */
            || (mode1 != BLKmode
-               && ((TYPE_ALIGN (TREE_TYPE (tem)) < GET_MODE_ALIGNMENT (mode)
+               && (((TYPE_ALIGN (TREE_TYPE (tem)) < GET_MODE_ALIGNMENT (mode)
+                     || (bitpos % GET_MODE_ALIGNMENT (mode) != 0))
                     && SLOW_UNALIGNED_ACCESS (mode1, MEM_ALIGN (op0)))
-                   || (bitpos % GET_MODE_ALIGNMENT (mode) != 0)))
+                   || (bitpos % BITS_PER_UNIT != 0)))
            /* If the type and the field are a constant size and the
               size of the type isn't the same size as the bitfield,
               we must use bitfield operations.  */