]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/config/microblaze/predicates.md
Update copyright years.
[thirdparty/gcc.git] / gcc / config / microblaze / predicates.md
1 ;; Predicate definitions for Xilinx MicroBlaze
2 ;; Copyright (C) 2009-2016 Free Software Foundation, Inc.
3 ;;
4 ;; Contributed by Michael Eager <eager@eagercon.com>.
5 ;;
6 ;; This file is part of GCC.
7 ;;
8 ;; GCC is free software; you can redistribute it and/or modify
9 ;; it under the terms of the GNU General Public License as published by
10 ;; the Free Software Foundation; either version 3, or (at your option)
11 ;; any later version.
12 ;;
13 ;; GCC is distributed in the hope that it will be useful,
14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ;; GNU General Public 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 ;; Return whether OP can be used as an operands in arithmetic.
24 (define_predicate "arith_operand"
25 (ior (match_code "const_int,const_double")
26 (match_operand 0 "register_operand")))
27
28 (define_predicate "arith_operand32"
29 (ior (match_operand 0 "register_operand")
30 (and (match_code "const_int,const_double")
31 (match_test "LARGE_INT (op)"))))
32
33 (define_predicate "arith_plus_operand"
34 (match_operand 0 "general_operand")
35 {
36 switch (GET_CODE (op))
37 {
38 default:
39 return 0;
40 case CONST_INT:
41 case REG:
42 return 1;
43 case SYMBOL_REF:
44 case LABEL_REF:
45 if (flag_pic || microblaze_tls_referenced_p(op))
46 return 0;
47 return 1;
48 case CONST:
49 {
50 rtx const0;
51 const0 = XEXP (op, 0);
52
53 switch (GET_CODE(const0))
54 {
55 default:
56 return 0;
57 case UNSPEC :
58 return 1;
59
60 case PLUS :
61 {
62 rtx p0, p1;
63 p0 = XEXP (const0, 0);
64 p1 = XEXP (const0, 1);
65
66 if ((GET_CODE(p0) == SYMBOL_REF
67 || GET_CODE (p0) == LABEL_REF)
68 && GET_CODE(p1) == CONST_INT)
69 {
70 return arith_plus_operand (p0, GET_MODE(p0));
71 }
72 }
73 }
74 }
75 }
76 return 0;
77 })
78
79 (define_predicate "const_0_operand"
80 (and (match_code "const_int,const_double")
81 (match_test "op == CONST0_RTX (GET_MODE (op))")))
82
83 ;; Return whether OP is a register or the constant 0.
84 (define_predicate "reg_or_0_operand"
85 (ior (match_operand 0 "const_0_operand")
86 (match_operand 0 "register_operand")))
87
88 (define_predicate "reg_or_mem_operand"
89 (ior (match_operand 0 "memory_operand")
90 (match_operand 0 "register_operand")))
91
92 ;; Return if the operand is either the PC or a label_ref.
93 (define_special_predicate "pc_or_label_operand"
94 (ior (match_code "pc,label_ref")
95 (and (match_code "symbol_ref")
96 (match_test "!(strcmp ((XSTR (op, 0)), \"_stack_overflow_exit\"))"))))
97
98 ;; Test for valid call operand
99 (define_predicate "call_insn_operand"
100 (match_test "CALL_INSN_OP (op)"))
101
102 (define_predicate "call_insn_simple_operand"
103 (and (match_test "CALL_INSN_OP (op)")
104 (match_test "GET_CODE (op) == REG || GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST_INT")))
105
106 ;; Return if OPERAND is valid as a source operand for a move instruction.
107 (define_predicate "move_src_operand"
108 (and (
109 not (
110 and (match_code "plus")
111 (not (match_test "(GET_CODE (XEXP (op, 0)) == REG) ^ (GET_CODE (XEXP (op,1)) == REG)"))
112 )
113 )
114 (match_operand 0 "general_operand"))
115 {
116 if (microblaze_tls_referenced_p(op)
117 || (flag_pic && (symbol_mentioned_p(op) || label_mentioned_p(op))))
118 return false;
119
120 return true;
121 })
122
123 ;; Test for valid PIC call operand
124 (define_predicate "call_insn_plt_operand"
125 (match_test "PLT_ADDR_P (op)"))
126
127 ;; Return if the code of this rtx pattern is a comparison.
128 (define_predicate "cmp_op"
129 (match_code "gt,ge,gtu,geu,lt,le,ltu,leu"))