arm.c (arm_rtx_costs_1): Add costs for ARMv6 value extension instructions.
authorPaul Brook <paul@codesourcery.com>
Sat, 15 Mar 2008 22:49:44 +0000 (22:49 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Sat, 15 Mar 2008 22:49:44 +0000 (22:49 +0000)
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

gcc/ChangeLog
gcc/config/arm/arm.c

index c3f2d7d65c8637253c796fea7e22a2960c73a0f7..fcb1623cc3089b3208aeecc2c6917a5f1a870829 100644 (file)
@@ -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
index f3febf6c4192f24a1ac2d2af016902d40ba0903a..4fb0a0d1f1ee50326c81b0d99eb2aab23dc4b515 100644 (file)
@@ -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: