aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2008-03-15 22:49:44 +0000
committerPaul Brook <pbrook@gcc.gnu.org>2008-03-15 22:49:44 +0000
commitff06990057b50b7b0dbad7975fec116540a584e8 (patch)
treead56c65078d5b1dc642e03d2d03e849273c0c88c
parent1b7538283219ffe978979e0a644acde5cf39a60a (diff)
downloadgcc-ff06990057b50b7b0dbad7975fec116540a584e8.zip
gcc-ff06990057b50b7b0dbad7975fec116540a584e8.tar.gz
gcc-ff06990057b50b7b0dbad7975fec116540a584e8.tar.bz2
arm.c (arm_rtx_costs_1): Add costs for ARMv6 value extension instructions.
2008-03-15 Paul Brook <paul@codesourcery.com> gcc/ * config/arm/arm.c (arm_rtx_costs_1): Add costs for ARMv6 value extension instructions. From-SVN: r133260
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/arm/arm.c13
2 files changed, 17 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c3f2d7d..fcb1623 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2008-03-15 Paul Brook <paul@codesourcery.com>
+
+ * config/arm/arm.c (arm_rtx_costs_1): Add costs for ARMv6 value
+ extension instructions.
+
2008-03-15 Richard Guenther <rguenther@suse.de>
* tree-ssa-ccp.c (ccp_fold): Also read from constant values
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index f3febf6..4fb0a0d 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -4904,6 +4904,12 @@ arm_rtx_costs_1 (rtx x, enum rtx_code code, enum rtx_code outer)
/* Fall through */
case PLUS:
+ if (arm_arch6 && mode == SImode
+ && (GET_CODE (XEXP (x, 0)) == ZERO_EXTEND
+ || GET_CODE (XEXP (x, 0)) == SIGN_EXTEND))
+ return 1 + (GET_CODE (XEXP (XEXP (x, 0), 0)) == MEM ? 10 : 0)
+ + (GET_CODE (XEXP (x, 1)) == MEM ? 10 : 0);
+
if (GET_CODE (XEXP (x, 0)) == MULT)
{
extra_cost = rtx_cost (XEXP (x, 0), code);
@@ -5002,12 +5008,17 @@ arm_rtx_costs_1 (rtx x, enum rtx_code code, enum rtx_code outer)
return 4 + (mode == DImode ? 4 : 0);
case SIGN_EXTEND:
- /* ??? value extensions are cheaper on armv6. */
+ if (arm_arch_thumb2 && mode == SImode)
+ return 1 + (GET_CODE (XEXP (x, 0)) == MEM ? 10 : 0);
+
if (GET_MODE (XEXP (x, 0)) == QImode)
return (4 + (mode == DImode ? 4 : 0)
+ (GET_CODE (XEXP (x, 0)) == MEM ? 10 : 0));
/* Fall through */
case ZERO_EXTEND:
+ if (arm_arch6 && mode == SImode)
+ return 1 + (GET_CODE (XEXP (x, 0)) == MEM ? 10 : 0);
+
switch (GET_MODE (XEXP (x, 0)))
{
case QImode: