This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: patch to learn addhi/addqi patterns about lea instruction.
Hi,
Mon Apr 12 20:46:17 CEST 1999 Jan Hubicka <hubicka@freesoft.cz>
* i386.md (QImode add pattern): Support lea instruction.
(HImode add pattern): Likewise.
*** i386.md.old Wed Apr 14 12:43:13 1999
--- i386.md Wed Apr 14 16:01:12 1999
***************
*** 3455,3466 ****
"IX86_EXPAND_BINARY_OPERATOR (PLUS, HImode, operands);")
(define_insn ""
! [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r")
! (plus:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0")
! (match_operand:HI 2 "general_operand" "ri,rm")))]
"ix86_binary_operator_ok (PLUS, HImode, operands)"
"*
{
/* ??? what about offsettable memory references? */
if (!TARGET_PENTIUMPRO /* partial stalls are just too painful to risk. */
&& QI_REG_P (operands[0])
--- 3455,3481 ----
"IX86_EXPAND_BINARY_OPERATOR (PLUS, HImode, operands);")
(define_insn ""
! [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r,?r")
! (plus:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,r")
! (match_operand:HI 2 "general_operand" "ri,rm,ri")))]
"ix86_binary_operator_ok (PLUS, HImode, operands)"
"*
{
+ if (REG_P (operands[0]) && REG_P (operands[1])
+ && (REG_P (operands[2]) || CONSTANT_P (operands[2]))
+ && REGNO (operands[0]) != REGNO (operands[1]))
+ {
+ if (operands[2] == stack_pointer_rtx)
+ abort ();
+
+ CC_STATUS_INIT;
+ operands[1] = gen_rtx_PLUS(SImode, gen_rtx_REG (SImode, REGNO (operands[1])),
+ !REG_P (operands[2]) ? operands[2]
+ :gen_rtx_REG (SImode, REGNO (operands[2])));
+ operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));
+ return AS2 (lea%L0,%a1,%0);
+ }
+
/* ??? what about offsettable memory references? */
if (!TARGET_PENTIUMPRO /* partial stalls are just too painful to risk. */
&& QI_REG_P (operands[0])
***************
*** 3522,3533 ****
"IX86_EXPAND_BINARY_OPERATOR (PLUS, QImode, operands);")
(define_insn ""
! [(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q")
! (plus:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0")
! (match_operand:QI 2 "general_operand" "qn,qmn")))]
"ix86_binary_operator_ok (PLUS, QImode, operands)"
"*
{
if (operands[2] == const1_rtx)
return AS1 (inc%B0,%0);
--- 3537,3564 ----
"IX86_EXPAND_BINARY_OPERATOR (PLUS, QImode, operands);")
(define_insn ""
! [(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q,?q")
! (plus:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,q")
! (match_operand:QI 2 "general_operand" "qn,qmn,qn")))]
"ix86_binary_operator_ok (PLUS, QImode, operands)"
"*
{
+ if (REG_P (operands[0]) && REG_P (operands[1])
+ && (REG_P (operands[2]) || CONSTANT_P (operands[2]))
+ && (REGNO (operands[0]) != REGNO (operands[1])
+ || NON_QI_REG_P (operands[1])
+ || (REG_P (operands[2]) && NON_QI_REG_P (operands[2]))))
+ {
+ if (operands[2] == stack_pointer_rtx)
+ abort ();
+
+ CC_STATUS_INIT;
+ operands[1] = gen_rtx_PLUS(SImode, gen_rtx_REG (SImode, REGNO (operands[1])),
+ !REG_P (operands[2]) ? operands[2]
+ :gen_rtx_REG (SImode, REGNO (operands[2])));
+ operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));
+ return AS2 (lea%L0,%a1,%0);
+ }
if (operands[2] == const1_rtx)
return AS1 (inc%B0,%0);