expmed.c (store_bit_field): Also check whether the bitsize is valid for the machine's "insv" instruction...

* expmed.c (store_bit_field): Also check whether the bitsize is
	valid for the machine's "insv" instruction before moving the
	target into a pseudo for use with the insv.
	* config/i386/predicates.md (const8_operand): New predicate.
	* config/i386/i386.md (extv, extzv, insv): Use the new
	const8_operand predicate where appropriate.

From-SVN: r113265
This commit is contained in:
Roger Sayle 2006-04-26 00:51:14 +00:00 committed by Roger Sayle
parent a22b8ac1e4
commit f7acbf4c82
4 changed files with 24 additions and 8 deletions

View File

@ -1,3 +1,12 @@
2006-04-25 Roger Sayle <roger@eyesopen.com>
* expmed.c (store_bit_field): Also check whether the bitsize is
valid for the machine's "insv" instruction before moving the
target into a pseudo for use with the insv.
* config/i386/predicates.md (const8_operand): New predicate.
* config/i386/i386.md (extv, extzv, insv): Use the new
const8_operand predicate where appropriate.
2006-04-25 DJ Delorie <dj@redhat.com>
* doc/install.texi (Specific): Clarify that this is not a list of

View File

@ -12501,8 +12501,8 @@
(define_expand "extv"
[(set (match_operand:SI 0 "register_operand" "")
(sign_extract:SI (match_operand:SI 1 "register_operand" "")
(match_operand:SI 2 "immediate_operand" "")
(match_operand:SI 3 "immediate_operand" "")))]
(match_operand:SI 2 "const8_operand" "")
(match_operand:SI 3 "const8_operand" "")))]
""
{
/* Handle extractions from %ah et al. */
@ -12518,8 +12518,8 @@
(define_expand "extzv"
[(set (match_operand:SI 0 "register_operand" "")
(zero_extract:SI (match_operand 1 "ext_register_operand" "")
(match_operand:SI 2 "immediate_operand" "")
(match_operand:SI 3 "immediate_operand" "")))]
(match_operand:SI 2 "const8_operand" "")
(match_operand:SI 3 "const8_operand" "")))]
""
{
/* Handle extractions from %ah et al. */
@ -12534,12 +12534,12 @@
(define_expand "insv"
[(set (zero_extract (match_operand 0 "ext_register_operand" "")
(match_operand 1 "immediate_operand" "")
(match_operand 2 "immediate_operand" ""))
(match_operand 1 "const8_operand" "")
(match_operand 2 "const8_operand" ""))
(match_operand 3 "register_operand" ""))]
""
{
/* Handle extractions from %ah et al. */
/* Handle insertions to %ah et al. */
if (INTVAL (operands[1]) != 8 || INTVAL (operands[2]) != 8)
FAIL;

View File

@ -544,6 +544,11 @@
(and (match_code "const_int")
(match_test "op == const1_rtx")))
;; Match exactly eight.
(define_predicate "const8_operand"
(and (match_code "const_int")
(match_test "INTVAL (op) == 8")))
;; Match 2, 4, or 8. Used for leal multiplicands.
(define_predicate "const248_operand"
(match_code "const_int")

View File

@ -636,7 +636,9 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
&& bitsize > 0
&& GET_MODE_BITSIZE (op_mode) >= bitsize
&& ! ((REG_P (op0) || GET_CODE (op0) == SUBREG)
&& (bitsize + bitpos > GET_MODE_BITSIZE (op_mode))))
&& (bitsize + bitpos > GET_MODE_BITSIZE (op_mode)))
&& insn_data[CODE_FOR_insv].operand[1].predicate (GEN_INT (bitsize),
VOIDmode))
{
int xbitpos = bitpos;
rtx value1;