]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/v850/predicates.md
Update copyright years.
[thirdparty/gcc.git] / gcc / config / v850 / predicates.md
CommitLineData
db5c82c4 1;; Predicate definitions for NEC V850.
fbd26352 2;; Copyright (C) 2005-2019 Free Software Foundation, Inc.
db5c82c4 3;;
4;; This file is part of GCC.
5;;
6;; GCC is free software; you can redistribute it and/or modify
7;; it under the terms of the GNU General Public License as published by
038d1e19 8;; the Free Software Foundation; either version 3, or (at your option)
db5c82c4 9;; any later version.
10;;
11;; GCC is distributed in the hope that it will be useful,
12;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14;; GNU General Public License for more details.
15;;
16;; You should have received a copy of the GNU General Public License
038d1e19 17;; along with GCC; see the file COPYING3. If not see
18;; <http://www.gnu.org/licenses/>.
db5c82c4 19
20;; Return true if OP is either a register or 0.
21
22(define_predicate "reg_or_0_operand"
23 (match_code "reg,subreg,const_int,const_double")
24{
25 if (GET_CODE (op) == CONST_INT)
26 return INTVAL (op) == 0;
27
28 else if (GET_CODE (op) == CONST_DOUBLE)
48fd9d16 29 return satisfies_constraint_G (op);
db5c82c4 30
31 else
32 return register_operand (op, mode);
33})
34
35;; Return true if OP is either a register or a signed five bit
36;; integer.
37
38(define_predicate "reg_or_int5_operand"
39 (match_code "reg,subreg,const_int")
40{
41 if (GET_CODE (op) == CONST_INT)
42 return CONST_OK_FOR_J (INTVAL (op));
43
44 else
45 return register_operand (op, mode);
46})
47
48;; Return true if OP is either a register or a signed nine bit
49;; integer.
50
51(define_predicate "reg_or_int9_operand"
52 (match_code "reg,subreg,const_int")
53{
54 if (GET_CODE (op) == CONST_INT)
55 return CONST_OK_FOR_O (INTVAL (op));
56
57 return register_operand (op, mode);
58})
59
60;; Return true if OP is either a register or a const integer.
61
62(define_predicate "reg_or_const_operand"
63 (match_code "reg,const_int")
64{
65 if (GET_CODE (op) == CONST_INT)
66 return TRUE;
67
68 return register_operand (op, mode);
69})
70
65b688d7 71;; Return true if OP is a even number register.
72
73(define_predicate "even_reg_operand"
74 (match_code "reg")
75{
76 return (GET_CODE (op) == REG
77 && (REGNO (op) >= FIRST_PSEUDO_REGISTER
78 || ((REGNO (op) > 0) && (REGNO (op) < 32)
79 && ((REGNO (op) & 1)==0))));
80})
81
db5c82c4 82;; Return true if OP is a valid call operand.
83
84(define_predicate "call_address_operand"
85 (match_code "reg,symbol_ref")
86{
87 /* Only registers are valid call operands if TARGET_LONG_CALLS. */
88 if (TARGET_LONG_CALLS)
89 return GET_CODE (op) == REG;
90 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == REG);
91})
92
65b688d7 93;; Return true if OP is a valid source operand for SImode move.
db5c82c4 94
95(define_predicate "movsi_source_operand"
96 (match_code "label_ref,symbol_ref,const_int,const_double,const,high,mem,reg,subreg")
97{
98 /* Some constants, as well as symbolic operands
99 must be done with HIGH & LO_SUM patterns. */
100 if (CONSTANT_P (op)
101 && GET_CODE (op) != HIGH
102 && !(GET_CODE (op) == CONST_INT
103 && (CONST_OK_FOR_J (INTVAL (op))
104 || CONST_OK_FOR_K (INTVAL (op))
105 || CONST_OK_FOR_L (INTVAL (op)))))
106 return special_symbolref_operand (op, mode);
107 else
108 return general_operand (op, mode);
109})
110
65b688d7 111;; Return true if OP is a valid operand for 23 bit displacement
112;; operations.
113
114(define_predicate "disp23_operand"
115 (match_code "const_int")
116{
117 if (GET_CODE (op) == CONST_INT
118 && ((unsigned)(INTVAL (op)) >= 0x8000)
119 && ((unsigned)(INTVAL (op)) < 0x400000))
120 return 1;
121 else
122 return 0;
123})
124
125;; Return true if OP is a symbol ref with 16-bit signed value.
db5c82c4 126
127(define_predicate "special_symbolref_operand"
128 (match_code "symbol_ref")
129{
130 if (GET_CODE (op) == CONST
131 && GET_CODE (XEXP (op, 0)) == PLUS
48fd9d16 132 && satisfies_constraint_K (XEXP (XEXP (op, 0), 1)))
db5c82c4 133 op = XEXP (XEXP (op, 0), 0);
134
135 if (GET_CODE (op) == SYMBOL_REF)
136 return (SYMBOL_REF_FLAGS (op)
137 & (SYMBOL_FLAG_ZDA | SYMBOL_FLAG_TDA | SYMBOL_FLAG_SDA)) != 0;
138
139 return FALSE;
140})
141
65b688d7 142;; Return true if OP is a valid operand for bit related operations
143;; containing only single 1 in its binary representation.
db5c82c4 144
145(define_predicate "power_of_two_operand"
146 (match_code "const_int")
147{
148 if (GET_CODE (op) != CONST_INT)
149 return 0;
150
151 if (exact_log2 (INTVAL (op)) == -1)
152 return 0;
153 return 1;
154})
155
156;; Return nonzero if the given RTX is suitable for collapsing into a
157;; jump to a function prologue.
158
159(define_predicate "pattern_is_ok_for_prologue"
160 (match_code "parallel")
161{
162 int count = XVECLEN (op, 0);
163 int i;
164 rtx vector_element;
165
166 /* If there are no registers to save then the function prologue
167 is not suitable. */
65b688d7 168 if (count <= (TARGET_LONG_CALLS ? 3 : 2))
db5c82c4 169 return 0;
170
171 /* The pattern matching has already established that we are adjusting the
172 stack and pushing at least one register. We must now check that the
173 remaining entries in the vector to make sure that they are also register
174 pushes, except for the last entry which should be a CLOBBER of r10.
175
176 The test below performs the C equivalent of this machine description
177 pattern match:
178
179 (set (mem:SI (plus:SI (reg:SI 3)
180 (match_operand:SI 2 "immediate_operand" "i")))
181 (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))
182
183 */
184
185 for (i = 2; i < count - (TARGET_LONG_CALLS ? 2: 1); i++)
186 {
187 rtx dest;
188 rtx src;
189 rtx plus;
190
191 vector_element = XVECEXP (op, 0, i);
192
193 if (GET_CODE (vector_element) != SET)
194 return 0;
195
196 dest = SET_DEST (vector_element);
197 src = SET_SRC (vector_element);
198
199 if (GET_CODE (dest) != MEM
200 || GET_MODE (dest) != SImode
201 || GET_CODE (src) != REG
202 || GET_MODE (src) != SImode
203 || ! register_is_ok_for_epilogue (src, SImode))
204 return 0;
205
206 plus = XEXP (dest, 0);
207
208 if ( GET_CODE (plus) != PLUS
209 || GET_CODE (XEXP (plus, 0)) != REG
210 || GET_MODE (XEXP (plus, 0)) != SImode
211 || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
212 || GET_CODE (XEXP (plus, 1)) != CONST_INT)
213 return 0;
214
215 /* If the register is being pushed somewhere other than the stack
216 space just acquired by the first operand then abandon this quest.
217 Note: the test is <= because both values are negative. */
218 if (INTVAL (XEXP (plus, 1))
219 <= INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1)))
220 {
221 return 0;
222 }
223 }
224
225 /* Make sure that the last entries in the vector are clobbers. */
65b688d7 226 vector_element = XVECEXP (op, 0, i++);
227
228 if (GET_CODE (vector_element) != CLOBBER
229 || GET_CODE (XEXP (vector_element, 0)) != REG
230 || REGNO (XEXP (vector_element, 0)) != 10)
231 return 0;
232
233 if (TARGET_LONG_CALLS)
db5c82c4 234 {
65b688d7 235 vector_element = XVECEXP (op, 0, i++);
db5c82c4 236
237 if (GET_CODE (vector_element) != CLOBBER
238 || GET_CODE (XEXP (vector_element, 0)) != REG
65b688d7 239 || REGNO (XEXP (vector_element, 0)) != 11)
db5c82c4 240 return 0;
241 }
242
65b688d7 243 return i == count;
db5c82c4 244})
245
246;; Return nonzero if the given RTX is suitable for collapsing into
247;; jump to a function epilogue.
248
249(define_predicate "pattern_is_ok_for_epilogue"
250 (match_code "parallel")
251{
252 int count = XVECLEN (op, 0);
253 int i;
254
255 /* If there are no registers to restore then the function epilogue
256 is not suitable. */
257 if (count <= 2)
258 return 0;
259
260 /* The pattern matching has already established that we are performing a
261 function epilogue and that we are popping at least one register. We must
262 now check the remaining entries in the vector to make sure that they are
263 also register pops. There is no good reason why there should ever be
264 anything else in this vector, but being paranoid always helps...
265
266 The test below performs the C equivalent of this machine description
267 pattern match:
268
269 (set (match_operand:SI n "register_is_ok_for_epilogue" "r")
270 (mem:SI (plus:SI (reg:SI 3) (match_operand:SI n "immediate_operand" "i"))))
271 */
272
65b688d7 273 for (i = 2; i < count; i++)
db5c82c4 274 {
275 rtx vector_element = XVECEXP (op, 0, i);
276 rtx dest;
277 rtx src;
278 rtx plus;
279
280 if (GET_CODE (vector_element) != SET)
281 return 0;
282
283 dest = SET_DEST (vector_element);
284 src = SET_SRC (vector_element);
285
286 if (GET_CODE (dest) != REG
287 || GET_MODE (dest) != SImode
288 || ! register_is_ok_for_epilogue (dest, SImode)
289 || GET_CODE (src) != MEM
290 || GET_MODE (src) != SImode)
291 return 0;
292
293 plus = XEXP (src, 0);
294
295 if (GET_CODE (plus) != PLUS
296 || GET_CODE (XEXP (plus, 0)) != REG
297 || GET_MODE (XEXP (plus, 0)) != SImode
298 || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
299 || GET_CODE (XEXP (plus, 1)) != CONST_INT)
300 return 0;
301 }
302
303 return 1;
304})
305
306;; Return true if the given RTX is a register which can be restored by
307;; a function epilogue.
308
309(define_predicate "register_is_ok_for_epilogue"
310 (match_code "reg")
311{
312 /* The save/restore routines can only cope with registers 20 - 31. */
313 return ((GET_CODE (op) == REG)
314 && (((REGNO (op) >= 20) && REGNO (op) <= 31)));
315})
316
317;; Return nonzero if the given RTX is suitable for collapsing into a
318;; DISPOSE instruction.
319
320(define_predicate "pattern_is_ok_for_dispose"
321 (match_code "parallel")
322{
323 int count = XVECLEN (op, 0);
324 int i;
325
326 /* If there are no registers to restore then
327 the dispose instruction is not suitable. */
328 if (count <= 2)
329 return 0;
330
331 /* The pattern matching has already established that we are performing a
332 function epilogue and that we are popping at least one register. We must
333 now check the remaining entries in the vector to make sure that they are
334 also register pops. There is no good reason why there should ever be
335 anything else in this vector, but being paranoid always helps...
336
337 The test below performs the C equivalent of this machine description
338 pattern match:
339
340 (set (match_operand:SI n "register_is_ok_for_epilogue" "r")
341 (mem:SI (plus:SI (reg:SI 3)
342 (match_operand:SI n "immediate_operand" "i"))))
343 */
344
345 for (i = 3; i < count; i++)
346 {
347 rtx vector_element = XVECEXP (op, 0, i);
348 rtx dest;
349 rtx src;
350 rtx plus;
351
352 if (GET_CODE (vector_element) != SET)
353 return 0;
354
355 dest = SET_DEST (vector_element);
356 src = SET_SRC (vector_element);
357
358 if ( GET_CODE (dest) != REG
359 || GET_MODE (dest) != SImode
360 || ! register_is_ok_for_epilogue (dest, SImode)
361 || GET_CODE (src) != MEM
362 || GET_MODE (src) != SImode)
363 return 0;
364
365 plus = XEXP (src, 0);
366
367 if ( GET_CODE (plus) != PLUS
368 || GET_CODE (XEXP (plus, 0)) != REG
369 || GET_MODE (XEXP (plus, 0)) != SImode
370 || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
371 || GET_CODE (XEXP (plus, 1)) != CONST_INT)
372 return 0;
373 }
374
375 return 1;
376})
377
378;; Return nonzero if the given RTX is suitable for collapsing into a
379;; PREPARE instruction.
380
381(define_predicate "pattern_is_ok_for_prepare"
382 (match_code "parallel")
383{
384 int count = XVECLEN (op, 0);
385 int i;
386
387 /* If there are no registers to restore then the prepare instruction
388 is not suitable. */
389 if (count <= 1)
390 return 0;
391
392 /* The pattern matching has already established that we are adjusting the
393 stack and pushing at least one register. We must now check that the
394 remaining entries in the vector to make sure that they are also register
395 pushes.
396
397 The test below performs the C equivalent of this machine description
398 pattern match:
399
400 (set (mem:SI (plus:SI (reg:SI 3)
401 (match_operand:SI 2 "immediate_operand" "i")))
402 (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))
403
404 */
405
65b688d7 406 for (i = 1; i < count; i++)
db5c82c4 407 {
408 rtx vector_element = XVECEXP (op, 0, i);
409 rtx dest;
410 rtx src;
411 rtx plus;
412
65b688d7 413 if (GET_CODE (vector_element) == CLOBBER)
414 continue;
415
db5c82c4 416 if (GET_CODE (vector_element) != SET)
417 return 0;
418
419 dest = SET_DEST (vector_element);
420 src = SET_SRC (vector_element);
421
422 if ( GET_CODE (dest) != MEM
423 || GET_MODE (dest) != SImode
424 || GET_CODE (src) != REG
425 || GET_MODE (src) != SImode
426 || ! register_is_ok_for_epilogue (src, SImode)
427 )
428 return 0;
429
430 plus = XEXP (dest, 0);
431
432 if ( GET_CODE (plus) != PLUS
433 || GET_CODE (XEXP (plus, 0)) != REG
434 || GET_MODE (XEXP (plus, 0)) != SImode
435 || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
436 || GET_CODE (XEXP (plus, 1)) != CONST_INT)
437 return 0;
438
439 /* If the register is being pushed somewhere other than the stack
440 space just acquired by the first operand then abandon this quest.
441 Note: the test is <= because both values are negative. */
442 if (INTVAL (XEXP (plus, 1))
65b688d7 443 < INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1)))
db5c82c4 444 return 0;
445 }
446
447 return 1;
448})
449
65b688d7 450;; Return true if OP is a valid operand for bit related operations
451;; containing only single 0 in its binary representation.
db5c82c4 452
453(define_predicate "not_power_of_two_operand"
454 (match_code "const_int")
455{
456 unsigned int mask;
457
458 if (mode == QImode)
459 mask = 0xff;
460 else if (mode == HImode)
461 mask = 0xffff;
462 else if (mode == SImode)
463 mask = 0xffffffff;
464 else
465 return 0;
466
467 if (GET_CODE (op) != CONST_INT)
468 return 0;
469
470 if (exact_log2 (~INTVAL (op) & mask) == -1)
471 return 0;
472 return 1;
473})
65b688d7 474
475;; Return true if OP is a float value operand with value as 1.
476
477(define_predicate "const_float_1_operand"
f7e2b032 478 (match_code "const_double")
65b688d7 479{
480 if (GET_CODE (op) != CONST_DOUBLE
481 || mode != GET_MODE (op)
482 || (mode != DFmode && mode != SFmode))
483 return 0;
484
485 return op == CONST1_RTX(mode);
486})
487
9a5788ea 488(define_predicate "label_ref_operand"
489 (match_code "label_ref")
490)
491
492
493(define_predicate "e3v5_shift_operand"
494 (match_code "const_int,reg")
495 {
496 if (CONST_INT_P (op))
497 return IN_RANGE (INTVAL (op), 0, 31);
498 return true;
499 }
500)
501
502(define_predicate "ior_operator"
503 (match_code "ior")
504{
505 return (GET_CODE (op) == IOR);
506})
507
bd38291a 508;; Return true if the floating point comparison operation
509;; given produces a canonical answer.
510(define_predicate "v850_float_z_comparison_operator"
511 (match_code "lt,le,eq,gt,ge")
512{
513 enum rtx_code code = GET_CODE (op);
514
515 if (GET_RTX_CLASS (code) != RTX_COMPARE
516 && GET_RTX_CLASS (code) != RTX_COMM_COMPARE)
517 return 0;
518
519 if (mode != GET_MODE (op) && mode != VOIDmode)
520 return 0;
521
522 if ((GET_CODE (XEXP (op, 0)) != REG
523 || REGNO (XEXP (op, 0)) != CC_REGNUM)
524 || XEXP (op, 1) != const0_rtx)
525 return 0;
526
527 if (GET_MODE (XEXP (op, 0)) == CC_FPU_LTmode)
528 return code == LT;
529 if (GET_MODE (XEXP (op, 0)) == CC_FPU_LEmode)
530 return code == LE;
531 if (GET_MODE (XEXP (op, 0)) == CC_FPU_EQmode)
532 return code == EQ;
533 if (GET_MODE (XEXP (op, 0)) == CC_FPU_GTmode)
534 return code == GT;
535 if (GET_MODE (XEXP (op, 0)) == CC_FPU_GEmode)
536 return code == GE;
537
538 /* Note we do not accept CC_FPU_NEmode here. See
539 v850_float_nz_comparison for the reason why. */
540 return 0;
541})
542
543;; Return true if the floating point comparison operation
544;; given produces an inverted answer.
545(define_predicate "v850_float_nz_comparison_operator"
546 (match_code "ne")
547{
548 enum rtx_code code = GET_CODE (op);
549
550 /* The V850E2V3 does not have a floating point NZ comparison operator.
551 Instead it is implemented as an EQ comparison and this function ensures
552 that the branch_nz_normal and set_nz_insn patterns are used to examine
553 (and invert) the result of the floating point comparison. */
554
555 if (GET_RTX_CLASS (code) != RTX_COMPARE
556 && GET_RTX_CLASS (code) != RTX_COMM_COMPARE)
557 return 0;
558
559 if (mode != GET_MODE (op) && mode != VOIDmode)
560 return 0;
561
562 if ((GET_CODE (XEXP (op, 0)) != REG
563 || REGNO (XEXP (op, 0)) != CC_REGNUM)
564 || XEXP (op, 1) != const0_rtx)
565 return 0;
566
567 if (GET_MODE (XEXP (op, 0)) == CC_FPU_NEmode)
568 return code == NE;
569
570 return 0;
571})