1 ;; RISC-V generic out-of-order core scheduling model.
2 ;; Copyright (C) 2023-2024 Free Software Foundation, Inc.
4 ;; This file is part of GCC.
6 ;; GCC is free software; you can redistribute it and/or modify it
7 ;; under the terms of the GNU General Public License as published by
8 ;; the Free Software Foundation; either version 3, or (at your option)
11 ;; GCC is distributed in the hope that it will be useful, but
12 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 ;; General Public License for more details.
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with GCC; see the file COPYING3. If not see
18 ;; <http://www.gnu.org/licenses/>.
20 (define_automaton "generic_ooo")
22 ;; Regarding functional units we assume a three-way split:
23 ;; - Integer ALU (IXU) - 4 symmetric units.
24 ;; - Floating-point (FXU) - 2 symmetric units.
25 ;; - Vector Unit (VXU) - 1 unit.
27 ;; We assume 6-wide issue:
28 ;; - 5-wide generic/integer issue.
29 ;; - 1-wide vector issue.
31 ;; For now, the only subunits are for non-pipelined integer division and
32 ;; vector div/mult/sqrt.
33 ;; No extra units for e.g. vector permutes, masking, everything is assumed to
34 ;; be on the same pipelined execution unit.
37 ;; - Regular integer operations take 1 cycle.
38 ;; - Multiplication/Division take multiple cycles.
39 ;; - Float operations take 4-6 cycles.
40 ;; - Regular vector operations take 2-6 cycles.
41 ;; (This assumes LMUL = 1, latency for LMUL = 2, 4, 8 is scaled accordingly
42 ;; by riscv_sched_adjust_cost when -madjust-lmul-cost is given)
44 ;; - To/From IXU: 4 cycles.
45 ;; - To/From FXU: 6 cycles.
46 ;; - To/From VXU: 6 cycles.
48 ;; Integer/float issue queues.
49 (define_cpu_unit "issue0,issue1,issue2,issue3,issue4" "generic_ooo")
51 ;; Integer/float execution units.
52 (define_cpu_unit "ixu0,ixu1,ixu2,ixu3" "generic_ooo")
53 (define_cpu_unit "fxu0,fxu1" "generic_ooo")
55 ;; Integer subunit for division.
56 (define_cpu_unit "generic_ooo_div" "generic_ooo")
59 (define_reservation "generic_ooo_issue" "issue0|issue1|issue2|issue3|issue4")
60 (define_reservation "generic_ooo_ixu_alu" "ixu0|ixu1|ixu2|ixu3")
61 (define_reservation "generic_ooo_fxu" "fxu0|fxu1")
65 (define_insn_reservation "generic_ooo_int_load" 4
66 (and (eq_attr "tune" "generic_ooo")
67 (eq_attr "type" "load"))
68 "generic_ooo_issue,generic_ooo_ixu_alu")
70 (define_insn_reservation "generic_ooo_int_store" 4
71 (and (eq_attr "tune" "generic_ooo")
72 (eq_attr "type" "store"))
73 "generic_ooo_issue,generic_ooo_ixu_alu")
76 (define_insn_reservation "generic_ooo_float_load" 6
77 (and (eq_attr "tune" "generic_ooo")
78 (eq_attr "type" "fpload"))
79 "generic_ooo_issue,generic_ooo_ixu_alu")
81 (define_insn_reservation "generic_ooo_float_store" 6
82 (and (eq_attr "tune" "generic_ooo")
83 (eq_attr "type" "fpstore"))
84 "generic_ooo_issue,generic_ooo_fxu")
86 ;; Generic integer instructions.
87 (define_insn_reservation "generic_ooo_alu" 1
88 (and (eq_attr "tune" "generic_ooo")
89 (eq_attr "type" "unknown,const,arith,shift,slt,multi,auipc,nop,logical,\
90 move,bitmanip,rotate,min,max,minu,maxu,clz,ctz,atomic,\
91 condmove,mvpair,zicond"))
92 "generic_ooo_issue,generic_ooo_ixu_alu")
94 (define_insn_reservation "generic_ooo_sfb_alu" 2
95 (and (eq_attr "tune" "generic_ooo")
96 (eq_attr "type" "sfb_alu"))
97 "generic_ooo_issue,generic_ooo_ixu_alu")
99 ;; Branch instructions
100 (define_insn_reservation "generic_ooo_branch" 1
101 (and (eq_attr "tune" "generic_ooo")
102 (eq_attr "type" "branch,jump,call,jalr,ret,trap"))
103 "generic_ooo_issue,generic_ooo_ixu_alu")
105 ;; Float move, convert and compare.
106 (define_insn_reservation "generic_ooo_float_move" 3
107 (and (eq_attr "tune" "generic_ooo")
108 (eq_attr "type" "fmove"))
109 "generic_ooo_issue,generic_ooo_fxu")
111 (define_insn_reservation "generic_ooo_fcvt" 3
112 (and (eq_attr "tune" "generic_ooo")
113 (eq_attr "type" "fcvt,fcvt_i2f,fcvt_f2i"))
114 "generic_ooo_issue,generic_ooo_fxu")
116 (define_insn_reservation "generic_ooo_fcmp" 2
117 (and (eq_attr "tune" "generic_ooo")
118 (eq_attr "type" "fcmp"))
119 "generic_ooo_issue,generic_ooo_fxu")
121 ;; Integer multiplication.
122 (define_insn_reservation "generic_ooo_imul" 4
123 (and (eq_attr "tune" "generic_ooo")
124 (eq_attr "type" "imul"))
125 "generic_ooo_issue,generic_ooo_ixu_alu,generic_ooo_ixu_alu")
127 ;; Assume integer division is not pipelined. Do not block the unit for more
128 ;; than three cycles so the DFA does not get too large. Similar for other
129 ;; non-pipelined instructions.
130 (define_insn_reservation "generic_ooo_idiv" 16
131 (and (eq_attr "tune" "generic_ooo")
132 (eq_attr "type" "idiv"))
133 "generic_ooo_issue,generic_ooo_ixu_alu,generic_ooo_div,generic_ooo_div*3")
135 ;; Float addition and multiplication.
136 (define_insn_reservation "generic_ooo_faddmul" 4
137 (and (eq_attr "tune" "generic_ooo")
138 (eq_attr "type" "fadd,fmul"))
139 "generic_ooo_issue,generic_ooo_fxu")
142 (define_insn_reservation "generic_ooo_float_fma" 6
143 (and (eq_attr "tune" "generic_ooo")
144 (eq_attr "type" "fmadd"))
145 "generic_ooo_issue,generic_ooo_fxu")
147 ;; Assume float division and sqrt are not pipelined.
148 (define_insn_reservation "generic_ooo_float_div_single" 12
149 (and (eq_attr "tune" "generic_ooo")
150 (and (eq_attr "type" "fdiv,fsqrt")
151 (eq_attr "mode" "SF")))
152 "generic_ooo_issue,generic_ooo_fxu,generic_ooo_div,generic_ooo_div*3")
154 (define_insn_reservation "generic_ooo_float_div_double" 16
155 (and (eq_attr "tune" "generic_ooo")
156 (and (eq_attr "type" "fdiv,fsqrt")
157 (eq_attr "mode" "DF")))
158 "generic_ooo_issue,generic_ooo_fxu,generic_ooo_div,generic_ooo_div*3")
160 ;; Popcount and clmul.
161 (define_insn_reservation "generic_ooo_popcount" 2
162 (and (eq_attr "tune" "generic_ooo")
163 (eq_attr "type" "cpop,clmul"))
164 "generic_ooo_issue,generic_ooo_ixu_alu")
166 ;; Transfer from/to coprocessor. Assume not pipelined.
167 (define_insn_reservation "generic_ooo_xfer" 4
168 (and (eq_attr "tune" "generic_ooo")
169 (eq_attr "type" "mfc,mtc"))
170 "generic_ooo_issue,generic_ooo_ixu_alu,generic_ooo_ixu_alu*3")