1 ;; Copyright (C) 2024-2025 Free Software Foundation, Inc.
3 ;; This file is part of GCC.
5 ;; GCC is free software; you can redistribute it and/or modify it
6 ;; under the terms of the GNU General Public License as published
7 ;; by the Free Software Foundation; either version 3, or (at your
8 ;; option) any later version.
10 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
11 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
13 ;; License for more details.
15 ;; You should have received a copy of the GNU General Public License
16 ;; along with GCC; see the file COPYING3. If not see
17 ;; <http://www.gnu.org/licenses/>.
20 (define_automaton "vector_ooo")
22 ;; Separate issue queue for vector instructions.
23 (define_cpu_unit "vxu_ooo_issue" "vector_ooo")
25 ;; Vector execution unit.
26 (define_cpu_unit "vxu_ooo_alu" "vector_ooo")
28 ;; Vector subunit that does mult/div/sqrt.
29 (define_cpu_unit "vxu_ooo_multicycle" "vector_ooo")
31 (define_insn_reservation "vec_load" 6
32 (eq_attr "type" "vlde,vldm,vlds,vldux,vldox,vldff,vldr")
33 "vxu_ooo_issue,vxu_ooo_alu")
35 (define_insn_reservation "vec_store" 6
36 (eq_attr "type" "vste,vstm,vsts,vstux,vstox,vstr")
37 "vxu_ooo_issue,vxu_ooo_alu")
39 ;; Vector segment loads/stores.
40 (define_insn_reservation "vec_loadstore_seg" 10
41 (eq_attr "type" "vlsegde,vlsegds,vlsegdux,vlsegdox,vlsegdff,\
42 vssegte,vssegts,vssegtux,vssegtox")
43 "vxu_ooo_issue,vxu_ooo_alu")
45 ;; Regular vector operations and integer comparisons.
46 (define_insn_reservation "vec_alu" 3
47 (eq_attr "type" "vialu,viwalu,vext,vicalu,vshift,vnshift,viminmax,vicmp,\
48 vimov,vsalu,vaalu,vsshift,vnclip,vmov,vfmov,vector,\
49 vandn,vbrev,vbrev8,vrev8,vclz,vctz,vrol,vror,vwsll")
50 "vxu_ooo_issue,vxu_ooo_alu")
52 ;; Vector float comparison, conversion etc.
53 (define_insn_reservation "vec_fcmp" 3
54 (eq_attr "type" "vfrecp,vfminmax,vfcmp,vfsgnj,vfclass,vfcvtitof,\
55 vfcvtftoi,vfwcvtitof,vfwcvtftoi,vfwcvtftof,vfncvtitof,\
56 vfncvtftoi,vfncvtftof,vfncvtbf16,vfwcvtbf16")
57 "vxu_ooo_issue,vxu_ooo_alu")
59 ;; Vector integer multiplication.
60 (define_insn_reservation "vec_imul" 4
61 (eq_attr "type" "vimul,viwmul,vimuladd,viwmuladd,vsmul,vclmul,vclmulh,\
63 "vxu_ooo_issue,vxu_ooo_alu")
65 ;; Vector float addition.
66 (define_insn_reservation "vec_fadd" 4
67 (eq_attr "type" "vfalu,vfwalu")
68 "vxu_ooo_issue,vxu_ooo_alu")
70 ;; Vector float multiplication and FMA.
71 (define_insn_reservation "vec_fmul" 6
72 (eq_attr "type" "vfmul,vfwmul,vfmuladd,vfwmuladd,vfwmaccbf16,sf_vqmacc,sf_vfnrclip")
73 "vxu_ooo_issue,vxu_ooo_alu")
75 ;; Vector crypto, assumed to be a generic operation for now.
76 (define_insn_reservation "vec_crypto" 4
77 (eq_attr "type" "crypto,vclz,vctz,vcpop")
78 "vxu_ooo_issue,vxu_ooo_alu")
81 (define_insn_reservation "vec_crypto_aes" 4
82 (eq_attr "type" "vaesef,vaesem,vaesdf,vaesdm,vaeskf1,vaeskf2,vaesz")
83 "vxu_ooo_issue,vxu_ooo_alu")
86 (define_insn_reservation "vec_crypto_sha" 4
87 (eq_attr "type" "vsha2ms,vsha2ch,vsha2cl")
88 "vxu_ooo_issue,vxu_ooo_alu")
90 ;; Vector crypto, SM3/4
91 (define_insn_reservation "vec_crypto_sm" 4
92 (eq_attr "type" "vsm4k,vsm4r,vsm3me,vsm3c")
93 "vxu_ooo_issue,vxu_ooo_alu")
96 (define_insn_reservation "vec_perm" 3
97 (eq_attr "type" "vimerge,vfmerge,vslideup,vslidedown,vislide1up,\
98 vislide1down,vfslide1up,vfslide1down,vgather,vcompress")
99 "vxu_ooo_issue,vxu_ooo_alu")
102 (define_insn_reservation "vec_reduction" 8
103 (eq_attr "type" "vired,viwred,vfredu,vfwredu")
104 "vxu_ooo_issue,vxu_ooo_multicycle")
106 ;; Vector ordered reduction, assume the latency number is for
107 ;; a 128-bit vector. It is scaled in riscv_sched_adjust_cost
108 ;; for larger vectors.
109 (define_insn_reservation "vec_ordered_reduction" 10
110 (eq_attr "type" "vfredo,vfwredo")
111 "vxu_ooo_issue,vxu_ooo_multicycle*3")
113 ;; Vector integer division, assume not pipelined.
114 (define_insn_reservation "vec_idiv" 16
115 (eq_attr "type" "vidiv")
116 "vxu_ooo_issue,vxu_ooo_multicycle*3")
118 ;; Vector float divisions and sqrt, assume not pipelined.
119 (define_insn_reservation "vec_float_divsqrt" 16
120 (eq_attr "type" "vfdiv,vfsqrt")
121 "vxu_ooo_issue,vxu_ooo_multicycle*3")
123 ;; Vector mask operations.
124 (define_insn_reservation "vec_mask" 2
125 (eq_attr "type" "vmalu,vmpop,vmffs,vmsfs,vmiota,vmidx,vimovvx,vimovxv,\
127 "vxu_ooo_issue,vxu_ooo_alu")
130 (define_insn_reservation "vec_vesetvl" 1
131 (eq_attr "type" "vsetvl,vsetvl_pre")
134 ;; Vector rounding mode setters, assume pipeline barrier.
135 (define_insn_reservation "vec_setrm" 20
136 (eq_attr "type" "wrvxrm,wrfrm")
137 "vxu_ooo_issue,vxu_ooo_issue*3")
139 ;; Vector read vlen/vlenb.
140 (define_insn_reservation "vec_readlen" 4
141 (eq_attr "type" "rdvlenb,rdvl")
142 "vxu_ooo_issue,vxu_ooo_issue")