Commit 3296aff4 by Torbjorn Granlund

(RTX_COSTS): Add special cases for a plain 68000.

From-SVN: r8869
parent 71af73bb
...@@ -1371,8 +1371,10 @@ __transfer_from_trampoline () \ ...@@ -1371,8 +1371,10 @@ __transfer_from_trampoline () \
work properly in synth_mult on the 68020, work properly in synth_mult on the 68020,
relative to an average of the time for add and the time for shift, relative to an average of the time for add and the time for shift,
taking away a little more because sometimes move insns are needed. */ taking away a little more because sometimes move insns are needed. */
/* div?.w is relatively cheaper on 68000 counted in COSTS_N_INSNS terms. */
#define MULL_COST (TARGET_68040 ? 5 : 13) #define MULL_COST (TARGET_68040 ? 5 : 13)
#define MULW_COST (TARGET_68040 ? 3 : 8) #define MULW_COST (TARGET_68040 ? 3 : TARGET_68020 ? 8 : 5)
#define DIVW_COST (TARGET_68020 ? 27 : 12)
#define RTX_COSTS(X,CODE,OUTER_CODE) \ #define RTX_COSTS(X,CODE,OUTER_CODE) \
case PLUS: \ case PLUS: \
...@@ -1390,6 +1392,18 @@ __transfer_from_trampoline () \ ...@@ -1390,6 +1392,18 @@ __transfer_from_trampoline () \
case ASHIFT: \ case ASHIFT: \
case ASHIFTRT: \ case ASHIFTRT: \
case LSHIFTRT: \ case LSHIFTRT: \
if (! TARGET_68020) \
{ \
if (GET_CODE (XEXP (X, 1)) == CONST_INT) \
{ \
if (INTVAL (XEXP (X, 1)) < 16) \
return COSTS_N_INSNS (2) + INTVAL (XEXP (X, 1)) / 2; \
else \
/* We're using clrw + swap for these cases. */ \
return COSTS_N_INSNS (4) + (INTVAL (XEXP (X, 1)) - 16) / 2; \
} \
return COSTS_N_INSNS (10); /* worst case */ \
} \
/* A shift by a big integer takes an extra instruction. */ \ /* A shift by a big integer takes an extra instruction. */ \
if (GET_CODE (XEXP (X, 1)) == CONST_INT \ if (GET_CODE (XEXP (X, 1)) == CONST_INT \
&& (INTVAL (XEXP (X, 1)) == 16)) \ && (INTVAL (XEXP (X, 1)) == 16)) \
...@@ -1400,6 +1414,10 @@ __transfer_from_trampoline () \ ...@@ -1400,6 +1414,10 @@ __transfer_from_trampoline () \
return COSTS_N_INSNS (3); /* lsr #i,dn */ \ return COSTS_N_INSNS (3); /* lsr #i,dn */ \
break; \ break; \
case MULT: \ case MULT: \
if ((GET_CODE (XEXP (X, 0)) == ZERO_EXTEND \
|| GET_CODE (XEXP (X, 0)) == SIGN_EXTEND) \
&& GET_MODE (X) == SImode) \
return COSTS_N_INSNS (MULW_COST); \
if (GET_MODE (X) == QImode || GET_MODE (X) == HImode) \ if (GET_MODE (X) == QImode || GET_MODE (X) == HImode) \
return COSTS_N_INSNS (MULW_COST); \ return COSTS_N_INSNS (MULW_COST); \
else \ else \
...@@ -1409,7 +1427,7 @@ __transfer_from_trampoline () \ ...@@ -1409,7 +1427,7 @@ __transfer_from_trampoline () \
case MOD: \ case MOD: \
case UMOD: \ case UMOD: \
if (GET_MODE (X) == QImode || GET_MODE (X) == HImode) \ if (GET_MODE (X) == QImode || GET_MODE (X) == HImode) \
return COSTS_N_INSNS (27); /* div.w */ \ return COSTS_N_INSNS (DIVW_COST); /* div.w */ \
return COSTS_N_INSNS (43); /* div.l */ return COSTS_N_INSNS (43); /* div.l */
/* Tell final.c how to eliminate redundant test instructions. */ /* Tell final.c how to eliminate redundant test instructions. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment