]>
Commit | Line | Data |
---|---|---|
80920132 | 1 | ;; Predicate definitions for Xilinx MicroBlaze |
a5544970 | 2 | ;; Copyright (C) 2009-2019 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")) |