false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 1 /* Issue rate. */
};
const struct tune_params arm_fastmul_tune =
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 1 /* Issue rate. */
};
/* StrongARM has early execution of branches, so a sequence that is worth
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 1 /* Issue rate. */
};
const struct tune_params arm_xscale_tune =
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 1 /* Issue rate. */
};
const struct tune_params arm_9e_tune =
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 1 /* Issue rate. */
+};
+
+const struct tune_params arm_marvell_pj4_tune =
+{
+ arm_9e_rtx_costs,
+ NULL,
+ NULL, /* Sched adj cost. */
+ 1, /* Constant limit. */
+ 5, /* Max cond insns. */
+ ARM_PREFETCH_NOT_BENEFICIAL,
+ true, /* Prefer constant pool. */
+ arm_default_branch_cost,
+ false, /* Prefer LDRD/STRD. */
+ {true, true}, /* Prefer non short circuit. */
+ &arm_default_vec_cost, /* Vectorizer costs. */
+ false, /* Prefer Neon for 64-bits bitops. */
+ false, false, /* Prefer 32-bit encodings. */
+ false, /* Prefer Neon for stringops. */
+ 8, /* Maximum insns to inline memset. */
+ ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 2 /* Issue rate. */
};
const struct tune_params arm_v6t2_tune =
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 1 /* Issue rate. */
};
+
/* Generic Cortex tuning. Use more specific tunings if appropriate. */
const struct tune_params arm_cortex_tune =
{
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 2 /* Issue rate. */
};
const struct tune_params arm_cortex_a8_tune =
true, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 2 /* Issue rate. */
};
const struct tune_params arm_cortex_a7_tune =
true, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 2 /* Issue rate. */
};
const struct tune_params arm_cortex_a15_tune =
true, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_FULL /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_FULL, /* Sched L2 autopref. */
+ 3 /* Issue rate. */
};
const struct tune_params arm_cortex_a53_tune =
true, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_MOVW_MOVT, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 2 /* Issue rate. */
};
const struct tune_params arm_cortex_a57_tune =
true, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_MOVW_MOVT, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_FULL /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_FULL, /* Sched L2 autopref. */
+ 3 /* Issue rate. */
};
const struct tune_params arm_xgene1_tune =
false, /* Prefer Neon for stringops. */
32, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 4 /* Issue rate. */
};
/* Branches can be dual-issued on Cortex-A5, so conditional execution is
true, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 2 /* Issue rate. */
};
const struct tune_params arm_cortex_a9_tune =
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 2 /* Issue rate. */
};
const struct tune_params arm_cortex_a12_tune =
true, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_MOVW_MOVT, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 2 /* Issue rate. */
};
/* armv7m tuning. On Cortex-M4 cores for example, MOVW/MOVT take a single
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 1 /* Issue rate. */
};
/* Cortex-M7 tuning. */
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 2 /* Issue rate. */
};
/* The arm_v6m_tune is duplicated from arm_cortex_tune, rather than
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 1 /* Issue rate. */
};
const struct tune_params arm_fa726te_tune =
false, /* Prefer Neon for stringops. */
8, /* Maximum insns to inline memset. */
ARM_FUSE_NOTHING, /* Fuseable pairs of instructions. */
- ARM_SCHED_AUTOPREF_OFF /* Sched L2 autopref. */
+ ARM_SCHED_AUTOPREF_OFF, /* Sched L2 autopref. */
+ 2 /* Issue rate. */
};
}
}
-/* Most ARM cores are single issue, but some newer ones can dual issue.
- The scheduler descriptions rely on this being correct. */
+/* Implement TARGET_SCHED_ISSUE_RATE. Lookup the issue rate in the
+ per-core tuning structs. */
static int
arm_issue_rate (void)
{
- switch (arm_tune)
- {
- case xgene1:
- return 4;
-
- case cortexa15:
- case cortexa57:
- case exynosm1:
- return 3;
-
- case cortexm7:
- case cortexr4:
- case cortexr4f:
- case cortexr5:
- case genericv7a:
- case cortexa5:
- case cortexa7:
- case cortexa8:
- case cortexa9:
- case cortexa12:
- case cortexa17:
- case cortexa53:
- case fa726te:
- case marvell_pj4:
- return 2;
-
- default:
- return 1;
- }
+ return current_tune->issue_rate;
}
/* Return how many instructions should scheduler lookahead to choose the