Hi, We should check !TARGET_PARTIAL_REG_STALL for imul to lea peepholes. Also there is no partial register stall for SImode. I also added const359_operand as suggestd by Uros.
OK for trunk? Thanks. H.J. --- 2011-06-22 H.J. Lu <hongjiu...@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. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 0bbf55a..e4b96bc 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -6287,7 +6287,9 @@ (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)" @@ -6338,7 +6340,9 @@ (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])" "#" @@ -17207,11 +17211,11 @@ [(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)))] @@ -17221,12 +17225,10 @@ [(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)) diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index 358d04f6..2c75147 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -606,6 +606,14 @@ 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")