Check TARGET_PARTIAL_REG_STALL in imul to lea peepholes.
authorH.J. Lu <hongjiu.lu@intel.com>
Wed, 22 Jun 2011 15:29:43 +0000 (15:29 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Wed, 22 Jun 2011 15:29:43 +0000 (08:29 -0700)
2011-06-22  H.J. Lu  <hongjiu.lu@intel.com>

PR target/49497
* config/i386/i386.md (*lea_general_2): Always allow SImode.
(*lea_general_2_zext): Likewise.
(imul to lea peepholes): Use const359_operand and check
TARGET_PARTIAL_REG_STALL.

* config/i386/predicates.md (const359_operand): New.

From-SVN: r175295

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

index 125a9b27c1f2b3fa8becb0319a94dec7890672d5..b643f7cc1590493cfc963628791e1bc91536d174 100644 (file)
@@ -1,3 +1,13 @@
+2011-06-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/49497
+       * config/i386/i386.md (*lea_general_2): Always allow SImode.
+       (*lea_general_2_zext): Likewise.
+       (imul to lea peepholes): Use const359_operand and check
+       TARGET_PARTIAL_REG_STALL.
+
+       * config/i386/predicates.md (const359_operand): New.
+
 2011-06-22  Michael Matz  <matz@suse.de>
 
        * cgraphunit.c (assemble_thunk): Use correct return type.
index 204cb4fa9c82692a089d98ea2f591a5a90cc5fe7..2b1da4c79d2ead0b212439ba1d0bff75d8ed5f5e 100644 (file)
              (match_operand 3 "nonmemory_operand" "ri")))]
   "(GET_MODE (operands[0]) == QImode || GET_MODE (operands[0]) == HImode
     || (TARGET_64BIT && GET_MODE (operands[0]) == SImode))
-   && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
+   && (!TARGET_PARTIAL_REG_STALL
+       || GET_MODE (operands[0]) == SImode
+       || optimize_function_for_size_p (cfun))
    && GET_MODE (operands[0]) == GET_MODE (operands[1])
    && (GET_MODE (operands[0]) == GET_MODE (operands[3])
        || GET_MODE (operands[3]) == VOIDmode)"
              (match_operand 4 "immediate_operand" "i")))]
   "(GET_MODE (operands[0]) == QImode || GET_MODE (operands[0]) == HImode
     || (TARGET_64BIT && GET_MODE (operands[0]) == SImode))
-   && (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
+   && (!TARGET_PARTIAL_REG_STALL
+       || GET_MODE (operands[0]) == SImode
+       || optimize_function_for_size_p (cfun))
    && GET_MODE (operands[0]) == GET_MODE (operands[1])
    && GET_MODE (operands[0]) == GET_MODE (operands[3])"
   "#"
   [(parallel
     [(set (match_operand:SWI48 0 "register_operand" "")
          (mult:SWI48 (match_operand:SWI48 1 "register_operand" "")
-                     (match_operand:SWI48 2 "const_int_operand" "")))
+                     (match_operand:SWI48 2 "const359_operand" "")))
      (clobber (reg:CC FLAGS_REG))])]
-  "INTVAL (operands[2]) == 3
-   || INTVAL (operands[2]) == 5
-   || INTVAL (operands[2]) == 9"
+  "!TARGET_PARTIAL_REG_STALL
+   || <MODE>mode == SImode
+   || optimize_function_for_size_p (cfun)"
   [(set (match_dup 0)
        (plus:SWI48 (mult:SWI48 (match_dup 1) (match_dup 2))
                    (match_dup 1)))]
   [(parallel
     [(set (match_operand:SWI48 0 "register_operand" "")
          (mult:SWI48 (match_operand:SWI48 1 "nonimmediate_operand" "")
-                     (match_operand:SWI48 2 "const_int_operand" "")))
+                     (match_operand:SWI48 2 "const359_operand" "")))
      (clobber (reg:CC FLAGS_REG))])]
   "optimize_insn_for_speed_p ()
-   && (INTVAL (operands[2]) == 3
-       || INTVAL (operands[2]) == 5
-       || INTVAL (operands[2]) == 9)"
+   && (!TARGET_PARTIAL_REG_STALL || <MODE>mode == SImode)"
   [(set (match_dup 0) (match_dup 1))
    (set (match_dup 0)
        (plus:SWI48 (mult:SWI48 (match_dup 0) (match_dup 2))
index 358d04f6532bc5c206173a7de96aa930044ef7c7..2c75147474ebc5df615fb66a683724f0a0569826 100644 (file)
   return i == 2 || i == 4 || i == 8;
 })
 
+;; Match 3, 5, or 9.  Used for leal multiplicands.
+(define_predicate "const359_operand"
+  (match_code "const_int")
+{
+  HOST_WIDE_INT i = INTVAL (op);
+  return i == 3 || i == 5 || i == 9;
+})
+
 ;; Match 0 or 1.
 (define_predicate "const_0_to_1_operand"
   (and (match_code "const_int")