nds32-e8.md revision 1.1 1 1.1 mrg ;; Pipeline descriptions of Andes NDS32 cpu for GNU compiler
2 1.1 mrg ;; Copyright (C) 2012-2018 Free Software Foundation, Inc.
3 1.1 mrg ;; Contributed by Andes Technology Corporation.
4 1.1 mrg ;;
5 1.1 mrg ;; This file is part of GCC.
6 1.1 mrg ;;
7 1.1 mrg ;; GCC is free software; you can redistribute it and/or modify it
8 1.1 mrg ;; under the terms of the GNU General Public License as published
9 1.1 mrg ;; by the Free Software Foundation; either version 3, or (at your
10 1.1 mrg ;; option) any later version.
11 1.1 mrg ;;
12 1.1 mrg ;; GCC is distributed in the hope that it will be useful, but WITHOUT
13 1.1 mrg ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 1.1 mrg ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 1.1 mrg ;; License for more details.
16 1.1 mrg ;;
17 1.1 mrg ;; You should have received a copy of the GNU General Public License
18 1.1 mrg ;; along with GCC; see the file COPYING3. If not see
19 1.1 mrg ;; <http://www.gnu.org/licenses/>.
20 1.1 mrg
21 1.1 mrg
22 1.1 mrg ;; ------------------------------------------------------------------------
23 1.1 mrg ;; Define E8 pipeline settings.
24 1.1 mrg ;; ------------------------------------------------------------------------
25 1.1 mrg
26 1.1 mrg (define_automaton "nds32_e8_machine")
27 1.1 mrg
28 1.1 mrg ;; ------------------------------------------------------------------------
29 1.1 mrg ;; Pipeline Stages
30 1.1 mrg ;; ------------------------------------------------------------------------
31 1.1 mrg ;; IF - Instruction Fetch
32 1.1 mrg ;; II - Instruction Issue / Address Generation
33 1.1 mrg ;; EX - Instruction Execution
34 1.1 mrg ;; EXD - Psuedo Stage / Load Data Completion
35 1.1 mrg
36 1.1 mrg (define_cpu_unit "e8_ii" "nds32_e8_machine")
37 1.1 mrg (define_cpu_unit "e8_ex" "nds32_e8_machine")
38 1.1 mrg
39 1.1 mrg (define_insn_reservation "nds_e8_unknown" 1
40 1.1 mrg (and (eq_attr "type" "unknown")
41 1.1 mrg (eq_attr "pipeline_model" "e8"))
42 1.1 mrg "e8_ii, e8_ex")
43 1.1 mrg
44 1.1 mrg (define_insn_reservation "nds_e8_misc" 1
45 1.1 mrg (and (eq_attr "type" "misc")
46 1.1 mrg (eq_attr "pipeline_model" "e8"))
47 1.1 mrg "e8_ii, e8_ex")
48 1.1 mrg
49 1.1 mrg (define_insn_reservation "nds_e8_alu" 1
50 1.1 mrg (and (eq_attr "type" "alu")
51 1.1 mrg (eq_attr "pipeline_model" "e8"))
52 1.1 mrg "e8_ii, e8_ex")
53 1.1 mrg
54 1.1 mrg (define_insn_reservation "nds_e8_load" 1
55 1.1 mrg (and (match_test "nds32::load_single_p (insn)")
56 1.1 mrg (eq_attr "pipeline_model" "e8"))
57 1.1 mrg "e8_ii, e8_ex")
58 1.1 mrg
59 1.1 mrg (define_insn_reservation "nds_e8_store" 1
60 1.1 mrg (and (match_test "nds32::store_single_p (insn)")
61 1.1 mrg (eq_attr "pipeline_model" "e8"))
62 1.1 mrg "e8_ii, e8_ex")
63 1.1 mrg
64 1.1 mrg (define_insn_reservation "nds_e8_load_multiple_1" 1
65 1.1 mrg (and (and (eq_attr "type" "load_multiple")
66 1.1 mrg (eq_attr "combo" "1"))
67 1.1 mrg (eq_attr "pipeline_model" "e8"))
68 1.1 mrg "e8_ii, e8_ex")
69 1.1 mrg
70 1.1 mrg (define_insn_reservation "nds_e8_load_multiple_2" 1
71 1.1 mrg (and (ior (and (eq_attr "type" "load_multiple")
72 1.1 mrg (eq_attr "combo" "2"))
73 1.1 mrg (match_test "nds32::load_double_p (insn)"))
74 1.1 mrg (eq_attr "pipeline_model" "e8"))
75 1.1 mrg "e8_ii, e8_ii+e8_ex, e8_ex")
76 1.1 mrg
77 1.1 mrg (define_insn_reservation "nds_e8_load_multiple_3" 1
78 1.1 mrg (and (and (eq_attr "type" "load_multiple")
79 1.1 mrg (eq_attr "combo" "3"))
80 1.1 mrg (eq_attr "pipeline_model" "e8"))
81 1.1 mrg "e8_ii, (e8_ii+e8_ex)*2, e8_ex")
82 1.1 mrg
83 1.1 mrg (define_insn_reservation "nds_e8_load_multiple_4" 1
84 1.1 mrg (and (and (eq_attr "type" "load_multiple")
85 1.1 mrg (eq_attr "combo" "4"))
86 1.1 mrg (eq_attr "pipeline_model" "e8"))
87 1.1 mrg "e8_ii, (e8_ii+e8_ex)*3, e8_ex")
88 1.1 mrg
89 1.1 mrg (define_insn_reservation "nds_e8_load_multiple_5" 1
90 1.1 mrg (and (and (eq_attr "type" "load_multiple")
91 1.1 mrg (eq_attr "combo" "5"))
92 1.1 mrg (eq_attr "pipeline_model" "e8"))
93 1.1 mrg "e8_ii, (e8_ii+e8_ex)*4, e8_ex")
94 1.1 mrg
95 1.1 mrg (define_insn_reservation "nds_e8_load_multiple_6" 1
96 1.1 mrg (and (and (eq_attr "type" "load_multiple")
97 1.1 mrg (eq_attr "combo" "6"))
98 1.1 mrg (eq_attr "pipeline_model" "e8"))
99 1.1 mrg "e8_ii, (e8_ii+e8_ex)*5, e8_ex")
100 1.1 mrg
101 1.1 mrg (define_insn_reservation "nds_e8_load_multiple_7" 1
102 1.1 mrg (and (and (eq_attr "type" "load_multiple")
103 1.1 mrg (eq_attr "combo" "7"))
104 1.1 mrg (eq_attr "pipeline_model" "e8"))
105 1.1 mrg "e8_ii, (e8_ii+e8_ex)*6, e8_ex")
106 1.1 mrg
107 1.1 mrg (define_insn_reservation "nds_e8_load_multiple_8" 1
108 1.1 mrg (and (and (eq_attr "type" "load_multiple")
109 1.1 mrg (eq_attr "combo" "8"))
110 1.1 mrg (eq_attr "pipeline_model" "e8"))
111 1.1 mrg "e8_ii, (e8_ii+e8_ex)*7, e8_ex")
112 1.1 mrg
113 1.1 mrg (define_insn_reservation "nds_e8_load_multiple_12" 1
114 1.1 mrg (and (and (eq_attr "type" "load_multiple")
115 1.1 mrg (eq_attr "combo" "12"))
116 1.1 mrg (eq_attr "pipeline_model" "e8"))
117 1.1 mrg "e8_ii, (e8_ii+e8_ex)*11, e8_ex")
118 1.1 mrg
119 1.1 mrg (define_insn_reservation "nds_e8_store_multiple_1" 1
120 1.1 mrg (and (and (eq_attr "type" "store_multiple")
121 1.1 mrg (eq_attr "combo" "1"))
122 1.1 mrg (eq_attr "pipeline_model" "e8"))
123 1.1 mrg "e8_ii, e8_ex")
124 1.1 mrg
125 1.1 mrg (define_insn_reservation "nds_e8_store_multiple_2" 1
126 1.1 mrg (and (ior (and (eq_attr "type" "store_multiple")
127 1.1 mrg (eq_attr "combo" "2"))
128 1.1 mrg (match_test "nds32::store_double_p (insn)"))
129 1.1 mrg (eq_attr "pipeline_model" "e8"))
130 1.1 mrg "e8_ii, e8_ii+e8_ex, e8_ex")
131 1.1 mrg
132 1.1 mrg (define_insn_reservation "nds_e8_store_multiple_3" 1
133 1.1 mrg (and (and (eq_attr "type" "store_multiple")
134 1.1 mrg (eq_attr "combo" "3"))
135 1.1 mrg (eq_attr "pipeline_model" "e8"))
136 1.1 mrg "e8_ii, (e8_ii+e8_ex)*2, e8_ex")
137 1.1 mrg
138 1.1 mrg (define_insn_reservation "nds_e8_store_multiple_4" 1
139 1.1 mrg (and (and (eq_attr "type" "store_multiple")
140 1.1 mrg (eq_attr "combo" "4"))
141 1.1 mrg (eq_attr "pipeline_model" "e8"))
142 1.1 mrg "e8_ii, (e8_ii+e8_ex)*3, e8_ex")
143 1.1 mrg
144 1.1 mrg (define_insn_reservation "nds_e8_store_multiple_5" 1
145 1.1 mrg (and (and (eq_attr "type" "store_multiple")
146 1.1 mrg (eq_attr "combo" "5"))
147 1.1 mrg (eq_attr "pipeline_model" "e8"))
148 1.1 mrg "e8_ii, (e8_ii+e8_ex)*4, e8_ex")
149 1.1 mrg
150 1.1 mrg (define_insn_reservation "nds_e8_store_multiple_6" 1
151 1.1 mrg (and (and (eq_attr "type" "store_multiple")
152 1.1 mrg (eq_attr "combo" "6"))
153 1.1 mrg (eq_attr "pipeline_model" "e8"))
154 1.1 mrg "e8_ii, (e8_ii+e8_ex)*5, e8_ex")
155 1.1 mrg
156 1.1 mrg (define_insn_reservation "nds_e8_store_multiple_7" 1
157 1.1 mrg (and (and (eq_attr "type" "store_multiple")
158 1.1 mrg (eq_attr "combo" "7"))
159 1.1 mrg (eq_attr "pipeline_model" "e8"))
160 1.1 mrg "e8_ii, (e8_ii+e8_ex)*6, e8_ex")
161 1.1 mrg
162 1.1 mrg (define_insn_reservation "nds_e8_store_multiple_8" 1
163 1.1 mrg (and (and (eq_attr "type" "store_multiple")
164 1.1 mrg (eq_attr "combo" "8"))
165 1.1 mrg (eq_attr "pipeline_model" "e8"))
166 1.1 mrg "e8_ii, (e8_ii+e8_ex)*7, e8_ex")
167 1.1 mrg
168 1.1 mrg (define_insn_reservation "nds_e8_store_multiple_12" 1
169 1.1 mrg (and (and (eq_attr "type" "store_multiple")
170 1.1 mrg (eq_attr "combo" "12"))
171 1.1 mrg (eq_attr "pipeline_model" "e8"))
172 1.1 mrg "e8_ii, (e8_ii+e8_ex)*11, e8_ex")
173 1.1 mrg
174 1.1 mrg (define_insn_reservation "nds_e8_mul_fast" 1
175 1.1 mrg (and (match_test "nds32_mul_config != MUL_TYPE_SLOW")
176 1.1 mrg (and (eq_attr "type" "mul")
177 1.1 mrg (eq_attr "pipeline_model" "e8")))
178 1.1 mrg "e8_ii, e8_ex")
179 1.1 mrg
180 1.1 mrg (define_insn_reservation "nds_e8_mul_slow" 1
181 1.1 mrg (and (match_test "nds32_mul_config == MUL_TYPE_SLOW")
182 1.1 mrg (and (eq_attr "type" "mul")
183 1.1 mrg (eq_attr "pipeline_model" "e8")))
184 1.1 mrg "e8_ii, e8_ex*16")
185 1.1 mrg
186 1.1 mrg (define_insn_reservation "nds_e8_mac_fast" 1
187 1.1 mrg (and (match_test "nds32_mul_config != MUL_TYPE_SLOW")
188 1.1 mrg (and (eq_attr "type" "mac")
189 1.1 mrg (eq_attr "pipeline_model" "e8")))
190 1.1 mrg "e8_ii, e8_ii+e8_ex, e8_ex")
191 1.1 mrg
192 1.1 mrg (define_insn_reservation "nds_e8_mac_slow" 1
193 1.1 mrg (and (match_test "nds32_mul_config == MUL_TYPE_SLOW")
194 1.1 mrg (and (eq_attr "type" "mac")
195 1.1 mrg (eq_attr "pipeline_model" "e8")))
196 1.1 mrg "e8_ii, (e8_ii+e8_ex)*16, e8_ex")
197 1.1 mrg
198 1.1 mrg (define_insn_reservation "nds_e8_div" 1
199 1.1 mrg (and (eq_attr "type" "div")
200 1.1 mrg (eq_attr "pipeline_model" "e8"))
201 1.1 mrg "e8_ii, (e8_ii+e8_ex)*36, e8_ex")
202 1.1 mrg
203 1.1 mrg (define_insn_reservation "nds_e8_branch" 1
204 1.1 mrg (and (eq_attr "type" "branch")
205 1.1 mrg (eq_attr "pipeline_model" "e8"))
206 1.1 mrg "e8_ii, e8_ex")
207 1.1 mrg
208 1.1 mrg ;; ------------------------------------------------------------------------
209 1.1 mrg ;; Comment Notations and Bypass Rules
210 1.1 mrg ;; ------------------------------------------------------------------------
211 1.1 mrg ;; Producers (LHS)
212 1.1 mrg ;; LD
213 1.1 mrg ;; Load data from the memory and produce the loaded data. The result is
214 1.1 mrg ;; ready at EXD.
215 1.1 mrg ;; LMW(N, M)
216 1.1 mrg ;; There are N micro-operations within an instruction that loads multiple
217 1.1 mrg ;; words. The result produced by the M-th micro-operation is sent to
218 1.1 mrg ;; consumers. The result is ready at EXD.
219 1.1 mrg ;; ADDR_OUT
220 1.1 mrg ;; Most load/store instructions can produce an address output if updating
221 1.1 mrg ;; the base register is required. The result is ready at EX, which is
222 1.1 mrg ;; produced by ALU.
223 1.1 mrg ;; ALU, MOVD44, MUL, MAC
224 1.1 mrg ;; The result is ready at EX.
225 1.1 mrg ;; DIV_Rs
226 1.1 mrg ;; A division instruction saves the quotient result to Rt and saves the
227 1.1 mrg ;; remainder result to Rs. The instruction is separated into two micro-
228 1.1 mrg ;; operations. The first micro-operation writes to Rt, and the seconde
229 1.1 mrg ;; one writes to Rs. Each of the results is ready at EX.
230 1.1 mrg ;;
231 1.1 mrg ;; Consumers (RHS)
232 1.1 mrg ;; ALU, MUL, DIV
233 1.1 mrg ;; Require operands at EX.
234 1.1 mrg ;; ADDR_IN_MOP(N)
235 1.1 mrg ;; N denotes the address input is required by the N-th micro-operation.
236 1.1 mrg ;; Such operand is required at II.
237 1.1 mrg ;; ST
238 1.1 mrg ;; A store instruction requires its data at EX.
239 1.1 mrg ;; SMW(N, M)
240 1.1 mrg ;; There are N micro-operations within an instruction that stores multiple
241 1.1 mrg ;; words. Each M-th micro-operation requires its data at EX.
242 1.1 mrg ;; BR_COND
243 1.1 mrg ;; If a branch instruction is conditional, its input data is required at EX.
244 1.1 mrg
245 1.1 mrg ;; LD -> ADDR_IN_MOP(1)
246 1.1 mrg (define_bypass 2
247 1.1 mrg "nds_e8_load"
248 1.1 mrg "nds_e8_branch,\
249 1.1 mrg nds_e8_load, nds_e8_store,\
250 1.1 mrg nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\
251 1.1 mrg nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\
252 1.1 mrg nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12,\
253 1.1 mrg nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\
254 1.1 mrg nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\
255 1.1 mrg nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12"
256 1.1 mrg "nds32_e8_load_to_ii_p"
257 1.1 mrg )
258 1.1 mrg
259 1.1 mrg ;; LD -> ALU, MUL, MAC, DIV, BR_COND, ST, SMW(N, 1)
260 1.1 mrg (define_bypass 2
261 1.1 mrg "nds_e8_load"
262 1.1 mrg "nds_e8_alu,
263 1.1 mrg nds_e8_mul_fast, nds_e8_mul_slow,\
264 1.1 mrg nds_e8_mac_fast, nds_e8_mac_slow,\
265 1.1 mrg nds_e8_div,\
266 1.1 mrg nds_e8_branch,\
267 1.1 mrg nds_e8_store,\
268 1.1 mrg nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\
269 1.1 mrg nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\
270 1.1 mrg nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12"
271 1.1 mrg "nds32_e8_load_to_ex_p"
272 1.1 mrg )
273 1.1 mrg
274 1.1 mrg ;; ALU, MOVD44, MUL, MAC, DIV_Rs, LD_bi, ADDR_OUT -> ADDR_IN_MOP(1)
275 1.1 mrg (define_bypass 2
276 1.1 mrg "nds_e8_alu,
277 1.1 mrg nds_e8_mul_fast, nds_e8_mul_slow,\
278 1.1 mrg nds_e8_mac_fast, nds_e8_mac_slow,\
279 1.1 mrg nds_e8_div,\
280 1.1 mrg nds_e8_load, nds_e8_store,\
281 1.1 mrg nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\
282 1.1 mrg nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\
283 1.1 mrg nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12,\
284 1.1 mrg nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\
285 1.1 mrg nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\
286 1.1 mrg nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12"
287 1.1 mrg "nds_e8_branch,\
288 1.1 mrg nds_e8_load, nds_e8_store,\
289 1.1 mrg nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\
290 1.1 mrg nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\
291 1.1 mrg nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12,\
292 1.1 mrg nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\
293 1.1 mrg nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\
294 1.1 mrg nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12"
295 1.1 mrg "nds32_e8_ex_to_ii_p"
296 1.1 mrg )
297 1.1 mrg
298 1.1 mrg ;; LMW(N, N) -> ADDR_IN_MOP(1)
299 1.1 mrg (define_bypass 2
300 1.1 mrg "nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\
301 1.1 mrg nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\
302 1.1 mrg nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12"
303 1.1 mrg "nds_e8_branch,\
304 1.1 mrg nds_e8_load, nds_e8_store,\
305 1.1 mrg nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\
306 1.1 mrg nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\
307 1.1 mrg nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12,\
308 1.1 mrg nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\
309 1.1 mrg nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\
310 1.1 mrg nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12"
311 1.1 mrg "nds32_e8_last_load_to_ii_p"
312 1.1 mrg )
313 1.1 mrg
314 1.1 mrg ;; LMW(N, N) -> ALU, MUL, MAC, DIV, BR_COND, ST, SMW(N, 1)
315 1.1 mrg (define_bypass 2
316 1.1 mrg "nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\
317 1.1 mrg nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\
318 1.1 mrg nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12"
319 1.1 mrg "nds_e8_alu,
320 1.1 mrg nds_e8_mul_fast, nds_e8_mul_slow,\
321 1.1 mrg nds_e8_mac_fast, nds_e8_mac_slow,\
322 1.1 mrg nds_e8_div,\
323 1.1 mrg nds_e8_branch,\
324 1.1 mrg nds_e8_store,\
325 1.1 mrg nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\
326 1.1 mrg nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\
327 1.1 mrg nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12"
328 1.1 mrg "nds32_e8_last_load_to_ex_p"
329 1.1 mrg )
330