({add,sub}di{_mem,3}): Patterns merged.

From-SVN: r9926
This commit is contained in:
Richard Kenner 1995-06-11 14:06:51 -04:00
parent 76ffb3a0be
commit 055c15842a

View File

@ -2050,57 +2050,57 @@
return \"add%.l %1,%0\";
} ")
(define_insn "adddi_mem"
[(set (match_operand:DI 0 "general_operand" "=o,<,>")
(plus:DI (match_operand:DI 1 "general_operand" "%0,0,0")
(match_operand:DI 2 "general_operand" "d,d,d")))
(clobber (match_scratch:SI 3 "=d,d,d"))]
""
"*
{
CC_STATUS_INIT;
operands[4] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
if (which_alternative == 2)
{
operands[1] = gen_rtx (MEM, SImode,
gen_rtx (PLUS, VOIDmode, XEXP(operands[0], 0),
gen_rtx (CONST_INT, VOIDmode, -8)));
return \"move%.l %0,%3\;add%.l %4,%0\;addx%.l %2,%3\;move%.l %3,%1\";
}
if (which_alternative == 1)
{
operands[1] = XEXP(operands[0], 0);
return \"add%.l %4,%0\;move%.l %0,%3\;addx%.l %2,%3\;move%.l %3,%1\";
}
operands[1] = adj_offsettable_operand (operands[0], 4);
return \"add%.l %4,%1\;move%.l %0,%3\;addx%.l %2,%3\;move%.l %3,%0\";
} ")
(define_insn "adddi3"
[(set (match_operand:DI 0 "general_operand" "=d,d,d,<")
[(set (match_operand:DI 0 "general_operand" "=d,<,d,o<>")
(plus:DI (match_operand:DI 1 "general_operand" "%0,0,0,0")
(match_operand:DI 2 "general_operand" "*ao,>,d,<")))]
(match_operand:DI 2 "general_operand" "d,<,*ao>,d")))
(clobber (match_scratch:SI 3 "=X,X,d,d"))]
""
"*
{
if (which_alternative == 3)
return \"add%.l %2,%0\;addx%.l %2,%0\";
operands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
if (which_alternative == 1)
if (DATA_REG_P (operands[0]))
{
CC_STATUS_INIT;
return \"add%.l %2,%0\;add%.l %2,%1\;negx%.l %0\;neg%.l %0\";
if (DATA_REG_P (operands[2]))
return \"add%.l %R2,%R0\;addx%.l %2,%0\";
else if (GET_CODE (operands[2]) == MEM
&& GET_CODE (XEXP (operands[2], 0)) == POST_INC)
{
return \"move%.l %2,%3\;add%.l %2,%R0\;addx%.l %3,%0\";
}
else
{
/* TODO : this should work also for CONST operands[2] */
if (GET_CODE (operands[2]) == REG)
operands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
else
operands[1] = adj_offsettable_operand (operands[2], 4);
return \"move%.l %2,%3\;add%.l %1,%R0\;addx%.l %3,%0\";
}
}
else if (GET_CODE (operands[0]) == MEM)
{
if (GET_CODE (operands[2]) == MEM
&& GET_CODE (XEXP (operands[2], 0)) == PRE_DEC)
return \"add%.l %2,%0\;addx%.l %2,%0\";
CC_STATUS_INIT;
if (GET_CODE (XEXP (operands[0], 0)) == POST_INC)
{
operands[1] = gen_rtx (MEM, SImode,
gen_rtx (PLUS, VOIDmode, XEXP(operands[0], 0),
gen_rtx (CONST_INT, VOIDmode, -8)));
return \"move%.l %0,%3\;add%.l %R2,%0\;addx%.l %2,%3\;move%.l %3,%1\";
}
else if (GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
{
operands[1] = XEXP(operands[0], 0);
return \"add%.l %R2,%0\;move%.l %0,%3\;addx%.l %2,%3\;move%.l %3,%1\";
}
else
{
operands[1] = adj_offsettable_operand (operands[0], 4);
return \"add%.l %R2,%1\;move%.l %0,%3\;addx%.l %2,%3\;move%.l %3,%0\";
}
}
if (GET_CODE (operands[2]) == REG)
operands[3] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
else
operands[3] = adj_offsettable_operand (operands[2], 4);
if (which_alternative == 2)
return \"add%.l %3,%1\;addx%.l %2,%0\";
CC_STATUS_INIT;
/* negx + neg simulates (non-existent) addx #0 */
/* TODO : this should work also for CONST operands[2] */
return \"add%.l %3,%1\;negx%.l %0\;neg%.l %0\;add%.l %2,%0\";
} ")
(define_insn "addsi_lshrsi_31"
@ -2639,57 +2639,57 @@
return \"sub%.l %1,%0\";
} ")
(define_insn "subdi_mem"
[(set (match_operand:DI 0 "general_operand" "=o,<,>")
(minus:DI (match_operand:DI 1 "general_operand" "0,0,0")
(match_operand:DI 2 "register_operand" "d,d,d")))
(clobber (match_scratch:SI 3 "=d,d,d"))]
""
"*
{
CC_STATUS_INIT;
operands[4] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
if (which_alternative == 2)
{
operands[1] = gen_rtx (MEM, SImode,
gen_rtx (PLUS, VOIDmode, XEXP(operands[0], 0),
gen_rtx (CONST_INT, VOIDmode, -8)));
return \"move%.l %0,%3\;sub%.l %4,%0\;subx%.l %2,%3\;move%.l %3,%1\";
}
if (which_alternative == 1)
{
operands[1] = XEXP(operands[0], 0);
return \"sub%.l %4,%0\;move%.l %0,%3\;subx%.l %2,%3\;move%.l %3,%1\";
}
operands[1] = adj_offsettable_operand (operands[0], 4);
return \"sub%.l %4,%1\;move%.l %0,%3\;subx%.l %2,%3\;move%.l %3,%0\";
} ")
(define_insn "subdi3"
[(set (match_operand:DI 0 "general_operand" "=d,d,d,<")
(minus:DI (match_operand:DI 1 "general_operand" "0,0,0,0")
(match_operand:DI 2 "general_operand" "*ao,>,d,<")))]
[(set (match_operand:DI 0 "general_operand" "=d,<,d,o<>")
(minus:DI (match_operand:DI 1 "general_operand" "%0,0,0,0")
(match_operand:DI 2 "general_operand" "d,<,*ao>,d")))
(clobber (match_scratch:SI 3 "=X,X,d,d"))]
""
"*
{
if (which_alternative == 3)
return \"sub%.l %2,%0\;subx%.l %2,%0\";
operands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
if (which_alternative == 1)
if (DATA_REG_P (operands[0]))
{
CC_STATUS_INIT;
return \"neg%.l %0\;add%.l %2,%0\;sub%.l %2,%1\;negx%.l %0\";
if (DATA_REG_P (operands[2]))
return \"sub%.l %R2,%R0\;subx%.l %2,%0\";
else if (GET_CODE (operands[2]) == MEM
&& GET_CODE (XEXP (operands[2], 0)) == POST_INC)
{
return \"move%.l %2,%3\;sub%.l %2,%R0\;subx%.l %3,%0\";
}
else
{
/* TODO : this should work also for CONST operands[2] */
if (GET_CODE (operands[2]) == REG)
operands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
else
operands[1] = adj_offsettable_operand (operands[2], 4);
return \"move%.l %2,%3\;sub%.l %1,%R0\;subx%.l %3,%0\";
}
}
else if (GET_CODE (operands[0]) == MEM)
{
if (GET_CODE (operands[2]) == MEM
&& GET_CODE (XEXP (operands[2], 0)) == PRE_DEC)
return \"sub%.l %2,%0\;subx%.l %2,%0\";
CC_STATUS_INIT;
if (GET_CODE (XEXP (operands[0], 0)) == POST_INC)
{
operands[1] = gen_rtx (MEM, SImode,
gen_rtx (PLUS, VOIDmode, XEXP(operands[0], 0),
gen_rtx (CONST_INT, VOIDmode, -8)));
return \"move%.l %0,%3\;sub%.l %R2,%0\;subx%.l %2,%3\;move%.l %3,%1\";
}
else if (GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
{
operands[1] = XEXP(operands[0], 0);
return \"sub%.l %R2,%0\;move%.l %0,%3\;subx%.l %2,%3\;move%.l %3,%1\";
}
else
{
operands[1] = adj_offsettable_operand (operands[0], 4);
return \"sub%.l %R2,%1\;move%.l %0,%3\;subx%.l %2,%3\;move%.l %3,%0\";
}
}
if (GET_CODE (operands[2]) == REG)
operands[3] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
else
operands[3] = adj_offsettable_operand (operands[2], 4);
if (which_alternative == 2)
return \"sub%.l %3,%1\;subx%.l %2,%0\";
CC_STATUS_INIT;
/* neg + negx simulates (non-existent) subx #0 */
/* TODO : this should work also for CONST operands[2] */
return \"neg%.l %0\;sub%.l %3,%1\;negx%.l %0\;sub%.l %2,%0\";
} ")
(define_insn "subsi3"