xref: /openbsd/gnu/gcc/gcc/recog.c (revision 404b540a)
1 /* Subroutines used by or related to instruction recognition.
2    Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
3    1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA.  */
21 
22 
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "insn-config.h"
30 #include "insn-attr.h"
31 #include "hard-reg-set.h"
32 #include "recog.h"
33 #include "regs.h"
34 #include "addresses.h"
35 #include "expr.h"
36 #include "function.h"
37 #include "flags.h"
38 #include "real.h"
39 #include "toplev.h"
40 #include "basic-block.h"
41 #include "output.h"
42 #include "reload.h"
43 #include "timevar.h"
44 #include "tree-pass.h"
45 
46 #ifndef STACK_PUSH_CODE
47 #ifdef STACK_GROWS_DOWNWARD
48 #define STACK_PUSH_CODE PRE_DEC
49 #else
50 #define STACK_PUSH_CODE PRE_INC
51 #endif
52 #endif
53 
54 #ifndef STACK_POP_CODE
55 #ifdef STACK_GROWS_DOWNWARD
56 #define STACK_POP_CODE POST_INC
57 #else
58 #define STACK_POP_CODE POST_DEC
59 #endif
60 #endif
61 
62 static void validate_replace_rtx_1 (rtx *, rtx, rtx, rtx);
63 static rtx *find_single_use_1 (rtx, rtx *);
64 static void validate_replace_src_1 (rtx *, void *);
65 static rtx split_insn (rtx);
66 
67 /* Nonzero means allow operands to be volatile.
68    This should be 0 if you are generating rtl, such as if you are calling
69    the functions in optabs.c and expmed.c (most of the time).
70    This should be 1 if all valid insns need to be recognized,
71    such as in regclass.c and final.c and reload.c.
72 
73    init_recog and init_recog_no_volatile are responsible for setting this.  */
74 
75 int volatile_ok;
76 
77 struct recog_data recog_data;
78 
79 /* Contains a vector of operand_alternative structures for every operand.
80    Set up by preprocess_constraints.  */
81 struct operand_alternative recog_op_alt[MAX_RECOG_OPERANDS][MAX_RECOG_ALTERNATIVES];
82 
83 /* On return from `constrain_operands', indicate which alternative
84    was satisfied.  */
85 
86 int which_alternative;
87 
88 /* Nonzero after end of reload pass.
89    Set to 1 or 0 by toplev.c.
90    Controls the significance of (SUBREG (MEM)).  */
91 
92 int reload_completed;
93 
94 /* Nonzero after thread_prologue_and_epilogue_insns has run.  */
95 int epilogue_completed;
96 
97 /* Initialize data used by the function `recog'.
98    This must be called once in the compilation of a function
99    before any insn recognition may be done in the function.  */
100 
101 void
init_recog_no_volatile(void)102 init_recog_no_volatile (void)
103 {
104   volatile_ok = 0;
105 }
106 
107 void
init_recog(void)108 init_recog (void)
109 {
110   volatile_ok = 1;
111 }
112 
113 
114 /* Check that X is an insn-body for an `asm' with operands
115    and that the operands mentioned in it are legitimate.  */
116 
117 int
check_asm_operands(rtx x)118 check_asm_operands (rtx x)
119 {
120   int noperands;
121   rtx *operands;
122   const char **constraints;
123   int i;
124 
125   /* Post-reload, be more strict with things.  */
126   if (reload_completed)
127     {
128       /* ??? Doh!  We've not got the wrapping insn.  Cook one up.  */
129       extract_insn (make_insn_raw (x));
130       constrain_operands (1);
131       return which_alternative >= 0;
132     }
133 
134   noperands = asm_noperands (x);
135   if (noperands < 0)
136     return 0;
137   if (noperands == 0)
138     return 1;
139 
140   operands = alloca (noperands * sizeof (rtx));
141   constraints = alloca (noperands * sizeof (char *));
142 
143   decode_asm_operands (x, operands, NULL, constraints, NULL);
144 
145   for (i = 0; i < noperands; i++)
146     {
147       const char *c = constraints[i];
148       if (c[0] == '%')
149 	c++;
150       if (ISDIGIT ((unsigned char) c[0]) && c[1] == '\0')
151 	c = constraints[c[0] - '0'];
152 
153       if (! asm_operand_ok (operands[i], c))
154 	return 0;
155     }
156 
157   return 1;
158 }
159 
160 /* Static data for the next two routines.  */
161 
162 typedef struct change_t
163 {
164   rtx object;
165   int old_code;
166   rtx *loc;
167   rtx old;
168 } change_t;
169 
170 static change_t *changes;
171 static int changes_allocated;
172 
173 static int num_changes = 0;
174 
175 /* Validate a proposed change to OBJECT.  LOC is the location in the rtl
176    at which NEW will be placed.  If OBJECT is zero, no validation is done,
177    the change is simply made.
178 
179    Two types of objects are supported:  If OBJECT is a MEM, memory_address_p
180    will be called with the address and mode as parameters.  If OBJECT is
181    an INSN, CALL_INSN, or JUMP_INSN, the insn will be re-recognized with
182    the change in place.
183 
184    IN_GROUP is nonzero if this is part of a group of changes that must be
185    performed as a group.  In that case, the changes will be stored.  The
186    function `apply_change_group' will validate and apply the changes.
187 
188    If IN_GROUP is zero, this is a single change.  Try to recognize the insn
189    or validate the memory reference with the change applied.  If the result
190    is not valid for the machine, suppress the change and return zero.
191    Otherwise, perform the change and return 1.  */
192 
193 int
validate_change(rtx object,rtx * loc,rtx new,int in_group)194 validate_change (rtx object, rtx *loc, rtx new, int in_group)
195 {
196   rtx old = *loc;
197 
198   if (old == new || rtx_equal_p (old, new))
199     return 1;
200 
201   gcc_assert (in_group != 0 || num_changes == 0);
202 
203   *loc = new;
204 
205   /* Save the information describing this change.  */
206   if (num_changes >= changes_allocated)
207     {
208       if (changes_allocated == 0)
209 	/* This value allows for repeated substitutions inside complex
210 	   indexed addresses, or changes in up to 5 insns.  */
211 	changes_allocated = MAX_RECOG_OPERANDS * 5;
212       else
213 	changes_allocated *= 2;
214 
215       changes = xrealloc (changes, sizeof (change_t) * changes_allocated);
216     }
217 
218   changes[num_changes].object = object;
219   changes[num_changes].loc = loc;
220   changes[num_changes].old = old;
221 
222   if (object && !MEM_P (object))
223     {
224       /* Set INSN_CODE to force rerecognition of insn.  Save old code in
225 	 case invalid.  */
226       changes[num_changes].old_code = INSN_CODE (object);
227       INSN_CODE (object) = -1;
228     }
229 
230   num_changes++;
231 
232   /* If we are making a group of changes, return 1.  Otherwise, validate the
233      change group we made.  */
234 
235   if (in_group)
236     return 1;
237   else
238     return apply_change_group ();
239 }
240 
241 
242 /* This subroutine of apply_change_group verifies whether the changes to INSN
243    were valid; i.e. whether INSN can still be recognized.  */
244 
245 int
insn_invalid_p(rtx insn)246 insn_invalid_p (rtx insn)
247 {
248   rtx pat = PATTERN (insn);
249   int num_clobbers = 0;
250   /* If we are before reload and the pattern is a SET, see if we can add
251      clobbers.  */
252   int icode = recog (pat, insn,
253 		     (GET_CODE (pat) == SET
254 		      && ! reload_completed && ! reload_in_progress)
255 		     ? &num_clobbers : 0);
256   int is_asm = icode < 0 && asm_noperands (PATTERN (insn)) >= 0;
257 
258 
259   /* If this is an asm and the operand aren't legal, then fail.  Likewise if
260      this is not an asm and the insn wasn't recognized.  */
261   if ((is_asm && ! check_asm_operands (PATTERN (insn)))
262       || (!is_asm && icode < 0))
263     return 1;
264 
265   /* If we have to add CLOBBERs, fail if we have to add ones that reference
266      hard registers since our callers can't know if they are live or not.
267      Otherwise, add them.  */
268   if (num_clobbers > 0)
269     {
270       rtx newpat;
271 
272       if (added_clobbers_hard_reg_p (icode))
273 	return 1;
274 
275       newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num_clobbers + 1));
276       XVECEXP (newpat, 0, 0) = pat;
277       add_clobbers (newpat, icode);
278       PATTERN (insn) = pat = newpat;
279     }
280 
281   /* After reload, verify that all constraints are satisfied.  */
282   if (reload_completed)
283     {
284       extract_insn (insn);
285 
286       if (! constrain_operands (1))
287 	return 1;
288     }
289 
290   INSN_CODE (insn) = icode;
291   return 0;
292 }
293 
294 /* Return number of changes made and not validated yet.  */
295 int
num_changes_pending(void)296 num_changes_pending (void)
297 {
298   return num_changes;
299 }
300 
301 /* Tentatively apply the changes numbered NUM and up.
302    Return 1 if all changes are valid, zero otherwise.  */
303 
304 int
verify_changes(int num)305 verify_changes (int num)
306 {
307   int i;
308   rtx last_validated = NULL_RTX;
309 
310   /* The changes have been applied and all INSN_CODEs have been reset to force
311      rerecognition.
312 
313      The changes are valid if we aren't given an object, or if we are
314      given a MEM and it still is a valid address, or if this is in insn
315      and it is recognized.  In the latter case, if reload has completed,
316      we also require that the operands meet the constraints for
317      the insn.  */
318 
319   for (i = num; i < num_changes; i++)
320     {
321       rtx object = changes[i].object;
322 
323       /* If there is no object to test or if it is the same as the one we
324          already tested, ignore it.  */
325       if (object == 0 || object == last_validated)
326 	continue;
327 
328       if (MEM_P (object))
329 	{
330 	  if (! memory_address_p (GET_MODE (object), XEXP (object, 0)))
331 	    break;
332 	}
333       else if (insn_invalid_p (object))
334 	{
335 	  rtx pat = PATTERN (object);
336 
337 	  /* Perhaps we couldn't recognize the insn because there were
338 	     extra CLOBBERs at the end.  If so, try to re-recognize
339 	     without the last CLOBBER (later iterations will cause each of
340 	     them to be eliminated, in turn).  But don't do this if we
341 	     have an ASM_OPERAND.  */
342 	  if (GET_CODE (pat) == PARALLEL
343 	      && GET_CODE (XVECEXP (pat, 0, XVECLEN (pat, 0) - 1)) == CLOBBER
344 	      && asm_noperands (PATTERN (object)) < 0)
345 	    {
346 	      rtx newpat;
347 
348 	      if (XVECLEN (pat, 0) == 2)
349 		newpat = XVECEXP (pat, 0, 0);
350 	      else
351 		{
352 		  int j;
353 
354 		  newpat
355 		    = gen_rtx_PARALLEL (VOIDmode,
356 					rtvec_alloc (XVECLEN (pat, 0) - 1));
357 		  for (j = 0; j < XVECLEN (newpat, 0); j++)
358 		    XVECEXP (newpat, 0, j) = XVECEXP (pat, 0, j);
359 		}
360 
361 	      /* Add a new change to this group to replace the pattern
362 		 with this new pattern.  Then consider this change
363 		 as having succeeded.  The change we added will
364 		 cause the entire call to fail if things remain invalid.
365 
366 		 Note that this can lose if a later change than the one
367 		 we are processing specified &XVECEXP (PATTERN (object), 0, X)
368 		 but this shouldn't occur.  */
369 
370 	      validate_change (object, &PATTERN (object), newpat, 1);
371 	      continue;
372 	    }
373 	  else if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
374 	    /* If this insn is a CLOBBER or USE, it is always valid, but is
375 	       never recognized.  */
376 	    continue;
377 	  else
378 	    break;
379 	}
380       last_validated = object;
381     }
382 
383   return (i == num_changes);
384 }
385 
386 /* A group of changes has previously been issued with validate_change and
387    verified with verify_changes.  Update the BB_DIRTY flags of the affected
388    blocks, and clear num_changes.  */
389 
390 void
confirm_change_group(void)391 confirm_change_group (void)
392 {
393   int i;
394   basic_block bb;
395 
396   for (i = 0; i < num_changes; i++)
397     if (changes[i].object
398 	&& INSN_P (changes[i].object)
399 	&& (bb = BLOCK_FOR_INSN (changes[i].object)))
400       bb->flags |= BB_DIRTY;
401 
402   num_changes = 0;
403 }
404 
405 /* Apply a group of changes previously issued with `validate_change'.
406    If all changes are valid, call confirm_change_group and return 1,
407    otherwise, call cancel_changes and return 0.  */
408 
409 int
apply_change_group(void)410 apply_change_group (void)
411 {
412   if (verify_changes (0))
413     {
414       confirm_change_group ();
415       return 1;
416     }
417   else
418     {
419       cancel_changes (0);
420       return 0;
421     }
422 }
423 
424 
425 /* Return the number of changes so far in the current group.  */
426 
427 int
num_validated_changes(void)428 num_validated_changes (void)
429 {
430   return num_changes;
431 }
432 
433 /* Retract the changes numbered NUM and up.  */
434 
435 void
cancel_changes(int num)436 cancel_changes (int num)
437 {
438   int i;
439 
440   /* Back out all the changes.  Do this in the opposite order in which
441      they were made.  */
442   for (i = num_changes - 1; i >= num; i--)
443     {
444       *changes[i].loc = changes[i].old;
445       if (changes[i].object && !MEM_P (changes[i].object))
446 	INSN_CODE (changes[i].object) = changes[i].old_code;
447     }
448   num_changes = num;
449 }
450 
451 /* Replace every occurrence of FROM in X with TO.  Mark each change with
452    validate_change passing OBJECT.  */
453 
454 static void
validate_replace_rtx_1(rtx * loc,rtx from,rtx to,rtx object)455 validate_replace_rtx_1 (rtx *loc, rtx from, rtx to, rtx object)
456 {
457   int i, j;
458   const char *fmt;
459   rtx x = *loc;
460   enum rtx_code code;
461   enum machine_mode op0_mode = VOIDmode;
462   int prev_changes = num_changes;
463   rtx new;
464 
465   if (!x)
466     return;
467 
468   code = GET_CODE (x);
469   fmt = GET_RTX_FORMAT (code);
470   if (fmt[0] == 'e')
471     op0_mode = GET_MODE (XEXP (x, 0));
472 
473   /* X matches FROM if it is the same rtx or they are both referring to the
474      same register in the same mode.  Avoid calling rtx_equal_p unless the
475      operands look similar.  */
476 
477   if (x == from
478       || (REG_P (x) && REG_P (from)
479 	  && GET_MODE (x) == GET_MODE (from)
480 	  && REGNO (x) == REGNO (from))
481       || (GET_CODE (x) == GET_CODE (from) && GET_MODE (x) == GET_MODE (from)
482 	  && rtx_equal_p (x, from)))
483     {
484       validate_change (object, loc, to, 1);
485       return;
486     }
487 
488   /* Call ourself recursively to perform the replacements.
489      We must not replace inside already replaced expression, otherwise we
490      get infinite recursion for replacements like (reg X)->(subreg (reg X))
491      done by regmove, so we must special case shared ASM_OPERANDS.  */
492 
493   if (GET_CODE (x) == PARALLEL)
494     {
495       for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
496 	{
497 	  if (j && GET_CODE (XVECEXP (x, 0, j)) == SET
498 	      && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == ASM_OPERANDS)
499 	    {
500 	      /* Verify that operands are really shared.  */
501 	      gcc_assert (ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP (x, 0, 0)))
502 			  == ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP
503 							      (x, 0, j))));
504 	      validate_replace_rtx_1 (&SET_DEST (XVECEXP (x, 0, j)),
505 				      from, to, object);
506 	    }
507 	  else
508 	    validate_replace_rtx_1 (&XVECEXP (x, 0, j), from, to, object);
509 	}
510     }
511   else
512     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
513       {
514 	if (fmt[i] == 'e')
515 	  validate_replace_rtx_1 (&XEXP (x, i), from, to, object);
516 	else if (fmt[i] == 'E')
517 	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
518 	    validate_replace_rtx_1 (&XVECEXP (x, i, j), from, to, object);
519       }
520 
521   /* If we didn't substitute, there is nothing more to do.  */
522   if (num_changes == prev_changes)
523     return;
524 
525   /* Allow substituted expression to have different mode.  This is used by
526      regmove to change mode of pseudo register.  */
527   if (fmt[0] == 'e' && GET_MODE (XEXP (x, 0)) != VOIDmode)
528     op0_mode = GET_MODE (XEXP (x, 0));
529 
530   /* Do changes needed to keep rtx consistent.  Don't do any other
531      simplifications, as it is not our job.  */
532 
533   if (SWAPPABLE_OPERANDS_P (x)
534       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
535     {
536       validate_change (object, loc,
537 		       gen_rtx_fmt_ee (COMMUTATIVE_ARITH_P (x) ? code
538 				       : swap_condition (code),
539 				       GET_MODE (x), XEXP (x, 1),
540 				       XEXP (x, 0)), 1);
541       x = *loc;
542       code = GET_CODE (x);
543     }
544 
545   switch (code)
546     {
547     case PLUS:
548       /* If we have a PLUS whose second operand is now a CONST_INT, use
549          simplify_gen_binary to try to simplify it.
550          ??? We may want later to remove this, once simplification is
551          separated from this function.  */
552       if (GET_CODE (XEXP (x, 1)) == CONST_INT && XEXP (x, 1) == to)
553 	validate_change (object, loc,
554 			 simplify_gen_binary
555 			 (PLUS, GET_MODE (x), XEXP (x, 0), XEXP (x, 1)), 1);
556       break;
557     case MINUS:
558       if (GET_CODE (XEXP (x, 1)) == CONST_INT
559 	  || GET_CODE (XEXP (x, 1)) == CONST_DOUBLE)
560 	validate_change (object, loc,
561 			 simplify_gen_binary
562 			 (PLUS, GET_MODE (x), XEXP (x, 0),
563 			  simplify_gen_unary (NEG,
564 					      GET_MODE (x), XEXP (x, 1),
565 					      GET_MODE (x))), 1);
566       break;
567     case ZERO_EXTEND:
568     case SIGN_EXTEND:
569       if (GET_MODE (XEXP (x, 0)) == VOIDmode)
570 	{
571 	  new = simplify_gen_unary (code, GET_MODE (x), XEXP (x, 0),
572 				    op0_mode);
573 	  /* If any of the above failed, substitute in something that
574 	     we know won't be recognized.  */
575 	  if (!new)
576 	    new = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
577 	  validate_change (object, loc, new, 1);
578 	}
579       break;
580     case SUBREG:
581       /* All subregs possible to simplify should be simplified.  */
582       new = simplify_subreg (GET_MODE (x), SUBREG_REG (x), op0_mode,
583 			     SUBREG_BYTE (x));
584 
585       /* Subregs of VOIDmode operands are incorrect.  */
586       if (!new && GET_MODE (SUBREG_REG (x)) == VOIDmode)
587 	new = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
588       if (new)
589 	validate_change (object, loc, new, 1);
590       break;
591     case ZERO_EXTRACT:
592     case SIGN_EXTRACT:
593       /* If we are replacing a register with memory, try to change the memory
594          to be the mode required for memory in extract operations (this isn't
595          likely to be an insertion operation; if it was, nothing bad will
596          happen, we might just fail in some cases).  */
597 
598       if (MEM_P (XEXP (x, 0))
599 	  && GET_CODE (XEXP (x, 1)) == CONST_INT
600 	  && GET_CODE (XEXP (x, 2)) == CONST_INT
601 	  && !mode_dependent_address_p (XEXP (XEXP (x, 0), 0))
602 	  && !MEM_VOLATILE_P (XEXP (x, 0)))
603 	{
604 	  enum machine_mode wanted_mode = VOIDmode;
605 	  enum machine_mode is_mode = GET_MODE (XEXP (x, 0));
606 	  int pos = INTVAL (XEXP (x, 2));
607 
608 	  if (GET_CODE (x) == ZERO_EXTRACT)
609 	    {
610 	      enum machine_mode new_mode
611 		= mode_for_extraction (EP_extzv, 1);
612 	      if (new_mode != MAX_MACHINE_MODE)
613 		wanted_mode = new_mode;
614 	    }
615 	  else if (GET_CODE (x) == SIGN_EXTRACT)
616 	    {
617 	      enum machine_mode new_mode
618 		= mode_for_extraction (EP_extv, 1);
619 	      if (new_mode != MAX_MACHINE_MODE)
620 		wanted_mode = new_mode;
621 	    }
622 
623 	  /* If we have a narrower mode, we can do something.  */
624 	  if (wanted_mode != VOIDmode
625 	      && GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
626 	    {
627 	      int offset = pos / BITS_PER_UNIT;
628 	      rtx newmem;
629 
630 	      /* If the bytes and bits are counted differently, we
631 	         must adjust the offset.  */
632 	      if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN)
633 		offset =
634 		  (GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (wanted_mode) -
635 		   offset);
636 
637 	      pos %= GET_MODE_BITSIZE (wanted_mode);
638 
639 	      newmem = adjust_address_nv (XEXP (x, 0), wanted_mode, offset);
640 
641 	      validate_change (object, &XEXP (x, 2), GEN_INT (pos), 1);
642 	      validate_change (object, &XEXP (x, 0), newmem, 1);
643 	    }
644 	}
645 
646       break;
647 
648     default:
649       break;
650     }
651 }
652 
653 /* Try replacing every occurrence of FROM in INSN with TO.  After all
654    changes have been made, validate by seeing if INSN is still valid.  */
655 
656 int
validate_replace_rtx(rtx from,rtx to,rtx insn)657 validate_replace_rtx (rtx from, rtx to, rtx insn)
658 {
659   validate_replace_rtx_1 (&PATTERN (insn), from, to, insn);
660   return apply_change_group ();
661 }
662 
663 /* Try replacing every occurrence of FROM in INSN with TO.  */
664 
665 void
validate_replace_rtx_group(rtx from,rtx to,rtx insn)666 validate_replace_rtx_group (rtx from, rtx to, rtx insn)
667 {
668   validate_replace_rtx_1 (&PATTERN (insn), from, to, insn);
669 }
670 
671 /* Function called by note_uses to replace used subexpressions.  */
672 struct validate_replace_src_data
673 {
674   rtx from;			/* Old RTX */
675   rtx to;			/* New RTX */
676   rtx insn;			/* Insn in which substitution is occurring.  */
677 };
678 
679 static void
validate_replace_src_1(rtx * x,void * data)680 validate_replace_src_1 (rtx *x, void *data)
681 {
682   struct validate_replace_src_data *d
683     = (struct validate_replace_src_data *) data;
684 
685   validate_replace_rtx_1 (x, d->from, d->to, d->insn);
686 }
687 
688 /* Try replacing every occurrence of FROM in INSN with TO, avoiding
689    SET_DESTs.  */
690 
691 void
validate_replace_src_group(rtx from,rtx to,rtx insn)692 validate_replace_src_group (rtx from, rtx to, rtx insn)
693 {
694   struct validate_replace_src_data d;
695 
696   d.from = from;
697   d.to = to;
698   d.insn = insn;
699   note_uses (&PATTERN (insn), validate_replace_src_1, &d);
700 }
701 
702 /* Try simplify INSN.
703    Invoke simplify_rtx () on every SET_SRC and SET_DEST inside the INSN's
704    pattern and return true if something was simplified.  */
705 
706 bool
validate_simplify_insn(rtx insn)707 validate_simplify_insn (rtx insn)
708 {
709   int i;
710   rtx pat = NULL;
711   rtx newpat = NULL;
712 
713   pat = PATTERN (insn);
714 
715   if (GET_CODE (pat) == SET)
716     {
717       newpat = simplify_rtx (SET_SRC (pat));
718       if (newpat && !rtx_equal_p (SET_SRC (pat), newpat))
719 	validate_change (insn, &SET_SRC (pat), newpat, 1);
720       newpat = simplify_rtx (SET_DEST (pat));
721       if (newpat && !rtx_equal_p (SET_DEST (pat), newpat))
722 	validate_change (insn, &SET_DEST (pat), newpat, 1);
723     }
724   else if (GET_CODE (pat) == PARALLEL)
725     for (i = 0; i < XVECLEN (pat, 0); i++)
726       {
727 	rtx s = XVECEXP (pat, 0, i);
728 
729 	if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
730 	  {
731 	    newpat = simplify_rtx (SET_SRC (s));
732 	    if (newpat && !rtx_equal_p (SET_SRC (s), newpat))
733 	      validate_change (insn, &SET_SRC (s), newpat, 1);
734 	    newpat = simplify_rtx (SET_DEST (s));
735 	    if (newpat && !rtx_equal_p (SET_DEST (s), newpat))
736 	      validate_change (insn, &SET_DEST (s), newpat, 1);
737 	  }
738       }
739   return ((num_changes_pending () > 0) && (apply_change_group () > 0));
740 }
741 
742 #ifdef HAVE_cc0
743 /* Return 1 if the insn using CC0 set by INSN does not contain
744    any ordered tests applied to the condition codes.
745    EQ and NE tests do not count.  */
746 
747 int
next_insn_tests_no_inequality(rtx insn)748 next_insn_tests_no_inequality (rtx insn)
749 {
750   rtx next = next_cc0_user (insn);
751 
752   /* If there is no next insn, we have to take the conservative choice.  */
753   if (next == 0)
754     return 0;
755 
756   return (INSN_P (next)
757 	  && ! inequality_comparisons_p (PATTERN (next)));
758 }
759 #endif
760 
761 /* This is used by find_single_use to locate an rtx that contains exactly one
762    use of DEST, which is typically either a REG or CC0.  It returns a
763    pointer to the innermost rtx expression containing DEST.  Appearances of
764    DEST that are being used to totally replace it are not counted.  */
765 
766 static rtx *
find_single_use_1(rtx dest,rtx * loc)767 find_single_use_1 (rtx dest, rtx *loc)
768 {
769   rtx x = *loc;
770   enum rtx_code code = GET_CODE (x);
771   rtx *result = 0;
772   rtx *this_result;
773   int i;
774   const char *fmt;
775 
776   switch (code)
777     {
778     case CONST_INT:
779     case CONST:
780     case LABEL_REF:
781     case SYMBOL_REF:
782     case CONST_DOUBLE:
783     case CONST_VECTOR:
784     case CLOBBER:
785       return 0;
786 
787     case SET:
788       /* If the destination is anything other than CC0, PC, a REG or a SUBREG
789 	 of a REG that occupies all of the REG, the insn uses DEST if
790 	 it is mentioned in the destination or the source.  Otherwise, we
791 	 need just check the source.  */
792       if (GET_CODE (SET_DEST (x)) != CC0
793 	  && GET_CODE (SET_DEST (x)) != PC
794 	  && !REG_P (SET_DEST (x))
795 	  && ! (GET_CODE (SET_DEST (x)) == SUBREG
796 		&& REG_P (SUBREG_REG (SET_DEST (x)))
797 		&& (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
798 		      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
799 		    == ((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
800 			 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))))
801 	break;
802 
803       return find_single_use_1 (dest, &SET_SRC (x));
804 
805     case MEM:
806     case SUBREG:
807       return find_single_use_1 (dest, &XEXP (x, 0));
808 
809     default:
810       break;
811     }
812 
813   /* If it wasn't one of the common cases above, check each expression and
814      vector of this code.  Look for a unique usage of DEST.  */
815 
816   fmt = GET_RTX_FORMAT (code);
817   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
818     {
819       if (fmt[i] == 'e')
820 	{
821 	  if (dest == XEXP (x, i)
822 	      || (REG_P (dest) && REG_P (XEXP (x, i))
823 		  && REGNO (dest) == REGNO (XEXP (x, i))))
824 	    this_result = loc;
825 	  else
826 	    this_result = find_single_use_1 (dest, &XEXP (x, i));
827 
828 	  if (result == 0)
829 	    result = this_result;
830 	  else if (this_result)
831 	    /* Duplicate usage.  */
832 	    return 0;
833 	}
834       else if (fmt[i] == 'E')
835 	{
836 	  int j;
837 
838 	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
839 	    {
840 	      if (XVECEXP (x, i, j) == dest
841 		  || (REG_P (dest)
842 		      && REG_P (XVECEXP (x, i, j))
843 		      && REGNO (XVECEXP (x, i, j)) == REGNO (dest)))
844 		this_result = loc;
845 	      else
846 		this_result = find_single_use_1 (dest, &XVECEXP (x, i, j));
847 
848 	      if (result == 0)
849 		result = this_result;
850 	      else if (this_result)
851 		return 0;
852 	    }
853 	}
854     }
855 
856   return result;
857 }
858 
859 /* See if DEST, produced in INSN, is used only a single time in the
860    sequel.  If so, return a pointer to the innermost rtx expression in which
861    it is used.
862 
863    If PLOC is nonzero, *PLOC is set to the insn containing the single use.
864 
865    This routine will return usually zero either before flow is called (because
866    there will be no LOG_LINKS notes) or after reload (because the REG_DEAD
867    note can't be trusted).
868 
869    If DEST is cc0_rtx, we look only at the next insn.  In that case, we don't
870    care about REG_DEAD notes or LOG_LINKS.
871 
872    Otherwise, we find the single use by finding an insn that has a
873    LOG_LINKS pointing at INSN and has a REG_DEAD note for DEST.  If DEST is
874    only referenced once in that insn, we know that it must be the first
875    and last insn referencing DEST.  */
876 
877 rtx *
find_single_use(rtx dest,rtx insn,rtx * ploc)878 find_single_use (rtx dest, rtx insn, rtx *ploc)
879 {
880   rtx next;
881   rtx *result;
882   rtx link;
883 
884 #ifdef HAVE_cc0
885   if (dest == cc0_rtx)
886     {
887       next = NEXT_INSN (insn);
888       if (next == 0
889 	  || (!NONJUMP_INSN_P (next) && !JUMP_P (next)))
890 	return 0;
891 
892       result = find_single_use_1 (dest, &PATTERN (next));
893       if (result && ploc)
894 	*ploc = next;
895       return result;
896     }
897 #endif
898 
899   if (reload_completed || reload_in_progress || !REG_P (dest))
900     return 0;
901 
902   for (next = next_nonnote_insn (insn);
903        next != 0 && !LABEL_P (next);
904        next = next_nonnote_insn (next))
905     if (INSN_P (next) && dead_or_set_p (next, dest))
906       {
907 	for (link = LOG_LINKS (next); link; link = XEXP (link, 1))
908 	  if (XEXP (link, 0) == insn)
909 	    break;
910 
911 	if (link)
912 	  {
913 	    result = find_single_use_1 (dest, &PATTERN (next));
914 	    if (ploc)
915 	      *ploc = next;
916 	    return result;
917 	  }
918       }
919 
920   return 0;
921 }
922 
923 /* Return 1 if OP is a valid general operand for machine mode MODE.
924    This is either a register reference, a memory reference,
925    or a constant.  In the case of a memory reference, the address
926    is checked for general validity for the target machine.
927 
928    Register and memory references must have mode MODE in order to be valid,
929    but some constants have no machine mode and are valid for any mode.
930 
931    If MODE is VOIDmode, OP is checked for validity for whatever mode
932    it has.
933 
934    The main use of this function is as a predicate in match_operand
935    expressions in the machine description.
936 
937    For an explanation of this function's behavior for registers of
938    class NO_REGS, see the comment for `register_operand'.  */
939 
940 int
general_operand(rtx op,enum machine_mode mode)941 general_operand (rtx op, enum machine_mode mode)
942 {
943   enum rtx_code code = GET_CODE (op);
944 
945   if (mode == VOIDmode)
946     mode = GET_MODE (op);
947 
948   /* Don't accept CONST_INT or anything similar
949      if the caller wants something floating.  */
950   if (GET_MODE (op) == VOIDmode && mode != VOIDmode
951       && GET_MODE_CLASS (mode) != MODE_INT
952       && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
953     return 0;
954 
955   if (GET_CODE (op) == CONST_INT
956       && mode != VOIDmode
957       && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
958     return 0;
959 
960   if (CONSTANT_P (op))
961     return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode
962 	     || mode == VOIDmode)
963 	    && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
964 	    && LEGITIMATE_CONSTANT_P (op));
965 
966   /* Except for certain constants with VOIDmode, already checked for,
967      OP's mode must match MODE if MODE specifies a mode.  */
968 
969   if (GET_MODE (op) != mode)
970     return 0;
971 
972   if (code == SUBREG)
973     {
974       rtx sub = SUBREG_REG (op);
975 
976 #ifdef INSN_SCHEDULING
977       /* On machines that have insn scheduling, we want all memory
978 	 reference to be explicit, so outlaw paradoxical SUBREGs.
979 	 However, we must allow them after reload so that they can
980 	 get cleaned up by cleanup_subreg_operands.  */
981       if (!reload_completed && MEM_P (sub)
982 	  && GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (sub)))
983 	return 0;
984 #endif
985       /* Avoid memories with nonzero SUBREG_BYTE, as offsetting the memory
986          may result in incorrect reference.  We should simplify all valid
987          subregs of MEM anyway.  But allow this after reload because we
988 	 might be called from cleanup_subreg_operands.
989 
990 	 ??? This is a kludge.  */
991       if (!reload_completed && SUBREG_BYTE (op) != 0
992 	  && MEM_P (sub))
993 	return 0;
994 
995       /* FLOAT_MODE subregs can't be paradoxical.  Combine will occasionally
996 	 create such rtl, and we must reject it.  */
997       if (SCALAR_FLOAT_MODE_P (GET_MODE (op))
998 	  && GET_MODE_SIZE (GET_MODE (op)) > GET_MODE_SIZE (GET_MODE (sub)))
999 	return 0;
1000 
1001       op = sub;
1002       code = GET_CODE (op);
1003     }
1004 
1005   if (code == REG)
1006     /* A register whose class is NO_REGS is not a general operand.  */
1007     return (REGNO (op) >= FIRST_PSEUDO_REGISTER
1008 	    || REGNO_REG_CLASS (REGNO (op)) != NO_REGS);
1009 
1010   if (code == MEM)
1011     {
1012       rtx y = XEXP (op, 0);
1013 
1014       if (! volatile_ok && MEM_VOLATILE_P (op))
1015 	return 0;
1016 
1017       /* Use the mem's mode, since it will be reloaded thus.  */
1018       if (memory_address_p (GET_MODE (op), y))
1019 	return 1;
1020     }
1021 
1022   return 0;
1023 }
1024 
1025 /* Return 1 if OP is a valid memory address for a memory reference
1026    of mode MODE.
1027 
1028    The main use of this function is as a predicate in match_operand
1029    expressions in the machine description.  */
1030 
1031 int
address_operand(rtx op,enum machine_mode mode)1032 address_operand (rtx op, enum machine_mode mode)
1033 {
1034   return memory_address_p (mode, op);
1035 }
1036 
1037 /* Return 1 if OP is a register reference of mode MODE.
1038    If MODE is VOIDmode, accept a register in any mode.
1039 
1040    The main use of this function is as a predicate in match_operand
1041    expressions in the machine description.
1042 
1043    As a special exception, registers whose class is NO_REGS are
1044    not accepted by `register_operand'.  The reason for this change
1045    is to allow the representation of special architecture artifacts
1046    (such as a condition code register) without extending the rtl
1047    definitions.  Since registers of class NO_REGS cannot be used
1048    as registers in any case where register classes are examined,
1049    it is most consistent to keep this function from accepting them.  */
1050 
1051 int
register_operand(rtx op,enum machine_mode mode)1052 register_operand (rtx op, enum machine_mode mode)
1053 {
1054   if (GET_MODE (op) != mode && mode != VOIDmode)
1055     return 0;
1056 
1057   if (GET_CODE (op) == SUBREG)
1058     {
1059       rtx sub = SUBREG_REG (op);
1060 
1061       /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1062 	 because it is guaranteed to be reloaded into one.
1063 	 Just make sure the MEM is valid in itself.
1064 	 (Ideally, (SUBREG (MEM)...) should not exist after reload,
1065 	 but currently it does result from (SUBREG (REG)...) where the
1066 	 reg went on the stack.)  */
1067       if (! reload_completed && MEM_P (sub))
1068 	return general_operand (op, mode);
1069 
1070 #ifdef CANNOT_CHANGE_MODE_CLASS
1071       if (REG_P (sub)
1072 	  && REGNO (sub) < FIRST_PSEUDO_REGISTER
1073 	  && REG_CANNOT_CHANGE_MODE_P (REGNO (sub), GET_MODE (sub), mode)
1074 	  && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_INT
1075 	  && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_FLOAT)
1076 	return 0;
1077 #endif
1078 
1079       /* FLOAT_MODE subregs can't be paradoxical.  Combine will occasionally
1080 	 create such rtl, and we must reject it.  */
1081       if (SCALAR_FLOAT_MODE_P (GET_MODE (op))
1082 	  && GET_MODE_SIZE (GET_MODE (op)) > GET_MODE_SIZE (GET_MODE (sub)))
1083 	return 0;
1084 
1085       op = sub;
1086     }
1087 
1088   /* We don't consider registers whose class is NO_REGS
1089      to be a register operand.  */
1090   return (REG_P (op)
1091 	  && (REGNO (op) >= FIRST_PSEUDO_REGISTER
1092 	      || REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
1093 }
1094 
1095 /* Return 1 for a register in Pmode; ignore the tested mode.  */
1096 
1097 int
pmode_register_operand(rtx op,enum machine_mode mode ATTRIBUTE_UNUSED)1098 pmode_register_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1099 {
1100   return register_operand (op, Pmode);
1101 }
1102 
1103 /* Return 1 if OP should match a MATCH_SCRATCH, i.e., if it is a SCRATCH
1104    or a hard register.  */
1105 
1106 int
scratch_operand(rtx op,enum machine_mode mode)1107 scratch_operand (rtx op, enum machine_mode mode)
1108 {
1109   if (GET_MODE (op) != mode && mode != VOIDmode)
1110     return 0;
1111 
1112   return (GET_CODE (op) == SCRATCH
1113 	  || (REG_P (op)
1114 	      && REGNO (op) < FIRST_PSEUDO_REGISTER));
1115 }
1116 
1117 /* Return 1 if OP is a valid immediate operand for mode MODE.
1118 
1119    The main use of this function is as a predicate in match_operand
1120    expressions in the machine description.  */
1121 
1122 int
immediate_operand(rtx op,enum machine_mode mode)1123 immediate_operand (rtx op, enum machine_mode mode)
1124 {
1125   /* Don't accept CONST_INT or anything similar
1126      if the caller wants something floating.  */
1127   if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1128       && GET_MODE_CLASS (mode) != MODE_INT
1129       && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1130     return 0;
1131 
1132   if (GET_CODE (op) == CONST_INT
1133       && mode != VOIDmode
1134       && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1135     return 0;
1136 
1137   return (CONSTANT_P (op)
1138 	  && (GET_MODE (op) == mode || mode == VOIDmode
1139 	      || GET_MODE (op) == VOIDmode)
1140 	  && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
1141 	  && LEGITIMATE_CONSTANT_P (op));
1142 }
1143 
1144 /* Returns 1 if OP is an operand that is a CONST_INT.  */
1145 
1146 int
const_int_operand(rtx op,enum machine_mode mode)1147 const_int_operand (rtx op, enum machine_mode mode)
1148 {
1149   if (GET_CODE (op) != CONST_INT)
1150     return 0;
1151 
1152   if (mode != VOIDmode
1153       && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1154     return 0;
1155 
1156   return 1;
1157 }
1158 
1159 /* Returns 1 if OP is an operand that is a constant integer or constant
1160    floating-point number.  */
1161 
1162 int
const_double_operand(rtx op,enum machine_mode mode)1163 const_double_operand (rtx op, enum machine_mode mode)
1164 {
1165   /* Don't accept CONST_INT or anything similar
1166      if the caller wants something floating.  */
1167   if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1168       && GET_MODE_CLASS (mode) != MODE_INT
1169       && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1170     return 0;
1171 
1172   return ((GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT)
1173 	  && (mode == VOIDmode || GET_MODE (op) == mode
1174 	      || GET_MODE (op) == VOIDmode));
1175 }
1176 
1177 /* Return 1 if OP is a general operand that is not an immediate operand.  */
1178 
1179 int
nonimmediate_operand(rtx op,enum machine_mode mode)1180 nonimmediate_operand (rtx op, enum machine_mode mode)
1181 {
1182   return (general_operand (op, mode) && ! CONSTANT_P (op));
1183 }
1184 
1185 /* Return 1 if OP is a register reference or immediate value of mode MODE.  */
1186 
1187 int
nonmemory_operand(rtx op,enum machine_mode mode)1188 nonmemory_operand (rtx op, enum machine_mode mode)
1189 {
1190   if (CONSTANT_P (op))
1191     {
1192       /* Don't accept CONST_INT or anything similar
1193 	 if the caller wants something floating.  */
1194       if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1195 	  && GET_MODE_CLASS (mode) != MODE_INT
1196 	  && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1197 	return 0;
1198 
1199       if (GET_CODE (op) == CONST_INT
1200 	  && mode != VOIDmode
1201 	  && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1202 	return 0;
1203 
1204       return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode
1205 	       || mode == VOIDmode)
1206 	      && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
1207 	      && LEGITIMATE_CONSTANT_P (op));
1208     }
1209 
1210   if (GET_MODE (op) != mode && mode != VOIDmode)
1211     return 0;
1212 
1213   if (GET_CODE (op) == SUBREG)
1214     {
1215       /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1216 	 because it is guaranteed to be reloaded into one.
1217 	 Just make sure the MEM is valid in itself.
1218 	 (Ideally, (SUBREG (MEM)...) should not exist after reload,
1219 	 but currently it does result from (SUBREG (REG)...) where the
1220 	 reg went on the stack.)  */
1221       if (! reload_completed && MEM_P (SUBREG_REG (op)))
1222 	return general_operand (op, mode);
1223       op = SUBREG_REG (op);
1224     }
1225 
1226   /* We don't consider registers whose class is NO_REGS
1227      to be a register operand.  */
1228   return (REG_P (op)
1229 	  && (REGNO (op) >= FIRST_PSEUDO_REGISTER
1230 	      || REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
1231 }
1232 
1233 /* Return 1 if OP is a valid operand that stands for pushing a
1234    value of mode MODE onto the stack.
1235 
1236    The main use of this function is as a predicate in match_operand
1237    expressions in the machine description.  */
1238 
1239 int
push_operand(rtx op,enum machine_mode mode)1240 push_operand (rtx op, enum machine_mode mode)
1241 {
1242   unsigned int rounded_size = GET_MODE_SIZE (mode);
1243 
1244 #ifdef PUSH_ROUNDING
1245   rounded_size = PUSH_ROUNDING (rounded_size);
1246 #endif
1247 
1248   if (!MEM_P (op))
1249     return 0;
1250 
1251   if (mode != VOIDmode && GET_MODE (op) != mode)
1252     return 0;
1253 
1254   op = XEXP (op, 0);
1255 
1256   if (rounded_size == GET_MODE_SIZE (mode))
1257     {
1258       if (GET_CODE (op) != STACK_PUSH_CODE)
1259 	return 0;
1260     }
1261   else
1262     {
1263       if (GET_CODE (op) != PRE_MODIFY
1264 	  || GET_CODE (XEXP (op, 1)) != PLUS
1265 	  || XEXP (XEXP (op, 1), 0) != XEXP (op, 0)
1266 	  || GET_CODE (XEXP (XEXP (op, 1), 1)) != CONST_INT
1267 #ifdef STACK_GROWS_DOWNWARD
1268 	  || INTVAL (XEXP (XEXP (op, 1), 1)) != - (int) rounded_size
1269 #else
1270 	  || INTVAL (XEXP (XEXP (op, 1), 1)) != (int) rounded_size
1271 #endif
1272 	  )
1273 	return 0;
1274     }
1275 
1276   return XEXP (op, 0) == stack_pointer_rtx;
1277 }
1278 
1279 /* Return 1 if OP is a valid operand that stands for popping a
1280    value of mode MODE off the stack.
1281 
1282    The main use of this function is as a predicate in match_operand
1283    expressions in the machine description.  */
1284 
1285 int
pop_operand(rtx op,enum machine_mode mode)1286 pop_operand (rtx op, enum machine_mode mode)
1287 {
1288   if (!MEM_P (op))
1289     return 0;
1290 
1291   if (mode != VOIDmode && GET_MODE (op) != mode)
1292     return 0;
1293 
1294   op = XEXP (op, 0);
1295 
1296   if (GET_CODE (op) != STACK_POP_CODE)
1297     return 0;
1298 
1299   return XEXP (op, 0) == stack_pointer_rtx;
1300 }
1301 
1302 /* Return 1 if ADDR is a valid memory address for mode MODE.  */
1303 
1304 int
memory_address_p(enum machine_mode mode ATTRIBUTE_UNUSED,rtx addr)1305 memory_address_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx addr)
1306 {
1307   GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
1308   return 0;
1309 
1310  win:
1311   return 1;
1312 }
1313 
1314 /* Return 1 if OP is a valid memory reference with mode MODE,
1315    including a valid address.
1316 
1317    The main use of this function is as a predicate in match_operand
1318    expressions in the machine description.  */
1319 
1320 int
memory_operand(rtx op,enum machine_mode mode)1321 memory_operand (rtx op, enum machine_mode mode)
1322 {
1323   rtx inner;
1324 
1325   if (! reload_completed)
1326     /* Note that no SUBREG is a memory operand before end of reload pass,
1327        because (SUBREG (MEM...)) forces reloading into a register.  */
1328     return MEM_P (op) && general_operand (op, mode);
1329 
1330   if (mode != VOIDmode && GET_MODE (op) != mode)
1331     return 0;
1332 
1333   inner = op;
1334   if (GET_CODE (inner) == SUBREG)
1335     inner = SUBREG_REG (inner);
1336 
1337   return (MEM_P (inner) && general_operand (op, mode));
1338 }
1339 
1340 /* Return 1 if OP is a valid indirect memory reference with mode MODE;
1341    that is, a memory reference whose address is a general_operand.  */
1342 
1343 int
indirect_operand(rtx op,enum machine_mode mode)1344 indirect_operand (rtx op, enum machine_mode mode)
1345 {
1346   /* Before reload, a SUBREG isn't in memory (see memory_operand, above).  */
1347   if (! reload_completed
1348       && GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))
1349     {
1350       int offset = SUBREG_BYTE (op);
1351       rtx inner = SUBREG_REG (op);
1352 
1353       if (mode != VOIDmode && GET_MODE (op) != mode)
1354 	return 0;
1355 
1356       /* The only way that we can have a general_operand as the resulting
1357 	 address is if OFFSET is zero and the address already is an operand
1358 	 or if the address is (plus Y (const_int -OFFSET)) and Y is an
1359 	 operand.  */
1360 
1361       return ((offset == 0 && general_operand (XEXP (inner, 0), Pmode))
1362 	      || (GET_CODE (XEXP (inner, 0)) == PLUS
1363 		  && GET_CODE (XEXP (XEXP (inner, 0), 1)) == CONST_INT
1364 		  && INTVAL (XEXP (XEXP (inner, 0), 1)) == -offset
1365 		  && general_operand (XEXP (XEXP (inner, 0), 0), Pmode)));
1366     }
1367 
1368   return (MEM_P (op)
1369 	  && memory_operand (op, mode)
1370 	  && general_operand (XEXP (op, 0), Pmode));
1371 }
1372 
1373 /* Return 1 if this is a comparison operator.  This allows the use of
1374    MATCH_OPERATOR to recognize all the branch insns.  */
1375 
1376 int
comparison_operator(rtx op,enum machine_mode mode)1377 comparison_operator (rtx op, enum machine_mode mode)
1378 {
1379   return ((mode == VOIDmode || GET_MODE (op) == mode)
1380 	  && COMPARISON_P (op));
1381 }
1382 
1383 /* If BODY is an insn body that uses ASM_OPERANDS,
1384    return the number of operands (both input and output) in the insn.
1385    Otherwise return -1.  */
1386 
1387 int
asm_noperands(rtx body)1388 asm_noperands (rtx body)
1389 {
1390   switch (GET_CODE (body))
1391     {
1392     case ASM_OPERANDS:
1393       /* No output operands: return number of input operands.  */
1394       return ASM_OPERANDS_INPUT_LENGTH (body);
1395     case SET:
1396       if (GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1397 	/* Single output operand: BODY is (set OUTPUT (asm_operands ...)).  */
1398 	return ASM_OPERANDS_INPUT_LENGTH (SET_SRC (body)) + 1;
1399       else
1400 	return -1;
1401     case PARALLEL:
1402       if (GET_CODE (XVECEXP (body, 0, 0)) == SET
1403 	  && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
1404 	{
1405 	  /* Multiple output operands, or 1 output plus some clobbers:
1406 	     body is [(set OUTPUT (asm_operands ...))... (clobber (reg ...))...].  */
1407 	  int i;
1408 	  int n_sets;
1409 
1410 	  /* Count backwards through CLOBBERs to determine number of SETs.  */
1411 	  for (i = XVECLEN (body, 0); i > 0; i--)
1412 	    {
1413 	      if (GET_CODE (XVECEXP (body, 0, i - 1)) == SET)
1414 		break;
1415 	      if (GET_CODE (XVECEXP (body, 0, i - 1)) != CLOBBER)
1416 		return -1;
1417 	    }
1418 
1419 	  /* N_SETS is now number of output operands.  */
1420 	  n_sets = i;
1421 
1422 	  /* Verify that all the SETs we have
1423 	     came from a single original asm_operands insn
1424 	     (so that invalid combinations are blocked).  */
1425 	  for (i = 0; i < n_sets; i++)
1426 	    {
1427 	      rtx elt = XVECEXP (body, 0, i);
1428 	      if (GET_CODE (elt) != SET)
1429 		return -1;
1430 	      if (GET_CODE (SET_SRC (elt)) != ASM_OPERANDS)
1431 		return -1;
1432 	      /* If these ASM_OPERANDS rtx's came from different original insns
1433 	         then they aren't allowed together.  */
1434 	      if (ASM_OPERANDS_INPUT_VEC (SET_SRC (elt))
1435 		  != ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP (body, 0, 0))))
1436 		return -1;
1437 	    }
1438 	  return (ASM_OPERANDS_INPUT_LENGTH (SET_SRC (XVECEXP (body, 0, 0)))
1439 		  + n_sets);
1440 	}
1441       else if (GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1442 	{
1443 	  /* 0 outputs, but some clobbers:
1444 	     body is [(asm_operands ...) (clobber (reg ...))...].  */
1445 	  int i;
1446 
1447 	  /* Make sure all the other parallel things really are clobbers.  */
1448 	  for (i = XVECLEN (body, 0) - 1; i > 0; i--)
1449 	    if (GET_CODE (XVECEXP (body, 0, i)) != CLOBBER)
1450 	      return -1;
1451 
1452 	  return ASM_OPERANDS_INPUT_LENGTH (XVECEXP (body, 0, 0));
1453 	}
1454       else
1455 	return -1;
1456     default:
1457       return -1;
1458     }
1459 }
1460 
1461 /* Assuming BODY is an insn body that uses ASM_OPERANDS,
1462    copy its operands (both input and output) into the vector OPERANDS,
1463    the locations of the operands within the insn into the vector OPERAND_LOCS,
1464    and the constraints for the operands into CONSTRAINTS.
1465    Write the modes of the operands into MODES.
1466    Return the assembler-template.
1467 
1468    If MODES, OPERAND_LOCS, CONSTRAINTS or OPERANDS is 0,
1469    we don't store that info.  */
1470 
1471 const char *
decode_asm_operands(rtx body,rtx * operands,rtx ** operand_locs,const char ** constraints,enum machine_mode * modes)1472 decode_asm_operands (rtx body, rtx *operands, rtx **operand_locs,
1473 		     const char **constraints, enum machine_mode *modes)
1474 {
1475   int i;
1476   int noperands;
1477   const char *template = 0;
1478 
1479   if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1480     {
1481       rtx asmop = SET_SRC (body);
1482       /* Single output operand: BODY is (set OUTPUT (asm_operands ....)).  */
1483 
1484       noperands = ASM_OPERANDS_INPUT_LENGTH (asmop) + 1;
1485 
1486       for (i = 1; i < noperands; i++)
1487 	{
1488 	  if (operand_locs)
1489 	    operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i - 1);
1490 	  if (operands)
1491 	    operands[i] = ASM_OPERANDS_INPUT (asmop, i - 1);
1492 	  if (constraints)
1493 	    constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i - 1);
1494 	  if (modes)
1495 	    modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i - 1);
1496 	}
1497 
1498       /* The output is in the SET.
1499 	 Its constraint is in the ASM_OPERANDS itself.  */
1500       if (operands)
1501 	operands[0] = SET_DEST (body);
1502       if (operand_locs)
1503 	operand_locs[0] = &SET_DEST (body);
1504       if (constraints)
1505 	constraints[0] = ASM_OPERANDS_OUTPUT_CONSTRAINT (asmop);
1506       if (modes)
1507 	modes[0] = GET_MODE (SET_DEST (body));
1508       template = ASM_OPERANDS_TEMPLATE (asmop);
1509     }
1510   else if (GET_CODE (body) == ASM_OPERANDS)
1511     {
1512       rtx asmop = body;
1513       /* No output operands: BODY is (asm_operands ....).  */
1514 
1515       noperands = ASM_OPERANDS_INPUT_LENGTH (asmop);
1516 
1517       /* The input operands are found in the 1st element vector.  */
1518       /* Constraints for inputs are in the 2nd element vector.  */
1519       for (i = 0; i < noperands; i++)
1520 	{
1521 	  if (operand_locs)
1522 	    operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i);
1523 	  if (operands)
1524 	    operands[i] = ASM_OPERANDS_INPUT (asmop, i);
1525 	  if (constraints)
1526 	    constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1527 	  if (modes)
1528 	    modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1529 	}
1530       template = ASM_OPERANDS_TEMPLATE (asmop);
1531     }
1532   else if (GET_CODE (body) == PARALLEL
1533 	   && GET_CODE (XVECEXP (body, 0, 0)) == SET
1534 	   && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
1535     {
1536       rtx asmop = SET_SRC (XVECEXP (body, 0, 0));
1537       int nparallel = XVECLEN (body, 0); /* Includes CLOBBERs.  */
1538       int nin = ASM_OPERANDS_INPUT_LENGTH (asmop);
1539       int nout = 0;		/* Does not include CLOBBERs.  */
1540 
1541       /* At least one output, plus some CLOBBERs.  */
1542 
1543       /* The outputs are in the SETs.
1544 	 Their constraints are in the ASM_OPERANDS itself.  */
1545       for (i = 0; i < nparallel; i++)
1546 	{
1547 	  if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1548 	    break;		/* Past last SET */
1549 
1550 	  if (operands)
1551 	    operands[i] = SET_DEST (XVECEXP (body, 0, i));
1552 	  if (operand_locs)
1553 	    operand_locs[i] = &SET_DEST (XVECEXP (body, 0, i));
1554 	  if (constraints)
1555 	    constraints[i] = XSTR (SET_SRC (XVECEXP (body, 0, i)), 1);
1556 	  if (modes)
1557 	    modes[i] = GET_MODE (SET_DEST (XVECEXP (body, 0, i)));
1558 	  nout++;
1559 	}
1560 
1561       for (i = 0; i < nin; i++)
1562 	{
1563 	  if (operand_locs)
1564 	    operand_locs[i + nout] = &ASM_OPERANDS_INPUT (asmop, i);
1565 	  if (operands)
1566 	    operands[i + nout] = ASM_OPERANDS_INPUT (asmop, i);
1567 	  if (constraints)
1568 	    constraints[i + nout] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1569 	  if (modes)
1570 	    modes[i + nout] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1571 	}
1572 
1573       template = ASM_OPERANDS_TEMPLATE (asmop);
1574     }
1575   else if (GET_CODE (body) == PARALLEL
1576 	   && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1577     {
1578       /* No outputs, but some CLOBBERs.  */
1579 
1580       rtx asmop = XVECEXP (body, 0, 0);
1581       int nin = ASM_OPERANDS_INPUT_LENGTH (asmop);
1582 
1583       for (i = 0; i < nin; i++)
1584 	{
1585 	  if (operand_locs)
1586 	    operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i);
1587 	  if (operands)
1588 	    operands[i] = ASM_OPERANDS_INPUT (asmop, i);
1589 	  if (constraints)
1590 	    constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1591 	  if (modes)
1592 	    modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1593 	}
1594 
1595       template = ASM_OPERANDS_TEMPLATE (asmop);
1596     }
1597 
1598   return template;
1599 }
1600 
1601 /* Check if an asm_operand matches its constraints.
1602    Return > 0 if ok, = 0 if bad, < 0 if inconclusive.  */
1603 
1604 int
asm_operand_ok(rtx op,const char * constraint)1605 asm_operand_ok (rtx op, const char *constraint)
1606 {
1607   int result = 0;
1608 
1609   /* Use constrain_operands after reload.  */
1610   gcc_assert (!reload_completed);
1611 
1612   while (*constraint)
1613     {
1614       char c = *constraint;
1615       int len;
1616       switch (c)
1617 	{
1618 	case ',':
1619 	  constraint++;
1620 	  continue;
1621 	case '=':
1622 	case '+':
1623 	case '*':
1624 	case '%':
1625 	case '!':
1626 	case '#':
1627 	case '&':
1628 	case '?':
1629 	  break;
1630 
1631 	case '0': case '1': case '2': case '3': case '4':
1632 	case '5': case '6': case '7': case '8': case '9':
1633 	  /* For best results, our caller should have given us the
1634 	     proper matching constraint, but we can't actually fail
1635 	     the check if they didn't.  Indicate that results are
1636 	     inconclusive.  */
1637 	  do
1638 	    constraint++;
1639 	  while (ISDIGIT (*constraint));
1640 	  if (! result)
1641 	    result = -1;
1642 	  continue;
1643 
1644 	case 'p':
1645 	  if (address_operand (op, VOIDmode))
1646 	    result = 1;
1647 	  break;
1648 
1649 	case 'm':
1650 	case 'V': /* non-offsettable */
1651 	  if (memory_operand (op, VOIDmode))
1652 	    result = 1;
1653 	  break;
1654 
1655 	case 'o': /* offsettable */
1656 	  if (offsettable_nonstrict_memref_p (op))
1657 	    result = 1;
1658 	  break;
1659 
1660 	case '<':
1661 	  /* ??? Before flow, auto inc/dec insns are not supposed to exist,
1662 	     excepting those that expand_call created.  Further, on some
1663 	     machines which do not have generalized auto inc/dec, an inc/dec
1664 	     is not a memory_operand.
1665 
1666 	     Match any memory and hope things are resolved after reload.  */
1667 
1668 	  if (MEM_P (op)
1669 	      && (1
1670 		  || GET_CODE (XEXP (op, 0)) == PRE_DEC
1671 		  || GET_CODE (XEXP (op, 0)) == POST_DEC))
1672 	    result = 1;
1673 	  break;
1674 
1675 	case '>':
1676 	  if (MEM_P (op)
1677 	      && (1
1678 		  || GET_CODE (XEXP (op, 0)) == PRE_INC
1679 		  || GET_CODE (XEXP (op, 0)) == POST_INC))
1680 	    result = 1;
1681 	  break;
1682 
1683 	case 'E':
1684 	case 'F':
1685 	  if (GET_CODE (op) == CONST_DOUBLE
1686 	      || (GET_CODE (op) == CONST_VECTOR
1687 		  && GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_FLOAT))
1688 	    result = 1;
1689 	  break;
1690 
1691 	case 'G':
1692 	  if (GET_CODE (op) == CONST_DOUBLE
1693 	      && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, 'G', constraint))
1694 	    result = 1;
1695 	  break;
1696 	case 'H':
1697 	  if (GET_CODE (op) == CONST_DOUBLE
1698 	      && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, 'H', constraint))
1699 	    result = 1;
1700 	  break;
1701 
1702 	case 's':
1703 	  if (GET_CODE (op) == CONST_INT
1704 	      || (GET_CODE (op) == CONST_DOUBLE
1705 		  && GET_MODE (op) == VOIDmode))
1706 	    break;
1707 	  /* Fall through.  */
1708 
1709 	case 'i':
1710 	  if (CONSTANT_P (op) && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op)))
1711 	    result = 1;
1712 	  break;
1713 
1714 	case 'n':
1715 	  if (GET_CODE (op) == CONST_INT
1716 	      || (GET_CODE (op) == CONST_DOUBLE
1717 		  && GET_MODE (op) == VOIDmode))
1718 	    result = 1;
1719 	  break;
1720 
1721 	case 'I':
1722 	  if (GET_CODE (op) == CONST_INT
1723 	      && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'I', constraint))
1724 	    result = 1;
1725 	  break;
1726 	case 'J':
1727 	  if (GET_CODE (op) == CONST_INT
1728 	      && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'J', constraint))
1729 	    result = 1;
1730 	  break;
1731 	case 'K':
1732 	  if (GET_CODE (op) == CONST_INT
1733 	      && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'K', constraint))
1734 	    result = 1;
1735 	  break;
1736 	case 'L':
1737 	  if (GET_CODE (op) == CONST_INT
1738 	      && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'L', constraint))
1739 	    result = 1;
1740 	  break;
1741 	case 'M':
1742 	  if (GET_CODE (op) == CONST_INT
1743 	      && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'M', constraint))
1744 	    result = 1;
1745 	  break;
1746 	case 'N':
1747 	  if (GET_CODE (op) == CONST_INT
1748 	      && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'N', constraint))
1749 	    result = 1;
1750 	  break;
1751 	case 'O':
1752 	  if (GET_CODE (op) == CONST_INT
1753 	      && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'O', constraint))
1754 	    result = 1;
1755 	  break;
1756 	case 'P':
1757 	  if (GET_CODE (op) == CONST_INT
1758 	      && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'P', constraint))
1759 	    result = 1;
1760 	  break;
1761 
1762 	case 'X':
1763 	  result = 1;
1764 	  break;
1765 
1766 	case 'g':
1767 	  if (general_operand (op, VOIDmode))
1768 	    result = 1;
1769 	  break;
1770 
1771 	default:
1772 	  /* For all other letters, we first check for a register class,
1773 	     otherwise it is an EXTRA_CONSTRAINT.  */
1774 	  if (REG_CLASS_FROM_CONSTRAINT (c, constraint) != NO_REGS)
1775 	    {
1776 	    case 'r':
1777 	      if (GET_MODE (op) == BLKmode)
1778 		break;
1779 	      if (register_operand (op, VOIDmode))
1780 		result = 1;
1781 	    }
1782 #ifdef EXTRA_CONSTRAINT_STR
1783 	  else if (EXTRA_CONSTRAINT_STR (op, c, constraint))
1784 	    result = 1;
1785 	  else if (EXTRA_MEMORY_CONSTRAINT (c, constraint)
1786 		   /* Every memory operand can be reloaded to fit.  */
1787 		   && memory_operand (op, VOIDmode))
1788 	    result = 1;
1789 	  else if (EXTRA_ADDRESS_CONSTRAINT (c, constraint)
1790 		   /* Every address operand can be reloaded to fit.  */
1791 		   && address_operand (op, VOIDmode))
1792 	    result = 1;
1793 #endif
1794 	  break;
1795 	}
1796       len = CONSTRAINT_LEN (c, constraint);
1797       do
1798 	constraint++;
1799       while (--len && *constraint);
1800       if (len)
1801 	return 0;
1802     }
1803 
1804   return result;
1805 }
1806 
1807 /* Given an rtx *P, if it is a sum containing an integer constant term,
1808    return the location (type rtx *) of the pointer to that constant term.
1809    Otherwise, return a null pointer.  */
1810 
1811 rtx *
find_constant_term_loc(rtx * p)1812 find_constant_term_loc (rtx *p)
1813 {
1814   rtx *tem;
1815   enum rtx_code code = GET_CODE (*p);
1816 
1817   /* If *P IS such a constant term, P is its location.  */
1818 
1819   if (code == CONST_INT || code == SYMBOL_REF || code == LABEL_REF
1820       || code == CONST)
1821     return p;
1822 
1823   /* Otherwise, if not a sum, it has no constant term.  */
1824 
1825   if (GET_CODE (*p) != PLUS)
1826     return 0;
1827 
1828   /* If one of the summands is constant, return its location.  */
1829 
1830   if (XEXP (*p, 0) && CONSTANT_P (XEXP (*p, 0))
1831       && XEXP (*p, 1) && CONSTANT_P (XEXP (*p, 1)))
1832     return p;
1833 
1834   /* Otherwise, check each summand for containing a constant term.  */
1835 
1836   if (XEXP (*p, 0) != 0)
1837     {
1838       tem = find_constant_term_loc (&XEXP (*p, 0));
1839       if (tem != 0)
1840 	return tem;
1841     }
1842 
1843   if (XEXP (*p, 1) != 0)
1844     {
1845       tem = find_constant_term_loc (&XEXP (*p, 1));
1846       if (tem != 0)
1847 	return tem;
1848     }
1849 
1850   return 0;
1851 }
1852 
1853 /* Return 1 if OP is a memory reference
1854    whose address contains no side effects
1855    and remains valid after the addition
1856    of a positive integer less than the
1857    size of the object being referenced.
1858 
1859    We assume that the original address is valid and do not check it.
1860 
1861    This uses strict_memory_address_p as a subroutine, so
1862    don't use it before reload.  */
1863 
1864 int
offsettable_memref_p(rtx op)1865 offsettable_memref_p (rtx op)
1866 {
1867   return ((MEM_P (op))
1868 	  && offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)));
1869 }
1870 
1871 /* Similar, but don't require a strictly valid mem ref:
1872    consider pseudo-regs valid as index or base regs.  */
1873 
1874 int
offsettable_nonstrict_memref_p(rtx op)1875 offsettable_nonstrict_memref_p (rtx op)
1876 {
1877   return ((MEM_P (op))
1878 	  && offsettable_address_p (0, GET_MODE (op), XEXP (op, 0)));
1879 }
1880 
1881 /* Return 1 if Y is a memory address which contains no side effects
1882    and would remain valid after the addition of a positive integer
1883    less than the size of that mode.
1884 
1885    We assume that the original address is valid and do not check it.
1886    We do check that it is valid for narrower modes.
1887 
1888    If STRICTP is nonzero, we require a strictly valid address,
1889    for the sake of use in reload.c.  */
1890 
1891 int
offsettable_address_p(int strictp,enum machine_mode mode,rtx y)1892 offsettable_address_p (int strictp, enum machine_mode mode, rtx y)
1893 {
1894   enum rtx_code ycode = GET_CODE (y);
1895   rtx z;
1896   rtx y1 = y;
1897   rtx *y2;
1898   int (*addressp) (enum machine_mode, rtx) =
1899     (strictp ? strict_memory_address_p : memory_address_p);
1900   unsigned int mode_sz = GET_MODE_SIZE (mode);
1901 
1902   if (CONSTANT_ADDRESS_P (y))
1903     return 1;
1904 
1905   /* Adjusting an offsettable address involves changing to a narrower mode.
1906      Make sure that's OK.  */
1907 
1908   if (mode_dependent_address_p (y))
1909     return 0;
1910 
1911   /* ??? How much offset does an offsettable BLKmode reference need?
1912      Clearly that depends on the situation in which it's being used.
1913      However, the current situation in which we test 0xffffffff is
1914      less than ideal.  Caveat user.  */
1915   if (mode_sz == 0)
1916     mode_sz = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
1917 
1918   /* If the expression contains a constant term,
1919      see if it remains valid when max possible offset is added.  */
1920 
1921   if ((ycode == PLUS) && (y2 = find_constant_term_loc (&y1)))
1922     {
1923       int good;
1924 
1925       y1 = *y2;
1926       *y2 = plus_constant (*y2, mode_sz - 1);
1927       /* Use QImode because an odd displacement may be automatically invalid
1928 	 for any wider mode.  But it should be valid for a single byte.  */
1929       good = (*addressp) (QImode, y);
1930 
1931       /* In any case, restore old contents of memory.  */
1932       *y2 = y1;
1933       return good;
1934     }
1935 
1936   if (GET_RTX_CLASS (ycode) == RTX_AUTOINC)
1937     return 0;
1938 
1939   /* The offset added here is chosen as the maximum offset that
1940      any instruction could need to add when operating on something
1941      of the specified mode.  We assume that if Y and Y+c are
1942      valid addresses then so is Y+d for all 0<d<c.  adjust_address will
1943      go inside a LO_SUM here, so we do so as well.  */
1944   if (GET_CODE (y) == LO_SUM
1945       && mode != BLKmode
1946       && mode_sz <= GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT)
1947     z = gen_rtx_LO_SUM (GET_MODE (y), XEXP (y, 0),
1948 			plus_constant (XEXP (y, 1), mode_sz - 1));
1949   else
1950     z = plus_constant (y, mode_sz - 1);
1951 
1952   /* Use QImode because an odd displacement may be automatically invalid
1953      for any wider mode.  But it should be valid for a single byte.  */
1954   return (*addressp) (QImode, z);
1955 }
1956 
1957 /* Return 1 if ADDR is an address-expression whose effect depends
1958    on the mode of the memory reference it is used in.
1959 
1960    Autoincrement addressing is a typical example of mode-dependence
1961    because the amount of the increment depends on the mode.  */
1962 
1963 int
mode_dependent_address_p(rtx addr ATTRIBUTE_UNUSED)1964 mode_dependent_address_p (rtx addr ATTRIBUTE_UNUSED /* Maybe used in GO_IF_MODE_DEPENDENT_ADDRESS.  */)
1965 {
1966   GO_IF_MODE_DEPENDENT_ADDRESS (addr, win);
1967   return 0;
1968   /* Label `win' might (not) be used via GO_IF_MODE_DEPENDENT_ADDRESS.  */
1969  win: ATTRIBUTE_UNUSED_LABEL
1970   return 1;
1971 }
1972 
1973 /* Like extract_insn, but save insn extracted and don't extract again, when
1974    called again for the same insn expecting that recog_data still contain the
1975    valid information.  This is used primary by gen_attr infrastructure that
1976    often does extract insn again and again.  */
1977 void
extract_insn_cached(rtx insn)1978 extract_insn_cached (rtx insn)
1979 {
1980   if (recog_data.insn == insn && INSN_CODE (insn) >= 0)
1981     return;
1982   extract_insn (insn);
1983   recog_data.insn = insn;
1984 }
1985 
1986 /* Do cached extract_insn, constrain_operands and complain about failures.
1987    Used by insn_attrtab.  */
1988 void
extract_constrain_insn_cached(rtx insn)1989 extract_constrain_insn_cached (rtx insn)
1990 {
1991   extract_insn_cached (insn);
1992   if (which_alternative == -1
1993       && !constrain_operands (reload_completed))
1994     fatal_insn_not_found (insn);
1995 }
1996 
1997 /* Do cached constrain_operands and complain about failures.  */
1998 int
constrain_operands_cached(int strict)1999 constrain_operands_cached (int strict)
2000 {
2001   if (which_alternative == -1)
2002     return constrain_operands (strict);
2003   else
2004     return 1;
2005 }
2006 
2007 /* Analyze INSN and fill in recog_data.  */
2008 
2009 void
extract_insn(rtx insn)2010 extract_insn (rtx insn)
2011 {
2012   int i;
2013   int icode;
2014   int noperands;
2015   rtx body = PATTERN (insn);
2016 
2017   recog_data.insn = NULL;
2018   recog_data.n_operands = 0;
2019   recog_data.n_alternatives = 0;
2020   recog_data.n_dups = 0;
2021   which_alternative = -1;
2022 
2023   switch (GET_CODE (body))
2024     {
2025     case USE:
2026     case CLOBBER:
2027     case ASM_INPUT:
2028     case ADDR_VEC:
2029     case ADDR_DIFF_VEC:
2030       return;
2031 
2032     case SET:
2033       if (GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
2034 	goto asm_insn;
2035       else
2036 	goto normal_insn;
2037     case PARALLEL:
2038       if ((GET_CODE (XVECEXP (body, 0, 0)) == SET
2039 	   && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
2040 	  || GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
2041 	goto asm_insn;
2042       else
2043 	goto normal_insn;
2044     case ASM_OPERANDS:
2045     asm_insn:
2046       recog_data.n_operands = noperands = asm_noperands (body);
2047       if (noperands >= 0)
2048 	{
2049 	  /* This insn is an `asm' with operands.  */
2050 
2051 	  /* expand_asm_operands makes sure there aren't too many operands.  */
2052 	  gcc_assert (noperands <= MAX_RECOG_OPERANDS);
2053 
2054 	  /* Now get the operand values and constraints out of the insn.  */
2055 	  decode_asm_operands (body, recog_data.operand,
2056 			       recog_data.operand_loc,
2057 			       recog_data.constraints,
2058 			       recog_data.operand_mode);
2059 	  if (noperands > 0)
2060 	    {
2061 	      const char *p =  recog_data.constraints[0];
2062 	      recog_data.n_alternatives = 1;
2063 	      while (*p)
2064 		recog_data.n_alternatives += (*p++ == ',');
2065 	    }
2066 	  break;
2067 	}
2068       fatal_insn_not_found (insn);
2069 
2070     default:
2071     normal_insn:
2072       /* Ordinary insn: recognize it, get the operands via insn_extract
2073 	 and get the constraints.  */
2074 
2075       icode = recog_memoized (insn);
2076       if (icode < 0)
2077 	fatal_insn_not_found (insn);
2078 
2079       recog_data.n_operands = noperands = insn_data[icode].n_operands;
2080       recog_data.n_alternatives = insn_data[icode].n_alternatives;
2081       recog_data.n_dups = insn_data[icode].n_dups;
2082 
2083       insn_extract (insn);
2084 
2085       for (i = 0; i < noperands; i++)
2086 	{
2087 	  recog_data.constraints[i] = insn_data[icode].operand[i].constraint;
2088 	  recog_data.operand_mode[i] = insn_data[icode].operand[i].mode;
2089 	  /* VOIDmode match_operands gets mode from their real operand.  */
2090 	  if (recog_data.operand_mode[i] == VOIDmode)
2091 	    recog_data.operand_mode[i] = GET_MODE (recog_data.operand[i]);
2092 	}
2093     }
2094   for (i = 0; i < noperands; i++)
2095     recog_data.operand_type[i]
2096       = (recog_data.constraints[i][0] == '=' ? OP_OUT
2097 	 : recog_data.constraints[i][0] == '+' ? OP_INOUT
2098 	 : OP_IN);
2099 
2100   gcc_assert (recog_data.n_alternatives <= MAX_RECOG_ALTERNATIVES);
2101 }
2102 
2103 /* After calling extract_insn, you can use this function to extract some
2104    information from the constraint strings into a more usable form.
2105    The collected data is stored in recog_op_alt.  */
2106 void
preprocess_constraints(void)2107 preprocess_constraints (void)
2108 {
2109   int i;
2110 
2111   for (i = 0; i < recog_data.n_operands; i++)
2112     memset (recog_op_alt[i], 0, (recog_data.n_alternatives
2113 				 * sizeof (struct operand_alternative)));
2114 
2115   for (i = 0; i < recog_data.n_operands; i++)
2116     {
2117       int j;
2118       struct operand_alternative *op_alt;
2119       const char *p = recog_data.constraints[i];
2120 
2121       op_alt = recog_op_alt[i];
2122 
2123       for (j = 0; j < recog_data.n_alternatives; j++)
2124 	{
2125 	  op_alt[j].cl = NO_REGS;
2126 	  op_alt[j].constraint = p;
2127 	  op_alt[j].matches = -1;
2128 	  op_alt[j].matched = -1;
2129 
2130 	  if (*p == '\0' || *p == ',')
2131 	    {
2132 	      op_alt[j].anything_ok = 1;
2133 	      continue;
2134 	    }
2135 
2136 	  for (;;)
2137 	    {
2138 	      char c = *p;
2139 	      if (c == '#')
2140 		do
2141 		  c = *++p;
2142 		while (c != ',' && c != '\0');
2143 	      if (c == ',' || c == '\0')
2144 		{
2145 		  p++;
2146 		  break;
2147 		}
2148 
2149 	      switch (c)
2150 		{
2151 		case '=': case '+': case '*': case '%':
2152 		case 'E': case 'F': case 'G': case 'H':
2153 		case 's': case 'i': case 'n':
2154 		case 'I': case 'J': case 'K': case 'L':
2155 		case 'M': case 'N': case 'O': case 'P':
2156 		  /* These don't say anything we care about.  */
2157 		  break;
2158 
2159 		case '?':
2160 		  op_alt[j].reject += 6;
2161 		  break;
2162 		case '!':
2163 		  op_alt[j].reject += 600;
2164 		  break;
2165 		case '&':
2166 		  op_alt[j].earlyclobber = 1;
2167 		  break;
2168 
2169 		case '0': case '1': case '2': case '3': case '4':
2170 		case '5': case '6': case '7': case '8': case '9':
2171 		  {
2172 		    char *end;
2173 		    op_alt[j].matches = strtoul (p, &end, 10);
2174 		    recog_op_alt[op_alt[j].matches][j].matched = i;
2175 		    p = end;
2176 		  }
2177 		  continue;
2178 
2179 		case 'm':
2180 		  op_alt[j].memory_ok = 1;
2181 		  break;
2182 		case '<':
2183 		  op_alt[j].decmem_ok = 1;
2184 		  break;
2185 		case '>':
2186 		  op_alt[j].incmem_ok = 1;
2187 		  break;
2188 		case 'V':
2189 		  op_alt[j].nonoffmem_ok = 1;
2190 		  break;
2191 		case 'o':
2192 		  op_alt[j].offmem_ok = 1;
2193 		  break;
2194 		case 'X':
2195 		  op_alt[j].anything_ok = 1;
2196 		  break;
2197 
2198 		case 'p':
2199 		  op_alt[j].is_address = 1;
2200 		  op_alt[j].cl = reg_class_subunion[(int) op_alt[j].cl]
2201 		      [(int) base_reg_class (VOIDmode, ADDRESS, SCRATCH)];
2202 		  break;
2203 
2204 		case 'g':
2205 		case 'r':
2206 		  op_alt[j].cl =
2207 		   reg_class_subunion[(int) op_alt[j].cl][(int) GENERAL_REGS];
2208 		  break;
2209 
2210 		default:
2211 		  if (EXTRA_MEMORY_CONSTRAINT (c, p))
2212 		    {
2213 		      op_alt[j].memory_ok = 1;
2214 		      break;
2215 		    }
2216 		  if (EXTRA_ADDRESS_CONSTRAINT (c, p))
2217 		    {
2218 		      op_alt[j].is_address = 1;
2219 		      op_alt[j].cl
2220 			= (reg_class_subunion
2221 			   [(int) op_alt[j].cl]
2222 			   [(int) base_reg_class (VOIDmode, ADDRESS,
2223 						  SCRATCH)]);
2224 		      break;
2225 		    }
2226 
2227 		  op_alt[j].cl
2228 		    = (reg_class_subunion
2229 		       [(int) op_alt[j].cl]
2230 		       [(int) REG_CLASS_FROM_CONSTRAINT ((unsigned char) c, p)]);
2231 		  break;
2232 		}
2233 	      p += CONSTRAINT_LEN (c, p);
2234 	    }
2235 	}
2236     }
2237 }
2238 
2239 /* Check the operands of an insn against the insn's operand constraints
2240    and return 1 if they are valid.
2241    The information about the insn's operands, constraints, operand modes
2242    etc. is obtained from the global variables set up by extract_insn.
2243 
2244    WHICH_ALTERNATIVE is set to a number which indicates which
2245    alternative of constraints was matched: 0 for the first alternative,
2246    1 for the next, etc.
2247 
2248    In addition, when two operands are required to match
2249    and it happens that the output operand is (reg) while the
2250    input operand is --(reg) or ++(reg) (a pre-inc or pre-dec),
2251    make the output operand look like the input.
2252    This is because the output operand is the one the template will print.
2253 
2254    This is used in final, just before printing the assembler code and by
2255    the routines that determine an insn's attribute.
2256 
2257    If STRICT is a positive nonzero value, it means that we have been
2258    called after reload has been completed.  In that case, we must
2259    do all checks strictly.  If it is zero, it means that we have been called
2260    before reload has completed.  In that case, we first try to see if we can
2261    find an alternative that matches strictly.  If not, we try again, this
2262    time assuming that reload will fix up the insn.  This provides a "best
2263    guess" for the alternative and is used to compute attributes of insns prior
2264    to reload.  A negative value of STRICT is used for this internal call.  */
2265 
2266 struct funny_match
2267 {
2268   int this, other;
2269 };
2270 
2271 int
constrain_operands(int strict)2272 constrain_operands (int strict)
2273 {
2274   const char *constraints[MAX_RECOG_OPERANDS];
2275   int matching_operands[MAX_RECOG_OPERANDS];
2276   int earlyclobber[MAX_RECOG_OPERANDS];
2277   int c;
2278 
2279   struct funny_match funny_match[MAX_RECOG_OPERANDS];
2280   int funny_match_index;
2281 
2282   which_alternative = 0;
2283   if (recog_data.n_operands == 0 || recog_data.n_alternatives == 0)
2284     return 1;
2285 
2286   for (c = 0; c < recog_data.n_operands; c++)
2287     {
2288       constraints[c] = recog_data.constraints[c];
2289       matching_operands[c] = -1;
2290     }
2291 
2292   do
2293     {
2294       int seen_earlyclobber_at = -1;
2295       int opno;
2296       int lose = 0;
2297       funny_match_index = 0;
2298 
2299       for (opno = 0; opno < recog_data.n_operands; opno++)
2300 	{
2301 	  rtx op = recog_data.operand[opno];
2302 	  enum machine_mode mode = GET_MODE (op);
2303 	  const char *p = constraints[opno];
2304 	  int offset = 0;
2305 	  int win = 0;
2306 	  int val;
2307 	  int len;
2308 
2309 	  earlyclobber[opno] = 0;
2310 
2311 	  /* A unary operator may be accepted by the predicate, but it
2312 	     is irrelevant for matching constraints.  */
2313 	  if (UNARY_P (op))
2314 	    op = XEXP (op, 0);
2315 
2316 	  if (GET_CODE (op) == SUBREG)
2317 	    {
2318 	      if (REG_P (SUBREG_REG (op))
2319 		  && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER)
2320 		offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
2321 					      GET_MODE (SUBREG_REG (op)),
2322 					      SUBREG_BYTE (op),
2323 					      GET_MODE (op));
2324 	      op = SUBREG_REG (op);
2325 	    }
2326 
2327 	  /* An empty constraint or empty alternative
2328 	     allows anything which matched the pattern.  */
2329 	  if (*p == 0 || *p == ',')
2330 	    win = 1;
2331 
2332 	  do
2333 	    switch (c = *p, len = CONSTRAINT_LEN (c, p), c)
2334 	      {
2335 	      case '\0':
2336 		len = 0;
2337 		break;
2338 	      case ',':
2339 		c = '\0';
2340 		break;
2341 
2342 	      case '?':  case '!': case '*':  case '%':
2343 	      case '=':  case '+':
2344 		break;
2345 
2346 	      case '#':
2347 		/* Ignore rest of this alternative as far as
2348 		   constraint checking is concerned.  */
2349 		do
2350 		  p++;
2351 		while (*p && *p != ',');
2352 		len = 0;
2353 		break;
2354 
2355 	      case '&':
2356 		earlyclobber[opno] = 1;
2357 		if (seen_earlyclobber_at < 0)
2358 		  seen_earlyclobber_at = opno;
2359 		break;
2360 
2361 	      case '0':  case '1':  case '2':  case '3':  case '4':
2362 	      case '5':  case '6':  case '7':  case '8':  case '9':
2363 		{
2364 		  /* This operand must be the same as a previous one.
2365 		     This kind of constraint is used for instructions such
2366 		     as add when they take only two operands.
2367 
2368 		     Note that the lower-numbered operand is passed first.
2369 
2370 		     If we are not testing strictly, assume that this
2371 		     constraint will be satisfied.  */
2372 
2373 		  char *end;
2374 		  int match;
2375 
2376 		  match = strtoul (p, &end, 10);
2377 		  p = end;
2378 
2379 		  if (strict < 0)
2380 		    val = 1;
2381 		  else
2382 		    {
2383 		      rtx op1 = recog_data.operand[match];
2384 		      rtx op2 = recog_data.operand[opno];
2385 
2386 		      /* A unary operator may be accepted by the predicate,
2387 			 but it is irrelevant for matching constraints.  */
2388 		      if (UNARY_P (op1))
2389 			op1 = XEXP (op1, 0);
2390 		      if (UNARY_P (op2))
2391 			op2 = XEXP (op2, 0);
2392 
2393 		      val = operands_match_p (op1, op2);
2394 		    }
2395 
2396 		  matching_operands[opno] = match;
2397 		  matching_operands[match] = opno;
2398 
2399 		  if (val != 0)
2400 		    win = 1;
2401 
2402 		  /* If output is *x and input is *--x, arrange later
2403 		     to change the output to *--x as well, since the
2404 		     output op is the one that will be printed.  */
2405 		  if (val == 2 && strict > 0)
2406 		    {
2407 		      funny_match[funny_match_index].this = opno;
2408 		      funny_match[funny_match_index++].other = match;
2409 		    }
2410 		}
2411 		len = 0;
2412 		break;
2413 
2414 	      case 'p':
2415 		/* p is used for address_operands.  When we are called by
2416 		   gen_reload, no one will have checked that the address is
2417 		   strictly valid, i.e., that all pseudos requiring hard regs
2418 		   have gotten them.  */
2419 		if (strict <= 0
2420 		    || (strict_memory_address_p (recog_data.operand_mode[opno],
2421 						 op)))
2422 		  win = 1;
2423 		break;
2424 
2425 		/* No need to check general_operand again;
2426 		   it was done in insn-recog.c.  Well, except that reload
2427 		   doesn't check the validity of its replacements, but
2428 		   that should only matter when there's a bug.  */
2429 	      case 'g':
2430 		/* Anything goes unless it is a REG and really has a hard reg
2431 		   but the hard reg is not in the class GENERAL_REGS.  */
2432 		if (REG_P (op))
2433 		  {
2434 		    if (strict < 0
2435 			|| GENERAL_REGS == ALL_REGS
2436 			|| (reload_in_progress
2437 			    && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2438 			|| reg_fits_class_p (op, GENERAL_REGS, offset, mode))
2439 		      win = 1;
2440 		  }
2441 		else if (strict < 0 || general_operand (op, mode))
2442 		  win = 1;
2443 		break;
2444 
2445 	      case 'X':
2446 		/* This is used for a MATCH_SCRATCH in the cases when
2447 		   we don't actually need anything.  So anything goes
2448 		   any time.  */
2449 		win = 1;
2450 		break;
2451 
2452 	      case 'm':
2453 		/* Memory operands must be valid, to the extent
2454 		   required by STRICT.  */
2455 		if (MEM_P (op))
2456 		  {
2457 		    if (strict > 0
2458 			&& !strict_memory_address_p (GET_MODE (op),
2459 						     XEXP (op, 0)))
2460 		      break;
2461 		    if (strict == 0
2462 			&& !memory_address_p (GET_MODE (op), XEXP (op, 0)))
2463 		      break;
2464 		    win = 1;
2465 		  }
2466 		/* Before reload, accept what reload can turn into mem.  */
2467 		else if (strict < 0 && CONSTANT_P (op))
2468 		  win = 1;
2469 		/* During reload, accept a pseudo  */
2470 		else if (reload_in_progress && REG_P (op)
2471 			 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2472 		  win = 1;
2473 		break;
2474 
2475 	      case '<':
2476 		if (MEM_P (op)
2477 		    && (GET_CODE (XEXP (op, 0)) == PRE_DEC
2478 			|| GET_CODE (XEXP (op, 0)) == POST_DEC))
2479 		  win = 1;
2480 		break;
2481 
2482 	      case '>':
2483 		if (MEM_P (op)
2484 		    && (GET_CODE (XEXP (op, 0)) == PRE_INC
2485 			|| GET_CODE (XEXP (op, 0)) == POST_INC))
2486 		  win = 1;
2487 		break;
2488 
2489 	      case 'E':
2490 	      case 'F':
2491 		if (GET_CODE (op) == CONST_DOUBLE
2492 		    || (GET_CODE (op) == CONST_VECTOR
2493 			&& GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_FLOAT))
2494 		  win = 1;
2495 		break;
2496 
2497 	      case 'G':
2498 	      case 'H':
2499 		if (GET_CODE (op) == CONST_DOUBLE
2500 		    && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, c, p))
2501 		  win = 1;
2502 		break;
2503 
2504 	      case 's':
2505 		if (GET_CODE (op) == CONST_INT
2506 		    || (GET_CODE (op) == CONST_DOUBLE
2507 			&& GET_MODE (op) == VOIDmode))
2508 		  break;
2509 	      case 'i':
2510 		if (CONSTANT_P (op))
2511 		  win = 1;
2512 		break;
2513 
2514 	      case 'n':
2515 		if (GET_CODE (op) == CONST_INT
2516 		    || (GET_CODE (op) == CONST_DOUBLE
2517 			&& GET_MODE (op) == VOIDmode))
2518 		  win = 1;
2519 		break;
2520 
2521 	      case 'I':
2522 	      case 'J':
2523 	      case 'K':
2524 	      case 'L':
2525 	      case 'M':
2526 	      case 'N':
2527 	      case 'O':
2528 	      case 'P':
2529 		if (GET_CODE (op) == CONST_INT
2530 		    && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), c, p))
2531 		  win = 1;
2532 		break;
2533 
2534 	      case 'V':
2535 		if (MEM_P (op)
2536 		    && ((strict > 0 && ! offsettable_memref_p (op))
2537 			|| (strict < 0
2538 			    && !(CONSTANT_P (op) || MEM_P (op)))
2539 			|| (reload_in_progress
2540 			    && !(REG_P (op)
2541 				 && REGNO (op) >= FIRST_PSEUDO_REGISTER))))
2542 		  win = 1;
2543 		break;
2544 
2545 	      case 'o':
2546 		if ((strict > 0 && offsettable_memref_p (op))
2547 		    || (strict == 0 && offsettable_nonstrict_memref_p (op))
2548 		    /* Before reload, accept what reload can handle.  */
2549 		    || (strict < 0
2550 			&& (CONSTANT_P (op) || MEM_P (op)))
2551 		    /* During reload, accept a pseudo  */
2552 		    || (reload_in_progress && REG_P (op)
2553 			&& REGNO (op) >= FIRST_PSEUDO_REGISTER))
2554 		  win = 1;
2555 		break;
2556 
2557 	      default:
2558 		{
2559 		  enum reg_class cl;
2560 
2561 		  cl = (c == 'r'
2562 			   ? GENERAL_REGS : REG_CLASS_FROM_CONSTRAINT (c, p));
2563 		  if (cl != NO_REGS)
2564 		    {
2565 		      if (strict < 0
2566 			  || (strict == 0
2567 			      && REG_P (op)
2568 			      && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2569 			  || (strict == 0 && GET_CODE (op) == SCRATCH)
2570 			  || (REG_P (op)
2571 			      && reg_fits_class_p (op, cl, offset, mode)))
2572 		        win = 1;
2573 		    }
2574 #ifdef EXTRA_CONSTRAINT_STR
2575 		  else if (EXTRA_CONSTRAINT_STR (op, c, p))
2576 		    win = 1;
2577 
2578 		  else if (EXTRA_MEMORY_CONSTRAINT (c, p)
2579 			   /* Every memory operand can be reloaded to fit.  */
2580 			   && ((strict < 0 && MEM_P (op))
2581 			       /* Before reload, accept what reload can turn
2582 				  into mem.  */
2583 			       || (strict < 0 && CONSTANT_P (op))
2584 			       /* During reload, accept a pseudo  */
2585 			       || (reload_in_progress && REG_P (op)
2586 				   && REGNO (op) >= FIRST_PSEUDO_REGISTER)))
2587 		    win = 1;
2588 		  else if (EXTRA_ADDRESS_CONSTRAINT (c, p)
2589 			   /* Every address operand can be reloaded to fit.  */
2590 			   && strict < 0)
2591 		    win = 1;
2592 #endif
2593 		  break;
2594 		}
2595 	      }
2596 	  while (p += len, c);
2597 
2598 	  constraints[opno] = p;
2599 	  /* If this operand did not win somehow,
2600 	     this alternative loses.  */
2601 	  if (! win)
2602 	    lose = 1;
2603 	}
2604       /* This alternative won; the operands are ok.
2605 	 Change whichever operands this alternative says to change.  */
2606       if (! lose)
2607 	{
2608 	  int opno, eopno;
2609 
2610 	  /* See if any earlyclobber operand conflicts with some other
2611 	     operand.  */
2612 
2613 	  if (strict > 0  && seen_earlyclobber_at >= 0)
2614 	    for (eopno = seen_earlyclobber_at;
2615 		 eopno < recog_data.n_operands;
2616 		 eopno++)
2617 	      /* Ignore earlyclobber operands now in memory,
2618 		 because we would often report failure when we have
2619 		 two memory operands, one of which was formerly a REG.  */
2620 	      if (earlyclobber[eopno]
2621 		  && REG_P (recog_data.operand[eopno]))
2622 		for (opno = 0; opno < recog_data.n_operands; opno++)
2623 		  if ((MEM_P (recog_data.operand[opno])
2624 		       || recog_data.operand_type[opno] != OP_OUT)
2625 		      && opno != eopno
2626 		      /* Ignore things like match_operator operands.  */
2627 		      && *recog_data.constraints[opno] != 0
2628 		      && ! (matching_operands[opno] == eopno
2629 			    && operands_match_p (recog_data.operand[opno],
2630 						 recog_data.operand[eopno]))
2631 		      && ! safe_from_earlyclobber (recog_data.operand[opno],
2632 						   recog_data.operand[eopno]))
2633 		    lose = 1;
2634 
2635 	  if (! lose)
2636 	    {
2637 	      while (--funny_match_index >= 0)
2638 		{
2639 		  recog_data.operand[funny_match[funny_match_index].other]
2640 		    = recog_data.operand[funny_match[funny_match_index].this];
2641 		}
2642 
2643 	      return 1;
2644 	    }
2645 	}
2646 
2647       which_alternative++;
2648     }
2649   while (which_alternative < recog_data.n_alternatives);
2650 
2651   which_alternative = -1;
2652   /* If we are about to reject this, but we are not to test strictly,
2653      try a very loose test.  Only return failure if it fails also.  */
2654   if (strict == 0)
2655     return constrain_operands (-1);
2656   else
2657     return 0;
2658 }
2659 
2660 /* Return 1 iff OPERAND (assumed to be a REG rtx)
2661    is a hard reg in class CLASS when its regno is offset by OFFSET
2662    and changed to mode MODE.
2663    If REG occupies multiple hard regs, all of them must be in CLASS.  */
2664 
2665 int
reg_fits_class_p(rtx operand,enum reg_class cl,int offset,enum machine_mode mode)2666 reg_fits_class_p (rtx operand, enum reg_class cl, int offset,
2667 		  enum machine_mode mode)
2668 {
2669   int regno = REGNO (operand);
2670 
2671   if (cl == NO_REGS)
2672     return 0;
2673 
2674   if (regno < FIRST_PSEUDO_REGISTER
2675       && TEST_HARD_REG_BIT (reg_class_contents[(int) cl],
2676 			    regno + offset))
2677     {
2678       int sr;
2679       regno += offset;
2680       for (sr = hard_regno_nregs[regno][mode] - 1;
2681 	   sr > 0; sr--)
2682 	if (! TEST_HARD_REG_BIT (reg_class_contents[(int) cl],
2683 				 regno + sr))
2684 	  break;
2685       return sr == 0;
2686     }
2687 
2688   return 0;
2689 }
2690 
2691 /* Split single instruction.  Helper function for split_all_insns and
2692    split_all_insns_noflow.  Return last insn in the sequence if successful,
2693    or NULL if unsuccessful.  */
2694 
2695 static rtx
split_insn(rtx insn)2696 split_insn (rtx insn)
2697 {
2698   /* Split insns here to get max fine-grain parallelism.  */
2699   rtx first = PREV_INSN (insn);
2700   rtx last = try_split (PATTERN (insn), insn, 1);
2701 
2702   if (last == insn)
2703     return NULL_RTX;
2704 
2705   /* try_split returns the NOTE that INSN became.  */
2706   SET_INSN_DELETED (insn);
2707 
2708   /* ??? Coddle to md files that generate subregs in post-reload
2709      splitters instead of computing the proper hard register.  */
2710   if (reload_completed && first != last)
2711     {
2712       first = NEXT_INSN (first);
2713       for (;;)
2714 	{
2715 	  if (INSN_P (first))
2716 	    cleanup_subreg_operands (first);
2717 	  if (first == last)
2718 	    break;
2719 	  first = NEXT_INSN (first);
2720 	}
2721     }
2722   return last;
2723 }
2724 
2725 /* Split all insns in the function.  If UPD_LIFE, update life info after.  */
2726 
2727 void
split_all_insns(int upd_life)2728 split_all_insns (int upd_life)
2729 {
2730   sbitmap blocks;
2731   bool changed;
2732   basic_block bb;
2733 
2734   blocks = sbitmap_alloc (last_basic_block);
2735   sbitmap_zero (blocks);
2736   changed = false;
2737 
2738   FOR_EACH_BB_REVERSE (bb)
2739     {
2740       rtx insn, next;
2741       bool finish = false;
2742 
2743       for (insn = BB_HEAD (bb); !finish ; insn = next)
2744 	{
2745 	  /* Can't use `next_real_insn' because that might go across
2746 	     CODE_LABELS and short-out basic blocks.  */
2747 	  next = NEXT_INSN (insn);
2748 	  finish = (insn == BB_END (bb));
2749 	  if (INSN_P (insn))
2750 	    {
2751 	      rtx set = single_set (insn);
2752 
2753 	      /* Don't split no-op move insns.  These should silently
2754 		 disappear later in final.  Splitting such insns would
2755 		 break the code that handles REG_NO_CONFLICT blocks.  */
2756 	      if (set && set_noop_p (set))
2757 		{
2758 		  /* Nops get in the way while scheduling, so delete them
2759 		     now if register allocation has already been done.  It
2760 		     is too risky to try to do this before register
2761 		     allocation, and there are unlikely to be very many
2762 		     nops then anyways.  */
2763 		  if (reload_completed)
2764 		    {
2765 		      /* If the no-op set has a REG_UNUSED note, we need
2766 			 to update liveness information.  */
2767 		      if (find_reg_note (insn, REG_UNUSED, NULL_RTX))
2768 			{
2769 			  SET_BIT (blocks, bb->index);
2770 			  changed = true;
2771 			}
2772 		      /* ??? Is life info affected by deleting edges?  */
2773 		      delete_insn_and_edges (insn);
2774 		    }
2775 		}
2776 	      else
2777 		{
2778 		  rtx last = split_insn (insn);
2779 		  if (last)
2780 		    {
2781 		      /* The split sequence may include barrier, but the
2782 			 BB boundary we are interested in will be set to
2783 			 previous one.  */
2784 
2785 		      while (BARRIER_P (last))
2786 			last = PREV_INSN (last);
2787 		      SET_BIT (blocks, bb->index);
2788 		      changed = true;
2789 		    }
2790 		}
2791 	    }
2792 	}
2793     }
2794 
2795   if (changed)
2796     {
2797       int old_last_basic_block = last_basic_block;
2798 
2799       find_many_sub_basic_blocks (blocks);
2800 
2801       if (old_last_basic_block != last_basic_block && upd_life)
2802 	blocks = sbitmap_resize (blocks, last_basic_block, 1);
2803     }
2804 
2805   if (changed && upd_life)
2806     update_life_info (blocks, UPDATE_LIFE_GLOBAL_RM_NOTES,
2807 		      PROP_DEATH_NOTES);
2808 
2809 #ifdef ENABLE_CHECKING
2810   verify_flow_info ();
2811 #endif
2812 
2813   sbitmap_free (blocks);
2814 }
2815 
2816 /* Same as split_all_insns, but do not expect CFG to be available.
2817    Used by machine dependent reorg passes.  */
2818 
2819 unsigned int
split_all_insns_noflow(void)2820 split_all_insns_noflow (void)
2821 {
2822   rtx next, insn;
2823 
2824   for (insn = get_insns (); insn; insn = next)
2825     {
2826       next = NEXT_INSN (insn);
2827       if (INSN_P (insn))
2828 	{
2829 	  /* Don't split no-op move insns.  These should silently
2830 	     disappear later in final.  Splitting such insns would
2831 	     break the code that handles REG_NO_CONFLICT blocks.  */
2832 	  rtx set = single_set (insn);
2833 	  if (set && set_noop_p (set))
2834 	    {
2835 	      /* Nops get in the way while scheduling, so delete them
2836 		 now if register allocation has already been done.  It
2837 		 is too risky to try to do this before register
2838 		 allocation, and there are unlikely to be very many
2839 		 nops then anyways.
2840 
2841 		 ??? Should we use delete_insn when the CFG isn't valid?  */
2842 	      if (reload_completed)
2843 		delete_insn_and_edges (insn);
2844 	    }
2845 	  else
2846 	    split_insn (insn);
2847 	}
2848     }
2849   return 0;
2850 }
2851 
2852 #ifdef HAVE_peephole2
2853 struct peep2_insn_data
2854 {
2855   rtx insn;
2856   regset live_before;
2857 };
2858 
2859 static struct peep2_insn_data peep2_insn_data[MAX_INSNS_PER_PEEP2 + 1];
2860 static int peep2_current;
2861 /* The number of instructions available to match a peep2.  */
2862 int peep2_current_count;
2863 
2864 /* A non-insn marker indicating the last insn of the block.
2865    The live_before regset for this element is correct, indicating
2866    global_live_at_end for the block.  */
2867 #define PEEP2_EOB	pc_rtx
2868 
2869 /* Return the Nth non-note insn after `current', or return NULL_RTX if it
2870    does not exist.  Used by the recognizer to find the next insn to match
2871    in a multi-insn pattern.  */
2872 
2873 rtx
peep2_next_insn(int n)2874 peep2_next_insn (int n)
2875 {
2876   gcc_assert (n <= peep2_current_count);
2877 
2878   n += peep2_current;
2879   if (n >= MAX_INSNS_PER_PEEP2 + 1)
2880     n -= MAX_INSNS_PER_PEEP2 + 1;
2881 
2882   return peep2_insn_data[n].insn;
2883 }
2884 
2885 /* Return true if REGNO is dead before the Nth non-note insn
2886    after `current'.  */
2887 
2888 int
peep2_regno_dead_p(int ofs,int regno)2889 peep2_regno_dead_p (int ofs, int regno)
2890 {
2891   gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
2892 
2893   ofs += peep2_current;
2894   if (ofs >= MAX_INSNS_PER_PEEP2 + 1)
2895     ofs -= MAX_INSNS_PER_PEEP2 + 1;
2896 
2897   gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
2898 
2899   return ! REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno);
2900 }
2901 
2902 /* Similarly for a REG.  */
2903 
2904 int
peep2_reg_dead_p(int ofs,rtx reg)2905 peep2_reg_dead_p (int ofs, rtx reg)
2906 {
2907   int regno, n;
2908 
2909   gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
2910 
2911   ofs += peep2_current;
2912   if (ofs >= MAX_INSNS_PER_PEEP2 + 1)
2913     ofs -= MAX_INSNS_PER_PEEP2 + 1;
2914 
2915   gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
2916 
2917   regno = REGNO (reg);
2918   n = hard_regno_nregs[regno][GET_MODE (reg)];
2919   while (--n >= 0)
2920     if (REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno + n))
2921       return 0;
2922   return 1;
2923 }
2924 
2925 /* Try to find a hard register of mode MODE, matching the register class in
2926    CLASS_STR, which is available at the beginning of insn CURRENT_INSN and
2927    remains available until the end of LAST_INSN.  LAST_INSN may be NULL_RTX,
2928    in which case the only condition is that the register must be available
2929    before CURRENT_INSN.
2930    Registers that already have bits set in REG_SET will not be considered.
2931 
2932    If an appropriate register is available, it will be returned and the
2933    corresponding bit(s) in REG_SET will be set; otherwise, NULL_RTX is
2934    returned.  */
2935 
2936 rtx
peep2_find_free_register(int from,int to,const char * class_str,enum machine_mode mode,HARD_REG_SET * reg_set)2937 peep2_find_free_register (int from, int to, const char *class_str,
2938 			  enum machine_mode mode, HARD_REG_SET *reg_set)
2939 {
2940   static int search_ofs;
2941   enum reg_class cl;
2942   HARD_REG_SET live;
2943   int i;
2944 
2945   gcc_assert (from < MAX_INSNS_PER_PEEP2 + 1);
2946   gcc_assert (to < MAX_INSNS_PER_PEEP2 + 1);
2947 
2948   from += peep2_current;
2949   if (from >= MAX_INSNS_PER_PEEP2 + 1)
2950     from -= MAX_INSNS_PER_PEEP2 + 1;
2951   to += peep2_current;
2952   if (to >= MAX_INSNS_PER_PEEP2 + 1)
2953     to -= MAX_INSNS_PER_PEEP2 + 1;
2954 
2955   gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
2956   REG_SET_TO_HARD_REG_SET (live, peep2_insn_data[from].live_before);
2957 
2958   while (from != to)
2959     {
2960       HARD_REG_SET this_live;
2961 
2962       if (++from >= MAX_INSNS_PER_PEEP2 + 1)
2963 	from = 0;
2964       gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
2965       REG_SET_TO_HARD_REG_SET (this_live, peep2_insn_data[from].live_before);
2966       IOR_HARD_REG_SET (live, this_live);
2967     }
2968 
2969   cl = (class_str[0] == 'r' ? GENERAL_REGS
2970 	   : REG_CLASS_FROM_CONSTRAINT (class_str[0], class_str));
2971 
2972   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2973     {
2974       int raw_regno, regno, success, j;
2975 
2976       /* Distribute the free registers as much as possible.  */
2977       raw_regno = search_ofs + i;
2978       if (raw_regno >= FIRST_PSEUDO_REGISTER)
2979 	raw_regno -= FIRST_PSEUDO_REGISTER;
2980 #ifdef REG_ALLOC_ORDER
2981       regno = reg_alloc_order[raw_regno];
2982 #else
2983       regno = raw_regno;
2984 #endif
2985 
2986       /* Don't allocate fixed registers.  */
2987       if (fixed_regs[regno])
2988 	continue;
2989       /* Make sure the register is of the right class.  */
2990       if (! TEST_HARD_REG_BIT (reg_class_contents[cl], regno))
2991 	continue;
2992       /* And can support the mode we need.  */
2993       if (! HARD_REGNO_MODE_OK (regno, mode))
2994 	continue;
2995       /* And that we don't create an extra save/restore.  */
2996       if (! call_used_regs[regno] && ! regs_ever_live[regno])
2997 	continue;
2998       /* And we don't clobber traceback for noreturn functions.  */
2999       if ((regno == FRAME_POINTER_REGNUM || regno == HARD_FRAME_POINTER_REGNUM)
3000 	  && (! reload_completed || frame_pointer_needed))
3001 	continue;
3002 
3003       success = 1;
3004       for (j = hard_regno_nregs[regno][mode] - 1; j >= 0; j--)
3005 	{
3006 	  if (TEST_HARD_REG_BIT (*reg_set, regno + j)
3007 	      || TEST_HARD_REG_BIT (live, regno + j))
3008 	    {
3009 	      success = 0;
3010 	      break;
3011 	    }
3012 	}
3013       if (success)
3014 	{
3015 	  for (j = hard_regno_nregs[regno][mode] - 1; j >= 0; j--)
3016 	    SET_HARD_REG_BIT (*reg_set, regno + j);
3017 
3018 	  /* Start the next search with the next register.  */
3019 	  if (++raw_regno >= FIRST_PSEUDO_REGISTER)
3020 	    raw_regno = 0;
3021 	  search_ofs = raw_regno;
3022 
3023 	  return gen_rtx_REG (mode, regno);
3024 	}
3025     }
3026 
3027   search_ofs = 0;
3028   return NULL_RTX;
3029 }
3030 
3031 /* Perform the peephole2 optimization pass.  */
3032 
3033 static void
peephole2_optimize(void)3034 peephole2_optimize (void)
3035 {
3036   rtx insn, prev;
3037   regset live;
3038   int i;
3039   basic_block bb;
3040 #ifdef HAVE_conditional_execution
3041   sbitmap blocks;
3042   bool changed;
3043 #endif
3044   bool do_cleanup_cfg = false;
3045   bool do_global_life_update = false;
3046   bool do_rebuild_jump_labels = false;
3047 
3048   /* Initialize the regsets we're going to use.  */
3049   for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3050     peep2_insn_data[i].live_before = ALLOC_REG_SET (&reg_obstack);
3051   live = ALLOC_REG_SET (&reg_obstack);
3052 
3053 #ifdef HAVE_conditional_execution
3054   blocks = sbitmap_alloc (last_basic_block);
3055   sbitmap_zero (blocks);
3056   changed = false;
3057 #else
3058   count_or_remove_death_notes (NULL, 1);
3059 #endif
3060 
3061   FOR_EACH_BB_REVERSE (bb)
3062     {
3063       struct propagate_block_info *pbi;
3064       reg_set_iterator rsi;
3065       unsigned int j;
3066 
3067       /* Indicate that all slots except the last holds invalid data.  */
3068       for (i = 0; i < MAX_INSNS_PER_PEEP2; ++i)
3069 	peep2_insn_data[i].insn = NULL_RTX;
3070       peep2_current_count = 0;
3071 
3072       /* Indicate that the last slot contains live_after data.  */
3073       peep2_insn_data[MAX_INSNS_PER_PEEP2].insn = PEEP2_EOB;
3074       peep2_current = MAX_INSNS_PER_PEEP2;
3075 
3076       /* Start up propagation.  */
3077       COPY_REG_SET (live, bb->il.rtl->global_live_at_end);
3078       COPY_REG_SET (peep2_insn_data[MAX_INSNS_PER_PEEP2].live_before, live);
3079 
3080 #ifdef HAVE_conditional_execution
3081       pbi = init_propagate_block_info (bb, live, NULL, NULL, 0);
3082 #else
3083       pbi = init_propagate_block_info (bb, live, NULL, NULL, PROP_DEATH_NOTES);
3084 #endif
3085 
3086       for (insn = BB_END (bb); ; insn = prev)
3087 	{
3088 	  prev = PREV_INSN (insn);
3089 	  if (INSN_P (insn))
3090 	    {
3091 	      rtx try, before_try, x;
3092 	      int match_len;
3093 	      rtx note;
3094 	      bool was_call = false;
3095 
3096 	      /* Record this insn.  */
3097 	      if (--peep2_current < 0)
3098 		peep2_current = MAX_INSNS_PER_PEEP2;
3099 	      if (peep2_current_count < MAX_INSNS_PER_PEEP2
3100 		  && peep2_insn_data[peep2_current].insn == NULL_RTX)
3101 		peep2_current_count++;
3102 	      peep2_insn_data[peep2_current].insn = insn;
3103 	      propagate_one_insn (pbi, insn);
3104 	      COPY_REG_SET (peep2_insn_data[peep2_current].live_before, live);
3105 
3106 	      if (RTX_FRAME_RELATED_P (insn))
3107 		{
3108 		  /* If an insn has RTX_FRAME_RELATED_P set, peephole
3109 		     substitution would lose the
3110 		     REG_FRAME_RELATED_EXPR that is attached.  */
3111 		  peep2_current_count = 0;
3112 		  try = NULL;
3113 		}
3114 	      else
3115 		/* Match the peephole.  */
3116 		try = peephole2_insns (PATTERN (insn), insn, &match_len);
3117 
3118 	      if (try != NULL)
3119 		{
3120 		  /* If we are splitting a CALL_INSN, look for the CALL_INSN
3121 		     in SEQ and copy our CALL_INSN_FUNCTION_USAGE and other
3122 		     cfg-related call notes.  */
3123 		  for (i = 0; i <= match_len; ++i)
3124 		    {
3125 		      int j;
3126 		      rtx old_insn, new_insn, note;
3127 
3128 		      j = i + peep2_current;
3129 		      if (j >= MAX_INSNS_PER_PEEP2 + 1)
3130 			j -= MAX_INSNS_PER_PEEP2 + 1;
3131 		      old_insn = peep2_insn_data[j].insn;
3132 		      if (!CALL_P (old_insn))
3133 			continue;
3134 		      was_call = true;
3135 
3136 		      new_insn = try;
3137 		      while (new_insn != NULL_RTX)
3138 			{
3139 			  if (CALL_P (new_insn))
3140 			    break;
3141 			  new_insn = NEXT_INSN (new_insn);
3142 			}
3143 
3144 		      gcc_assert (new_insn != NULL_RTX);
3145 
3146 		      CALL_INSN_FUNCTION_USAGE (new_insn)
3147 			= CALL_INSN_FUNCTION_USAGE (old_insn);
3148 
3149 		      for (note = REG_NOTES (old_insn);
3150 			   note;
3151 			   note = XEXP (note, 1))
3152 			switch (REG_NOTE_KIND (note))
3153 			  {
3154 			  case REG_NORETURN:
3155 			  case REG_SETJMP:
3156 			    REG_NOTES (new_insn)
3157 			      = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
3158 						   XEXP (note, 0),
3159 						   REG_NOTES (new_insn));
3160 			  default:
3161 			    /* Discard all other reg notes.  */
3162 			    break;
3163 			  }
3164 
3165 		      /* Croak if there is another call in the sequence.  */
3166 		      while (++i <= match_len)
3167 			{
3168 			  j = i + peep2_current;
3169 			  if (j >= MAX_INSNS_PER_PEEP2 + 1)
3170 			    j -= MAX_INSNS_PER_PEEP2 + 1;
3171 			  old_insn = peep2_insn_data[j].insn;
3172 			  gcc_assert (!CALL_P (old_insn));
3173 			}
3174 		      break;
3175 		    }
3176 
3177 		  i = match_len + peep2_current;
3178 		  if (i >= MAX_INSNS_PER_PEEP2 + 1)
3179 		    i -= MAX_INSNS_PER_PEEP2 + 1;
3180 
3181 		  note = find_reg_note (peep2_insn_data[i].insn,
3182 					REG_EH_REGION, NULL_RTX);
3183 
3184 		  /* Replace the old sequence with the new.  */
3185 		  try = emit_insn_after_setloc (try, peep2_insn_data[i].insn,
3186 					        INSN_LOCATOR (peep2_insn_data[i].insn));
3187 		  before_try = PREV_INSN (insn);
3188 		  delete_insn_chain (insn, peep2_insn_data[i].insn);
3189 
3190 		  /* Re-insert the EH_REGION notes.  */
3191 		  if (note || (was_call && nonlocal_goto_handler_labels))
3192 		    {
3193 		      edge eh_edge;
3194 		      edge_iterator ei;
3195 
3196 		      FOR_EACH_EDGE (eh_edge, ei, bb->succs)
3197 			if (eh_edge->flags & (EDGE_EH | EDGE_ABNORMAL_CALL))
3198 			  break;
3199 
3200 		      for (x = try ; x != before_try ; x = PREV_INSN (x))
3201 			if (CALL_P (x)
3202 			    || (flag_non_call_exceptions
3203 				&& may_trap_p (PATTERN (x))
3204 				&& !find_reg_note (x, REG_EH_REGION, NULL)))
3205 			  {
3206 			    if (note)
3207 			      REG_NOTES (x)
3208 			        = gen_rtx_EXPR_LIST (REG_EH_REGION,
3209 						     XEXP (note, 0),
3210 						     REG_NOTES (x));
3211 
3212 			    if (x != BB_END (bb) && eh_edge)
3213 			      {
3214 				edge nfte, nehe;
3215 				int flags;
3216 
3217 				nfte = split_block (bb, x);
3218 				flags = (eh_edge->flags
3219 					 & (EDGE_EH | EDGE_ABNORMAL));
3220 				if (CALL_P (x))
3221 				  flags |= EDGE_ABNORMAL_CALL;
3222 				nehe = make_edge (nfte->src, eh_edge->dest,
3223 						  flags);
3224 
3225 				nehe->probability = eh_edge->probability;
3226 				nfte->probability
3227 				  = REG_BR_PROB_BASE - nehe->probability;
3228 
3229 			        do_cleanup_cfg |= purge_dead_edges (nfte->dest);
3230 #ifdef HAVE_conditional_execution
3231 				SET_BIT (blocks, nfte->dest->index);
3232 				changed = true;
3233 #endif
3234 				bb = nfte->src;
3235 				eh_edge = nehe;
3236 			      }
3237 			  }
3238 
3239 		      /* Converting possibly trapping insn to non-trapping is
3240 			 possible.  Zap dummy outgoing edges.  */
3241 		      do_cleanup_cfg |= purge_dead_edges (bb);
3242 		    }
3243 
3244 #ifdef HAVE_conditional_execution
3245 		  /* With conditional execution, we cannot back up the
3246 		     live information so easily, since the conditional
3247 		     death data structures are not so self-contained.
3248 		     So record that we've made a modification to this
3249 		     block and update life information at the end.  */
3250 		  SET_BIT (blocks, bb->index);
3251 		  changed = true;
3252 
3253 		  for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3254 		    peep2_insn_data[i].insn = NULL_RTX;
3255 		  peep2_insn_data[peep2_current].insn = PEEP2_EOB;
3256 		  peep2_current_count = 0;
3257 #else
3258 		  /* Back up lifetime information past the end of the
3259 		     newly created sequence.  */
3260 		  if (++i >= MAX_INSNS_PER_PEEP2 + 1)
3261 		    i = 0;
3262 		  COPY_REG_SET (live, peep2_insn_data[i].live_before);
3263 
3264 		  /* Update life information for the new sequence.  */
3265 		  x = try;
3266 		  do
3267 		    {
3268 		      if (INSN_P (x))
3269 			{
3270 			  if (--i < 0)
3271 			    i = MAX_INSNS_PER_PEEP2;
3272 			  if (peep2_current_count < MAX_INSNS_PER_PEEP2
3273 			      && peep2_insn_data[i].insn == NULL_RTX)
3274 			    peep2_current_count++;
3275 			  peep2_insn_data[i].insn = x;
3276 			  propagate_one_insn (pbi, x);
3277 			  COPY_REG_SET (peep2_insn_data[i].live_before, live);
3278 			}
3279 		      x = PREV_INSN (x);
3280 		    }
3281 		  while (x != prev);
3282 
3283 		  /* ??? Should verify that LIVE now matches what we
3284 		     had before the new sequence.  */
3285 
3286 		  peep2_current = i;
3287 #endif
3288 
3289 		  /* If we generated a jump instruction, it won't have
3290 		     JUMP_LABEL set.  Recompute after we're done.  */
3291 		  for (x = try; x != before_try; x = PREV_INSN (x))
3292 		    if (JUMP_P (x))
3293 		      {
3294 		        do_rebuild_jump_labels = true;
3295 			break;
3296 		      }
3297 		}
3298 	    }
3299 
3300 	  if (insn == BB_HEAD (bb))
3301 	    break;
3302 	}
3303 
3304       /* Some peepholes can decide the don't need one or more of their
3305 	 inputs.  If this happens, local life update is not enough.  */
3306       EXECUTE_IF_AND_COMPL_IN_BITMAP (bb->il.rtl->global_live_at_start, live,
3307 				      0, j, rsi)
3308 	{
3309 	  do_global_life_update = true;
3310 	  break;
3311 	}
3312 
3313       free_propagate_block_info (pbi);
3314     }
3315 
3316   for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3317     FREE_REG_SET (peep2_insn_data[i].live_before);
3318   FREE_REG_SET (live);
3319 
3320   if (do_rebuild_jump_labels)
3321     rebuild_jump_labels (get_insns ());
3322 
3323   /* If we eliminated EH edges, we may be able to merge blocks.  Further,
3324      we've changed global life since exception handlers are no longer
3325      reachable.  */
3326   if (do_cleanup_cfg)
3327     {
3328       cleanup_cfg (0);
3329       do_global_life_update = true;
3330     }
3331   if (do_global_life_update)
3332     update_life_info (0, UPDATE_LIFE_GLOBAL_RM_NOTES, PROP_DEATH_NOTES);
3333 #ifdef HAVE_conditional_execution
3334   else
3335     {
3336       count_or_remove_death_notes (blocks, 1);
3337       update_life_info (blocks, UPDATE_LIFE_LOCAL, PROP_DEATH_NOTES);
3338     }
3339   sbitmap_free (blocks);
3340 #endif
3341 }
3342 #endif /* HAVE_peephole2 */
3343 
3344 /* Common predicates for use with define_bypass.  */
3345 
3346 /* True if the dependency between OUT_INSN and IN_INSN is on the store
3347    data not the address operand(s) of the store.  IN_INSN must be
3348    single_set.  OUT_INSN must be either a single_set or a PARALLEL with
3349    SETs inside.  */
3350 
3351 int
store_data_bypass_p(rtx out_insn,rtx in_insn)3352 store_data_bypass_p (rtx out_insn, rtx in_insn)
3353 {
3354   rtx out_set, in_set;
3355 
3356   in_set = single_set (in_insn);
3357   gcc_assert (in_set);
3358 
3359   if (!MEM_P (SET_DEST (in_set)))
3360     return false;
3361 
3362   out_set = single_set (out_insn);
3363   if (out_set)
3364     {
3365       if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_set)))
3366 	return false;
3367     }
3368   else
3369     {
3370       rtx out_pat;
3371       int i;
3372 
3373       out_pat = PATTERN (out_insn);
3374       gcc_assert (GET_CODE (out_pat) == PARALLEL);
3375 
3376       for (i = 0; i < XVECLEN (out_pat, 0); i++)
3377 	{
3378 	  rtx exp = XVECEXP (out_pat, 0, i);
3379 
3380 	  if (GET_CODE (exp) == CLOBBER)
3381 	    continue;
3382 
3383 	  gcc_assert (GET_CODE (exp) == SET);
3384 
3385 	  if (reg_mentioned_p (SET_DEST (exp), SET_DEST (in_set)))
3386 	    return false;
3387 	}
3388     }
3389 
3390   return true;
3391 }
3392 
3393 /* True if the dependency between OUT_INSN and IN_INSN is in the IF_THEN_ELSE
3394    condition, and not the THEN or ELSE branch.  OUT_INSN may be either a single
3395    or multiple set; IN_INSN should be single_set for truth, but for convenience
3396    of insn categorization may be any JUMP or CALL insn.  */
3397 
3398 int
if_test_bypass_p(rtx out_insn,rtx in_insn)3399 if_test_bypass_p (rtx out_insn, rtx in_insn)
3400 {
3401   rtx out_set, in_set;
3402 
3403   in_set = single_set (in_insn);
3404   if (! in_set)
3405     {
3406       gcc_assert (JUMP_P (in_insn) || CALL_P (in_insn));
3407       return false;
3408     }
3409 
3410   if (GET_CODE (SET_SRC (in_set)) != IF_THEN_ELSE)
3411     return false;
3412   in_set = SET_SRC (in_set);
3413 
3414   out_set = single_set (out_insn);
3415   if (out_set)
3416     {
3417       if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3418 	  || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3419 	return false;
3420     }
3421   else
3422     {
3423       rtx out_pat;
3424       int i;
3425 
3426       out_pat = PATTERN (out_insn);
3427       gcc_assert (GET_CODE (out_pat) == PARALLEL);
3428 
3429       for (i = 0; i < XVECLEN (out_pat, 0); i++)
3430 	{
3431 	  rtx exp = XVECEXP (out_pat, 0, i);
3432 
3433 	  if (GET_CODE (exp) == CLOBBER)
3434 	    continue;
3435 
3436 	  gcc_assert (GET_CODE (exp) == SET);
3437 
3438 	  if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3439 	      || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3440 	    return false;
3441 	}
3442     }
3443 
3444   return true;
3445 }
3446 
3447 static bool
gate_handle_peephole2(void)3448 gate_handle_peephole2 (void)
3449 {
3450   return (optimize > 0 && flag_peephole2);
3451 }
3452 
3453 static unsigned int
rest_of_handle_peephole2(void)3454 rest_of_handle_peephole2 (void)
3455 {
3456 #ifdef HAVE_peephole2
3457   peephole2_optimize ();
3458 #endif
3459   return 0;
3460 }
3461 
3462 struct tree_opt_pass pass_peephole2 =
3463 {
3464   "peephole2",                          /* name */
3465   gate_handle_peephole2,                /* gate */
3466   rest_of_handle_peephole2,             /* execute */
3467   NULL,                                 /* sub */
3468   NULL,                                 /* next */
3469   0,                                    /* static_pass_number */
3470   TV_PEEPHOLE2,                         /* tv_id */
3471   0,                                    /* properties_required */
3472   0,                                    /* properties_provided */
3473   0,                                    /* properties_destroyed */
3474   0,                                    /* todo_flags_start */
3475   TODO_dump_func,                       /* todo_flags_finish */
3476   'z'                                   /* letter */
3477 };
3478 
3479 static unsigned int
rest_of_handle_split_all_insns(void)3480 rest_of_handle_split_all_insns (void)
3481 {
3482   split_all_insns (1);
3483   return 0;
3484 }
3485 
3486 struct tree_opt_pass pass_split_all_insns =
3487 {
3488   "split1",                             /* name */
3489   NULL,                                 /* gate */
3490   rest_of_handle_split_all_insns,       /* execute */
3491   NULL,                                 /* sub */
3492   NULL,                                 /* next */
3493   0,                                    /* static_pass_number */
3494   0,                                    /* tv_id */
3495   0,                                    /* properties_required */
3496   0,                                    /* properties_provided */
3497   0,                                    /* properties_destroyed */
3498   0,                                    /* todo_flags_start */
3499   TODO_dump_func,                       /* todo_flags_finish */
3500   0                                     /* letter */
3501 };
3502 
3503 /* The placement of the splitting that we do for shorten_branches
3504    depends on whether regstack is used by the target or not.  */
3505 static bool
gate_do_final_split(void)3506 gate_do_final_split (void)
3507 {
3508 #if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
3509   return 1;
3510 #else
3511   return 0;
3512 #endif
3513 }
3514 
3515 struct tree_opt_pass pass_split_for_shorten_branches =
3516 {
3517   "split3",                             /* name */
3518   gate_do_final_split,                  /* gate */
3519   split_all_insns_noflow,               /* execute */
3520   NULL,                                 /* sub */
3521   NULL,                                 /* next */
3522   0,                                    /* static_pass_number */
3523   TV_SHORTEN_BRANCH,                    /* tv_id */
3524   0,                                    /* properties_required */
3525   0,                                    /* properties_provided */
3526   0,                                    /* properties_destroyed */
3527   0,                                    /* todo_flags_start */
3528   TODO_dump_func,                       /* todo_flags_finish */
3529   0                                     /* letter */
3530 };
3531 
3532 
3533 static bool
gate_handle_split_before_regstack(void)3534 gate_handle_split_before_regstack (void)
3535 {
3536 #if defined (HAVE_ATTR_length) && defined (STACK_REGS)
3537   /* If flow2 creates new instructions which need splitting
3538      and scheduling after reload is not done, they might not be
3539      split until final which doesn't allow splitting
3540      if HAVE_ATTR_length.  */
3541 # ifdef INSN_SCHEDULING
3542   return (optimize && !flag_schedule_insns_after_reload);
3543 # else
3544   return (optimize);
3545 # endif
3546 #else
3547   return 0;
3548 #endif
3549 }
3550 
3551 struct tree_opt_pass pass_split_before_regstack =
3552 {
3553   "split2",                             /* name */
3554   gate_handle_split_before_regstack,    /* gate */
3555   rest_of_handle_split_all_insns,       /* execute */
3556   NULL,                                 /* sub */
3557   NULL,                                 /* next */
3558   0,                                    /* static_pass_number */
3559   TV_SHORTEN_BRANCH,                    /* tv_id */
3560   0,                                    /* properties_required */
3561   0,                                    /* properties_provided */
3562   0,                                    /* properties_destroyed */
3563   0,                                    /* todo_flags_start */
3564   TODO_dump_func,                       /* todo_flags_finish */
3565   0                                     /* letter */
3566 };
3567