diff options
author | Richard Henderson <rth@cygnus.com> | 1998-10-09 08:50:25 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1998-10-09 08:50:25 -0700 |
commit | d006aa54babb7e5c6074e06b71d6ae65e9172c5b (patch) | |
tree | dcc7d4ffbedc5308ac113fce833c31a0318fd188 /gcc/function.c | |
parent | 3663a3047f7ec94514d5c76483f1b7e8457934cf (diff) | |
download | gcc-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.c | 14 |
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. */ |