diff options
author | Paul Brook <paul@codesourcery.com> | 2008-03-15 22:49:44 +0000 |
---|---|---|
committer | Paul Brook <pbrook@gcc.gnu.org> | 2008-03-15 22:49:44 +0000 |
commit | ff06990057b50b7b0dbad7975fec116540a584e8 (patch) | |
tree | ad56c65078d5b1dc642e03d2d03e849273c0c88c | |
parent | 1b7538283219ffe978979e0a644acde5cf39a60a (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 13 |
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: |