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