(output_addsi3): New function. From addsi3 pattern.
From-SVN: r13952
This commit is contained in:
parent
079e639f76
commit
9ee3c68737
|
@ -1951,6 +1951,97 @@ find_addr_reg (addr)
|
||||||
return addr;
|
return addr;
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Output assembler code to perform a 32 bit 3 operand add. */
|
||||||
|
|
||||||
|
char *
|
||||||
|
output_addsi3 (operands)
|
||||||
|
rtx *operands;
|
||||||
|
{
|
||||||
|
if (! operands_match_p (operands[0], operands[1]))
|
||||||
|
{
|
||||||
|
if (!ADDRESS_REG_P (operands[1]))
|
||||||
|
{
|
||||||
|
rtx tmp = operands[1];
|
||||||
|
|
||||||
|
operands[1] = operands[2];
|
||||||
|
operands[2] = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* These insns can result from reloads to access
|
||||||
|
stack slots over 64k from the frame pointer. */
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT
|
||||||
|
&& INTVAL (operands[2]) + 0x8000 >= (unsigned) 0x10000)
|
||||||
|
return "move%.l %2,%0\\;add%.l %1,%0";
|
||||||
|
#ifdef SGS
|
||||||
|
if (GET_CODE (operands[2]) == REG)
|
||||||
|
return "lea 0(%1,%2.l),%0";
|
||||||
|
else
|
||||||
|
return "lea %c2(%1),%0";
|
||||||
|
#else /* not SGS */
|
||||||
|
#ifdef MOTOROLA
|
||||||
|
if (GET_CODE (operands[2]) == REG)
|
||||||
|
return "lea (%1,%2.l),%0";
|
||||||
|
else
|
||||||
|
return "lea (%c2,%1),%0";
|
||||||
|
#else /* not MOTOROLA (MIT syntax) */
|
||||||
|
if (GET_CODE (operands[2]) == REG)
|
||||||
|
return "lea %1@(0,%2:l),%0";
|
||||||
|
else
|
||||||
|
return "lea %1@(%c2),%0";
|
||||||
|
#endif /* not MOTOROLA */
|
||||||
|
#endif /* not SGS */
|
||||||
|
}
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT)
|
||||||
|
{
|
||||||
|
#ifndef NO_ADDSUB_Q
|
||||||
|
if (INTVAL (operands[2]) > 0
|
||||||
|
&& INTVAL (operands[2]) <= 8)
|
||||||
|
return "addq%.l %2,%0";
|
||||||
|
if (INTVAL (operands[2]) < 0
|
||||||
|
&& INTVAL (operands[2]) >= -8)
|
||||||
|
{
|
||||||
|
operands[2] = gen_rtx (CONST_INT, VOIDmode,
|
||||||
|
- INTVAL (operands[2]));
|
||||||
|
return "subq%.l %2,%0";
|
||||||
|
}
|
||||||
|
/* On the CPU32 it is faster to use two addql instructions to
|
||||||
|
add a small integer (8 < N <= 16) to a register.
|
||||||
|
Likewise for subql. */
|
||||||
|
if (TARGET_CPU32 && REG_P (operands[0]))
|
||||||
|
{
|
||||||
|
if (INTVAL (operands[2]) > 8
|
||||||
|
&& INTVAL (operands[2]) <= 16)
|
||||||
|
{
|
||||||
|
operands[2] = gen_rtx (CONST_INT, VOIDmode,
|
||||||
|
INTVAL (operands[2]) - 8);
|
||||||
|
return "addq%.l %#8,%0\\;addq%.l %2,%0";
|
||||||
|
}
|
||||||
|
if (INTVAL (operands[2]) < -8
|
||||||
|
&& INTVAL (operands[2]) >= -16)
|
||||||
|
{
|
||||||
|
operands[2] = gen_rtx (CONST_INT, VOIDmode,
|
||||||
|
- INTVAL (operands[2]) - 8);
|
||||||
|
return "subq%.l %#8,%0\\;subq%.l %2,%0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (ADDRESS_REG_P (operands[0])
|
||||||
|
&& INTVAL (operands[2]) >= -0x8000
|
||||||
|
&& INTVAL (operands[2]) < 0x8000)
|
||||||
|
{
|
||||||
|
if (TARGET_68040)
|
||||||
|
return "add%.w %2,%0";
|
||||||
|
else
|
||||||
|
#ifdef MOTOROLA
|
||||||
|
return "lea (%c2,%0),%0";
|
||||||
|
#else
|
||||||
|
return "lea %0@(%c2),%0";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "add%.l %2,%0";
|
||||||
|
}
|
||||||
|
|
||||||
/* Store in cc_status the expressions that the condition codes will
|
/* Store in cc_status the expressions that the condition codes will
|
||||||
describe after execution of an instruction whose pattern is EXP.
|
describe after execution of an instruction whose pattern is EXP.
|
||||||
|
|
Loading…
Reference in New Issue