[1/2] RISC-V: Support scheduling for sifive p400 series
Checks
Commit Message
Add sifive p400 series scheduler module. For more information
see https://www.sifive.com/cores/performance-p450-470.
gcc/ChangeLog:
* config/riscv/riscv.md: Include sifive-p400.md.
* config/riscv/sifive-p400.md: New file.
* config/riscv/riscv-cores.def (RISCV_TUNE): Add parameter.
* config/riscv/riscv-opts.h (enum riscv_microarchitecture_type):
Add sifive_p400.
* config/riscv/riscv.cc (sifive_p400_tune_info): New.
* config/riscv/riscv.h (TARGET_SFB_ALU): Update.
* doc/invoke.texi (RISC-V Options): Add sifive-p400-series
---
gcc/config/riscv/riscv-cores.def | 1 +
gcc/config/riscv/riscv-opts.h | 1 +
gcc/config/riscv/riscv.cc | 17 +++
gcc/config/riscv/riscv.h | 1 +
gcc/config/riscv/riscv.md | 3 +-
gcc/config/riscv/sifive-p400.md | 174 +++++++++++++++++++++++++++++++
gcc/doc/invoke.texi | 4 +-
7 files changed, 198 insertions(+), 3 deletions(-)
create mode 100644 gcc/config/riscv/sifive-p400.md
Comments
pushed, thanks :)
On Fri, Feb 2, 2024 at 11:59 AM Monk Chiang <monk.chiang@sifive.com> wrote:
>
> Add sifive p400 series scheduler module. For more information
> see https://www.sifive.com/cores/performance-p450-470.
>
> gcc/ChangeLog:
>
> * config/riscv/riscv.md: Include sifive-p400.md.
> * config/riscv/sifive-p400.md: New file.
> * config/riscv/riscv-cores.def (RISCV_TUNE): Add parameter.
> * config/riscv/riscv-opts.h (enum riscv_microarchitecture_type):
> Add sifive_p400.
> * config/riscv/riscv.cc (sifive_p400_tune_info): New.
> * config/riscv/riscv.h (TARGET_SFB_ALU): Update.
> * doc/invoke.texi (RISC-V Options): Add sifive-p400-series
> ---
> gcc/config/riscv/riscv-cores.def | 1 +
> gcc/config/riscv/riscv-opts.h | 1 +
> gcc/config/riscv/riscv.cc | 17 +++
> gcc/config/riscv/riscv.h | 1 +
> gcc/config/riscv/riscv.md | 3 +-
> gcc/config/riscv/sifive-p400.md | 174 +++++++++++++++++++++++++++++++
> gcc/doc/invoke.texi | 4 +-
> 7 files changed, 198 insertions(+), 3 deletions(-)
> create mode 100644 gcc/config/riscv/sifive-p400.md
>
> diff --git a/gcc/config/riscv/riscv-cores.def b/gcc/config/riscv/riscv-cores.def
> index a07a79e2cb7..0785e8f3fbd 100644
> --- a/gcc/config/riscv/riscv-cores.def
> +++ b/gcc/config/riscv/riscv-cores.def
> @@ -37,6 +37,7 @@ RISCV_TUNE("rocket", generic, rocket_tune_info)
> RISCV_TUNE("sifive-3-series", generic, rocket_tune_info)
> RISCV_TUNE("sifive-5-series", generic, rocket_tune_info)
> RISCV_TUNE("sifive-7-series", sifive_7, sifive_7_tune_info)
> +RISCV_TUNE("sifive-p400-series", sifive_p400, sifive_p400_tune_info)
> RISCV_TUNE("sifive-p600-series", sifive_p600, sifive_p600_tune_info)
> RISCV_TUNE("thead-c906", generic, thead_c906_tune_info)
> RISCV_TUNE("generic-ooo", generic_ooo, generic_ooo_tune_info)
> diff --git a/gcc/config/riscv/riscv-opts.h b/gcc/config/riscv/riscv-opts.h
> index 25951665b13..4edddbadc37 100644
> --- a/gcc/config/riscv/riscv-opts.h
> +++ b/gcc/config/riscv/riscv-opts.h
> @@ -55,6 +55,7 @@ extern enum riscv_isa_spec_class riscv_isa_spec;
> enum riscv_microarchitecture_type {
> generic,
> sifive_7,
> + sifive_p400,
> sifive_p600,
> generic_ooo
> };
> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
> index cead76fe1a2..4b24e4b9a0a 100644
> --- a/gcc/config/riscv/riscv.cc
> +++ b/gcc/config/riscv/riscv.cc
> @@ -447,6 +447,23 @@ static const struct riscv_tune_param sifive_7_tune_info = {
> NULL, /* vector cost */
> };
>
> +/* Costs to use when optimizing for Sifive p400 Series. */
> +static const struct riscv_tune_param sifive_p400_tune_info = {
> + {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* fp_add */
> + {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* fp_mul */
> + {COSTS_N_INSNS (20), COSTS_N_INSNS (20)}, /* fp_div */
> + {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* int_mul */
> + {COSTS_N_INSNS (6), COSTS_N_INSNS (6)}, /* int_div */
> + 3, /* issue_rate */
> + 4, /* branch_cost */
> + 3, /* memory_cost */
> + 4, /* fmv_cost */
> + true, /* slow_unaligned_access */
> + false, /* use_divmod_expansion */
> + RISCV_FUSE_LUI_ADDI | RISCV_FUSE_AUIPC_ADDI, /* fusible_ops */
> + &generic_vector_cost, /* vector cost */
> +};
> +
> /* Costs to use when optimizing for Sifive p600 Series. */
> static const struct riscv_tune_param sifive_p600_tune_info = {
> {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* fp_add */
> diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h
> index e0cb3ba08d4..669308cc96d 100644
> --- a/gcc/config/riscv/riscv.h
> +++ b/gcc/config/riscv/riscv.h
> @@ -898,6 +898,7 @@ extern enum riscv_cc get_riscv_cc (const rtx use);
>
> #define TARGET_SFB_ALU \
> ((riscv_microarchitecture == sifive_7) \
> + || (riscv_microarchitecture == sifive_p400) \
> || (riscv_microarchitecture == sifive_p600))
>
> #define LOGICAL_OP_NON_SHORT_CIRCUIT 0
> diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
> index 2a164a03dbd..39b29795cd6 100644
> --- a/gcc/config/riscv/riscv.md
> +++ b/gcc/config/riscv/riscv.md
> @@ -687,7 +687,7 @@
> ;; Microarchitectures we know how to tune for.
> ;; Keep this in sync with enum riscv_microarchitecture.
> (define_attr "tune"
> - "generic,sifive_7,sifive_p600,generic_ooo"
> + "generic,sifive_7,sifive_p400,sifive_p600,generic_ooo"
> (const (symbol_ref "((enum attr_tune) riscv_microarchitecture)")))
>
> ;; Describe a user's asm statement.
> @@ -3850,6 +3850,7 @@
> (include "pic.md")
> (include "generic.md")
> (include "sifive-7.md")
> +(include "sifive-p400.md")
> (include "sifive-p600.md")
> (include "thead.md")
> (include "generic-ooo.md")
> diff --git a/gcc/config/riscv/sifive-p400.md b/gcc/config/riscv/sifive-p400.md
> new file mode 100644
> index 00000000000..cc244d3c3e6
> --- /dev/null
> +++ b/gcc/config/riscv/sifive-p400.md
> @@ -0,0 +1,174 @@
> +;; Scheduling description for Sifive p400.
> +
> +;; Sifive p400 series is a triple-issue, superscalar, out-of-order processor.
> +
> +;; CPU execution units:
> +;; ialu Integer Units: all arithmetic and logic.
> +;;
> +;; bru Branch Resolution Unit: all branches.
> +;;
> +;; st Memory Write Unit: all writes to memory.
> +;;
> +;; ld Memory Read Unit: all reads from memory.
> +;;
> +;; imul Integer Multiply Unit
> +;;
> +;; idiv Integer Divide Unit
> +;;
> +;; system System Unit: all coprocessor accesses.
> +;;
> +;; fpu Floating Point Unit
> +;;
> +;; fmul Floating Point Multiply Unit
> +;;
> +;; fdiv Floating Point Divide Unit
> +
> +;; Four automata are defined to reduce number of states
> +;; which a single large automaton will have.
> +(define_automaton "sifive_p400_iex,sifive_p400_fex,sifive_p400_mem,sifive_p400_div")
> +
> +;; The Sifive p400 has six pipelines:
> +;; A-pipe Load, Store
> +;; B-pipe ALU, Branch
> +;; M-pipe ALU, MUL, DIV and I2F(integer to float instruction)
> +;; C-pipe ALU, Conditional move and system for coprocessor accesses
> +;; F-pipe FPU, MUL, F2I(float to integer instruction)
> +;; FM-pipe FPU, MUL, DIV
> +
> +(define_cpu_unit "sifive_p400_A" "sifive_p400_mem")
> +(define_cpu_unit "sifive_p400_B" "sifive_p400_iex")
> +(define_cpu_unit "sifive_p400_M" "sifive_p400_iex")
> +(define_cpu_unit "sifive_p400_C" "sifive_p400_iex")
> +(define_cpu_unit "sifive_p400_F" "sifive_p400_fex")
> +(define_cpu_unit "sifive_p400_FM" "sifive_p400_fex")
> +
> +;; Load and store unit.
> +(define_cpu_unit "sifive_p400_ld" "sifive_p400_mem")
> +(define_cpu_unit "sifive_p400_st" "sifive_p400_mem")
> +
> +;; Branch unit.
> +(define_cpu_unit "sifive_p400_bru" "sifive_p400_iex")
> +
> +;; Integer and multiply unit.
> +(define_cpu_unit "sifive_p400_ialu" "sifive_p400_iex")
> +(define_cpu_unit "sifive_p400_imul" "sifive_p400_iex")
> +(define_cpu_unit "sifive_p400_system" "sifive_p400_iex")
> +
> +;; Divide unit.
> +(define_cpu_unit "sifive_p400_idiv" "sifive_p400_div")
> +(define_cpu_unit "sifive_p400_fdiv" "sifive_p400_div")
> +
> +;; Float and multiply unit.
> +(define_cpu_unit "sifive_p400_fmul" "sifive_p400_fex")
> +(define_cpu_unit "sifive_p400_fpu" "sifive_p400_fex")
> +
> +;; ALU instruction can use pipeline C, B and M.
> +(define_reservation "p400_int_pipe" "(sifive_p400_C|sifive_p400_B|sifive_p400_M)")
> +;; FPU instruction can use pipeline F and FM.
> +(define_reservation "p400_float_pipe" "(sifive_p400_F|sifive_p400_FM)")
> +
> +(define_insn_reservation "sifive_p400_load" 3
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "load"))
> + "sifive_p400_A,sifive_p400_ld*2")
> +
> +(define_insn_reservation "sifive_p400_fpload" 4
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "fpload"))
> + "sifive_p400_A,sifive_p400_ld*3")
> +
> +(define_insn_reservation "sifive_p400_store" 1
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "store"))
> + "sifive_p400_A+sifive_p400_st")
> +
> +(define_insn_reservation "sifive_p400_fpstore" 1
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "fpstore"))
> + "sifive_p400_A+sifive_p400_st")
> +
> +(define_insn_reservation "sifive_p400_branch" 1
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "branch,jump,call"))
> + "sifive_p400_B+sifive_p400_bru")
> +
> +(define_insn_reservation "sifive_p400_sfb_alu" 1
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "sfb_alu"))
> + "sifive_p400_C+sifive_p400_bru+sifive_p400_ialu")
> +
> +(define_insn_reservation "sifive_p400_atomic" 3
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "atomic"))
> + "sifive_p400_C,sifive_p400_system*2")
> +
> +(define_insn_reservation "sifive_p400_mul" 3
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "imul"))
> + "sifive_p400_M,sifive_p400_imul*2")
> +
> +(define_insn_reservation "sifive_p400_div" 31
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "idiv"))
> + "sifive_p400_M, sifive_p400_idiv*5")
> +
> +(define_insn_reservation "sifive_p400_alu" 1
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "unknown,arith,logical,shift,slt,multi,bitmanip,clz,ctz,rotate"))
> + "p400_int_pipe+sifive_p400_ialu")
> +
> +(define_insn_reservation "sifive_p400_cpop" 3
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "cpop"))
> + "p400_int_pipe,sifive_p400_ialu*2")
> +
> +(define_insn_reservation "sifive_p400_load_immediate" 1
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "nop,const,auipc,move"))
> + "p400_int_pipe")
> +
> +(define_insn_reservation "sifive_p400_fma" 4
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "fadd,fmul,fmadd"))
> + "p400_float_pipe,sifive_p400_fmul*3")
> +
> +(define_insn_reservation "sifive_p400_i2f" 2
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "mtc,fcvt_i2f"))
> + "sifive_p400_M,sifive_p400_ialu")
> +
> +(define_insn_reservation "sifive_p400_f2i" 2
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "mfc,fcmp,fcvt_f2i"))
> + "sifive_p400_F,sifive_p400_fpu")
> +
> +(define_insn_reservation "sifive_p400_fmove" 2
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "fmove,fcvt"))
> + "p400_float_pipe,sifive_p400_fpu")
> +
> +(define_insn_reservation "sifive_p400_fdiv_s" 18
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "fdiv,fsqrt")
> + (eq_attr "mode" "SF"))
> + "sifive_p400_FM, sifive_p400_fdiv*5")
> +
> +(define_insn_reservation "sifive_p400_fdiv_d" 31
> + (and (eq_attr "tune" "sifive_p400")
> + (eq_attr "type" "fdiv,fsqrt")
> + (eq_attr "mode" "DF"))
> + "sifive_p400_FM, sifive_p400_fdiv*5")
> +
> +(define_bypass 1 "sifive_p400_load,sifive_p400_alu,sifive_p400_mul,sifive_p400_sfb_alu"
> + "sifive_p400_alu,sifive_p400_branch")
> +
> +(define_bypass 1 "sifive_p400_load,sifive_p400_alu,sifive_p400_mul,
> + sifive_p400_f2i,sifive_p400_fmove,sifive_p400_sfb_alu"
> + "sifive_p400_store" "riscv_store_data_bypass_p")
> +
> +(define_bypass 1 "sifive_p400_i2f"
> + "sifive_p400_fma,sifive_p400_f2i,sifive_p400_fmove,sifive_p400_fdiv_s,sifive_p400_fdiv_d")
> +
> +(define_bypass 1 "sifive_p400_f2i"
> + "sifive_p400_branch,sifive_p400_sfb_alu,sifive_p400_mul,
> + sifive_p400_div,sifive_p400_alu,sifive_p400_cpop")
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index e9c691d63da..f8645822ca4 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -30714,8 +30714,8 @@ Permissible values for this option are: @samp{sifive-e20}, @samp{sifive-e21},
> Optimize the output for the given processor, specified by microarchitecture or
> particular CPU name. Permissible values for this option are: @samp{rocket},
> @samp{sifive-3-series}, @samp{sifive-5-series}, @samp{sifive-7-series},
> -@samp{thead-c906}, @samp{size}, @samp{sifive-p600-series},
> -and all valid options for @option{-mcpu=}.
> +@samp{thead-c906}, @samp{size}, @samp{sifive-p400-series},
> +@samp{sifive-p600-series}, and all valid options for @option{-mcpu=}.
>
> When @option{-mtune=} is not specified, use the setting from @option{-mcpu},
> the default is @samp{rocket} if both are not specified.
> --
> 2.40.1
>
@@ -37,6 +37,7 @@ RISCV_TUNE("rocket", generic, rocket_tune_info)
RISCV_TUNE("sifive-3-series", generic, rocket_tune_info)
RISCV_TUNE("sifive-5-series", generic, rocket_tune_info)
RISCV_TUNE("sifive-7-series", sifive_7, sifive_7_tune_info)
+RISCV_TUNE("sifive-p400-series", sifive_p400, sifive_p400_tune_info)
RISCV_TUNE("sifive-p600-series", sifive_p600, sifive_p600_tune_info)
RISCV_TUNE("thead-c906", generic, thead_c906_tune_info)
RISCV_TUNE("generic-ooo", generic_ooo, generic_ooo_tune_info)
@@ -55,6 +55,7 @@ extern enum riscv_isa_spec_class riscv_isa_spec;
enum riscv_microarchitecture_type {
generic,
sifive_7,
+ sifive_p400,
sifive_p600,
generic_ooo
};
@@ -447,6 +447,23 @@ static const struct riscv_tune_param sifive_7_tune_info = {
NULL, /* vector cost */
};
+/* Costs to use when optimizing for Sifive p400 Series. */
+static const struct riscv_tune_param sifive_p400_tune_info = {
+ {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* fp_add */
+ {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* fp_mul */
+ {COSTS_N_INSNS (20), COSTS_N_INSNS (20)}, /* fp_div */
+ {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* int_mul */
+ {COSTS_N_INSNS (6), COSTS_N_INSNS (6)}, /* int_div */
+ 3, /* issue_rate */
+ 4, /* branch_cost */
+ 3, /* memory_cost */
+ 4, /* fmv_cost */
+ true, /* slow_unaligned_access */
+ false, /* use_divmod_expansion */
+ RISCV_FUSE_LUI_ADDI | RISCV_FUSE_AUIPC_ADDI, /* fusible_ops */
+ &generic_vector_cost, /* vector cost */
+};
+
/* Costs to use when optimizing for Sifive p600 Series. */
static const struct riscv_tune_param sifive_p600_tune_info = {
{COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* fp_add */
@@ -898,6 +898,7 @@ extern enum riscv_cc get_riscv_cc (const rtx use);
#define TARGET_SFB_ALU \
((riscv_microarchitecture == sifive_7) \
+ || (riscv_microarchitecture == sifive_p400) \
|| (riscv_microarchitecture == sifive_p600))
#define LOGICAL_OP_NON_SHORT_CIRCUIT 0
@@ -687,7 +687,7 @@
;; Microarchitectures we know how to tune for.
;; Keep this in sync with enum riscv_microarchitecture.
(define_attr "tune"
- "generic,sifive_7,sifive_p600,generic_ooo"
+ "generic,sifive_7,sifive_p400,sifive_p600,generic_ooo"
(const (symbol_ref "((enum attr_tune) riscv_microarchitecture)")))
;; Describe a user's asm statement.
@@ -3850,6 +3850,7 @@
(include "pic.md")
(include "generic.md")
(include "sifive-7.md")
+(include "sifive-p400.md")
(include "sifive-p600.md")
(include "thead.md")
(include "generic-ooo.md")
new file mode 100644
@@ -0,0 +1,174 @@
+;; Scheduling description for Sifive p400.
+
+;; Sifive p400 series is a triple-issue, superscalar, out-of-order processor.
+
+;; CPU execution units:
+;; ialu Integer Units: all arithmetic and logic.
+;;
+;; bru Branch Resolution Unit: all branches.
+;;
+;; st Memory Write Unit: all writes to memory.
+;;
+;; ld Memory Read Unit: all reads from memory.
+;;
+;; imul Integer Multiply Unit
+;;
+;; idiv Integer Divide Unit
+;;
+;; system System Unit: all coprocessor accesses.
+;;
+;; fpu Floating Point Unit
+;;
+;; fmul Floating Point Multiply Unit
+;;
+;; fdiv Floating Point Divide Unit
+
+;; Four automata are defined to reduce number of states
+;; which a single large automaton will have.
+(define_automaton "sifive_p400_iex,sifive_p400_fex,sifive_p400_mem,sifive_p400_div")
+
+;; The Sifive p400 has six pipelines:
+;; A-pipe Load, Store
+;; B-pipe ALU, Branch
+;; M-pipe ALU, MUL, DIV and I2F(integer to float instruction)
+;; C-pipe ALU, Conditional move and system for coprocessor accesses
+;; F-pipe FPU, MUL, F2I(float to integer instruction)
+;; FM-pipe FPU, MUL, DIV
+
+(define_cpu_unit "sifive_p400_A" "sifive_p400_mem")
+(define_cpu_unit "sifive_p400_B" "sifive_p400_iex")
+(define_cpu_unit "sifive_p400_M" "sifive_p400_iex")
+(define_cpu_unit "sifive_p400_C" "sifive_p400_iex")
+(define_cpu_unit "sifive_p400_F" "sifive_p400_fex")
+(define_cpu_unit "sifive_p400_FM" "sifive_p400_fex")
+
+;; Load and store unit.
+(define_cpu_unit "sifive_p400_ld" "sifive_p400_mem")
+(define_cpu_unit "sifive_p400_st" "sifive_p400_mem")
+
+;; Branch unit.
+(define_cpu_unit "sifive_p400_bru" "sifive_p400_iex")
+
+;; Integer and multiply unit.
+(define_cpu_unit "sifive_p400_ialu" "sifive_p400_iex")
+(define_cpu_unit "sifive_p400_imul" "sifive_p400_iex")
+(define_cpu_unit "sifive_p400_system" "sifive_p400_iex")
+
+;; Divide unit.
+(define_cpu_unit "sifive_p400_idiv" "sifive_p400_div")
+(define_cpu_unit "sifive_p400_fdiv" "sifive_p400_div")
+
+;; Float and multiply unit.
+(define_cpu_unit "sifive_p400_fmul" "sifive_p400_fex")
+(define_cpu_unit "sifive_p400_fpu" "sifive_p400_fex")
+
+;; ALU instruction can use pipeline C, B and M.
+(define_reservation "p400_int_pipe" "(sifive_p400_C|sifive_p400_B|sifive_p400_M)")
+;; FPU instruction can use pipeline F and FM.
+(define_reservation "p400_float_pipe" "(sifive_p400_F|sifive_p400_FM)")
+
+(define_insn_reservation "sifive_p400_load" 3
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "load"))
+ "sifive_p400_A,sifive_p400_ld*2")
+
+(define_insn_reservation "sifive_p400_fpload" 4
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "fpload"))
+ "sifive_p400_A,sifive_p400_ld*3")
+
+(define_insn_reservation "sifive_p400_store" 1
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "store"))
+ "sifive_p400_A+sifive_p400_st")
+
+(define_insn_reservation "sifive_p400_fpstore" 1
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "fpstore"))
+ "sifive_p400_A+sifive_p400_st")
+
+(define_insn_reservation "sifive_p400_branch" 1
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "branch,jump,call"))
+ "sifive_p400_B+sifive_p400_bru")
+
+(define_insn_reservation "sifive_p400_sfb_alu" 1
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "sfb_alu"))
+ "sifive_p400_C+sifive_p400_bru+sifive_p400_ialu")
+
+(define_insn_reservation "sifive_p400_atomic" 3
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "atomic"))
+ "sifive_p400_C,sifive_p400_system*2")
+
+(define_insn_reservation "sifive_p400_mul" 3
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "imul"))
+ "sifive_p400_M,sifive_p400_imul*2")
+
+(define_insn_reservation "sifive_p400_div" 31
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "idiv"))
+ "sifive_p400_M, sifive_p400_idiv*5")
+
+(define_insn_reservation "sifive_p400_alu" 1
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "unknown,arith,logical,shift,slt,multi,bitmanip,clz,ctz,rotate"))
+ "p400_int_pipe+sifive_p400_ialu")
+
+(define_insn_reservation "sifive_p400_cpop" 3
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "cpop"))
+ "p400_int_pipe,sifive_p400_ialu*2")
+
+(define_insn_reservation "sifive_p400_load_immediate" 1
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "nop,const,auipc,move"))
+ "p400_int_pipe")
+
+(define_insn_reservation "sifive_p400_fma" 4
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "fadd,fmul,fmadd"))
+ "p400_float_pipe,sifive_p400_fmul*3")
+
+(define_insn_reservation "sifive_p400_i2f" 2
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "mtc,fcvt_i2f"))
+ "sifive_p400_M,sifive_p400_ialu")
+
+(define_insn_reservation "sifive_p400_f2i" 2
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "mfc,fcmp,fcvt_f2i"))
+ "sifive_p400_F,sifive_p400_fpu")
+
+(define_insn_reservation "sifive_p400_fmove" 2
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "fmove,fcvt"))
+ "p400_float_pipe,sifive_p400_fpu")
+
+(define_insn_reservation "sifive_p400_fdiv_s" 18
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "fdiv,fsqrt")
+ (eq_attr "mode" "SF"))
+ "sifive_p400_FM, sifive_p400_fdiv*5")
+
+(define_insn_reservation "sifive_p400_fdiv_d" 31
+ (and (eq_attr "tune" "sifive_p400")
+ (eq_attr "type" "fdiv,fsqrt")
+ (eq_attr "mode" "DF"))
+ "sifive_p400_FM, sifive_p400_fdiv*5")
+
+(define_bypass 1 "sifive_p400_load,sifive_p400_alu,sifive_p400_mul,sifive_p400_sfb_alu"
+ "sifive_p400_alu,sifive_p400_branch")
+
+(define_bypass 1 "sifive_p400_load,sifive_p400_alu,sifive_p400_mul,
+ sifive_p400_f2i,sifive_p400_fmove,sifive_p400_sfb_alu"
+ "sifive_p400_store" "riscv_store_data_bypass_p")
+
+(define_bypass 1 "sifive_p400_i2f"
+ "sifive_p400_fma,sifive_p400_f2i,sifive_p400_fmove,sifive_p400_fdiv_s,sifive_p400_fdiv_d")
+
+(define_bypass 1 "sifive_p400_f2i"
+ "sifive_p400_branch,sifive_p400_sfb_alu,sifive_p400_mul,
+ sifive_p400_div,sifive_p400_alu,sifive_p400_cpop")
@@ -30714,8 +30714,8 @@ Permissible values for this option are: @samp{sifive-e20}, @samp{sifive-e21},
Optimize the output for the given processor, specified by microarchitecture or
particular CPU name. Permissible values for this option are: @samp{rocket},
@samp{sifive-3-series}, @samp{sifive-5-series}, @samp{sifive-7-series},
-@samp{thead-c906}, @samp{size}, @samp{sifive-p600-series},
-and all valid options for @option{-mcpu=}.
+@samp{thead-c906}, @samp{size}, @samp{sifive-p400-series},
+@samp{sifive-p600-series}, and all valid options for @option{-mcpu=}.
When @option{-mtune=} is not specified, use the setting from @option{-mcpu},
the default is @samp{rocket} if both are not specified.