config.host (powerpc-ibm-aix*): Add crtdbase.o to extra_parts.
[gcc.git] / gcc / recog.c
1 /* Subroutines used by or related to instruction recognition.
2 Copyright (C) 1987-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "cfghooks.h"
26 #include "tree.h"
27 #include "rtl.h"
28 #include "df.h"
29 #include "alias.h"
30 #include "rtl-error.h"
31 #include "tm_p.h"
32 #include "insn-config.h"
33 #include "insn-attr.h"
34 #include "recog.h"
35 #include "regs.h"
36 #include "addresses.h"
37 #include "flags.h"
38 #include "expmed.h"
39 #include "dojump.h"
40 #include "explow.h"
41 #include "calls.h"
42 #include "emit-rtl.h"
43 #include "varasm.h"
44 #include "stmt.h"
45 #include "expr.h"
46 #include "cfgrtl.h"
47 #include "cfgbuild.h"
48 #include "cfgcleanup.h"
49 #include "reload.h"
50 #include "target.h"
51 #include "tree-pass.h"
52 #include "insn-codes.h"
53
54 #ifndef STACK_POP_CODE
55 #if 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_insn *, bool);
63 static void validate_replace_src_1 (rtx *, void *);
64 static rtx_insn *split_insn (rtx_insn *);
65
66 struct target_recog default_target_recog;
67 #if SWITCHABLE_TARGET
68 struct target_recog *this_target_recog = &default_target_recog;
69 #endif
70
71 /* Nonzero means allow operands to be volatile.
72 This should be 0 if you are generating rtl, such as if you are calling
73 the functions in optabs.c and expmed.c (most of the time).
74 This should be 1 if all valid insns need to be recognized,
75 such as in reginfo.c and final.c and reload.c.
76
77 init_recog and init_recog_no_volatile are responsible for setting this. */
78
79 int volatile_ok;
80
81 struct recog_data_d recog_data;
82
83 /* Contains a vector of operand_alternative structures, such that
84 operand OP of alternative A is at index A * n_operands + OP.
85 Set up by preprocess_constraints. */
86 const operand_alternative *recog_op_alt;
87
88 /* Used to provide recog_op_alt for asms. */
89 static operand_alternative asm_op_alt[MAX_RECOG_OPERANDS
90 * MAX_RECOG_ALTERNATIVES];
91
92 /* On return from `constrain_operands', indicate which alternative
93 was satisfied. */
94
95 int which_alternative;
96
97 /* Nonzero after end of reload pass.
98 Set to 1 or 0 by toplev.c.
99 Controls the significance of (SUBREG (MEM)). */
100
101 int reload_completed;
102
103 /* Nonzero after thread_prologue_and_epilogue_insns has run. */
104 int epilogue_completed;
105
106 /* Initialize data used by the function `recog'.
107 This must be called once in the compilation of a function
108 before any insn recognition may be done in the function. */
109
110 void
111 init_recog_no_volatile (void)
112 {
113 volatile_ok = 0;
114 }
115
116 void
117 init_recog (void)
118 {
119 volatile_ok = 1;
120 }
121
122 \f
123 /* Return true if labels in asm operands BODY are LABEL_REFs. */
124
125 static bool
126 asm_labels_ok (rtx body)
127 {
128 rtx asmop;
129 int i;
130
131 asmop = extract_asm_operands (body);
132 if (asmop == NULL_RTX)
133 return true;
134
135 for (i = 0; i < ASM_OPERANDS_LABEL_LENGTH (asmop); i++)
136 if (GET_CODE (ASM_OPERANDS_LABEL (asmop, i)) != LABEL_REF)
137 return false;
138
139 return true;
140 }
141
142 /* Check that X is an insn-body for an `asm' with operands
143 and that the operands mentioned in it are legitimate. */
144
145 int
146 check_asm_operands (rtx x)
147 {
148 int noperands;
149 rtx *operands;
150 const char **constraints;
151 int i;
152
153 if (!asm_labels_ok (x))
154 return 0;
155
156 /* Post-reload, be more strict with things. */
157 if (reload_completed)
158 {
159 /* ??? Doh! We've not got the wrapping insn. Cook one up. */
160 rtx_insn *insn = make_insn_raw (x);
161 extract_insn (insn);
162 constrain_operands (1, get_enabled_alternatives (insn));
163 return which_alternative >= 0;
164 }
165
166 noperands = asm_noperands (x);
167 if (noperands < 0)
168 return 0;
169 if (noperands == 0)
170 return 1;
171
172 operands = XALLOCAVEC (rtx, noperands);
173 constraints = XALLOCAVEC (const char *, noperands);
174
175 decode_asm_operands (x, operands, NULL, constraints, NULL, NULL);
176
177 for (i = 0; i < noperands; i++)
178 {
179 const char *c = constraints[i];
180 if (c[0] == '%')
181 c++;
182 if (! asm_operand_ok (operands[i], c, constraints))
183 return 0;
184 }
185
186 return 1;
187 }
188 \f
189 /* Static data for the next two routines. */
190
191 struct change_t
192 {
193 rtx object;
194 int old_code;
195 rtx *loc;
196 rtx old;
197 bool unshare;
198 };
199
200 static change_t *changes;
201 static int changes_allocated;
202
203 static int num_changes = 0;
204
205 /* Validate a proposed change to OBJECT. LOC is the location in the rtl
206 at which NEW_RTX will be placed. If OBJECT is zero, no validation is done,
207 the change is simply made.
208
209 Two types of objects are supported: If OBJECT is a MEM, memory_address_p
210 will be called with the address and mode as parameters. If OBJECT is
211 an INSN, CALL_INSN, or JUMP_INSN, the insn will be re-recognized with
212 the change in place.
213
214 IN_GROUP is nonzero if this is part of a group of changes that must be
215 performed as a group. In that case, the changes will be stored. The
216 function `apply_change_group' will validate and apply the changes.
217
218 If IN_GROUP is zero, this is a single change. Try to recognize the insn
219 or validate the memory reference with the change applied. If the result
220 is not valid for the machine, suppress the change and return zero.
221 Otherwise, perform the change and return 1. */
222
223 static bool
224 validate_change_1 (rtx object, rtx *loc, rtx new_rtx, bool in_group, bool unshare)
225 {
226 rtx old = *loc;
227
228 if (old == new_rtx || rtx_equal_p (old, new_rtx))
229 return 1;
230
231 gcc_assert (in_group != 0 || num_changes == 0);
232
233 *loc = new_rtx;
234
235 /* Save the information describing this change. */
236 if (num_changes >= changes_allocated)
237 {
238 if (changes_allocated == 0)
239 /* This value allows for repeated substitutions inside complex
240 indexed addresses, or changes in up to 5 insns. */
241 changes_allocated = MAX_RECOG_OPERANDS * 5;
242 else
243 changes_allocated *= 2;
244
245 changes = XRESIZEVEC (change_t, changes, changes_allocated);
246 }
247
248 changes[num_changes].object = object;
249 changes[num_changes].loc = loc;
250 changes[num_changes].old = old;
251 changes[num_changes].unshare = unshare;
252
253 if (object && !MEM_P (object))
254 {
255 /* Set INSN_CODE to force rerecognition of insn. Save old code in
256 case invalid. */
257 changes[num_changes].old_code = INSN_CODE (object);
258 INSN_CODE (object) = -1;
259 }
260
261 num_changes++;
262
263 /* If we are making a group of changes, return 1. Otherwise, validate the
264 change group we made. */
265
266 if (in_group)
267 return 1;
268 else
269 return apply_change_group ();
270 }
271
272 /* Wrapper for validate_change_1 without the UNSHARE argument defaulting
273 UNSHARE to false. */
274
275 bool
276 validate_change (rtx object, rtx *loc, rtx new_rtx, bool in_group)
277 {
278 return validate_change_1 (object, loc, new_rtx, in_group, false);
279 }
280
281 /* Wrapper for validate_change_1 without the UNSHARE argument defaulting
282 UNSHARE to true. */
283
284 bool
285 validate_unshare_change (rtx object, rtx *loc, rtx new_rtx, bool in_group)
286 {
287 return validate_change_1 (object, loc, new_rtx, in_group, true);
288 }
289
290
291 /* Keep X canonicalized if some changes have made it non-canonical; only
292 modifies the operands of X, not (for example) its code. Simplifications
293 are not the job of this routine.
294
295 Return true if anything was changed. */
296 bool
297 canonicalize_change_group (rtx_insn *insn, rtx x)
298 {
299 if (COMMUTATIVE_P (x)
300 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
301 {
302 /* Oops, the caller has made X no longer canonical.
303 Let's redo the changes in the correct order. */
304 rtx tem = XEXP (x, 0);
305 validate_unshare_change (insn, &XEXP (x, 0), XEXP (x, 1), 1);
306 validate_unshare_change (insn, &XEXP (x, 1), tem, 1);
307 return true;
308 }
309 else
310 return false;
311 }
312
313
314 /* This subroutine of apply_change_group verifies whether the changes to INSN
315 were valid; i.e. whether INSN can still be recognized.
316
317 If IN_GROUP is true clobbers which have to be added in order to
318 match the instructions will be added to the current change group.
319 Otherwise the changes will take effect immediately. */
320
321 int
322 insn_invalid_p (rtx_insn *insn, bool in_group)
323 {
324 rtx pat = PATTERN (insn);
325 int num_clobbers = 0;
326 /* If we are before reload and the pattern is a SET, see if we can add
327 clobbers. */
328 int icode = recog (pat, insn,
329 (GET_CODE (pat) == SET
330 && ! reload_completed
331 && ! reload_in_progress)
332 ? &num_clobbers : 0);
333 int is_asm = icode < 0 && asm_noperands (PATTERN (insn)) >= 0;
334
335
336 /* If this is an asm and the operand aren't legal, then fail. Likewise if
337 this is not an asm and the insn wasn't recognized. */
338 if ((is_asm && ! check_asm_operands (PATTERN (insn)))
339 || (!is_asm && icode < 0))
340 return 1;
341
342 /* If we have to add CLOBBERs, fail if we have to add ones that reference
343 hard registers since our callers can't know if they are live or not.
344 Otherwise, add them. */
345 if (num_clobbers > 0)
346 {
347 rtx newpat;
348
349 if (added_clobbers_hard_reg_p (icode))
350 return 1;
351
352 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num_clobbers + 1));
353 XVECEXP (newpat, 0, 0) = pat;
354 add_clobbers (newpat, icode);
355 if (in_group)
356 validate_change (insn, &PATTERN (insn), newpat, 1);
357 else
358 PATTERN (insn) = pat = newpat;
359 }
360
361 /* After reload, verify that all constraints are satisfied. */
362 if (reload_completed)
363 {
364 extract_insn (insn);
365
366 if (! constrain_operands (1, get_preferred_alternatives (insn)))
367 return 1;
368 }
369
370 INSN_CODE (insn) = icode;
371 return 0;
372 }
373
374 /* Return number of changes made and not validated yet. */
375 int
376 num_changes_pending (void)
377 {
378 return num_changes;
379 }
380
381 /* Tentatively apply the changes numbered NUM and up.
382 Return 1 if all changes are valid, zero otherwise. */
383
384 int
385 verify_changes (int num)
386 {
387 int i;
388 rtx last_validated = NULL_RTX;
389
390 /* The changes have been applied and all INSN_CODEs have been reset to force
391 rerecognition.
392
393 The changes are valid if we aren't given an object, or if we are
394 given a MEM and it still is a valid address, or if this is in insn
395 and it is recognized. In the latter case, if reload has completed,
396 we also require that the operands meet the constraints for
397 the insn. */
398
399 for (i = num; i < num_changes; i++)
400 {
401 rtx object = changes[i].object;
402
403 /* If there is no object to test or if it is the same as the one we
404 already tested, ignore it. */
405 if (object == 0 || object == last_validated)
406 continue;
407
408 if (MEM_P (object))
409 {
410 if (! memory_address_addr_space_p (GET_MODE (object),
411 XEXP (object, 0),
412 MEM_ADDR_SPACE (object)))
413 break;
414 }
415 else if (/* changes[i].old might be zero, e.g. when putting a
416 REG_FRAME_RELATED_EXPR into a previously empty list. */
417 changes[i].old
418 && REG_P (changes[i].old)
419 && asm_noperands (PATTERN (object)) > 0
420 && REG_EXPR (changes[i].old) != NULL_TREE
421 && DECL_ASSEMBLER_NAME_SET_P (REG_EXPR (changes[i].old))
422 && DECL_REGISTER (REG_EXPR (changes[i].old)))
423 {
424 /* Don't allow changes of hard register operands to inline
425 assemblies if they have been defined as register asm ("x"). */
426 break;
427 }
428 else if (DEBUG_INSN_P (object))
429 continue;
430 else if (insn_invalid_p (as_a <rtx_insn *> (object), true))
431 {
432 rtx pat = PATTERN (object);
433
434 /* Perhaps we couldn't recognize the insn because there were
435 extra CLOBBERs at the end. If so, try to re-recognize
436 without the last CLOBBER (later iterations will cause each of
437 them to be eliminated, in turn). But don't do this if we
438 have an ASM_OPERAND. */
439 if (GET_CODE (pat) == PARALLEL
440 && GET_CODE (XVECEXP (pat, 0, XVECLEN (pat, 0) - 1)) == CLOBBER
441 && asm_noperands (PATTERN (object)) < 0)
442 {
443 rtx newpat;
444
445 if (XVECLEN (pat, 0) == 2)
446 newpat = XVECEXP (pat, 0, 0);
447 else
448 {
449 int j;
450
451 newpat
452 = gen_rtx_PARALLEL (VOIDmode,
453 rtvec_alloc (XVECLEN (pat, 0) - 1));
454 for (j = 0; j < XVECLEN (newpat, 0); j++)
455 XVECEXP (newpat, 0, j) = XVECEXP (pat, 0, j);
456 }
457
458 /* Add a new change to this group to replace the pattern
459 with this new pattern. Then consider this change
460 as having succeeded. The change we added will
461 cause the entire call to fail if things remain invalid.
462
463 Note that this can lose if a later change than the one
464 we are processing specified &XVECEXP (PATTERN (object), 0, X)
465 but this shouldn't occur. */
466
467 validate_change (object, &PATTERN (object), newpat, 1);
468 continue;
469 }
470 else if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER
471 || GET_CODE (pat) == VAR_LOCATION)
472 /* If this insn is a CLOBBER or USE, it is always valid, but is
473 never recognized. */
474 continue;
475 else
476 break;
477 }
478 last_validated = object;
479 }
480
481 return (i == num_changes);
482 }
483
484 /* A group of changes has previously been issued with validate_change
485 and verified with verify_changes. Call df_insn_rescan for each of
486 the insn changed and clear num_changes. */
487
488 void
489 confirm_change_group (void)
490 {
491 int i;
492 rtx last_object = NULL;
493
494 for (i = 0; i < num_changes; i++)
495 {
496 rtx object = changes[i].object;
497
498 if (changes[i].unshare)
499 *changes[i].loc = copy_rtx (*changes[i].loc);
500
501 /* Avoid unnecessary rescanning when multiple changes to same instruction
502 are made. */
503 if (object)
504 {
505 if (object != last_object && last_object && INSN_P (last_object))
506 df_insn_rescan (as_a <rtx_insn *> (last_object));
507 last_object = object;
508 }
509 }
510
511 if (last_object && INSN_P (last_object))
512 df_insn_rescan (as_a <rtx_insn *> (last_object));
513 num_changes = 0;
514 }
515
516 /* Apply a group of changes previously issued with `validate_change'.
517 If all changes are valid, call confirm_change_group and return 1,
518 otherwise, call cancel_changes and return 0. */
519
520 int
521 apply_change_group (void)
522 {
523 if (verify_changes (0))
524 {
525 confirm_change_group ();
526 return 1;
527 }
528 else
529 {
530 cancel_changes (0);
531 return 0;
532 }
533 }
534
535
536 /* Return the number of changes so far in the current group. */
537
538 int
539 num_validated_changes (void)
540 {
541 return num_changes;
542 }
543
544 /* Retract the changes numbered NUM and up. */
545
546 void
547 cancel_changes (int num)
548 {
549 int i;
550
551 /* Back out all the changes. Do this in the opposite order in which
552 they were made. */
553 for (i = num_changes - 1; i >= num; i--)
554 {
555 *changes[i].loc = changes[i].old;
556 if (changes[i].object && !MEM_P (changes[i].object))
557 INSN_CODE (changes[i].object) = changes[i].old_code;
558 }
559 num_changes = num;
560 }
561
562 /* Reduce conditional compilation elsewhere. */
563 /* A subroutine of validate_replace_rtx_1 that tries to simplify the resulting
564 rtx. */
565
566 static void
567 simplify_while_replacing (rtx *loc, rtx to, rtx_insn *object,
568 machine_mode op0_mode)
569 {
570 rtx x = *loc;
571 enum rtx_code code = GET_CODE (x);
572 rtx new_rtx = NULL_RTX;
573
574 if (SWAPPABLE_OPERANDS_P (x)
575 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
576 {
577 validate_unshare_change (object, loc,
578 gen_rtx_fmt_ee (COMMUTATIVE_ARITH_P (x) ? code
579 : swap_condition (code),
580 GET_MODE (x), XEXP (x, 1),
581 XEXP (x, 0)), 1);
582 x = *loc;
583 code = GET_CODE (x);
584 }
585
586 /* Canonicalize arithmetics with all constant operands. */
587 switch (GET_RTX_CLASS (code))
588 {
589 case RTX_UNARY:
590 if (CONSTANT_P (XEXP (x, 0)))
591 new_rtx = simplify_unary_operation (code, GET_MODE (x), XEXP (x, 0),
592 op0_mode);
593 break;
594 case RTX_COMM_ARITH:
595 case RTX_BIN_ARITH:
596 if (CONSTANT_P (XEXP (x, 0)) && CONSTANT_P (XEXP (x, 1)))
597 new_rtx = simplify_binary_operation (code, GET_MODE (x), XEXP (x, 0),
598 XEXP (x, 1));
599 break;
600 case RTX_COMPARE:
601 case RTX_COMM_COMPARE:
602 if (CONSTANT_P (XEXP (x, 0)) && CONSTANT_P (XEXP (x, 1)))
603 new_rtx = simplify_relational_operation (code, GET_MODE (x), op0_mode,
604 XEXP (x, 0), XEXP (x, 1));
605 break;
606 default:
607 break;
608 }
609 if (new_rtx)
610 {
611 validate_change (object, loc, new_rtx, 1);
612 return;
613 }
614
615 switch (code)
616 {
617 case PLUS:
618 /* If we have a PLUS whose second operand is now a CONST_INT, use
619 simplify_gen_binary to try to simplify it.
620 ??? We may want later to remove this, once simplification is
621 separated from this function. */
622 if (CONST_INT_P (XEXP (x, 1)) && XEXP (x, 1) == to)
623 validate_change (object, loc,
624 simplify_gen_binary
625 (PLUS, GET_MODE (x), XEXP (x, 0), XEXP (x, 1)), 1);
626 break;
627 case MINUS:
628 if (CONST_SCALAR_INT_P (XEXP (x, 1)))
629 validate_change (object, loc,
630 simplify_gen_binary
631 (PLUS, GET_MODE (x), XEXP (x, 0),
632 simplify_gen_unary (NEG,
633 GET_MODE (x), XEXP (x, 1),
634 GET_MODE (x))), 1);
635 break;
636 case ZERO_EXTEND:
637 case SIGN_EXTEND:
638 if (GET_MODE (XEXP (x, 0)) == VOIDmode)
639 {
640 new_rtx = simplify_gen_unary (code, GET_MODE (x), XEXP (x, 0),
641 op0_mode);
642 /* If any of the above failed, substitute in something that
643 we know won't be recognized. */
644 if (!new_rtx)
645 new_rtx = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
646 validate_change (object, loc, new_rtx, 1);
647 }
648 break;
649 case SUBREG:
650 /* All subregs possible to simplify should be simplified. */
651 new_rtx = simplify_subreg (GET_MODE (x), SUBREG_REG (x), op0_mode,
652 SUBREG_BYTE (x));
653
654 /* Subregs of VOIDmode operands are incorrect. */
655 if (!new_rtx && GET_MODE (SUBREG_REG (x)) == VOIDmode)
656 new_rtx = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
657 if (new_rtx)
658 validate_change (object, loc, new_rtx, 1);
659 break;
660 case ZERO_EXTRACT:
661 case SIGN_EXTRACT:
662 /* If we are replacing a register with memory, try to change the memory
663 to be the mode required for memory in extract operations (this isn't
664 likely to be an insertion operation; if it was, nothing bad will
665 happen, we might just fail in some cases). */
666
667 if (MEM_P (XEXP (x, 0))
668 && CONST_INT_P (XEXP (x, 1))
669 && CONST_INT_P (XEXP (x, 2))
670 && !mode_dependent_address_p (XEXP (XEXP (x, 0), 0),
671 MEM_ADDR_SPACE (XEXP (x, 0)))
672 && !MEM_VOLATILE_P (XEXP (x, 0)))
673 {
674 machine_mode wanted_mode = VOIDmode;
675 machine_mode is_mode = GET_MODE (XEXP (x, 0));
676 int pos = INTVAL (XEXP (x, 2));
677
678 if (GET_CODE (x) == ZERO_EXTRACT && targetm.have_extzv ())
679 {
680 wanted_mode = insn_data[targetm.code_for_extzv].operand[1].mode;
681 if (wanted_mode == VOIDmode)
682 wanted_mode = word_mode;
683 }
684 else if (GET_CODE (x) == SIGN_EXTRACT && targetm.have_extv ())
685 {
686 wanted_mode = insn_data[targetm.code_for_extv].operand[1].mode;
687 if (wanted_mode == VOIDmode)
688 wanted_mode = word_mode;
689 }
690
691 /* If we have a narrower mode, we can do something. */
692 if (wanted_mode != VOIDmode
693 && GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
694 {
695 int offset = pos / BITS_PER_UNIT;
696 rtx newmem;
697
698 /* If the bytes and bits are counted differently, we
699 must adjust the offset. */
700 if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN)
701 offset =
702 (GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (wanted_mode) -
703 offset);
704
705 gcc_assert (GET_MODE_PRECISION (wanted_mode)
706 == GET_MODE_BITSIZE (wanted_mode));
707 pos %= GET_MODE_BITSIZE (wanted_mode);
708
709 newmem = adjust_address_nv (XEXP (x, 0), wanted_mode, offset);
710
711 validate_change (object, &XEXP (x, 2), GEN_INT (pos), 1);
712 validate_change (object, &XEXP (x, 0), newmem, 1);
713 }
714 }
715
716 break;
717
718 default:
719 break;
720 }
721 }
722
723 /* Replace every occurrence of FROM in X with TO. Mark each change with
724 validate_change passing OBJECT. */
725
726 static void
727 validate_replace_rtx_1 (rtx *loc, rtx from, rtx to, rtx_insn *object,
728 bool simplify)
729 {
730 int i, j;
731 const char *fmt;
732 rtx x = *loc;
733 enum rtx_code code;
734 machine_mode op0_mode = VOIDmode;
735 int prev_changes = num_changes;
736
737 if (!x)
738 return;
739
740 code = GET_CODE (x);
741 fmt = GET_RTX_FORMAT (code);
742 if (fmt[0] == 'e')
743 op0_mode = GET_MODE (XEXP (x, 0));
744
745 /* X matches FROM if it is the same rtx or they are both referring to the
746 same register in the same mode. Avoid calling rtx_equal_p unless the
747 operands look similar. */
748
749 if (x == from
750 || (REG_P (x) && REG_P (from)
751 && GET_MODE (x) == GET_MODE (from)
752 && REGNO (x) == REGNO (from))
753 || (GET_CODE (x) == GET_CODE (from) && GET_MODE (x) == GET_MODE (from)
754 && rtx_equal_p (x, from)))
755 {
756 validate_unshare_change (object, loc, to, 1);
757 return;
758 }
759
760 /* Call ourself recursively to perform the replacements.
761 We must not replace inside already replaced expression, otherwise we
762 get infinite recursion for replacements like (reg X)->(subreg (reg X))
763 so we must special case shared ASM_OPERANDS. */
764
765 if (GET_CODE (x) == PARALLEL)
766 {
767 for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
768 {
769 if (j && GET_CODE (XVECEXP (x, 0, j)) == SET
770 && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == ASM_OPERANDS)
771 {
772 /* Verify that operands are really shared. */
773 gcc_assert (ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP (x, 0, 0)))
774 == ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP
775 (x, 0, j))));
776 validate_replace_rtx_1 (&SET_DEST (XVECEXP (x, 0, j)),
777 from, to, object, simplify);
778 }
779 else
780 validate_replace_rtx_1 (&XVECEXP (x, 0, j), from, to, object,
781 simplify);
782 }
783 }
784 else
785 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
786 {
787 if (fmt[i] == 'e')
788 validate_replace_rtx_1 (&XEXP (x, i), from, to, object, simplify);
789 else if (fmt[i] == 'E')
790 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
791 validate_replace_rtx_1 (&XVECEXP (x, i, j), from, to, object,
792 simplify);
793 }
794
795 /* If we didn't substitute, there is nothing more to do. */
796 if (num_changes == prev_changes)
797 return;
798
799 /* ??? The regmove is no more, so is this aberration still necessary? */
800 /* Allow substituted expression to have different mode. This is used by
801 regmove to change mode of pseudo register. */
802 if (fmt[0] == 'e' && GET_MODE (XEXP (x, 0)) != VOIDmode)
803 op0_mode = GET_MODE (XEXP (x, 0));
804
805 /* Do changes needed to keep rtx consistent. Don't do any other
806 simplifications, as it is not our job. */
807 if (simplify)
808 simplify_while_replacing (loc, to, object, op0_mode);
809 }
810
811 /* Try replacing every occurrence of FROM in subexpression LOC of INSN
812 with TO. After all changes have been made, validate by seeing
813 if INSN is still valid. */
814
815 int
816 validate_replace_rtx_subexp (rtx from, rtx to, rtx_insn *insn, rtx *loc)
817 {
818 validate_replace_rtx_1 (loc, from, to, insn, true);
819 return apply_change_group ();
820 }
821
822 /* Try replacing every occurrence of FROM in INSN with TO. After all
823 changes have been made, validate by seeing if INSN is still valid. */
824
825 int
826 validate_replace_rtx (rtx from, rtx to, rtx_insn *insn)
827 {
828 validate_replace_rtx_1 (&PATTERN (insn), from, to, insn, true);
829 return apply_change_group ();
830 }
831
832 /* Try replacing every occurrence of FROM in WHERE with TO. Assume that WHERE
833 is a part of INSN. After all changes have been made, validate by seeing if
834 INSN is still valid.
835 validate_replace_rtx (from, to, insn) is equivalent to
836 validate_replace_rtx_part (from, to, &PATTERN (insn), insn). */
837
838 int
839 validate_replace_rtx_part (rtx from, rtx to, rtx *where, rtx_insn *insn)
840 {
841 validate_replace_rtx_1 (where, from, to, insn, true);
842 return apply_change_group ();
843 }
844
845 /* Same as above, but do not simplify rtx afterwards. */
846 int
847 validate_replace_rtx_part_nosimplify (rtx from, rtx to, rtx *where,
848 rtx_insn *insn)
849 {
850 validate_replace_rtx_1 (where, from, to, insn, false);
851 return apply_change_group ();
852
853 }
854
855 /* Try replacing every occurrence of FROM in INSN with TO. This also
856 will replace in REG_EQUAL and REG_EQUIV notes. */
857
858 void
859 validate_replace_rtx_group (rtx from, rtx to, rtx_insn *insn)
860 {
861 rtx note;
862 validate_replace_rtx_1 (&PATTERN (insn), from, to, insn, true);
863 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
864 if (REG_NOTE_KIND (note) == REG_EQUAL
865 || REG_NOTE_KIND (note) == REG_EQUIV)
866 validate_replace_rtx_1 (&XEXP (note, 0), from, to, insn, true);
867 }
868
869 /* Function called by note_uses to replace used subexpressions. */
870 struct validate_replace_src_data
871 {
872 rtx from; /* Old RTX */
873 rtx to; /* New RTX */
874 rtx_insn *insn; /* Insn in which substitution is occurring. */
875 };
876
877 static void
878 validate_replace_src_1 (rtx *x, void *data)
879 {
880 struct validate_replace_src_data *d
881 = (struct validate_replace_src_data *) data;
882
883 validate_replace_rtx_1 (x, d->from, d->to, d->insn, true);
884 }
885
886 /* Try replacing every occurrence of FROM in INSN with TO, avoiding
887 SET_DESTs. */
888
889 void
890 validate_replace_src_group (rtx from, rtx to, rtx_insn *insn)
891 {
892 struct validate_replace_src_data d;
893
894 d.from = from;
895 d.to = to;
896 d.insn = insn;
897 note_uses (&PATTERN (insn), validate_replace_src_1, &d);
898 }
899
900 /* Try simplify INSN.
901 Invoke simplify_rtx () on every SET_SRC and SET_DEST inside the INSN's
902 pattern and return true if something was simplified. */
903
904 bool
905 validate_simplify_insn (rtx_insn *insn)
906 {
907 int i;
908 rtx pat = NULL;
909 rtx newpat = NULL;
910
911 pat = PATTERN (insn);
912
913 if (GET_CODE (pat) == SET)
914 {
915 newpat = simplify_rtx (SET_SRC (pat));
916 if (newpat && !rtx_equal_p (SET_SRC (pat), newpat))
917 validate_change (insn, &SET_SRC (pat), newpat, 1);
918 newpat = simplify_rtx (SET_DEST (pat));
919 if (newpat && !rtx_equal_p (SET_DEST (pat), newpat))
920 validate_change (insn, &SET_DEST (pat), newpat, 1);
921 }
922 else if (GET_CODE (pat) == PARALLEL)
923 for (i = 0; i < XVECLEN (pat, 0); i++)
924 {
925 rtx s = XVECEXP (pat, 0, i);
926
927 if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
928 {
929 newpat = simplify_rtx (SET_SRC (s));
930 if (newpat && !rtx_equal_p (SET_SRC (s), newpat))
931 validate_change (insn, &SET_SRC (s), newpat, 1);
932 newpat = simplify_rtx (SET_DEST (s));
933 if (newpat && !rtx_equal_p (SET_DEST (s), newpat))
934 validate_change (insn, &SET_DEST (s), newpat, 1);
935 }
936 }
937 return ((num_changes_pending () > 0) && (apply_change_group () > 0));
938 }
939 \f
940 /* Return 1 if the insn using CC0 set by INSN does not contain
941 any ordered tests applied to the condition codes.
942 EQ and NE tests do not count. */
943
944 int
945 next_insn_tests_no_inequality (rtx_insn *insn)
946 {
947 rtx_insn *next = next_cc0_user (insn);
948
949 /* If there is no next insn, we have to take the conservative choice. */
950 if (next == 0)
951 return 0;
952
953 return (INSN_P (next)
954 && ! inequality_comparisons_p (PATTERN (next)));
955 }
956 \f
957 /* Return 1 if OP is a valid general operand for machine mode MODE.
958 This is either a register reference, a memory reference,
959 or a constant. In the case of a memory reference, the address
960 is checked for general validity for the target machine.
961
962 Register and memory references must have mode MODE in order to be valid,
963 but some constants have no machine mode and are valid for any mode.
964
965 If MODE is VOIDmode, OP is checked for validity for whatever mode
966 it has.
967
968 The main use of this function is as a predicate in match_operand
969 expressions in the machine description. */
970
971 int
972 general_operand (rtx op, machine_mode mode)
973 {
974 enum rtx_code code = GET_CODE (op);
975
976 if (mode == VOIDmode)
977 mode = GET_MODE (op);
978
979 /* Don't accept CONST_INT or anything similar
980 if the caller wants something floating. */
981 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
982 && GET_MODE_CLASS (mode) != MODE_INT
983 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
984 return 0;
985
986 if (CONST_INT_P (op)
987 && mode != VOIDmode
988 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
989 return 0;
990
991 if (CONSTANT_P (op))
992 return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode
993 || mode == VOIDmode)
994 && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
995 && targetm.legitimate_constant_p (mode == VOIDmode
996 ? GET_MODE (op)
997 : mode, op));
998
999 /* Except for certain constants with VOIDmode, already checked for,
1000 OP's mode must match MODE if MODE specifies a mode. */
1001
1002 if (GET_MODE (op) != mode)
1003 return 0;
1004
1005 if (code == SUBREG)
1006 {
1007 rtx sub = SUBREG_REG (op);
1008
1009 #ifdef INSN_SCHEDULING
1010 /* On machines that have insn scheduling, we want all memory
1011 reference to be explicit, so outlaw paradoxical SUBREGs.
1012 However, we must allow them after reload so that they can
1013 get cleaned up by cleanup_subreg_operands. */
1014 if (!reload_completed && MEM_P (sub)
1015 && GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (sub)))
1016 return 0;
1017 #endif
1018 /* Avoid memories with nonzero SUBREG_BYTE, as offsetting the memory
1019 may result in incorrect reference. We should simplify all valid
1020 subregs of MEM anyway. But allow this after reload because we
1021 might be called from cleanup_subreg_operands.
1022
1023 ??? This is a kludge. */
1024 if (!reload_completed && SUBREG_BYTE (op) != 0
1025 && MEM_P (sub))
1026 return 0;
1027
1028 #ifdef CANNOT_CHANGE_MODE_CLASS
1029 if (REG_P (sub)
1030 && REGNO (sub) < FIRST_PSEUDO_REGISTER
1031 && REG_CANNOT_CHANGE_MODE_P (REGNO (sub), GET_MODE (sub), mode)
1032 && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_INT
1033 && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_FLOAT
1034 /* LRA can generate some invalid SUBREGS just for matched
1035 operand reload presentation. LRA needs to treat them as
1036 valid. */
1037 && ! LRA_SUBREG_P (op))
1038 return 0;
1039 #endif
1040
1041 /* FLOAT_MODE subregs can't be paradoxical. Combine will occasionally
1042 create such rtl, and we must reject it. */
1043 if (SCALAR_FLOAT_MODE_P (GET_MODE (op))
1044 /* LRA can use subreg to store a floating point value in an
1045 integer mode. Although the floating point and the
1046 integer modes need the same number of hard registers, the
1047 size of floating point mode can be less than the integer
1048 mode. */
1049 && ! lra_in_progress
1050 && GET_MODE_SIZE (GET_MODE (op)) > GET_MODE_SIZE (GET_MODE (sub)))
1051 return 0;
1052
1053 op = sub;
1054 code = GET_CODE (op);
1055 }
1056
1057 if (code == REG)
1058 return (REGNO (op) >= FIRST_PSEUDO_REGISTER
1059 || in_hard_reg_set_p (operand_reg_set, GET_MODE (op), REGNO (op)));
1060
1061 if (code == MEM)
1062 {
1063 rtx y = XEXP (op, 0);
1064
1065 if (! volatile_ok && MEM_VOLATILE_P (op))
1066 return 0;
1067
1068 /* Use the mem's mode, since it will be reloaded thus. LRA can
1069 generate move insn with invalid addresses which is made valid
1070 and efficiently calculated by LRA through further numerous
1071 transformations. */
1072 if (lra_in_progress
1073 || memory_address_addr_space_p (GET_MODE (op), y, MEM_ADDR_SPACE (op)))
1074 return 1;
1075 }
1076
1077 return 0;
1078 }
1079 \f
1080 /* Return 1 if OP is a valid memory address for a memory reference
1081 of mode MODE.
1082
1083 The main use of this function is as a predicate in match_operand
1084 expressions in the machine description. */
1085
1086 int
1087 address_operand (rtx op, machine_mode mode)
1088 {
1089 return memory_address_p (mode, op);
1090 }
1091
1092 /* Return 1 if OP is a register reference of mode MODE.
1093 If MODE is VOIDmode, accept a register in any mode.
1094
1095 The main use of this function is as a predicate in match_operand
1096 expressions in the machine description. */
1097
1098 int
1099 register_operand (rtx op, machine_mode mode)
1100 {
1101 if (GET_CODE (op) == SUBREG)
1102 {
1103 rtx sub = SUBREG_REG (op);
1104
1105 /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1106 because it is guaranteed to be reloaded into one.
1107 Just make sure the MEM is valid in itself.
1108 (Ideally, (SUBREG (MEM)...) should not exist after reload,
1109 but currently it does result from (SUBREG (REG)...) where the
1110 reg went on the stack.) */
1111 if (!REG_P (sub) && (reload_completed || !MEM_P (sub)))
1112 return 0;
1113 }
1114 else if (!REG_P (op))
1115 return 0;
1116 return general_operand (op, mode);
1117 }
1118
1119 /* Return 1 for a register in Pmode; ignore the tested mode. */
1120
1121 int
1122 pmode_register_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1123 {
1124 return register_operand (op, Pmode);
1125 }
1126
1127 /* Return 1 if OP should match a MATCH_SCRATCH, i.e., if it is a SCRATCH
1128 or a hard register. */
1129
1130 int
1131 scratch_operand (rtx op, machine_mode mode)
1132 {
1133 if (GET_MODE (op) != mode && mode != VOIDmode)
1134 return 0;
1135
1136 return (GET_CODE (op) == SCRATCH
1137 || (REG_P (op)
1138 && (lra_in_progress
1139 || (REGNO (op) < FIRST_PSEUDO_REGISTER
1140 && REGNO_REG_CLASS (REGNO (op)) != NO_REGS))));
1141 }
1142
1143 /* Return 1 if OP is a valid immediate operand for mode MODE.
1144
1145 The main use of this function is as a predicate in match_operand
1146 expressions in the machine description. */
1147
1148 int
1149 immediate_operand (rtx op, machine_mode mode)
1150 {
1151 /* Don't accept CONST_INT or anything similar
1152 if the caller wants something floating. */
1153 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1154 && GET_MODE_CLASS (mode) != MODE_INT
1155 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1156 return 0;
1157
1158 if (CONST_INT_P (op)
1159 && mode != VOIDmode
1160 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1161 return 0;
1162
1163 return (CONSTANT_P (op)
1164 && (GET_MODE (op) == mode || mode == VOIDmode
1165 || GET_MODE (op) == VOIDmode)
1166 && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
1167 && targetm.legitimate_constant_p (mode == VOIDmode
1168 ? GET_MODE (op)
1169 : mode, op));
1170 }
1171
1172 /* Returns 1 if OP is an operand that is a CONST_INT of mode MODE. */
1173
1174 int
1175 const_int_operand (rtx op, machine_mode mode)
1176 {
1177 if (!CONST_INT_P (op))
1178 return 0;
1179
1180 if (mode != VOIDmode
1181 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1182 return 0;
1183
1184 return 1;
1185 }
1186
1187 #if TARGET_SUPPORTS_WIDE_INT
1188 /* Returns 1 if OP is an operand that is a CONST_INT or CONST_WIDE_INT
1189 of mode MODE. */
1190 int
1191 const_scalar_int_operand (rtx op, machine_mode mode)
1192 {
1193 if (!CONST_SCALAR_INT_P (op))
1194 return 0;
1195
1196 if (CONST_INT_P (op))
1197 return const_int_operand (op, mode);
1198
1199 if (mode != VOIDmode)
1200 {
1201 int prec = GET_MODE_PRECISION (mode);
1202 int bitsize = GET_MODE_BITSIZE (mode);
1203
1204 if (CONST_WIDE_INT_NUNITS (op) * HOST_BITS_PER_WIDE_INT > bitsize)
1205 return 0;
1206
1207 if (prec == bitsize)
1208 return 1;
1209 else
1210 {
1211 /* Multiword partial int. */
1212 HOST_WIDE_INT x
1213 = CONST_WIDE_INT_ELT (op, CONST_WIDE_INT_NUNITS (op) - 1);
1214 return (sext_hwi (x, prec & (HOST_BITS_PER_WIDE_INT - 1)) == x);
1215 }
1216 }
1217 return 1;
1218 }
1219
1220 /* Returns 1 if OP is an operand that is a constant integer or constant
1221 floating-point number of MODE. */
1222
1223 int
1224 const_double_operand (rtx op, machine_mode mode)
1225 {
1226 return (GET_CODE (op) == CONST_DOUBLE)
1227 && (GET_MODE (op) == mode || mode == VOIDmode);
1228 }
1229 #else
1230 /* Returns 1 if OP is an operand that is a constant integer or constant
1231 floating-point number of MODE. */
1232
1233 int
1234 const_double_operand (rtx op, machine_mode mode)
1235 {
1236 /* Don't accept CONST_INT or anything similar
1237 if the caller wants something floating. */
1238 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1239 && GET_MODE_CLASS (mode) != MODE_INT
1240 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1241 return 0;
1242
1243 return ((CONST_DOUBLE_P (op) || CONST_INT_P (op))
1244 && (mode == VOIDmode || GET_MODE (op) == mode
1245 || GET_MODE (op) == VOIDmode));
1246 }
1247 #endif
1248 /* Return 1 if OP is a general operand that is not an immediate
1249 operand of mode MODE. */
1250
1251 int
1252 nonimmediate_operand (rtx op, machine_mode mode)
1253 {
1254 return (general_operand (op, mode) && ! CONSTANT_P (op));
1255 }
1256
1257 /* Return 1 if OP is a register reference or immediate value of mode MODE. */
1258
1259 int
1260 nonmemory_operand (rtx op, machine_mode mode)
1261 {
1262 if (CONSTANT_P (op))
1263 return immediate_operand (op, mode);
1264 return register_operand (op, mode);
1265 }
1266
1267 /* Return 1 if OP is a valid operand that stands for pushing a
1268 value of mode MODE onto the stack.
1269
1270 The main use of this function is as a predicate in match_operand
1271 expressions in the machine description. */
1272
1273 int
1274 push_operand (rtx op, machine_mode mode)
1275 {
1276 unsigned int rounded_size = GET_MODE_SIZE (mode);
1277
1278 #ifdef PUSH_ROUNDING
1279 rounded_size = PUSH_ROUNDING (rounded_size);
1280 #endif
1281
1282 if (!MEM_P (op))
1283 return 0;
1284
1285 if (mode != VOIDmode && GET_MODE (op) != mode)
1286 return 0;
1287
1288 op = XEXP (op, 0);
1289
1290 if (rounded_size == GET_MODE_SIZE (mode))
1291 {
1292 if (GET_CODE (op) != STACK_PUSH_CODE)
1293 return 0;
1294 }
1295 else
1296 {
1297 if (GET_CODE (op) != PRE_MODIFY
1298 || GET_CODE (XEXP (op, 1)) != PLUS
1299 || XEXP (XEXP (op, 1), 0) != XEXP (op, 0)
1300 || !CONST_INT_P (XEXP (XEXP (op, 1), 1))
1301 || INTVAL (XEXP (XEXP (op, 1), 1))
1302 != ((STACK_GROWS_DOWNWARD ? -1 : 1) * (int) rounded_size))
1303 return 0;
1304 }
1305
1306 return XEXP (op, 0) == stack_pointer_rtx;
1307 }
1308
1309 /* Return 1 if OP is a valid operand that stands for popping a
1310 value of mode MODE off the stack.
1311
1312 The main use of this function is as a predicate in match_operand
1313 expressions in the machine description. */
1314
1315 int
1316 pop_operand (rtx op, machine_mode mode)
1317 {
1318 if (!MEM_P (op))
1319 return 0;
1320
1321 if (mode != VOIDmode && GET_MODE (op) != mode)
1322 return 0;
1323
1324 op = XEXP (op, 0);
1325
1326 if (GET_CODE (op) != STACK_POP_CODE)
1327 return 0;
1328
1329 return XEXP (op, 0) == stack_pointer_rtx;
1330 }
1331
1332 /* Return 1 if ADDR is a valid memory address
1333 for mode MODE in address space AS. */
1334
1335 int
1336 memory_address_addr_space_p (machine_mode mode ATTRIBUTE_UNUSED,
1337 rtx addr, addr_space_t as)
1338 {
1339 #ifdef GO_IF_LEGITIMATE_ADDRESS
1340 gcc_assert (ADDR_SPACE_GENERIC_P (as));
1341 GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
1342 return 0;
1343
1344 win:
1345 return 1;
1346 #else
1347 return targetm.addr_space.legitimate_address_p (mode, addr, 0, as);
1348 #endif
1349 }
1350
1351 /* Return 1 if OP is a valid memory reference with mode MODE,
1352 including a valid address.
1353
1354 The main use of this function is as a predicate in match_operand
1355 expressions in the machine description. */
1356
1357 int
1358 memory_operand (rtx op, machine_mode mode)
1359 {
1360 rtx inner;
1361
1362 if (! reload_completed)
1363 /* Note that no SUBREG is a memory operand before end of reload pass,
1364 because (SUBREG (MEM...)) forces reloading into a register. */
1365 return MEM_P (op) && general_operand (op, mode);
1366
1367 if (mode != VOIDmode && GET_MODE (op) != mode)
1368 return 0;
1369
1370 inner = op;
1371 if (GET_CODE (inner) == SUBREG)
1372 inner = SUBREG_REG (inner);
1373
1374 return (MEM_P (inner) && general_operand (op, mode));
1375 }
1376
1377 /* Return 1 if OP is a valid indirect memory reference with mode MODE;
1378 that is, a memory reference whose address is a general_operand. */
1379
1380 int
1381 indirect_operand (rtx op, machine_mode mode)
1382 {
1383 /* Before reload, a SUBREG isn't in memory (see memory_operand, above). */
1384 if (! reload_completed
1385 && GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))
1386 {
1387 int offset = SUBREG_BYTE (op);
1388 rtx inner = SUBREG_REG (op);
1389
1390 if (mode != VOIDmode && GET_MODE (op) != mode)
1391 return 0;
1392
1393 /* The only way that we can have a general_operand as the resulting
1394 address is if OFFSET is zero and the address already is an operand
1395 or if the address is (plus Y (const_int -OFFSET)) and Y is an
1396 operand. */
1397
1398 return ((offset == 0 && general_operand (XEXP (inner, 0), Pmode))
1399 || (GET_CODE (XEXP (inner, 0)) == PLUS
1400 && CONST_INT_P (XEXP (XEXP (inner, 0), 1))
1401 && INTVAL (XEXP (XEXP (inner, 0), 1)) == -offset
1402 && general_operand (XEXP (XEXP (inner, 0), 0), Pmode)));
1403 }
1404
1405 return (MEM_P (op)
1406 && memory_operand (op, mode)
1407 && general_operand (XEXP (op, 0), Pmode));
1408 }
1409
1410 /* Return 1 if this is an ordered comparison operator (not including
1411 ORDERED and UNORDERED). */
1412
1413 int
1414 ordered_comparison_operator (rtx op, machine_mode mode)
1415 {
1416 if (mode != VOIDmode && GET_MODE (op) != mode)
1417 return false;
1418 switch (GET_CODE (op))
1419 {
1420 case EQ:
1421 case NE:
1422 case LT:
1423 case LTU:
1424 case LE:
1425 case LEU:
1426 case GT:
1427 case GTU:
1428 case GE:
1429 case GEU:
1430 return true;
1431 default:
1432 return false;
1433 }
1434 }
1435
1436 /* Return 1 if this is a comparison operator. This allows the use of
1437 MATCH_OPERATOR to recognize all the branch insns. */
1438
1439 int
1440 comparison_operator (rtx op, machine_mode mode)
1441 {
1442 return ((mode == VOIDmode || GET_MODE (op) == mode)
1443 && COMPARISON_P (op));
1444 }
1445 \f
1446 /* If BODY is an insn body that uses ASM_OPERANDS, return it. */
1447
1448 rtx
1449 extract_asm_operands (rtx body)
1450 {
1451 rtx tmp;
1452 switch (GET_CODE (body))
1453 {
1454 case ASM_OPERANDS:
1455 return body;
1456
1457 case SET:
1458 /* Single output operand: BODY is (set OUTPUT (asm_operands ...)). */
1459 tmp = SET_SRC (body);
1460 if (GET_CODE (tmp) == ASM_OPERANDS)
1461 return tmp;
1462 break;
1463
1464 case PARALLEL:
1465 tmp = XVECEXP (body, 0, 0);
1466 if (GET_CODE (tmp) == ASM_OPERANDS)
1467 return tmp;
1468 if (GET_CODE (tmp) == SET)
1469 {
1470 tmp = SET_SRC (tmp);
1471 if (GET_CODE (tmp) == ASM_OPERANDS)
1472 return tmp;
1473 }
1474 break;
1475
1476 default:
1477 break;
1478 }
1479 return NULL;
1480 }
1481
1482 /* If BODY is an insn body that uses ASM_OPERANDS,
1483 return the number of operands (both input and output) in the insn.
1484 Otherwise return -1. */
1485
1486 int
1487 asm_noperands (const_rtx body)
1488 {
1489 rtx asm_op = extract_asm_operands (CONST_CAST_RTX (body));
1490 int n_sets = 0;
1491
1492 if (asm_op == NULL)
1493 return -1;
1494
1495 if (GET_CODE (body) == SET)
1496 n_sets = 1;
1497 else if (GET_CODE (body) == PARALLEL)
1498 {
1499 int i;
1500 if (GET_CODE (XVECEXP (body, 0, 0)) == SET)
1501 {
1502 /* Multiple output operands, or 1 output plus some clobbers:
1503 body is
1504 [(set OUTPUT (asm_operands ...))... (clobber (reg ...))...]. */
1505 /* Count backwards through CLOBBERs to determine number of SETs. */
1506 for (i = XVECLEN (body, 0); i > 0; i--)
1507 {
1508 if (GET_CODE (XVECEXP (body, 0, i - 1)) == SET)
1509 break;
1510 if (GET_CODE (XVECEXP (body, 0, i - 1)) != CLOBBER)
1511 return -1;
1512 }
1513
1514 /* N_SETS is now number of output operands. */
1515 n_sets = i;
1516
1517 /* Verify that all the SETs we have
1518 came from a single original asm_operands insn
1519 (so that invalid combinations are blocked). */
1520 for (i = 0; i < n_sets; i++)
1521 {
1522 rtx elt = XVECEXP (body, 0, i);
1523 if (GET_CODE (elt) != SET)
1524 return -1;
1525 if (GET_CODE (SET_SRC (elt)) != ASM_OPERANDS)
1526 return -1;
1527 /* If these ASM_OPERANDS rtx's came from different original insns
1528 then they aren't allowed together. */
1529 if (ASM_OPERANDS_INPUT_VEC (SET_SRC (elt))
1530 != ASM_OPERANDS_INPUT_VEC (asm_op))
1531 return -1;
1532 }
1533 }
1534 else
1535 {
1536 /* 0 outputs, but some clobbers:
1537 body is [(asm_operands ...) (clobber (reg ...))...]. */
1538 /* Make sure all the other parallel things really are clobbers. */
1539 for (i = XVECLEN (body, 0) - 1; i > 0; i--)
1540 if (GET_CODE (XVECEXP (body, 0, i)) != CLOBBER)
1541 return -1;
1542 }
1543 }
1544
1545 return (ASM_OPERANDS_INPUT_LENGTH (asm_op)
1546 + ASM_OPERANDS_LABEL_LENGTH (asm_op) + n_sets);
1547 }
1548
1549 /* Assuming BODY is an insn body that uses ASM_OPERANDS,
1550 copy its operands (both input and output) into the vector OPERANDS,
1551 the locations of the operands within the insn into the vector OPERAND_LOCS,
1552 and the constraints for the operands into CONSTRAINTS.
1553 Write the modes of the operands into MODES.
1554 Return the assembler-template.
1555
1556 If MODES, OPERAND_LOCS, CONSTRAINTS or OPERANDS is 0,
1557 we don't store that info. */
1558
1559 const char *
1560 decode_asm_operands (rtx body, rtx *operands, rtx **operand_locs,
1561 const char **constraints, machine_mode *modes,
1562 location_t *loc)
1563 {
1564 int nbase = 0, n, i;
1565 rtx asmop;
1566
1567 switch (GET_CODE (body))
1568 {
1569 case ASM_OPERANDS:
1570 /* Zero output asm: BODY is (asm_operands ...). */
1571 asmop = body;
1572 break;
1573
1574 case SET:
1575 /* Single output asm: BODY is (set OUTPUT (asm_operands ...)). */
1576 asmop = SET_SRC (body);
1577
1578 /* The output is in the SET.
1579 Its constraint is in the ASM_OPERANDS itself. */
1580 if (operands)
1581 operands[0] = SET_DEST (body);
1582 if (operand_locs)
1583 operand_locs[0] = &SET_DEST (body);
1584 if (constraints)
1585 constraints[0] = ASM_OPERANDS_OUTPUT_CONSTRAINT (asmop);
1586 if (modes)
1587 modes[0] = GET_MODE (SET_DEST (body));
1588 nbase = 1;
1589 break;
1590
1591 case PARALLEL:
1592 {
1593 int nparallel = XVECLEN (body, 0); /* Includes CLOBBERs. */
1594
1595 asmop = XVECEXP (body, 0, 0);
1596 if (GET_CODE (asmop) == SET)
1597 {
1598 asmop = SET_SRC (asmop);
1599
1600 /* At least one output, plus some CLOBBERs. The outputs are in
1601 the SETs. Their constraints are in the ASM_OPERANDS itself. */
1602 for (i = 0; i < nparallel; i++)
1603 {
1604 if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1605 break; /* Past last SET */
1606 if (operands)
1607 operands[i] = SET_DEST (XVECEXP (body, 0, i));
1608 if (operand_locs)
1609 operand_locs[i] = &SET_DEST (XVECEXP (body, 0, i));
1610 if (constraints)
1611 constraints[i] = XSTR (SET_SRC (XVECEXP (body, 0, i)), 1);
1612 if (modes)
1613 modes[i] = GET_MODE (SET_DEST (XVECEXP (body, 0, i)));
1614 }
1615 nbase = i;
1616 }
1617 break;
1618 }
1619
1620 default:
1621 gcc_unreachable ();
1622 }
1623
1624 n = ASM_OPERANDS_INPUT_LENGTH (asmop);
1625 for (i = 0; i < n; i++)
1626 {
1627 if (operand_locs)
1628 operand_locs[nbase + i] = &ASM_OPERANDS_INPUT (asmop, i);
1629 if (operands)
1630 operands[nbase + i] = ASM_OPERANDS_INPUT (asmop, i);
1631 if (constraints)
1632 constraints[nbase + i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1633 if (modes)
1634 modes[nbase + i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1635 }
1636 nbase += n;
1637
1638 n = ASM_OPERANDS_LABEL_LENGTH (asmop);
1639 for (i = 0; i < n; i++)
1640 {
1641 if (operand_locs)
1642 operand_locs[nbase + i] = &ASM_OPERANDS_LABEL (asmop, i);
1643 if (operands)
1644 operands[nbase + i] = ASM_OPERANDS_LABEL (asmop, i);
1645 if (constraints)
1646 constraints[nbase + i] = "";
1647 if (modes)
1648 modes[nbase + i] = Pmode;
1649 }
1650
1651 if (loc)
1652 *loc = ASM_OPERANDS_SOURCE_LOCATION (asmop);
1653
1654 return ASM_OPERANDS_TEMPLATE (asmop);
1655 }
1656
1657 /* Parse inline assembly string STRING and determine which operands are
1658 referenced by % markers. For the first NOPERANDS operands, set USED[I]
1659 to true if operand I is referenced.
1660
1661 This is intended to distinguish barrier-like asms such as:
1662
1663 asm ("" : "=m" (...));
1664
1665 from real references such as:
1666
1667 asm ("sw\t$0, %0" : "=m" (...)); */
1668
1669 void
1670 get_referenced_operands (const char *string, bool *used,
1671 unsigned int noperands)
1672 {
1673 memset (used, 0, sizeof (bool) * noperands);
1674 const char *p = string;
1675 while (*p)
1676 switch (*p)
1677 {
1678 case '%':
1679 p += 1;
1680 /* A letter followed by a digit indicates an operand number. */
1681 if (ISALPHA (p[0]) && ISDIGIT (p[1]))
1682 p += 1;
1683 if (ISDIGIT (*p))
1684 {
1685 char *endptr;
1686 unsigned long opnum = strtoul (p, &endptr, 10);
1687 if (endptr != p && opnum < noperands)
1688 used[opnum] = true;
1689 p = endptr;
1690 }
1691 else
1692 p += 1;
1693 break;
1694
1695 default:
1696 p++;
1697 break;
1698 }
1699 }
1700
1701 /* Check if an asm_operand matches its constraints.
1702 Return > 0 if ok, = 0 if bad, < 0 if inconclusive. */
1703
1704 int
1705 asm_operand_ok (rtx op, const char *constraint, const char **constraints)
1706 {
1707 int result = 0;
1708 bool incdec_ok = false;
1709
1710 /* Use constrain_operands after reload. */
1711 gcc_assert (!reload_completed);
1712
1713 /* Empty constraint string is the same as "X,...,X", i.e. X for as
1714 many alternatives as required to match the other operands. */
1715 if (*constraint == '\0')
1716 result = 1;
1717
1718 while (*constraint)
1719 {
1720 enum constraint_num cn;
1721 char c = *constraint;
1722 int len;
1723 switch (c)
1724 {
1725 case ',':
1726 constraint++;
1727 continue;
1728
1729 case '0': case '1': case '2': case '3': case '4':
1730 case '5': case '6': case '7': case '8': case '9':
1731 /* If caller provided constraints pointer, look up
1732 the matching constraint. Otherwise, our caller should have
1733 given us the proper matching constraint, but we can't
1734 actually fail the check if they didn't. Indicate that
1735 results are inconclusive. */
1736 if (constraints)
1737 {
1738 char *end;
1739 unsigned long match;
1740
1741 match = strtoul (constraint, &end, 10);
1742 if (!result)
1743 result = asm_operand_ok (op, constraints[match], NULL);
1744 constraint = (const char *) end;
1745 }
1746 else
1747 {
1748 do
1749 constraint++;
1750 while (ISDIGIT (*constraint));
1751 if (! result)
1752 result = -1;
1753 }
1754 continue;
1755
1756 /* The rest of the compiler assumes that reloading the address
1757 of a MEM into a register will make it fit an 'o' constraint.
1758 That is, if it sees a MEM operand for an 'o' constraint,
1759 it assumes that (mem (base-reg)) will fit.
1760
1761 That assumption fails on targets that don't have offsettable
1762 addresses at all. We therefore need to treat 'o' asm
1763 constraints as a special case and only accept operands that
1764 are already offsettable, thus proving that at least one
1765 offsettable address exists. */
1766 case 'o': /* offsettable */
1767 if (offsettable_nonstrict_memref_p (op))
1768 result = 1;
1769 break;
1770
1771 case 'g':
1772 if (general_operand (op, VOIDmode))
1773 result = 1;
1774 break;
1775
1776 case '<':
1777 case '>':
1778 /* ??? Before auto-inc-dec, auto inc/dec insns are not supposed
1779 to exist, excepting those that expand_call created. Further,
1780 on some machines which do not have generalized auto inc/dec,
1781 an inc/dec is not a memory_operand.
1782
1783 Match any memory and hope things are resolved after reload. */
1784 incdec_ok = true;
1785 default:
1786 cn = lookup_constraint (constraint);
1787 switch (get_constraint_type (cn))
1788 {
1789 case CT_REGISTER:
1790 if (!result
1791 && reg_class_for_constraint (cn) != NO_REGS
1792 && GET_MODE (op) != BLKmode
1793 && register_operand (op, VOIDmode))
1794 result = 1;
1795 break;
1796
1797 case CT_CONST_INT:
1798 if (!result
1799 && CONST_INT_P (op)
1800 && insn_const_int_ok_for_constraint (INTVAL (op), cn))
1801 result = 1;
1802 break;
1803
1804 case CT_MEMORY:
1805 /* Every memory operand can be reloaded to fit. */
1806 result = result || memory_operand (op, VOIDmode);
1807 break;
1808
1809 case CT_ADDRESS:
1810 /* Every address operand can be reloaded to fit. */
1811 result = result || address_operand (op, VOIDmode);
1812 break;
1813
1814 case CT_FIXED_FORM:
1815 result = result || constraint_satisfied_p (op, cn);
1816 break;
1817 }
1818 break;
1819 }
1820 len = CONSTRAINT_LEN (c, constraint);
1821 do
1822 constraint++;
1823 while (--len && *constraint);
1824 if (len)
1825 return 0;
1826 }
1827
1828 /* For operands without < or > constraints reject side-effects. */
1829 if (AUTO_INC_DEC && !incdec_ok && result && MEM_P (op))
1830 switch (GET_CODE (XEXP (op, 0)))
1831 {
1832 case PRE_INC:
1833 case POST_INC:
1834 case PRE_DEC:
1835 case POST_DEC:
1836 case PRE_MODIFY:
1837 case POST_MODIFY:
1838 return 0;
1839 default:
1840 break;
1841 }
1842
1843 return result;
1844 }
1845 \f
1846 /* Given an rtx *P, if it is a sum containing an integer constant term,
1847 return the location (type rtx *) of the pointer to that constant term.
1848 Otherwise, return a null pointer. */
1849
1850 rtx *
1851 find_constant_term_loc (rtx *p)
1852 {
1853 rtx *tem;
1854 enum rtx_code code = GET_CODE (*p);
1855
1856 /* If *P IS such a constant term, P is its location. */
1857
1858 if (code == CONST_INT || code == SYMBOL_REF || code == LABEL_REF
1859 || code == CONST)
1860 return p;
1861
1862 /* Otherwise, if not a sum, it has no constant term. */
1863
1864 if (GET_CODE (*p) != PLUS)
1865 return 0;
1866
1867 /* If one of the summands is constant, return its location. */
1868
1869 if (XEXP (*p, 0) && CONSTANT_P (XEXP (*p, 0))
1870 && XEXP (*p, 1) && CONSTANT_P (XEXP (*p, 1)))
1871 return p;
1872
1873 /* Otherwise, check each summand for containing a constant term. */
1874
1875 if (XEXP (*p, 0) != 0)
1876 {
1877 tem = find_constant_term_loc (&XEXP (*p, 0));
1878 if (tem != 0)
1879 return tem;
1880 }
1881
1882 if (XEXP (*p, 1) != 0)
1883 {
1884 tem = find_constant_term_loc (&XEXP (*p, 1));
1885 if (tem != 0)
1886 return tem;
1887 }
1888
1889 return 0;
1890 }
1891 \f
1892 /* Return 1 if OP is a memory reference
1893 whose address contains no side effects
1894 and remains valid after the addition
1895 of a positive integer less than the
1896 size of the object being referenced.
1897
1898 We assume that the original address is valid and do not check it.
1899
1900 This uses strict_memory_address_p as a subroutine, so
1901 don't use it before reload. */
1902
1903 int
1904 offsettable_memref_p (rtx op)
1905 {
1906 return ((MEM_P (op))
1907 && offsettable_address_addr_space_p (1, GET_MODE (op), XEXP (op, 0),
1908 MEM_ADDR_SPACE (op)));
1909 }
1910
1911 /* Similar, but don't require a strictly valid mem ref:
1912 consider pseudo-regs valid as index or base regs. */
1913
1914 int
1915 offsettable_nonstrict_memref_p (rtx op)
1916 {
1917 return ((MEM_P (op))
1918 && offsettable_address_addr_space_p (0, GET_MODE (op), XEXP (op, 0),
1919 MEM_ADDR_SPACE (op)));
1920 }
1921
1922 /* Return 1 if Y is a memory address which contains no side effects
1923 and would remain valid for address space AS after the addition of
1924 a positive integer less than the size of that mode.
1925
1926 We assume that the original address is valid and do not check it.
1927 We do check that it is valid for narrower modes.
1928
1929 If STRICTP is nonzero, we require a strictly valid address,
1930 for the sake of use in reload.c. */
1931
1932 int
1933 offsettable_address_addr_space_p (int strictp, machine_mode mode, rtx y,
1934 addr_space_t as)
1935 {
1936 enum rtx_code ycode = GET_CODE (y);
1937 rtx z;
1938 rtx y1 = y;
1939 rtx *y2;
1940 int (*addressp) (machine_mode, rtx, addr_space_t) =
1941 (strictp ? strict_memory_address_addr_space_p
1942 : memory_address_addr_space_p);
1943 unsigned int mode_sz = GET_MODE_SIZE (mode);
1944
1945 if (CONSTANT_ADDRESS_P (y))
1946 return 1;
1947
1948 /* Adjusting an offsettable address involves changing to a narrower mode.
1949 Make sure that's OK. */
1950
1951 if (mode_dependent_address_p (y, as))
1952 return 0;
1953
1954 machine_mode address_mode = GET_MODE (y);
1955 if (address_mode == VOIDmode)
1956 address_mode = targetm.addr_space.address_mode (as);
1957 #ifdef POINTERS_EXTEND_UNSIGNED
1958 machine_mode pointer_mode = targetm.addr_space.pointer_mode (as);
1959 #endif
1960
1961 /* ??? How much offset does an offsettable BLKmode reference need?
1962 Clearly that depends on the situation in which it's being used.
1963 However, the current situation in which we test 0xffffffff is
1964 less than ideal. Caveat user. */
1965 if (mode_sz == 0)
1966 mode_sz = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
1967
1968 /* If the expression contains a constant term,
1969 see if it remains valid when max possible offset is added. */
1970
1971 if ((ycode == PLUS) && (y2 = find_constant_term_loc (&y1)))
1972 {
1973 int good;
1974
1975 y1 = *y2;
1976 *y2 = plus_constant (address_mode, *y2, mode_sz - 1);
1977 /* Use QImode because an odd displacement may be automatically invalid
1978 for any wider mode. But it should be valid for a single byte. */
1979 good = (*addressp) (QImode, y, as);
1980
1981 /* In any case, restore old contents of memory. */
1982 *y2 = y1;
1983 return good;
1984 }
1985
1986 if (GET_RTX_CLASS (ycode) == RTX_AUTOINC)
1987 return 0;
1988
1989 /* The offset added here is chosen as the maximum offset that
1990 any instruction could need to add when operating on something
1991 of the specified mode. We assume that if Y and Y+c are
1992 valid addresses then so is Y+d for all 0<d<c. adjust_address will
1993 go inside a LO_SUM here, so we do so as well. */
1994 if (GET_CODE (y) == LO_SUM
1995 && mode != BLKmode
1996 && mode_sz <= GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT)
1997 z = gen_rtx_LO_SUM (address_mode, XEXP (y, 0),
1998 plus_constant (address_mode, XEXP (y, 1),
1999 mode_sz - 1));
2000 #ifdef POINTERS_EXTEND_UNSIGNED
2001 /* Likewise for a ZERO_EXTEND from pointer_mode. */
2002 else if (POINTERS_EXTEND_UNSIGNED > 0
2003 && GET_CODE (y) == ZERO_EXTEND
2004 && GET_MODE (XEXP (y, 0)) == pointer_mode)
2005 z = gen_rtx_ZERO_EXTEND (address_mode,
2006 plus_constant (pointer_mode, XEXP (y, 0),
2007 mode_sz - 1));
2008 #endif
2009 else
2010 z = plus_constant (address_mode, y, mode_sz - 1);
2011
2012 /* Use QImode because an odd displacement may be automatically invalid
2013 for any wider mode. But it should be valid for a single byte. */
2014 return (*addressp) (QImode, z, as);
2015 }
2016
2017 /* Return 1 if ADDR is an address-expression whose effect depends
2018 on the mode of the memory reference it is used in.
2019
2020 ADDRSPACE is the address space associated with the address.
2021
2022 Autoincrement addressing is a typical example of mode-dependence
2023 because the amount of the increment depends on the mode. */
2024
2025 bool
2026 mode_dependent_address_p (rtx addr, addr_space_t addrspace)
2027 {
2028 /* Auto-increment addressing with anything other than post_modify
2029 or pre_modify always introduces a mode dependency. Catch such
2030 cases now instead of deferring to the target. */
2031 if (GET_CODE (addr) == PRE_INC
2032 || GET_CODE (addr) == POST_INC
2033 || GET_CODE (addr) == PRE_DEC
2034 || GET_CODE (addr) == POST_DEC)
2035 return true;
2036
2037 return targetm.mode_dependent_address_p (addr, addrspace);
2038 }
2039 \f
2040 /* Return true if boolean attribute ATTR is supported. */
2041
2042 static bool
2043 have_bool_attr (bool_attr attr)
2044 {
2045 switch (attr)
2046 {
2047 case BA_ENABLED:
2048 return HAVE_ATTR_enabled;
2049 case BA_PREFERRED_FOR_SIZE:
2050 return HAVE_ATTR_enabled || HAVE_ATTR_preferred_for_size;
2051 case BA_PREFERRED_FOR_SPEED:
2052 return HAVE_ATTR_enabled || HAVE_ATTR_preferred_for_speed;
2053 }
2054 gcc_unreachable ();
2055 }
2056
2057 /* Return the value of ATTR for instruction INSN. */
2058
2059 static bool
2060 get_bool_attr (rtx_insn *insn, bool_attr attr)
2061 {
2062 switch (attr)
2063 {
2064 case BA_ENABLED:
2065 return get_attr_enabled (insn);
2066 case BA_PREFERRED_FOR_SIZE:
2067 return get_attr_enabled (insn) && get_attr_preferred_for_size (insn);
2068 case BA_PREFERRED_FOR_SPEED:
2069 return get_attr_enabled (insn) && get_attr_preferred_for_speed (insn);
2070 }
2071 gcc_unreachable ();
2072 }
2073
2074 /* Like get_bool_attr_mask, but don't use the cache. */
2075
2076 static alternative_mask
2077 get_bool_attr_mask_uncached (rtx_insn *insn, bool_attr attr)
2078 {
2079 /* Temporarily install enough information for get_attr_<foo> to assume
2080 that the insn operands are already cached. As above, the attribute
2081 mustn't depend on the values of operands, so we don't provide their
2082 real values here. */
2083 rtx_insn *old_insn = recog_data.insn;
2084 int old_alternative = which_alternative;
2085
2086 recog_data.insn = insn;
2087 alternative_mask mask = ALL_ALTERNATIVES;
2088 int n_alternatives = insn_data[INSN_CODE (insn)].n_alternatives;
2089 for (int i = 0; i < n_alternatives; i++)
2090 {
2091 which_alternative = i;
2092 if (!get_bool_attr (insn, attr))
2093 mask &= ~ALTERNATIVE_BIT (i);
2094 }
2095
2096 recog_data.insn = old_insn;
2097 which_alternative = old_alternative;
2098 return mask;
2099 }
2100
2101 /* Return the mask of operand alternatives that are allowed for INSN
2102 by boolean attribute ATTR. This mask depends only on INSN and on
2103 the current target; it does not depend on things like the values of
2104 operands. */
2105
2106 static alternative_mask
2107 get_bool_attr_mask (rtx_insn *insn, bool_attr attr)
2108 {
2109 /* Quick exit for asms and for targets that don't use these attributes. */
2110 int code = INSN_CODE (insn);
2111 if (code < 0 || !have_bool_attr (attr))
2112 return ALL_ALTERNATIVES;
2113
2114 /* Calling get_attr_<foo> can be expensive, so cache the mask
2115 for speed. */
2116 if (!this_target_recog->x_bool_attr_masks[code][attr])
2117 this_target_recog->x_bool_attr_masks[code][attr]
2118 = get_bool_attr_mask_uncached (insn, attr);
2119 return this_target_recog->x_bool_attr_masks[code][attr];
2120 }
2121
2122 /* Return the set of alternatives of INSN that are allowed by the current
2123 target. */
2124
2125 alternative_mask
2126 get_enabled_alternatives (rtx_insn *insn)
2127 {
2128 return get_bool_attr_mask (insn, BA_ENABLED);
2129 }
2130
2131 /* Return the set of alternatives of INSN that are allowed by the current
2132 target and are preferred for the current size/speed optimization
2133 choice. */
2134
2135 alternative_mask
2136 get_preferred_alternatives (rtx_insn *insn)
2137 {
2138 if (optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn)))
2139 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SPEED);
2140 else
2141 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SIZE);
2142 }
2143
2144 /* Return the set of alternatives of INSN that are allowed by the current
2145 target and are preferred for the size/speed optimization choice
2146 associated with BB. Passing a separate BB is useful if INSN has not
2147 been emitted yet or if we are considering moving it to a different
2148 block. */
2149
2150 alternative_mask
2151 get_preferred_alternatives (rtx_insn *insn, basic_block bb)
2152 {
2153 if (optimize_bb_for_speed_p (bb))
2154 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SPEED);
2155 else
2156 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SIZE);
2157 }
2158
2159 /* Assert that the cached boolean attributes for INSN are still accurate.
2160 The backend is required to define these attributes in a way that only
2161 depends on the current target (rather than operands, compiler phase,
2162 etc.). */
2163
2164 bool
2165 check_bool_attrs (rtx_insn *insn)
2166 {
2167 int code = INSN_CODE (insn);
2168 if (code >= 0)
2169 for (int i = 0; i <= BA_LAST; ++i)
2170 {
2171 enum bool_attr attr = (enum bool_attr) i;
2172 if (this_target_recog->x_bool_attr_masks[code][attr])
2173 gcc_assert (this_target_recog->x_bool_attr_masks[code][attr]
2174 == get_bool_attr_mask_uncached (insn, attr));
2175 }
2176 return true;
2177 }
2178
2179 /* Like extract_insn, but save insn extracted and don't extract again, when
2180 called again for the same insn expecting that recog_data still contain the
2181 valid information. This is used primary by gen_attr infrastructure that
2182 often does extract insn again and again. */
2183 void
2184 extract_insn_cached (rtx_insn *insn)
2185 {
2186 if (recog_data.insn == insn && INSN_CODE (insn) >= 0)
2187 return;
2188 extract_insn (insn);
2189 recog_data.insn = insn;
2190 }
2191
2192 /* Do uncached extract_insn, constrain_operands and complain about failures.
2193 This should be used when extracting a pre-existing constrained instruction
2194 if the caller wants to know which alternative was chosen. */
2195 void
2196 extract_constrain_insn (rtx_insn *insn)
2197 {
2198 extract_insn (insn);
2199 if (!constrain_operands (reload_completed, get_enabled_alternatives (insn)))
2200 fatal_insn_not_found (insn);
2201 }
2202
2203 /* Do cached extract_insn, constrain_operands and complain about failures.
2204 Used by insn_attrtab. */
2205 void
2206 extract_constrain_insn_cached (rtx_insn *insn)
2207 {
2208 extract_insn_cached (insn);
2209 if (which_alternative == -1
2210 && !constrain_operands (reload_completed,
2211 get_enabled_alternatives (insn)))
2212 fatal_insn_not_found (insn);
2213 }
2214
2215 /* Do cached constrain_operands on INSN and complain about failures. */
2216 int
2217 constrain_operands_cached (rtx_insn *insn, int strict)
2218 {
2219 if (which_alternative == -1)
2220 return constrain_operands (strict, get_enabled_alternatives (insn));
2221 else
2222 return 1;
2223 }
2224 \f
2225 /* Analyze INSN and fill in recog_data. */
2226
2227 void
2228 extract_insn (rtx_insn *insn)
2229 {
2230 int i;
2231 int icode;
2232 int noperands;
2233 rtx body = PATTERN (insn);
2234
2235 recog_data.n_operands = 0;
2236 recog_data.n_alternatives = 0;
2237 recog_data.n_dups = 0;
2238 recog_data.is_asm = false;
2239
2240 switch (GET_CODE (body))
2241 {
2242 case USE:
2243 case CLOBBER:
2244 case ASM_INPUT:
2245 case ADDR_VEC:
2246 case ADDR_DIFF_VEC:
2247 case VAR_LOCATION:
2248 return;
2249
2250 case SET:
2251 if (GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
2252 goto asm_insn;
2253 else
2254 goto normal_insn;
2255 case PARALLEL:
2256 if ((GET_CODE (XVECEXP (body, 0, 0)) == SET
2257 && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
2258 || GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
2259 goto asm_insn;
2260 else
2261 goto normal_insn;
2262 case ASM_OPERANDS:
2263 asm_insn:
2264 recog_data.n_operands = noperands = asm_noperands (body);
2265 if (noperands >= 0)
2266 {
2267 /* This insn is an `asm' with operands. */
2268
2269 /* expand_asm_operands makes sure there aren't too many operands. */
2270 gcc_assert (noperands <= MAX_RECOG_OPERANDS);
2271
2272 /* Now get the operand values and constraints out of the insn. */
2273 decode_asm_operands (body, recog_data.operand,
2274 recog_data.operand_loc,
2275 recog_data.constraints,
2276 recog_data.operand_mode, NULL);
2277 memset (recog_data.is_operator, 0, sizeof recog_data.is_operator);
2278 if (noperands > 0)
2279 {
2280 const char *p = recog_data.constraints[0];
2281 recog_data.n_alternatives = 1;
2282 while (*p)
2283 recog_data.n_alternatives += (*p++ == ',');
2284 }
2285 recog_data.is_asm = true;
2286 break;
2287 }
2288 fatal_insn_not_found (insn);
2289
2290 default:
2291 normal_insn:
2292 /* Ordinary insn: recognize it, get the operands via insn_extract
2293 and get the constraints. */
2294
2295 icode = recog_memoized (insn);
2296 if (icode < 0)
2297 fatal_insn_not_found (insn);
2298
2299 recog_data.n_operands = noperands = insn_data[icode].n_operands;
2300 recog_data.n_alternatives = insn_data[icode].n_alternatives;
2301 recog_data.n_dups = insn_data[icode].n_dups;
2302
2303 insn_extract (insn);
2304
2305 for (i = 0; i < noperands; i++)
2306 {
2307 recog_data.constraints[i] = insn_data[icode].operand[i].constraint;
2308 recog_data.is_operator[i] = insn_data[icode].operand[i].is_operator;
2309 recog_data.operand_mode[i] = insn_data[icode].operand[i].mode;
2310 /* VOIDmode match_operands gets mode from their real operand. */
2311 if (recog_data.operand_mode[i] == VOIDmode)
2312 recog_data.operand_mode[i] = GET_MODE (recog_data.operand[i]);
2313 }
2314 }
2315 for (i = 0; i < noperands; i++)
2316 recog_data.operand_type[i]
2317 = (recog_data.constraints[i][0] == '=' ? OP_OUT
2318 : recog_data.constraints[i][0] == '+' ? OP_INOUT
2319 : OP_IN);
2320
2321 gcc_assert (recog_data.n_alternatives <= MAX_RECOG_ALTERNATIVES);
2322
2323 recog_data.insn = NULL;
2324 which_alternative = -1;
2325 }
2326
2327 /* Fill in OP_ALT_BASE for an instruction that has N_OPERANDS operands,
2328 N_ALTERNATIVES alternatives and constraint strings CONSTRAINTS.
2329 OP_ALT_BASE has N_ALTERNATIVES * N_OPERANDS entries and CONSTRAINTS
2330 has N_OPERANDS entries. */
2331
2332 void
2333 preprocess_constraints (int n_operands, int n_alternatives,
2334 const char **constraints,
2335 operand_alternative *op_alt_base)
2336 {
2337 for (int i = 0; i < n_operands; i++)
2338 {
2339 int j;
2340 struct operand_alternative *op_alt;
2341 const char *p = constraints[i];
2342
2343 op_alt = op_alt_base;
2344
2345 for (j = 0; j < n_alternatives; j++, op_alt += n_operands)
2346 {
2347 op_alt[i].cl = NO_REGS;
2348 op_alt[i].constraint = p;
2349 op_alt[i].matches = -1;
2350 op_alt[i].matched = -1;
2351
2352 if (*p == '\0' || *p == ',')
2353 {
2354 op_alt[i].anything_ok = 1;
2355 continue;
2356 }
2357
2358 for (;;)
2359 {
2360 char c = *p;
2361 if (c == '#')
2362 do
2363 c = *++p;
2364 while (c != ',' && c != '\0');
2365 if (c == ',' || c == '\0')
2366 {
2367 p++;
2368 break;
2369 }
2370
2371 switch (c)
2372 {
2373 case '?':
2374 op_alt[i].reject += 6;
2375 break;
2376 case '!':
2377 op_alt[i].reject += 600;
2378 break;
2379 case '&':
2380 op_alt[i].earlyclobber = 1;
2381 break;
2382
2383 case '0': case '1': case '2': case '3': case '4':
2384 case '5': case '6': case '7': case '8': case '9':
2385 {
2386 char *end;
2387 op_alt[i].matches = strtoul (p, &end, 10);
2388 op_alt[op_alt[i].matches].matched = i;
2389 p = end;
2390 }
2391 continue;
2392
2393 case 'X':
2394 op_alt[i].anything_ok = 1;
2395 break;
2396
2397 case 'g':
2398 op_alt[i].cl =
2399 reg_class_subunion[(int) op_alt[i].cl][(int) GENERAL_REGS];
2400 break;
2401
2402 default:
2403 enum constraint_num cn = lookup_constraint (p);
2404 enum reg_class cl;
2405 switch (get_constraint_type (cn))
2406 {
2407 case CT_REGISTER:
2408 cl = reg_class_for_constraint (cn);
2409 if (cl != NO_REGS)
2410 op_alt[i].cl = reg_class_subunion[op_alt[i].cl][cl];
2411 break;
2412
2413 case CT_CONST_INT:
2414 break;
2415
2416 case CT_MEMORY:
2417 op_alt[i].memory_ok = 1;
2418 break;
2419
2420 case CT_ADDRESS:
2421 op_alt[i].is_address = 1;
2422 op_alt[i].cl
2423 = (reg_class_subunion
2424 [(int) op_alt[i].cl]
2425 [(int) base_reg_class (VOIDmode, ADDR_SPACE_GENERIC,
2426 ADDRESS, SCRATCH)]);
2427 break;
2428
2429 case CT_FIXED_FORM:
2430 break;
2431 }
2432 break;
2433 }
2434 p += CONSTRAINT_LEN (c, p);
2435 }
2436 }
2437 }
2438 }
2439
2440 /* Return an array of operand_alternative instructions for
2441 instruction ICODE. */
2442
2443 const operand_alternative *
2444 preprocess_insn_constraints (unsigned int icode)
2445 {
2446 gcc_checking_assert (IN_RANGE (icode, 0, NUM_INSN_CODES - 1));
2447 if (this_target_recog->x_op_alt[icode])
2448 return this_target_recog->x_op_alt[icode];
2449
2450 int n_operands = insn_data[icode].n_operands;
2451 if (n_operands == 0)
2452 return 0;
2453 /* Always provide at least one alternative so that which_op_alt ()
2454 works correctly. If the instruction has 0 alternatives (i.e. all
2455 constraint strings are empty) then each operand in this alternative
2456 will have anything_ok set. */
2457 int n_alternatives = MAX (insn_data[icode].n_alternatives, 1);
2458 int n_entries = n_operands * n_alternatives;
2459
2460 operand_alternative *op_alt = XCNEWVEC (operand_alternative, n_entries);
2461 const char **constraints = XALLOCAVEC (const char *, n_operands);
2462
2463 for (int i = 0; i < n_operands; ++i)
2464 constraints[i] = insn_data[icode].operand[i].constraint;
2465 preprocess_constraints (n_operands, n_alternatives, constraints, op_alt);
2466
2467 this_target_recog->x_op_alt[icode] = op_alt;
2468 return op_alt;
2469 }
2470
2471 /* After calling extract_insn, you can use this function to extract some
2472 information from the constraint strings into a more usable form.
2473 The collected data is stored in recog_op_alt. */
2474
2475 void
2476 preprocess_constraints (rtx_insn *insn)
2477 {
2478 int icode = INSN_CODE (insn);
2479 if (icode >= 0)
2480 recog_op_alt = preprocess_insn_constraints (icode);
2481 else
2482 {
2483 int n_operands = recog_data.n_operands;
2484 int n_alternatives = recog_data.n_alternatives;
2485 int n_entries = n_operands * n_alternatives;
2486 memset (asm_op_alt, 0, n_entries * sizeof (operand_alternative));
2487 preprocess_constraints (n_operands, n_alternatives,
2488 recog_data.constraints, asm_op_alt);
2489 recog_op_alt = asm_op_alt;
2490 }
2491 }
2492
2493 /* Check the operands of an insn against the insn's operand constraints
2494 and return 1 if they match any of the alternatives in ALTERNATIVES.
2495
2496 The information about the insn's operands, constraints, operand modes
2497 etc. is obtained from the global variables set up by extract_insn.
2498
2499 WHICH_ALTERNATIVE is set to a number which indicates which
2500 alternative of constraints was matched: 0 for the first alternative,
2501 1 for the next, etc.
2502
2503 In addition, when two operands are required to match
2504 and it happens that the output operand is (reg) while the
2505 input operand is --(reg) or ++(reg) (a pre-inc or pre-dec),
2506 make the output operand look like the input.
2507 This is because the output operand is the one the template will print.
2508
2509 This is used in final, just before printing the assembler code and by
2510 the routines that determine an insn's attribute.
2511
2512 If STRICT is a positive nonzero value, it means that we have been
2513 called after reload has been completed. In that case, we must
2514 do all checks strictly. If it is zero, it means that we have been called
2515 before reload has completed. In that case, we first try to see if we can
2516 find an alternative that matches strictly. If not, we try again, this
2517 time assuming that reload will fix up the insn. This provides a "best
2518 guess" for the alternative and is used to compute attributes of insns prior
2519 to reload. A negative value of STRICT is used for this internal call. */
2520
2521 struct funny_match
2522 {
2523 int this_op, other;
2524 };
2525
2526 int
2527 constrain_operands (int strict, alternative_mask alternatives)
2528 {
2529 const char *constraints[MAX_RECOG_OPERANDS];
2530 int matching_operands[MAX_RECOG_OPERANDS];
2531 int earlyclobber[MAX_RECOG_OPERANDS];
2532 int c;
2533
2534 struct funny_match funny_match[MAX_RECOG_OPERANDS];
2535 int funny_match_index;
2536
2537 which_alternative = 0;
2538 if (recog_data.n_operands == 0 || recog_data.n_alternatives == 0)
2539 return 1;
2540
2541 for (c = 0; c < recog_data.n_operands; c++)
2542 {
2543 constraints[c] = recog_data.constraints[c];
2544 matching_operands[c] = -1;
2545 }
2546
2547 do
2548 {
2549 int seen_earlyclobber_at = -1;
2550 int opno;
2551 int lose = 0;
2552 funny_match_index = 0;
2553
2554 if (!TEST_BIT (alternatives, which_alternative))
2555 {
2556 int i;
2557
2558 for (i = 0; i < recog_data.n_operands; i++)
2559 constraints[i] = skip_alternative (constraints[i]);
2560
2561 which_alternative++;
2562 continue;
2563 }
2564
2565 for (opno = 0; opno < recog_data.n_operands; opno++)
2566 {
2567 rtx op = recog_data.operand[opno];
2568 machine_mode mode = GET_MODE (op);
2569 const char *p = constraints[opno];
2570 int offset = 0;
2571 int win = 0;
2572 int val;
2573 int len;
2574
2575 earlyclobber[opno] = 0;
2576
2577 /* A unary operator may be accepted by the predicate, but it
2578 is irrelevant for matching constraints. */
2579 if (UNARY_P (op))
2580 op = XEXP (op, 0);
2581
2582 if (GET_CODE (op) == SUBREG)
2583 {
2584 if (REG_P (SUBREG_REG (op))
2585 && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER)
2586 offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
2587 GET_MODE (SUBREG_REG (op)),
2588 SUBREG_BYTE (op),
2589 GET_MODE (op));
2590 op = SUBREG_REG (op);
2591 }
2592
2593 /* An empty constraint or empty alternative
2594 allows anything which matched the pattern. */
2595 if (*p == 0 || *p == ',')
2596 win = 1;
2597
2598 do
2599 switch (c = *p, len = CONSTRAINT_LEN (c, p), c)
2600 {
2601 case '\0':
2602 len = 0;
2603 break;
2604 case ',':
2605 c = '\0';
2606 break;
2607
2608 case '#':
2609 /* Ignore rest of this alternative as far as
2610 constraint checking is concerned. */
2611 do
2612 p++;
2613 while (*p && *p != ',');
2614 len = 0;
2615 break;
2616
2617 case '&':
2618 earlyclobber[opno] = 1;
2619 if (seen_earlyclobber_at < 0)
2620 seen_earlyclobber_at = opno;
2621 break;
2622
2623 case '0': case '1': case '2': case '3': case '4':
2624 case '5': case '6': case '7': case '8': case '9':
2625 {
2626 /* This operand must be the same as a previous one.
2627 This kind of constraint is used for instructions such
2628 as add when they take only two operands.
2629
2630 Note that the lower-numbered operand is passed first.
2631
2632 If we are not testing strictly, assume that this
2633 constraint will be satisfied. */
2634
2635 char *end;
2636 int match;
2637
2638 match = strtoul (p, &end, 10);
2639 p = end;
2640
2641 if (strict < 0)
2642 val = 1;
2643 else
2644 {
2645 rtx op1 = recog_data.operand[match];
2646 rtx op2 = recog_data.operand[opno];
2647
2648 /* A unary operator may be accepted by the predicate,
2649 but it is irrelevant for matching constraints. */
2650 if (UNARY_P (op1))
2651 op1 = XEXP (op1, 0);
2652 if (UNARY_P (op2))
2653 op2 = XEXP (op2, 0);
2654
2655 val = operands_match_p (op1, op2);
2656 }
2657
2658 matching_operands[opno] = match;
2659 matching_operands[match] = opno;
2660
2661 if (val != 0)
2662 win = 1;
2663
2664 /* If output is *x and input is *--x, arrange later
2665 to change the output to *--x as well, since the
2666 output op is the one that will be printed. */
2667 if (val == 2 && strict > 0)
2668 {
2669 funny_match[funny_match_index].this_op = opno;
2670 funny_match[funny_match_index++].other = match;
2671 }
2672 }
2673 len = 0;
2674 break;
2675
2676 case 'p':
2677 /* p is used for address_operands. When we are called by
2678 gen_reload, no one will have checked that the address is
2679 strictly valid, i.e., that all pseudos requiring hard regs
2680 have gotten them. */
2681 if (strict <= 0
2682 || (strict_memory_address_p (recog_data.operand_mode[opno],
2683 op)))
2684 win = 1;
2685 break;
2686
2687 /* No need to check general_operand again;
2688 it was done in insn-recog.c. Well, except that reload
2689 doesn't check the validity of its replacements, but
2690 that should only matter when there's a bug. */
2691 case 'g':
2692 /* Anything goes unless it is a REG and really has a hard reg
2693 but the hard reg is not in the class GENERAL_REGS. */
2694 if (REG_P (op))
2695 {
2696 if (strict < 0
2697 || GENERAL_REGS == ALL_REGS
2698 || (reload_in_progress
2699 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2700 || reg_fits_class_p (op, GENERAL_REGS, offset, mode))
2701 win = 1;
2702 }
2703 else if (strict < 0 || general_operand (op, mode))
2704 win = 1;
2705 break;
2706
2707 default:
2708 {
2709 enum constraint_num cn = lookup_constraint (p);
2710 enum reg_class cl = reg_class_for_constraint (cn);
2711 if (cl != NO_REGS)
2712 {
2713 if (strict < 0
2714 || (strict == 0
2715 && REG_P (op)
2716 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2717 || (strict == 0 && GET_CODE (op) == SCRATCH)
2718 || (REG_P (op)
2719 && reg_fits_class_p (op, cl, offset, mode)))
2720 win = 1;
2721 }
2722
2723 else if (constraint_satisfied_p (op, cn))
2724 win = 1;
2725
2726 else if (insn_extra_memory_constraint (cn)
2727 /* Every memory operand can be reloaded to fit. */
2728 && ((strict < 0 && MEM_P (op))
2729 /* Before reload, accept what reload can turn
2730 into a mem. */
2731 || (strict < 0 && CONSTANT_P (op))
2732 /* Before reload, accept a pseudo,
2733 since LRA can turn it into a mem. */
2734 || (strict < 0 && targetm.lra_p () && REG_P (op)
2735 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2736 /* During reload, accept a pseudo */
2737 || (reload_in_progress && REG_P (op)
2738 && REGNO (op) >= FIRST_PSEUDO_REGISTER)))
2739 win = 1;
2740 else if (insn_extra_address_constraint (cn)
2741 /* Every address operand can be reloaded to fit. */
2742 && strict < 0)
2743 win = 1;
2744 /* Cater to architectures like IA-64 that define extra memory
2745 constraints without using define_memory_constraint. */
2746 else if (reload_in_progress
2747 && REG_P (op)
2748 && REGNO (op) >= FIRST_PSEUDO_REGISTER
2749 && reg_renumber[REGNO (op)] < 0
2750 && reg_equiv_mem (REGNO (op)) != 0
2751 && constraint_satisfied_p
2752 (reg_equiv_mem (REGNO (op)), cn))
2753 win = 1;
2754 break;
2755 }
2756 }
2757 while (p += len, c);
2758
2759 constraints[opno] = p;
2760 /* If this operand did not win somehow,
2761 this alternative loses. */
2762 if (! win)
2763 lose = 1;
2764 }
2765 /* This alternative won; the operands are ok.
2766 Change whichever operands this alternative says to change. */
2767 if (! lose)
2768 {
2769 int opno, eopno;
2770
2771 /* See if any earlyclobber operand conflicts with some other
2772 operand. */
2773
2774 if (strict > 0 && seen_earlyclobber_at >= 0)
2775 for (eopno = seen_earlyclobber_at;
2776 eopno < recog_data.n_operands;
2777 eopno++)
2778 /* Ignore earlyclobber operands now in memory,
2779 because we would often report failure when we have
2780 two memory operands, one of which was formerly a REG. */
2781 if (earlyclobber[eopno]
2782 && REG_P (recog_data.operand[eopno]))
2783 for (opno = 0; opno < recog_data.n_operands; opno++)
2784 if ((MEM_P (recog_data.operand[opno])
2785 || recog_data.operand_type[opno] != OP_OUT)
2786 && opno != eopno
2787 /* Ignore things like match_operator operands. */
2788 && *recog_data.constraints[opno] != 0
2789 && ! (matching_operands[opno] == eopno
2790 && operands_match_p (recog_data.operand[opno],
2791 recog_data.operand[eopno]))
2792 && ! safe_from_earlyclobber (recog_data.operand[opno],
2793 recog_data.operand[eopno]))
2794 lose = 1;
2795
2796 if (! lose)
2797 {
2798 while (--funny_match_index >= 0)
2799 {
2800 recog_data.operand[funny_match[funny_match_index].other]
2801 = recog_data.operand[funny_match[funny_match_index].this_op];
2802 }
2803
2804 /* For operands without < or > constraints reject side-effects. */
2805 if (AUTO_INC_DEC && recog_data.is_asm)
2806 {
2807 for (opno = 0; opno < recog_data.n_operands; opno++)
2808 if (MEM_P (recog_data.operand[opno]))
2809 switch (GET_CODE (XEXP (recog_data.operand[opno], 0)))
2810 {
2811 case PRE_INC:
2812 case POST_INC:
2813 case PRE_DEC:
2814 case POST_DEC:
2815 case PRE_MODIFY:
2816 case POST_MODIFY:
2817 if (strchr (recog_data.constraints[opno], '<') == NULL
2818 && strchr (recog_data.constraints[opno], '>')
2819 == NULL)
2820 return 0;
2821 break;
2822 default:
2823 break;
2824 }
2825 }
2826
2827 return 1;
2828 }
2829 }
2830
2831 which_alternative++;
2832 }
2833 while (which_alternative < recog_data.n_alternatives);
2834
2835 which_alternative = -1;
2836 /* If we are about to reject this, but we are not to test strictly,
2837 try a very loose test. Only return failure if it fails also. */
2838 if (strict == 0)
2839 return constrain_operands (-1, alternatives);
2840 else
2841 return 0;
2842 }
2843
2844 /* Return true iff OPERAND (assumed to be a REG rtx)
2845 is a hard reg in class CLASS when its regno is offset by OFFSET
2846 and changed to mode MODE.
2847 If REG occupies multiple hard regs, all of them must be in CLASS. */
2848
2849 bool
2850 reg_fits_class_p (const_rtx operand, reg_class_t cl, int offset,
2851 machine_mode mode)
2852 {
2853 unsigned int regno = REGNO (operand);
2854
2855 if (cl == NO_REGS)
2856 return false;
2857
2858 /* Regno must not be a pseudo register. Offset may be negative. */
2859 return (HARD_REGISTER_NUM_P (regno)
2860 && HARD_REGISTER_NUM_P (regno + offset)
2861 && in_hard_reg_set_p (reg_class_contents[(int) cl], mode,
2862 regno + offset));
2863 }
2864 \f
2865 /* Split single instruction. Helper function for split_all_insns and
2866 split_all_insns_noflow. Return last insn in the sequence if successful,
2867 or NULL if unsuccessful. */
2868
2869 static rtx_insn *
2870 split_insn (rtx_insn *insn)
2871 {
2872 /* Split insns here to get max fine-grain parallelism. */
2873 rtx_insn *first = PREV_INSN (insn);
2874 rtx_insn *last = try_split (PATTERN (insn), insn, 1);
2875 rtx insn_set, last_set, note;
2876
2877 if (last == insn)
2878 return NULL;
2879
2880 /* If the original instruction was a single set that was known to be
2881 equivalent to a constant, see if we can say the same about the last
2882 instruction in the split sequence. The two instructions must set
2883 the same destination. */
2884 insn_set = single_set (insn);
2885 if (insn_set)
2886 {
2887 last_set = single_set (last);
2888 if (last_set && rtx_equal_p (SET_DEST (last_set), SET_DEST (insn_set)))
2889 {
2890 note = find_reg_equal_equiv_note (insn);
2891 if (note && CONSTANT_P (XEXP (note, 0)))
2892 set_unique_reg_note (last, REG_EQUAL, XEXP (note, 0));
2893 else if (CONSTANT_P (SET_SRC (insn_set)))
2894 set_unique_reg_note (last, REG_EQUAL,
2895 copy_rtx (SET_SRC (insn_set)));
2896 }
2897 }
2898
2899 /* try_split returns the NOTE that INSN became. */
2900 SET_INSN_DELETED (insn);
2901
2902 /* ??? Coddle to md files that generate subregs in post-reload
2903 splitters instead of computing the proper hard register. */
2904 if (reload_completed && first != last)
2905 {
2906 first = NEXT_INSN (first);
2907 for (;;)
2908 {
2909 if (INSN_P (first))
2910 cleanup_subreg_operands (first);
2911 if (first == last)
2912 break;
2913 first = NEXT_INSN (first);
2914 }
2915 }
2916
2917 return last;
2918 }
2919
2920 /* Split all insns in the function. If UPD_LIFE, update life info after. */
2921
2922 void
2923 split_all_insns (void)
2924 {
2925 sbitmap blocks;
2926 bool changed;
2927 basic_block bb;
2928
2929 blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
2930 bitmap_clear (blocks);
2931 changed = false;
2932
2933 FOR_EACH_BB_REVERSE_FN (bb, cfun)
2934 {
2935 rtx_insn *insn, *next;
2936 bool finish = false;
2937
2938 rtl_profile_for_bb (bb);
2939 for (insn = BB_HEAD (bb); !finish ; insn = next)
2940 {
2941 /* Can't use `next_real_insn' because that might go across
2942 CODE_LABELS and short-out basic blocks. */
2943 next = NEXT_INSN (insn);
2944 finish = (insn == BB_END (bb));
2945 if (INSN_P (insn))
2946 {
2947 rtx set = single_set (insn);
2948
2949 /* Don't split no-op move insns. These should silently
2950 disappear later in final. Splitting such insns would
2951 break the code that handles LIBCALL blocks. */
2952 if (set && set_noop_p (set))
2953 {
2954 /* Nops get in the way while scheduling, so delete them
2955 now if register allocation has already been done. It
2956 is too risky to try to do this before register
2957 allocation, and there are unlikely to be very many
2958 nops then anyways. */
2959 if (reload_completed)
2960 delete_insn_and_edges (insn);
2961 }
2962 else
2963 {
2964 if (split_insn (insn))
2965 {
2966 bitmap_set_bit (blocks, bb->index);
2967 changed = true;
2968 }
2969 }
2970 }
2971 }
2972 }
2973
2974 default_rtl_profile ();
2975 if (changed)
2976 find_many_sub_basic_blocks (blocks);
2977
2978 #ifdef ENABLE_CHECKING
2979 verify_flow_info ();
2980 #endif
2981
2982 sbitmap_free (blocks);
2983 }
2984
2985 /* Same as split_all_insns, but do not expect CFG to be available.
2986 Used by machine dependent reorg passes. */
2987
2988 unsigned int
2989 split_all_insns_noflow (void)
2990 {
2991 rtx_insn *next, *insn;
2992
2993 for (insn = get_insns (); insn; insn = next)
2994 {
2995 next = NEXT_INSN (insn);
2996 if (INSN_P (insn))
2997 {
2998 /* Don't split no-op move insns. These should silently
2999 disappear later in final. Splitting such insns would
3000 break the code that handles LIBCALL blocks. */
3001 rtx set = single_set (insn);
3002 if (set && set_noop_p (set))
3003 {
3004 /* Nops get in the way while scheduling, so delete them
3005 now if register allocation has already been done. It
3006 is too risky to try to do this before register
3007 allocation, and there are unlikely to be very many
3008 nops then anyways.
3009
3010 ??? Should we use delete_insn when the CFG isn't valid? */
3011 if (reload_completed)
3012 delete_insn_and_edges (insn);
3013 }
3014 else
3015 split_insn (insn);
3016 }
3017 }
3018 return 0;
3019 }
3020 \f
3021 struct peep2_insn_data
3022 {
3023 rtx_insn *insn;
3024 regset live_before;
3025 };
3026
3027 static struct peep2_insn_data peep2_insn_data[MAX_INSNS_PER_PEEP2 + 1];
3028 static int peep2_current;
3029
3030 static bool peep2_do_rebuild_jump_labels;
3031 static bool peep2_do_cleanup_cfg;
3032
3033 /* The number of instructions available to match a peep2. */
3034 int peep2_current_count;
3035
3036 /* A marker indicating the last insn of the block. The live_before regset
3037 for this element is correct, indicating DF_LIVE_OUT for the block. */
3038 #define PEEP2_EOB invalid_insn_rtx
3039
3040 /* Wrap N to fit into the peep2_insn_data buffer. */
3041
3042 static int
3043 peep2_buf_position (int n)
3044 {
3045 if (n >= MAX_INSNS_PER_PEEP2 + 1)
3046 n -= MAX_INSNS_PER_PEEP2 + 1;
3047 return n;
3048 }
3049
3050 /* Return the Nth non-note insn after `current', or return NULL_RTX if it
3051 does not exist. Used by the recognizer to find the next insn to match
3052 in a multi-insn pattern. */
3053
3054 rtx_insn *
3055 peep2_next_insn (int n)
3056 {
3057 gcc_assert (n <= peep2_current_count);
3058
3059 n = peep2_buf_position (peep2_current + n);
3060
3061 return peep2_insn_data[n].insn;
3062 }
3063
3064 /* Return true if REGNO is dead before the Nth non-note insn
3065 after `current'. */
3066
3067 int
3068 peep2_regno_dead_p (int ofs, int regno)
3069 {
3070 gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
3071
3072 ofs = peep2_buf_position (peep2_current + ofs);
3073
3074 gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
3075
3076 return ! REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno);
3077 }
3078
3079 /* Similarly for a REG. */
3080
3081 int
3082 peep2_reg_dead_p (int ofs, rtx reg)
3083 {
3084 gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
3085
3086 ofs = peep2_buf_position (peep2_current + ofs);
3087
3088 gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
3089
3090 unsigned int end_regno = END_REGNO (reg);
3091 for (unsigned int regno = REGNO (reg); regno < end_regno; ++regno)
3092 if (REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno))
3093 return 0;
3094 return 1;
3095 }
3096
3097 /* Regno offset to be used in the register search. */
3098 static int search_ofs;
3099
3100 /* Try to find a hard register of mode MODE, matching the register class in
3101 CLASS_STR, which is available at the beginning of insn CURRENT_INSN and
3102 remains available until the end of LAST_INSN. LAST_INSN may be NULL_RTX,
3103 in which case the only condition is that the register must be available
3104 before CURRENT_INSN.
3105 Registers that already have bits set in REG_SET will not be considered.
3106
3107 If an appropriate register is available, it will be returned and the
3108 corresponding bit(s) in REG_SET will be set; otherwise, NULL_RTX is
3109 returned. */
3110
3111 rtx
3112 peep2_find_free_register (int from, int to, const char *class_str,
3113 machine_mode mode, HARD_REG_SET *reg_set)
3114 {
3115 enum reg_class cl;
3116 HARD_REG_SET live;
3117 df_ref def;
3118 int i;
3119
3120 gcc_assert (from < MAX_INSNS_PER_PEEP2 + 1);
3121 gcc_assert (to < MAX_INSNS_PER_PEEP2 + 1);
3122
3123 from = peep2_buf_position (peep2_current + from);
3124 to = peep2_buf_position (peep2_current + to);
3125
3126 gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
3127 REG_SET_TO_HARD_REG_SET (live, peep2_insn_data[from].live_before);
3128
3129 while (from != to)
3130 {
3131 gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
3132
3133 /* Don't use registers set or clobbered by the insn. */
3134 FOR_EACH_INSN_DEF (def, peep2_insn_data[from].insn)
3135 SET_HARD_REG_BIT (live, DF_REF_REGNO (def));
3136
3137 from = peep2_buf_position (from + 1);
3138 }
3139
3140 cl = reg_class_for_constraint (lookup_constraint (class_str));
3141
3142 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3143 {
3144 int raw_regno, regno, success, j;
3145
3146 /* Distribute the free registers as much as possible. */
3147 raw_regno = search_ofs + i;
3148 if (raw_regno >= FIRST_PSEUDO_REGISTER)
3149 raw_regno -= FIRST_PSEUDO_REGISTER;
3150 #ifdef REG_ALLOC_ORDER
3151 regno = reg_alloc_order[raw_regno];
3152 #else
3153 regno = raw_regno;
3154 #endif
3155
3156 /* Can it support the mode we need? */
3157 if (! HARD_REGNO_MODE_OK (regno, mode))
3158 continue;
3159
3160 success = 1;
3161 for (j = 0; success && j < hard_regno_nregs[regno][mode]; j++)
3162 {
3163 /* Don't allocate fixed registers. */
3164 if (fixed_regs[regno + j])
3165 {
3166 success = 0;
3167 break;
3168 }
3169 /* Don't allocate global registers. */
3170 if (global_regs[regno + j])
3171 {
3172 success = 0;
3173 break;
3174 }
3175 /* Make sure the register is of the right class. */
3176 if (! TEST_HARD_REG_BIT (reg_class_contents[cl], regno + j))
3177 {
3178 success = 0;
3179 break;
3180 }
3181 /* And that we don't create an extra save/restore. */
3182 if (! call_used_regs[regno + j] && ! df_regs_ever_live_p (regno + j))
3183 {
3184 success = 0;
3185 break;
3186 }
3187
3188 if (! targetm.hard_regno_scratch_ok (regno + j))
3189 {
3190 success = 0;
3191 break;
3192 }
3193
3194 /* And we don't clobber traceback for noreturn functions. */
3195 if ((regno + j == FRAME_POINTER_REGNUM
3196 || regno + j == HARD_FRAME_POINTER_REGNUM)
3197 && (! reload_completed || frame_pointer_needed))
3198 {
3199 success = 0;
3200 break;
3201 }
3202
3203 if (TEST_HARD_REG_BIT (*reg_set, regno + j)
3204 || TEST_HARD_REG_BIT (live, regno + j))
3205 {
3206 success = 0;
3207 break;
3208 }
3209 }
3210
3211 if (success)
3212 {
3213 add_to_hard_reg_set (reg_set, mode, regno);
3214
3215 /* Start the next search with the next register. */
3216 if (++raw_regno >= FIRST_PSEUDO_REGISTER)
3217 raw_regno = 0;
3218 search_ofs = raw_regno;
3219
3220 return gen_rtx_REG (mode, regno);
3221 }
3222 }
3223
3224 search_ofs = 0;
3225 return NULL_RTX;
3226 }
3227
3228 /* Forget all currently tracked instructions, only remember current
3229 LIVE regset. */
3230
3231 static void
3232 peep2_reinit_state (regset live)
3233 {
3234 int i;
3235
3236 /* Indicate that all slots except the last holds invalid data. */
3237 for (i = 0; i < MAX_INSNS_PER_PEEP2; ++i)
3238 peep2_insn_data[i].insn = NULL;
3239 peep2_current_count = 0;
3240
3241 /* Indicate that the last slot contains live_after data. */
3242 peep2_insn_data[MAX_INSNS_PER_PEEP2].insn = PEEP2_EOB;
3243 peep2_current = MAX_INSNS_PER_PEEP2;
3244
3245 COPY_REG_SET (peep2_insn_data[MAX_INSNS_PER_PEEP2].live_before, live);
3246 }
3247
3248 /* While scanning basic block BB, we found a match of length MATCH_LEN,
3249 starting at INSN. Perform the replacement, removing the old insns and
3250 replacing them with ATTEMPT. Returns the last insn emitted, or NULL
3251 if the replacement is rejected. */
3252
3253 static rtx_insn *
3254 peep2_attempt (basic_block bb, rtx_insn *insn, int match_len, rtx_insn *attempt)
3255 {
3256 int i;
3257 rtx_insn *last, *before_try, *x;
3258 rtx eh_note, as_note;
3259 rtx_insn *old_insn;
3260 rtx_insn *new_insn;
3261 bool was_call = false;
3262
3263 /* If we are splitting an RTX_FRAME_RELATED_P insn, do not allow it to
3264 match more than one insn, or to be split into more than one insn. */
3265 old_insn = peep2_insn_data[peep2_current].insn;
3266 if (RTX_FRAME_RELATED_P (old_insn))
3267 {
3268 bool any_note = false;
3269 rtx note;
3270
3271 if (match_len != 0)
3272 return NULL;
3273
3274 /* Look for one "active" insn. I.e. ignore any "clobber" insns that
3275 may be in the stream for the purpose of register allocation. */
3276 if (active_insn_p (attempt))
3277 new_insn = attempt;
3278 else
3279 new_insn = next_active_insn (attempt);
3280 if (next_active_insn (new_insn))
3281 return NULL;
3282
3283 /* We have a 1-1 replacement. Copy over any frame-related info. */
3284 RTX_FRAME_RELATED_P (new_insn) = 1;
3285
3286 /* Allow the backend to fill in a note during the split. */
3287 for (note = REG_NOTES (new_insn); note ; note = XEXP (note, 1))
3288 switch (REG_NOTE_KIND (note))
3289 {
3290 case REG_FRAME_RELATED_EXPR:
3291 case REG_CFA_DEF_CFA:
3292 case REG_CFA_ADJUST_CFA:
3293 case REG_CFA_OFFSET:
3294 case REG_CFA_REGISTER:
3295 case REG_CFA_EXPRESSION:
3296 case REG_CFA_RESTORE:
3297 case REG_CFA_SET_VDRAP:
3298 any_note = true;
3299 break;
3300 default:
3301 break;
3302 }
3303
3304 /* If the backend didn't supply a note, copy one over. */
3305 if (!any_note)
3306 for (note = REG_NOTES (old_insn); note ; note = XEXP (note, 1))
3307 switch (REG_NOTE_KIND (note))
3308 {
3309 case REG_FRAME_RELATED_EXPR:
3310 case REG_CFA_DEF_CFA:
3311 case REG_CFA_ADJUST_CFA:
3312 case REG_CFA_OFFSET:
3313 case REG_CFA_REGISTER:
3314 case REG_CFA_EXPRESSION:
3315 case REG_CFA_RESTORE:
3316 case REG_CFA_SET_VDRAP:
3317 add_reg_note (new_insn, REG_NOTE_KIND (note), XEXP (note, 0));
3318 any_note = true;
3319 break;
3320 default:
3321 break;
3322 }
3323
3324 /* If there still isn't a note, make sure the unwind info sees the
3325 same expression as before the split. */
3326 if (!any_note)
3327 {
3328 rtx old_set, new_set;
3329
3330 /* The old insn had better have been simple, or annotated. */
3331 old_set = single_set (old_insn);
3332 gcc_assert (old_set != NULL);
3333
3334 new_set = single_set (new_insn);
3335 if (!new_set || !rtx_equal_p (new_set, old_set))
3336 add_reg_note (new_insn, REG_FRAME_RELATED_EXPR, old_set);
3337 }
3338
3339 /* Copy prologue/epilogue status. This is required in order to keep
3340 proper placement of EPILOGUE_BEG and the DW_CFA_remember_state. */
3341 maybe_copy_prologue_epilogue_insn (old_insn, new_insn);
3342 }
3343
3344 /* If we are splitting a CALL_INSN, look for the CALL_INSN
3345 in SEQ and copy our CALL_INSN_FUNCTION_USAGE and other
3346 cfg-related call notes. */
3347 for (i = 0; i <= match_len; ++i)
3348 {
3349 int j;
3350 rtx note;
3351
3352 j = peep2_buf_position (peep2_current + i);
3353 old_insn = peep2_insn_data[j].insn;
3354 if (!CALL_P (old_insn))
3355 continue;
3356 was_call = true;
3357
3358 new_insn = attempt;
3359 while (new_insn != NULL_RTX)
3360 {
3361 if (CALL_P (new_insn))
3362 break;
3363 new_insn = NEXT_INSN (new_insn);
3364 }
3365
3366 gcc_assert (new_insn != NULL_RTX);
3367
3368 CALL_INSN_FUNCTION_USAGE (new_insn)
3369 = CALL_INSN_FUNCTION_USAGE (old_insn);
3370 SIBLING_CALL_P (new_insn) = SIBLING_CALL_P (old_insn);
3371
3372 for (note = REG_NOTES (old_insn);
3373 note;
3374 note = XEXP (note, 1))
3375 switch (REG_NOTE_KIND (note))
3376 {
3377 case REG_NORETURN:
3378 case REG_SETJMP:
3379 case REG_TM:
3380 add_reg_note (new_insn, REG_NOTE_KIND (note),
3381 XEXP (note, 0));
3382 break;
3383 default:
3384 /* Discard all other reg notes. */
3385 break;
3386 }
3387
3388 /* Croak if there is another call in the sequence. */
3389 while (++i <= match_len)
3390 {
3391 j = peep2_buf_position (peep2_current + i);
3392 old_insn = peep2_insn_data[j].insn;
3393 gcc_assert (!CALL_P (old_insn));
3394 }
3395 break;
3396 }
3397
3398 /* If we matched any instruction that had a REG_ARGS_SIZE, then
3399 move those notes over to the new sequence. */
3400 as_note = NULL;
3401 for (i = match_len; i >= 0; --i)
3402 {
3403 int j = peep2_buf_position (peep2_current + i);
3404 old_insn = peep2_insn_data[j].insn;
3405
3406 as_note = find_reg_note (old_insn, REG_ARGS_SIZE, NULL);
3407 if (as_note)
3408 break;
3409 }
3410
3411 i = peep2_buf_position (peep2_current + match_len);
3412 eh_note = find_reg_note (peep2_insn_data[i].insn, REG_EH_REGION, NULL_RTX);
3413
3414 /* Replace the old sequence with the new. */
3415 rtx_insn *peepinsn = peep2_insn_data[i].insn;
3416 last = emit_insn_after_setloc (attempt,
3417 peep2_insn_data[i].insn,
3418 INSN_LOCATION (peepinsn));
3419 before_try = PREV_INSN (insn);
3420 delete_insn_chain (insn, peep2_insn_data[i].insn, false);
3421
3422 /* Re-insert the EH_REGION notes. */
3423 if (eh_note || (was_call && nonlocal_goto_handler_labels))
3424 {
3425 edge eh_edge;
3426 edge_iterator ei;
3427
3428 FOR_EACH_EDGE (eh_edge, ei, bb->succs)
3429 if (eh_edge->flags & (EDGE_EH | EDGE_ABNORMAL_CALL))
3430 break;
3431
3432 if (eh_note)
3433 copy_reg_eh_region_note_backward (eh_note, last, before_try);
3434
3435 if (eh_edge)
3436 for (x = last; x != before_try; x = PREV_INSN (x))
3437 if (x != BB_END (bb)
3438 && (can_throw_internal (x)
3439 || can_nonlocal_goto (x)))
3440 {
3441 edge nfte, nehe;
3442 int flags;
3443
3444 nfte = split_block (bb, x);
3445 flags = (eh_edge->flags
3446 & (EDGE_EH | EDGE_ABNORMAL));
3447 if (CALL_P (x))
3448 flags |= EDGE_ABNORMAL_CALL;
3449 nehe = make_edge (nfte->src, eh_edge->dest,
3450 flags);
3451
3452 nehe->probability = eh_edge->probability;
3453 nfte->probability
3454 = REG_BR_PROB_BASE - nehe->probability;
3455
3456 peep2_do_cleanup_cfg |= purge_dead_edges (nfte->dest);
3457 bb = nfte->src;
3458 eh_edge = nehe;
3459 }
3460
3461 /* Converting possibly trapping insn to non-trapping is
3462 possible. Zap dummy outgoing edges. */
3463 peep2_do_cleanup_cfg |= purge_dead_edges (bb);
3464 }
3465
3466 /* Re-insert the ARGS_SIZE notes. */
3467 if (as_note)
3468 fixup_args_size_notes (before_try, last, INTVAL (XEXP (as_note, 0)));
3469
3470 /* If we generated a jump instruction, it won't have
3471 JUMP_LABEL set. Recompute after we're done. */
3472 for (x = last; x != before_try; x = PREV_INSN (x))
3473 if (JUMP_P (x))
3474 {
3475 peep2_do_rebuild_jump_labels = true;
3476 break;
3477 }
3478
3479 return last;
3480 }
3481
3482 /* After performing a replacement in basic block BB, fix up the life
3483 information in our buffer. LAST is the last of the insns that we
3484 emitted as a replacement. PREV is the insn before the start of
3485 the replacement. MATCH_LEN is the number of instructions that were
3486 matched, and which now need to be replaced in the buffer. */
3487
3488 static void
3489 peep2_update_life (basic_block bb, int match_len, rtx_insn *last,
3490 rtx_insn *prev)
3491 {
3492 int i = peep2_buf_position (peep2_current + match_len + 1);
3493 rtx_insn *x;
3494 regset_head live;
3495
3496 INIT_REG_SET (&live);
3497 COPY_REG_SET (&live, peep2_insn_data[i].live_before);
3498
3499 gcc_assert (peep2_current_count >= match_len + 1);
3500 peep2_current_count -= match_len + 1;
3501
3502 x = last;
3503 do
3504 {
3505 if (INSN_P (x))
3506 {
3507 df_insn_rescan (x);
3508 if (peep2_current_count < MAX_INSNS_PER_PEEP2)
3509 {
3510 peep2_current_count++;
3511 if (--i < 0)
3512 i = MAX_INSNS_PER_PEEP2;
3513 peep2_insn_data[i].insn = x;
3514 df_simulate_one_insn_backwards (bb, x, &live);
3515 COPY_REG_SET (peep2_insn_data[i].live_before, &live);
3516 }
3517 }
3518 x = PREV_INSN (x);
3519 }
3520 while (x != prev);
3521 CLEAR_REG_SET (&live);
3522
3523 peep2_current = i;
3524 }
3525
3526 /* Add INSN, which is in BB, at the end of the peep2 insn buffer if possible.
3527 Return true if we added it, false otherwise. The caller will try to match
3528 peepholes against the buffer if we return false; otherwise it will try to
3529 add more instructions to the buffer. */
3530
3531 static bool
3532 peep2_fill_buffer (basic_block bb, rtx_insn *insn, regset live)
3533 {
3534 int pos;
3535
3536 /* Once we have filled the maximum number of insns the buffer can hold,
3537 allow the caller to match the insns against peepholes. We wait until
3538 the buffer is full in case the target has similar peepholes of different
3539 length; we always want to match the longest if possible. */
3540 if (peep2_current_count == MAX_INSNS_PER_PEEP2)
3541 return false;
3542
3543 /* If an insn has RTX_FRAME_RELATED_P set, do not allow it to be matched with
3544 any other pattern, lest it change the semantics of the frame info. */
3545 if (RTX_FRAME_RELATED_P (insn))
3546 {
3547 /* Let the buffer drain first. */
3548 if (peep2_current_count > 0)
3549 return false;
3550 /* Now the insn will be the only thing in the buffer. */
3551 }
3552
3553 pos = peep2_buf_position (peep2_current + peep2_current_count);
3554 peep2_insn_data[pos].insn = insn;
3555 COPY_REG_SET (peep2_insn_data[pos].live_before, live);
3556 peep2_current_count++;
3557
3558 df_simulate_one_insn_forwards (bb, insn, live);
3559 return true;
3560 }
3561
3562 /* Perform the peephole2 optimization pass. */
3563
3564 static void
3565 peephole2_optimize (void)
3566 {
3567 rtx_insn *insn;
3568 bitmap live;
3569 int i;
3570 basic_block bb;
3571
3572 peep2_do_cleanup_cfg = false;
3573 peep2_do_rebuild_jump_labels = false;
3574
3575 df_set_flags (DF_LR_RUN_DCE);
3576 df_note_add_problem ();
3577 df_analyze ();
3578
3579 /* Initialize the regsets we're going to use. */
3580 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3581 peep2_insn_data[i].live_before = BITMAP_ALLOC (&reg_obstack);
3582 search_ofs = 0;
3583 live = BITMAP_ALLOC (&reg_obstack);
3584
3585 FOR_EACH_BB_REVERSE_FN (bb, cfun)
3586 {
3587 bool past_end = false;
3588 int pos;
3589
3590 rtl_profile_for_bb (bb);
3591
3592 /* Start up propagation. */
3593 bitmap_copy (live, DF_LR_IN (bb));
3594 df_simulate_initialize_forwards (bb, live);
3595 peep2_reinit_state (live);
3596
3597 insn = BB_HEAD (bb);
3598 for (;;)
3599 {
3600 rtx_insn *attempt, *head;
3601 int match_len;
3602
3603 if (!past_end && !NONDEBUG_INSN_P (insn))
3604 {
3605 next_insn:
3606 insn = NEXT_INSN (insn);
3607 if (insn == NEXT_INSN (BB_END (bb)))
3608 past_end = true;
3609 continue;
3610 }
3611 if (!past_end && peep2_fill_buffer (bb, insn, live))
3612 goto next_insn;
3613
3614 /* If we did not fill an empty buffer, it signals the end of the
3615 block. */
3616 if (peep2_current_count == 0)
3617 break;
3618
3619 /* The buffer filled to the current maximum, so try to match. */
3620
3621 pos = peep2_buf_position (peep2_current + peep2_current_count);
3622 peep2_insn_data[pos].insn = PEEP2_EOB;
3623 COPY_REG_SET (peep2_insn_data[pos].live_before, live);
3624
3625 /* Match the peephole. */
3626 head = peep2_insn_data[peep2_current].insn;
3627 attempt = peephole2_insns (PATTERN (head), head, &match_len);
3628 if (attempt != NULL)
3629 {
3630 rtx_insn *last = peep2_attempt (bb, head, match_len, attempt);
3631 if (last)
3632 {
3633 peep2_update_life (bb, match_len, last, PREV_INSN (attempt));
3634 continue;
3635 }
3636 }
3637
3638 /* No match: advance the buffer by one insn. */
3639 peep2_current = peep2_buf_position (peep2_current + 1);
3640 peep2_current_count--;
3641 }
3642 }
3643
3644 default_rtl_profile ();
3645 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3646 BITMAP_FREE (peep2_insn_data[i].live_before);
3647 BITMAP_FREE (live);
3648 if (peep2_do_rebuild_jump_labels)
3649 rebuild_jump_labels (get_insns ());
3650 if (peep2_do_cleanup_cfg)
3651 cleanup_cfg (CLEANUP_CFG_CHANGED);
3652 }
3653
3654 /* Common predicates for use with define_bypass. */
3655
3656 /* True if the dependency between OUT_INSN and IN_INSN is on the store
3657 data not the address operand(s) of the store. IN_INSN and OUT_INSN
3658 must be either a single_set or a PARALLEL with SETs inside. */
3659
3660 int
3661 store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
3662 {
3663 rtx out_set, in_set;
3664 rtx out_pat, in_pat;
3665 rtx out_exp, in_exp;
3666 int i, j;
3667
3668 in_set = single_set (in_insn);
3669 if (in_set)
3670 {
3671 if (!MEM_P (SET_DEST (in_set)))
3672 return false;
3673
3674 out_set = single_set (out_insn);
3675 if (out_set)
3676 {
3677 if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_set)))
3678 return false;
3679 }
3680 else
3681 {
3682 out_pat = PATTERN (out_insn);
3683
3684 if (GET_CODE (out_pat) != PARALLEL)
3685 return false;
3686
3687 for (i = 0; i < XVECLEN (out_pat, 0); i++)
3688 {
3689 out_exp = XVECEXP (out_pat, 0, i);
3690
3691 if (GET_CODE (out_exp) == CLOBBER)
3692 continue;
3693
3694 gcc_assert (GET_CODE (out_exp) == SET);
3695
3696 if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_set)))
3697 return false;
3698 }
3699 }
3700 }
3701 else
3702 {
3703 in_pat = PATTERN (in_insn);
3704 gcc_assert (GET_CODE (in_pat) == PARALLEL);
3705
3706 for (i = 0; i < XVECLEN (in_pat, 0); i++)
3707 {
3708 in_exp = XVECEXP (in_pat, 0, i);
3709
3710 if (GET_CODE (in_exp) == CLOBBER)
3711 continue;
3712
3713 gcc_assert (GET_CODE (in_exp) == SET);
3714
3715 if (!MEM_P (SET_DEST (in_exp)))
3716 return false;
3717
3718 out_set = single_set (out_insn);
3719 if (out_set)
3720 {
3721 if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_exp)))
3722 return false;
3723 }
3724 else
3725 {
3726 out_pat = PATTERN (out_insn);
3727 gcc_assert (GET_CODE (out_pat) == PARALLEL);
3728
3729 for (j = 0; j < XVECLEN (out_pat, 0); j++)
3730 {
3731 out_exp = XVECEXP (out_pat, 0, j);
3732
3733 if (GET_CODE (out_exp) == CLOBBER)
3734 continue;
3735
3736 gcc_assert (GET_CODE (out_exp) == SET);
3737
3738 if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_exp)))
3739 return false;
3740 }
3741 }
3742 }
3743 }
3744
3745 return true;
3746 }
3747
3748 /* True if the dependency between OUT_INSN and IN_INSN is in the IF_THEN_ELSE
3749 condition, and not the THEN or ELSE branch. OUT_INSN may be either a single
3750 or multiple set; IN_INSN should be single_set for truth, but for convenience
3751 of insn categorization may be any JUMP or CALL insn. */
3752
3753 int
3754 if_test_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
3755 {
3756 rtx out_set, in_set;
3757
3758 in_set = single_set (in_insn);
3759 if (! in_set)
3760 {
3761 gcc_assert (JUMP_P (in_insn) || CALL_P (in_insn));
3762 return false;
3763 }
3764
3765 if (GET_CODE (SET_SRC (in_set)) != IF_THEN_ELSE)
3766 return false;
3767 in_set = SET_SRC (in_set);
3768
3769 out_set = single_set (out_insn);
3770 if (out_set)
3771 {
3772 if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3773 || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3774 return false;
3775 }
3776 else
3777 {
3778 rtx out_pat;
3779 int i;
3780
3781 out_pat = PATTERN (out_insn);
3782 gcc_assert (GET_CODE (out_pat) == PARALLEL);
3783
3784 for (i = 0; i < XVECLEN (out_pat, 0); i++)
3785 {
3786 rtx exp = XVECEXP (out_pat, 0, i);
3787
3788 if (GET_CODE (exp) == CLOBBER)
3789 continue;
3790
3791 gcc_assert (GET_CODE (exp) == SET);
3792
3793 if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3794 || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3795 return false;
3796 }
3797 }
3798
3799 return true;
3800 }
3801 \f
3802 static unsigned int
3803 rest_of_handle_peephole2 (void)
3804 {
3805 if (HAVE_peephole2)
3806 peephole2_optimize ();
3807
3808 return 0;
3809 }
3810
3811 namespace {
3812
3813 const pass_data pass_data_peephole2 =
3814 {
3815 RTL_PASS, /* type */
3816 "peephole2", /* name */
3817 OPTGROUP_NONE, /* optinfo_flags */
3818 TV_PEEPHOLE2, /* tv_id */
3819 0, /* properties_required */
3820 0, /* properties_provided */
3821 0, /* properties_destroyed */
3822 0, /* todo_flags_start */
3823 TODO_df_finish, /* todo_flags_finish */
3824 };
3825
3826 class pass_peephole2 : public rtl_opt_pass
3827 {
3828 public:
3829 pass_peephole2 (gcc::context *ctxt)
3830 : rtl_opt_pass (pass_data_peephole2, ctxt)
3831 {}
3832
3833 /* opt_pass methods: */
3834 /* The epiphany backend creates a second instance of this pass, so we need
3835 a clone method. */
3836 opt_pass * clone () { return new pass_peephole2 (m_ctxt); }
3837 virtual bool gate (function *) { return (optimize > 0 && flag_peephole2); }
3838 virtual unsigned int execute (function *)
3839 {
3840 return rest_of_handle_peephole2 ();
3841 }
3842
3843 }; // class pass_peephole2
3844
3845 } // anon namespace
3846
3847 rtl_opt_pass *
3848 make_pass_peephole2 (gcc::context *ctxt)
3849 {
3850 return new pass_peephole2 (ctxt);
3851 }
3852
3853 namespace {
3854
3855 const pass_data pass_data_split_all_insns =
3856 {
3857 RTL_PASS, /* type */
3858 "split1", /* name */
3859 OPTGROUP_NONE, /* optinfo_flags */
3860 TV_NONE, /* tv_id */
3861 0, /* properties_required */
3862 0, /* properties_provided */
3863 0, /* properties_destroyed */
3864 0, /* todo_flags_start */
3865 0, /* todo_flags_finish */
3866 };
3867
3868 class pass_split_all_insns : public rtl_opt_pass
3869 {
3870 public:
3871 pass_split_all_insns (gcc::context *ctxt)
3872 : rtl_opt_pass (pass_data_split_all_insns, ctxt)
3873 {}
3874
3875 /* opt_pass methods: */
3876 /* The epiphany backend creates a second instance of this pass, so
3877 we need a clone method. */
3878 opt_pass * clone () { return new pass_split_all_insns (m_ctxt); }
3879 virtual unsigned int execute (function *)
3880 {
3881 split_all_insns ();
3882 return 0;
3883 }
3884
3885 }; // class pass_split_all_insns
3886
3887 } // anon namespace
3888
3889 rtl_opt_pass *
3890 make_pass_split_all_insns (gcc::context *ctxt)
3891 {
3892 return new pass_split_all_insns (ctxt);
3893 }
3894
3895 static unsigned int
3896 rest_of_handle_split_after_reload (void)
3897 {
3898 /* If optimizing, then go ahead and split insns now. */
3899 #ifndef STACK_REGS
3900 if (optimize > 0)
3901 #endif
3902 split_all_insns ();
3903 return 0;
3904 }
3905
3906 namespace {
3907
3908 const pass_data pass_data_split_after_reload =
3909 {
3910 RTL_PASS, /* type */
3911 "split2", /* name */
3912 OPTGROUP_NONE, /* optinfo_flags */
3913 TV_NONE, /* tv_id */
3914 0, /* properties_required */
3915 0, /* properties_provided */
3916 0, /* properties_destroyed */
3917 0, /* todo_flags_start */
3918 0, /* todo_flags_finish */
3919 };
3920
3921 class pass_split_after_reload : public rtl_opt_pass
3922 {
3923 public:
3924 pass_split_after_reload (gcc::context *ctxt)
3925 : rtl_opt_pass (pass_data_split_after_reload, ctxt)
3926 {}
3927
3928 /* opt_pass methods: */
3929 virtual unsigned int execute (function *)
3930 {
3931 return rest_of_handle_split_after_reload ();
3932 }
3933
3934 }; // class pass_split_after_reload
3935
3936 } // anon namespace
3937
3938 rtl_opt_pass *
3939 make_pass_split_after_reload (gcc::context *ctxt)
3940 {
3941 return new pass_split_after_reload (ctxt);
3942 }
3943
3944 namespace {
3945
3946 const pass_data pass_data_split_before_regstack =
3947 {
3948 RTL_PASS, /* type */
3949 "split3", /* name */
3950 OPTGROUP_NONE, /* optinfo_flags */
3951 TV_NONE, /* tv_id */
3952 0, /* properties_required */
3953 0, /* properties_provided */
3954 0, /* properties_destroyed */
3955 0, /* todo_flags_start */
3956 0, /* todo_flags_finish */
3957 };
3958
3959 class pass_split_before_regstack : public rtl_opt_pass
3960 {
3961 public:
3962 pass_split_before_regstack (gcc::context *ctxt)
3963 : rtl_opt_pass (pass_data_split_before_regstack, ctxt)
3964 {}
3965
3966 /* opt_pass methods: */
3967 virtual bool gate (function *);
3968 virtual unsigned int execute (function *)
3969 {
3970 split_all_insns ();
3971 return 0;
3972 }
3973
3974 }; // class pass_split_before_regstack
3975
3976 bool
3977 pass_split_before_regstack::gate (function *)
3978 {
3979 #if HAVE_ATTR_length && defined (STACK_REGS)
3980 /* If flow2 creates new instructions which need splitting
3981 and scheduling after reload is not done, they might not be
3982 split until final which doesn't allow splitting
3983 if HAVE_ATTR_length. */
3984 # ifdef INSN_SCHEDULING
3985 return (optimize && !flag_schedule_insns_after_reload);
3986 # else
3987 return (optimize);
3988 # endif
3989 #else
3990 return 0;
3991 #endif
3992 }
3993
3994 } // anon namespace
3995
3996 rtl_opt_pass *
3997 make_pass_split_before_regstack (gcc::context *ctxt)
3998 {
3999 return new pass_split_before_regstack (ctxt);
4000 }
4001
4002 static unsigned int
4003 rest_of_handle_split_before_sched2 (void)
4004 {
4005 #ifdef INSN_SCHEDULING
4006 split_all_insns ();
4007 #endif
4008 return 0;
4009 }
4010
4011 namespace {
4012
4013 const pass_data pass_data_split_before_sched2 =
4014 {
4015 RTL_PASS, /* type */
4016 "split4", /* name */
4017 OPTGROUP_NONE, /* optinfo_flags */
4018 TV_NONE, /* tv_id */
4019 0, /* properties_required */
4020 0, /* properties_provided */
4021 0, /* properties_destroyed */
4022 0, /* todo_flags_start */
4023 0, /* todo_flags_finish */
4024 };
4025
4026 class pass_split_before_sched2 : public rtl_opt_pass
4027 {
4028 public:
4029 pass_split_before_sched2 (gcc::context *ctxt)
4030 : rtl_opt_pass (pass_data_split_before_sched2, ctxt)
4031 {}
4032
4033 /* opt_pass methods: */
4034 virtual bool gate (function *)
4035 {
4036 #ifdef INSN_SCHEDULING
4037 return optimize > 0 && flag_schedule_insns_after_reload;
4038 #else
4039 return false;
4040 #endif
4041 }
4042
4043 virtual unsigned int execute (function *)
4044 {
4045 return rest_of_handle_split_before_sched2 ();
4046 }
4047
4048 }; // class pass_split_before_sched2
4049
4050 } // anon namespace
4051
4052 rtl_opt_pass *
4053 make_pass_split_before_sched2 (gcc::context *ctxt)
4054 {
4055 return new pass_split_before_sched2 (ctxt);
4056 }
4057
4058 namespace {
4059
4060 const pass_data pass_data_split_for_shorten_branches =
4061 {
4062 RTL_PASS, /* type */
4063 "split5", /* name */
4064 OPTGROUP_NONE, /* optinfo_flags */
4065 TV_NONE, /* tv_id */
4066 0, /* properties_required */
4067 0, /* properties_provided */
4068 0, /* properties_destroyed */
4069 0, /* todo_flags_start */
4070 0, /* todo_flags_finish */
4071 };
4072
4073 class pass_split_for_shorten_branches : public rtl_opt_pass
4074 {
4075 public:
4076 pass_split_for_shorten_branches (gcc::context *ctxt)
4077 : rtl_opt_pass (pass_data_split_for_shorten_branches, ctxt)
4078 {}
4079
4080 /* opt_pass methods: */
4081 virtual bool gate (function *)
4082 {
4083 /* The placement of the splitting that we do for shorten_branches
4084 depends on whether regstack is used by the target or not. */
4085 #if HAVE_ATTR_length && !defined (STACK_REGS)
4086 return true;
4087 #else
4088 return false;
4089 #endif
4090 }
4091
4092 virtual unsigned int execute (function *)
4093 {
4094 return split_all_insns_noflow ();
4095 }
4096
4097 }; // class pass_split_for_shorten_branches
4098
4099 } // anon namespace
4100
4101 rtl_opt_pass *
4102 make_pass_split_for_shorten_branches (gcc::context *ctxt)
4103 {
4104 return new pass_split_for_shorten_branches (ctxt);
4105 }
4106
4107 /* (Re)initialize the target information after a change in target. */
4108
4109 void
4110 recog_init ()
4111 {
4112 /* The information is zero-initialized, so we don't need to do anything
4113 first time round. */
4114 if (!this_target_recog->x_initialized)
4115 {
4116 this_target_recog->x_initialized = true;
4117 return;
4118 }
4119 memset (this_target_recog->x_bool_attr_masks, 0,
4120 sizeof (this_target_recog->x_bool_attr_masks));
4121 for (unsigned int i = 0; i < NUM_INSN_CODES; ++i)
4122 if (this_target_recog->x_op_alt[i])
4123 {
4124 free (this_target_recog->x_op_alt[i]);
4125 this_target_recog->x_op_alt[i] = 0;
4126 }
4127 }