aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-07-30 18:09:27 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1994-07-30 18:09:27 -0400
commit39e0911f454a31bb84c7131acb6a616761102ba2 (patch)
tree42800d57c18a8aef5282f31a350b7db7f1f4a1b3
parent311b7cd79558abcdcf6ddf0a590c147247a71771 (diff)
downloadgcc-39e0911f454a31bb84c7131acb6a616761102ba2.zip
gcc-39e0911f454a31bb84c7131acb6a616761102ba2.tar.gz
gcc-39e0911f454a31bb84c7131acb6a616761102ba2.tar.bz2
({store,extract}_bit_field): Don't use bitfield insn if OP0 is
register and bitfield spans it. From-SVN: r7837
-rw-r--r--gcc/expmed.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 98019ee..46e16be 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -369,7 +369,10 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
&& !(bitsize == 1 && GET_CODE (value) == CONST_INT)
/* Ensure insv's size is wide enough for this field. */
&& (GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_insv][3])
- >= bitsize))
+ >= bitsize)
+ && ! ((GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG)
+ && (bitsize + bitpos
+ > GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_insv][3]))))
{
int xbitpos = bitpos;
rtx value1;
@@ -972,7 +975,10 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
#ifdef HAVE_extzv
if (HAVE_extzv
&& (GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_extzv][0])
- >= bitsize))
+ >= bitsize)
+ && ! ((GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG)
+ && (bitsize + bitpos
+ > GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_extzv][0]))))
{
int xbitpos = bitpos, xoffset = offset;
rtx bitsize_rtx, bitpos_rtx;
@@ -1111,7 +1117,10 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
#ifdef HAVE_extv
if (HAVE_extv
&& (GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_extv][0])
- >= bitsize))
+ >= bitsize)
+ && ! ((GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG)
+ && (bitsize + bitpos
+ > GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_extv][0]))))
{
int xbitpos = bitpos, xoffset = offset;
rtx bitsize_rtx, bitpos_rtx;