Thanks for your review.
I'll resend this patch, because it will cause conflict in
riscv_microarchitecture_type when the order of andes_23 is changed.

Kito Cheng <[email protected]> 於 2025年11月26日週三 下午6:06寫道:
>
> LGTM :)
>
> On Wed, Nov 26, 2025 at 3:38 PM Kuan-Lin Chen <[email protected]> wrote:
>>
>> The Andes 45 series is a 8-stage, in-order, and dual-issue execution 
>> pipeline.
>>
>> Co-author: Allen Bing-Sung Lu ([email protected])
>>
>> gcc/ChangeLog:
>>
>>         * config/riscv/riscv-cores.def (RISCV_TUNE): Add andes-45-sereis.
>>         (RISCV_CORE): Add Andes 45 series cpu list.
>>         * config/riscv/riscv-opts.h
>>         (enum riscv_microarchitecture_type): Add andes_45_series.
>>         * config/riscv/riscv.cc: Add andes_45_tune_info.
>>         * config/riscv/riscv.md: Add andes_45.
>>         * doc/riscv-mcpu.texi: Regenerated for Andes cpu list.
>>         * doc/riscv-mtune.texi: Regenerated for andes-45-series.
>>         * config/riscv/andes-45-series.md: New file.
>> ---
>>  gcc/config/riscv/andes-45-series.md | 379 ++++++++++++++++++++++++++++
>>  gcc/config/riscv/riscv-cores.def    |   6 +
>>  gcc/config/riscv/riscv-opts.h       |   1 +
>>  gcc/config/riscv/riscv.cc           |  25 ++
>>  gcc/config/riscv/riscv.md           |   3 +-
>>  gcc/doc/riscv-mcpu.texi             |   8 +
>>  gcc/doc/riscv-mtune.texi            |   2 +
>>  7 files changed, 423 insertions(+), 1 deletion(-)
>>  create mode 100644 gcc/config/riscv/andes-45-series.md
>>
>> diff --git a/gcc/config/riscv/andes-45-series.md 
>> b/gcc/config/riscv/andes-45-series.md
>> new file mode 100644
>> index 00000000000..7693db84746
>> --- /dev/null
>> +++ b/gcc/config/riscv/andes-45-series.md
>> @@ -0,0 +1,379 @@
>> +;; DFA-based pipeline description for Andes 45 series.
>> +;;
>> +;; Copyright (C) 2025 Free Software Foundation, Inc.
>> +;;
>> +;; This file is part of GCC.
>> +;;
>> +;; GCC is free software; you can redistribute it and/or modify it
>> +;; under the terms of the GNU General Public License as published
>> +;; by the Free Software Foundation; either version 3, or (at your
>> +;; option) any later version.
>> +
>> +;; GCC is distributed in the hope that it will be useful, but WITHOUT
>> +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
>> +;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
>> +;; License for more details.
>> +
>> +;; You should have received a copy of the GNU General Public License
>> +;; along with GCC; see the file COPYING3.  If not see
>> +;; <http://www.gnu.org/licenses/>.
>> +
>> +(define_automaton "andes_45_arch, andes_45_vector")
>> +
>> +(define_cpu_unit "andes_45_pipe0" "andes_45_arch")
>> +(define_cpu_unit "andes_45_pipe1" "andes_45_arch")
>> +(define_cpu_unit "andes_45_vpu_pipe0" "andes_45_vector")
>> +(define_cpu_unit "andes_45_vpu_pipe1" "andes_45_vector")
>> +
>> +(define_reservation "andes_45_vpu_pipe" "(andes_45_vpu_pipe0 + 
>> andes_45_pipe0 | andes_45_vpu_pipe1 + andes_45_pipe1)")
>> +
>> +(define_cpu_unit 
>> "andes_45_mdu,andes_45_alu0,andes_45_alu1,andes_45_bru0,andes_45_bru1,andes_45_lsu"
>>  "andes_45_arch")
>> +(define_cpu_unit 
>> "andes_45_fpu_fmac,andes_45_fpu_fdiv,andes_45_fpu_fmis,andes_45_fpu_fmv" 
>> "andes_45_arch")
>> +(define_cpu_unit 
>> "andes_45_vpu_alu,andes_45_vpu_mac,andes_45_vpu_fmis,andes_45_vpu_permut,
>> +                 
>> andes_45_vpu_div,andes_45_vpu_fdiv,andes_45_vpu_mask,andes_45_vpu_lsu" 
>> "andes_45_vector")
>> +
>> +(define_reservation "andes_45_fpu_arith"
>> +  "andes_45_pipe0 + andes_45_fpu_fmac | andes_45_pipe1 + andes_45_fpu_fmac")
>> +
>> +;; andes 45 series unsupported insns are mapped to dummies reservations
>> +(define_reservation "andes_45_dummies"
>> +  "andes_45_pipe0 | andes_45_pipe1, andes_45_alu0 | andes_45_alu1")
>> +
>> +;; andes 45 series vector unsupported insns are mapped to dummies 
>> reservations
>> +(define_reservation "andes_45_vector_dummies"
>> +  "andes_45_pipe0 | andes_45_pipe1, andes_45_vpu_alu")
>> +
>> +(define_insn_reservation "andes_45_alu_insn_s" 1
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "shift,nop,logical"))
>> +  "andes_45_pipe0 + andes_45_alu0 | andes_45_pipe1 + andes_45_alu1")
>> +
>> +(define_insn_reservation "andes_45_alu_insn_l" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" 
>> "unknown,const,arith,multi,slt,move,auipc,atomic,bitmanip"))
>> +  "andes_45_pipe0 + andes_45_alu0 | andes_45_pipe1 + andes_45_alu1")
>> +
>> +(define_insn_reservation "andes_45_cmov" 1
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "condmove"))
>> +  "andes_45_pipe0 + andes_45_alu0 + andes_45_pipe1 + andes_45_alu1")
>> +
>> +(define_insn_reservation "andes_45_load_wd" 4
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "load")
>> +           (not (eq_attr "mode" "QI,HI"))))
>> +  "andes_45_pipe0 + andes_45_lsu | andes_45_pipe1 + andes_45_lsu")
>> +
>> +(define_insn_reservation "andes_45_load_bh" 5
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "load")
>> +           (eq_attr "mode" "QI,HI")))
>> +  "andes_45_pipe0 + andes_45_lsu | andes_45_pipe1 + andes_45_lsu")
>> +
>> +(define_insn_reservation "andes_45_store_d" 0
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "store")
>> +           (eq_attr "mode" "DI,SI")))
>> +  "andes_45_pipe0 + andes_45_lsu | andes_45_pipe1 + andes_45_lsu")
>> +
>> +(define_insn_reservation "andes_45_store" 0
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "store")
>> +           (not (eq_attr "mode" "DI,SI"))))
>> +  "andes_45_pipe0 + andes_45_pipe1 + andes_45_lsu")
>> +
>> +(define_insn_reservation "andes_45_branch" 1
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "branch,jump,call,ret,jalr,trap"))
>> +  "andes_45_pipe0 + andes_45_bru0 | andes_45_pipe1 + andes_45_bru1")
>> +
>> +(define_insn_reservation "andes_45_imul" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "imul"))
>> +  "andes_45_pipe0 + andes_45_alu0 | andes_45_pipe1 + andes_45_alu1, 
>> andes_45_mdu * 2")
>> +
>> +(define_insn_reservation "andes_45_idivsi" 38
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "idiv")
>> +           (eq_attr "mode" "SI")))
>> +  "andes_45_pipe0 + andes_45_alu0 | andes_45_pipe1 + andes_45_alu1, 
>> andes_45_mdu * 2")
>> +
>> +(define_insn_reservation "andes_45_idivdi" 70
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "idiv")
>> +           (eq_attr "mode" "DI")))
>> +  "andes_45_pipe0  + andes_45_alu0 | andes_45_pipe1 + andes_45_alu1, 
>> andes_45_mdu * 2")
>> +
>> +(define_insn_reservation "andes_45_xfer" 1
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "mfc,mtc"))
>> +  "andes_45_pipe0 + andes_45_alu0 | andes_45_pipe1 + andes_45_alu1")
>> +
>> +(define_insn_reservation "andes_45_fpu_alu_s" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "fadd")
>> +           (eq_attr "mode" "SF")))
>> +  "andes_45_fpu_arith")
>> +
>> +(define_insn_reservation "andes_45_fpu_alu_d" 4
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "fadd")
>> +           (eq_attr "mode" "DF")))
>> +  "andes_45_fpu_arith")
>> +
>> +(define_insn_reservation "andes_45_fpu_mul_s" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "fmul")
>> +           (eq_attr "mode" "SF")))
>> +  "andes_45_fpu_arith")
>> +
>> +(define_insn_reservation "andes_45_fpu_mul_d" 4
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "fmul")
>> +           (eq_attr "mode" "DF")))
>> +  "andes_45_fpu_arith")
>> +
>> +(define_insn_reservation "andes_45_fpu_mac_s" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "fmadd")
>> +           (eq_attr "mode" "SF")))
>> +  "(andes_45_pipe0 | andes_45_pipe1) + andes_45_fpu_fmac + andes_45_fpu_fmv 
>> + andes_45_fpu_fmis")
>> +
>> +(define_insn_reservation "andes_45_fpu_mac_d" 4
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (and (eq_attr "type" "fmadd")
>> +           (eq_attr "mode" "DF")))
>> +  "(andes_45_pipe0 | andes_45_pipe1) + andes_45_fpu_fmac + andes_45_fpu_fmv 
>> + andes_45_fpu_fmis")
>> +
>> +(define_insn_reservation "andes_45_fpu_div" 33
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "fdiv"))
>> +  "andes_45_pipe0 + andes_45_fpu_fdiv | andes_45_pipe1 + andes_45_fpu_fdiv, 
>> andes_45_fpu_fdiv * 27")
>> +
>> +(define_insn_reservation "andes_45_fpu_sqrt" 33
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "fsqrt"))
>> +  "andes_45_pipe0 + andes_45_fpu_fdiv | andes_45_pipe1 + andes_45_fpu_fdiv, 
>> andes_45_fpu_fdiv * 27")
>> +
>> +(define_insn_reservation "andes_45_fpu_move" 1
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "fmove,mtc,mfc"))
>> +  "andes_45_pipe0 + andes_45_fpu_fmv | andes_45_pipe1 + andes_45_fpu_fmv")
>> +
>> +(define_insn_reservation "andes_45_fpu_cmp" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "fcmp"))
>> +  "andes_45_pipe0 + andes_45_fpu_fmis | andes_45_pipe1 + andes_45_fpu_fmis")
>> +
>> +(define_insn_reservation "andes_45_fpu_cvt" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "fcvt,fcvt_f2i,fcvt_i2f"))
>> +  "andes_45_pipe0 + andes_45_fpu_fmis | andes_45_pipe1 + andes_45_fpu_fmis")
>> +
>> +(define_insn_reservation "andes_45_fpu_load" 4
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "fpload"))
>> +  "andes_45_pipe0 + andes_45_pipe1 + andes_45_lsu")
>> +
>> +(define_insn_reservation "andes_45_fpu_store" 0
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "fpstore"))
>> +  "andes_45_pipe0 + andes_45_pipe1 + andes_45_lsu")
>> +
>> +(define_insn_reservation "andes_45_vpu_load_e" 8
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vlde,vldm,vldr,vlsegde,vldff,vlsegdff"))
>> +  "(andes_45_vpu_pipe + andes_45_vpu_lsu), andes_45_vpu_lsu * 2")
>> +
>> +(define_insn_reservation "andes_45_vpu_load_s" 10
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vlds,vlsegds"))
>> +  "(andes_45_vpu_pipe + andes_45_vpu_lsu), andes_45_vpu_lsu * 3")
>> +
>> +(define_insn_reservation "andes_45_vpu_load_x" 12
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vldox,vldux,vlsegdox,vlsegdux"))
>> +  "(andes_45_vpu_pipe + andes_45_vpu_lsu), andes_45_vpu_lsu * 4")
>> +
>> +(define_insn_reservation "andes_45_vpu_store" 0
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vste,vstm,vstr,vsts,vstux,vstox,vssegtox,vssegte,
>> +                       vssegtux,vssegts"))
>> +  "andes_45_vpu_pipe + andes_45_lsu + andes_45_vpu_lsu")
>> +
>> +(define_insn_reservation "andes_45_vpu_alu" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vialu,viwalu,vicalu,vsalu,vaalu,vector"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_alu")
>> +
>> +(define_insn_reservation "andes_45_vpu_ext" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vext"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_permut")
>> +
>> +(define_insn_reservation "andes_45_vpu_shift" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vshift,vnshift,vsshift"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_alu")
>> +
>> +(define_insn_reservation "andes_45_vpu_minmax" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "viminmax"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_alu")
>> +
>> +(define_insn_reservation "andes_45_vpu_cmp" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vicmp"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_alu")
>> +
>> +(define_insn_reservation "andes_45_vpu_mul" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vimul,viwmul,vsmul"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_mac")
>> +
>> +(define_insn_reservation "andes_45_vpu_div" 36
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vidiv"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_div * 35")
>> +
>> +(define_insn_reservation "andes_45_vpu_madd" 4
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vimuladd,viwmuladd"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_mac")
>> +
>> +(define_insn_reservation "andes_45_vpu_merge" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vimerge"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_alu")
>> +
>> +(define_insn_reservation "andes_45_vpu_move" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" 
>> "vimov,vimovvx,vimovxv,vmov,vslideup,vslidedown,vislide1up,vislide1down"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_permut")
>> +
>> +(define_insn_reservation "andes_45_vpu_clip" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vnclip"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_alu")
>> +
>> +(define_insn_reservation "andes_45_vpu_falu" 4
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfalu,vfwalu,vfmul,vfwmul"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_mac")
>> +
>> +(define_insn_reservation "andes_45_vpu_fdiv" 38
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfdiv,vfsqrt"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_fdiv")
>> +
>> +(define_insn_reservation "andes_45_vpu_fmadd" 5
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfmuladd,vfwmuladd"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_mac")
>> +
>> +(define_insn_reservation "andes_45_vpu_fminmax" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfminmax"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_fmis")
>> +
>> +(define_insn_reservation "andes_45_vpu_fcmp" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfcmp,vfrecp"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_fmis")
>> +
>> +(define_insn_reservation "andes_45_vpu_fsgnj" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfsgnj"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_fmis")
>> +
>> +(define_insn_reservation "andes_45_vpu_fclass" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfclass"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_fmis")
>> +
>> +(define_insn_reservation "andes_45_vpu_fmerge" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfmerge"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_fmis")
>> +
>> +(define_insn_reservation "andes_45_vpu_fmove" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfmov,vfmovvf,vfmovfv,vfslide1up,vfslide1down"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_permut")
>> +
>> +(define_insn_reservation "andes_45_vpu_fcvt" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" 
>> "vfcvtitof,vfcvtftoi,vfwcvtitof,vfwcvtftoi,vfwcvtftof,
>> +                       
>> vfncvtitof,vfncvtftoi,vfncvtftof,vfwcvtbf16,vfncvtbf16"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_fmis")
>> +
>> +(define_insn_reservation "andes_45_vpu_red" 9
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vired,viwred"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_alu")
>> +
>> +(define_insn_reservation "andes_45_vpu_fredu" 6
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfredu,vfwredu"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_mac")
>> +
>> +(define_insn_reservation "andes_45_vpu_fredo" 34
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vfredo,vfwredo"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_mac")
>> +
>> +(define_insn_reservation "andes_45_vpu_malu" 3
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vmalu"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_mask")
>> +
>> +(define_insn_reservation "andes_45_vpu_mask" 4
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vmpop,vmffs,vmsfs,vmiota,vmidx"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_mask")
>> +
>> +(define_insn_reservation "andes_45_vpu_gather" 2
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vgather"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_permut")
>> +
>> +(define_insn_reservation "andes_45_vpu_compress" 4
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vcompress"))
>> +  "andes_45_vpu_pipe + andes_45_vpu_permut")
>> +
>> +(define_insn_reservation "andes_45_vcpu_csr" 1
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "wrvxrm,wrfrm,rdvlenb,rdvl,vsetvl,vsetvl_pre"))
>> +  "andes_45_vpu_pipe")
>> +
>> +(define_bypass 1
>> +  "andes_45_fpu_alu_s, andes_45_fpu_mul_s, andes_45_fpu_mac_s"
>> +  "andes_45_load_wd, andes_45_load_bh, andes_45_store,
>> +   andes_45_fpu_load, andes_45_fpu_store")
>> +
>> +(define_bypass 2
>> +  "andes_45_fpu_alu_d, andes_45_fpu_mul_d, andes_45_fpu_mac_d"
>> +  "andes_45_load_wd, andes_45_load_bh, andes_45_store,
>> +   andes_45_fpu_load, andes_45_fpu_store")
>> +
>> +(define_bypass 1
>> +  "andes_45_fpu_cmp, andes_45_fpu_cvt"
>> +  "andes_45_load_wd, andes_45_load_bh, andes_45_store,
>> +   andes_45_fpu_load, andes_45_fpu_store, andes_45_alu_insn_s,
>> +   andes_45_alu_insn_l, andes_45_xfer")
>> +
>> +(define_insn_reservation "andes_45_unknown" 1
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "ghost,cpop,clz,ctz,zicond,mvpair,sfb_alu,minu,maxu,
>> +                       min,max,clmul,rotate,crypto,condmove,rdfrm"))
>> +  "andes_45_dummies")
>> +
>> +(define_insn_reservation "andes_45_vector_unknown" 1
>> +  (and (eq_attr "tune" "andes_45_series")
>> +       (eq_attr "type" "vclz,vror,vsha2ch,vsm4k,vaesef,vghsh,vsm4r,vsm3c,
>> +                       
>> vaeskf1,vandn,vaesdm,vclmul,vclmulh,vrol,vcpop,vbrev8,
>> +                       vsm3me,vbrev,vctz,vgmul,vsha2ms,vaesz,vrev8,
>> +                       vaeskf2,vsha2cl,vwsll,vaesdf,vaesem,vfwmaccbf16,
>> +                       sf_vqmacc,sf_vc,sf_vc_se,sf_vfnrclip,vlsegde"))
>> +  "andes_45_vector_dummies")
>> diff --git a/gcc/config/riscv/riscv-cores.def 
>> b/gcc/config/riscv/riscv-cores.def
>> index e5f093e5819..12b27c95958 100644
>> --- a/gcc/config/riscv/riscv-cores.def
>> +++ b/gcc/config/riscv/riscv-cores.def
>> @@ -56,6 +56,7 @@ RISCV_TUNE("size", generic, optimize_size_tune_info)
>>  RISCV_TUNE("mips-p8700", mips_p8700, mips_p8700_tune_info)
>>  RISCV_TUNE("andes-25-series", andes_25_series, andes_25_tune_info)
>>  RISCV_TUNE("andes-23-series", andes_23_series, andes_23_tune_info)
>> +RISCV_TUNE("andes-45-series", andes_45_series, andes_45_tune_info)
>>
>>  #undef RISCV_TUNE
>>
>> @@ -188,6 +189,11 @@ RISCV_CORE("andes-n225",      
>> "rv32im_zicsr_zifencei_zca_zcb_zcmp_zcmt_"
>>  RISCV_CORE("andes-d23",       "rv32im_zicsr_zifencei_zicbop_zicbom_zicboz_"
>>                               "zca_zcb_zcmp_zcmt_zba_zbb_zbc_zbs_xandesperf",
>>                               "andes-23-series")
>> +RISCV_CORE("andes-n45",       "rv32imc_zicsr_zifencei_xandesperf",    
>> "andes-45-series")
>> +RISCV_CORE("andes-nx45",      "rv64imc_zicsr_zifencei_xandesperf",    
>> "andes-45-series")
>> +RISCV_CORE("andes-a45",       "rv32imafdc_zicsr_zifencei_xandesperf", 
>> "andes-45-series")
>> +RISCV_CORE("andes-ax45",      "rv64imafdc_zicsr_zifencei_xandesperf", 
>> "andes-45-series")
>> +
>>  RISCV_CORE("spacemit-x60",    "rv64imafdcv_zba_zbb_zbc_zbs_zicboz_zicond_"
>>                               "zbkc_zfh_zvfh_zvkt_zvl256b_sscofpmf",
>>                               "spacemit-x60")
>> diff --git a/gcc/config/riscv/riscv-opts.h b/gcc/config/riscv/riscv-opts.h
>> index c112b1da47c..302e2a860c2 100644
>> --- a/gcc/config/riscv/riscv-opts.h
>> +++ b/gcc/config/riscv/riscv-opts.h
>> @@ -63,6 +63,7 @@ enum riscv_microarchitecture_type {
>>    tt_ascalon_d8,
>>    andes_23_series,
>>    andes_25_series,
>> +  andes_45_series,
>>    spacemit_x60,
>>  };
>>  extern enum riscv_microarchitecture_type riscv_microarchitecture;
>> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
>> index c3c4021c6a8..63ac9d84183 100644
>> --- a/gcc/config/riscv/riscv.cc
>> +++ b/gcc/config/riscv/riscv.cc
>> @@ -809,6 +809,31 @@ static const struct riscv_tune_param andes_23_tune_info 
>> = {
>>    true,                                                /* prefer-agnostic.  
>> */
>>  };
>>
>> +/* Costs to use when optimizing for Andes 45 series.  */
>> +static const struct riscv_tune_param andes_45_tune_info = {
>> +  {COSTS_N_INSNS (4), COSTS_N_INSNS (5)},       /* fp_add */
>> +  {COSTS_N_INSNS (4), COSTS_N_INSNS (5)},       /* fp_mul */
>> +  {COSTS_N_INSNS (20), COSTS_N_INSNS (20)},     /* fp_div */
>> +  {COSTS_N_INSNS (2), COSTS_N_INSNS (2)},       /* int_mul */
>> +  {COSTS_N_INSNS (24), COSTS_N_INSNS (24)},     /* int_div */
>> +  2,                                           /* issue_rate */
>> +  3,                                           /* branch_cost */
>> +  3,                                           /* memory_cost */
>> +  8,                                           /* fmv_cost */
>> +  false,                                       /* slow_unaligned_access */
>> +  false,                                       /* vector_unaligned_access */
>> +  true,                                                /* 
>> use_divmod_expansion */
>> +  false,                                       /* overlap_op_by_pieces */
>> +  false,                                       /* use_zero_stride_load */
>> +  false,                                       /* speculative_sched_vsetvl 
>> */
>> +  RISCV_FUSE_NOTHING,                          /* fusible_ops */
>> +  NULL,                                                /* vector cost */
>> +  NULL,                                                /* function_align */
>> +  NULL,                                                /* jump_align */
>> +  NULL,                                                /* loop_align */
>> +  true,                                                /* prefer-agnostic.  
>> */
>> +};
>> +
>>  static bool riscv_avoid_shrink_wrapping_separate ();
>>  static tree riscv_handle_fndecl_attribute (tree *, tree, tree, int, bool *);
>>  static tree riscv_handle_type_attribute (tree *, tree, tree, int, bool *);
>> diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
>> index aa4631e15a4..6f8cd26e5c9 100644
>> --- a/gcc/config/riscv/riscv.md
>> +++ b/gcc/config/riscv/riscv.md
>> @@ -674,7 +674,7 @@
>>  ;; Keep this in sync with enum riscv_microarchitecture.
>>  (define_attr "tune"
>>    
>> "generic,sifive_7,sifive_p400,sifive_p600,xiangshan,generic_ooo,mips_p8700,
>> -   tt_ascalon_d8,andes_25_series,andes_23_series,spacemit_x60"
>> +   
>> tt_ascalon_d8,andes_25_series,andes_23_series,andes_45_series,spacemit_x60"
>>    (const (symbol_ref "((enum attr_tune) riscv_microarchitecture)")))
>>
>>  ;; Describe a user's asm statement.
>> @@ -4991,4 +4991,5 @@
>>  (include "tt-ascalon-d8.md")
>>  (include "andes-23-series.md")
>>  (include "andes-25-series.md")
>> +(include "andes-45-series.md")
>>  (include "spacemit-x60.md")
>> diff --git a/gcc/doc/riscv-mcpu.texi b/gcc/doc/riscv-mcpu.texi
>> index 8875ff5bcb9..eaf96933b10 100644
>> --- a/gcc/doc/riscv-mcpu.texi
>> +++ b/gcc/doc/riscv-mcpu.texi
>> @@ -86,4 +86,12 @@ by particular CPU name. Permissible values for this 
>> option are:
>>
>>  @samp{andes-d23},
>>
>> +@samp{andes-n45},
>> +
>> +@samp{andes-nx45},
>> +
>> +@samp{andes-a45},
>> +
>> +@samp{andes-ax45},
>> +
>>  @samp{spacemit-x60}.
>> diff --git a/gcc/doc/riscv-mtune.texi b/gcc/doc/riscv-mtune.texi
>> index 578a641b2ba..3e61d11462a 100644
>> --- a/gcc/doc/riscv-mtune.texi
>> +++ b/gcc/doc/riscv-mtune.texi
>> @@ -62,4 +62,6 @@ particular CPU name.  Permissible values for this option 
>> are:
>>
>>  @samp{andes-23-series},
>>
>> +@samp{andes-45-series},
>> +
>>  and all valid options for @option{-mcpu=}.
>> --
>> 2.34.1
>>

Reply via email to