annotate gcc/config/nios2/predicates.md @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ;; Predicate definitions for Altera Nios II.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 ;; Copyright (C) 2012-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 ;; Contributed by Chung-Lin Tang <cltang@codesourcery.com>
kono
parents:
diff changeset
4 ;;
kono
parents:
diff changeset
5 ;; This file is part of GCC.
kono
parents:
diff changeset
6 ;;
kono
parents:
diff changeset
7 ;; GCC is free software; you can redistribute it and/or modify
kono
parents:
diff changeset
8 ;; it under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
9 ;; the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
10 ;; any later version.
kono
parents:
diff changeset
11 ;;
kono
parents:
diff changeset
12 ;; GCC is distributed in the hope that it will be useful,
kono
parents:
diff changeset
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents:
diff changeset
15 ;; GNU General Public License for more details.
kono
parents:
diff changeset
16 ;;
kono
parents:
diff changeset
17 ;; You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 ;; along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 ;; <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 (define_predicate "const_0_operand"
kono
parents:
diff changeset
22 (and (match_code "const_int,const_double,const_vector")
kono
parents:
diff changeset
23 (match_test "op == CONST0_RTX (GET_MODE (op))")))
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 (define_predicate "reg_or_0_operand"
kono
parents:
diff changeset
26 (ior (match_operand 0 "const_0_operand")
kono
parents:
diff changeset
27 (match_operand 0 "register_operand")))
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 (define_predicate "const_uns_arith_operand"
kono
parents:
diff changeset
30 (and (match_code "const_int")
kono
parents:
diff changeset
31 (match_test "SMALL_INT_UNSIGNED (INTVAL (op))")))
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 (define_predicate "uns_arith_operand"
kono
parents:
diff changeset
34 (ior (match_operand 0 "const_uns_arith_operand")
kono
parents:
diff changeset
35 (match_operand 0 "register_operand")))
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 (define_predicate "const_arith_operand"
kono
parents:
diff changeset
38 (and (match_code "const_int")
kono
parents:
diff changeset
39 (match_test "SMALL_INT (INTVAL (op))")))
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 (define_predicate "arith_operand"
kono
parents:
diff changeset
42 (ior (match_operand 0 "const_arith_operand")
kono
parents:
diff changeset
43 (match_operand 0 "register_operand")))
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 (define_predicate "add_regimm_operand"
kono
parents:
diff changeset
46 (ior (match_operand 0 "arith_operand")
kono
parents:
diff changeset
47 (match_test "nios2_unspec_reloc_p (op)")))
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 (define_predicate "const_logical_operand"
kono
parents:
diff changeset
50 (and (match_code "const_int")
kono
parents:
diff changeset
51 (match_test "(INTVAL (op) & 0xffff) == 0
kono
parents:
diff changeset
52 || (INTVAL (op) & 0xffff0000) == 0")))
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 (define_predicate "logical_operand"
kono
parents:
diff changeset
55 (ior (match_operand 0 "const_logical_operand")
kono
parents:
diff changeset
56 (match_operand 0 "register_operand")))
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 (define_predicate "const_and_operand"
kono
parents:
diff changeset
59 (and (match_code "const_int")
kono
parents:
diff changeset
60 (match_test "SMALL_INT_UNSIGNED (INTVAL (op))
kono
parents:
diff changeset
61 || UPPER16_INT (INTVAL (op))
kono
parents:
diff changeset
62 || (TARGET_ARCH_R2 && ANDCLEAR_INT (INTVAL (op)))")))
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 (define_predicate "and_operand"
kono
parents:
diff changeset
65 (ior (match_operand 0 "const_and_operand")
kono
parents:
diff changeset
66 (match_operand 0 "register_operand")))
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 (define_predicate "const_shift_operand"
kono
parents:
diff changeset
69 (and (match_code "const_int")
kono
parents:
diff changeset
70 (match_test "SHIFT_INT (INTVAL (op))")))
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 (define_predicate "shift_operand"
kono
parents:
diff changeset
73 (ior (match_operand 0 "const_shift_operand")
kono
parents:
diff changeset
74 (match_operand 0 "register_operand")))
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 (define_predicate "call_operand"
kono
parents:
diff changeset
77 (ior (match_operand 0 "immediate_operand")
kono
parents:
diff changeset
78 (match_operand 0 "register_operand")))
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 (define_predicate "rdwrctl_operand"
kono
parents:
diff changeset
81 (and (match_code "const_int")
kono
parents:
diff changeset
82 (match_test "RDWRCTL_INT (INTVAL (op))")))
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 (define_predicate "rdprs_dcache_operand"
kono
parents:
diff changeset
85 (and (match_code "const_int")
kono
parents:
diff changeset
86 (if_then_else (match_test "TARGET_ARCH_R2")
kono
parents:
diff changeset
87 (match_test "SMALL_INT12 (INTVAL (op))")
kono
parents:
diff changeset
88 (match_test "SMALL_INT (INTVAL (op))"))))
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 (define_predicate "custom_insn_opcode"
kono
parents:
diff changeset
91 (and (match_code "const_int")
kono
parents:
diff changeset
92 (match_test "CUSTOM_INSN_OPCODE (INTVAL (op))")))
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 (define_special_predicate "expandable_comparison_operator"
kono
parents:
diff changeset
95 (match_operand 0 "ordered_comparison_operator")
kono
parents:
diff changeset
96 {
kono
parents:
diff changeset
97 return (GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) != MODE_FLOAT
kono
parents:
diff changeset
98 || nios2_validate_fpu_compare (GET_MODE (XEXP (op, 0)), &op,
kono
parents:
diff changeset
99 &XEXP (op, 0), &XEXP (op, 1),
kono
parents:
diff changeset
100 false));
kono
parents:
diff changeset
101 })
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 (define_special_predicate "pop_operation"
kono
parents:
diff changeset
104 (match_code "parallel")
kono
parents:
diff changeset
105 {
kono
parents:
diff changeset
106 return pop_operation_p (op);
kono
parents:
diff changeset
107 })
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 (define_special_predicate "ldwm_operation"
kono
parents:
diff changeset
110 (match_code "parallel")
kono
parents:
diff changeset
111 {
kono
parents:
diff changeset
112 return ldstwm_operation_p (op, /*load_p=*/true);
kono
parents:
diff changeset
113 })
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 (define_special_predicate "stwm_operation"
kono
parents:
diff changeset
116 (match_code "parallel")
kono
parents:
diff changeset
117 {
kono
parents:
diff changeset
118 return ldstwm_operation_p (op, /*load_p=*/false);
kono
parents:
diff changeset
119 })
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 (define_predicate "nios2_hard_register_operand"
kono
parents:
diff changeset
122 (match_code "reg")
kono
parents:
diff changeset
123 {
kono
parents:
diff changeset
124 return GP_REG_P (REGNO (op));
kono
parents:
diff changeset
125 })
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 (define_predicate "stack_memory_operand"
kono
parents:
diff changeset
128 (match_code "mem")
kono
parents:
diff changeset
129 {
kono
parents:
diff changeset
130 rtx addr = XEXP (op, 0);
kono
parents:
diff changeset
131 return ((REG_P (addr) && REGNO (addr) == SP_REGNO)
kono
parents:
diff changeset
132 || (GET_CODE (addr) == PLUS
kono
parents:
diff changeset
133 && REG_P (XEXP (addr, 0)) && REGNO (XEXP (addr, 0)) == SP_REGNO
kono
parents:
diff changeset
134 && CONST_INT_P (XEXP (addr, 1))));
kono
parents:
diff changeset
135 })
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 (define_predicate "ldstio_memory_operand"
kono
parents:
diff changeset
138 (match_code "mem")
kono
parents:
diff changeset
139 {
kono
parents:
diff changeset
140 if (TARGET_ARCH_R2)
kono
parents:
diff changeset
141 {
kono
parents:
diff changeset
142 rtx addr = XEXP (op, 0);
kono
parents:
diff changeset
143 if (REG_P (addr))
kono
parents:
diff changeset
144 return true;
kono
parents:
diff changeset
145 else if (GET_CODE (addr) == PLUS)
kono
parents:
diff changeset
146 return (REG_P (XEXP (addr, 0))
kono
parents:
diff changeset
147 && CONST_INT_P (XEXP (addr, 1))
kono
parents:
diff changeset
148 && SMALL_INT12 (INTVAL (XEXP (addr, 1))));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
149 else if (CONST_INT_P (addr))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
150 return SMALL_INT12 (INTVAL (addr));
111
kono
parents:
diff changeset
151 return false;
kono
parents:
diff changeset
152 }
kono
parents:
diff changeset
153 return memory_operand (op, mode);
kono
parents:
diff changeset
154 })
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 (define_predicate "ldstex_memory_operand"
kono
parents:
diff changeset
157 (match_code "mem")
kono
parents:
diff changeset
158 {
kono
parents:
diff changeset
159 /* ldex/ldsex/stex/stsex cannot handle memory addresses with offsets. */
kono
parents:
diff changeset
160 return GET_CODE (XEXP (op, 0)) == REG;
kono
parents:
diff changeset
161 })