PR middle-end/81657
[official-gcc.git] / gcc / config / sh / predicates.md
blob61449ebeceb47af8c5a9788a5f28253b55dfe8f9
1 ;; Predicate definitions for Renesas / SuperH SH.
2 ;; Copyright (C) 2005-2018 Free Software Foundation, Inc.
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
8 ;; the Free Software Foundation; either version 3, or (at your option)
9 ;; any later version.
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.
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with GCC; see the file COPYING3.  If not see
18 ;; <http://www.gnu.org/licenses/>.
21 ;; Returns 1 if OP is a normal arithmetic register.
22 (define_predicate "arith_reg_operand"
23   (match_code "subreg,reg,sign_extend")
25   if (register_operand (op, mode))
26     {
27       int regno;
29       if (REG_P (op))
30         regno = REGNO (op);
31       else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op)))
32         regno = REGNO (SUBREG_REG (op));
33       else
34         return 1;
36       return (regno != T_REG && regno != PR_REG
37               && regno != FPUL_REG && regno != FPSCR_REG
38               && regno != MACH_REG && regno != MACL_REG);
39     }
40   /* Allow a no-op sign extension - compare LOAD_EXTEND_OP.
41      We allow SImode here, as not using an FP register is just a matter of
42      proper register allocation.  */
44 #if 0 /* Can't do this because of PROMOTE_MODE for unsigned vars.  */
45   if (GET_MODE (op) == SImode && GET_CODE (op) == SIGN_EXTEND
46       && GET_MODE (XEXP (op, 0)) == HImode
47       && REG_P (XEXP (op, 0))
48       && REGNO (XEXP (op, 0)) <= LAST_GENERAL_REG)
49     return register_operand (XEXP (op, 0), VOIDmode);
50 #endif
51   if (GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_INT
52       && GET_CODE (op) == SUBREG
53       && GET_MODE (SUBREG_REG (op)) == DImode
54       && GET_CODE (SUBREG_REG (op)) == SIGN_EXTEND
55       && GET_MODE (XEXP (SUBREG_REG (op), 0)) == SImode
56       && GET_CODE (XEXP (SUBREG_REG (op), 0)) != SUBREG)
57     return register_operand (XEXP (SUBREG_REG (op), 0), VOIDmode);
58   return 0;
61 ;; Like above, but for DImode destinations: forbid paradoxical DImode
62 ;; subregs, because this would lead to missing sign extensions when
63 ;; truncating from DImode to SImode.
64 (define_predicate "arith_reg_dest"
65   (and (match_code "subreg,reg")
66        (match_operand 0 "arith_reg_operand")))
68 ;; Returns true if OP is a valid source operand for an arithmetic insn.
69 (define_predicate "arith_operand"
70   (and (match_code "subreg,reg,const_int,truncate")
71        (ior (match_operand 0 "arith_reg_operand")
72             (match_test "satisfies_constraint_I08 (op)"))))
74 ;; Likewise arith_operand but always permits const_int.
75 (define_predicate "arith_or_int_operand"
76   (and (match_code "subreg,reg,const_int,const_vector")
77        (ior (match_operand 0 "arith_operand")
78             (match_operand 0 "const_int_operand"))))
80 ;; Returns true if OP is a valid source operand for a compare insn.
81 (define_predicate "arith_reg_or_0_operand" 
82   (and (match_code "subreg,reg,const_int,const_vector")
83        (ior (match_operand 0 "arith_reg_operand")
84             (match_test "satisfies_constraint_Z (op)"))))
86 ;; Returns true if OP is either a register or constant 0 or constant 1.
87 (define_predicate "arith_reg_or_0_or_1_operand"
88   (and (match_code "subreg,reg,const_int,const_vector")
89        (ior (match_operand 0 "arith_reg_or_0_operand")
90             (match_test "satisfies_constraint_M (op)"))))
92 ;; Returns true if OP is a suitable constant for the minimum value of a
93 ;; clips.b or clips.w insn.
94 (define_predicate "clips_min_const_int"
95   (and (match_code "const_int")
96        (ior (match_test "INTVAL (op) == -128")
97             (match_test "INTVAL (op) == -32768"))))
99 ;; Returns true if OP is a suitable constant for the maximum value of a
100 ;; clips.b or clips.w insn.
101 (define_predicate "clips_max_const_int"
102   (and (match_code "const_int")
103        (ior (match_test "INTVAL (op) == 127")
104             (match_test "INTVAL (op) == 32767"))))
106 ;; Returns true if OP is a suitable constant for the maximum value of a
107 ;; clipu.b or clipu.w insn.
108 (define_predicate "clipu_max_const_int"
109   (and (match_code "const_int")
110        (ior (match_test "INTVAL (op) == 255")
111             (match_test "INTVAL (op) == 65535"))))
113 ;; Returns true if OP is a floating point register that can be used in floating
114 ;; point arithmetic operations.
115 (define_predicate "fp_arith_reg_operand"
116   (match_code "subreg,reg")
118   if (register_operand (op, mode))
119     {
120       int regno;
122       if (REG_P (op))
123         regno = REGNO (op);
124       else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op)))
125         regno = REGNO (SUBREG_REG (op));
126       else
127         return 1;
129       return (regno >= FIRST_PSEUDO_REGISTER
130               || FP_REGISTER_P (regno));
131     }
132   return 0;
135 ;; Returns true if OP is the FPSCR.
136 (define_predicate "fpscr_operand"
137   (and (match_code "reg")
138        (match_test "REGNO (op) == FPSCR_REG")))
140 ;; Returns true if OP is a valid source operand for a FPSCR move insn.
141 (define_predicate "fpscr_movsrc_operand"
142   (match_code "reg,subreg,mem")
144   if (arith_reg_operand (op, mode))
145     return true;
147   return MEM_P (op) && GET_CODE (XEXP (op, 0)) == POST_INC;
150 ;; Returns true if OP is a valid destination operand for a FPSCR move insn.
151 (define_predicate "fpscr_movdst_operand"
152   (match_code "reg,subreg,mem")
154   if (arith_reg_dest (op, mode))
155     return true;
157   return MEM_P (op) && GET_CODE (XEXP (op, 0)) == PRE_DEC;
160 ;; Returns true if OP is an operand that is either the fpul hard reg or
161 ;; a pseudo.  This prevents combine from propagating function arguments
162 ;; in hard regs into insns that need the operand in fpul.  If it's a pseudo
163 ;; reload can fix it up.
164 (define_predicate "fpul_operand"
165   (match_code "reg")
167   return REG_P (op)
168          && (REGNO (op) == FPUL_REG || REGNO (op) >= FIRST_PSEUDO_REGISTER)
169          && GET_MODE (op) == mode;
172 ;; Returns true if OP is a valid fpul input operand for the fsca insn.
173 ;; The value in fpul is a fixed-point value and its scaling is described
174 ;; in the fsca insn by a mult:SF.  To allow pre-scaled fixed-point inputs
175 ;; in fpul we have to permit things like
176 ;;   (reg:SI)
177 ;;   (fix:SF (float:SF (reg:SI)))
178 (define_predicate "fpul_fsca_operand"
179   (match_code "fix,reg")
181   if (fpul_operand (op, SImode))
182     return true;
183   if (GET_CODE (op) == FIX && GET_MODE (op) == SImode
184       && GET_CODE (XEXP (op, 0)) == FLOAT && GET_MODE (XEXP (op, 0)) == SFmode)
185     return fpul_fsca_operand (XEXP (XEXP (op, 0), 0),
186                               GET_MODE (XEXP (XEXP (op, 0), 0)));
187   return false;
190 ;; Returns true if OP is a valid constant scale factor for the fsca insn.
191 (define_predicate "fsca_scale_factor"
192   (and (match_code "const_double")
193        (match_test "op == sh_fsca_int2sf ()")))
195 ;; Returns true if OP is an operand that is zero extended during an operation.
196 (define_predicate "general_extend_operand"
197   (match_code "subreg,reg,mem,truncate")
199   if (reload_completed && GET_CODE (op) == TRUNCATE)
200     return arith_operand (op, mode);
202   if (MEM_P (op) || (GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op))))
203     return general_movsrc_operand (op, mode);
205   return nonimmediate_operand (op, mode);
208 ;; Returns 1 if OP is a simple register address.
209 (define_predicate "simple_mem_operand"
210   (and (match_code "mem")
211        (match_code "reg" "0")
212        (match_test "arith_reg_operand (XEXP (op, 0), SImode)")))
214 ;; Returns 1 if OP is a valid displacement address.
215 (define_predicate "displacement_mem_operand"
216   (and (match_code "mem")
217        (match_code "plus" "0")
218        (match_code "reg" "00")
219        (match_test "arith_reg_operand (XEXP (XEXP (op, 0), 0), SImode)")
220        (match_test "sh_legitimate_index_p (GET_MODE (op),
221                                            XEXP (XEXP (op, 0), 1),
222                                            TARGET_SH2A, true)")))
224 ;; Returns true if OP is a displacement address that can fit into a
225 ;; 16 bit (non-SH2A) memory load / store insn.
226 (define_predicate "short_displacement_mem_operand"
227   (and (match_code "mem")
228        (match_operand 0 "displacement_mem_operand")
229        (match_test "sh_disp_addr_displacement (op)
230                     <= sh_max_mov_insn_displacement (GET_MODE (op), false)")))
232 ;; Returns true if OP is a displacement address that does not fit into
233 ;; a 16 bit (non-SH2A) memory load / store insn.
234 (define_predicate "long_displacement_mem_operand"
235   (and (match_operand 0 "displacement_mem_operand")
236        (not (match_operand 0 "short_displacement_mem_operand"))))
238 ;; Returns true if OP is a post-increment addressing mode memory reference.
239 (define_predicate "post_inc_mem"
240   (and (match_code "mem")
241        (match_code "post_inc" "0")
242        (match_code "reg" "00")))
244 ;; Returns true if OP is a pre-decrement addressing mode memory reference.
245 (define_predicate "pre_dec_mem"
246   (and (match_code "mem")
247        (match_code "pre_dec" "0")
248        (match_code "reg" "00")))
250 ;; Returns 1 if the operand can be used in an SH2A movu.{b|w} insn.
251 (define_predicate "zero_extend_movu_operand"
252   (and (ior (match_operand 0 "displacement_mem_operand")
253             (match_operand 0 "simple_mem_operand"))
254        (ior (match_test "GET_MODE (op) == QImode")
255             (match_test "GET_MODE (op) == HImode"))))
257 ;; Returns 1 if OP can be source of a simple move operation. Same as
258 ;; general_operand, but a LABEL_REF is valid, PRE_DEC is invalid as
259 ;; are subregs of system registers.
260 (define_predicate "general_movsrc_operand"
261   (match_code "subreg,reg,const_int,const_double,mem,symbol_ref,label_ref,
262                const,const_vector")
264   if (t_reg_operand (op, mode))
265     return 0;
267   if (fpscr_operand (op, mode))
268     return false;
270   /* Disallow PC relative QImode loads, since these is no insn to do that
271      and an imm8 load should be used instead.  */
272   if (IS_PC_RELATIVE_LOAD_ADDR_P (op) && GET_MODE (op) == QImode)
273     return false;
275   if (MEM_P (op))
276     {
277       rtx inside = XEXP (op, 0);
279       /* Disallow mems with GBR address here.  They have to go through
280          separate special patterns.  */
281       if ((REG_P (inside) && REGNO (inside) == GBR_REG)
282           || (GET_CODE (inside) == PLUS && REG_P (XEXP (inside, 0))
283               && REGNO (XEXP (inside, 0)) == GBR_REG))
284         return 0;
286       if (GET_CODE (inside) == CONST)
287         inside = XEXP (inside, 0);
289       if (GET_CODE (inside) == LABEL_REF)
290         return 1;
292       if (GET_CODE (inside) == PLUS
293           && GET_CODE (XEXP (inside, 0)) == LABEL_REF
294           && CONST_INT_P (XEXP (inside, 1)))
295         return 1;
297       /* Only post inc allowed.  */
298       if (GET_CODE (inside) == PRE_DEC)
299         return 0;
300     }
302   if (mode == GET_MODE (op)
303       && (MEM_P (op) || (GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))))
304     {
305       rtx mem_rtx = MEM_P (op) ? op : SUBREG_REG (op);
306       rtx x = XEXP (mem_rtx, 0);
308       if (GET_CODE (x) == PLUS)
309         {
310           rtx y = XEXP (x, 0);
312           if (! REG_P (y)
313               && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y))))
314             return false;
315           y = XEXP (x, 1);
316           if (! REG_P (y)
317               && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y)))
318               && ! CONST_INT_P (y))
319             return false;
320         }
322       /* LRA will try to satisfy the constraints for the memory displacements
323          and thus we must not reject invalid displacements in the predicate,
324          or else LRA will bail out.
325          FIXME: maybe remove this check completely?  */
326       if (!lra_in_progress && (mode == QImode || mode == HImode)
327           && GET_CODE (x) == PLUS
328           && REG_P (XEXP (x, 0))
329           && CONST_INT_P (XEXP (x, 1)))
330         return sh_legitimate_index_p (mode, XEXP (x, 1), TARGET_SH2A, false);
332       /* Allow reg+reg addressing here without validating the register
333          numbers.  Usually one of the regs must be R0 or a pseudo reg.
334          In some cases it can happen that arguments from hard regs are
335          propagated directly into address expressions.  In this cases reload
336          will have to fix it up later.  However, allow this only for native
337          1, 2 or 4 byte addresses.  */
338       if (can_create_pseudo_p () && GET_CODE (x) == PLUS
339           && GET_MODE_SIZE (mode) <= 4
340           && REG_P (XEXP (x, 0)) && REG_P (XEXP (x, 1)))
341         return true;
343       /* 'general_operand' does not allow volatile mems during RTL expansion to
344          avoid matching arithmetic that operates on mems, it seems.
345          On SH this leads to redundant sign extensions for QImode or HImode
346          loads.  Thus we mimic the behavior but allow volatile mems.  */
347         if (memory_address_addr_space_p (GET_MODE (mem_rtx), x,
348                                          MEM_ADDR_SPACE (mem_rtx)))
349           return true;
350     }
352   return general_operand (op, mode);
355 ;; Returns true if OP is a MEM that does not use displacement addressing.
356 (define_predicate "movsrc_no_disp_mem_operand"
357   (and (match_code "mem")
358        (match_operand 0 "general_movsrc_operand")
359        (match_test "satisfies_constraint_Snd (op)")))
361 ;; Returns 1 if OP can be a destination of a move. Same as
362 ;; general_operand, but no preinc allowed.
363 (define_predicate "general_movdst_operand"
364   (match_code "subreg,reg,mem")
366   if (t_reg_operand (op, mode))
367     return 0;
369   if (fpscr_operand (op, mode))
370     return false;
372   if (MEM_P (op))
373     {
374       rtx inside = XEXP (op, 0);
375       /* Disallow mems with GBR address here.  They have to go through
376          separate special patterns.  */
377       if ((REG_P (inside) && REGNO (inside) == GBR_REG)
378           || (GET_CODE (inside) == PLUS && REG_P (XEXP (inside, 0))
379               && REGNO (XEXP (inside, 0)) == GBR_REG))
380         return 0;
381     }
383   /* Only pre dec allowed.  */
384   if (MEM_P (op) && GET_CODE (XEXP (op, 0)) == POST_INC)
385     return 0;
387   if (mode == GET_MODE (op)
388       && (MEM_P (op) || (GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))))
389     {
390       rtx mem_rtx = MEM_P (op) ? op : SUBREG_REG (op);
391       rtx x = XEXP (mem_rtx, 0);
393       if (GET_CODE (x) == PLUS)
394         {
395           rtx y = XEXP (x, 0);
397           if (! REG_P (y)
398               && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y))))
399             return false;
400           y = XEXP (x, 1);
401           if (! REG_P (y)
402               && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y)))
403               && ! CONST_INT_P (y))
404             return false;
405         }
407       /* LRA will try to satisfy the constraints for the memory displacements
408          and thus we must not reject invalid displacements in the predicate,
409          or else LRA will bail out.
410          FIXME: maybe remove this check completely?  */
411       if (!lra_in_progress && (mode == QImode || mode == HImode)
412           && GET_CODE (x) == PLUS
413           && REG_P (XEXP (x, 0))
414           && CONST_INT_P (XEXP (x, 1)))
415         return sh_legitimate_index_p (mode, XEXP (x, 1), TARGET_SH2A, false);
417       /* Allow reg+reg addressing here without validating the register
418          numbers.  Usually one of the regs must be R0 or a pseudo reg.
419          In some cases it can happen that arguments from hard regs are
420          propagated directly into address expressions.  In this cases reload
421          will have to fix it up later.  However, allow this only for native
422          1, 2 or 4 byte addresses.  */
423       if (can_create_pseudo_p () && GET_CODE (x) == PLUS
424           && GET_MODE_SIZE (mode) <= 4
425           && REG_P (XEXP (x, 0)) && REG_P (XEXP (x, 1)))
426         return true;
428       /* 'general_operand' does not allow volatile mems during RTL expansion to
429          avoid matching arithmetic that operates on mems, it seems.
430          On SH this leads to redundant sign extensions for QImode or HImode
431          stores.  Thus we mimic the behavior but allow volatile mems.  */
432         if (memory_address_addr_space_p (GET_MODE (mem_rtx), x,
433                                          MEM_ADDR_SPACE (mem_rtx)))
434           return true;
435     }
437   return general_operand (op, mode);
440 ;; Returns 1 if OP is a MEM that can be source of a simple move operation.
441 (define_predicate "unaligned_load_operand"
442   (match_code "mem")
444   rtx inside;
446   if (!MEM_P (op) || GET_MODE (op) != mode)
447     return 0;
449   inside = XEXP (op, 0);
451   if (GET_CODE (inside) == POST_INC)
452     inside = XEXP (inside, 0);
454   if (REG_P (inside))
455     return 1;
457   return 0;
460 ;; Returns 1 if OP is a MEM that can be used in "index_disp" combiner
461 ;; patterns.
462 (define_predicate "mem_index_disp_operand"
463   (match_code "mem")
465   rtx plus0_rtx, plus1_rtx, mult_rtx;
467   plus0_rtx = XEXP (op, 0);
468   if (GET_CODE (plus0_rtx) != PLUS)
469     return 0;
471   plus1_rtx = XEXP (plus0_rtx, 0);
472   if (GET_CODE (plus1_rtx) != PLUS)
473     return 0;
474   if (! arith_reg_operand (XEXP (plus1_rtx, 1), GET_MODE (XEXP (plus1_rtx, 1))))
475     return 0;
477   mult_rtx = XEXP (plus1_rtx, 0);
478   if (GET_CODE (mult_rtx) != MULT)
479     return 0;
480   if (! arith_reg_operand (XEXP (mult_rtx, 0), GET_MODE (XEXP (mult_rtx, 0)))
481       || ! CONST_INT_P (XEXP (mult_rtx, 1)))
482     return 0;
484   return exact_log2 (INTVAL (XEXP (mult_rtx, 1))) > 0
485          && sh_legitimate_index_p (mode, XEXP (plus0_rtx, 1), TARGET_SH2A, true);
488 ;; Returns true if OP is a valid source operand for a logical operation.
489 (define_predicate "logical_operand"
490   (and (match_code "subreg,reg,const_int")
491        (ior (match_operand 0 "arith_reg_operand")
492             (match_test "satisfies_constraint_K08 (op)"))))
494 ;; Returns true if OP is a valid constant source operand for a logical
495 ;; operations tst/and/or/xor #imm,r0.
496 (define_predicate "const_logical_operand"
497   (and (match_code "const_int")
498        (match_test "satisfies_constraint_K08 (op)")))
500 ;; Like logical_operand but allows additional constant values which can be
501 ;; done with zero extensions.  Used for the second operand of and insns.
502 (define_predicate "logical_and_operand"
503   (and (match_code "subreg,reg,const_int")
504        (ior (match_operand 0 "logical_operand")
505             (match_test "satisfies_constraint_Jmb (op)")
506             (match_test "satisfies_constraint_Jmw (op)"))))
508 ;; Returns true if OP is a logical operator.
509 (define_predicate "logical_operator"
510   (match_code "and,ior,xor"))
512 ;; Returns true if OP is a constant vector.
513 (define_predicate "sh_const_vec"
514   (match_code "const_vector")
516   for (int i = XVECLEN (op, 0) - 1; i >= 0; i--)
517     if (!CONST_INT_P (XVECEXP (op, 0, i)))
518       return false;
519   return true;
522 ;; Determine if OP is a constant vector matching MODE with only one
523 ;; element that is not a sign extension.  Two byte-sized elements
524 ;; count as one.
525 (define_predicate "sh_1el_vec"
526   (match_code "const_vector")
528   /* Determine numbers of last and of least significant elements.  */
529   int last = XVECLEN (op, 0) - 1;
530   int least = TARGET_LITTLE_ENDIAN ? 0 : last;
531   if (!CONST_INT_P (XVECEXP (op, 0, least)))
532     return false;
533   int sign_ix = least;
534   if (GET_MODE_UNIT_SIZE (mode) == 1)
535     sign_ix = TARGET_LITTLE_ENDIAN ? 1 : last - 1;
536   if (!CONST_INT_P (XVECEXP (op, 0, sign_ix)))
537     return false;
538   int unit_size = GET_MODE_UNIT_SIZE (GET_MODE (op));
539   rtx sign = INTVAL (XVECEXP (op, 0, sign_ix)) >> (unit_size * BITS_PER_UNIT - 1)
540              ? constm1_rtx : const0_rtx;
541   int i = XVECLEN (op, 0) - 1;
542   do
543     if (i != least && i != sign_ix && XVECEXP (op, 0, i) != sign)
544       return 0;
545   while (--i);
546   return true;
549 ;; Returns true if OP is a vector which is composed of one element that is
550 ;; repeated.
551 (define_predicate "sh_rep_vec"
552   (match_code "const_vector,parallel")
554   int i = XVECLEN (op, 0) - 2;
555   rtx x = XVECEXP (op, 0, i + 1);
556   if (GET_MODE_UNIT_SIZE (mode) == 1)
557     {
558       rtx y = XVECEXP (op, 0, i);
559       for (i -= 2; i >= 0; i -= 2)
560         if (! rtx_equal_p (XVECEXP (op, 0, i + 1), x)
561             || ! rtx_equal_p (XVECEXP (op, 0, i), y))
562           return false;
563     }
564   else
565     for (; i >= 0; i--)
566       if (XVECEXP (op, 0, i) != x)
567         return false;
568   return true;
571 ;; Returns true if OP is a valid shift count operand for shift operations.
572 (define_predicate "shift_count_operand"
573   (match_code "const_int,const_double,const,symbol_ref,label_ref,subreg,reg,
574                zero_extend,sign_extend")
576   /* Allow T_REG as shift count for dynamic shifts, although it is not
577      really possible.  It will then be copied to a general purpose reg.  */
578   return const_int_operand (op, mode) || arith_reg_operand (op, mode)
579          || (TARGET_DYNSHIFT && t_reg_operand (op, mode));
582 ;; Predicates for matching operands that are constant shift
583 ;; amounts 1, 2, 8, 16.
584 (define_predicate "p27_shift_count_operand"
585   (and (match_code "const_int")
586        (match_test "satisfies_constraint_P27 (op)")))
588 (define_predicate "not_p27_shift_count_operand"
589   (and (match_code "const_int")
590        (match_test "! satisfies_constraint_P27 (op)")))
592 ;; For right shifts the constant 1 is a special case because the shlr insn
593 ;; clobbers the T_REG and is handled by the T_REG clobbering version of the
594 ;; insn, which is also used for non-P27 shift sequences.
595 (define_predicate "p27_rshift_count_operand"
596   (and (match_code "const_int")
597        (match_test "satisfies_constraint_P27 (op)")
598        (match_test "! satisfies_constraint_M (op)")))
600 (define_predicate "not_p27_rshift_count_operand"
601   (and (match_code "const_int")
602        (ior (match_test "! satisfies_constraint_P27 (op)")
603             (match_test "satisfies_constraint_M (op)"))))
605 ;; Returns true if OP is a symbol reference.
606 (define_predicate "symbol_ref_operand"
607   (match_code "symbol_ref"))
609 (define_predicate "bitwise_memory_operand"
610   (match_code "mem")
612   if (MEM_P (op))
613     {
614       if (REG_P (XEXP (op, 0)))
615         return 1;
617       if (GET_CODE (XEXP (op, 0)) == PLUS
618           && REG_P (XEXP (XEXP (op, 0), 0))
619           && satisfies_constraint_K12 (XEXP (XEXP (op, 0), 1)))
620         return 1;
621     }
622   return 0;
625 ;; A predicate that matches any expression for which there is an
626 ;; insn pattern that sets the T bit.
627 (define_predicate "treg_set_expr"
628   (match_test "sh_recog_treg_set_expr (op, mode)"))
630 ;; Same as treg_set_expr but disallow constants 0 and 1 which can be loaded
631 ;; into the T bit.
632 (define_predicate "treg_set_expr_not_const01"
633   (and (match_test "op != const0_rtx")
634        (match_test "op != const1_rtx")
635        (match_operand 0 "treg_set_expr")))
637 ;; A predicate describing the T bit register in any form.
638 (define_predicate "t_reg_operand"
639   (match_code "reg,subreg,sign_extend,zero_extend,ne,eq")
641   switch (GET_CODE (op))
642     {
643       case EQ:
644         return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)))
645                && XEXP (op, 1) == const1_rtx;
647       case NE:
648         return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)))
649                && XEXP (op, 1) == const0_rtx;
651       case REG:
652         return REGNO (op) == T_REG;
654       case SUBREG:
655         return REG_P (SUBREG_REG (op)) && REGNO (SUBREG_REG (op)) == T_REG;
657       case ZERO_EXTEND:
658       case SIGN_EXTEND:
659         if (REG_P (XEXP (op, 0)) && REGNO (XEXP (op, 0)) == T_REG)
660           return true;
661         return GET_CODE (XEXP (op, 0)) == SUBREG
662                && REG_P (SUBREG_REG (XEXP (op, 0)))
663                && REGNO (SUBREG_REG (XEXP (op, 0))) == T_REG;
665       default:
666         return 0;
667     }
670 ;; A predicate describing a negated T bit register.
671 (define_predicate "negt_reg_operand"
672   (match_code "subreg,xor,ne,eq")
674   switch (GET_CODE (op))
675     {
676       case EQ:
677         return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)))
678                && XEXP (op, 1) == const0_rtx;
680       case NE:
681         return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)))
682                && XEXP (op, 1) == const1_rtx;
684       case XOR:
685         return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)))
686                && XEXP (op, 1) == const1_rtx;
688       case SUBREG:
689         return negt_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)));
691       default:
692         return 0;
693     }
696 ;; Returns true if OP is an operand that can be used as the first operand in
697 ;; the cstoresi4 expander pattern.
698 (define_predicate "cmpsi_operand"
699   (and (match_code "subreg,reg,const_int")
700        (ior (match_operand:SI 0 "t_reg_operand")
701             (match_operand 0 "arith_operand"))))
703 ;; A predicate that returns true if OP is a valid construct around the T bit
704 ;; that can be used as an operand for conditional branches.
705 (define_predicate "cbranch_treg_value"
706   (and (match_code "eq,ne,reg,subreg,xor,sign_extend,zero_extend")
707        (match_test "sh_eval_treg_value (op) >= 0")))
709 ;; Returns true if OP is arith_reg_operand or t_reg_operand.
710 (define_predicate "arith_reg_or_t_reg_operand"
711   (ior (match_operand 0 "arith_reg_operand")
712        (match_operand 0 "t_reg_operand")))
714 (define_predicate "arith_reg_or_treg_set_expr"
715   (ior (match_operand 0 "arith_reg_operand")
716        (match_operand 0 "treg_set_expr")))
718 ;; A predicate describing the negated value of the T bit register shifted
719 ;; left by 31.
720 (define_predicate "negt_reg_shl31_operand"
721   (match_code "plus,minus,if_then_else")
723   /* (minus:SI (const_int -2147483648)  ;; 0xffffffff80000000
724                (ashift:SI (match_operand:SI 1 "t_reg_operand")
725                           (const_int 31)))
726   */
727   if (GET_CODE (op) == MINUS && satisfies_constraint_Jhb (XEXP (op, 0))
728       && GET_CODE (XEXP (op, 1)) == ASHIFT
729       && t_reg_operand (XEXP (XEXP (op, 1), 0), SImode)
730       && CONST_INT_P (XEXP (XEXP (op, 1), 1))
731       && INTVAL (XEXP (XEXP (op, 1), 1)) == 31)
732     return true;
734   /* (plus:SI (ashift:SI (match_operand:SI 1 "t_reg_operand")
735                          (const_int 31))
736               (const_int -2147483648))  ;; 0xffffffff80000000
737   */
738   if (GET_CODE (op) == PLUS && satisfies_constraint_Jhb (XEXP (op, 1))
739       && GET_CODE (XEXP (op, 0)) == ASHIFT
740       && t_reg_operand (XEXP (XEXP (op, 0), 0), SImode)
741       && CONST_INT_P (XEXP (XEXP (op, 0), 1))
742       && INTVAL (XEXP (XEXP (op, 0), 1)) == 31)
743     return true;
745   /* (plus:SI (mult:SI (match_operand:SI 1 "t_reg_operand")
746                        (const_int -2147483648))  ;; 0xffffffff80000000
747               (const_int -2147483648))
748   */
749   if (GET_CODE (op) == PLUS && satisfies_constraint_Jhb (XEXP (op, 1))
750       && GET_CODE (XEXP (op, 0)) == MULT
751       && t_reg_operand (XEXP (XEXP (op, 0), 0), SImode)
752       && satisfies_constraint_Jhb (XEXP (XEXP (op, 0), 1)))
753     return true;
755   /* (minus:SI (const_int -2147483648)  ;; 0xffffffff80000000
756                (mult:SI (match_operand:SI 1 "t_reg_operand")
757                         (const_int -2147483648)))
758   */
759   if (GET_CODE (op) == MINUS
760       && satisfies_constraint_Jhb (XEXP (op, 0))
761       && GET_CODE (XEXP (op, 1)) == MULT
762       && t_reg_operand (XEXP (XEXP (op, 1), 0), SImode)
763       && satisfies_constraint_Jhb (XEXP (XEXP (op, 1), 1)))
764     return true;
766   /*  (if_then_else:SI (match_operand:SI 1 "t_reg_operand")
767                        (const_int 0)
768                        (const_int -2147483648))  ;; 0xffffffff80000000
769   */
770   if (GET_CODE (op) == IF_THEN_ELSE && t_reg_operand (XEXP (op, 0), SImode)
771       && satisfies_constraint_Z (XEXP (op, 1))
772       && satisfies_constraint_Jhb (XEXP (op, 2)))
773     return true;
775   return false;
778 ;; A predicate that determines whether a given constant is a valid
779 ;; displacement for a GBR load/store of the specified mode.
780 (define_predicate "gbr_displacement"
781   (match_code "const_int")
783   const int mode_sz = GET_MODE_SIZE (mode);
784   const int move_sz = mode_sz > GET_MODE_SIZE (SImode)
785                                 ? GET_MODE_SIZE (SImode)
786                                 : mode_sz;
787   int max_disp = 255 * move_sz;
788   if (mode_sz > move_sz)
789     max_disp -= mode_sz - move_sz;
791   return INTVAL (op) >= 0 && INTVAL (op) <= max_disp;
794 ;; A predicate that determines whether OP is a valid GBR addressing mode
795 ;; memory reference.
796 (define_predicate "gbr_address_mem"
797   (match_code "mem")
799   rtx addr = XEXP (op, 0);
801   if (REG_P (addr) && REGNO (addr) == GBR_REG)
802     return true;
803   if (GET_CODE (addr) == PLUS
804       && REG_P (XEXP (addr, 0)) && REGNO (XEXP (addr, 0)) == GBR_REG
805       && gbr_displacement (XEXP (addr, 1), mode))
806     return true;
808   return false;