aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1996-05-17 17:24:12 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1996-05-17 17:24:12 -0400
commit3cd456066e16f812b16ea0095bc392adbb94fa8f (patch)
treec53d1a128f09f0e27d67b8ca83f374ea2e6ce629 /gcc
parent8a5d3064fb8b6f15ff667623f9e16b6eac8d5cbe (diff)
downloadgcc-3cd456066e16f812b16ea0095bc392adbb94fa8f.zip
gcc-3cd456066e16f812b16ea0095bc392adbb94fa8f.tar.gz
gcc-3cd456066e16f812b16ea0095bc392adbb94fa8f.tar.bz2
(store_split_bit_field): Don't assume the alignment of VALUE is the
same as the record. From-SVN: r12017
Diffstat (limited to 'gcc')
-rw-r--r--gcc/expmed.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 955c416..be27f85 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -781,10 +781,19 @@ store_split_bit_field (op0, bitsize, bitpos, value, align)
else
/* The args are chosen so that the last part includes the
lsb. Give extract_bit_field the value it needs (with
- endianness compensation) to fetch the piece we want. */
- part = extract_fixed_bit_field (word_mode, value, 0, thissize,
- total_bits - bitsize + bitsdone,
- NULL_RTX, 1, align);
+ endianness compensation) to fetch the piece we want.
+
+ ??? We have no idea what the alignment of VALUE is, so
+ we have to use a guess. */
+ part
+ = extract_fixed_bit_field
+ (word_mode, value, 0, thissize,
+ total_bits - bitsize + bitsdone, NULL_RTX, 1,
+ GET_MODE (value) == VOIDmode
+ ? UNITS_PER_WORD
+ : (GET_MODE (value) == BLKmode
+ ? 1
+ : GET_MODE_ALIGNMENT (GET_MODE (value)) / BITS_PER_UNIT));
}
else
{
@@ -794,8 +803,14 @@ store_split_bit_field (op0, bitsize, bitpos, value, align)
>> bitsdone)
& (((HOST_WIDE_INT) 1 << thissize) - 1));
else
- part = extract_fixed_bit_field (word_mode, value, 0, thissize,
- bitsdone, NULL_RTX, 1, align);
+ part
+ = extract_fixed_bit_field
+ (word_mode, value, 0, thissize, bitsdone, NULL_RTX, 1,
+ GET_MODE (value) == VOIDmode
+ ? UNITS_PER_WORD
+ : (GET_MODE (value) == BLKmode
+ ? 1
+ : GET_MODE_ALIGNMENT (GET_MODE (value)) / BITS_PER_UNIT));
}
/* If OP0 is a register, then handle OFFSET here.