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