From 3b4c46d71190ead2f7fdde4d04103f4e838ced68 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 22 Jun 2011 15:29:43 +0000 Subject: [PATCH] Check TARGET_PARTIAL_REG_STALL in imul to lea peepholes. 2011-06-22 H.J. Lu 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 | 10 ++++++++++ gcc/config/i386/i386.md | 22 ++++++++++++---------- gcc/config/i386/predicates.md | 8 ++++++++ 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 125a9b27c1f..b643f7cc159 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2011-06-22 H.J. Lu + + 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 * cgraphunit.c (assemble_thunk): Use correct return type. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 204cb4fa9c8..2b1da4c79d2 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])" "#" @@ -17199,11 +17203,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 == SImode + || optimize_function_for_size_p (cfun)" [(set (match_dup 0) (plus:SWI48 (mult:SWI48 (match_dup 1) (match_dup 2)) (match_dup 1)))] @@ -17213,12 +17217,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 == 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 358d04f6532..2c75147474e 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") -- 2.30.2