diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-07-30 18:09:27 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-07-30 18:09:27 -0400 |
commit | 39e0911f454a31bb84c7131acb6a616761102ba2 (patch) | |
tree | 42800d57c18a8aef5282f31a350b7db7f1f4a1b3 | |
parent | 311b7cd79558abcdcf6ddf0a590c147247a71771 (diff) | |
download | gcc-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.c | 15 |
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; |