]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/frv/predicates.md
Update Copyright years for files modified in 2011 and/or 2012.
[thirdparty/gcc.git] / gcc / config / frv / predicates.md
CommitLineData
52ba7179 1;; Predicate definitions for Frv.
71e45bc2 2;; Copyright (C) 2005, 2007, 2010, 2011 Free Software Foundation, Inc.
52ba7179 3;;
4;; This file is part of GCC.
5;;
6;; GCC is free software; you can redistribute it and/or modify
7;; it under the terms of the GNU General Public License as published by
038d1e19 8;; the Free Software Foundation; either version 3, or (at your option)
52ba7179 9;; any later version.
10;;
11;; GCC is distributed in the hope that it will be useful,
12;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14;; GNU General Public License for more details.
15;;
16;; You should have received a copy of the GNU General Public License
038d1e19 17;; along with GCC; see the file COPYING3. If not see
18;; <http://www.gnu.org/licenses/>.
52ba7179 19
20;; Return true if operand is a GPR register.
21
22(define_predicate "integer_register_operand"
23 (match_code "reg,subreg")
24{
25 if (GET_MODE (op) != mode && mode != VOIDmode)
26 return FALSE;
27
28 if (GET_CODE (op) == SUBREG)
29 {
30 if (GET_CODE (SUBREG_REG (op)) != REG)
31 return register_operand (op, mode);
32
33 op = SUBREG_REG (op);
34 }
35
36 if (GET_CODE (op) != REG)
37 return FALSE;
38
d6a1433e 39 return GPR_AP_OR_PSEUDO_P (REGNO (op));
52ba7179 40})
41
42;; Return 1 is OP is a memory operand, or will be turned into one by
43;; reload.
44
45(define_predicate "frv_load_operand"
46 (match_code "reg,subreg,mem")
47{
48 if (GET_MODE (op) != mode && mode != VOIDmode)
49 return FALSE;
50
51 if (reload_in_progress)
52 {
53 rtx tmp = op;
54 if (GET_CODE (tmp) == SUBREG)
55 tmp = SUBREG_REG (tmp);
56 if (GET_CODE (tmp) == REG
57 && REGNO (tmp) >= FIRST_PSEUDO_REGISTER)
1c654ff1 58 op = reg_equiv_memory_loc (REGNO (tmp));
52ba7179 59 }
60
61 return op && memory_operand (op, mode);
62})
63
64;; Return true if operand is a GPR register. Do not allow SUBREG's
65;; here, in order to prevent a combine bug.
66
67(define_predicate "gpr_no_subreg_operand"
68 (match_code "reg")
69{
70 if (GET_MODE (op) != mode && mode != VOIDmode)
71 return FALSE;
72
73 if (GET_CODE (op) != REG)
74 return FALSE;
75
76 return GPR_OR_PSEUDO_P (REGNO (op));
77})
78
79;; Return 1 if operand is a GPR register or a FPR register.
80
81(define_predicate "gpr_or_fpr_operand"
82 (match_code "reg,subreg")
83{
84 int regno;
85
86 if (GET_MODE (op) != mode && mode != VOIDmode)
87 return FALSE;
88
89 if (GET_CODE (op) == SUBREG)
90 {
91 if (GET_CODE (SUBREG_REG (op)) != REG)
92 return register_operand (op, mode);
93
94 op = SUBREG_REG (op);
95 }
96
97 if (GET_CODE (op) != REG)
98 return FALSE;
99
100 regno = REGNO (op);
101 if (GPR_P (regno) || FPR_P (regno) || regno >= FIRST_PSEUDO_REGISTER)
102 return TRUE;
103
104 return FALSE;
105})
106
5f858eac 107;; Return 1 if operand is a GPR register or 12-bit signed immediate.
52ba7179 108
109(define_predicate "gpr_or_int12_operand"
110 (match_code "reg,subreg,const_int,const")
111{
112 if (GET_CODE (op) == CONST_INT)
0c000b75 113 return IN_RANGE (INTVAL (op), -2048, 2047);
52ba7179 114
115 if (got12_operand (op, mode))
116 return true;
117
118 if (GET_MODE (op) != mode && mode != VOIDmode)
119 return FALSE;
120
121 if (GET_CODE (op) == SUBREG)
122 {
123 if (GET_CODE (SUBREG_REG (op)) != REG)
124 return register_operand (op, mode);
125
126 op = SUBREG_REG (op);
127 }
128
129 if (GET_CODE (op) != REG)
130 return FALSE;
131
132 return GPR_OR_PSEUDO_P (REGNO (op));
133})
134
135;; Return 1 if operand is a GPR register, or a FPR register, or a 12
136;; bit signed immediate.
137
138(define_predicate "gpr_fpr_or_int12_operand"
139 (match_code "reg,subreg,const_int")
140{
141 int regno;
142
143 if (GET_CODE (op) == CONST_INT)
0c000b75 144 return IN_RANGE (INTVAL (op), -2048, 2047);
52ba7179 145
146 if (GET_MODE (op) != mode && mode != VOIDmode)
147 return FALSE;
148
149 if (GET_CODE (op) == SUBREG)
150 {
151 if (GET_CODE (SUBREG_REG (op)) != REG)
152 return register_operand (op, mode);
153
154 op = SUBREG_REG (op);
155 }
156
157 if (GET_CODE (op) != REG)
158 return FALSE;
159
160 regno = REGNO (op);
161 if (GPR_P (regno) || FPR_P (regno) || regno >= FIRST_PSEUDO_REGISTER)
162 return TRUE;
163
164 return FALSE;
165})
166
5f858eac 167;; Return 1 if operand is a register or 10-bit signed immediate.
52ba7179 168
169(define_predicate "gpr_or_int10_operand"
170 (match_code "reg,subreg,const_int")
171{
172 if (GET_CODE (op) == CONST_INT)
0c000b75 173 return IN_RANGE (INTVAL (op), -512, 511);
52ba7179 174
175 if (GET_MODE (op) != mode && mode != VOIDmode)
176 return FALSE;
177
178 if (GET_CODE (op) == SUBREG)
179 {
180 if (GET_CODE (SUBREG_REG (op)) != REG)
181 return register_operand (op, mode);
182
183 op = SUBREG_REG (op);
184 }
185
186 if (GET_CODE (op) != REG)
187 return FALSE;
188
189 return GPR_OR_PSEUDO_P (REGNO (op));
190})
191
192;; Return 1 if operand is a register or an integer immediate.
193
194(define_predicate "gpr_or_int_operand"
195 (match_code "reg,subreg,const_int")
196{
197 if (GET_CODE (op) == CONST_INT)
198 return TRUE;
199
200 if (GET_MODE (op) != mode && mode != VOIDmode)
201 return FALSE;
202
203 if (GET_CODE (op) == SUBREG)
204 {
205 if (GET_CODE (SUBREG_REG (op)) != REG)
206 return register_operand (op, mode);
207
208 op = SUBREG_REG (op);
209 }
210
211 if (GET_CODE (op) != REG)
212 return FALSE;
213
214 return GPR_OR_PSEUDO_P (REGNO (op));
215})
216
217;; Return true if operand is something that can be an input for a move
218;; operation.
219
220(define_predicate "move_source_operand"
221 (match_code "reg,subreg,const_int,mem,const_double,const,symbol_ref,label_ref")
222{
223 rtx subreg;
224 enum rtx_code code;
225
226 switch (GET_CODE (op))
227 {
228 default:
229 break;
230
231 case CONST_INT:
232 case CONST_DOUBLE:
233 return immediate_operand (op, mode);
234
235 case SUBREG:
236 if (GET_MODE (op) != mode && mode != VOIDmode)
237 return FALSE;
238
239 subreg = SUBREG_REG (op);
240 code = GET_CODE (subreg);
241 if (code == MEM)
fd50b071 242 return frv_legitimate_address_p_1 (mode, XEXP (subreg, 0),
243 reload_completed, FALSE, FALSE);
52ba7179 244
245 return (code == REG);
246
247 case REG:
248 if (GET_MODE (op) != mode && mode != VOIDmode)
249 return FALSE;
250
251 return TRUE;
252
253 case MEM:
254 return frv_legitimate_memory_operand (op, mode, FALSE);
255 }
256
257 return FALSE;
258})
259
260;; Return true if operand is something that can be an output for a
261;; move operation.
262
263(define_predicate "move_destination_operand"
264 (match_code "reg,subreg,mem")
265{
266 rtx subreg;
267 enum rtx_code code;
268
269 switch (GET_CODE (op))
270 {
271 default:
272 break;
273
274 case SUBREG:
275 if (GET_MODE (op) != mode && mode != VOIDmode)
276 return FALSE;
277
278 subreg = SUBREG_REG (op);
279 code = GET_CODE (subreg);
280 if (code == MEM)
fd50b071 281 return frv_legitimate_address_p_1 (mode, XEXP (subreg, 0),
282 reload_completed, FALSE, FALSE);
52ba7179 283
284 return (code == REG);
285
286 case REG:
287 if (GET_MODE (op) != mode && mode != VOIDmode)
288 return FALSE;
289
290 return TRUE;
291
292 case MEM:
293 return frv_legitimate_memory_operand (op, mode, FALSE);
294 }
295
296 return FALSE;
297})
298
299;; Return true if we the operand is a valid destination for a movcc_fp
300;; instruction. This means rejecting fcc_operands, since we need
301;; scratch registers to write to them.
302
303(define_predicate "movcc_fp_destination_operand"
304 (match_code "reg,subreg,mem")
305{
306 if (fcc_operand (op, mode))
307 return FALSE;
308
309 return move_destination_operand (op, mode);
310})
311
312;; Return true if operand is something that can be an input for a
313;; conditional move operation.
314
315(define_predicate "condexec_source_operand"
316 (match_code "reg,subreg,const_int,mem,const_double")
317{
318 rtx subreg;
319 enum rtx_code code;
320
321 switch (GET_CODE (op))
322 {
323 default:
324 break;
325
326 case CONST_INT:
327 case CONST_DOUBLE:
328 return ZERO_P (op);
329
330 case SUBREG:
331 if (GET_MODE (op) != mode && mode != VOIDmode)
332 return FALSE;
333
334 subreg = SUBREG_REG (op);
335 code = GET_CODE (subreg);
336 if (code == MEM)
fd50b071 337 return frv_legitimate_address_p_1 (mode, XEXP (subreg, 0),
338 reload_completed, TRUE, FALSE);
52ba7179 339
340 return (code == REG);
341
342 case REG:
343 if (GET_MODE (op) != mode && mode != VOIDmode)
344 return FALSE;
345
346 return TRUE;
347
348 case MEM:
349 return frv_legitimate_memory_operand (op, mode, TRUE);
350 }
351
352 return FALSE;
353})
354
355;; Return true if operand is something that can be an output for a
356;; conditional move operation.
357
358(define_predicate "condexec_dest_operand"
359 (match_code "reg,subreg,mem")
360{
361 rtx subreg;
362 enum rtx_code code;
363
364 switch (GET_CODE (op))
365 {
366 default:
367 break;
368
369 case SUBREG:
370 if (GET_MODE (op) != mode && mode != VOIDmode)
371 return FALSE;
372
373 subreg = SUBREG_REG (op);
374 code = GET_CODE (subreg);
375 if (code == MEM)
fd50b071 376 return frv_legitimate_address_p_1 (mode, XEXP (subreg, 0),
377 reload_completed, TRUE, FALSE);
52ba7179 378
379 return (code == REG);
380
381 case REG:
382 if (GET_MODE (op) != mode && mode != VOIDmode)
383 return FALSE;
384
385 return TRUE;
386
387 case MEM:
388 return frv_legitimate_memory_operand (op, mode, TRUE);
389 }
390
391 return FALSE;
392})
393
394;; Return true if operand is a register of any flavor or a 0 of the
395;; appropriate type.
396
397(define_predicate "reg_or_0_operand"
85eb3cd7 398 (match_code "reg,subreg,const_int,const_double")
52ba7179 399{
400 switch (GET_CODE (op))
401 {
402 default:
403 break;
404
405 case REG:
406 case SUBREG:
407 if (GET_MODE (op) != mode && mode != VOIDmode)
408 return FALSE;
409
410 return register_operand (op, mode);
411
412 case CONST_INT:
413 case CONST_DOUBLE:
414 return ZERO_P (op);
415 }
416
417 return FALSE;
418})
419
420;; Return true if operand is the link register.
421
422(define_predicate "lr_operand"
423 (match_code "reg")
424{
425 if (GET_CODE (op) != REG)
426 return FALSE;
427
428 if (GET_MODE (op) != mode && mode != VOIDmode)
429 return FALSE;
430
431 if (REGNO (op) != LR_REGNO && REGNO (op) < FIRST_PSEUDO_REGISTER)
432 return FALSE;
433
434 return TRUE;
435})
436
437;; Return true if operand is a gpr register or a valid memory operand.
438
439(define_predicate "gpr_or_memory_operand"
440 (match_code "reg,subreg,mem")
441{
442 return (integer_register_operand (op, mode)
443 || frv_legitimate_memory_operand (op, mode, FALSE));
444})
445
446;; Return true if operand is a gpr register, a valid memory operand,
447;; or a memory operand that can be made valid using an additional gpr
448;; register.
449
450(define_predicate "gpr_or_memory_operand_with_scratch"
451 (match_code "reg,subreg,mem")
452{
453 rtx addr;
454
455 if (gpr_or_memory_operand (op, mode))
456 return TRUE;
457
458 if (GET_CODE (op) != MEM)
459 return FALSE;
460
461 if (GET_MODE (op) != mode)
462 return FALSE;
463
464 addr = XEXP (op, 0);
465
466 if (GET_CODE (addr) != PLUS)
467 return FALSE;
468
469 if (!integer_register_operand (XEXP (addr, 0), Pmode))
470 return FALSE;
471
472 if (GET_CODE (XEXP (addr, 1)) != CONST_INT)
473 return FALSE;
474
475 return TRUE;
476})
477
478;; Return true if operand is a fpr register or a valid memory
479;; operation.
480
481(define_predicate "fpr_or_memory_operand"
482 (match_code "reg,subreg,mem")
483{
484 return (fpr_operand (op, mode)
485 || frv_legitimate_memory_operand (op, mode, FALSE));
486})
487
5f858eac 488;; Return 1 if operand is a 12-bit signed immediate.
52ba7179 489
490(define_predicate "int12_operand"
491 (match_code "const_int")
492{
493 if (GET_CODE (op) != CONST_INT)
494 return FALSE;
495
0c000b75 496 return IN_RANGE (INTVAL (op), -2048, 2047);
52ba7179 497})
498
499;; Return 1 if operand is an integer constant that takes 2
500;; instructions to load up and can be split into sethi/setlo
501;; instructions..
502
503(define_predicate "int_2word_operand"
504 (match_code "const_int,const_double,symbol_ref,label_ref,const")
505{
506 HOST_WIDE_INT value;
507 REAL_VALUE_TYPE rv;
508 long l;
509
510 switch (GET_CODE (op))
511 {
512 default:
513 break;
514
515 case LABEL_REF:
516 if (TARGET_FDPIC)
517 return FALSE;
518
519 return (flag_pic == 0);
520
521 case CONST:
522 if (flag_pic || TARGET_FDPIC)
523 return FALSE;
524
525 op = XEXP (op, 0);
526 if (GET_CODE (op) == PLUS && GET_CODE (XEXP (op, 1)) == CONST_INT)
527 op = XEXP (op, 0);
528 return GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF;
529
530 case SYMBOL_REF:
531 if (TARGET_FDPIC)
532 return FALSE;
533
534 /* small data references are already 1 word */
535 return (flag_pic == 0) && (! SYMBOL_REF_SMALL_P (op));
536
537 case CONST_INT:
0c000b75 538 return ! IN_RANGE (INTVAL (op), -32768, 32767);
52ba7179 539
540 case CONST_DOUBLE:
541 if (GET_MODE (op) == SFmode)
542 {
543 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
544 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
545 value = l;
0c000b75 546 return ! IN_RANGE (value, -32768, 32767);
52ba7179 547 }
548 else if (GET_MODE (op) == VOIDmode)
549 {
550 value = CONST_DOUBLE_LOW (op);
0c000b75 551 return ! IN_RANGE (value, -32768, 32767);
52ba7179 552 }
553 break;
554 }
555
556 return FALSE;
557})
558
559;; Return true if operand is the uClinux PIC register.
560
561(define_predicate "fdpic_operand"
562 (match_code "reg")
563{
564 if (!TARGET_FDPIC)
565 return FALSE;
566
567 if (GET_CODE (op) != REG)
568 return FALSE;
569
570 if (GET_MODE (op) != mode && mode != VOIDmode)
571 return FALSE;
572
573 if (REGNO (op) != FDPIC_REGNO && REGNO (op) < FIRST_PSEUDO_REGISTER)
574 return FALSE;
575
576 return TRUE;
577})
578
579;; TODO: Add a comment here.
580
581(define_predicate "fdpic_fptr_operand"
582 (match_code "reg")
583{
584 if (GET_MODE (op) != mode && mode != VOIDmode)
585 return FALSE;
586 if (GET_CODE (op) != REG)
587 return FALSE;
588 if (REGNO (op) != FDPIC_FPTR_REGNO && REGNO (op) < FIRST_PSEUDO_REGISTER)
589 return FALSE;
590 return TRUE;
591})
592
593;; An address operand that may use a pair of registers, an addressing
594;; mode that we reject in general.
595
596(define_predicate "ldd_address_operand"
597 (match_code "reg,subreg,plus")
598{
599 if (GET_MODE (op) != mode && GET_MODE (op) != VOIDmode)
600 return FALSE;
601
fd50b071 602 return frv_legitimate_address_p_1 (DImode, op, reload_completed, FALSE, TRUE);
52ba7179 603})
604
605;; TODO: Add a comment here.
606
607(define_predicate "got12_operand"
608 (match_code "const")
609{
610 struct frv_unspec unspec;
611
612 if (frv_const_unspec_p (op, &unspec))
613 switch (unspec.reloc)
614 {
615 case R_FRV_GOT12:
616 case R_FRV_GOTOFF12:
617 case R_FRV_FUNCDESC_GOT12:
618 case R_FRV_FUNCDESC_GOTOFF12:
619 case R_FRV_GPREL12:
620 case R_FRV_TLSMOFF12:
621 return true;
622 }
623 return false;
624})
625
626;; Return true if OP is a valid const-unspec expression.
627
628(define_predicate "const_unspec_operand"
629 (match_code "const")
630{
631 struct frv_unspec unspec;
632
633 return frv_const_unspec_p (op, &unspec);
634})
635
636;; Return true if operand is an icc register.
637
638(define_predicate "icc_operand"
639 (match_code "reg")
640{
641 int regno;
642
643 if (GET_MODE (op) != mode && mode != VOIDmode)
644 return FALSE;
645
646 if (GET_CODE (op) != REG)
647 return FALSE;
648
649 regno = REGNO (op);
650 return ICC_OR_PSEUDO_P (regno);
651})
652
653;; Return true if operand is an fcc register.
654
655(define_predicate "fcc_operand"
656 (match_code "reg")
657{
658 int regno;
659
660 if (GET_MODE (op) != mode && mode != VOIDmode)
661 return FALSE;
662
663 if (GET_CODE (op) != REG)
664 return FALSE;
665
666 regno = REGNO (op);
667 return FCC_OR_PSEUDO_P (regno);
668})
669
670;; Return true if operand is either an fcc or icc register.
671
672(define_predicate "cc_operand"
673 (match_code "reg")
674{
675 int regno;
676
677 if (GET_MODE (op) != mode && mode != VOIDmode)
678 return FALSE;
679
680 if (GET_CODE (op) != REG)
681 return FALSE;
682
683 regno = REGNO (op);
684 if (CC_OR_PSEUDO_P (regno))
685 return TRUE;
686
687 return FALSE;
688})
689
690;; Return true if operand is an integer CCR register.
691
692(define_predicate "icr_operand"
693 (match_code "reg")
694{
695 int regno;
696
697 if (GET_MODE (op) != mode && mode != VOIDmode)
698 return FALSE;
699
700 if (GET_CODE (op) != REG)
701 return FALSE;
702
703 regno = REGNO (op);
704 return ICR_OR_PSEUDO_P (regno);
705})
706
707;; Return true if operand is an fcc register.
708
709(define_predicate "fcr_operand"
710 (match_code "reg")
711{
712 int regno;
713
714 if (GET_MODE (op) != mode && mode != VOIDmode)
715 return FALSE;
716
717 if (GET_CODE (op) != REG)
718 return FALSE;
719
720 regno = REGNO (op);
721 return FCR_OR_PSEUDO_P (regno);
722})
723
724;; Return true if operand is either an fcc or icc register.
725
726(define_predicate "cr_operand"
727 (match_code "reg")
728{
729 int regno;
730
731 if (GET_MODE (op) != mode && mode != VOIDmode)
732 return FALSE;
733
734 if (GET_CODE (op) != REG)
735 return FALSE;
736
737 regno = REGNO (op);
738 if (CR_OR_PSEUDO_P (regno))
739 return TRUE;
740
741 return FALSE;
742})
743
744;; Return true if operand is a FPR register.
745
746(define_predicate "fpr_operand"
747 (match_code "reg,subreg")
748{
749 if (GET_MODE (op) != mode && mode != VOIDmode)
750 return FALSE;
751
752 if (GET_CODE (op) == SUBREG)
753 {
754 if (GET_CODE (SUBREG_REG (op)) != REG)
755 return register_operand (op, mode);
756
757 op = SUBREG_REG (op);
758 }
759
760 if (GET_CODE (op) != REG)
761 return FALSE;
762
763 return FPR_OR_PSEUDO_P (REGNO (op));
764})
765
766;; Return true if operand is an even GPR or FPR register.
767
768(define_predicate "even_reg_operand"
769 (match_code "reg,subreg")
770{
771 int regno;
772
773 if (GET_MODE (op) != mode && mode != VOIDmode)
774 return FALSE;
775
776 if (GET_CODE (op) == SUBREG)
777 {
778 if (GET_CODE (SUBREG_REG (op)) != REG)
779 return register_operand (op, mode);
780
781 op = SUBREG_REG (op);
782 }
783
784 if (GET_CODE (op) != REG)
785 return FALSE;
786
787 regno = REGNO (op);
788 if (regno >= FIRST_PSEUDO_REGISTER)
789 return TRUE;
790
791 if (GPR_P (regno))
792 return (((regno - GPR_FIRST) & 1) == 0);
793
794 if (FPR_P (regno))
795 return (((regno - FPR_FIRST) & 1) == 0);
796
797 return FALSE;
798})
799
800;; Return true if operand is an odd GPR register.
801
802(define_predicate "odd_reg_operand"
803 (match_code "reg,subreg")
804{
805 int regno;
806
807 if (GET_MODE (op) != mode && mode != VOIDmode)
808 return FALSE;
809
810 if (GET_CODE (op) == SUBREG)
811 {
812 if (GET_CODE (SUBREG_REG (op)) != REG)
813 return register_operand (op, mode);
814
815 op = SUBREG_REG (op);
816 }
817
818 if (GET_CODE (op) != REG)
819 return FALSE;
820
821 regno = REGNO (op);
822 /* Assume that reload will give us an even register. */
823 if (regno >= FIRST_PSEUDO_REGISTER)
824 return FALSE;
825
826 if (GPR_P (regno))
827 return (((regno - GPR_FIRST) & 1) != 0);
828
829 if (FPR_P (regno))
830 return (((regno - FPR_FIRST) & 1) != 0);
831
832 return FALSE;
833})
834
835;; Return true if operand is an even GPR register.
836
837(define_predicate "even_gpr_operand"
838 (match_code "reg,subreg")
839{
840 int regno;
841
842 if (GET_MODE (op) != mode && mode != VOIDmode)
843 return FALSE;
844
845 if (GET_CODE (op) == SUBREG)
846 {
847 if (GET_CODE (SUBREG_REG (op)) != REG)
848 return register_operand (op, mode);
849
850 op = SUBREG_REG (op);
851 }
852
853 if (GET_CODE (op) != REG)
854 return FALSE;
855
856 regno = REGNO (op);
857 if (regno >= FIRST_PSEUDO_REGISTER)
858 return TRUE;
859
860 if (! GPR_P (regno))
861 return FALSE;
862
863 return (((regno - GPR_FIRST) & 1) == 0);
864})
865
866;; Return true if operand is an odd GPR register.
867
868(define_predicate "odd_gpr_operand"
869 (match_code "reg,subreg")
870{
871 int regno;
872
873 if (GET_MODE (op) != mode && mode != VOIDmode)
874 return FALSE;
875
876 if (GET_CODE (op) == SUBREG)
877 {
878 if (GET_CODE (SUBREG_REG (op)) != REG)
879 return register_operand (op, mode);
880
881 op = SUBREG_REG (op);
882 }
883
884 if (GET_CODE (op) != REG)
885 return FALSE;
886
887 regno = REGNO (op);
888 /* Assume that reload will give us an even register. */
889 if (regno >= FIRST_PSEUDO_REGISTER)
890 return FALSE;
891
892 if (! GPR_P (regno))
893 return FALSE;
894
895 return (((regno - GPR_FIRST) & 1) != 0);
896})
897
898;; Return true if operand is a quad aligned FPR register.
899
900(define_predicate "quad_fpr_operand"
901 (match_code "reg,subreg")
902{
903 int regno;
904
905 if (GET_MODE (op) != mode && mode != VOIDmode)
906 return FALSE;
907
908 if (GET_CODE (op) == SUBREG)
909 {
910 if (GET_CODE (SUBREG_REG (op)) != REG)
911 return register_operand (op, mode);
912
913 op = SUBREG_REG (op);
914 }
915
916 if (GET_CODE (op) != REG)
917 return FALSE;
918
919 regno = REGNO (op);
920 if (regno >= FIRST_PSEUDO_REGISTER)
921 return TRUE;
922
923 if (! FPR_P (regno))
924 return FALSE;
925
926 return (((regno - FPR_FIRST) & 3) == 0);
927})
928
929;; Return true if operand is an even FPR register.
930
931(define_predicate "even_fpr_operand"
932 (match_code "reg,subreg")
933{
934 int regno;
935
936 if (GET_MODE (op) != mode && mode != VOIDmode)
937 return FALSE;
938
939 if (GET_CODE (op) == SUBREG)
940 {
941 if (GET_CODE (SUBREG_REG (op)) != REG)
942 return register_operand (op, mode);
943
944 op = SUBREG_REG (op);
945 }
946
947 if (GET_CODE (op) != REG)
948 return FALSE;
949
950 regno = REGNO (op);
951 if (regno >= FIRST_PSEUDO_REGISTER)
952 return TRUE;
953
954 if (! FPR_P (regno))
955 return FALSE;
956
957 return (((regno - FPR_FIRST) & 1) == 0);
958})
959
960;; Return true if operand is an odd FPR register.
961
962(define_predicate "odd_fpr_operand"
963 (match_code "reg,subreg")
964{
965 int regno;
966
967 if (GET_MODE (op) != mode && mode != VOIDmode)
968 return FALSE;
969
970 if (GET_CODE (op) == SUBREG)
971 {
972 if (GET_CODE (SUBREG_REG (op)) != REG)
973 return register_operand (op, mode);
974
975 op = SUBREG_REG (op);
976 }
977
978 if (GET_CODE (op) != REG)
979 return FALSE;
980
981 regno = REGNO (op);
982 /* Assume that reload will give us an even register. */
983 if (regno >= FIRST_PSEUDO_REGISTER)
984 return FALSE;
985
986 if (! FPR_P (regno))
987 return FALSE;
988
989 return (((regno - FPR_FIRST) & 1) != 0);
990})
991
992;; Return true if operand is a 2 word memory address that can be
993;; loaded in one instruction to load or store. We assume the stack
994;; and frame pointers are suitably aligned, and variables in the small
995;; data area. FIXME -- at some we should recognize other globals and
996;; statics. We can't assume that any old pointer is aligned, given
997;; that arguments could be passed on an odd word on the stack and the
998;; address taken and passed through to another function.
999
1000(define_predicate "dbl_memory_one_insn_operand"
1001 (match_code "mem")
1002{
1003 rtx addr;
1004 rtx addr_reg;
1005
1006 if (! TARGET_DWORD)
1007 return FALSE;
1008
1009 if (GET_CODE (op) != MEM)
1010 return FALSE;
1011
1012 if (mode != VOIDmode && GET_MODE_SIZE (mode) != 2*UNITS_PER_WORD)
1013 return FALSE;
1014
1015 addr = XEXP (op, 0);
1016 if (GET_CODE (addr) == REG)
1017 addr_reg = addr;
1018
1019 else if (GET_CODE (addr) == PLUS)
1020 {
1021 rtx addr0 = XEXP (addr, 0);
1022 rtx addr1 = XEXP (addr, 1);
1023
1024 if (GET_CODE (addr0) != REG)
1025 return FALSE;
1026
1027 if (got12_operand (addr1, VOIDmode))
1028 return TRUE;
1029
1030 if (GET_CODE (addr1) != CONST_INT)
1031 return FALSE;
1032
1033 if ((INTVAL (addr1) & 7) != 0)
1034 return FALSE;
1035
1036 addr_reg = addr0;
1037 }
1038
1039 else
1040 return FALSE;
1041
1042 if (addr_reg == frame_pointer_rtx || addr_reg == stack_pointer_rtx)
1043 return TRUE;
1044
1045 return FALSE;
1046})
1047
1048;; Return true if operand is a 2 word memory address that needs to use
1049;; two instructions to load or store.
1050
1051(define_predicate "dbl_memory_two_insn_operand"
1052 (match_code "mem")
1053{
1054 if (GET_CODE (op) != MEM)
1055 return FALSE;
1056
1057 if (mode != VOIDmode && GET_MODE_SIZE (mode) != 2*UNITS_PER_WORD)
1058 return FALSE;
1059
1060 if (! TARGET_DWORD)
1061 return TRUE;
1062
1063 return ! dbl_memory_one_insn_operand (op, mode);
1064})
1065
1066;; Return true if operand is a memory reference suitable for a call.
1067
1068(define_predicate "call_operand"
1069 (match_code "reg,subreg,const_int,const,symbol_ref")
1070{
1071 if (GET_MODE (op) != mode && mode != VOIDmode && GET_CODE (op) != CONST_INT)
1072 return FALSE;
1073
1074 if (GET_CODE (op) == SYMBOL_REF)
1075 return !TARGET_LONG_CALLS || SYMBOL_REF_LOCAL_P (op);
1076
1077 /* Note this doesn't allow reg+reg or reg+imm12 addressing (which should
1078 never occur anyway), but prevents reload from not handling the case
1079 properly of a call through a pointer on a function that calls
1080 vfork/setjmp, etc. due to the need to flush all of the registers to stack. */
1081 return gpr_or_int12_operand (op, mode);
1082})
1083
1084;; Return true if operand is a memory reference suitable for a
1085;; sibcall.
1086
1087(define_predicate "sibcall_operand"
1088 (match_code "reg,subreg,const_int,const")
1089{
1090 if (GET_MODE (op) != mode && mode != VOIDmode && GET_CODE (op) != CONST_INT)
1091 return FALSE;
1092
1093 /* Note this doesn't allow reg+reg or reg+imm12 addressing (which should
1094 never occur anyway), but prevents reload from not handling the case
1095 properly of a call through a pointer on a function that calls
1096 vfork/setjmp, etc. due to the need to flush all of the registers to stack. */
1097 return gpr_or_int12_operand (op, mode);
1098})
1099
1100;; Return 1 if operand is an integer constant with the bottom 16 bits
1101;; clear.
1102
1103(define_predicate "upper_int16_operand"
1104 (match_code "const_int")
1105{
1106 if (GET_CODE (op) != CONST_INT)
1107 return FALSE;
1108
1109 return ((INTVAL (op) & 0xffff) == 0);
1110})
1111
5f858eac 1112;; Return 1 if operand is a 16-bit unsigned immediate.
52ba7179 1113
1114(define_predicate "uint16_operand"
1115 (match_code "const_int")
1116{
1117 if (GET_CODE (op) != CONST_INT)
1118 return FALSE;
1119
0c000b75 1120 return IN_RANGE (INTVAL (op), 0, 0xffff);
52ba7179 1121})
1122
1123;; Returns 1 if OP is either a SYMBOL_REF or a constant.
1124
1125(define_predicate "symbolic_operand"
a12ac39a 1126 (match_code "symbol_ref,const,const_int")
52ba7179 1127{
1128 enum rtx_code c = GET_CODE (op);
1129
1130 if (c == CONST)
1131 {
1132 /* Allow (const:SI (plus:SI (symbol_ref) (const_int))). */
1133 return GET_MODE (op) == SImode
1134 && GET_CODE (XEXP (op, 0)) == PLUS
1135 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
1136 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT;
1137 }
1138
1139 return c == SYMBOL_REF || c == CONST_INT;
1140})
1141
1142;; Return true if operator is a kind of relational operator.
1143
1144(define_predicate "relational_operator"
1145 (match_code "eq,ne,le,lt,ge,gt,leu,ltu,geu,gtu")
1146{
1147 return (integer_relational_operator (op, mode)
1148 || float_relational_operator (op, mode));
1149})
1150
1151;; Return true if OP is a relational operator suitable for CCmode,
1152;; CC_UNSmode or CC_NZmode.
1153
1154(define_predicate "integer_relational_operator"
1155 (match_code "eq,ne,le,lt,ge,gt,leu,ltu,geu,gtu")
1156{
1157 if (mode != VOIDmode && mode != GET_MODE (op))
1158 return FALSE;
1159
1160 /* The allowable relations depend on the mode of the ICC register. */
1161 switch (GET_CODE (op))
1162 {
1163 default:
1164 return FALSE;
1165
1166 case EQ:
1167 case NE:
1168 case LT:
1169 case GE:
1170 return (GET_MODE (XEXP (op, 0)) == CC_NZmode
1171 || GET_MODE (XEXP (op, 0)) == CCmode);
1172
1173 case LE:
1174 case GT:
1175 return GET_MODE (XEXP (op, 0)) == CCmode;
1176
1177 case GTU:
1178 case GEU:
1179 case LTU:
1180 case LEU:
1181 return (GET_MODE (XEXP (op, 0)) == CC_NZmode
1182 || GET_MODE (XEXP (op, 0)) == CC_UNSmode);
1183 }
1184})
1185
1186;; Return true if operator is a floating point relational operator.
1187
1188(define_predicate "float_relational_operator"
1189 (match_code "eq,ne,le,lt,ge,gt")
1190{
1191 if (mode != VOIDmode && mode != GET_MODE (op))
1192 return FALSE;
1193
1194 switch (GET_CODE (op))
1195 {
1196 default:
1197 return FALSE;
1198
1199 case EQ: case NE:
1200 case LE: case LT:
1201 case GE: case GT:
1202#if 0
1203 case UEQ: case UNE:
1204 case ULE: case ULT:
1205 case UGE: case UGT:
1206 case ORDERED:
1207 case UNORDERED:
1208#endif
1209 return GET_MODE (XEXP (op, 0)) == CC_FPmode;
1210 }
1211})
1212
1213;; Return true if operator is EQ/NE of a conditional execution
1214;; register.
1215
1216(define_predicate "ccr_eqne_operator"
1217 (match_code "eq,ne")
1218{
1219 enum machine_mode op_mode = GET_MODE (op);
1220 rtx op0;
1221 rtx op1;
1222 int regno;
1223
1224 if (mode != VOIDmode && op_mode != mode)
1225 return FALSE;
1226
1227 switch (GET_CODE (op))
1228 {
1229 default:
1230 return FALSE;
1231
1232 case EQ:
1233 case NE:
1234 break;
1235 }
1236
1237 op1 = XEXP (op, 1);
1238 if (op1 != const0_rtx)
1239 return FALSE;
1240
1241 op0 = XEXP (op, 0);
1242 if (GET_CODE (op0) != REG)
1243 return FALSE;
1244
1245 regno = REGNO (op0);
1246 if (op_mode == CC_CCRmode && CR_OR_PSEUDO_P (regno))
1247 return TRUE;
1248
1249 return FALSE;
1250})
1251
1252;; Return true if operator is a minimum or maximum operator (both
1253;; signed and unsigned).
1254
1255(define_predicate "minmax_operator"
1256 (match_code "smin,smax,umin,umax")
1257{
1258 if (mode != VOIDmode && mode != GET_MODE (op))
1259 return FALSE;
1260
1261 switch (GET_CODE (op))
1262 {
1263 default:
1264 return FALSE;
1265
1266 case SMIN:
1267 case SMAX:
1268 case UMIN:
1269 case UMAX:
1270 break;
1271 }
1272
52ba7179 1273 return TRUE;
1274})
1275
1276;; Return true if operator is an integer binary operator that can
1277;; executed conditionally and takes 1 cycle.
1278
1279(define_predicate "condexec_si_binary_operator"
1280 (match_code "plus,minus,and,ior,xor,ashift,ashiftrt,lshiftrt")
1281{
1282 enum machine_mode op_mode = GET_MODE (op);
1283
1284 if (mode != VOIDmode && op_mode != mode)
1285 return FALSE;
1286
1287 switch (GET_CODE (op))
1288 {
1289 default:
1290 return FALSE;
1291
1292 case PLUS:
1293 case MINUS:
1294 case AND:
1295 case IOR:
1296 case XOR:
1297 case ASHIFT:
1298 case ASHIFTRT:
1299 case LSHIFTRT:
1300 return TRUE;
1301 }
1302})
1303
1304;; Return true if operator is an integer binary operator that can be
1305;; executed conditionally by a media instruction.
1306
1307(define_predicate "condexec_si_media_operator"
1308 (match_code "and,ior,xor")
1309{
1310 enum machine_mode op_mode = GET_MODE (op);
1311
1312 if (mode != VOIDmode && op_mode != mode)
1313 return FALSE;
1314
1315 switch (GET_CODE (op))
1316 {
1317 default:
1318 return FALSE;
1319
1320 case AND:
1321 case IOR:
1322 case XOR:
1323 return TRUE;
1324 }
1325})
1326
1327;; Return true if operator is an integer division operator that can
1328;; executed conditionally.
1329
1330(define_predicate "condexec_si_divide_operator"
1331 (match_code "div,udiv")
1332{
1333 enum machine_mode op_mode = GET_MODE (op);
1334
1335 if (mode != VOIDmode && op_mode != mode)
1336 return FALSE;
1337
1338 switch (GET_CODE (op))
1339 {
1340 default:
1341 return FALSE;
1342
1343 case DIV:
1344 case UDIV:
1345 return TRUE;
1346 }
1347})
1348
1349;; Return true if operator is an integer unary operator that can
1350;; executed conditionally.
1351
1352(define_predicate "condexec_si_unary_operator"
1353 (match_code "not,neg")
1354{
1355 enum machine_mode op_mode = GET_MODE (op);
1356
1357 if (mode != VOIDmode && op_mode != mode)
1358 return FALSE;
1359
1360 switch (GET_CODE (op))
1361 {
1362 default:
1363 return FALSE;
1364
1365 case NEG:
1366 case NOT:
1367 return TRUE;
1368 }
1369})
1370
1371;; Return true if operator is an addition or subtraction
1372;; expression. Such expressions can be evaluated conditionally by
1373;; floating-point instructions.
1374
1375(define_predicate "condexec_sf_add_operator"
1376 (match_code "plus,minus")
1377{
1378 enum machine_mode op_mode = GET_MODE (op);
1379
1380 if (mode != VOIDmode && op_mode != mode)
1381 return FALSE;
1382
1383 switch (GET_CODE (op))
1384 {
1385 default:
1386 return FALSE;
1387
1388 case PLUS:
1389 case MINUS:
1390 return TRUE;
1391 }
1392})
1393
1394;; Return true if operator is a conversion-type expression that can be
1395;; evaluated conditionally by floating-point instructions.
1396
1397(define_predicate "condexec_sf_conv_operator"
1398 (match_code "abs,neg")
1399{
1400 enum machine_mode op_mode = GET_MODE (op);
1401
1402 if (mode != VOIDmode && op_mode != mode)
1403 return FALSE;
1404
1405 switch (GET_CODE (op))
1406 {
1407 default:
1408 return FALSE;
1409
1410 case NEG:
1411 case ABS:
1412 return TRUE;
1413 }
1414})
1415
1416;; Return true if OP is an integer binary operator that can be
1417;; combined with a (set ... (compare:CC_NZ ...)) pattern.
1418
1419(define_predicate "intop_compare_operator"
1420 (match_code "plus,minus,and,ior,xor,ashift,ashiftrt,lshiftrt")
1421{
1422 if (mode != VOIDmode && GET_MODE (op) != mode)
1423 return FALSE;
1424
1425 switch (GET_CODE (op))
1426 {
1427 default:
1428 return FALSE;
1429
1430 case PLUS:
1431 case MINUS:
1432 case AND:
1433 case IOR:
1434 case XOR:
1435 case ASHIFTRT:
1436 case LSHIFTRT:
1437 return GET_MODE (op) == SImode;
1438 }
1439})
1440
5f858eac 1441;; Return 1 if operand is a register or 6-bit signed immediate.
52ba7179 1442
1443(define_predicate "fpr_or_int6_operand"
1444 (match_code "reg,subreg,const_int")
1445{
1446 if (GET_CODE (op) == CONST_INT)
0c000b75 1447 return IN_RANGE (INTVAL (op), -32, 31);
52ba7179 1448
1449 if (GET_MODE (op) != mode && mode != VOIDmode)
1450 return FALSE;
1451
1452 if (GET_CODE (op) == SUBREG)
1453 {
1454 if (GET_CODE (SUBREG_REG (op)) != REG)
1455 return register_operand (op, mode);
1456
1457 op = SUBREG_REG (op);
1458 }
1459
1460 if (GET_CODE (op) != REG)
1461 return FALSE;
1462
1463 return FPR_OR_PSEUDO_P (REGNO (op));
1464})
1465
5f858eac 1466;; Return 1 if operand is a 6-bit signed immediate.
52ba7179 1467
1468(define_predicate "int6_operand"
1469 (match_code "const_int")
1470{
1471 if (GET_CODE (op) != CONST_INT)
1472 return FALSE;
1473
0c000b75 1474 return IN_RANGE (INTVAL (op), -32, 31);
52ba7179 1475})
1476
5f858eac 1477;; Return 1 if operand is a 5-bit signed immediate.
52ba7179 1478
1479(define_predicate "int5_operand"
1480 (match_code "const_int")
1481{
0c000b75 1482 return GET_CODE (op) == CONST_INT && IN_RANGE (INTVAL (op), -16, 15);
52ba7179 1483})
1484
5f858eac 1485;; Return 1 if operand is a 5-bit unsigned immediate.
52ba7179 1486
1487(define_predicate "uint5_operand"
1488 (match_code "const_int")
1489{
0c000b75 1490 return GET_CODE (op) == CONST_INT && IN_RANGE (INTVAL (op), 0, 31);
52ba7179 1491})
1492
5f858eac 1493;; Return 1 if operand is a 4-bit unsigned immediate.
52ba7179 1494
1495(define_predicate "uint4_operand"
1496 (match_code "const_int")
1497{
0c000b75 1498 return GET_CODE (op) == CONST_INT && IN_RANGE (INTVAL (op), 0, 15);
52ba7179 1499})
1500
5f858eac 1501;; Return 1 if operand is a 1-bit unsigned immediate (0 or 1).
52ba7179 1502
1503(define_predicate "uint1_operand"
1504 (match_code "const_int")
1505{
0c000b75 1506 return GET_CODE (op) == CONST_INT && IN_RANGE (INTVAL (op), 0, 1);
52ba7179 1507})
1508
1509;; Return 1 if operand is a valid ACC register number.
1510
1511(define_predicate "acc_operand"
1512 (match_code "reg,subreg")
1513{
1514 return ((mode == VOIDmode || mode == GET_MODE (op))
1515 && REG_P (op) && ACC_P (REGNO (op))
1516 && ((REGNO (op) - ACC_FIRST) & ~ACC_MASK) == 0);
1517})
1518
1519;; Return 1 if operand is a valid even ACC register number.
1520
1521(define_predicate "even_acc_operand"
1522 (match_code "reg,subreg")
1523{
1524 return acc_operand (op, mode) && ((REGNO (op) - ACC_FIRST) & 1) == 0;
1525})
1526
1527;; Return 1 if operand is zero or four.
1528
1529(define_predicate "quad_acc_operand"
1530 (match_code "reg,subreg")
1531{
1532 return acc_operand (op, mode) && ((REGNO (op) - ACC_FIRST) & 3) == 0;
1533})
1534
1535;; Return 1 if operand is a valid ACCG register number.
1536
1537(define_predicate "accg_operand"
1538 (match_code "reg,subreg")
1539{
1540 return ((mode == VOIDmode || mode == GET_MODE (op))
1541 && REG_P (op) && ACCG_P (REGNO (op))
1542 && ((REGNO (op) - ACCG_FIRST) & ~ACC_MASK) == 0);
1543})