aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTerry Guo <terry.guo@arm.com>2013-07-25 04:10:27 +0000
committerXuepeng Guo <xguo@gcc.gnu.org>2013-07-25 04:10:27 +0000
commit690688b3a055de125642e79d3bff8b0291d1f8cb (patch)
tree5ae1b066d744553bfbb91a51cca6c57aa1a4f172 /gcc
parenta4ad093b026e5224b4bacedcee34b434e7af7ffc (diff)
downloadgcc-690688b3a055de125642e79d3bff8b0291d1f8cb.zip
gcc-690688b3a055de125642e79d3bff8b0291d1f8cb.tar.gz
gcc-690688b3a055de125642e79d3bff8b0291d1f8cb.tar.bz2
arm.c (thumb1_size_rtx_costs): Assign proper cost for shift_add/shift_sub0/shift_sub1 RTXs.
gcc/ChangeLog: 2013-07-24 Terry Guo <terry.guo@arm.com> * config/arm/arm.c (thumb1_size_rtx_costs): Assign proper cost for shift_add/shift_sub0/shift_sub1 RTXs. gcc/testsuite/ChangeLog: 2013-07-24 Terry Guo <terry.guo@arm.com> * gcc.target/arm/thumb1-Os-mult.c: New test case. From-SVN: r201237
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/arm/arm.c9
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/arm/thumb1-Os-mult.c12
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0aed48d..fa582e3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2013-07-25 Terry Guo <terry.guo@arm.com>
+
+ * config/arm/arm.c (thumb1_size_rtx_costs): Assign proper cost for
+ shift_add/shift_sub0/shift_sub1 RTXs.
+
2013-07-24 Bill Schmidt <wschmidt@linux.ibm.com>
Anton Blanchard <anton@au1.ibm.com>
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index ad54469..294de80 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -7925,6 +7925,15 @@ thumb1_size_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer)
case PLUS:
case MINUS:
+ /* Thumb-1 needs two instructions to fulfill shiftadd/shiftsub0/shiftsub1
+ defined by RTL expansion, especially for the expansion of
+ multiplication. */
+ if ((GET_CODE (XEXP (x, 0)) == MULT
+ && power_of_two_operand (XEXP (XEXP (x,0),1), SImode))
+ || (GET_CODE (XEXP (x, 1)) == MULT
+ && power_of_two_operand (XEXP (XEXP (x, 1), 1), SImode)))
+ return COSTS_N_INSNS (2);
+ /* On purpose fall through for normal RTX. */
case COMPARE:
case NEG:
case NOT:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1cfb5a4..b8bd860 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2013-07-25 Terry Guo <terry.guo@arm.com>
+
+ * gcc.target/arm/thumb1-Os-mult.c: New test case.
+
2013-07-24 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57942
diff --git a/gcc/testsuite/gcc.target/arm/thumb1-Os-mult.c b/gcc/testsuite/gcc.target/arm/thumb1-Os-mult.c
new file mode 100644
index 0000000..31b8bd6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/thumb1-Os-mult.c
@@ -0,0 +1,12 @@
+/* { dg-require-effective-target arm_thumb1_ok } */
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+/* { dg-skip-if "" { ! { arm_thumb1 } } } */
+
+int
+mymul3 (int x)
+{
+ return x * 0x555;
+}
+
+/* { dg-final { scan-assembler "mul\[\\t \]*r.,\[\\t \]*r." } } */