This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 04/10] [ARC] Add ARCv2 core3 tune option.
* Claudiu Zissulescu <Claudiu.Zissulescu@synopsys.com> [2017-11-27 12:09:53 +0100]:
> From: claziss <claziss@synopsys.com>
>
> ARCv2 Core3 cpus are comming with dbnz support. Add this feature on
> the tune option.
>
> gcc/
> 2017-09-14 Claudiu Zissulescu <claziss@synopsys.com>
>
> * config/arc/arc-arch.h (arc_tune_attr): Add ARC_TUNE_CORE_3.
> * config/arc/arc.c (arc_sched_issue_rate): Use ARC_TUNE_... .
> (arc_init): Likewise.
> (arc_override_options): Likewise.
> (arc_file_start): Choose Tag_ARC_CPU_variation based on arc_tune
> value.
> (hwloop_fail): Use TARGET_DBNZ when we want to check for dbnz insn
> support.
> * config/arc/arc.h (TARGET_DBNZ): Define.
> * config/arc/arc.md (attr tune): Add core_3, use ARC_TUNE_... to
> properly set the tune attribute.
> (dbnz): Use TARGET_DBNZ guard.
> * config/arc/arc.opt (mtune): Add core3 option.
OK.
Thanks,
Andrew
> ---
> gcc/config/arc/arc-arch.h | 3 ++-
> gcc/config/arc/arc.c | 21 ++++++++++++---------
> gcc/config/arc/arc.h | 2 ++
> gcc/config/arc/arc.md | 22 ++++++++++++----------
> gcc/config/arc/arc.opt | 40 ++++++++++++++++++++++------------------
> 5 files changed, 50 insertions(+), 38 deletions(-)
>
> diff --git a/gcc/config/arc/arc-arch.h b/gcc/config/arc/arc-arch.h
> index 7c3f47c..38d2bcb 100644
> --- a/gcc/config/arc/arc-arch.h
> +++ b/gcc/config/arc/arc-arch.h
> @@ -75,7 +75,8 @@ enum arc_tune_attr
> ARC_TUNE_ARC700_4_2_XMAC,
> ARC_TUNE_ARCHS4X,
> ARC_TUNE_ARCHS4XD,
> - ARC_TUNE_ARCHS4XD_SLOW
> + ARC_TUNE_ARCHS4XD_SLOW,
> + ARC_TUNE_CORE_3
> };
>
> /* CPU specific properties. */
> diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
> index 1479a8d..4d7a282 100644
> --- a/gcc/config/arc/arc.c
> +++ b/gcc/config/arc/arc.c
> @@ -442,8 +442,8 @@ arc_sched_issue_rate (void)
> {
> switch (arc_tune)
> {
> - case TUNE_ARCHS4X:
> - case TUNE_ARCHS4XD:
> + case ARC_TUNE_ARCHS4X:
> + case ARC_TUNE_ARCHS4XD:
> return 3;
> default:
> break;
> @@ -866,21 +866,21 @@ arc_init (void)
> if (arc_multcost < 0)
> switch (arc_tune)
> {
> - case TUNE_ARC700_4_2_STD:
> + case ARC_TUNE_ARC700_4_2_STD:
> /* latency 7;
> max throughput (1 multiply + 4 other insns) / 5 cycles. */
> arc_multcost = COSTS_N_INSNS (4);
> if (TARGET_NOMPY_SET)
> arc_multcost = COSTS_N_INSNS (30);
> break;
> - case TUNE_ARC700_4_2_XMAC:
> + case ARC_TUNE_ARC700_4_2_XMAC:
> /* latency 5;
> max throughput (1 multiply + 2 other insns) / 3 cycles. */
> arc_multcost = COSTS_N_INSNS (3);
> if (TARGET_NOMPY_SET)
> arc_multcost = COSTS_N_INSNS (30);
> break;
> - case TUNE_ARC600:
> + case ARC_TUNE_ARC600:
> if (TARGET_MUL64_SET)
> {
> arc_multcost = COSTS_N_INSNS (4);
> @@ -1196,8 +1196,8 @@ arc_override_options (void)
> #undef ARC_OPT
>
> /* Set Tune option. */
> - if (arc_tune == TUNE_NONE)
> - arc_tune = (enum attr_tune) arc_selected_cpu->tune;
> + if (arc_tune == ARC_TUNE_NONE)
> + arc_tune = (enum arc_tune_attr) arc_selected_cpu->tune;
>
> if (arc_size_opt_level == 3)
> optimize_size = 1;
> @@ -5205,6 +5205,9 @@ static void arc_file_start (void)
> TARGET_NO_SDATA_SET ? 0 : 2);
> asm_fprintf (asm_out_file, "\t.arc_attribute Tag_ARC_ABI_exceptions, %d\n",
> TARGET_OPTFPE ? 1 : 0);
> + if (TARGET_V2)
> + asm_fprintf (asm_out_file, "\t.arc_attribute Tag_ARC_CPU_variation, %d\n",
> + arc_tune == ARC_TUNE_CORE_3 ? 3 : 2);
> }
>
> /* Implement `TARGET_ASM_FILE_END'. */
> @@ -7389,11 +7392,11 @@ hwloop_fail (hwloop_info loop)
> rtx test;
> rtx insn = loop->loop_end;
>
> - if (TARGET_V2
> + if (TARGET_DBNZ
> && (loop->length && (loop->length <= ARC_MAX_LOOP_LENGTH))
> && REG_P (loop->iter_reg))
> {
> - /* TARGET_V2 has dbnz instructions. */
> + /* TARGET_V2 core3 has dbnz instructions. */
> test = gen_dbnz (loop->iter_reg, loop->start_label);
> insn = emit_jump_insn_before (test, loop->loop_end);
> }
> diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h
> index b5a8f84..8d90975 100644
> --- a/gcc/config/arc/arc.h
> +++ b/gcc/config/arc/arc.h
> @@ -1628,5 +1628,7 @@ enum
> /* Custom FP instructions used by QuarkSE EM cpu. */
> #define TARGET_FPX_QUARK (TARGET_EM && TARGET_SPFP \
> && (arc_fpu_build == FPX_QK))
> +/* DBNZ support is available for ARCv2 core3 cpus. */
> +#define TARGET_DBNZ (TARGET_V2 && (arc_tune == ARC_TUNE_CORE_3))
>
> #endif /* GCC_ARC_H */
> diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
> index 6239483..b8fa44e 100644
> --- a/gcc/config/arc/arc.md
> +++ b/gcc/config/arc/arc.md
> @@ -597,19 +597,21 @@
> ;; is made that makes conditional execution required.
>
> (define_attr "tune" "none, arc600, arc700_4_2_std, arc700_4_2_xmac, archs4x, \
> -archs4xd, archs4xd_slow"
> +archs4xd, archs4xd_slow, core_3"
> (const
> - (cond [(symbol_ref "arc_tune == TUNE_ARC600")
> + (cond [(symbol_ref "arc_tune == ARC_TUNE_ARC600")
> (const_string "arc600")
> - (symbol_ref "arc_tune == TUNE_ARC700_4_2_STD")
> + (symbol_ref "arc_tune == ARC_TUNE_ARC700_4_2_STD")
> (const_string "arc700_4_2_std")
> - (symbol_ref "arc_tune == TUNE_ARC700_4_2_XMAC")
> + (symbol_ref "arc_tune == ARC_TUNE_ARC700_4_2_XMAC")
> (const_string "arc700_4_2_xmac")
> - (symbol_ref "arc_tune == TUNE_ARCHS4X")
> + (symbol_ref "arc_tune == ARC_TUNE_ARCHS4X")
> (const_string "archs4x")
> - (ior (symbol_ref "arc_tune == TUNE_ARCHS4XD")
> - (symbol_ref "arc_tune == TUNE_ARCHS4XD_SLOW"))
> - (const_string "archs4xd")]
> + (ior (symbol_ref "arc_tune == ARC_TUNE_ARCHS4XD")
> + (symbol_ref "arc_tune == ARC_TUNE_ARCHS4XD_SLOW"))
> + (const_string "archs4xd")
> + (symbol_ref "arc_tune == ARC_TUNE_CORE_3")
> + (const_string "core_3")]
> (const_string "none"))))
>
> (define_attr "tune_arc700" "false,true"
> @@ -5200,11 +5202,11 @@ archs4xd, archs4xd_slow"
> (plus:SI (match_dup 0)
> (const_int -1)))
> (clobber (match_scratch:SI 2 "=X,r"))]
> - "TARGET_V2"
> + "TARGET_DBNZ"
> "@
> dbnz%#\\t%0,%l1
> #"
> - "TARGET_V2 && reload_completed && memory_operand (operands[0], SImode)"
> + "TARGET_DBNZ && reload_completed && memory_operand (operands[0], SImode)"
> [(set (match_dup 2) (match_dup 0))
> (set (match_dup 2) (plus:SI (match_dup 2) (const_int -1)))
> (set (reg:CC CC_REG) (compare:CC (match_dup 2) (const_int 0)))
> diff --git a/gcc/config/arc/arc.opt b/gcc/config/arc/arc.opt
> index aacb599..6b0104a 100644
> --- a/gcc/config/arc/arc.opt
> +++ b/gcc/config/arc/arc.opt
> @@ -249,29 +249,33 @@ mmultcost=
> Target RejectNegative Joined UInteger Var(arc_multcost) Init(-1)
> Cost to assume for a multiply instruction, with 4 being equal to a normal insn.
>
> -mtune=ARC600
> -Target RejectNegative Var(arc_tune, TUNE_ARC600)
> -Tune for ARC600 cpu.
> +mtune=
> +Target RejectNegative ToLower Joined Var(arc_tune) Enum(arc_tune_attr) Init(ARC_TUNE_NONE)
> +-mcpu=TUNE Tune code for given ARC variant.
>
> -mtune=ARC601
> -Target RejectNegative Var(arc_tune, TUNE_ARC600)
> -Tune for ARC601 cpu.
> +Enum
> +Name(arc_tune_attr) Type(int)
> +
> +EnumValue
> +Enum(arc_tune_attr) String(arc600) Value(ARC_TUNE_ARC600)
>
> -mtune=ARC700
> -Target RejectNegative Var(arc_tune, TUNE_ARC700_4_2_STD)
> -Tune for ARC700 R4.2 Cpu with standard multiplier block.
> +EnumValue
> +Enum(arc_tune_attr) String(arc601) Value(ARC_TUNE_ARC600)
>
> -mtune=ARC700-xmac
> -Target RejectNegative Var(arc_tune, TUNE_ARC700_4_2_XMAC)
> -Tune for ARC700 R4.2 Cpu with XMAC block.
> +EnumValue
> +Enum(arc_tune_attr) String(arc700) Value(ARC_TUNE_ARC700_4_2_STD)
>
> -mtune=ARC725D
> -Target RejectNegative Var(arc_tune, TUNE_ARC700_4_2_XMAC)
> -Tune for ARC700 R4.2 Cpu with XMAC block.
> +EnumValue
> +Enum(arc_tune_attr) String(arc700-xmac) Value(ARC_TUNE_ARC700_4_2_XMAC)
>
> -mtune=ARC750D
> -Target RejectNegative Var(arc_tune, TUNE_ARC700_4_2_XMAC)
> -Tune for ARC700 R4.2 Cpu with XMAC block.
> +EnumValue
> +Enum(arc_tune_attr) String(arc725d) Value(ARC_TUNE_ARC700_4_2_XMAC)
> +
> +EnumValue
> +Enum(arc_tune_attr) String(arc750d) Value(ARC_TUNE_ARC700_4_2_XMAC)
> +
> +EnumValue
> +Enum(arc_tune_attr) String(core3) Value(ARC_TUNE_CORE_3)
>
> mindexed-loads
> Target Var(TARGET_INDEXED_LOADS) Init(TARGET_INDEXED_LOADS_DEFAULT)
> --
> 1.9.1
>