predicates.md revision 1.9 1 1.1 mrg ;; Predicate definitions for Renesas M32R.
2 1.9 mrg ;; Copyright (C) 2005-2018 Free Software Foundation, Inc.
3 1.1 mrg ;;
4 1.1 mrg ;; This file is part of GCC.
5 1.1 mrg ;;
6 1.1 mrg ;; GCC is free software; you can redistribute it and/or modify
7 1.1 mrg ;; it under the terms of the GNU General Public License as published by
8 1.1 mrg ;; the Free Software Foundation; either version 3, or (at your option)
9 1.1 mrg ;; any later version.
10 1.1 mrg ;;
11 1.1 mrg ;; GCC is distributed in the hope that it will be useful,
12 1.1 mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 mrg ;; GNU General Public License for more details.
15 1.1 mrg ;;
16 1.1 mrg ;; You should have received a copy of the GNU General Public License
17 1.1 mrg ;; along with GCC; see the file COPYING3. If not see
18 1.1 mrg ;; <http://www.gnu.org/licenses/>.
19 1.1 mrg
20 1.1 mrg ;; Return true if OP is a register or the constant 0.
21 1.1 mrg
22 1.1 mrg (define_predicate "reg_or_zero_operand"
23 1.1 mrg (match_code "reg,subreg,const_int")
24 1.1 mrg {
25 1.1 mrg if (REG_P (op) || GET_CODE (op) == SUBREG)
26 1.1 mrg return register_operand (op, mode);
27 1.1 mrg
28 1.1 mrg if (!CONST_INT_P (op))
29 1.1 mrg return 0;
30 1.1 mrg
31 1.1 mrg return INTVAL (op) == 0;
32 1.1 mrg })
33 1.1 mrg
34 1.1 mrg ;; Return nonzero if the operand is suitable for use in a conditional
35 1.1 mrg ;; move sequence.
36 1.1 mrg
37 1.1 mrg (define_predicate "conditional_move_operand"
38 1.1 mrg (match_code "reg,subreg,const_int")
39 1.1 mrg {
40 1.1 mrg /* Only defined for simple integers so far... */
41 1.1 mrg if (mode != SImode && mode != HImode && mode != QImode)
42 1.1 mrg return FALSE;
43 1.1 mrg
44 1.1 mrg /* At the moment we can handle moving registers and loading constants. */
45 1.1 mrg /* To be added: Addition/subtraction/bitops/multiplication of registers. */
46 1.1 mrg
47 1.1 mrg switch (GET_CODE (op))
48 1.1 mrg {
49 1.1 mrg case REG:
50 1.1 mrg return 1;
51 1.1 mrg
52 1.1 mrg case CONST_INT:
53 1.1 mrg return satisfies_constraint_I (op);
54 1.1 mrg
55 1.1 mrg default:
56 1.1 mrg #if 0
57 1.1 mrg fprintf (stderr, "Test for cond move op of type: %s\n",
58 1.1 mrg GET_RTX_NAME (GET_CODE (op)));
59 1.1 mrg #endif
60 1.1 mrg return 0;
61 1.1 mrg }
62 1.1 mrg })
63 1.1 mrg
64 1.1 mrg ;; Return true if the code is a test of the carry bit.
65 1.1 mrg
66 1.1 mrg (define_predicate "carry_compare_operand"
67 1.1 mrg (match_code "eq,ne")
68 1.1 mrg {
69 1.1 mrg rtx x;
70 1.1 mrg
71 1.1 mrg if (GET_MODE (op) != CCmode && GET_MODE (op) != VOIDmode)
72 1.1 mrg return FALSE;
73 1.1 mrg
74 1.1 mrg if (GET_CODE (op) != NE && GET_CODE (op) != EQ)
75 1.1 mrg return FALSE;
76 1.1 mrg
77 1.1 mrg x = XEXP (op, 0);
78 1.1 mrg if (!REG_P (x) || REGNO (x) != CARRY_REGNUM)
79 1.1 mrg return FALSE;
80 1.1 mrg
81 1.1 mrg x = XEXP (op, 1);
82 1.1 mrg if (!CONST_INT_P (x) || INTVAL (x) != 0)
83 1.1 mrg return FALSE;
84 1.1 mrg
85 1.1 mrg return TRUE;
86 1.1 mrg })
87 1.1 mrg
88 1.1 mrg ;; Return 1 if OP is an EQ or NE comparison operator.
89 1.1 mrg
90 1.1 mrg (define_predicate "eqne_comparison_operator"
91 1.1 mrg (match_code "eq,ne")
92 1.1 mrg {
93 1.1 mrg enum rtx_code code = GET_CODE (op);
94 1.1 mrg
95 1.1 mrg return (code == EQ || code == NE);
96 1.1 mrg })
97 1.1 mrg
98 1.1 mrg ;; Return 1 if OP is a signed comparison operator.
99 1.1 mrg
100 1.1 mrg (define_predicate "signed_comparison_operator"
101 1.1 mrg (match_code "eq,ne,lt,le,gt,ge")
102 1.1 mrg {
103 1.1 mrg enum rtx_code code = GET_CODE (op);
104 1.1 mrg
105 1.1 mrg return (COMPARISON_P (op)
106 1.1 mrg && (code == EQ || code == NE
107 1.1 mrg || code == LT || code == LE || code == GT || code == GE));
108 1.1 mrg })
109 1.1 mrg
110 1.1 mrg ;; Return true if OP is an acceptable argument for a move destination.
111 1.1 mrg
112 1.1 mrg (define_predicate "move_dest_operand"
113 1.1 mrg (match_code "reg,subreg,mem")
114 1.1 mrg {
115 1.1 mrg switch (GET_CODE (op))
116 1.1 mrg {
117 1.1 mrg case REG :
118 1.1 mrg return register_operand (op, mode);
119 1.1 mrg case SUBREG :
120 1.1 mrg /* (subreg (mem ...) ...) can occur here if the inner part was once a
121 1.1 mrg pseudo-reg and is now a stack slot. */
122 1.1 mrg if (MEM_P (SUBREG_REG (op)))
123 1.1 mrg return address_operand (XEXP (SUBREG_REG (op), 0), mode);
124 1.1 mrg else
125 1.1 mrg return register_operand (op, mode);
126 1.1 mrg case MEM :
127 1.1 mrg if (GET_CODE (XEXP (op, 0)) == POST_INC)
128 1.1 mrg return 0; /* stores can't do post inc */
129 1.1 mrg return address_operand (XEXP (op, 0), mode);
130 1.1 mrg default :
131 1.1 mrg return 0;
132 1.1 mrg }
133 1.1 mrg })
134 1.1 mrg
135 1.1 mrg ;; Return true if OP is an acceptable argument for a single word move
136 1.1 mrg ;; source.
137 1.1 mrg
138 1.1 mrg (define_predicate "move_src_operand"
139 1.1 mrg (match_code "reg,subreg,mem,const_int,const_double,label_ref,const,symbol_ref")
140 1.1 mrg {
141 1.1 mrg switch (GET_CODE (op))
142 1.1 mrg {
143 1.1 mrg case LABEL_REF :
144 1.1 mrg case SYMBOL_REF :
145 1.1 mrg case CONST :
146 1.1 mrg return addr24_operand (op, mode);
147 1.1 mrg case CONST_INT :
148 1.1 mrg /* ??? We allow more cse opportunities if we only allow constants
149 1.1 mrg loadable with one insn, and split the rest into two. The instances
150 1.1 mrg where this would help should be rare and the current way is
151 1.1 mrg simpler. */
152 1.1 mrg if (HOST_BITS_PER_WIDE_INT > 32)
153 1.1 mrg {
154 1.1 mrg HOST_WIDE_INT rest = INTVAL (op) >> 31;
155 1.1 mrg return (rest == 0 || rest == -1);
156 1.1 mrg }
157 1.1 mrg else
158 1.1 mrg return 1;
159 1.1 mrg case CONST_DOUBLE :
160 1.1 mrg if (mode == SFmode)
161 1.1 mrg return 1;
162 1.1 mrg else if (mode == SImode)
163 1.1 mrg {
164 1.1 mrg /* Large unsigned constants are represented as const_double's. */
165 1.1 mrg unsigned HOST_WIDE_INT low, high;
166 1.1 mrg
167 1.1 mrg low = CONST_DOUBLE_LOW (op);
168 1.1 mrg high = CONST_DOUBLE_HIGH (op);
169 1.1 mrg return high == 0 && low <= (unsigned) 0xffffffff;
170 1.1 mrg }
171 1.1 mrg else
172 1.1 mrg return 0;
173 1.1 mrg case REG :
174 1.1 mrg return register_operand (op, mode);
175 1.1 mrg case SUBREG :
176 1.1 mrg /* (subreg (mem ...) ...) can occur here if the inner part was once a
177 1.1 mrg pseudo-reg and is now a stack slot. */
178 1.1 mrg if (MEM_P (SUBREG_REG (op)))
179 1.1 mrg return address_operand (XEXP (SUBREG_REG (op), 0), mode);
180 1.1 mrg else
181 1.1 mrg return register_operand (op, mode);
182 1.1 mrg case MEM :
183 1.1 mrg if (GET_CODE (XEXP (op, 0)) == PRE_INC
184 1.1 mrg || GET_CODE (XEXP (op, 0)) == PRE_DEC)
185 1.1 mrg return 0; /* loads can't do pre-{inc,dec} */
186 1.1 mrg return address_operand (XEXP (op, 0), mode);
187 1.1 mrg default :
188 1.1 mrg return 0;
189 1.1 mrg }
190 1.1 mrg })
191 1.1 mrg
192 1.1 mrg ;; Return true if OP is an acceptable argument for a double word move
193 1.1 mrg ;; source.
194 1.1 mrg
195 1.1 mrg (define_predicate "move_double_src_operand"
196 1.1 mrg (match_code "reg,subreg,mem,const_int,const_double")
197 1.1 mrg {
198 1.1 mrg switch (GET_CODE (op))
199 1.1 mrg {
200 1.1 mrg case CONST_INT :
201 1.1 mrg case CONST_DOUBLE :
202 1.1 mrg return 1;
203 1.1 mrg case REG :
204 1.1 mrg return register_operand (op, mode);
205 1.1 mrg case SUBREG :
206 1.1 mrg /* (subreg (mem ...) ...) can occur here if the inner part was once a
207 1.1 mrg pseudo-reg and is now a stack slot. */
208 1.1 mrg if (MEM_P (SUBREG_REG (op)))
209 1.1 mrg return move_double_src_operand (SUBREG_REG (op), mode);
210 1.1 mrg else
211 1.1 mrg return register_operand (op, mode);
212 1.1 mrg case MEM :
213 1.1 mrg /* Disallow auto inc/dec for now. */
214 1.1 mrg if (GET_CODE (XEXP (op, 0)) == PRE_DEC
215 1.1 mrg || GET_CODE (XEXP (op, 0)) == PRE_INC)
216 1.1 mrg return 0;
217 1.1 mrg return address_operand (XEXP (op, 0), mode);
218 1.1 mrg default :
219 1.1 mrg return 0;
220 1.1 mrg }
221 1.1 mrg })
222 1.1 mrg
223 1.1 mrg ;; Return true if OP is a const_int requiring two instructions to
224 1.1 mrg ;; load.
225 1.1 mrg
226 1.1 mrg (define_predicate "two_insn_const_operand"
227 1.1 mrg (match_code "const_int")
228 1.1 mrg {
229 1.1 mrg if (!CONST_INT_P (op))
230 1.1 mrg return 0;
231 1.1 mrg if (satisfies_constraint_J (op)
232 1.1 mrg || satisfies_constraint_M (op)
233 1.1 mrg || satisfies_constraint_L (op))
234 1.1 mrg return 0;
235 1.1 mrg return 1;
236 1.1 mrg })
237 1.1 mrg
238 1.1 mrg ;; Returns 1 if OP is a symbol reference.
239 1.1 mrg
240 1.1 mrg (define_predicate "symbolic_operand"
241 1.1 mrg (match_code "symbol_ref,label_ref,const")
242 1.1 mrg {
243 1.1 mrg switch (GET_CODE (op))
244 1.1 mrg {
245 1.1 mrg case SYMBOL_REF:
246 1.1 mrg case LABEL_REF:
247 1.1 mrg case CONST :
248 1.1 mrg return 1;
249 1.1 mrg
250 1.1 mrg default:
251 1.1 mrg return 0;
252 1.1 mrg }
253 1.1 mrg })
254 1.1 mrg
255 1.1 mrg ;; Return true if OP is a signed 8-bit immediate value.
256 1.1 mrg
257 1.1 mrg (define_predicate "int8_operand"
258 1.1 mrg (match_code "const_int")
259 1.1 mrg {
260 1.1 mrg if (!CONST_INT_P (op))
261 1.1 mrg return 0;
262 1.1 mrg return satisfies_constraint_I (op);
263 1.1 mrg })
264 1.1 mrg
265 1.1 mrg ;; Return true if OP is an unsigned 16-bit immediate value.
266 1.1 mrg
267 1.1 mrg (define_predicate "uint16_operand"
268 1.1 mrg (match_code "const_int")
269 1.1 mrg {
270 1.1 mrg if (!CONST_INT_P (op))
271 1.1 mrg return 0;
272 1.1 mrg return satisfies_constraint_K (op);
273 1.1 mrg })
274 1.1 mrg
275 1.1 mrg ;; Return true if OP is a register or signed 16-bit value.
276 1.1 mrg
277 1.1 mrg (define_predicate "reg_or_int16_operand"
278 1.1 mrg (match_code "reg,subreg,const_int")
279 1.1 mrg {
280 1.1 mrg if (REG_P (op) || GET_CODE (op) == SUBREG)
281 1.1 mrg return register_operand (op, mode);
282 1.1 mrg if (!CONST_INT_P (op))
283 1.1 mrg return 0;
284 1.1 mrg return satisfies_constraint_J (op);
285 1.1 mrg })
286 1.1 mrg
287 1.1 mrg ;; Return true if OP is a register or an unsigned 16-bit value.
288 1.1 mrg
289 1.1 mrg (define_predicate "reg_or_uint16_operand"
290 1.1 mrg (match_code "reg,subreg,const_int")
291 1.1 mrg {
292 1.1 mrg if (REG_P (op) || GET_CODE (op) == SUBREG)
293 1.1 mrg return register_operand (op, mode);
294 1.1 mrg if (!CONST_INT_P (op))
295 1.1 mrg return 0;
296 1.1 mrg return satisfies_constraint_K (op);
297 1.1 mrg })
298 1.1 mrg
299 1.1 mrg ;; Return true if OP is a register or signed 16-bit value for
300 1.1 mrg ;; compares.
301 1.1 mrg
302 1.1 mrg (define_predicate "reg_or_cmp_int16_operand"
303 1.1 mrg (match_code "reg,subreg,const_int")
304 1.1 mrg {
305 1.1 mrg if (REG_P (op) || GET_CODE (op) == SUBREG)
306 1.1 mrg return register_operand (op, mode);
307 1.1 mrg if (!CONST_INT_P (op))
308 1.1 mrg return 0;
309 1.1 mrg return satisfies_constraint_P (op);
310 1.1 mrg })
311 1.1 mrg
312 1.1 mrg ;; Return true if OP is a register or an integer value that can be
313 1.1 mrg ;; used is SEQ/SNE. We can use either XOR of the value or ADD of the
314 1.1 mrg ;; negative of the value for the constant. Don't allow 0, because
315 1.1 mrg ;; that is special cased.
316 1.1 mrg
317 1.1 mrg (define_predicate "reg_or_eq_int16_operand"
318 1.1 mrg (match_code "reg,subreg,const_int")
319 1.1 mrg {
320 1.1 mrg HOST_WIDE_INT value;
321 1.1 mrg
322 1.1 mrg if (REG_P (op) || GET_CODE (op) == SUBREG)
323 1.1 mrg return register_operand (op, mode);
324 1.1 mrg
325 1.1 mrg if (!CONST_INT_P (op))
326 1.1 mrg return 0;
327 1.1 mrg
328 1.1 mrg value = INTVAL (op);
329 1.1 mrg return (value != 0) && (UINT16_P (value) || CMP_INT16_P (-value));
330 1.1 mrg })
331 1.1 mrg
332 1.1 mrg ;; Return true if OP is a signed 16-bit immediate value useful in
333 1.1 mrg ;; comparisons.
334 1.1 mrg
335 1.1 mrg (define_predicate "cmp_int16_operand"
336 1.1 mrg (match_code "const_int")
337 1.1 mrg {
338 1.1 mrg if (!CONST_INT_P (op))
339 1.1 mrg return 0;
340 1.1 mrg return satisfies_constraint_P (op);
341 1.1 mrg })
342 1.1 mrg
343 1.1 mrg ;; Acceptable arguments to the call insn.
344 1.1 mrg
345 1.1 mrg (define_predicate "call_address_operand"
346 1.1 mrg (match_code "symbol_ref,label_ref,const")
347 1.1 mrg {
348 1.1 mrg return symbolic_operand (op, mode);
349 1.1 mrg
350 1.1 mrg /* Constants and values in registers are not OK, because
351 1.1 mrg the m32r BL instruction can only support PC relative branching. */
352 1.1 mrg })
353 1.1 mrg
354 1.1 mrg ;; Return true if OP is an acceptable input argument for a zero/sign
355 1.1 mrg ;; extend operation.
356 1.1 mrg
357 1.1 mrg (define_predicate "extend_operand"
358 1.1 mrg (match_code "reg,subreg,mem")
359 1.1 mrg {
360 1.1 mrg rtx addr;
361 1.1 mrg
362 1.1 mrg switch (GET_CODE (op))
363 1.1 mrg {
364 1.1 mrg case REG :
365 1.1 mrg case SUBREG :
366 1.1 mrg return register_operand (op, mode);
367 1.1 mrg
368 1.1 mrg case MEM :
369 1.1 mrg addr = XEXP (op, 0);
370 1.1 mrg if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
371 1.1 mrg return 0; /* loads can't do pre inc/pre dec */
372 1.1 mrg
373 1.1 mrg return address_operand (addr, mode);
374 1.1 mrg
375 1.1 mrg default :
376 1.1 mrg return 0;
377 1.1 mrg }
378 1.1 mrg })
379 1.1 mrg
380 1.1 mrg ;; Return nonzero if the operand is an insn that is a small
381 1.1 mrg ;; insn. Allow const_int 0 as well, which is a placeholder for NOP
382 1.1 mrg ;; slots.
383 1.1 mrg
384 1.1 mrg (define_predicate "small_insn_p"
385 1.1 mrg (match_code "insn,call_insn,jump_insn")
386 1.1 mrg {
387 1.1 mrg if (CONST_INT_P (op) && INTVAL (op) == 0)
388 1.1 mrg return 1;
389 1.1 mrg
390 1.1 mrg if (! INSN_P (op))
391 1.1 mrg return 0;
392 1.1 mrg
393 1.5 mrg return get_attr_length (as_a <rtx_insn *> (op)) == 2;
394 1.1 mrg })
395 1.1 mrg
396 1.1 mrg ;; Return true if op is an integer constant, less than or equal to
397 1.1 mrg ;; MAX_MOVE_BYTES.
398 1.1 mrg
399 1.1 mrg (define_predicate "m32r_block_immediate_operand"
400 1.1 mrg (match_code "const_int")
401 1.1 mrg {
402 1.1 mrg if (!CONST_INT_P (op)
403 1.1 mrg || INTVAL (op) > MAX_MOVE_BYTES
404 1.1 mrg || INTVAL (op) <= 0)
405 1.1 mrg return 0;
406 1.1 mrg
407 1.1 mrg return 1;
408 1.1 mrg })
409 1.1 mrg
410 1.1 mrg ;; Return nonzero if the operand is an insn that is a large insn.
411 1.1 mrg
412 1.1 mrg (define_predicate "large_insn_p"
413 1.1 mrg (match_code "insn,call_insn,jump_insn")
414 1.1 mrg {
415 1.1 mrg if (! INSN_P (op))
416 1.1 mrg return 0;
417 1.1 mrg
418 1.5 mrg return get_attr_length (as_a <rtx_insn *> (op)) != 2;
419 1.1 mrg })
420 1.1 mrg
421 1.1 mrg ;; Returns 1 if OP is an acceptable operand for seth/add3.
422 1.1 mrg
423 1.1 mrg (define_predicate "seth_add3_operand"
424 1.1 mrg (match_code "symbol_ref,label_ref,const")
425 1.1 mrg {
426 1.1 mrg if (flag_pic)
427 1.1 mrg return 0;
428 1.1 mrg
429 1.1 mrg if (GET_CODE (op) == SYMBOL_REF
430 1.1 mrg || GET_CODE (op) == LABEL_REF)
431 1.1 mrg return 1;
432 1.1 mrg
433 1.1 mrg if (GET_CODE (op) == CONST
434 1.1 mrg && GET_CODE (XEXP (op, 0)) == PLUS
435 1.1 mrg && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
436 1.1 mrg && satisfies_constraint_J (XEXP (XEXP (op, 0), 1)))
437 1.1 mrg return 1;
438 1.1 mrg
439 1.1 mrg return 0;
440 1.1 mrg })
441