testsuite: Prevent unrolling of main in LTO test [PR116683]
[official-gcc.git] / gcc / config / riscv / generic-ooo.md
blobe70df63d91f8e7174ecf07b5f13093220e9ec92e
1 ;; RISC-V generic out-of-order core scheduling model.
2 ;; Copyright (C) 2023-2024 Free Software Foundation, Inc.
3 ;;
4 ;; This file is part of GCC.
5 ;;
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)
9 ;; any later version.
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.
36 ;; Latency:
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)
43 ;; - Load/Store:
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")
58 ;; Shortcuts
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")
64 ;; Integer load/store
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")
75 ;; Float load/store
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")
141 ;; Float FMA.
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")