1 ;; Predicate definitions for Renesas / SuperH SH.
2 ;; Copyright (C) 2005-2018 Free Software Foundation, Inc.
4 ;; This file is part of GCC.
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)
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))
31 else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op)))
32 regno = REGNO (SUBREG_REG (op));
36 return (regno != T_REG && regno != PR_REG
37 && regno != FPUL_REG && regno != FPSCR_REG
38 && regno != MACH_REG && regno != MACL_REG);
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);
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);
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))
124 else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op)))
125 regno = REGNO (SUBREG_REG (op));
129 return (regno >= FIRST_PSEUDO_REGISTER
130 || FP_REGISTER_P (regno));
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))
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))
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"
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
177 ;; (fix:SF (float:SF (reg:SI)))
178 (define_predicate "fpul_fsca_operand"
179 (match_code "fix,reg")
181 if (fpul_operand (op, SImode))
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)));
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,
264 if (t_reg_operand (op, mode))
267 if (fpscr_operand (op, mode))
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)
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))
286 if (GET_CODE (inside) == CONST)
287 inside = XEXP (inside, 0);
289 if (GET_CODE (inside) == LABEL_REF)
292 if (GET_CODE (inside) == PLUS
293 && GET_CODE (XEXP (inside, 0)) == LABEL_REF
294 && CONST_INT_P (XEXP (inside, 1)))
297 /* Only post inc allowed. */
298 if (GET_CODE (inside) == PRE_DEC)
302 if (mode == GET_MODE (op)
303 && (MEM_P (op) || (GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))))
305 rtx mem_rtx = MEM_P (op) ? op : SUBREG_REG (op);
306 rtx x = XEXP (mem_rtx, 0);
308 if (GET_CODE (x) == PLUS)
313 && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y))))
317 && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y)))
318 && ! CONST_INT_P (y))
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)))
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)))
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))
369 if (fpscr_operand (op, mode))
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))
383 /* Only pre dec allowed. */
384 if (MEM_P (op) && GET_CODE (XEXP (op, 0)) == POST_INC)
387 if (mode == GET_MODE (op)
388 && (MEM_P (op) || (GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))))
390 rtx mem_rtx = MEM_P (op) ? op : SUBREG_REG (op);
391 rtx x = XEXP (mem_rtx, 0);
393 if (GET_CODE (x) == PLUS)
398 && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y))))
402 && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y)))
403 && ! CONST_INT_P (y))
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)))
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)))
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"
446 if (!MEM_P (op) || GET_MODE (op) != mode)
449 inside = XEXP (op, 0);
451 if (GET_CODE (inside) == POST_INC)
452 inside = XEXP (inside, 0);
460 ;; Returns 1 if OP is a MEM that can be used in "index_disp" combiner
462 (define_predicate "mem_index_disp_operand"
465 rtx plus0_rtx, plus1_rtx, mult_rtx;
467 plus0_rtx = XEXP (op, 0);
468 if (GET_CODE (plus0_rtx) != PLUS)
471 plus1_rtx = XEXP (plus0_rtx, 0);
472 if (GET_CODE (plus1_rtx) != PLUS)
474 if (! arith_reg_operand (XEXP (plus1_rtx, 1), GET_MODE (XEXP (plus1_rtx, 1))))
477 mult_rtx = XEXP (plus1_rtx, 0);
478 if (GET_CODE (mult_rtx) != MULT)
480 if (! arith_reg_operand (XEXP (mult_rtx, 0), GET_MODE (XEXP (mult_rtx, 0)))
481 || ! CONST_INT_P (XEXP (mult_rtx, 1)))
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)))
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
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)))
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)))
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;
543 if (i != least && i != sign_ix && XVECEXP (op, 0, i) != sign)
549 ;; Returns true if OP is a vector which is composed of one element that is
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)
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))
566 if (XVECEXP (op, 0, i) != x)
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"
614 if (REG_P (XEXP (op, 0)))
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)))
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
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))
644 return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)))
645 && XEXP (op, 1) == const1_rtx;
648 return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)))
649 && XEXP (op, 1) == const0_rtx;
652 return REGNO (op) == T_REG;
655 return REG_P (SUBREG_REG (op)) && REGNO (SUBREG_REG (op)) == T_REG;
659 if (REG_P (XEXP (op, 0)) && REGNO (XEXP (op, 0)) == T_REG)
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;
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))
677 return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)))
678 && XEXP (op, 1) == const0_rtx;
681 return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)))
682 && XEXP (op, 1) == const1_rtx;
685 return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)))
686 && XEXP (op, 1) == const1_rtx;
689 return negt_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0)));
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
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")
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)
734 /* (plus:SI (ashift:SI (match_operand:SI 1 "t_reg_operand")
736 (const_int -2147483648)) ;; 0xffffffff80000000
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)
745 /* (plus:SI (mult:SI (match_operand:SI 1 "t_reg_operand")
746 (const_int -2147483648)) ;; 0xffffffff80000000
747 (const_int -2147483648))
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)))
755 /* (minus:SI (const_int -2147483648) ;; 0xffffffff80000000
756 (mult:SI (match_operand:SI 1 "t_reg_operand")
757 (const_int -2147483648)))
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)))
766 /* (if_then_else:SI (match_operand:SI 1 "t_reg_operand")
768 (const_int -2147483648)) ;; 0xffffffff80000000
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)))
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)
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
796 (define_predicate "gbr_address_mem"
799 rtx addr = XEXP (op, 0);
801 if (REG_P (addr) && REGNO (addr) == GBR_REG)
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))