]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/microblaze/predicates.md
Update copyright years.
[thirdparty/gcc.git] / gcc / config / microblaze / predicates.md
CommitLineData
80920132 1;; Predicate definitions for Xilinx MicroBlaze
8d9254fc 2;; Copyright (C) 2009-2020 Free Software Foundation, Inc.
80920132
ME
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
8cc9a5a5
EI
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
80920132
ME
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
d63f1311
NM
88(define_predicate "reg_or_mem_operand"
89 (ior (match_operand 0 "memory_operand")
90 (match_operand 0 "register_operand")))
91
80920132
ME
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
82f8f53a
EI
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
80920132 106;; Return if OPERAND is valid as a source operand for a move instruction.
8cc9a5a5 107(define_predicate "move_src_operand"
80920132
ME
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 )
8cc9a5a5
EI
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})
80920132
ME
122
123;; Test for valid PIC call operand
124(define_predicate "call_insn_plt_operand"
125 (match_test "PLT_ADDR_P (op)"))
d5a19af1
DH
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"))