diff options
author | Roger Sayle <roger@eyesopen.com> | 2006-04-27 17:26:03 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2006-04-27 17:26:03 +0000 |
commit | 135c2bd4086d5e4d5a4cc24f9a7dc5ee7184eaa1 (patch) | |
tree | 01eecbf4b1eac9e56e4638fc994d61e6c1f26336 | |
parent | 921b02cd1f97018761f736753cf9a8d9a3227494 (diff) | |
download | gcc-135c2bd4086d5e4d5a4cc24f9a7dc5ee7184eaa1.zip gcc-135c2bd4086d5e4d5a4cc24f9a7dc5ee7184eaa1.tar.gz gcc-135c2bd4086d5e4d5a4cc24f9a7dc5ee7184eaa1.tar.bz2 |
expmed.c (store_fixed_bit_field): If we're not optimizing for size...
* expmed.c (store_fixed_bit_field): If we're not optimizing for
size, force the intermediate into a new pseudo rather instead of
performing both a bitwise AND and a bitwise IOR in memory.
From-SVN: r113318
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expmed.c | 7 |
2 files changed, 12 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0ca0fcf..940f0df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-04-27 Roger Sayle <roger@eyesopen.com> + + * expmed.c (store_fixed_bit_field): If we're not optimizing for + size, force the intermediate into a new pseudo rather instead of + performing both a bitwise AND and a bitwise IOR in memory. + 2006-04-27 Richard Guenther <rguenther@suse.de> PR rtl-optimization/26685 diff --git a/gcc/expmed.c b/gcc/expmed.c index 5a32366..89ae78d 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -924,7 +924,12 @@ store_fixed_bit_field (rtx op0, unsigned HOST_WIDE_INT offset, if (! all_one) { - temp = expand_binop (mode, and_optab, op0, + /* Don't try and keep the intermediate in memory, if we need to + perform both a bit-wise AND and a bit-wise IOR (except when + we're optimizing for size). */ + if (MEM_P (subtarget) && !all_zero && !optimize_size) + subtarget = force_reg (mode, subtarget); + temp = expand_binop (mode, and_optab, subtarget, mask_rtx (mode, bitpos, bitsize, 1), subtarget, 1, OPTAB_LIB_WIDEN); subtarget = temp; |