aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/arm/arm.c
diff options
context:
space:
mode:
authorGreta Yorsh <greta.yorsh@arm.com>2013-06-26 10:40:40 +0100
committerGreta Yorsh <gretay@gcc.gnu.org>2013-06-26 10:40:40 +0100
commitb24a2ce5b25b5009ac9371b474d25aefc653ebb7 (patch)
tree945abfb6f7a7a6873628f9c827fe95234062c366 /gcc/config/arm/arm.c
parent1a3fab15bcbd41b0ad326124c49eb62c67287bb2 (diff)
downloadgcc-b24a2ce5b25b5009ac9371b474d25aefc653ebb7.zip
gcc-b24a2ce5b25b5009ac9371b474d25aefc653ebb7.tar.gz
gcc-b24a2ce5b25b5009ac9371b474d25aefc653ebb7.tar.bz2
arm.h (MAX_CONDITIONAL_EXECUTE): Define macro.
2013-06-26 Greta Yorsh <Greta.Yorsh@arm.com> * config/arm/arm.h (MAX_CONDITIONAL_EXECUTE): Define macro. * config/arm/arm-protos.h (arm_max_conditional_execute): New declaration. (tune_params): Update comment. * config/arm/arm.c (arm_cortex_a15_tune): Set max_cond_insns to 2. (arm_max_conditional_execute): New function. (thumb2_final_prescan_insn): Use max_insn_skipped and MAX_INSN_PER_IT_BLOCK to compute maximum instructions in a block. From-SVN: r200419
Diffstat (limited to 'gcc/config/arm/arm.c')
-rw-r--r--gcc/config/arm/arm.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 88187ab..e6fd420 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -1059,7 +1059,7 @@ const struct tune_params arm_cortex_a15_tune =
arm_9e_rtx_costs,
NULL,
1, /* Constant limit. */
- 5, /* Max cond insns. */
+ 2, /* Max cond insns. */
ARM_PREFETCH_NOT_BENEFICIAL,
false, /* Prefer constant pool. */
arm_default_branch_cost,
@@ -9145,6 +9145,12 @@ arm_adjust_cost (rtx insn, rtx link, rtx dep, int cost)
return cost;
}
+int
+arm_max_conditional_execute (void)
+{
+ return max_insns_skipped;
+}
+
static int
arm_default_branch_cost (bool speed_p, bool predictable_p ATTRIBUTE_UNUSED)
{
@@ -19567,6 +19573,13 @@ thumb2_final_prescan_insn (rtx insn)
enum arm_cond_code code;
int n;
int mask;
+ int max;
+
+ /* Maximum number of conditionally executed instructions in a block
+ is minimum of the two max values: maximum allowed in an IT block
+ and maximum that is beneficial according to the cost model and tune. */
+ max = (max_insns_skipped < MAX_INSN_PER_IT_BLOCK) ?
+ max_insns_skipped : MAX_INSN_PER_IT_BLOCK;
/* Remove the previous insn from the count of insns to be output. */
if (arm_condexec_count)
@@ -19609,9 +19622,9 @@ thumb2_final_prescan_insn (rtx insn)
/* ??? Recognize conditional jumps, and combine them with IT blocks. */
if (GET_CODE (body) != COND_EXEC)
break;
- /* Allow up to 4 conditionally executed instructions in a block. */
+ /* Maximum number of conditionally executed instructions in a block. */
n = get_attr_ce_count (insn);
- if (arm_condexec_masklen + n > MAX_INSN_PER_IT_BLOCK)
+ if (arm_condexec_masklen + n > max)
break;
predicate = COND_EXEC_TEST (body);