* expmed.c (store_bit_field): Also check whether the bitsize is
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 Apr 2006 00:51:14 +0000 (00:51 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 Apr 2006 00:51:14 +0000 (00:51 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@113265 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/config/i386/predicates.md
gcc/expmed.c

index ca604af..7bf04ef 100644 (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
index 669c0ea..e08d175 100644 (file)
 (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.  */
 (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.  */
 
 (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;
 
index acc01ee..24f741b 100644 (file)
   (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")
index 31b8241..5a32366 100644 (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;