expmed.c (store_bit_field): Also check whether the bitsize is valid for the machine...
authorRoger Sayle <roger@eyesopen.com>
Wed, 26 Apr 2006 00:51:14 +0000 (00:51 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Wed, 26 Apr 2006 00:51:14 +0000 (00:51 +0000)
* 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

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

index ca604af1199ba3ca929cb099358eb964726a7f0b..7bf04eff71a91823d70bd49a247708b104e38baf 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 669c0ea2a8157fb59b110bcfcd4a897f150cd6c1..e08d1753d6480e3c387937d1cbee8ad81d04a190 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 acc01eeb537b11cb0ca75393991f797d3cb7ed0e..24f741b00311d2af8d120949ff8b2e94af140ee5 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 31b8241f29b3fab536276b47cffa66b9f8b427c0..5a32366cc649fd6af421d3eae3c16c35f99bb59d 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;