aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1998-10-09 08:50:25 -0700
committerRichard Henderson <rth@gcc.gnu.org>1998-10-09 08:50:25 -0700
commitd006aa54babb7e5c6074e06b71d6ae65e9172c5b (patch)
treedcc7d4ffbedc5308ac113fce833c31a0318fd188 /gcc/function.c
parent3663a3047f7ec94514d5c76483f1b7e8457934cf (diff)
downloadgcc-d006aa54babb7e5c6074e06b71d6ae65e9172c5b.zip
gcc-d006aa54babb7e5c6074e06b71d6ae65e9172c5b.tar.gz
gcc-d006aa54babb7e5c6074e06b71d6ae65e9172c5b.tar.bz2
expmed.c (store_bit_field): Pun non-integral str_rtx modes.
* expmed.c (store_bit_field): Pun non-integral str_rtx modes. Take extra care for op0 now possibly being a subreg. (extract_bit_field): Likewise. * function.c (purge_addressof_1): Revert Oct 4 change. Drop the reg to memory if there is no equal sized integral mode. * stor-layout.c (int_mode_for_mode): New function. * machmode.h: Prototype it. From-SVN: r22962
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c14
1 files changed, 2 insertions, 12 deletions
diff --git a/gcc/function.c b/gcc/function.c
index 5e60759..5ad113c 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -2874,24 +2874,14 @@ purge_addressof_1 (loc, insn, force, store)
/* Don't even consider working with paradoxical subregs,
or the moral equivalent seen here. */
- if (size_x < size_sub)
+ if (size_x < size_sub
+ && int_mode_for_mode (GET_MODE (sub)) != BLKmode)
{
/* Do a bitfield insertion to mirror what would happen
in memory. */
rtx val, seq;
- /* We cannot do this if we are trying to pick out
- an integral piece, smaller than a word, of a
- floating point value. */
- if (INTEGRAL_MODE_P (GET_MODE (x))
- && GET_MODE_SIZE (GET_MODE (x)) < UNITS_PER_WORD
- && FLOAT_MODE_P (GET_MODE (sub)))
- {
- put_addressof_into_stack (XEXP (x, 0));
- return;
- }
-
if (store)
{
/* If we can't replace with a register, be afraid. */