nds32-pipelines-auxiliary.cc revision 1.1 1 1.1 mrg /* Auxiliary functions for pipeline descriptions pattern of Andes
2 1.1 mrg NDS32 cpu for GNU compiler
3 1.1 mrg Copyright (C) 2012-2022 Free Software Foundation, Inc.
4 1.1 mrg Contributed by Andes Technology Corporation.
5 1.1 mrg
6 1.1 mrg This file is part of GCC.
7 1.1 mrg
8 1.1 mrg GCC is free software; you can redistribute it and/or modify it
9 1.1 mrg under the terms of the GNU General Public License as published
10 1.1 mrg by the Free Software Foundation; either version 3, or (at your
11 1.1 mrg option) any later version.
12 1.1 mrg
13 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT
14 1.1 mrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 1.1 mrg License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU General Public License
19 1.1 mrg along with GCC; see the file COPYING3. If not see
20 1.1 mrg <http://www.gnu.org/licenses/>. */
21 1.1 mrg
22 1.1 mrg /* ------------------------------------------------------------------------ */
23 1.1 mrg
24 1.1 mrg #define IN_TARGET_CODE 1
25 1.1 mrg
26 1.1 mrg #include "config.h"
27 1.1 mrg #include "system.h"
28 1.1 mrg #include "coretypes.h"
29 1.1 mrg #include "backend.h"
30 1.1 mrg #include "rtl.h"
31 1.1 mrg #include "insn-attr.h"
32 1.1 mrg #include "insn-codes.h"
33 1.1 mrg #include "target.h"
34 1.1 mrg
35 1.1 mrg #include "nds32-protos.h"
36 1.1 mrg
37 1.1 mrg /* ------------------------------------------------------------------------ */
38 1.1 mrg
39 1.1 mrg namespace nds32 {
40 1.1 mrg namespace scheduling {
41 1.1 mrg
42 1.1 mrg /* Classify the memory access direction. It's unknown if the offset register
43 1.1 mrg is not a constant value. */
44 1.1 mrg enum memory_access_direction
45 1.1 mrg {
46 1.1 mrg MEM_ACCESS_DIR_POS,
47 1.1 mrg MEM_ACCESS_DIR_NEG,
48 1.1 mrg MEM_ACCESS_DIR_UNKNOWN
49 1.1 mrg };
50 1.1 mrg
51 1.1 mrg /* A safe wrapper to the function reg_overlap_mentioned_p (). */
52 1.1 mrg bool
53 1.1 mrg reg_overlap_p (rtx x, rtx in)
54 1.1 mrg {
55 1.1 mrg if (x == NULL_RTX || in == NULL_RTX)
56 1.1 mrg return false;
57 1.1 mrg
58 1.1 mrg return static_cast <bool> (reg_overlap_mentioned_p (x, in));
59 1.1 mrg }
60 1.1 mrg
61 1.1 mrg
62 1.1 mrg /* Determine the memory access direction of a load/store insn. */
63 1.1 mrg memory_access_direction
64 1.1 mrg determine_access_direction (rtx_insn *insn)
65 1.1 mrg {
66 1.1 mrg int post_update_rtx_index;
67 1.1 mrg rtx plus_rtx;
68 1.1 mrg rtx mem_rtx;
69 1.1 mrg rtx offset_rtx;
70 1.1 mrg
71 1.1 mrg switch (get_attr_type (insn))
72 1.1 mrg {
73 1.1 mrg case TYPE_LOAD_MULTIPLE:
74 1.1 mrg gcc_assert (parallel_elements (insn) >= 2);
75 1.1 mrg
76 1.1 mrg post_update_rtx_index = find_post_update_rtx (insn);
77 1.1 mrg if (post_update_rtx_index != -1)
78 1.1 mrg plus_rtx = SET_SRC (parallel_element (insn, post_update_rtx_index));
79 1.1 mrg else
80 1.1 mrg {
81 1.1 mrg /* (parallel
82 1.1 mrg [(set (reg) (mem (reg))) : index 0
83 1.1 mrg (set (reg) (mem (plus (reg) (...)))) : index 1
84 1.1 mrg ...]) */
85 1.1 mrg mem_rtx = SET_SRC (parallel_element (insn, 1));
86 1.1 mrg if (GET_CODE (mem_rtx) == UNSPEC)
87 1.1 mrg mem_rtx = XVECEXP (mem_rtx, 0, 0);
88 1.1 mrg gcc_assert (MEM_P (mem_rtx));
89 1.1 mrg plus_rtx = XEXP (mem_rtx, 0);
90 1.1 mrg }
91 1.1 mrg break;
92 1.1 mrg
93 1.1 mrg case TYPE_STORE_MULTIPLE:
94 1.1 mrg gcc_assert (parallel_elements (insn) >= 2);
95 1.1 mrg
96 1.1 mrg post_update_rtx_index = find_post_update_rtx (insn);
97 1.1 mrg if (post_update_rtx_index != -1)
98 1.1 mrg plus_rtx = SET_SRC (parallel_element (insn, post_update_rtx_index));
99 1.1 mrg else
100 1.1 mrg {
101 1.1 mrg /* (parallel
102 1.1 mrg [(set (mem (reg)) (reg)) : index 0
103 1.1 mrg (set (mem (plus (reg) (...))) (reg)) : index 1
104 1.1 mrg ...]) */
105 1.1 mrg mem_rtx = SET_DEST (parallel_element (insn, 1));
106 1.1 mrg if (GET_CODE (mem_rtx) == UNSPEC)
107 1.1 mrg mem_rtx = XVECEXP (mem_rtx, 0, 0);
108 1.1 mrg gcc_assert (MEM_P (mem_rtx));
109 1.1 mrg plus_rtx = XEXP (mem_rtx, 0);
110 1.1 mrg }
111 1.1 mrg break;
112 1.1 mrg
113 1.1 mrg case TYPE_LOAD:
114 1.1 mrg case TYPE_STORE:
115 1.1 mrg mem_rtx = extract_mem_rtx (insn);
116 1.1 mrg
117 1.1 mrg switch (GET_CODE (XEXP (mem_rtx, 0)))
118 1.1 mrg {
119 1.1 mrg case POST_INC:
120 1.1 mrg /* (mem (post_inc (...))) */
121 1.1 mrg return MEM_ACCESS_DIR_POS;
122 1.1 mrg
123 1.1 mrg case POST_DEC:
124 1.1 mrg /* (mem (post_dec (...))) */
125 1.1 mrg return MEM_ACCESS_DIR_NEG;
126 1.1 mrg
127 1.1 mrg case PLUS:
128 1.1 mrg /* (mem (plus (reg) (...))) */
129 1.1 mrg plus_rtx = XEXP (mem_rtx, 0);
130 1.1 mrg break;
131 1.1 mrg
132 1.1 mrg case POST_MODIFY:
133 1.1 mrg /* (mem (post_modify (reg) (plus (reg) (...)))) */
134 1.1 mrg plus_rtx = XEXP (XEXP (mem_rtx, 0), 1);
135 1.1 mrg break;
136 1.1 mrg
137 1.1 mrg default:
138 1.1 mrg gcc_unreachable ();
139 1.1 mrg }
140 1.1 mrg break;
141 1.1 mrg
142 1.1 mrg default:
143 1.1 mrg gcc_unreachable ();
144 1.1 mrg }
145 1.1 mrg
146 1.1 mrg gcc_assert (GET_CODE (plus_rtx) == PLUS);
147 1.1 mrg
148 1.1 mrg offset_rtx = XEXP (plus_rtx, 1);
149 1.1 mrg if (GET_CODE (offset_rtx) == CONST_INT)
150 1.1 mrg {
151 1.1 mrg if (INTVAL (offset_rtx) < 0)
152 1.1 mrg return MEM_ACCESS_DIR_NEG;
153 1.1 mrg else
154 1.1 mrg return MEM_ACCESS_DIR_POS;
155 1.1 mrg }
156 1.1 mrg
157 1.1 mrg return MEM_ACCESS_DIR_UNKNOWN;
158 1.1 mrg }
159 1.1 mrg
160 1.1 mrg /* Return the nth load/store operation in the real micro-operation
161 1.1 mrg accessing order. */
162 1.1 mrg rtx
163 1.1 mrg extract_nth_access_rtx (rtx_insn *insn, int n)
164 1.1 mrg {
165 1.1 mrg int n_elems = parallel_elements (insn);
166 1.1 mrg int post_update_rtx_index = find_post_update_rtx (insn);
167 1.1 mrg memory_access_direction direction = determine_access_direction (insn);
168 1.1 mrg
169 1.1 mrg gcc_assert (direction != MEM_ACCESS_DIR_UNKNOWN);
170 1.1 mrg
171 1.1 mrg /* Reverse the order if the direction negative. */
172 1.1 mrg if (direction == MEM_ACCESS_DIR_NEG)
173 1.1 mrg n = -1 * n - 1;
174 1.1 mrg
175 1.1 mrg if (post_update_rtx_index != -1)
176 1.1 mrg {
177 1.1 mrg if (n >= 0 && post_update_rtx_index <= n)
178 1.1 mrg ++n;
179 1.1 mrg else if (n < 0 && post_update_rtx_index >= n + n_elems)
180 1.1 mrg --n;
181 1.1 mrg }
182 1.1 mrg
183 1.1 mrg return parallel_element (insn, n);
184 1.1 mrg }
185 1.1 mrg
186 1.1 mrg /* Returns the register operated by the nth load/store operation in the real
187 1.1 mrg micro-operation accessing order. This function assumes INSN must be a
188 1.1 mrg multiple-word load/store insn. */
189 1.1 mrg rtx
190 1.1 mrg extract_nth_lmsw_access_reg (rtx_insn *insn, int n)
191 1.1 mrg {
192 1.1 mrg rtx nth_rtx = extract_nth_access_rtx (insn, n);
193 1.1 mrg
194 1.1 mrg if (nth_rtx == NULL_RTX)
195 1.1 mrg return NULL_RTX;
196 1.1 mrg
197 1.1 mrg switch (get_attr_type (insn))
198 1.1 mrg {
199 1.1 mrg case TYPE_LOAD_MULTIPLE:
200 1.1 mrg return SET_DEST (nth_rtx);
201 1.1 mrg
202 1.1 mrg case TYPE_STORE_MULTIPLE:
203 1.1 mrg return SET_SRC (nth_rtx);
204 1.1 mrg
205 1.1 mrg default:
206 1.1 mrg gcc_unreachable ();
207 1.1 mrg }
208 1.1 mrg }
209 1.1 mrg
210 1.1 mrg /* Returns the register operated by the nth load/store operation in the real
211 1.1 mrg micro-operation accessing order. This function assumes INSN must be a
212 1.1 mrg double-word load/store insn. */
213 1.1 mrg rtx
214 1.1 mrg extract_nth_ls2_access_reg (rtx_insn *insn, int n)
215 1.1 mrg {
216 1.1 mrg rtx reg;
217 1.1 mrg machine_mode mode;
218 1.1 mrg
219 1.1 mrg if (post_update_insn_p (insn))
220 1.1 mrg {
221 1.1 mrg memory_access_direction direction = determine_access_direction (insn);
222 1.1 mrg gcc_assert (direction != MEM_ACCESS_DIR_UNKNOWN);
223 1.1 mrg
224 1.1 mrg /* Reverse the order if the direction negative. */
225 1.1 mrg if (direction == MEM_ACCESS_DIR_NEG)
226 1.1 mrg n = -1 * n - 1;
227 1.1 mrg }
228 1.1 mrg
229 1.1 mrg /* Handle the out-of-range case. */
230 1.1 mrg if (n < -2 || n > 1)
231 1.1 mrg return NULL_RTX;
232 1.1 mrg
233 1.1 mrg /* Convert the index to a positive one. */
234 1.1 mrg if (n < 0)
235 1.1 mrg n = 2 + n;
236 1.1 mrg
237 1.1 mrg switch (get_attr_type (insn))
238 1.1 mrg {
239 1.1 mrg case TYPE_LOAD:
240 1.1 mrg reg = SET_DEST (PATTERN (insn));
241 1.1 mrg break;
242 1.1 mrg
243 1.1 mrg case TYPE_STORE:
244 1.1 mrg reg = SET_SRC (PATTERN (insn));
245 1.1 mrg break;
246 1.1 mrg
247 1.1 mrg default:
248 1.1 mrg gcc_unreachable ();
249 1.1 mrg }
250 1.1 mrg
251 1.1 mrg gcc_assert (REG_P (reg) || GET_CODE (reg) == SUBREG);
252 1.1 mrg
253 1.1 mrg switch (GET_MODE (reg))
254 1.1 mrg {
255 1.1 mrg case E_DImode:
256 1.1 mrg mode = SImode;
257 1.1 mrg break;
258 1.1 mrg
259 1.1 mrg case E_DFmode:
260 1.1 mrg mode = SFmode;
261 1.1 mrg break;
262 1.1 mrg
263 1.1 mrg default:
264 1.1 mrg gcc_unreachable ();
265 1.1 mrg }
266 1.1 mrg
267 1.1 mrg if (n == 0)
268 1.1 mrg return gen_lowpart (mode, reg);
269 1.1 mrg else
270 1.1 mrg return gen_highpart (mode, reg);
271 1.1 mrg }
272 1.1 mrg
273 1.1 mrg /* Returns the register operated by the nth load/store operation in the real
274 1.1 mrg micro-operation accessing order. */
275 1.1 mrg rtx
276 1.1 mrg extract_nth_access_reg (rtx_insn *insn, int index)
277 1.1 mrg {
278 1.1 mrg switch (GET_CODE (PATTERN (insn)))
279 1.1 mrg {
280 1.1 mrg case PARALLEL:
281 1.1 mrg return extract_nth_lmsw_access_reg (insn, index);
282 1.1 mrg
283 1.1 mrg case SET:
284 1.1 mrg return extract_nth_ls2_access_reg (insn, index);
285 1.1 mrg
286 1.1 mrg default:
287 1.1 mrg gcc_unreachable ();
288 1.1 mrg }
289 1.1 mrg }
290 1.1 mrg
291 1.1 mrg /* Determine if the latency is occured when the consumer PBSADA_INSN uses the
292 1.1 mrg value of DEF_REG in its Ra or Rb fields. */
293 1.1 mrg bool
294 1.1 mrg pbsada_insn_ra_rb_dep_reg_p (rtx pbsada_insn, rtx def_reg)
295 1.1 mrg {
296 1.1 mrg rtx unspec_rtx = SET_SRC (PATTERN (pbsada_insn));
297 1.1 mrg gcc_assert (GET_CODE (unspec_rtx) == UNSPEC);
298 1.1 mrg
299 1.1 mrg rtx pbsada_ra = XVECEXP (unspec_rtx, 0, 0);
300 1.1 mrg rtx pbsada_rb = XVECEXP (unspec_rtx, 0, 1);
301 1.1 mrg
302 1.1 mrg if (rtx_equal_p (def_reg, pbsada_ra)
303 1.1 mrg || rtx_equal_p (def_reg, pbsada_rb))
304 1.1 mrg return true;
305 1.1 mrg
306 1.1 mrg return false;
307 1.1 mrg }
308 1.1 mrg
309 1.1 mrg /* Determine if the latency is occured when the consumer PBSADA_INSN uses the
310 1.1 mrg value of DEF_REG in its Rt field. */
311 1.1 mrg bool
312 1.1 mrg pbsada_insn_rt_dep_reg_p (rtx pbsada_insn, rtx def_reg)
313 1.1 mrg {
314 1.1 mrg rtx pbsada_rt = SET_DEST (PATTERN (pbsada_insn));
315 1.1 mrg
316 1.1 mrg if (rtx_equal_p (def_reg, pbsada_rt))
317 1.1 mrg return true;
318 1.1 mrg
319 1.1 mrg return false;
320 1.1 mrg }
321 1.1 mrg
322 1.1 mrg /* Check if INSN is a movd44 insn consuming DEF_REG. */
323 1.1 mrg bool
324 1.1 mrg movd44_even_dep_p (rtx_insn *insn, rtx def_reg)
325 1.1 mrg {
326 1.1 mrg if (!movd44_insn_p (insn))
327 1.1 mrg return false;
328 1.1 mrg
329 1.1 mrg rtx use_rtx = SET_SRC (PATTERN (insn));
330 1.1 mrg
331 1.1 mrg if (REG_P (def_reg))
332 1.1 mrg {
333 1.1 mrg return rtx_equal_p (def_reg, use_rtx);
334 1.1 mrg }
335 1.1 mrg else if (GET_CODE (def_reg) == SUBREG
336 1.1 mrg && GET_MODE (def_reg) == SImode
337 1.1 mrg && rtx_equal_p (SUBREG_REG (def_reg), use_rtx))
338 1.1 mrg {
339 1.1 mrg if (TARGET_BIG_ENDIAN && SUBREG_BYTE (def_reg) == 4)
340 1.1 mrg return true;
341 1.1 mrg
342 1.1 mrg if (!TARGET_BIG_ENDIAN && SUBREG_BYTE (def_reg) == 0)
343 1.1 mrg return true;
344 1.1 mrg
345 1.1 mrg return false;
346 1.1 mrg }
347 1.1 mrg
348 1.1 mrg return false;
349 1.1 mrg }
350 1.1 mrg
351 1.1 mrg /* Check if INSN is a wext insn consuming DEF_REG. */
352 1.1 mrg bool
353 1.1 mrg wext_odd_dep_p (rtx insn, rtx def_reg)
354 1.1 mrg {
355 1.1 mrg rtx shift_rtx = XEXP (SET_SRC (PATTERN (insn)), 0);
356 1.1 mrg rtx use_reg = XEXP (shift_rtx, 0);
357 1.1 mrg rtx pos_rtx = XEXP (shift_rtx, 1);
358 1.1 mrg
359 1.1 mrg if (REG_P (pos_rtx) && reg_overlap_p (def_reg, pos_rtx))
360 1.1 mrg return true;
361 1.1 mrg
362 1.1 mrg if (GET_MODE (def_reg) == DImode)
363 1.1 mrg return reg_overlap_p (def_reg, use_reg);
364 1.1 mrg
365 1.1 mrg gcc_assert (REG_P (def_reg) || GET_CODE (def_reg) == SUBREG);
366 1.1 mrg gcc_assert (REG_P (use_reg) || GET_CODE (use_reg) == SUBREG);
367 1.1 mrg
368 1.1 mrg if (REG_P (def_reg))
369 1.1 mrg {
370 1.1 mrg if REG_P (use_reg)
371 1.1 mrg {
372 1.1 mrg if (!TARGET_BIG_ENDIAN)
373 1.1 mrg return REGNO (def_reg) == REGNO (use_reg) + 1;
374 1.1 mrg else
375 1.1 mrg return REGNO (def_reg) == REGNO (use_reg);
376 1.1 mrg }
377 1.1 mrg else
378 1.1 mrg return true;
379 1.1 mrg }
380 1.1 mrg
381 1.1 mrg if (GET_CODE (def_reg) == SUBREG)
382 1.1 mrg {
383 1.1 mrg if (!reg_overlap_p (def_reg, use_reg))
384 1.1 mrg return false;
385 1.1 mrg
386 1.1 mrg if (GET_CODE (use_reg) == SUBREG)
387 1.1 mrg return true;
388 1.1 mrg
389 1.1 mrg if (!TARGET_BIG_ENDIAN)
390 1.1 mrg return SUBREG_BYTE (def_reg) == 4;
391 1.1 mrg else
392 1.1 mrg return SUBREG_BYTE (def_reg) == 0;
393 1.1 mrg }
394 1.1 mrg
395 1.1 mrg return false;
396 1.1 mrg }
397 1.1 mrg
398 1.1 mrg /* Check if INSN is a bpick insn consuming DEF_REG. */
399 1.1 mrg bool
400 1.1 mrg bpick_ra_rb_dep_p (rtx insn, rtx def_reg)
401 1.1 mrg {
402 1.1 mrg rtx ior_rtx = SET_SRC (PATTERN (insn));
403 1.1 mrg rtx and1_rtx = XEXP (ior_rtx, 0);
404 1.1 mrg rtx and2_rtx = XEXP (ior_rtx, 1);
405 1.1 mrg rtx reg1_0 = XEXP (and1_rtx, 0);
406 1.1 mrg rtx reg1_1 = XEXP (and1_rtx, 1);
407 1.1 mrg rtx reg2_0 = XEXP (and2_rtx, 0);
408 1.1 mrg rtx reg2_1 = XEXP (and2_rtx, 1);
409 1.1 mrg
410 1.1 mrg if (GET_CODE (reg1_0) == NOT)
411 1.1 mrg {
412 1.1 mrg if (rtx_equal_p (reg1_0, reg2_0))
413 1.1 mrg return reg_overlap_p (def_reg, reg1_1)
414 1.1 mrg || reg_overlap_p (def_reg, reg2_1);
415 1.1 mrg
416 1.1 mrg if (rtx_equal_p (reg1_0, reg2_1))
417 1.1 mrg return reg_overlap_p (def_reg, reg1_1)
418 1.1 mrg || reg_overlap_p (def_reg, reg2_0);
419 1.1 mrg }
420 1.1 mrg
421 1.1 mrg if (GET_CODE (reg1_1) == NOT)
422 1.1 mrg {
423 1.1 mrg if (rtx_equal_p (reg1_1, reg2_0))
424 1.1 mrg return reg_overlap_p (def_reg, reg1_0)
425 1.1 mrg || reg_overlap_p (def_reg, reg2_1);
426 1.1 mrg
427 1.1 mrg if (rtx_equal_p (reg1_1, reg2_1))
428 1.1 mrg return reg_overlap_p (def_reg, reg1_0)
429 1.1 mrg || reg_overlap_p (def_reg, reg2_0);
430 1.1 mrg }
431 1.1 mrg
432 1.1 mrg if (GET_CODE (reg2_0) == NOT)
433 1.1 mrg {
434 1.1 mrg if (rtx_equal_p (reg2_0, reg1_0))
435 1.1 mrg return reg_overlap_p (def_reg, reg2_1)
436 1.1 mrg || reg_overlap_p (def_reg, reg1_1);
437 1.1 mrg
438 1.1 mrg if (rtx_equal_p (reg2_0, reg1_1))
439 1.1 mrg return reg_overlap_p (def_reg, reg2_1)
440 1.1 mrg || reg_overlap_p (def_reg, reg1_0);
441 1.1 mrg }
442 1.1 mrg
443 1.1 mrg if (GET_CODE (reg2_1) == NOT)
444 1.1 mrg {
445 1.1 mrg if (rtx_equal_p (reg2_1, reg1_0))
446 1.1 mrg return reg_overlap_p (def_reg, reg2_0)
447 1.1 mrg || reg_overlap_p (def_reg, reg1_1);
448 1.1 mrg
449 1.1 mrg if (rtx_equal_p (reg2_1, reg1_1))
450 1.1 mrg return reg_overlap_p (def_reg, reg2_0)
451 1.1 mrg || reg_overlap_p (def_reg, reg1_0);
452 1.1 mrg }
453 1.1 mrg
454 1.1 mrg gcc_unreachable ();
455 1.1 mrg }
456 1.1 mrg } // namespace scheduling
457 1.1 mrg } // namespace nds32
458 1.1 mrg
459 1.1 mrg /* ------------------------------------------------------------------------ */
460 1.1 mrg
461 1.1 mrg using namespace nds32;
462 1.1 mrg using namespace nds32::scheduling;
463 1.1 mrg
464 1.1 mrg namespace { // anonymous namespace
465 1.1 mrg
466 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
467 1.1 mrg requiring input operand at II. */
468 1.1 mrg bool
469 1.1 mrg n7_consumed_by_ii_dep_p (rtx_insn *consumer, rtx def_reg)
470 1.1 mrg {
471 1.1 mrg rtx use_rtx;
472 1.1 mrg
473 1.1 mrg switch (get_attr_type (consumer))
474 1.1 mrg {
475 1.1 mrg /* MOVD44_E */
476 1.1 mrg case TYPE_ALU:
477 1.1 mrg if (movd44_even_dep_p (consumer, def_reg))
478 1.1 mrg return true;
479 1.1 mrg
480 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
481 1.1 mrg break;
482 1.1 mrg
483 1.1 mrg case TYPE_MUL:
484 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
485 1.1 mrg break;
486 1.1 mrg
487 1.1 mrg case TYPE_MAC:
488 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer);
489 1.1 mrg break;
490 1.1 mrg
491 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two
492 1.1 mrg results, the quotient and the remainder. It requires two micro-
493 1.1 mrg operations in order to write two registers. We have to check the
494 1.1 mrg dependency from the producer to the first micro-operation. */
495 1.1 mrg case TYPE_DIV:
496 1.1 mrg if (divmod_p (consumer))
497 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0));
498 1.1 mrg else
499 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
500 1.1 mrg break;
501 1.1 mrg
502 1.1 mrg case TYPE_LOAD:
503 1.1 mrg /* ADDR_IN_bi_Ra, ADDR_IN_!bi */
504 1.1 mrg if (post_update_insn_p (consumer))
505 1.1 mrg use_rtx = extract_base_reg (consumer);
506 1.1 mrg else
507 1.1 mrg use_rtx = extract_mem_rtx (consumer);
508 1.1 mrg break;
509 1.1 mrg
510 1.1 mrg case TYPE_STORE:
511 1.1 mrg /* ADDR_IN_bi_Ra, ADDR_IN_!bi */
512 1.1 mrg if (post_update_insn_p (consumer))
513 1.1 mrg use_rtx = extract_base_reg (consumer);
514 1.1 mrg else
515 1.1 mrg use_rtx = extract_mem_rtx (consumer);
516 1.1 mrg
517 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
518 1.1 mrg return true;
519 1.1 mrg
520 1.1 mrg /* ST_bi, ST_!bi_RI */
521 1.1 mrg if (!post_update_insn_p (consumer)
522 1.1 mrg && !immed_offset_p (extract_mem_rtx (consumer)))
523 1.1 mrg return false;
524 1.1 mrg
525 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
526 1.1 mrg break;
527 1.1 mrg
528 1.1 mrg case TYPE_LOAD_MULTIPLE:
529 1.1 mrg use_rtx = extract_base_reg (consumer);
530 1.1 mrg break;
531 1.1 mrg
532 1.1 mrg case TYPE_STORE_MULTIPLE:
533 1.1 mrg /* ADDR_IN */
534 1.1 mrg use_rtx = extract_base_reg (consumer);
535 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
536 1.1 mrg return true;
537 1.1 mrg
538 1.1 mrg /* SMW (N, 1) */
539 1.1 mrg use_rtx = extract_nth_access_rtx (consumer, 0);
540 1.1 mrg break;
541 1.1 mrg
542 1.1 mrg case TYPE_BRANCH:
543 1.1 mrg use_rtx = PATTERN (consumer);
544 1.1 mrg break;
545 1.1 mrg
546 1.1 mrg default:
547 1.1 mrg gcc_unreachable ();
548 1.1 mrg }
549 1.1 mrg
550 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
551 1.1 mrg return true;
552 1.1 mrg
553 1.1 mrg return false;
554 1.1 mrg }
555 1.1 mrg
556 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
557 1.1 mrg requiring input operand at AG (II). */
558 1.1 mrg bool
559 1.1 mrg n8_consumed_by_addr_in_p (rtx_insn *consumer, rtx def_reg)
560 1.1 mrg {
561 1.1 mrg rtx use_rtx;
562 1.1 mrg
563 1.1 mrg switch (get_attr_type (consumer))
564 1.1 mrg {
565 1.1 mrg case TYPE_BRANCH:
566 1.1 mrg use_rtx = extract_branch_target_rtx (consumer);
567 1.1 mrg break;
568 1.1 mrg
569 1.1 mrg case TYPE_LOAD:
570 1.1 mrg if (load_single_p (consumer))
571 1.1 mrg use_rtx = extract_mem_rtx (consumer);
572 1.1 mrg else
573 1.1 mrg use_rtx = extract_base_reg (consumer);
574 1.1 mrg break;
575 1.1 mrg
576 1.1 mrg case TYPE_STORE:
577 1.1 mrg if (store_single_p (consumer)
578 1.1 mrg && (!post_update_insn_p (consumer)
579 1.1 mrg || immed_offset_p (extract_mem_rtx (consumer))))
580 1.1 mrg use_rtx = extract_mem_rtx (consumer);
581 1.1 mrg else
582 1.1 mrg use_rtx = extract_base_reg (consumer);
583 1.1 mrg break;
584 1.1 mrg
585 1.1 mrg case TYPE_LOAD_MULTIPLE:
586 1.1 mrg case TYPE_STORE_MULTIPLE:
587 1.1 mrg use_rtx = extract_base_reg (consumer);
588 1.1 mrg break;
589 1.1 mrg
590 1.1 mrg default:
591 1.1 mrg gcc_unreachable ();
592 1.1 mrg }
593 1.1 mrg
594 1.1 mrg return reg_overlap_p (def_reg, use_rtx);
595 1.1 mrg }
596 1.1 mrg
597 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
598 1.1 mrg requiring input operand at EX. */
599 1.1 mrg bool
600 1.1 mrg n8_consumed_by_ex_p (rtx_insn *consumer, rtx def_reg)
601 1.1 mrg {
602 1.1 mrg rtx use_rtx;
603 1.1 mrg
604 1.1 mrg switch (get_attr_type (consumer))
605 1.1 mrg {
606 1.1 mrg case TYPE_ALU:
607 1.1 mrg if (movd44_even_dep_p (consumer, def_reg))
608 1.1 mrg return true;
609 1.1 mrg
610 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
611 1.1 mrg break;
612 1.1 mrg
613 1.1 mrg case TYPE_MUL:
614 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
615 1.1 mrg break;
616 1.1 mrg
617 1.1 mrg case TYPE_MAC:
618 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer);
619 1.1 mrg break;
620 1.1 mrg
621 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two
622 1.1 mrg results, the quotient and the remainder. It requires two micro-
623 1.1 mrg operations in order to write two registers. We have to check the
624 1.1 mrg dependency from the producer to the first micro-operation. */
625 1.1 mrg case TYPE_DIV:
626 1.1 mrg if (divmod_p (consumer))
627 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0));
628 1.1 mrg else
629 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
630 1.1 mrg break;
631 1.1 mrg
632 1.1 mrg case TYPE_BRANCH:
633 1.1 mrg use_rtx = extract_branch_condition_rtx (consumer);
634 1.1 mrg break;
635 1.1 mrg
636 1.1 mrg case TYPE_STORE:
637 1.1 mrg /* exclude ST_!bi_RR */
638 1.1 mrg if (!post_update_insn_p (consumer)
639 1.1 mrg && !immed_offset_p (extract_mem_rtx (consumer)))
640 1.1 mrg return false;
641 1.1 mrg
642 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
643 1.1 mrg break;
644 1.1 mrg
645 1.1 mrg case TYPE_STORE_MULTIPLE:
646 1.1 mrg use_rtx = extract_nth_access_rtx (consumer, 0);
647 1.1 mrg break;
648 1.1 mrg
649 1.1 mrg default:
650 1.1 mrg gcc_unreachable ();
651 1.1 mrg }
652 1.1 mrg
653 1.1 mrg return reg_overlap_p (def_reg, use_rtx);
654 1.1 mrg }
655 1.1 mrg
656 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
657 1.1 mrg requiring input operand at AG (II). */
658 1.1 mrg bool
659 1.1 mrg e8_consumed_by_addr_in_p (rtx_insn *consumer, rtx def_reg)
660 1.1 mrg {
661 1.1 mrg return n8_consumed_by_addr_in_p (consumer, def_reg);
662 1.1 mrg }
663 1.1 mrg
664 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
665 1.1 mrg requiring input operand at EX. */
666 1.1 mrg bool
667 1.1 mrg e8_consumed_by_ex_p (rtx_insn *consumer, rtx def_reg)
668 1.1 mrg {
669 1.1 mrg rtx use_rtx;
670 1.1 mrg
671 1.1 mrg switch (get_attr_type (consumer))
672 1.1 mrg {
673 1.1 mrg case TYPE_ALU:
674 1.1 mrg case TYPE_STORE:
675 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
676 1.1 mrg break;
677 1.1 mrg
678 1.1 mrg case TYPE_MUL:
679 1.1 mrg case TYPE_MAC:
680 1.1 mrg case TYPE_DIV:
681 1.1 mrg case TYPE_BRANCH:
682 1.1 mrg case TYPE_STORE_MULTIPLE:
683 1.1 mrg return n8_consumed_by_ex_p (consumer, def_reg);
684 1.1 mrg
685 1.1 mrg default:
686 1.1 mrg gcc_unreachable ();
687 1.1 mrg }
688 1.1 mrg
689 1.1 mrg return reg_overlap_p (def_reg, use_rtx);
690 1.1 mrg }
691 1.1 mrg
692 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
693 1.1 mrg requiring input operand at EX. */
694 1.1 mrg bool
695 1.1 mrg n9_2r1w_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg)
696 1.1 mrg {
697 1.1 mrg rtx use_rtx;
698 1.1 mrg
699 1.1 mrg switch (get_attr_type (consumer))
700 1.1 mrg {
701 1.1 mrg case TYPE_ALU:
702 1.1 mrg if (movd44_even_dep_p (consumer, def_reg))
703 1.1 mrg return true;
704 1.1 mrg
705 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
706 1.1 mrg break;
707 1.1 mrg
708 1.1 mrg case TYPE_PBSAD:
709 1.1 mrg case TYPE_MUL:
710 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
711 1.1 mrg break;
712 1.1 mrg
713 1.1 mrg case TYPE_ALU_SHIFT:
714 1.1 mrg use_rtx = extract_shift_reg (consumer);
715 1.1 mrg break;
716 1.1 mrg
717 1.1 mrg case TYPE_PBSADA:
718 1.1 mrg return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg);
719 1.1 mrg
720 1.1 mrg case TYPE_MAC:
721 1.1 mrg use_rtx = PATTERN (consumer);
722 1.1 mrg break;
723 1.1 mrg
724 1.1 mrg case TYPE_DIV:
725 1.1 mrg if (divmod_p (consumer))
726 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0));
727 1.1 mrg else
728 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
729 1.1 mrg break;
730 1.1 mrg
731 1.1 mrg case TYPE_MMU:
732 1.1 mrg if (GET_CODE (PATTERN (consumer)) == SET)
733 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
734 1.1 mrg else
735 1.1 mrg return true;
736 1.1 mrg break;
737 1.1 mrg
738 1.1 mrg case TYPE_LOAD:
739 1.1 mrg /* ADDR_IN_bi_Ra, ADDR_IN_!bi */
740 1.1 mrg if (post_update_insn_p (consumer))
741 1.1 mrg use_rtx = extract_base_reg (consumer);
742 1.1 mrg else
743 1.1 mrg use_rtx = extract_mem_rtx (consumer);
744 1.1 mrg break;
745 1.1 mrg
746 1.1 mrg case TYPE_STORE:
747 1.1 mrg /* ADDR_IN_bi_Ra, ADDR_IN_!bi */
748 1.1 mrg if (post_update_insn_p (consumer))
749 1.1 mrg use_rtx = extract_base_reg (consumer);
750 1.1 mrg else
751 1.1 mrg use_rtx = extract_mem_rtx (consumer);
752 1.1 mrg
753 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
754 1.1 mrg return true;
755 1.1 mrg
756 1.1 mrg /* exclude ST_!bi_RR */
757 1.1 mrg if (!post_update_insn_p (consumer)
758 1.1 mrg && !immed_offset_p (extract_mem_rtx (consumer)))
759 1.1 mrg return false;
760 1.1 mrg
761 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
762 1.1 mrg break;
763 1.1 mrg
764 1.1 mrg case TYPE_LOAD_MULTIPLE:
765 1.1 mrg use_rtx = extract_base_reg (consumer);
766 1.1 mrg break;
767 1.1 mrg
768 1.1 mrg case TYPE_STORE_MULTIPLE:
769 1.1 mrg /* ADDR_IN */
770 1.1 mrg use_rtx = extract_base_reg (consumer);
771 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
772 1.1 mrg return true;
773 1.1 mrg
774 1.1 mrg /* SMW (N, 1) */
775 1.1 mrg use_rtx = extract_nth_access_rtx (consumer, 0);
776 1.1 mrg break;
777 1.1 mrg
778 1.1 mrg case TYPE_BRANCH:
779 1.1 mrg use_rtx = PATTERN (consumer);
780 1.1 mrg break;
781 1.1 mrg
782 1.1 mrg default:
783 1.1 mrg gcc_unreachable ();
784 1.1 mrg }
785 1.1 mrg
786 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
787 1.1 mrg return true;
788 1.1 mrg
789 1.1 mrg return false;
790 1.1 mrg }
791 1.1 mrg
792 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
793 1.1 mrg requiring input operand at EX. */
794 1.1 mrg bool
795 1.1 mrg n9_3r2w_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg)
796 1.1 mrg {
797 1.1 mrg rtx use_rtx;
798 1.1 mrg
799 1.1 mrg switch (get_attr_type (consumer))
800 1.1 mrg {
801 1.1 mrg case TYPE_ALU:
802 1.1 mrg case TYPE_PBSAD:
803 1.1 mrg case TYPE_MUL:
804 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
805 1.1 mrg break;
806 1.1 mrg
807 1.1 mrg case TYPE_ALU_SHIFT:
808 1.1 mrg use_rtx = extract_shift_reg (consumer);
809 1.1 mrg break;
810 1.1 mrg
811 1.1 mrg case TYPE_PBSADA:
812 1.1 mrg return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg);
813 1.1 mrg
814 1.1 mrg case TYPE_MAC:
815 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer);
816 1.1 mrg break;
817 1.1 mrg
818 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two
819 1.1 mrg results, the quotient and the remainder. In 2R1W configuration,
820 1.1 mrg it requires two micro-operations in order to write two registers.
821 1.1 mrg We have to check the dependency from the producer to the first
822 1.1 mrg micro-operation. */
823 1.1 mrg case TYPE_DIV:
824 1.1 mrg if (divmod_p (consumer))
825 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0));
826 1.1 mrg else
827 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
828 1.1 mrg break;
829 1.1 mrg
830 1.1 mrg case TYPE_MMU:
831 1.1 mrg if (GET_CODE (PATTERN (consumer)) == SET)
832 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
833 1.1 mrg else
834 1.1 mrg return true;
835 1.1 mrg break;
836 1.1 mrg
837 1.1 mrg case TYPE_LOAD:
838 1.1 mrg case TYPE_STORE:
839 1.1 mrg use_rtx = extract_mem_rtx (consumer);
840 1.1 mrg break;
841 1.1 mrg
842 1.1 mrg case TYPE_LOAD_MULTIPLE:
843 1.1 mrg case TYPE_STORE_MULTIPLE:
844 1.1 mrg use_rtx = extract_base_reg (consumer);
845 1.1 mrg break;
846 1.1 mrg
847 1.1 mrg case TYPE_BRANCH:
848 1.1 mrg use_rtx = PATTERN (consumer);
849 1.1 mrg break;
850 1.1 mrg
851 1.1 mrg default:
852 1.1 mrg gcc_unreachable ();
853 1.1 mrg }
854 1.1 mrg
855 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
856 1.1 mrg return true;
857 1.1 mrg
858 1.1 mrg return false;
859 1.1 mrg }
860 1.1 mrg
861 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
862 1.1 mrg requiring input operand at EX. */
863 1.1 mrg bool
864 1.1 mrg n10_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg)
865 1.1 mrg {
866 1.1 mrg rtx use_rtx;
867 1.1 mrg
868 1.1 mrg switch (get_attr_type (consumer))
869 1.1 mrg {
870 1.1 mrg case TYPE_ALU:
871 1.1 mrg case TYPE_PBSAD:
872 1.1 mrg case TYPE_MUL:
873 1.1 mrg case TYPE_DALU:
874 1.1 mrg case TYPE_DALU64:
875 1.1 mrg case TYPE_DMUL:
876 1.1 mrg case TYPE_DPACK:
877 1.1 mrg case TYPE_DINSB:
878 1.1 mrg case TYPE_DCMP:
879 1.1 mrg case TYPE_DCLIP:
880 1.1 mrg case TYPE_DALUROUND:
881 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
882 1.1 mrg break;
883 1.1 mrg
884 1.1 mrg case TYPE_ALU_SHIFT:
885 1.1 mrg use_rtx = extract_shift_reg (consumer);
886 1.1 mrg break;
887 1.1 mrg
888 1.1 mrg case TYPE_PBSADA:
889 1.1 mrg return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg);
890 1.1 mrg
891 1.1 mrg case TYPE_MAC:
892 1.1 mrg case TYPE_DMAC:
893 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer);
894 1.1 mrg break;
895 1.1 mrg
896 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two
897 1.1 mrg results, the quotient and the remainder. */
898 1.1 mrg case TYPE_DIV:
899 1.1 mrg if (divmod_p (consumer))
900 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0));
901 1.1 mrg else
902 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
903 1.1 mrg break;
904 1.1 mrg
905 1.1 mrg case TYPE_DWEXT:
906 1.1 mrg return wext_odd_dep_p (consumer, def_reg);
907 1.1 mrg
908 1.1 mrg case TYPE_DBPICK:
909 1.1 mrg return bpick_ra_rb_dep_p (consumer, def_reg);
910 1.1 mrg
911 1.1 mrg case TYPE_MMU:
912 1.1 mrg if (GET_CODE (PATTERN (consumer)) == SET)
913 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
914 1.1 mrg else
915 1.1 mrg return true;
916 1.1 mrg break;
917 1.1 mrg
918 1.1 mrg case TYPE_LOAD:
919 1.1 mrg case TYPE_STORE:
920 1.1 mrg use_rtx = extract_mem_rtx (consumer);
921 1.1 mrg break;
922 1.1 mrg
923 1.1 mrg case TYPE_LOAD_MULTIPLE:
924 1.1 mrg case TYPE_STORE_MULTIPLE:
925 1.1 mrg use_rtx = extract_base_reg (consumer);
926 1.1 mrg break;
927 1.1 mrg
928 1.1 mrg case TYPE_BRANCH:
929 1.1 mrg use_rtx = PATTERN (consumer);
930 1.1 mrg break;
931 1.1 mrg
932 1.1 mrg default:
933 1.1 mrg gcc_unreachable ();
934 1.1 mrg }
935 1.1 mrg
936 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
937 1.1 mrg return true;
938 1.1 mrg
939 1.1 mrg return false;
940 1.1 mrg }
941 1.1 mrg
942 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
943 1.1 mrg requiring input operand at EX. */
944 1.1 mrg bool
945 1.1 mrg gw_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg)
946 1.1 mrg {
947 1.1 mrg rtx use_rtx;
948 1.1 mrg
949 1.1 mrg switch (get_attr_type (consumer))
950 1.1 mrg {
951 1.1 mrg case TYPE_ALU:
952 1.1 mrg case TYPE_PBSAD:
953 1.1 mrg case TYPE_MUL:
954 1.1 mrg case TYPE_DALU:
955 1.1 mrg case TYPE_DALU64:
956 1.1 mrg case TYPE_DMUL:
957 1.1 mrg case TYPE_DPACK:
958 1.1 mrg case TYPE_DINSB:
959 1.1 mrg case TYPE_DCMP:
960 1.1 mrg case TYPE_DCLIP:
961 1.1 mrg case TYPE_DALUROUND:
962 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
963 1.1 mrg break;
964 1.1 mrg
965 1.1 mrg case TYPE_ALU_SHIFT:
966 1.1 mrg use_rtx = extract_shift_reg (consumer);
967 1.1 mrg break;
968 1.1 mrg
969 1.1 mrg case TYPE_PBSADA:
970 1.1 mrg return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg);
971 1.1 mrg
972 1.1 mrg case TYPE_MAC:
973 1.1 mrg case TYPE_DMAC:
974 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer);
975 1.1 mrg break;
976 1.1 mrg
977 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two
978 1.1 mrg results, the quotient and the remainder. We have to check the
979 1.1 mrg dependency from the producer to the first micro-operation. */
980 1.1 mrg case TYPE_DIV:
981 1.1 mrg if (divmod_p (consumer))
982 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0));
983 1.1 mrg else
984 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
985 1.1 mrg break;
986 1.1 mrg
987 1.1 mrg case TYPE_DWEXT:
988 1.1 mrg return wext_odd_dep_p (consumer, def_reg);
989 1.1 mrg
990 1.1 mrg case TYPE_DBPICK:
991 1.1 mrg return bpick_ra_rb_dep_p (consumer, def_reg);
992 1.1 mrg
993 1.1 mrg case TYPE_MMU:
994 1.1 mrg if (GET_CODE (PATTERN (consumer)) == SET)
995 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
996 1.1 mrg else
997 1.1 mrg return true;
998 1.1 mrg break;
999 1.1 mrg
1000 1.1 mrg case TYPE_LOAD:
1001 1.1 mrg case TYPE_STORE:
1002 1.1 mrg use_rtx = extract_mem_rtx (consumer);
1003 1.1 mrg break;
1004 1.1 mrg
1005 1.1 mrg case TYPE_LOAD_MULTIPLE:
1006 1.1 mrg case TYPE_STORE_MULTIPLE:
1007 1.1 mrg use_rtx = extract_base_reg (consumer);
1008 1.1 mrg break;
1009 1.1 mrg
1010 1.1 mrg case TYPE_BRANCH:
1011 1.1 mrg use_rtx = PATTERN (consumer);
1012 1.1 mrg break;
1013 1.1 mrg
1014 1.1 mrg default:
1015 1.1 mrg gcc_unreachable ();
1016 1.1 mrg }
1017 1.1 mrg
1018 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
1019 1.1 mrg return true;
1020 1.1 mrg
1021 1.1 mrg return false;
1022 1.1 mrg }
1023 1.1 mrg
1024 1.1 mrg /* Check dependencies from any stages to ALU_E1 (E1). This is a helper
1025 1.1 mrg function of n13_consumed_by_e1_dep_p (). */
1026 1.1 mrg bool
1027 1.1 mrg n13_alu_e1_insn_dep_reg_p (rtx_insn *alu_e1_insn, rtx def_reg)
1028 1.1 mrg {
1029 1.1 mrg rtx unspec_rtx, operand_ra, operand_rb;
1030 1.1 mrg rtx src_rtx, dst_rtx;
1031 1.1 mrg
1032 1.1 mrg switch (INSN_CODE (alu_e1_insn))
1033 1.1 mrg {
1034 1.1 mrg /* BSP and BSE are supported by built-in functions, the corresponding
1035 1.1 mrg patterns are formed by UNSPEC RTXs. We have to handle them
1036 1.1 mrg individually. */
1037 1.1 mrg case CODE_FOR_unspec_bsp:
1038 1.1 mrg case CODE_FOR_unspec_bse:
1039 1.1 mrg unspec_rtx = SET_SRC (parallel_element (alu_e1_insn, 0));
1040 1.1 mrg gcc_assert (GET_CODE (unspec_rtx) == UNSPEC);
1041 1.1 mrg
1042 1.1 mrg operand_ra = XVECEXP (unspec_rtx, 0, 0);
1043 1.1 mrg operand_rb = XVECEXP (unspec_rtx, 0, 1);
1044 1.1 mrg
1045 1.1 mrg if (rtx_equal_p (def_reg, operand_ra)
1046 1.1 mrg || rtx_equal_p (def_reg, operand_rb))
1047 1.1 mrg return true;
1048 1.1 mrg
1049 1.1 mrg return false;
1050 1.1 mrg
1051 1.1 mrg /* Unlink general ALU instructions, MOVD44 requires operands at E1. */
1052 1.1 mrg case CODE_FOR_move_di:
1053 1.1 mrg case CODE_FOR_move_df:
1054 1.1 mrg src_rtx = SET_SRC (PATTERN (alu_e1_insn));
1055 1.1 mrg dst_rtx = SET_DEST (PATTERN (alu_e1_insn));
1056 1.1 mrg
1057 1.1 mrg if (REG_P (dst_rtx) && REG_P (src_rtx)
1058 1.1 mrg && rtx_equal_p (src_rtx, def_reg))
1059 1.1 mrg return true;
1060 1.1 mrg
1061 1.1 mrg return false;
1062 1.1 mrg
1063 1.1 mrg default:
1064 1.1 mrg return false;
1065 1.1 mrg }
1066 1.1 mrg }
1067 1.1 mrg
1068 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
1069 1.1 mrg requiring input operand at E1. Because the address generation unti is
1070 1.1 mrg at E1, the address input should be ready at E1. Note that the branch
1071 1.1 mrg target is also a kind of addresses, so we have to check it. */
1072 1.1 mrg bool
1073 1.1 mrg n13_consumed_by_e1_dep_p (rtx_insn *consumer, rtx def_reg)
1074 1.1 mrg {
1075 1.1 mrg rtx use_rtx;
1076 1.1 mrg
1077 1.1 mrg switch (get_attr_type (consumer))
1078 1.1 mrg {
1079 1.1 mrg /* ALU_E1 */
1080 1.1 mrg case TYPE_ALU:
1081 1.1 mrg return n13_alu_e1_insn_dep_reg_p (consumer, def_reg);
1082 1.1 mrg
1083 1.1 mrg case TYPE_PBSADA:
1084 1.1 mrg return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg);
1085 1.1 mrg
1086 1.1 mrg case TYPE_PBSAD:
1087 1.1 mrg case TYPE_MUL:
1088 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
1089 1.1 mrg break;
1090 1.1 mrg
1091 1.1 mrg case TYPE_MAC:
1092 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer);
1093 1.1 mrg break;
1094 1.1 mrg
1095 1.1 mrg case TYPE_DIV:
1096 1.1 mrg if (divmod_p (consumer))
1097 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0));
1098 1.1 mrg else
1099 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
1100 1.1 mrg break;
1101 1.1 mrg
1102 1.1 mrg case TYPE_MMU:
1103 1.1 mrg if (GET_CODE (PATTERN (consumer)) == SET)
1104 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
1105 1.1 mrg else
1106 1.1 mrg return true;
1107 1.1 mrg break;
1108 1.1 mrg
1109 1.1 mrg case TYPE_BRANCH:
1110 1.1 mrg use_rtx = extract_branch_target_rtx (consumer);
1111 1.1 mrg break;
1112 1.1 mrg
1113 1.1 mrg case TYPE_LOAD:
1114 1.1 mrg case TYPE_STORE:
1115 1.1 mrg use_rtx = extract_mem_rtx (consumer);
1116 1.1 mrg break;
1117 1.1 mrg
1118 1.1 mrg case TYPE_LOAD_MULTIPLE:
1119 1.1 mrg case TYPE_STORE_MULTIPLE:
1120 1.1 mrg use_rtx = extract_base_reg (consumer);
1121 1.1 mrg break;
1122 1.1 mrg
1123 1.1 mrg default:
1124 1.1 mrg return false;
1125 1.1 mrg }
1126 1.1 mrg
1127 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
1128 1.1 mrg return true;
1129 1.1 mrg
1130 1.1 mrg return false;
1131 1.1 mrg }
1132 1.1 mrg
1133 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
1134 1.1 mrg requiring input operand at E2. */
1135 1.1 mrg bool
1136 1.1 mrg n13_consumed_by_e2_dep_p (rtx_insn *consumer, rtx def_reg)
1137 1.1 mrg {
1138 1.1 mrg rtx use_rtx;
1139 1.1 mrg
1140 1.1 mrg switch (get_attr_type (consumer))
1141 1.1 mrg {
1142 1.1 mrg case TYPE_ALU:
1143 1.1 mrg case TYPE_STORE:
1144 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer));
1145 1.1 mrg break;
1146 1.1 mrg
1147 1.1 mrg case TYPE_ALU_SHIFT:
1148 1.1 mrg use_rtx = extract_shift_reg (consumer);
1149 1.1 mrg break;
1150 1.1 mrg
1151 1.1 mrg case TYPE_PBSADA:
1152 1.1 mrg return pbsada_insn_rt_dep_reg_p (consumer, def_reg);
1153 1.1 mrg
1154 1.1 mrg case TYPE_STORE_MULTIPLE:
1155 1.1 mrg use_rtx = extract_nth_access_rtx (consumer, 0);
1156 1.1 mrg break;
1157 1.1 mrg
1158 1.1 mrg case TYPE_BRANCH:
1159 1.1 mrg use_rtx = extract_branch_condition_rtx (consumer);
1160 1.1 mrg break;
1161 1.1 mrg
1162 1.1 mrg default:
1163 1.1 mrg gcc_unreachable();
1164 1.1 mrg }
1165 1.1 mrg
1166 1.1 mrg if (reg_overlap_p (def_reg, use_rtx))
1167 1.1 mrg return true;
1168 1.1 mrg
1169 1.1 mrg return false;
1170 1.1 mrg }
1171 1.1 mrg } // anonymous namespace
1172 1.1 mrg
1173 1.1 mrg /* ------------------------------------------------------------------------ */
1174 1.1 mrg
1175 1.1 mrg /* Guard functions for N7 core. */
1176 1.1 mrg
1177 1.1 mrg bool
1178 1.1 mrg nds32_n7_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
1179 1.1 mrg {
1180 1.1 mrg if (post_update_insn_p (producer))
1181 1.1 mrg return false;
1182 1.1 mrg
1183 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer));
1184 1.1 mrg
1185 1.1 mrg return n7_consumed_by_ii_dep_p (consumer, def_reg);
1186 1.1 mrg }
1187 1.1 mrg
1188 1.1 mrg bool
1189 1.1 mrg nds32_n7_last_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
1190 1.1 mrg {
1191 1.1 mrg /* If PRODUCER is a post-update LMW insn, the last micro-operation updates
1192 1.1 mrg the base register and the result is ready in II stage, so we don't need
1193 1.1 mrg to handle that case in this guard function and the corresponding bypass
1194 1.1 mrg rule. */
1195 1.1 mrg if (post_update_insn_p (producer))
1196 1.1 mrg return false;
1197 1.1 mrg
1198 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1);
1199 1.1 mrg
1200 1.1 mrg if (last_def_reg == NULL_RTX)
1201 1.1 mrg return false;
1202 1.1 mrg
1203 1.1 mrg gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG);
1204 1.1 mrg
1205 1.1 mrg return n7_consumed_by_ii_dep_p (consumer, last_def_reg);
1206 1.1 mrg }
1207 1.1 mrg
1208 1.1 mrg /* Guard functions for N8 core. */
1209 1.1 mrg
1210 1.1 mrg bool
1211 1.1 mrg nds32_n8_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
1212 1.1 mrg {
1213 1.1 mrg if (post_update_insn_p (producer))
1214 1.1 mrg return false;
1215 1.1 mrg
1216 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer));
1217 1.1 mrg
1218 1.1 mrg return n8_consumed_by_addr_in_p (consumer, def_reg);
1219 1.1 mrg }
1220 1.1 mrg
1221 1.1 mrg bool
1222 1.1 mrg nds32_n8_load_bi_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
1223 1.1 mrg {
1224 1.1 mrg if (!post_update_insn_p (producer))
1225 1.1 mrg return false;
1226 1.1 mrg
1227 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer));
1228 1.1 mrg
1229 1.1 mrg return n8_consumed_by_addr_in_p (consumer, def_reg);
1230 1.1 mrg }
1231 1.1 mrg
1232 1.1 mrg bool
1233 1.1 mrg nds32_n8_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1234 1.1 mrg {
1235 1.1 mrg if (post_update_insn_p (producer))
1236 1.1 mrg return false;
1237 1.1 mrg
1238 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer));
1239 1.1 mrg
1240 1.1 mrg return n8_consumed_by_ex_p (consumer, def_reg);
1241 1.1 mrg }
1242 1.1 mrg
1243 1.1 mrg bool
1244 1.1 mrg nds32_n8_ex_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
1245 1.1 mrg {
1246 1.1 mrg rtx def_reg;
1247 1.1 mrg
1248 1.1 mrg switch (get_attr_type (producer))
1249 1.1 mrg {
1250 1.1 mrg case TYPE_ALU:
1251 1.1 mrg if (movd44_insn_p (producer))
1252 1.1 mrg def_reg = extract_movd44_odd_reg (producer);
1253 1.1 mrg else
1254 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1255 1.1 mrg break;
1256 1.1 mrg
1257 1.1 mrg case TYPE_MUL:
1258 1.1 mrg case TYPE_MAC:
1259 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1260 1.1 mrg break;
1261 1.1 mrg
1262 1.1 mrg case TYPE_DIV:
1263 1.1 mrg if (divmod_p (producer))
1264 1.1 mrg def_reg = SET_DEST (parallel_element (producer, 1));
1265 1.1 mrg else
1266 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1267 1.1 mrg break;
1268 1.1 mrg
1269 1.1 mrg case TYPE_LOAD:
1270 1.1 mrg case TYPE_STORE:
1271 1.1 mrg case TYPE_LOAD_MULTIPLE:
1272 1.1 mrg case TYPE_STORE_MULTIPLE:
1273 1.1 mrg if (!post_update_insn_p (producer))
1274 1.1 mrg return false;
1275 1.1 mrg
1276 1.1 mrg def_reg = extract_base_reg (producer);
1277 1.1 mrg break;
1278 1.1 mrg
1279 1.1 mrg default:
1280 1.1 mrg gcc_unreachable ();
1281 1.1 mrg }
1282 1.1 mrg
1283 1.1 mrg return n8_consumed_by_addr_in_p (consumer, def_reg);
1284 1.1 mrg }
1285 1.1 mrg
1286 1.1 mrg bool
1287 1.1 mrg nds32_n8_last_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
1288 1.1 mrg {
1289 1.1 mrg /* If PRODUCER is a post-update LMW insn, the last micro-operation updates
1290 1.1 mrg the base register and the result is ready in EX stage, so we don't need
1291 1.1 mrg to handle that case in this guard function and the corresponding bypass
1292 1.1 mrg rule. */
1293 1.1 mrg if (post_update_insn_p (producer))
1294 1.1 mrg return false;
1295 1.1 mrg
1296 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1);
1297 1.1 mrg
1298 1.1 mrg if (last_def_reg == NULL_RTX)
1299 1.1 mrg return false;
1300 1.1 mrg
1301 1.1 mrg gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG);
1302 1.1 mrg
1303 1.1 mrg return n8_consumed_by_addr_in_p (consumer, last_def_reg);
1304 1.1 mrg }
1305 1.1 mrg
1306 1.1 mrg bool
1307 1.1 mrg nds32_n8_last_load_two_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
1308 1.1 mrg {
1309 1.1 mrg int index = -2;
1310 1.1 mrg
1311 1.1 mrg /* If PRODUCER is a post-update insn, there is an additional one micro-
1312 1.1 mrg operation inserted in the end, so the last memory access operation should
1313 1.1 mrg be handled by this guard function and the corresponding bypass rule. */
1314 1.1 mrg if (post_update_insn_p (producer))
1315 1.1 mrg index = -1;
1316 1.1 mrg
1317 1.1 mrg rtx last_two_def_reg = extract_nth_access_reg (producer, index);
1318 1.1 mrg
1319 1.1 mrg if (last_two_def_reg == NULL_RTX)
1320 1.1 mrg return false;
1321 1.1 mrg
1322 1.1 mrg gcc_assert (REG_P (last_two_def_reg)
1323 1.1 mrg || GET_CODE (last_two_def_reg) == SUBREG);
1324 1.1 mrg
1325 1.1 mrg return n8_consumed_by_addr_in_p (consumer, last_two_def_reg);
1326 1.1 mrg }
1327 1.1 mrg
1328 1.1 mrg bool
1329 1.1 mrg nds32_n8_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1330 1.1 mrg {
1331 1.1 mrg /* If PRODUCER is a post-update LMW insn, the last micro-operation updates
1332 1.1 mrg the base register and the result is ready in EX stage, so we don't need
1333 1.1 mrg to handle that case in this guard function and the corresponding bypass
1334 1.1 mrg rule. */
1335 1.1 mrg if (post_update_insn_p (producer))
1336 1.1 mrg return false;
1337 1.1 mrg
1338 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1);
1339 1.1 mrg
1340 1.1 mrg if (last_def_reg == NULL_RTX)
1341 1.1 mrg return false;
1342 1.1 mrg
1343 1.1 mrg gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG);
1344 1.1 mrg
1345 1.1 mrg return n8_consumed_by_ex_p (consumer, last_def_reg);
1346 1.1 mrg }
1347 1.1 mrg
1348 1.1 mrg /* Guard functions for E8 cores. */
1349 1.1 mrg
1350 1.1 mrg bool
1351 1.1 mrg nds32_e8_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
1352 1.1 mrg {
1353 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer));
1354 1.1 mrg
1355 1.1 mrg return e8_consumed_by_addr_in_p (consumer, def_reg);
1356 1.1 mrg }
1357 1.1 mrg
1358 1.1 mrg bool
1359 1.1 mrg nds32_e8_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1360 1.1 mrg {
1361 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer));
1362 1.1 mrg
1363 1.1 mrg return e8_consumed_by_ex_p (consumer, def_reg);
1364 1.1 mrg }
1365 1.1 mrg
1366 1.1 mrg bool
1367 1.1 mrg nds32_e8_ex_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
1368 1.1 mrg {
1369 1.1 mrg rtx def_reg;
1370 1.1 mrg
1371 1.1 mrg switch (get_attr_type (producer))
1372 1.1 mrg {
1373 1.1 mrg case TYPE_ALU:
1374 1.1 mrg /* No data hazards if AGEN's input is produced by MOVI or SETHI. */
1375 1.1 mrg if (GET_CODE (PATTERN (producer)) == SET)
1376 1.1 mrg {
1377 1.1 mrg rtx dest = SET_DEST (PATTERN (producer));
1378 1.1 mrg rtx src = SET_SRC (PATTERN (producer));
1379 1.1 mrg
1380 1.1 mrg if ((REG_P (dest) || GET_CODE (dest) == SUBREG)
1381 1.1 mrg && (GET_CODE (src) == CONST_INT || GET_CODE (src) == HIGH))
1382 1.1 mrg return false;
1383 1.1 mrg }
1384 1.1 mrg
1385 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1386 1.1 mrg break;
1387 1.1 mrg
1388 1.1 mrg case TYPE_MUL:
1389 1.1 mrg case TYPE_MAC:
1390 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1391 1.1 mrg break;
1392 1.1 mrg
1393 1.1 mrg case TYPE_DIV:
1394 1.1 mrg if (divmod_p (producer))
1395 1.1 mrg {
1396 1.1 mrg rtx def_reg1 = SET_DEST (parallel_element (producer, 0));
1397 1.1 mrg rtx def_reg2 = SET_DEST (parallel_element (producer, 1));
1398 1.1 mrg
1399 1.1 mrg return (e8_consumed_by_addr_in_p (consumer, def_reg1)
1400 1.1 mrg || e8_consumed_by_addr_in_p (consumer, def_reg2));
1401 1.1 mrg }
1402 1.1 mrg
1403 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1404 1.1 mrg break;
1405 1.1 mrg
1406 1.1 mrg case TYPE_LOAD:
1407 1.1 mrg case TYPE_STORE:
1408 1.1 mrg case TYPE_LOAD_MULTIPLE:
1409 1.1 mrg case TYPE_STORE_MULTIPLE:
1410 1.1 mrg if (!post_update_insn_p (producer))
1411 1.1 mrg return false;
1412 1.1 mrg
1413 1.1 mrg def_reg = extract_base_reg (producer);
1414 1.1 mrg break;
1415 1.1 mrg
1416 1.1 mrg default:
1417 1.1 mrg gcc_unreachable ();
1418 1.1 mrg }
1419 1.1 mrg
1420 1.1 mrg return e8_consumed_by_addr_in_p (consumer, def_reg);
1421 1.1 mrg }
1422 1.1 mrg
1423 1.1 mrg bool
1424 1.1 mrg nds32_e8_last_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
1425 1.1 mrg {
1426 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1);
1427 1.1 mrg
1428 1.1 mrg if (last_def_reg == NULL_RTX)
1429 1.1 mrg return false;
1430 1.1 mrg
1431 1.1 mrg gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG);
1432 1.1 mrg
1433 1.1 mrg return e8_consumed_by_addr_in_p (consumer, last_def_reg);
1434 1.1 mrg }
1435 1.1 mrg
1436 1.1 mrg bool
1437 1.1 mrg nds32_e8_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1438 1.1 mrg {
1439 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1);
1440 1.1 mrg
1441 1.1 mrg if (last_def_reg == NULL_RTX)
1442 1.1 mrg return false;
1443 1.1 mrg
1444 1.1 mrg gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG);
1445 1.1 mrg
1446 1.1 mrg return e8_consumed_by_ex_p (consumer, last_def_reg);
1447 1.1 mrg }
1448 1.1 mrg
1449 1.1 mrg /* Guard functions for N9 cores. */
1450 1.1 mrg
1451 1.1 mrg /* Check dependencies from MM to EX. */
1452 1.1 mrg bool
1453 1.1 mrg nds32_n9_2r1w_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1454 1.1 mrg {
1455 1.1 mrg rtx def_reg;
1456 1.1 mrg
1457 1.1 mrg switch (get_attr_type (producer))
1458 1.1 mrg {
1459 1.1 mrg /* LD_!bi */
1460 1.1 mrg case TYPE_LOAD:
1461 1.1 mrg if (post_update_insn_p (producer))
1462 1.1 mrg return false;
1463 1.1 mrg
1464 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1465 1.1 mrg break;
1466 1.1 mrg
1467 1.1 mrg case TYPE_MUL:
1468 1.1 mrg case TYPE_MAC:
1469 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1470 1.1 mrg break;
1471 1.1 mrg
1472 1.1 mrg default:
1473 1.1 mrg gcc_unreachable ();
1474 1.1 mrg }
1475 1.1 mrg
1476 1.1 mrg return n9_2r1w_consumed_by_ex_dep_p (consumer, def_reg);
1477 1.1 mrg }
1478 1.1 mrg
1479 1.1 mrg /* Check dependencies from MM to EX. */
1480 1.1 mrg bool
1481 1.1 mrg nds32_n9_3r2w_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1482 1.1 mrg {
1483 1.1 mrg rtx def_reg;
1484 1.1 mrg
1485 1.1 mrg switch (get_attr_type (producer))
1486 1.1 mrg {
1487 1.1 mrg case TYPE_LOAD:
1488 1.1 mrg case TYPE_MUL:
1489 1.1 mrg case TYPE_MAC:
1490 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1491 1.1 mrg break;
1492 1.1 mrg
1493 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two
1494 1.1 mrg results, the quotient and the remainder. We have to handle them
1495 1.1 mrg individually. */
1496 1.1 mrg case TYPE_DIV:
1497 1.1 mrg if (divmod_p (producer))
1498 1.1 mrg {
1499 1.1 mrg rtx def_reg1 = SET_DEST (parallel_element (producer, 0));
1500 1.1 mrg rtx def_reg2 = SET_DEST (parallel_element (producer, 1));
1501 1.1 mrg
1502 1.1 mrg return (n9_3r2w_consumed_by_ex_dep_p (consumer, def_reg1)
1503 1.1 mrg || n9_3r2w_consumed_by_ex_dep_p (consumer, def_reg2));
1504 1.1 mrg }
1505 1.1 mrg
1506 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1507 1.1 mrg break;
1508 1.1 mrg
1509 1.1 mrg default:
1510 1.1 mrg gcc_unreachable ();
1511 1.1 mrg }
1512 1.1 mrg
1513 1.1 mrg return n9_3r2w_consumed_by_ex_dep_p (consumer, def_reg);
1514 1.1 mrg }
1515 1.1 mrg
1516 1.1 mrg /* Check dependencies from LMW(N, N) to EX. */
1517 1.1 mrg bool
1518 1.1 mrg nds32_n9_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1519 1.1 mrg {
1520 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1);
1521 1.1 mrg
1522 1.1 mrg if (nds32_register_ports_config == REG_PORT_2R1W)
1523 1.1 mrg {
1524 1.1 mrg /* The base-update micro operation occupies the last cycle. */
1525 1.1 mrg if (post_update_insn_p (producer))
1526 1.1 mrg return false;
1527 1.1 mrg
1528 1.1 mrg /* When the base register is in the list of a load multiple insn and the
1529 1.1 mrg access order of the base register is not the last one, we need an
1530 1.1 mrg additional micro operation to commit the load result to the base
1531 1.1 mrg register -- we can treat the base register as the last defined
1532 1.1 mrg register. */
1533 1.1 mrg size_t i;
1534 1.1 mrg size_t n_elems = parallel_elements (producer);
1535 1.1 mrg rtx base_reg = extract_base_reg (producer);
1536 1.1 mrg
1537 1.1 mrg for (i = 0; i < n_elems; ++i)
1538 1.1 mrg {
1539 1.1 mrg rtx load_rtx = extract_nth_access_rtx (producer, i);
1540 1.1 mrg rtx list_element = SET_DEST (load_rtx);
1541 1.1 mrg
1542 1.1 mrg if (rtx_equal_p (base_reg, list_element) && i != n_elems - 1)
1543 1.1 mrg {
1544 1.1 mrg last_def_reg = base_reg;
1545 1.1 mrg break;
1546 1.1 mrg }
1547 1.1 mrg }
1548 1.1 mrg
1549 1.1 mrg return n9_2r1w_consumed_by_ex_dep_p (consumer, last_def_reg);
1550 1.1 mrg }
1551 1.1 mrg else
1552 1.1 mrg return n9_3r2w_consumed_by_ex_dep_p (consumer, last_def_reg);
1553 1.1 mrg }
1554 1.1 mrg
1555 1.1 mrg /* Guard functions for N10 cores. */
1556 1.1 mrg
1557 1.1 mrg /* Check dependencies from EX to EX (ADDR_OUT -> ADDR_IN). */
1558 1.1 mrg bool
1559 1.1 mrg nds32_n10_ex_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1560 1.1 mrg {
1561 1.1 mrg gcc_assert (get_attr_type (producer) == TYPE_FLOAD
1562 1.1 mrg || get_attr_type (producer) == TYPE_FSTORE);
1563 1.1 mrg gcc_assert (get_attr_type (consumer) == TYPE_FLOAD
1564 1.1 mrg || get_attr_type (consumer) == TYPE_FSTORE);
1565 1.1 mrg
1566 1.1 mrg if (!post_update_insn_p (producer))
1567 1.1 mrg return false;
1568 1.1 mrg
1569 1.1 mrg return reg_overlap_p (extract_base_reg (producer),
1570 1.1 mrg extract_mem_rtx (consumer));
1571 1.1 mrg }
1572 1.1 mrg
1573 1.1 mrg /* Check dependencies from MM to EX. */
1574 1.1 mrg bool
1575 1.1 mrg nds32_n10_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1576 1.1 mrg {
1577 1.1 mrg rtx def_reg;
1578 1.1 mrg
1579 1.1 mrg switch (get_attr_type (producer))
1580 1.1 mrg {
1581 1.1 mrg case TYPE_LOAD:
1582 1.1 mrg case TYPE_MUL:
1583 1.1 mrg case TYPE_MAC:
1584 1.1 mrg case TYPE_DALU64:
1585 1.1 mrg case TYPE_DMUL:
1586 1.1 mrg case TYPE_DMAC:
1587 1.1 mrg case TYPE_DALUROUND:
1588 1.1 mrg case TYPE_DBPICK:
1589 1.1 mrg case TYPE_DWEXT:
1590 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1591 1.1 mrg break;
1592 1.1 mrg
1593 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two
1594 1.1 mrg results, the quotient and the remainder. We have to handle them
1595 1.1 mrg individually. */
1596 1.1 mrg case TYPE_DIV:
1597 1.1 mrg if (divmod_p (producer))
1598 1.1 mrg {
1599 1.1 mrg rtx def_reg1 = SET_DEST (parallel_element (producer, 0));
1600 1.1 mrg rtx def_reg2 = SET_DEST (parallel_element (producer, 1));
1601 1.1 mrg
1602 1.1 mrg return (n10_consumed_by_ex_dep_p (consumer, def_reg1)
1603 1.1 mrg || n10_consumed_by_ex_dep_p (consumer, def_reg2));
1604 1.1 mrg }
1605 1.1 mrg
1606 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1607 1.1 mrg break;
1608 1.1 mrg
1609 1.1 mrg default:
1610 1.1 mrg gcc_unreachable ();
1611 1.1 mrg }
1612 1.1 mrg
1613 1.1 mrg return n10_consumed_by_ex_dep_p (consumer, def_reg);
1614 1.1 mrg }
1615 1.1 mrg
1616 1.1 mrg /* Check dependencies from LMW(N, N) to EX. */
1617 1.1 mrg bool
1618 1.1 mrg nds32_n10_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1619 1.1 mrg {
1620 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1);
1621 1.1 mrg
1622 1.1 mrg return n10_consumed_by_ex_dep_p (consumer, last_def_reg);
1623 1.1 mrg }
1624 1.1 mrg
1625 1.1 mrg /* Guard functions for Graywolf cores. */
1626 1.1 mrg
1627 1.1 mrg /* Check dependencies from EX to EX (ADDR_OUT -> ADDR_IN). */
1628 1.1 mrg bool
1629 1.1 mrg nds32_gw_ex_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1630 1.1 mrg {
1631 1.1 mrg return nds32_n10_ex_to_ex_p (producer, consumer);
1632 1.1 mrg }
1633 1.1 mrg
1634 1.1 mrg /* Check dependencies from MM to EX. */
1635 1.1 mrg bool
1636 1.1 mrg nds32_gw_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1637 1.1 mrg {
1638 1.1 mrg rtx def_reg;
1639 1.1 mrg
1640 1.1 mrg switch (get_attr_type (producer))
1641 1.1 mrg {
1642 1.1 mrg case TYPE_LOAD:
1643 1.1 mrg case TYPE_MUL:
1644 1.1 mrg case TYPE_MAC:
1645 1.1 mrg case TYPE_DALU64:
1646 1.1 mrg case TYPE_DMUL:
1647 1.1 mrg case TYPE_DMAC:
1648 1.1 mrg case TYPE_DALUROUND:
1649 1.1 mrg case TYPE_DBPICK:
1650 1.1 mrg case TYPE_DWEXT:
1651 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1652 1.1 mrg break;
1653 1.1 mrg
1654 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two
1655 1.1 mrg results, the quotient and the remainder. We have to handle them
1656 1.1 mrg individually. */
1657 1.1 mrg case TYPE_DIV:
1658 1.1 mrg if (divmod_p (producer))
1659 1.1 mrg {
1660 1.1 mrg rtx def_reg1 = SET_DEST (parallel_element (producer, 0));
1661 1.1 mrg rtx def_reg2 = SET_DEST (parallel_element (producer, 1));
1662 1.1 mrg
1663 1.1 mrg return (gw_consumed_by_ex_dep_p (consumer, def_reg1)
1664 1.1 mrg || gw_consumed_by_ex_dep_p (consumer, def_reg2));
1665 1.1 mrg }
1666 1.1 mrg
1667 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1668 1.1 mrg break;
1669 1.1 mrg
1670 1.1 mrg default:
1671 1.1 mrg gcc_unreachable ();
1672 1.1 mrg }
1673 1.1 mrg
1674 1.1 mrg return gw_consumed_by_ex_dep_p (consumer, def_reg);
1675 1.1 mrg }
1676 1.1 mrg
1677 1.1 mrg /* Check dependencies from LMW(N, N) to EX. */
1678 1.1 mrg bool
1679 1.1 mrg nds32_gw_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
1680 1.1 mrg {
1681 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1);
1682 1.1 mrg
1683 1.1 mrg return gw_consumed_by_ex_dep_p (consumer, last_def_reg);
1684 1.1 mrg }
1685 1.1 mrg
1686 1.1 mrg /* Guard functions for N12/N13 cores. */
1687 1.1 mrg
1688 1.1 mrg /* Check dependencies from E2 to E1. */
1689 1.1 mrg bool
1690 1.1 mrg nds32_n13_e2_to_e1_p (rtx_insn *producer, rtx_insn *consumer)
1691 1.1 mrg {
1692 1.1 mrg rtx def_reg;
1693 1.1 mrg
1694 1.1 mrg switch (get_attr_type (producer))
1695 1.1 mrg {
1696 1.1 mrg /* Only post-update load/store instructions are considered. These
1697 1.1 mrg instructions produces address output at E2. */
1698 1.1 mrg case TYPE_LOAD:
1699 1.1 mrg case TYPE_STORE:
1700 1.1 mrg case TYPE_LOAD_MULTIPLE:
1701 1.1 mrg case TYPE_STORE_MULTIPLE:
1702 1.1 mrg if (!post_update_insn_p (producer))
1703 1.1 mrg return false;
1704 1.1 mrg
1705 1.1 mrg def_reg = extract_base_reg (producer);
1706 1.1 mrg break;
1707 1.1 mrg
1708 1.1 mrg case TYPE_ALU:
1709 1.1 mrg case TYPE_ALU_SHIFT:
1710 1.1 mrg case TYPE_PBSAD:
1711 1.1 mrg case TYPE_PBSADA:
1712 1.1 mrg case TYPE_MUL:
1713 1.1 mrg case TYPE_MAC:
1714 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1715 1.1 mrg break;
1716 1.1 mrg
1717 1.1 mrg case TYPE_BRANCH:
1718 1.1 mrg return true;
1719 1.1 mrg
1720 1.1 mrg case TYPE_DIV:
1721 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two
1722 1.1 mrg results, the quotient and the remainder. We have to handle them
1723 1.1 mrg individually. */
1724 1.1 mrg if (divmod_p (producer))
1725 1.1 mrg {
1726 1.1 mrg rtx def_reg1 = SET_DEST (parallel_element (producer, 0));
1727 1.1 mrg rtx def_reg2 = SET_DEST (parallel_element (producer, 1));
1728 1.1 mrg
1729 1.1 mrg return (n13_consumed_by_e1_dep_p (consumer, def_reg1)
1730 1.1 mrg || n13_consumed_by_e1_dep_p (consumer, def_reg2));
1731 1.1 mrg }
1732 1.1 mrg
1733 1.1 mrg def_reg = SET_DEST (PATTERN (producer));
1734 1.1 mrg break;
1735 1.1 mrg
1736 1.1 mrg default:
1737 1.1 mrg gcc_unreachable ();
1738 1.1 mrg }
1739 1.1 mrg
1740 1.1 mrg return n13_consumed_by_e1_dep_p (consumer, def_reg);
1741 1.1 mrg }
1742 1.1 mrg
1743 1.1 mrg /* Check dependencies from Load-Store Unit (E3) to E1. */
1744 1.1 mrg bool
1745 1.1 mrg nds32_n13_load_to_e1_p (rtx_insn *producer, rtx_insn *consumer)
1746 1.1 mrg {
1747 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer));
1748 1.1 mrg
1749 1.1 mrg gcc_assert (get_attr_type (producer) == TYPE_LOAD);
1750 1.1 mrg gcc_assert (REG_P (def_reg) || GET_CODE (def_reg) == SUBREG);
1751 1.1 mrg
1752 1.1 mrg return n13_consumed_by_e1_dep_p (consumer, def_reg);
1753 1.1 mrg }
1754 1.1 mrg
1755 1.1 mrg /* Check dependencies from Load-Store Unit (E3) to E2. */
1756 1.1 mrg bool
1757 1.1 mrg nds32_n13_load_to_e2_p (rtx_insn *producer, rtx_insn *consumer)
1758 1.1 mrg {
1759 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer));
1760 1.1 mrg
1761 1.1 mrg gcc_assert (get_attr_type (producer) == TYPE_LOAD);
1762 1.1 mrg gcc_assert (REG_P (def_reg) || GET_CODE (def_reg) == SUBREG);
1763 1.1 mrg
1764 1.1 mrg return n13_consumed_by_e2_dep_p (consumer, def_reg);
1765 1.1 mrg }
1766 1.1 mrg
1767 1.1 mrg /* Check dependencies from LMW(N, N) to E1. */
1768 1.1 mrg bool
1769 1.1 mrg nds32_n13_last_load_to_e1_p (rtx_insn *producer, rtx_insn *consumer)
1770 1.1 mrg {
1771 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1);
1772 1.1 mrg
1773 1.1 mrg return n13_consumed_by_e1_dep_p (consumer, last_def_reg);
1774 1.1 mrg }
1775 1.1 mrg
1776 1.1 mrg /* Check dependencies from LMW(N, N) to E2. */
1777 1.1 mrg bool
1778 1.1 mrg nds32_n13_last_load_to_e2_p (rtx_insn *producer, rtx_insn *consumer)
1779 1.1 mrg {
1780 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1);
1781 1.1 mrg
1782 1.1 mrg return n13_consumed_by_e2_dep_p (consumer, last_def_reg);
1783 1.1 mrg }
1784 1.1 mrg
1785 1.1 mrg /* Check dependencies from LMW(N, N-1) to E2. */
1786 1.1 mrg bool
1787 1.1 mrg nds32_n13_last_two_load_to_e1_p (rtx_insn *producer, rtx_insn *consumer)
1788 1.1 mrg {
1789 1.1 mrg rtx last_two_def_reg = extract_nth_access_reg (producer, -2);
1790 1.1 mrg
1791 1.1 mrg if (last_two_def_reg == NULL_RTX)
1792 1.1 mrg return false;
1793 1.1 mrg
1794 1.1 mrg return n13_consumed_by_e1_dep_p (consumer, last_two_def_reg);
1795 1.1 mrg }
1796 1.1 mrg /* ------------------------------------------------------------------------ */
1797