1 /* Convert RTL to assembler code and output it, for GNU compiler.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21 
22 /* This is the final pass of the compiler.
23    It looks at the rtl code for a function and outputs assembler code.
24 
25    Call `final_start_function' to output the assembler code for function entry,
26    `final' to output assembler code for some RTL code,
27    `final_end_function' to output assembler code for function exit.
28    If a function is compiled in several pieces, each piece is
29    output separately with `final'.
30 
31    Some optimizations are also done at this level.
32    Move instructions that were made unnecessary by good register allocation
33    are detected and omitted from the output.  (Though most of these
34    are removed by the last jump pass.)
35 
36    Instructions to set the condition codes are omitted when it can be
37    seen that the condition codes already had the desired values.
38 
39    In some cases it is sufficient if the inherited condition codes
40    have related values, but this may require the following insn
41    (the one that tests the condition codes) to be modified.
42 
43    The code for the function prologue and epilogue are generated
44    directly in assembler by the target functions function_prologue and
45    function_epilogue.  Those instructions never exist as rtl.  */
46 
47 #include "config.h"
48 #include "system.h"
49 #include "coretypes.h"
50 #include "tm.h"
51 
52 #include "tree.h"
53 #include "rtl.h"
54 #include "tm_p.h"
55 #include "regs.h"
56 #include "insn-config.h"
57 #include "insn-attr.h"
58 #include "recog.h"
59 #include "conditions.h"
60 #include "flags.h"
61 #include "real.h"
62 #include "hard-reg-set.h"
63 #include "output.h"
64 #include "except.h"
65 #include "function.h"
66 #include "toplev.h"
67 #include "reload.h"
68 #include "intl.h"
69 #include "basic-block.h"
70 #include "target.h"
71 #include "debug.h"
72 #include "expr.h"
73 #include "cfglayout.h"
74 
75 #ifdef XCOFF_DEBUGGING_INFO
76 #include "xcoffout.h"		/* Needed for external data
77 				   declarations for e.g. AIX 4.x.  */
78 #endif
79 
80 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
81 #include "dwarf2out.h"
82 #endif
83 
84 #ifdef DBX_DEBUGGING_INFO
85 #include "dbxout.h"
86 #endif
87 
88 /* If we aren't using cc0, CC_STATUS_INIT shouldn't exist.  So define a
89    null default for it to save conditionalization later.  */
90 #ifndef CC_STATUS_INIT
91 #define CC_STATUS_INIT
92 #endif
93 
94 /* How to start an assembler comment.  */
95 #ifndef ASM_COMMENT_START
96 #define ASM_COMMENT_START ";#"
97 #endif
98 
99 /* Is the given character a logical line separator for the assembler?  */
100 #ifndef IS_ASM_LOGICAL_LINE_SEPARATOR
101 #define IS_ASM_LOGICAL_LINE_SEPARATOR(C) ((C) == ';')
102 #endif
103 
104 #ifndef JUMP_TABLES_IN_TEXT_SECTION
105 #define JUMP_TABLES_IN_TEXT_SECTION 0
106 #endif
107 
108 #if defined(READONLY_DATA_SECTION) || defined(READONLY_DATA_SECTION_ASM_OP)
109 #define HAVE_READONLY_DATA_SECTION 1
110 #else
111 #define HAVE_READONLY_DATA_SECTION 0
112 #endif
113 
114 /* Bitflags used by final_scan_insn.  */
115 #define SEEN_BB		1
116 #define SEEN_NOTE	2
117 #define SEEN_EMITTED	4
118 
119 /* Last insn processed by final_scan_insn.  */
120 static rtx debug_insn;
121 rtx current_output_insn;
122 
123 /* Line number of last NOTE.  */
124 static int last_linenum;
125 
126 /* Highest line number in current block.  */
127 static int high_block_linenum;
128 
129 /* Likewise for function.  */
130 static int high_function_linenum;
131 
132 /* Filename of last NOTE.  */
133 static const char *last_filename;
134 
135 extern int length_unit_log; /* This is defined in insn-attrtab.c.  */
136 
137 /* Nonzero while outputting an `asm' with operands.
138    This means that inconsistencies are the user's fault, so don't abort.
139    The precise value is the insn being output, to pass to error_for_asm.  */
140 rtx this_is_asm_operands;
141 
142 /* Number of operands of this insn, for an `asm' with operands.  */
143 static unsigned int insn_noperands;
144 
145 /* Compare optimization flag.  */
146 
147 static rtx last_ignored_compare = 0;
148 
149 /* Assign a unique number to each insn that is output.
150    This can be used to generate unique local labels.  */
151 
152 static int insn_counter = 0;
153 
154 #ifdef HAVE_cc0
155 /* This variable contains machine-dependent flags (defined in tm.h)
156    set and examined by output routines
157    that describe how to interpret the condition codes properly.  */
158 
159 CC_STATUS cc_status;
160 
161 /* During output of an insn, this contains a copy of cc_status
162    from before the insn.  */
163 
164 CC_STATUS cc_prev_status;
165 #endif
166 
167 /* Indexed by hardware reg number, is 1 if that register is ever
168    used in the current function.
169 
170    In life_analysis, or in stupid_life_analysis, this is set
171    up to record the hard regs used explicitly.  Reload adds
172    in the hard regs used for holding pseudo regs.  Final uses
173    it to generate the code in the function prologue and epilogue
174    to save and restore registers as needed.  */
175 
176 char regs_ever_live[FIRST_PSEUDO_REGISTER];
177 
178 /* Like regs_ever_live, but 1 if a reg is set or clobbered from an asm.
179    Unlike regs_ever_live, elements of this array corresponding to
180    eliminable regs like the frame pointer are set if an asm sets them.  */
181 
182 char regs_asm_clobbered[FIRST_PSEUDO_REGISTER];
183 
184 /* Nonzero means current function must be given a frame pointer.
185    Initialized in function.c to 0.  Set only in reload1.c as per
186    the needs of the function.  */
187 
188 int frame_pointer_needed;
189 
190 /* Number of unmatched NOTE_INSN_BLOCK_BEG notes we have seen.  */
191 
192 static int block_depth;
193 
194 /* Nonzero if have enabled APP processing of our assembler output.  */
195 
196 static int app_on;
197 
198 /* If we are outputting an insn sequence, this contains the sequence rtx.
199    Zero otherwise.  */
200 
201 rtx final_sequence;
202 
203 #ifdef ASSEMBLER_DIALECT
204 
205 /* Number of the assembler dialect to use, starting at 0.  */
206 static int dialect_number;
207 #endif
208 
209 #ifdef HAVE_conditional_execution
210 /* Nonnull if the insn currently being emitted was a COND_EXEC pattern.  */
211 rtx current_insn_predicate;
212 #endif
213 
214 #ifdef HAVE_ATTR_length
215 static int asm_insn_count (rtx);
216 #endif
217 static void profile_function (FILE *);
218 static void profile_after_prologue (FILE *);
219 static bool notice_source_line (rtx);
220 static rtx walk_alter_subreg (rtx *);
221 static void output_asm_name (void);
222 static void output_alternate_entry_point (FILE *, rtx);
223 static tree get_mem_expr_from_op (rtx, int *);
224 static void output_asm_operand_names (rtx *, int *, int);
225 static void output_operand (rtx, int);
226 #ifdef LEAF_REGISTERS
227 static void leaf_renumber_regs (rtx);
228 #endif
229 #ifdef HAVE_cc0
230 static int alter_cond (rtx);
231 #endif
232 #ifndef ADDR_VEC_ALIGN
233 static int final_addr_vec_align (rtx);
234 #endif
235 #ifdef HAVE_ATTR_length
236 static int align_fuzz (rtx, rtx, int, unsigned);
237 #endif
238 
239 /* Initialize data in final at the beginning of a compilation.  */
240 
241 void
init_final(const char * filename ATTRIBUTE_UNUSED)242 init_final (const char *filename ATTRIBUTE_UNUSED)
243 {
244   app_on = 0;
245   final_sequence = 0;
246 
247 #ifdef ASSEMBLER_DIALECT
248   dialect_number = ASSEMBLER_DIALECT;
249 #endif
250 }
251 
252 /* Default target function prologue and epilogue assembler output.
253 
254    If not overridden for epilogue code, then the function body itself
255    contains return instructions wherever needed.  */
256 void
default_function_pro_epilogue(FILE * file ATTRIBUTE_UNUSED,HOST_WIDE_INT size ATTRIBUTE_UNUSED)257 default_function_pro_epilogue (FILE *file ATTRIBUTE_UNUSED,
258 			       HOST_WIDE_INT size ATTRIBUTE_UNUSED)
259 {
260 }
261 
262 /* Default target hook that outputs nothing to a stream.  */
263 void
no_asm_to_stream(FILE * file ATTRIBUTE_UNUSED)264 no_asm_to_stream (FILE *file ATTRIBUTE_UNUSED)
265 {
266 }
267 
268 /* Enable APP processing of subsequent output.
269    Used before the output from an `asm' statement.  */
270 
271 void
app_enable(void)272 app_enable (void)
273 {
274   if (! app_on)
275     {
276       fputs (ASM_APP_ON, asm_out_file);
277       app_on = 1;
278     }
279 }
280 
281 /* Disable APP processing of subsequent output.
282    Called from varasm.c before most kinds of output.  */
283 
284 void
app_disable(void)285 app_disable (void)
286 {
287   if (app_on)
288     {
289       fputs (ASM_APP_OFF, asm_out_file);
290       app_on = 0;
291     }
292 }
293 
294 /* Return the number of slots filled in the current
295    delayed branch sequence (we don't count the insn needing the
296    delay slot).   Zero if not in a delayed branch sequence.  */
297 
298 #ifdef DELAY_SLOTS
299 int
dbr_sequence_length(void)300 dbr_sequence_length (void)
301 {
302   if (final_sequence != 0)
303     return XVECLEN (final_sequence, 0) - 1;
304   else
305     return 0;
306 }
307 #endif
308 
309 /* The next two pages contain routines used to compute the length of an insn
310    and to shorten branches.  */
311 
312 /* Arrays for insn lengths, and addresses.  The latter is referenced by
313    `insn_current_length'.  */
314 
315 static int *insn_lengths;
316 
317 varray_type insn_addresses_;
318 
319 /* Max uid for which the above arrays are valid.  */
320 static int insn_lengths_max_uid;
321 
322 /* Address of insn being processed.  Used by `insn_current_length'.  */
323 int insn_current_address;
324 
325 /* Address of insn being processed in previous iteration.  */
326 int insn_last_address;
327 
328 /* known invariant alignment of insn being processed.  */
329 int insn_current_align;
330 
331 /* After shorten_branches, for any insn, uid_align[INSN_UID (insn)]
332    gives the next following alignment insn that increases the known
333    alignment, or NULL_RTX if there is no such insn.
334    For any alignment obtained this way, we can again index uid_align with
335    its uid to obtain the next following align that in turn increases the
336    alignment, till we reach NULL_RTX; the sequence obtained this way
337    for each insn we'll call the alignment chain of this insn in the following
338    comments.  */
339 
340 struct label_alignment
341 {
342   short alignment;
343   short max_skip;
344 };
345 
346 static rtx *uid_align;
347 static int *uid_shuid;
348 static struct label_alignment *label_align;
349 
350 /* Indicate that branch shortening hasn't yet been done.  */
351 
352 void
init_insn_lengths(void)353 init_insn_lengths (void)
354 {
355   if (uid_shuid)
356     {
357       free (uid_shuid);
358       uid_shuid = 0;
359     }
360   if (insn_lengths)
361     {
362       free (insn_lengths);
363       insn_lengths = 0;
364       insn_lengths_max_uid = 0;
365     }
366 #ifdef HAVE_ATTR_length
367   INSN_ADDRESSES_FREE ();
368 #endif
369   if (uid_align)
370     {
371       free (uid_align);
372       uid_align = 0;
373     }
374 }
375 
376 /* Obtain the current length of an insn.  If branch shortening has been done,
377    get its actual length.  Otherwise, get its maximum length.  */
378 
379 int
get_attr_length(rtx insn ATTRIBUTE_UNUSED)380 get_attr_length (rtx insn ATTRIBUTE_UNUSED)
381 {
382 #ifdef HAVE_ATTR_length
383   rtx body;
384   int i;
385   int length = 0;
386 
387   if (insn_lengths_max_uid > INSN_UID (insn))
388     return insn_lengths[INSN_UID (insn)];
389   else
390     switch (GET_CODE (insn))
391       {
392       case NOTE:
393       case BARRIER:
394       case CODE_LABEL:
395 	return 0;
396 
397       case CALL_INSN:
398 	length = insn_default_length (insn);
399 	break;
400 
401       case JUMP_INSN:
402 	body = PATTERN (insn);
403 	if (GET_CODE (body) == ADDR_VEC || GET_CODE (body) == ADDR_DIFF_VEC)
404 	  {
405 	    /* Alignment is machine-dependent and should be handled by
406 	       ADDR_VEC_ALIGN.  */
407 	  }
408 	else
409 	  length = insn_default_length (insn);
410 	break;
411 
412       case INSN:
413 	body = PATTERN (insn);
414 	if (GET_CODE (body) == USE || GET_CODE (body) == CLOBBER)
415 	  return 0;
416 
417 	else if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0)
418 	  length = asm_insn_count (body) * insn_default_length (insn);
419 	else if (GET_CODE (body) == SEQUENCE)
420 	  for (i = 0; i < XVECLEN (body, 0); i++)
421 	    length += get_attr_length (XVECEXP (body, 0, i));
422 	else
423 	  length = insn_default_length (insn);
424 	break;
425 
426       default:
427 	break;
428       }
429 
430 #ifdef ADJUST_INSN_LENGTH
431   ADJUST_INSN_LENGTH (insn, length);
432 #endif
433   return length;
434 #else /* not HAVE_ATTR_length */
435   return 0;
436 #endif /* not HAVE_ATTR_length */
437 }
438 
439 /* Code to handle alignment inside shorten_branches.  */
440 
441 /* Here is an explanation how the algorithm in align_fuzz can give
442    proper results:
443 
444    Call a sequence of instructions beginning with alignment point X
445    and continuing until the next alignment point `block X'.  When `X'
446    is used in an expression, it means the alignment value of the
447    alignment point.
448 
449    Call the distance between the start of the first insn of block X, and
450    the end of the last insn of block X `IX', for the `inner size of X'.
451    This is clearly the sum of the instruction lengths.
452 
453    Likewise with the next alignment-delimited block following X, which we
454    shall call block Y.
455 
456    Call the distance between the start of the first insn of block X, and
457    the start of the first insn of block Y `OX', for the `outer size of X'.
458 
459    The estimated padding is then OX - IX.
460 
461    OX can be safely estimated as
462 
463            if (X >= Y)
464                    OX = round_up(IX, Y)
465            else
466                    OX = round_up(IX, X) + Y - X
467 
468    Clearly est(IX) >= real(IX), because that only depends on the
469    instruction lengths, and those being overestimated is a given.
470 
471    Clearly round_up(foo, Z) >= round_up(bar, Z) if foo >= bar, so
472    we needn't worry about that when thinking about OX.
473 
474    When X >= Y, the alignment provided by Y adds no uncertainty factor
475    for branch ranges starting before X, so we can just round what we have.
476    But when X < Y, we don't know anything about the, so to speak,
477    `middle bits', so we have to assume the worst when aligning up from an
478    address mod X to one mod Y, which is Y - X.  */
479 
480 #ifndef LABEL_ALIGN
481 #define LABEL_ALIGN(LABEL) align_labels_log
482 #endif
483 
484 #ifndef LABEL_ALIGN_MAX_SKIP
485 #define LABEL_ALIGN_MAX_SKIP align_labels_max_skip
486 #endif
487 
488 #ifndef LOOP_ALIGN
489 #define LOOP_ALIGN(LABEL) align_loops_log
490 #endif
491 
492 #ifndef LOOP_ALIGN_MAX_SKIP
493 #define LOOP_ALIGN_MAX_SKIP align_loops_max_skip
494 #endif
495 
496 #ifndef LABEL_ALIGN_AFTER_BARRIER
497 #define LABEL_ALIGN_AFTER_BARRIER(LABEL) 0
498 #endif
499 
500 #ifndef LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP
501 #define LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP 0
502 #endif
503 
504 #ifndef JUMP_ALIGN
505 #define JUMP_ALIGN(LABEL) align_jumps_log
506 #endif
507 
508 #ifndef JUMP_ALIGN_MAX_SKIP
509 #define JUMP_ALIGN_MAX_SKIP align_jumps_max_skip
510 #endif
511 
512 #ifndef ADDR_VEC_ALIGN
513 static int
final_addr_vec_align(rtx addr_vec)514 final_addr_vec_align (rtx addr_vec)
515 {
516   int align = GET_MODE_SIZE (GET_MODE (PATTERN (addr_vec)));
517 
518   if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT)
519     align = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
520   return exact_log2 (align);
521 
522 }
523 
524 #define ADDR_VEC_ALIGN(ADDR_VEC) final_addr_vec_align (ADDR_VEC)
525 #endif
526 
527 #ifndef INSN_LENGTH_ALIGNMENT
528 #define INSN_LENGTH_ALIGNMENT(INSN) length_unit_log
529 #endif
530 
531 #define INSN_SHUID(INSN) (uid_shuid[INSN_UID (INSN)])
532 
533 static int min_labelno, max_labelno;
534 
535 #define LABEL_TO_ALIGNMENT(LABEL) \
536   (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].alignment)
537 
538 #define LABEL_TO_MAX_SKIP(LABEL) \
539   (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].max_skip)
540 
541 /* For the benefit of port specific code do this also as a function.  */
542 
543 int
label_to_alignment(rtx label)544 label_to_alignment (rtx label)
545 {
546   return LABEL_TO_ALIGNMENT (label);
547 }
548 
549 #ifdef HAVE_ATTR_length
550 /* The differences in addresses
551    between a branch and its target might grow or shrink depending on
552    the alignment the start insn of the range (the branch for a forward
553    branch or the label for a backward branch) starts out on; if these
554    differences are used naively, they can even oscillate infinitely.
555    We therefore want to compute a 'worst case' address difference that
556    is independent of the alignment the start insn of the range end
557    up on, and that is at least as large as the actual difference.
558    The function align_fuzz calculates the amount we have to add to the
559    naively computed difference, by traversing the part of the alignment
560    chain of the start insn of the range that is in front of the end insn
561    of the range, and considering for each alignment the maximum amount
562    that it might contribute to a size increase.
563 
564    For casesi tables, we also want to know worst case minimum amounts of
565    address difference, in case a machine description wants to introduce
566    some common offset that is added to all offsets in a table.
567    For this purpose, align_fuzz with a growth argument of 0 computes the
568    appropriate adjustment.  */
569 
570 /* Compute the maximum delta by which the difference of the addresses of
571    START and END might grow / shrink due to a different address for start
572    which changes the size of alignment insns between START and END.
573    KNOWN_ALIGN_LOG is the alignment known for START.
574    GROWTH should be ~0 if the objective is to compute potential code size
575    increase, and 0 if the objective is to compute potential shrink.
576    The return value is undefined for any other value of GROWTH.  */
577 
578 static int
align_fuzz(rtx start,rtx end,int known_align_log,unsigned int growth)579 align_fuzz (rtx start, rtx end, int known_align_log, unsigned int growth)
580 {
581   int uid = INSN_UID (start);
582   rtx align_label;
583   int known_align = 1 << known_align_log;
584   int end_shuid = INSN_SHUID (end);
585   int fuzz = 0;
586 
587   for (align_label = uid_align[uid]; align_label; align_label = uid_align[uid])
588     {
589       int align_addr, new_align;
590 
591       uid = INSN_UID (align_label);
592       align_addr = INSN_ADDRESSES (uid) - insn_lengths[uid];
593       if (uid_shuid[uid] > end_shuid)
594 	break;
595       known_align_log = LABEL_TO_ALIGNMENT (align_label);
596       new_align = 1 << known_align_log;
597       if (new_align < known_align)
598 	continue;
599       fuzz += (-align_addr ^ growth) & (new_align - known_align);
600       known_align = new_align;
601     }
602   return fuzz;
603 }
604 
605 /* Compute a worst-case reference address of a branch so that it
606    can be safely used in the presence of aligned labels.  Since the
607    size of the branch itself is unknown, the size of the branch is
608    not included in the range.  I.e. for a forward branch, the reference
609    address is the end address of the branch as known from the previous
610    branch shortening pass, minus a value to account for possible size
611    increase due to alignment.  For a backward branch, it is the start
612    address of the branch as known from the current pass, plus a value
613    to account for possible size increase due to alignment.
614    NB.: Therefore, the maximum offset allowed for backward branches needs
615    to exclude the branch size.  */
616 
617 int
insn_current_reference_address(rtx branch)618 insn_current_reference_address (rtx branch)
619 {
620   rtx dest, seq;
621   int seq_uid;
622 
623   if (! INSN_ADDRESSES_SET_P ())
624     return 0;
625 
626   seq = NEXT_INSN (PREV_INSN (branch));
627   seq_uid = INSN_UID (seq);
628   if (GET_CODE (branch) != JUMP_INSN)
629     /* This can happen for example on the PA; the objective is to know the
630        offset to address something in front of the start of the function.
631        Thus, we can treat it like a backward branch.
632        We assume here that FUNCTION_BOUNDARY / BITS_PER_UNIT is larger than
633        any alignment we'd encounter, so we skip the call to align_fuzz.  */
634     return insn_current_address;
635   dest = JUMP_LABEL (branch);
636 
637   /* BRANCH has no proper alignment chain set, so use SEQ.
638      BRANCH also has no INSN_SHUID.  */
639   if (INSN_SHUID (seq) < INSN_SHUID (dest))
640     {
641       /* Forward branch.  */
642       return (insn_last_address + insn_lengths[seq_uid]
643 	      - align_fuzz (seq, dest, length_unit_log, ~0));
644     }
645   else
646     {
647       /* Backward branch.  */
648       return (insn_current_address
649 	      + align_fuzz (dest, seq, length_unit_log, ~0));
650     }
651 }
652 #endif /* HAVE_ATTR_length */
653 
654 void
compute_alignments(void)655 compute_alignments (void)
656 {
657   int log, max_skip, max_log;
658   basic_block bb;
659 
660   if (label_align)
661     {
662       free (label_align);
663       label_align = 0;
664     }
665 
666   max_labelno = max_label_num ();
667   min_labelno = get_first_label_num ();
668   label_align = xcalloc (max_labelno - min_labelno + 1,
669 			 sizeof (struct label_alignment));
670 
671   /* If not optimizing or optimizing for size, don't assign any alignments.  */
672   if (! optimize || optimize_size)
673     return;
674 
675   FOR_EACH_BB (bb)
676     {
677       rtx label = BB_HEAD (bb);
678       int fallthru_frequency = 0, branch_frequency = 0, has_fallthru = 0;
679       edge e;
680 
681       if (GET_CODE (label) != CODE_LABEL
682 	  || probably_never_executed_bb_p (bb))
683 	continue;
684       max_log = LABEL_ALIGN (label);
685       max_skip = LABEL_ALIGN_MAX_SKIP;
686 
687       for (e = bb->pred; e; e = e->pred_next)
688 	{
689 	  if (e->flags & EDGE_FALLTHRU)
690 	    has_fallthru = 1, fallthru_frequency += EDGE_FREQUENCY (e);
691 	  else
692 	    branch_frequency += EDGE_FREQUENCY (e);
693 	}
694 
695       /* There are two purposes to align block with no fallthru incoming edge:
696 	 1) to avoid fetch stalls when branch destination is near cache boundary
697 	 2) to improve cache efficiency in case the previous block is not executed
698 	    (so it does not need to be in the cache).
699 
700 	 We to catch first case, we align frequently executed blocks.
701 	 To catch the second, we align blocks that are executed more frequently
702 	 than the predecessor and the predecessor is likely to not be executed
703 	 when function is called.  */
704 
705       if (!has_fallthru
706 	  && (branch_frequency > BB_FREQ_MAX / 10
707 	      || (bb->frequency > bb->prev_bb->frequency * 10
708 		  && (bb->prev_bb->frequency
709 		      <= ENTRY_BLOCK_PTR->frequency / 2))))
710 	{
711 	  log = JUMP_ALIGN (label);
712 	  if (max_log < log)
713 	    {
714 	      max_log = log;
715 	      max_skip = JUMP_ALIGN_MAX_SKIP;
716 	    }
717 	}
718       /* In case block is frequent and reached mostly by non-fallthru edge,
719 	 align it.  It is most likely a first block of loop.  */
720       if (has_fallthru
721 	  && maybe_hot_bb_p (bb)
722 	  && branch_frequency + fallthru_frequency > BB_FREQ_MAX / 10
723 	  && branch_frequency > fallthru_frequency * 2)
724 	{
725 	  log = LOOP_ALIGN (label);
726 	  if (max_log < log)
727 	    {
728 	      max_log = log;
729 	      max_skip = LOOP_ALIGN_MAX_SKIP;
730 	    }
731 	}
732       LABEL_TO_ALIGNMENT (label) = max_log;
733       LABEL_TO_MAX_SKIP (label) = max_skip;
734     }
735 }
736 
737 /* Make a pass over all insns and compute their actual lengths by shortening
738    any branches of variable length if possible.  */
739 
740 /* shorten_branches might be called multiple times:  for example, the SH
741    port splits out-of-range conditional branches in MACHINE_DEPENDENT_REORG.
742    In order to do this, it needs proper length information, which it obtains
743    by calling shorten_branches.  This cannot be collapsed with
744    shorten_branches itself into a single pass unless we also want to integrate
745    reorg.c, since the branch splitting exposes new instructions with delay
746    slots.  */
747 
748 void
shorten_branches(rtx first ATTRIBUTE_UNUSED)749 shorten_branches (rtx first ATTRIBUTE_UNUSED)
750 {
751   rtx insn;
752   int max_uid;
753   int i;
754   int max_log;
755   int max_skip;
756 #ifdef HAVE_ATTR_length
757 #define MAX_CODE_ALIGN 16
758   rtx seq;
759   int something_changed = 1;
760   char *varying_length;
761   rtx body;
762   int uid;
763   rtx align_tab[MAX_CODE_ALIGN];
764 
765 #endif
766 
767   /* Compute maximum UID and allocate label_align / uid_shuid.  */
768   max_uid = get_max_uid ();
769 
770   uid_shuid = xmalloc (max_uid * sizeof *uid_shuid);
771 
772   if (max_labelno != max_label_num ())
773     {
774       int old = max_labelno;
775       int n_labels;
776       int n_old_labels;
777 
778       max_labelno = max_label_num ();
779 
780       n_labels = max_labelno - min_labelno + 1;
781       n_old_labels = old - min_labelno + 1;
782 
783       label_align = xrealloc (label_align,
784 			      n_labels * sizeof (struct label_alignment));
785 
786       /* Range of labels grows monotonically in the function.  Abort here
787          means that the initialization of array got lost.  */
788       if (n_old_labels > n_labels)
789 	abort ();
790 
791       memset (label_align + n_old_labels, 0,
792 	      (n_labels - n_old_labels) * sizeof (struct label_alignment));
793     }
794 
795   /* Initialize label_align and set up uid_shuid to be strictly
796      monotonically rising with insn order.  */
797   /* We use max_log here to keep track of the maximum alignment we want to
798      impose on the next CODE_LABEL (or the current one if we are processing
799      the CODE_LABEL itself).  */
800 
801   max_log = 0;
802   max_skip = 0;
803 
804   for (insn = get_insns (), i = 1; insn; insn = NEXT_INSN (insn))
805     {
806       int log;
807 
808       INSN_SHUID (insn) = i++;
809       if (INSN_P (insn))
810 	{
811 	  /* reorg might make the first insn of a loop being run once only,
812              and delete the label in front of it.  Then we want to apply
813              the loop alignment to the new label created by reorg, which
814              is separated by the former loop start insn from the
815 	     NOTE_INSN_LOOP_BEG.  */
816 	}
817       else if (GET_CODE (insn) == CODE_LABEL)
818 	{
819 	  rtx next;
820 
821 	  /* Merge in alignments computed by compute_alignments.  */
822 	  log = LABEL_TO_ALIGNMENT (insn);
823 	  if (max_log < log)
824 	    {
825 	      max_log = log;
826 	      max_skip = LABEL_TO_MAX_SKIP (insn);
827 	    }
828 
829 	  log = LABEL_ALIGN (insn);
830 	  if (max_log < log)
831 	    {
832 	      max_log = log;
833 	      max_skip = LABEL_ALIGN_MAX_SKIP;
834 	    }
835 	  next = NEXT_INSN (insn);
836 	  /* ADDR_VECs only take room if read-only data goes into the text
837 	     section.  */
838 	  if (JUMP_TABLES_IN_TEXT_SECTION || !HAVE_READONLY_DATA_SECTION)
839 	    if (next && GET_CODE (next) == JUMP_INSN)
840 	      {
841 		rtx nextbody = PATTERN (next);
842 		if (GET_CODE (nextbody) == ADDR_VEC
843 		    || GET_CODE (nextbody) == ADDR_DIFF_VEC)
844 		  {
845 		    log = ADDR_VEC_ALIGN (next);
846 		    if (max_log < log)
847 		      {
848 			max_log = log;
849 			max_skip = LABEL_ALIGN_MAX_SKIP;
850 		      }
851 		  }
852 	      }
853 	  LABEL_TO_ALIGNMENT (insn) = max_log;
854 	  LABEL_TO_MAX_SKIP (insn) = max_skip;
855 	  max_log = 0;
856 	  max_skip = 0;
857 	}
858       else if (GET_CODE (insn) == BARRIER)
859 	{
860 	  rtx label;
861 
862 	  for (label = insn; label && ! INSN_P (label);
863 	       label = NEXT_INSN (label))
864 	    if (GET_CODE (label) == CODE_LABEL)
865 	      {
866 		log = LABEL_ALIGN_AFTER_BARRIER (insn);
867 		if (max_log < log)
868 		  {
869 		    max_log = log;
870 		    max_skip = LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP;
871 		  }
872 		break;
873 	      }
874 	}
875     }
876 #ifdef HAVE_ATTR_length
877 
878   /* Allocate the rest of the arrays.  */
879   insn_lengths = xmalloc (max_uid * sizeof (*insn_lengths));
880   insn_lengths_max_uid = max_uid;
881   /* Syntax errors can lead to labels being outside of the main insn stream.
882      Initialize insn_addresses, so that we get reproducible results.  */
883   INSN_ADDRESSES_ALLOC (max_uid);
884 
885   varying_length = xcalloc (max_uid, sizeof (char));
886 
887   /* Initialize uid_align.  We scan instructions
888      from end to start, and keep in align_tab[n] the last seen insn
889      that does an alignment of at least n+1, i.e. the successor
890      in the alignment chain for an insn that does / has a known
891      alignment of n.  */
892   uid_align = xcalloc (max_uid, sizeof *uid_align);
893 
894   for (i = MAX_CODE_ALIGN; --i >= 0;)
895     align_tab[i] = NULL_RTX;
896   seq = get_last_insn ();
897   for (; seq; seq = PREV_INSN (seq))
898     {
899       int uid = INSN_UID (seq);
900       int log;
901       log = (GET_CODE (seq) == CODE_LABEL ? LABEL_TO_ALIGNMENT (seq) : 0);
902       uid_align[uid] = align_tab[0];
903       if (log)
904 	{
905 	  /* Found an alignment label.  */
906 	  uid_align[uid] = align_tab[log];
907 	  for (i = log - 1; i >= 0; i--)
908 	    align_tab[i] = seq;
909 	}
910     }
911 #ifdef CASE_VECTOR_SHORTEN_MODE
912   if (optimize)
913     {
914       /* Look for ADDR_DIFF_VECs, and initialize their minimum and maximum
915          label fields.  */
916 
917       int min_shuid = INSN_SHUID (get_insns ()) - 1;
918       int max_shuid = INSN_SHUID (get_last_insn ()) + 1;
919       int rel;
920 
921       for (insn = first; insn != 0; insn = NEXT_INSN (insn))
922 	{
923 	  rtx min_lab = NULL_RTX, max_lab = NULL_RTX, pat;
924 	  int len, i, min, max, insn_shuid;
925 	  int min_align;
926 	  addr_diff_vec_flags flags;
927 
928 	  if (GET_CODE (insn) != JUMP_INSN
929 	      || GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
930 	    continue;
931 	  pat = PATTERN (insn);
932 	  len = XVECLEN (pat, 1);
933 	  if (len <= 0)
934 	    abort ();
935 	  min_align = MAX_CODE_ALIGN;
936 	  for (min = max_shuid, max = min_shuid, i = len - 1; i >= 0; i--)
937 	    {
938 	      rtx lab = XEXP (XVECEXP (pat, 1, i), 0);
939 	      int shuid = INSN_SHUID (lab);
940 	      if (shuid < min)
941 		{
942 		  min = shuid;
943 		  min_lab = lab;
944 		}
945 	      if (shuid > max)
946 		{
947 		  max = shuid;
948 		  max_lab = lab;
949 		}
950 	      if (min_align > LABEL_TO_ALIGNMENT (lab))
951 		min_align = LABEL_TO_ALIGNMENT (lab);
952 	    }
953 	  XEXP (pat, 2) = gen_rtx_LABEL_REF (VOIDmode, min_lab);
954 	  XEXP (pat, 3) = gen_rtx_LABEL_REF (VOIDmode, max_lab);
955 	  insn_shuid = INSN_SHUID (insn);
956 	  rel = INSN_SHUID (XEXP (XEXP (pat, 0), 0));
957 	  flags.min_align = min_align;
958 	  flags.base_after_vec = rel > insn_shuid;
959 	  flags.min_after_vec  = min > insn_shuid;
960 	  flags.max_after_vec  = max > insn_shuid;
961 	  flags.min_after_base = min > rel;
962 	  flags.max_after_base = max > rel;
963 	  ADDR_DIFF_VEC_FLAGS (pat) = flags;
964 	}
965     }
966 #endif /* CASE_VECTOR_SHORTEN_MODE */
967 
968   /* Compute initial lengths, addresses, and varying flags for each insn.  */
969   for (insn_current_address = 0, insn = first;
970        insn != 0;
971        insn_current_address += insn_lengths[uid], insn = NEXT_INSN (insn))
972     {
973       uid = INSN_UID (insn);
974 
975       insn_lengths[uid] = 0;
976 
977       if (GET_CODE (insn) == CODE_LABEL)
978 	{
979 	  int log = LABEL_TO_ALIGNMENT (insn);
980 	  if (log)
981 	    {
982 	      int align = 1 << log;
983 	      int new_address = (insn_current_address + align - 1) & -align;
984 	      insn_lengths[uid] = new_address - insn_current_address;
985 	    }
986 	}
987 
988       INSN_ADDRESSES (uid) = insn_current_address + insn_lengths[uid];
989 
990       if (GET_CODE (insn) == NOTE || GET_CODE (insn) == BARRIER
991 	  || GET_CODE (insn) == CODE_LABEL)
992 	continue;
993       if (INSN_DELETED_P (insn))
994 	continue;
995 
996       body = PATTERN (insn);
997       if (GET_CODE (body) == ADDR_VEC || GET_CODE (body) == ADDR_DIFF_VEC)
998 	{
999 	  /* This only takes room if read-only data goes into the text
1000 	     section.  */
1001 	  if (JUMP_TABLES_IN_TEXT_SECTION || !HAVE_READONLY_DATA_SECTION)
1002 	    insn_lengths[uid] = (XVECLEN (body,
1003 					  GET_CODE (body) == ADDR_DIFF_VEC)
1004 				 * GET_MODE_SIZE (GET_MODE (body)));
1005 	  /* Alignment is handled by ADDR_VEC_ALIGN.  */
1006 	}
1007       else if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0)
1008 	insn_lengths[uid] = asm_insn_count (body) * insn_default_length (insn);
1009       else if (GET_CODE (body) == SEQUENCE)
1010 	{
1011 	  int i;
1012 	  int const_delay_slots;
1013 #ifdef DELAY_SLOTS
1014 	  const_delay_slots = const_num_delay_slots (XVECEXP (body, 0, 0));
1015 #else
1016 	  const_delay_slots = 0;
1017 #endif
1018 	  /* Inside a delay slot sequence, we do not do any branch shortening
1019 	     if the shortening could change the number of delay slots
1020 	     of the branch.  */
1021 	  for (i = 0; i < XVECLEN (body, 0); i++)
1022 	    {
1023 	      rtx inner_insn = XVECEXP (body, 0, i);
1024 	      int inner_uid = INSN_UID (inner_insn);
1025 	      int inner_length;
1026 
1027 	      if (GET_CODE (body) == ASM_INPUT
1028 		  || asm_noperands (PATTERN (XVECEXP (body, 0, i))) >= 0)
1029 		inner_length = (asm_insn_count (PATTERN (inner_insn))
1030 				* insn_default_length (inner_insn));
1031 	      else
1032 		inner_length = insn_default_length (inner_insn);
1033 
1034 	      insn_lengths[inner_uid] = inner_length;
1035 	      if (const_delay_slots)
1036 		{
1037 		  if ((varying_length[inner_uid]
1038 		       = insn_variable_length_p (inner_insn)) != 0)
1039 		    varying_length[uid] = 1;
1040 		  INSN_ADDRESSES (inner_uid) = (insn_current_address
1041 						+ insn_lengths[uid]);
1042 		}
1043 	      else
1044 		varying_length[inner_uid] = 0;
1045 	      insn_lengths[uid] += inner_length;
1046 	    }
1047 	}
1048       else if (GET_CODE (body) != USE && GET_CODE (body) != CLOBBER)
1049 	{
1050 	  insn_lengths[uid] = insn_default_length (insn);
1051 	  varying_length[uid] = insn_variable_length_p (insn);
1052 	}
1053 
1054       /* If needed, do any adjustment.  */
1055 #ifdef ADJUST_INSN_LENGTH
1056       ADJUST_INSN_LENGTH (insn, insn_lengths[uid]);
1057       if (insn_lengths[uid] < 0)
1058 	fatal_insn ("negative insn length", insn);
1059 #endif
1060     }
1061 
1062   /* Now loop over all the insns finding varying length insns.  For each,
1063      get the current insn length.  If it has changed, reflect the change.
1064      When nothing changes for a full pass, we are done.  */
1065 
1066   while (something_changed)
1067     {
1068       something_changed = 0;
1069       insn_current_align = MAX_CODE_ALIGN - 1;
1070       for (insn_current_address = 0, insn = first;
1071 	   insn != 0;
1072 	   insn = NEXT_INSN (insn))
1073 	{
1074 	  int new_length;
1075 #ifdef ADJUST_INSN_LENGTH
1076 	  int tmp_length;
1077 #endif
1078 	  int length_align;
1079 
1080 	  uid = INSN_UID (insn);
1081 
1082 	  if (GET_CODE (insn) == CODE_LABEL)
1083 	    {
1084 	      int log = LABEL_TO_ALIGNMENT (insn);
1085 	      if (log > insn_current_align)
1086 		{
1087 		  int align = 1 << log;
1088 		  int new_address= (insn_current_address + align - 1) & -align;
1089 		  insn_lengths[uid] = new_address - insn_current_address;
1090 		  insn_current_align = log;
1091 		  insn_current_address = new_address;
1092 		}
1093 	      else
1094 		insn_lengths[uid] = 0;
1095 	      INSN_ADDRESSES (uid) = insn_current_address;
1096 	      continue;
1097 	    }
1098 
1099 	  length_align = INSN_LENGTH_ALIGNMENT (insn);
1100 	  if (length_align < insn_current_align)
1101 	    insn_current_align = length_align;
1102 
1103 	  insn_last_address = INSN_ADDRESSES (uid);
1104 	  INSN_ADDRESSES (uid) = insn_current_address;
1105 
1106 #ifdef CASE_VECTOR_SHORTEN_MODE
1107 	  if (optimize && GET_CODE (insn) == JUMP_INSN
1108 	      && GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
1109 	    {
1110 	      rtx body = PATTERN (insn);
1111 	      int old_length = insn_lengths[uid];
1112 	      rtx rel_lab = XEXP (XEXP (body, 0), 0);
1113 	      rtx min_lab = XEXP (XEXP (body, 2), 0);
1114 	      rtx max_lab = XEXP (XEXP (body, 3), 0);
1115 	      int rel_addr = INSN_ADDRESSES (INSN_UID (rel_lab));
1116 	      int min_addr = INSN_ADDRESSES (INSN_UID (min_lab));
1117 	      int max_addr = INSN_ADDRESSES (INSN_UID (max_lab));
1118 	      rtx prev;
1119 	      int rel_align = 0;
1120 	      addr_diff_vec_flags flags;
1121 
1122 	      /* Avoid automatic aggregate initialization.  */
1123 	      flags = ADDR_DIFF_VEC_FLAGS (body);
1124 
1125 	      /* Try to find a known alignment for rel_lab.  */
1126 	      for (prev = rel_lab;
1127 		   prev
1128 		   && ! insn_lengths[INSN_UID (prev)]
1129 		   && ! (varying_length[INSN_UID (prev)] & 1);
1130 		   prev = PREV_INSN (prev))
1131 		if (varying_length[INSN_UID (prev)] & 2)
1132 		  {
1133 		    rel_align = LABEL_TO_ALIGNMENT (prev);
1134 		    break;
1135 		  }
1136 
1137 	      /* See the comment on addr_diff_vec_flags in rtl.h for the
1138 		 meaning of the flags values.  base: REL_LAB   vec: INSN  */
1139 	      /* Anything after INSN has still addresses from the last
1140 		 pass; adjust these so that they reflect our current
1141 		 estimate for this pass.  */
1142 	      if (flags.base_after_vec)
1143 		rel_addr += insn_current_address - insn_last_address;
1144 	      if (flags.min_after_vec)
1145 		min_addr += insn_current_address - insn_last_address;
1146 	      if (flags.max_after_vec)
1147 		max_addr += insn_current_address - insn_last_address;
1148 	      /* We want to know the worst case, i.e. lowest possible value
1149 		 for the offset of MIN_LAB.  If MIN_LAB is after REL_LAB,
1150 		 its offset is positive, and we have to be wary of code shrink;
1151 		 otherwise, it is negative, and we have to be vary of code
1152 		 size increase.  */
1153 	      if (flags.min_after_base)
1154 		{
1155 		  /* If INSN is between REL_LAB and MIN_LAB, the size
1156 		     changes we are about to make can change the alignment
1157 		     within the observed offset, therefore we have to break
1158 		     it up into two parts that are independent.  */
1159 		  if (! flags.base_after_vec && flags.min_after_vec)
1160 		    {
1161 		      min_addr -= align_fuzz (rel_lab, insn, rel_align, 0);
1162 		      min_addr -= align_fuzz (insn, min_lab, 0, 0);
1163 		    }
1164 		  else
1165 		    min_addr -= align_fuzz (rel_lab, min_lab, rel_align, 0);
1166 		}
1167 	      else
1168 		{
1169 		  if (flags.base_after_vec && ! flags.min_after_vec)
1170 		    {
1171 		      min_addr -= align_fuzz (min_lab, insn, 0, ~0);
1172 		      min_addr -= align_fuzz (insn, rel_lab, 0, ~0);
1173 		    }
1174 		  else
1175 		    min_addr -= align_fuzz (min_lab, rel_lab, 0, ~0);
1176 		}
1177 	      /* Likewise, determine the highest lowest possible value
1178 		 for the offset of MAX_LAB.  */
1179 	      if (flags.max_after_base)
1180 		{
1181 		  if (! flags.base_after_vec && flags.max_after_vec)
1182 		    {
1183 		      max_addr += align_fuzz (rel_lab, insn, rel_align, ~0);
1184 		      max_addr += align_fuzz (insn, max_lab, 0, ~0);
1185 		    }
1186 		  else
1187 		    max_addr += align_fuzz (rel_lab, max_lab, rel_align, ~0);
1188 		}
1189 	      else
1190 		{
1191 		  if (flags.base_after_vec && ! flags.max_after_vec)
1192 		    {
1193 		      max_addr += align_fuzz (max_lab, insn, 0, 0);
1194 		      max_addr += align_fuzz (insn, rel_lab, 0, 0);
1195 		    }
1196 		  else
1197 		    max_addr += align_fuzz (max_lab, rel_lab, 0, 0);
1198 		}
1199 	      PUT_MODE (body, CASE_VECTOR_SHORTEN_MODE (min_addr - rel_addr,
1200 							max_addr - rel_addr,
1201 							body));
1202 	      if (JUMP_TABLES_IN_TEXT_SECTION || !HAVE_READONLY_DATA_SECTION)
1203 		{
1204 		  insn_lengths[uid]
1205 		    = (XVECLEN (body, 1) * GET_MODE_SIZE (GET_MODE (body)));
1206 		  insn_current_address += insn_lengths[uid];
1207 		  if (insn_lengths[uid] != old_length)
1208 		    something_changed = 1;
1209 		}
1210 
1211 	      continue;
1212 	    }
1213 #endif /* CASE_VECTOR_SHORTEN_MODE */
1214 
1215 	  if (! (varying_length[uid]))
1216 	    {
1217 	      if (GET_CODE (insn) == INSN
1218 		  && GET_CODE (PATTERN (insn)) == SEQUENCE)
1219 		{
1220 		  int i;
1221 
1222 		  body = PATTERN (insn);
1223 		  for (i = 0; i < XVECLEN (body, 0); i++)
1224 		    {
1225 		      rtx inner_insn = XVECEXP (body, 0, i);
1226 		      int inner_uid = INSN_UID (inner_insn);
1227 
1228 		      INSN_ADDRESSES (inner_uid) = insn_current_address;
1229 
1230 		      insn_current_address += insn_lengths[inner_uid];
1231 		    }
1232 		}
1233 	      else
1234 		insn_current_address += insn_lengths[uid];
1235 
1236 	      continue;
1237 	    }
1238 
1239 	  if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
1240 	    {
1241 	      int i;
1242 
1243 	      body = PATTERN (insn);
1244 	      new_length = 0;
1245 	      for (i = 0; i < XVECLEN (body, 0); i++)
1246 		{
1247 		  rtx inner_insn = XVECEXP (body, 0, i);
1248 		  int inner_uid = INSN_UID (inner_insn);
1249 		  int inner_length;
1250 
1251 		  INSN_ADDRESSES (inner_uid) = insn_current_address;
1252 
1253 		  /* insn_current_length returns 0 for insns with a
1254 		     non-varying length.  */
1255 		  if (! varying_length[inner_uid])
1256 		    inner_length = insn_lengths[inner_uid];
1257 		  else
1258 		    inner_length = insn_current_length (inner_insn);
1259 
1260 		  if (inner_length != insn_lengths[inner_uid])
1261 		    {
1262 		      insn_lengths[inner_uid] = inner_length;
1263 		      something_changed = 1;
1264 		    }
1265 		  insn_current_address += insn_lengths[inner_uid];
1266 		  new_length += inner_length;
1267 		}
1268 	    }
1269 	  else
1270 	    {
1271 	      new_length = insn_current_length (insn);
1272 	      insn_current_address += new_length;
1273 	    }
1274 
1275 #ifdef ADJUST_INSN_LENGTH
1276 	  /* If needed, do any adjustment.  */
1277 	  tmp_length = new_length;
1278 	  ADJUST_INSN_LENGTH (insn, new_length);
1279 	  insn_current_address += (new_length - tmp_length);
1280 #endif
1281 
1282 	  if (new_length != insn_lengths[uid])
1283 	    {
1284 	      insn_lengths[uid] = new_length;
1285 	      something_changed = 1;
1286 	    }
1287 	}
1288       /* For a non-optimizing compile, do only a single pass.  */
1289       if (!optimize)
1290 	break;
1291     }
1292 
1293   free (varying_length);
1294 
1295 #endif /* HAVE_ATTR_length */
1296 }
1297 
1298 #ifdef HAVE_ATTR_length
1299 /* Given the body of an INSN known to be generated by an ASM statement, return
1300    the number of machine instructions likely to be generated for this insn.
1301    This is used to compute its length.  */
1302 
1303 static int
asm_insn_count(rtx body)1304 asm_insn_count (rtx body)
1305 {
1306   const char *template;
1307   int count = 1;
1308 
1309   if (GET_CODE (body) == ASM_INPUT)
1310     template = XSTR (body, 0);
1311   else
1312     template = decode_asm_operands (body, NULL, NULL, NULL, NULL);
1313 
1314   for (; *template; template++)
1315     if (IS_ASM_LOGICAL_LINE_SEPARATOR (*template) || *template == '\n')
1316       count++;
1317 
1318   return count;
1319 }
1320 #endif
1321 
1322 /* Output assembler code for the start of a function,
1323    and initialize some of the variables in this file
1324    for the new function.  The label for the function and associated
1325    assembler pseudo-ops have already been output in `assemble_start_function'.
1326 
1327    FIRST is the first insn of the rtl for the function being compiled.
1328    FILE is the file to write assembler code to.
1329    OPTIMIZE is nonzero if we should eliminate redundant
1330      test and compare insns.  */
1331 
1332 void
final_start_function(rtx first ATTRIBUTE_UNUSED,FILE * file,int optimize ATTRIBUTE_UNUSED)1333 final_start_function (rtx first ATTRIBUTE_UNUSED, FILE *file,
1334 		      int optimize ATTRIBUTE_UNUSED)
1335 {
1336   block_depth = 0;
1337 
1338   this_is_asm_operands = 0;
1339 
1340   last_filename = locator_file (prologue_locator);
1341   last_linenum = locator_line (prologue_locator);
1342 
1343   high_block_linenum = high_function_linenum = last_linenum;
1344 
1345   (*debug_hooks->begin_prologue) (last_linenum, last_filename);
1346 
1347 #if defined (DWARF2_UNWIND_INFO) || defined (IA64_UNWIND_INFO)
1348   if (write_symbols != DWARF2_DEBUG && write_symbols != VMS_AND_DWARF2_DEBUG)
1349     dwarf2out_begin_prologue (0, NULL);
1350 #endif
1351 
1352 #ifdef LEAF_REG_REMAP
1353   if (current_function_uses_only_leaf_regs)
1354     leaf_renumber_regs (first);
1355 #endif
1356 
1357   /* The Sun386i and perhaps other machines don't work right
1358      if the profiling code comes after the prologue.  */
1359 #ifdef PROFILE_BEFORE_PROLOGUE
1360   if (current_function_profile)
1361     profile_function (file);
1362 #endif /* PROFILE_BEFORE_PROLOGUE */
1363 
1364 #if defined (DWARF2_UNWIND_INFO) && defined (HAVE_prologue)
1365   if (dwarf2out_do_frame ())
1366     dwarf2out_frame_debug (NULL_RTX);
1367 #endif
1368 
1369   /* If debugging, assign block numbers to all of the blocks in this
1370      function.  */
1371   if (write_symbols)
1372     {
1373       remove_unnecessary_notes ();
1374       reemit_insn_block_notes ();
1375       number_blocks (current_function_decl);
1376       /* We never actually put out begin/end notes for the top-level
1377 	 block in the function.  But, conceptually, that block is
1378 	 always needed.  */
1379       TREE_ASM_WRITTEN (DECL_INITIAL (current_function_decl)) = 1;
1380     }
1381 
1382   /* First output the function prologue: code to set up the stack frame.  */
1383   (*targetm.asm_out.function_prologue) (file, get_frame_size ());
1384 
1385   /* If the machine represents the prologue as RTL, the profiling code must
1386      be emitted when NOTE_INSN_PROLOGUE_END is scanned.  */
1387 #ifdef HAVE_prologue
1388   if (! HAVE_prologue)
1389 #endif
1390     profile_after_prologue (file);
1391 }
1392 
1393 static void
profile_after_prologue(FILE * file ATTRIBUTE_UNUSED)1394 profile_after_prologue (FILE *file ATTRIBUTE_UNUSED)
1395 {
1396 #ifndef PROFILE_BEFORE_PROLOGUE
1397   if (current_function_profile)
1398     profile_function (file);
1399 #endif /* not PROFILE_BEFORE_PROLOGUE */
1400 }
1401 
1402 static void
profile_function(FILE * file ATTRIBUTE_UNUSED)1403 profile_function (FILE *file ATTRIBUTE_UNUSED)
1404 {
1405 #ifndef NO_PROFILE_COUNTERS
1406 # define NO_PROFILE_COUNTERS	0
1407 #endif
1408 #if defined(ASM_OUTPUT_REG_PUSH)
1409   int sval = current_function_returns_struct;
1410   rtx svrtx = targetm.calls.struct_value_rtx (TREE_TYPE (current_function_decl), 1);
1411 #if defined(STATIC_CHAIN_INCOMING_REGNUM) || defined(STATIC_CHAIN_REGNUM)
1412   int cxt = current_function_needs_context;
1413 #endif
1414 #endif /* ASM_OUTPUT_REG_PUSH */
1415 
1416   if (! NO_PROFILE_COUNTERS)
1417     {
1418       int align = MIN (BIGGEST_ALIGNMENT, LONG_TYPE_SIZE);
1419       data_section ();
1420       ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
1421       (*targetm.asm_out.internal_label) (file, "LP", current_function_funcdef_no);
1422       assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, align, 1);
1423     }
1424 
1425   function_section (current_function_decl);
1426 
1427 #if defined(ASM_OUTPUT_REG_PUSH)
1428   if (sval && svrtx != NULL_RTX && GET_CODE (svrtx) == REG)
1429     ASM_OUTPUT_REG_PUSH (file, REGNO (svrtx));
1430 #endif
1431 
1432 #if defined(STATIC_CHAIN_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
1433   if (cxt)
1434     ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_INCOMING_REGNUM);
1435 #else
1436 #if defined(STATIC_CHAIN_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
1437   if (cxt)
1438     {
1439       ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_REGNUM);
1440     }
1441 #endif
1442 #endif
1443 
1444   FUNCTION_PROFILER (file, current_function_funcdef_no);
1445 
1446 #if defined(STATIC_CHAIN_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
1447   if (cxt)
1448     ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_INCOMING_REGNUM);
1449 #else
1450 #if defined(STATIC_CHAIN_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
1451   if (cxt)
1452     {
1453       ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_REGNUM);
1454     }
1455 #endif
1456 #endif
1457 
1458 #if defined(ASM_OUTPUT_REG_PUSH)
1459   if (sval && svrtx != NULL_RTX && GET_CODE (svrtx) == REG)
1460     ASM_OUTPUT_REG_POP (file, REGNO (svrtx));
1461 #endif
1462 }
1463 
1464 /* Output assembler code for the end of a function.
1465    For clarity, args are same as those of `final_start_function'
1466    even though not all of them are needed.  */
1467 
1468 void
final_end_function(void)1469 final_end_function (void)
1470 {
1471   app_disable ();
1472 
1473   (*debug_hooks->end_function) (high_function_linenum);
1474 
1475   /* Finally, output the function epilogue:
1476      code to restore the stack frame and return to the caller.  */
1477   (*targetm.asm_out.function_epilogue) (asm_out_file, get_frame_size ());
1478 
1479   /* And debug output.  */
1480   (*debug_hooks->end_epilogue) (last_linenum, last_filename);
1481 
1482 #if defined (DWARF2_UNWIND_INFO)
1483   if (write_symbols != DWARF2_DEBUG && write_symbols != VMS_AND_DWARF2_DEBUG
1484       && dwarf2out_do_frame ())
1485     dwarf2out_end_epilogue (last_linenum, last_filename);
1486 #endif
1487 }
1488 
1489 /* Output assembler code for some insns: all or part of a function.
1490    For description of args, see `final_start_function', above.
1491 
1492    PRESCAN is 1 if we are not really outputting,
1493      just scanning as if we were outputting.
1494    Prescanning deletes and rearranges insns just like ordinary output.
1495    PRESCAN is -2 if we are outputting after having prescanned.
1496    In this case, don't try to delete or rearrange insns
1497    because that has already been done.
1498    Prescanning is done only on certain machines.  */
1499 
1500 void
final(rtx first,FILE * file,int optimize,int prescan)1501 final (rtx first, FILE *file, int optimize, int prescan)
1502 {
1503   rtx insn;
1504   int max_uid = 0;
1505   int seen = 0;
1506 
1507   last_ignored_compare = 0;
1508 
1509 #ifdef SDB_DEBUGGING_INFO
1510   /* When producing SDB debugging info, delete troublesome line number
1511      notes from inlined functions in other files as well as duplicate
1512      line number notes.  */
1513   if (write_symbols == SDB_DEBUG)
1514     {
1515       rtx last = 0;
1516       for (insn = first; insn; insn = NEXT_INSN (insn))
1517 	if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
1518 	  {
1519 	    if ((RTX_INTEGRATED_P (insn)
1520 		 && strcmp (NOTE_SOURCE_FILE (insn), main_input_filename) != 0)
1521 		|| (last != 0
1522 		    && NOTE_LINE_NUMBER (insn) == NOTE_LINE_NUMBER (last)
1523 		    && NOTE_SOURCE_FILE (insn) == NOTE_SOURCE_FILE (last)))
1524 	      {
1525 		delete_insn (insn);	/* Use delete_note.  */
1526 		continue;
1527 	      }
1528 	    last = insn;
1529 	  }
1530     }
1531 #endif
1532 
1533   for (insn = first; insn; insn = NEXT_INSN (insn))
1534     {
1535       if (INSN_UID (insn) > max_uid)       /* Find largest UID.  */
1536 	max_uid = INSN_UID (insn);
1537 #ifdef HAVE_cc0
1538       /* If CC tracking across branches is enabled, record the insn which
1539 	 jumps to each branch only reached from one place.  */
1540       if (optimize && GET_CODE (insn) == JUMP_INSN)
1541 	{
1542 	  rtx lab = JUMP_LABEL (insn);
1543 	  if (lab && LABEL_NUSES (lab) == 1)
1544 	    {
1545 	      LABEL_REFS (lab) = insn;
1546 	    }
1547 	}
1548 #endif
1549     }
1550 
1551   init_recog ();
1552 
1553   CC_STATUS_INIT;
1554 
1555   /* Output the insns.  */
1556   for (insn = NEXT_INSN (first); insn;)
1557     {
1558 #ifdef HAVE_ATTR_length
1559       if ((unsigned) INSN_UID (insn) >= INSN_ADDRESSES_SIZE ())
1560 	{
1561 	  /* This can be triggered by bugs elsewhere in the compiler if
1562 	     new insns are created after init_insn_lengths is called.  */
1563 	  if (GET_CODE (insn) == NOTE)
1564 	    insn_current_address = -1;
1565 	  else
1566 	    abort ();
1567 	}
1568       else
1569 	insn_current_address = INSN_ADDRESSES (INSN_UID (insn));
1570 #endif /* HAVE_ATTR_length */
1571 
1572       insn = final_scan_insn (insn, file, optimize, prescan, 0, &seen);
1573     }
1574 }
1575 
1576 const char *
get_insn_template(int code,rtx insn)1577 get_insn_template (int code, rtx insn)
1578 {
1579   switch (insn_data[code].output_format)
1580     {
1581     case INSN_OUTPUT_FORMAT_SINGLE:
1582       return insn_data[code].output.single;
1583     case INSN_OUTPUT_FORMAT_MULTI:
1584       return insn_data[code].output.multi[which_alternative];
1585     case INSN_OUTPUT_FORMAT_FUNCTION:
1586       if (insn == NULL)
1587 	abort ();
1588       return (*insn_data[code].output.function) (recog_data.operand, insn);
1589 
1590     default:
1591       abort ();
1592     }
1593 }
1594 
1595 /* Emit the appropriate declaration for an alternate-entry-point
1596    symbol represented by INSN, to FILE.  INSN is a CODE_LABEL with
1597    LABEL_KIND != LABEL_NORMAL.
1598 
1599    The case fall-through in this function is intentional.  */
1600 static void
output_alternate_entry_point(FILE * file,rtx insn)1601 output_alternate_entry_point (FILE *file, rtx insn)
1602 {
1603   const char *name = LABEL_NAME (insn);
1604 
1605   switch (LABEL_KIND (insn))
1606     {
1607     case LABEL_WEAK_ENTRY:
1608 #ifdef ASM_WEAKEN_LABEL
1609       ASM_WEAKEN_LABEL (file, name);
1610 #endif
1611     case LABEL_GLOBAL_ENTRY:
1612       (*targetm.asm_out.globalize_label) (file, name);
1613     case LABEL_STATIC_ENTRY:
1614 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
1615       ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
1616 #endif
1617       ASM_OUTPUT_LABEL (file, name);
1618       break;
1619 
1620     case LABEL_NORMAL:
1621     default:
1622       abort ();
1623     }
1624 }
1625 
1626 /* The final scan for one insn, INSN.
1627    Args are same as in `final', except that INSN
1628    is the insn being scanned.
1629    Value returned is the next insn to be scanned.
1630 
1631    NOPEEPHOLES is the flag to disallow peephole processing (currently
1632    used for within delayed branch sequence output).
1633 
1634    SEEN is used to track the end of the prologue, for emitting
1635    debug information.  We force the emission of a line note after
1636    both NOTE_INSN_PROLOGUE_END and NOTE_INSN_FUNCTION_BEG, or
1637    at the beginning of the second basic block, whichever comes
1638    first.  */
1639 
1640 rtx
final_scan_insn(rtx insn,FILE * file,int optimize ATTRIBUTE_UNUSED,int prescan,int nopeepholes ATTRIBUTE_UNUSED,int * seen)1641 final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED,
1642 		 int prescan, int nopeepholes ATTRIBUTE_UNUSED,
1643 		 int *seen)
1644 {
1645 #ifdef HAVE_cc0
1646   rtx set;
1647 #endif
1648 
1649   insn_counter++;
1650 
1651   /* Ignore deleted insns.  These can occur when we split insns (due to a
1652      template of "#") while not optimizing.  */
1653   if (INSN_DELETED_P (insn))
1654     return NEXT_INSN (insn);
1655 
1656   switch (GET_CODE (insn))
1657     {
1658     case NOTE:
1659       if (prescan > 0)
1660 	break;
1661 
1662       switch (NOTE_LINE_NUMBER (insn))
1663 	{
1664 	case NOTE_INSN_DELETED:
1665 	case NOTE_INSN_LOOP_BEG:
1666 	case NOTE_INSN_LOOP_END:
1667 	case NOTE_INSN_LOOP_END_TOP_COND:
1668 	case NOTE_INSN_LOOP_CONT:
1669 	case NOTE_INSN_LOOP_VTOP:
1670 	case NOTE_INSN_FUNCTION_END:
1671 	case NOTE_INSN_REPEATED_LINE_NUMBER:
1672 	case NOTE_INSN_EXPECTED_VALUE:
1673 	  break;
1674 
1675 	case NOTE_INSN_BASIC_BLOCK:
1676 #ifdef IA64_UNWIND_INFO
1677 	  IA64_UNWIND_EMIT (asm_out_file, insn);
1678 #endif
1679 	  if (flag_debug_asm)
1680 	    fprintf (asm_out_file, "\t%s basic block %d\n",
1681 		     ASM_COMMENT_START, NOTE_BASIC_BLOCK (insn)->index);
1682 
1683 	  if ((*seen & (SEEN_EMITTED | SEEN_BB)) == SEEN_BB)
1684 	    {
1685 	      *seen |= SEEN_EMITTED;
1686 	      last_filename = NULL;
1687 	    }
1688 	  else
1689 	    *seen |= SEEN_BB;
1690 
1691 	  break;
1692 
1693 	case NOTE_INSN_EH_REGION_BEG:
1694 	  ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LEHB",
1695 				  NOTE_EH_HANDLER (insn));
1696 	  break;
1697 
1698 	case NOTE_INSN_EH_REGION_END:
1699 	  ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LEHE",
1700 				  NOTE_EH_HANDLER (insn));
1701 	  break;
1702 
1703 	case NOTE_INSN_PROLOGUE_END:
1704 	  (*targetm.asm_out.function_end_prologue) (file);
1705 	  profile_after_prologue (file);
1706 
1707 	  if ((*seen & (SEEN_EMITTED | SEEN_NOTE)) == SEEN_NOTE)
1708 	    {
1709 	      *seen |= SEEN_EMITTED;
1710 	      last_filename = NULL;
1711 	    }
1712 	  else
1713 	    *seen |= SEEN_NOTE;
1714 
1715 	  break;
1716 
1717 	case NOTE_INSN_EPILOGUE_BEG:
1718 	  (*targetm.asm_out.function_begin_epilogue) (file);
1719 	  break;
1720 
1721 	case NOTE_INSN_FUNCTION_BEG:
1722 	  app_disable ();
1723 	  (*debug_hooks->end_prologue) (last_linenum, last_filename);
1724 
1725 	  if ((*seen & (SEEN_EMITTED | SEEN_NOTE)) == SEEN_NOTE)
1726 	    {
1727 	      *seen |= SEEN_EMITTED;
1728 	      last_filename = NULL;
1729 	    }
1730 	  else
1731 	    *seen |= SEEN_NOTE;
1732 
1733 	  break;
1734 
1735 	case NOTE_INSN_BLOCK_BEG:
1736 	  if (debug_info_level == DINFO_LEVEL_NORMAL
1737 	      || debug_info_level == DINFO_LEVEL_VERBOSE
1738 	      || write_symbols == DWARF_DEBUG
1739 	      || write_symbols == DWARF2_DEBUG
1740 	      || write_symbols == VMS_AND_DWARF2_DEBUG
1741 	      || write_symbols == VMS_DEBUG)
1742 	    {
1743 	      int n = BLOCK_NUMBER (NOTE_BLOCK (insn));
1744 
1745 	      app_disable ();
1746 	      ++block_depth;
1747 	      high_block_linenum = last_linenum;
1748 
1749 	      /* Output debugging info about the symbol-block beginning.  */
1750 	      (*debug_hooks->begin_block) (last_linenum, n);
1751 
1752 	      /* Mark this block as output.  */
1753 	      TREE_ASM_WRITTEN (NOTE_BLOCK (insn)) = 1;
1754 	    }
1755 	  break;
1756 
1757 	case NOTE_INSN_BLOCK_END:
1758 	  if (debug_info_level == DINFO_LEVEL_NORMAL
1759 	      || debug_info_level == DINFO_LEVEL_VERBOSE
1760 	      || write_symbols == DWARF_DEBUG
1761 	      || write_symbols == DWARF2_DEBUG
1762 	      || write_symbols == VMS_AND_DWARF2_DEBUG
1763 	      || write_symbols == VMS_DEBUG)
1764 	    {
1765 	      int n = BLOCK_NUMBER (NOTE_BLOCK (insn));
1766 
1767 	      app_disable ();
1768 
1769 	      /* End of a symbol-block.  */
1770 	      --block_depth;
1771 	      if (block_depth < 0)
1772 		abort ();
1773 
1774 	      (*debug_hooks->end_block) (high_block_linenum, n);
1775 	    }
1776 	  break;
1777 
1778 	case NOTE_INSN_DELETED_LABEL:
1779 	  /* Emit the label.  We may have deleted the CODE_LABEL because
1780 	     the label could be proved to be unreachable, though still
1781 	     referenced (in the form of having its address taken.  */
1782 	  ASM_OUTPUT_DEBUG_LABEL (file, "L", CODE_LABEL_NUMBER (insn));
1783 	  break;
1784 
1785 	case 0:
1786 	  break;
1787 
1788 	default:
1789 	  if (NOTE_LINE_NUMBER (insn) <= 0)
1790 	    abort ();
1791 	  break;
1792 	}
1793       break;
1794 
1795     case BARRIER:
1796 #if defined (DWARF2_UNWIND_INFO)
1797       if (dwarf2out_do_frame ())
1798 	dwarf2out_frame_debug (insn);
1799 #endif
1800       break;
1801 
1802     case CODE_LABEL:
1803       /* The target port might emit labels in the output function for
1804 	 some insn, e.g. sh.c output_branchy_insn.  */
1805       if (CODE_LABEL_NUMBER (insn) <= max_labelno)
1806 	{
1807 	  int align = LABEL_TO_ALIGNMENT (insn);
1808 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1809 	  int max_skip = LABEL_TO_MAX_SKIP (insn);
1810 #endif
1811 
1812 	  if (align && NEXT_INSN (insn))
1813 	    {
1814 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1815 	      ASM_OUTPUT_MAX_SKIP_ALIGN (file, align, max_skip);
1816 #else
1817 #ifdef ASM_OUTPUT_ALIGN_WITH_NOP
1818               ASM_OUTPUT_ALIGN_WITH_NOP (file, align);
1819 #else
1820 	      ASM_OUTPUT_ALIGN (file, align);
1821 #endif
1822 #endif
1823 	    }
1824 	}
1825 #ifdef HAVE_cc0
1826       CC_STATUS_INIT;
1827       /* If this label is reached from only one place, set the condition
1828 	 codes from the instruction just before the branch.  */
1829 
1830       /* Disabled because some insns set cc_status in the C output code
1831 	 and NOTICE_UPDATE_CC alone can set incorrect status.  */
1832       if (0 /* optimize && LABEL_NUSES (insn) == 1*/)
1833 	{
1834 	  rtx jump = LABEL_REFS (insn);
1835 	  rtx barrier = prev_nonnote_insn (insn);
1836 	  rtx prev;
1837 	  /* If the LABEL_REFS field of this label has been set to point
1838 	     at a branch, the predecessor of the branch is a regular
1839 	     insn, and that branch is the only way to reach this label,
1840 	     set the condition codes based on the branch and its
1841 	     predecessor.  */
1842 	  if (barrier && GET_CODE (barrier) == BARRIER
1843 	      && jump && GET_CODE (jump) == JUMP_INSN
1844 	      && (prev = prev_nonnote_insn (jump))
1845 	      && GET_CODE (prev) == INSN)
1846 	    {
1847 	      NOTICE_UPDATE_CC (PATTERN (prev), prev);
1848 	      NOTICE_UPDATE_CC (PATTERN (jump), jump);
1849 	    }
1850 	}
1851 #endif
1852       if (prescan > 0)
1853 	break;
1854 
1855       if (LABEL_NAME (insn))
1856 	(*debug_hooks->label) (insn);
1857 
1858       if (app_on)
1859 	{
1860 	  fputs (ASM_APP_OFF, file);
1861 	  app_on = 0;
1862 	}
1863       if (NEXT_INSN (insn) != 0
1864 	  && GET_CODE (NEXT_INSN (insn)) == JUMP_INSN)
1865 	{
1866 	  rtx nextbody = PATTERN (NEXT_INSN (insn));
1867 
1868 	  /* If this label is followed by a jump-table,
1869 	     make sure we put the label in the read-only section.  Also
1870 	     possibly write the label and jump table together.  */
1871 
1872 	  if (GET_CODE (nextbody) == ADDR_VEC
1873 	      || GET_CODE (nextbody) == ADDR_DIFF_VEC)
1874 	    {
1875 #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
1876 	      /* In this case, the case vector is being moved by the
1877 		 target, so don't output the label at all.  Leave that
1878 		 to the back end macros.  */
1879 #else
1880 	      if (! JUMP_TABLES_IN_TEXT_SECTION)
1881 		{
1882 		  int log_align;
1883 
1884 		  readonly_data_section ();
1885 
1886 #ifdef ADDR_VEC_ALIGN
1887 		  log_align = ADDR_VEC_ALIGN (NEXT_INSN (insn));
1888 #else
1889 		  log_align = exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT);
1890 #endif
1891 		  ASM_OUTPUT_ALIGN (file, log_align);
1892 		}
1893 	      else
1894 		function_section (current_function_decl);
1895 
1896 #ifdef ASM_OUTPUT_CASE_LABEL
1897 	      ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn),
1898 				     NEXT_INSN (insn));
1899 #else
1900 	      (*targetm.asm_out.internal_label) (file, "L", CODE_LABEL_NUMBER (insn));
1901 #endif
1902 #endif
1903 	      break;
1904 	    }
1905 	}
1906       if (LABEL_ALT_ENTRY_P (insn))
1907 	output_alternate_entry_point (file, insn);
1908       else
1909 	(*targetm.asm_out.internal_label) (file, "L", CODE_LABEL_NUMBER (insn));
1910       break;
1911 
1912     default:
1913       {
1914 	rtx body = PATTERN (insn);
1915 	int insn_code_number;
1916 	const char *template;
1917 	rtx note;
1918 
1919 	/* An INSN, JUMP_INSN or CALL_INSN.
1920 	   First check for special kinds that recog doesn't recognize.  */
1921 
1922 	if (GET_CODE (body) == USE /* These are just declarations.  */
1923 	    || GET_CODE (body) == CLOBBER)
1924 	  break;
1925 
1926 #ifdef HAVE_cc0
1927 	/* If there is a REG_CC_SETTER note on this insn, it means that
1928 	   the setting of the condition code was done in the delay slot
1929 	   of the insn that branched here.  So recover the cc status
1930 	   from the insn that set it.  */
1931 
1932 	note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
1933 	if (note)
1934 	  {
1935 	    NOTICE_UPDATE_CC (PATTERN (XEXP (note, 0)), XEXP (note, 0));
1936 	    cc_prev_status = cc_status;
1937 	  }
1938 #endif
1939 
1940 	/* Detect insns that are really jump-tables
1941 	   and output them as such.  */
1942 
1943 	if (GET_CODE (body) == ADDR_VEC || GET_CODE (body) == ADDR_DIFF_VEC)
1944 	  {
1945 #if !(defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC))
1946 	    int vlen, idx;
1947 #endif
1948 
1949 	    if (prescan > 0)
1950 	      break;
1951 
1952 	    if (app_on)
1953 	      {
1954 		fputs (ASM_APP_OFF, file);
1955 		app_on = 0;
1956 	      }
1957 
1958 #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
1959 	    if (GET_CODE (body) == ADDR_VEC)
1960 	      {
1961 #ifdef ASM_OUTPUT_ADDR_VEC
1962 		ASM_OUTPUT_ADDR_VEC (PREV_INSN (insn), body);
1963 #else
1964 		abort ();
1965 #endif
1966 	      }
1967 	    else
1968 	      {
1969 #ifdef ASM_OUTPUT_ADDR_DIFF_VEC
1970 		ASM_OUTPUT_ADDR_DIFF_VEC (PREV_INSN (insn), body);
1971 #else
1972 		abort ();
1973 #endif
1974 	      }
1975 #else
1976 	    vlen = XVECLEN (body, GET_CODE (body) == ADDR_DIFF_VEC);
1977 	    for (idx = 0; idx < vlen; idx++)
1978 	      {
1979 		if (GET_CODE (body) == ADDR_VEC)
1980 		  {
1981 #ifdef ASM_OUTPUT_ADDR_VEC_ELT
1982 		    ASM_OUTPUT_ADDR_VEC_ELT
1983 		      (file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
1984 #else
1985 		    abort ();
1986 #endif
1987 		  }
1988 		else
1989 		  {
1990 #ifdef ASM_OUTPUT_ADDR_DIFF_ELT
1991 		    ASM_OUTPUT_ADDR_DIFF_ELT
1992 		      (file,
1993 		       body,
1994 		       CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
1995 		       CODE_LABEL_NUMBER (XEXP (XEXP (body, 0), 0)));
1996 #else
1997 		    abort ();
1998 #endif
1999 		  }
2000 	      }
2001 #ifdef ASM_OUTPUT_CASE_END
2002 	    ASM_OUTPUT_CASE_END (file,
2003 				 CODE_LABEL_NUMBER (PREV_INSN (insn)),
2004 				 insn);
2005 #endif
2006 #endif
2007 
2008 	    function_section (current_function_decl);
2009 
2010 	    break;
2011 	  }
2012 	/* Output this line note if it is the first or the last line
2013 	   note in a row.  */
2014 	if (notice_source_line (insn))
2015 	  {
2016 	    (*debug_hooks->source_line) (last_linenum, last_filename);
2017 	  }
2018 
2019 	if (GET_CODE (body) == ASM_INPUT)
2020 	  {
2021 	    const char *string = XSTR (body, 0);
2022 
2023 	    /* There's no telling what that did to the condition codes.  */
2024 	    CC_STATUS_INIT;
2025 	    if (prescan > 0)
2026 	      break;
2027 
2028 	    if (string[0])
2029 	      {
2030 		if (! app_on)
2031 		  {
2032 		    fputs (ASM_APP_ON, file);
2033 		    app_on = 1;
2034 		  }
2035 		fprintf (asm_out_file, "\t%s\n", string);
2036 	      }
2037 	    break;
2038 	  }
2039 
2040 	/* Detect `asm' construct with operands.  */
2041 	if (asm_noperands (body) >= 0)
2042 	  {
2043 	    unsigned int noperands = asm_noperands (body);
2044 	    rtx *ops = alloca (noperands * sizeof (rtx));
2045 	    const char *string;
2046 
2047 	    /* There's no telling what that did to the condition codes.  */
2048 	    CC_STATUS_INIT;
2049 	    if (prescan > 0)
2050 	      break;
2051 
2052 	    /* Get out the operand values.  */
2053 	    string = decode_asm_operands (body, ops, NULL, NULL, NULL);
2054 	    /* Inhibit aborts on what would otherwise be compiler bugs.  */
2055 	    insn_noperands = noperands;
2056 	    this_is_asm_operands = insn;
2057 
2058 #ifdef FINAL_PRESCAN_INSN
2059 	    FINAL_PRESCAN_INSN (insn, ops, insn_noperands);
2060 #endif
2061 
2062 	    /* Output the insn using them.  */
2063 	    if (string[0])
2064 	      {
2065 		if (! app_on)
2066 		  {
2067 		    fputs (ASM_APP_ON, file);
2068 		    app_on = 1;
2069 		  }
2070 	        output_asm_insn (string, ops);
2071 	      }
2072 
2073 	    this_is_asm_operands = 0;
2074 	    break;
2075 	  }
2076 
2077 	if (prescan <= 0 && app_on)
2078 	  {
2079 	    fputs (ASM_APP_OFF, file);
2080 	    app_on = 0;
2081 	  }
2082 
2083 	if (GET_CODE (body) == SEQUENCE)
2084 	  {
2085 	    /* A delayed-branch sequence */
2086 	    int i;
2087 	    rtx next;
2088 
2089 	    if (prescan > 0)
2090 	      break;
2091 	    final_sequence = body;
2092 
2093 	    /* Record the delay slots' frame information before the branch.
2094 	       This is needed for delayed calls: see execute_cfa_program().  */
2095 #if defined (DWARF2_UNWIND_INFO)
2096 	    if (dwarf2out_do_frame ())
2097 	      for (i = 1; i < XVECLEN (body, 0); i++)
2098 		dwarf2out_frame_debug (XVECEXP (body, 0, i));
2099 #endif
2100 
2101 	    /* The first insn in this SEQUENCE might be a JUMP_INSN that will
2102 	       force the restoration of a comparison that was previously
2103 	       thought unnecessary.  If that happens, cancel this sequence
2104 	       and cause that insn to be restored.  */
2105 
2106 	    next = final_scan_insn (XVECEXP (body, 0, 0), file, 0, prescan, 1, seen);
2107 	    if (next != XVECEXP (body, 0, 1))
2108 	      {
2109 		final_sequence = 0;
2110 		return next;
2111 	      }
2112 
2113 	    for (i = 1; i < XVECLEN (body, 0); i++)
2114 	      {
2115 		rtx insn = XVECEXP (body, 0, i);
2116 		rtx next = NEXT_INSN (insn);
2117 		/* We loop in case any instruction in a delay slot gets
2118 		   split.  */
2119 		do
2120 		  insn = final_scan_insn (insn, file, 0, prescan, 1, seen);
2121 		while (insn != next);
2122 	      }
2123 #ifdef DBR_OUTPUT_SEQEND
2124 	    DBR_OUTPUT_SEQEND (file);
2125 #endif
2126 	    final_sequence = 0;
2127 
2128 	    /* If the insn requiring the delay slot was a CALL_INSN, the
2129 	       insns in the delay slot are actually executed before the
2130 	       called function.  Hence we don't preserve any CC-setting
2131 	       actions in these insns and the CC must be marked as being
2132 	       clobbered by the function.  */
2133 	    if (GET_CODE (XVECEXP (body, 0, 0)) == CALL_INSN)
2134 	      {
2135 		CC_STATUS_INIT;
2136 	      }
2137 	    break;
2138 	  }
2139 
2140 	/* We have a real machine instruction as rtl.  */
2141 
2142 	body = PATTERN (insn);
2143 
2144 #ifdef HAVE_cc0
2145 	set = single_set (insn);
2146 
2147 	/* Check for redundant test and compare instructions
2148 	   (when the condition codes are already set up as desired).
2149 	   This is done only when optimizing; if not optimizing,
2150 	   it should be possible for the user to alter a variable
2151 	   with the debugger in between statements
2152 	   and the next statement should reexamine the variable
2153 	   to compute the condition codes.  */
2154 
2155 	if (optimize)
2156 	  {
2157 	    if (set
2158 		&& GET_CODE (SET_DEST (set)) == CC0
2159 		&& insn != last_ignored_compare)
2160 	      {
2161 		if (GET_CODE (SET_SRC (set)) == SUBREG)
2162 		  SET_SRC (set) = alter_subreg (&SET_SRC (set));
2163 		else if (GET_CODE (SET_SRC (set)) == COMPARE)
2164 		  {
2165 		    if (GET_CODE (XEXP (SET_SRC (set), 0)) == SUBREG)
2166 		      XEXP (SET_SRC (set), 0)
2167 			= alter_subreg (&XEXP (SET_SRC (set), 0));
2168 		    if (GET_CODE (XEXP (SET_SRC (set), 1)) == SUBREG)
2169 		      XEXP (SET_SRC (set), 1)
2170 			= alter_subreg (&XEXP (SET_SRC (set), 1));
2171 		  }
2172 		if ((cc_status.value1 != 0
2173 		     && rtx_equal_p (SET_SRC (set), cc_status.value1))
2174 		    || (cc_status.value2 != 0
2175 			&& rtx_equal_p (SET_SRC (set), cc_status.value2)))
2176 		  {
2177 		    /* Don't delete insn if it has an addressing side-effect.  */
2178 		    if (! FIND_REG_INC_NOTE (insn, NULL_RTX)
2179 			/* or if anything in it is volatile.  */
2180 			&& ! volatile_refs_p (PATTERN (insn)))
2181 		      {
2182 			/* We don't really delete the insn; just ignore it.  */
2183 			last_ignored_compare = insn;
2184 			break;
2185 		      }
2186 		  }
2187 	      }
2188 	  }
2189 #endif
2190 
2191 #ifndef STACK_REGS
2192 	/* Don't bother outputting obvious no-ops, even without -O.
2193 	   This optimization is fast and doesn't interfere with debugging.
2194 	   Don't do this if the insn is in a delay slot, since this
2195 	   will cause an improper number of delay insns to be written.  */
2196 	if (final_sequence == 0
2197 	    && prescan >= 0
2198 	    && GET_CODE (insn) == INSN && GET_CODE (body) == SET
2199 	    && GET_CODE (SET_SRC (body)) == REG
2200 	    && GET_CODE (SET_DEST (body)) == REG
2201 	    && REGNO (SET_SRC (body)) == REGNO (SET_DEST (body)))
2202 	  break;
2203 #endif
2204 
2205 #ifdef HAVE_cc0
2206 	/* If this is a conditional branch, maybe modify it
2207 	   if the cc's are in a nonstandard state
2208 	   so that it accomplishes the same thing that it would
2209 	   do straightforwardly if the cc's were set up normally.  */
2210 
2211 	if (cc_status.flags != 0
2212 	    && GET_CODE (insn) == JUMP_INSN
2213 	    && GET_CODE (body) == SET
2214 	    && SET_DEST (body) == pc_rtx
2215 	    && GET_CODE (SET_SRC (body)) == IF_THEN_ELSE
2216 	    && GET_RTX_CLASS (GET_CODE (XEXP (SET_SRC (body), 0))) == '<'
2217 	    && XEXP (XEXP (SET_SRC (body), 0), 0) == cc0_rtx
2218 	    /* This is done during prescan; it is not done again
2219 	       in final scan when prescan has been done.  */
2220 	    && prescan >= 0)
2221 	  {
2222 	    /* This function may alter the contents of its argument
2223 	       and clear some of the cc_status.flags bits.
2224 	       It may also return 1 meaning condition now always true
2225 	       or -1 meaning condition now always false
2226 	       or 2 meaning condition nontrivial but altered.  */
2227 	    int result = alter_cond (XEXP (SET_SRC (body), 0));
2228 	    /* If condition now has fixed value, replace the IF_THEN_ELSE
2229 	       with its then-operand or its else-operand.  */
2230 	    if (result == 1)
2231 	      SET_SRC (body) = XEXP (SET_SRC (body), 1);
2232 	    if (result == -1)
2233 	      SET_SRC (body) = XEXP (SET_SRC (body), 2);
2234 
2235 	    /* The jump is now either unconditional or a no-op.
2236 	       If it has become a no-op, don't try to output it.
2237 	       (It would not be recognized.)  */
2238 	    if (SET_SRC (body) == pc_rtx)
2239 	      {
2240 	        delete_insn (insn);
2241 		break;
2242 	      }
2243 	    else if (GET_CODE (SET_SRC (body)) == RETURN)
2244 	      /* Replace (set (pc) (return)) with (return).  */
2245 	      PATTERN (insn) = body = SET_SRC (body);
2246 
2247 	    /* Rerecognize the instruction if it has changed.  */
2248 	    if (result != 0)
2249 	      INSN_CODE (insn) = -1;
2250 	  }
2251 
2252 	/* Make same adjustments to instructions that examine the
2253 	   condition codes without jumping and instructions that
2254 	   handle conditional moves (if this machine has either one).  */
2255 
2256 	if (cc_status.flags != 0
2257 	    && set != 0)
2258 	  {
2259 	    rtx cond_rtx, then_rtx, else_rtx;
2260 
2261 	    if (GET_CODE (insn) != JUMP_INSN
2262 		&& GET_CODE (SET_SRC (set)) == IF_THEN_ELSE)
2263 	      {
2264 		cond_rtx = XEXP (SET_SRC (set), 0);
2265 		then_rtx = XEXP (SET_SRC (set), 1);
2266 		else_rtx = XEXP (SET_SRC (set), 2);
2267 	      }
2268 	    else
2269 	      {
2270 		cond_rtx = SET_SRC (set);
2271 		then_rtx = const_true_rtx;
2272 		else_rtx = const0_rtx;
2273 	      }
2274 
2275 	    switch (GET_CODE (cond_rtx))
2276 	      {
2277 	      case GTU:
2278 	      case GT:
2279 	      case LTU:
2280 	      case LT:
2281 	      case GEU:
2282 	      case GE:
2283 	      case LEU:
2284 	      case LE:
2285 	      case EQ:
2286 	      case NE:
2287 		{
2288 		  int result;
2289 		  if (XEXP (cond_rtx, 0) != cc0_rtx)
2290 		    break;
2291 		  result = alter_cond (cond_rtx);
2292 		  if (result == 1)
2293 		    validate_change (insn, &SET_SRC (set), then_rtx, 0);
2294 		  else if (result == -1)
2295 		    validate_change (insn, &SET_SRC (set), else_rtx, 0);
2296 		  else if (result == 2)
2297 		    INSN_CODE (insn) = -1;
2298 		  if (SET_DEST (set) == SET_SRC (set))
2299 		    delete_insn (insn);
2300 		}
2301 		break;
2302 
2303 	      default:
2304 		break;
2305 	      }
2306 	  }
2307 
2308 #endif
2309 
2310 #ifdef HAVE_peephole
2311 	/* Do machine-specific peephole optimizations if desired.  */
2312 
2313 	if (optimize && !flag_no_peephole && !nopeepholes)
2314 	  {
2315 	    rtx next = peephole (insn);
2316 	    /* When peepholing, if there were notes within the peephole,
2317 	       emit them before the peephole.  */
2318 	    if (next != 0 && next != NEXT_INSN (insn))
2319 	      {
2320 		rtx prev = PREV_INSN (insn);
2321 
2322 		for (note = NEXT_INSN (insn); note != next;
2323 		     note = NEXT_INSN (note))
2324 		  final_scan_insn (note, file, optimize, prescan, nopeepholes, seen);
2325 
2326 		/* In case this is prescan, put the notes
2327 		   in proper position for later rescan.  */
2328 		note = NEXT_INSN (insn);
2329 		PREV_INSN (note) = prev;
2330 		NEXT_INSN (prev) = note;
2331 		NEXT_INSN (PREV_INSN (next)) = insn;
2332 		PREV_INSN (insn) = PREV_INSN (next);
2333 		NEXT_INSN (insn) = next;
2334 		PREV_INSN (next) = insn;
2335 	      }
2336 
2337 	    /* PEEPHOLE might have changed this.  */
2338 	    body = PATTERN (insn);
2339 	  }
2340 #endif
2341 
2342 	/* Try to recognize the instruction.
2343 	   If successful, verify that the operands satisfy the
2344 	   constraints for the instruction.  Crash if they don't,
2345 	   since `reload' should have changed them so that they do.  */
2346 
2347 	insn_code_number = recog_memoized (insn);
2348 	cleanup_subreg_operands (insn);
2349 
2350 	/* Dump the insn in the assembly for debugging.  */
2351 	if (flag_dump_rtl_in_asm)
2352 	  {
2353 	    print_rtx_head = ASM_COMMENT_START;
2354 	    print_rtl_single (asm_out_file, insn);
2355 	    print_rtx_head = "";
2356 	  }
2357 
2358 	if (! constrain_operands_cached (1))
2359 	  fatal_insn_not_found (insn);
2360 
2361 	/* Some target machines need to prescan each insn before
2362 	   it is output.  */
2363 
2364 #ifdef FINAL_PRESCAN_INSN
2365 	FINAL_PRESCAN_INSN (insn, recog_data.operand, recog_data.n_operands);
2366 #endif
2367 
2368 #ifdef HAVE_conditional_execution
2369 	if (GET_CODE (PATTERN (insn)) == COND_EXEC)
2370 	  current_insn_predicate = COND_EXEC_TEST (PATTERN (insn));
2371 	else
2372 	  current_insn_predicate = NULL_RTX;
2373 #endif
2374 
2375 #ifdef HAVE_cc0
2376 	cc_prev_status = cc_status;
2377 
2378 	/* Update `cc_status' for this instruction.
2379 	   The instruction's output routine may change it further.
2380 	   If the output routine for a jump insn needs to depend
2381 	   on the cc status, it should look at cc_prev_status.  */
2382 
2383 	NOTICE_UPDATE_CC (body, insn);
2384 #endif
2385 
2386 	current_output_insn = debug_insn = insn;
2387 
2388 #if defined (DWARF2_UNWIND_INFO)
2389 	if (GET_CODE (insn) == CALL_INSN && dwarf2out_do_frame ())
2390 	  dwarf2out_frame_debug (insn);
2391 #endif
2392 
2393 	/* Find the proper template for this insn.  */
2394 	template = get_insn_template (insn_code_number, insn);
2395 
2396 	/* If the C code returns 0, it means that it is a jump insn
2397 	   which follows a deleted test insn, and that test insn
2398 	   needs to be reinserted.  */
2399 	if (template == 0)
2400 	  {
2401 	    rtx prev;
2402 
2403 	    if (prev_nonnote_insn (insn) != last_ignored_compare)
2404 	      abort ();
2405 
2406 	    /* We have already processed the notes between the setter and
2407 	       the user.  Make sure we don't process them again, this is
2408 	       particularly important if one of the notes is a block
2409 	       scope note or an EH note.  */
2410 	    for (prev = insn;
2411 		 prev != last_ignored_compare;
2412 		 prev = PREV_INSN (prev))
2413 	      {
2414 		if (GET_CODE (prev) == NOTE)
2415 		  delete_insn (prev);	/* Use delete_note.  */
2416 	      }
2417 
2418 	    return prev;
2419 	  }
2420 
2421 	/* If the template is the string "#", it means that this insn must
2422 	   be split.  */
2423 	if (template[0] == '#' && template[1] == '\0')
2424 	  {
2425 	    rtx new = try_split (body, insn, 0);
2426 
2427 	    /* If we didn't split the insn, go away.  */
2428 	    if (new == insn && PATTERN (new) == body)
2429 	      fatal_insn ("could not split insn", insn);
2430 
2431 #ifdef HAVE_ATTR_length
2432 	    /* This instruction should have been split in shorten_branches,
2433 	       to ensure that we would have valid length info for the
2434 	       splitees.  */
2435 	    abort ();
2436 #endif
2437 
2438 	    return new;
2439 	  }
2440 
2441 	if (prescan > 0)
2442 	  break;
2443 
2444 #ifdef IA64_UNWIND_INFO
2445 	IA64_UNWIND_EMIT (asm_out_file, insn);
2446 #endif
2447 	/* Output assembler code from the template.  */
2448 
2449 	output_asm_insn (template, recog_data.operand);
2450 
2451 	/* If necessary, report the effect that the instruction has on
2452 	   the unwind info.   We've already done this for delay slots
2453 	   and call instructions.  */
2454 #if defined (DWARF2_UNWIND_INFO)
2455 	if (GET_CODE (insn) == INSN
2456 #if !defined (HAVE_prologue)
2457 	    && !ACCUMULATE_OUTGOING_ARGS
2458 #endif
2459 	    && final_sequence == 0
2460 	    && dwarf2out_do_frame ())
2461 	  dwarf2out_frame_debug (insn);
2462 #endif
2463 
2464 #if 0
2465 	/* It's not at all clear why we did this and doing so used to
2466 	   interfere with tests that used REG_WAS_0 notes, which are
2467 	   now gone, so let's try with this out.  */
2468 
2469 	/* Mark this insn as having been output.  */
2470 	INSN_DELETED_P (insn) = 1;
2471 #endif
2472 
2473 	/* Emit information for vtable gc.  */
2474 	note = find_reg_note (insn, REG_VTABLE_REF, NULL_RTX);
2475 
2476 	current_output_insn = debug_insn = 0;
2477       }
2478     }
2479   return NEXT_INSN (insn);
2480 }
2481 
2482 /* Output debugging info to the assembler file FILE
2483    based on the NOTE-insn INSN, assumed to be a line number.  */
2484 
2485 static bool
notice_source_line(rtx insn)2486 notice_source_line (rtx insn)
2487 {
2488   const char *filename = insn_file (insn);
2489   int linenum = insn_line (insn);
2490 
2491   if (filename && (filename != last_filename || last_linenum != linenum))
2492     {
2493       last_filename = filename;
2494       last_linenum = linenum;
2495       high_block_linenum = MAX (last_linenum, high_block_linenum);
2496       high_function_linenum = MAX (last_linenum, high_function_linenum);
2497       return true;
2498     }
2499   return false;
2500 }
2501 
2502 /* For each operand in INSN, simplify (subreg (reg)) so that it refers
2503    directly to the desired hard register.  */
2504 
2505 void
cleanup_subreg_operands(rtx insn)2506 cleanup_subreg_operands (rtx insn)
2507 {
2508   int i;
2509   extract_insn_cached (insn);
2510   for (i = 0; i < recog_data.n_operands; i++)
2511     {
2512       /* The following test cannot use recog_data.operand when testing
2513 	 for a SUBREG: the underlying object might have been changed
2514 	 already if we are inside a match_operator expression that
2515 	 matches the else clause.  Instead we test the underlying
2516 	 expression directly.  */
2517       if (GET_CODE (*recog_data.operand_loc[i]) == SUBREG)
2518 	recog_data.operand[i] = alter_subreg (recog_data.operand_loc[i]);
2519       else if (GET_CODE (recog_data.operand[i]) == PLUS
2520 	       || GET_CODE (recog_data.operand[i]) == MULT
2521 	       || GET_CODE (recog_data.operand[i]) == MEM)
2522 	recog_data.operand[i] = walk_alter_subreg (recog_data.operand_loc[i]);
2523     }
2524 
2525   for (i = 0; i < recog_data.n_dups; i++)
2526     {
2527       if (GET_CODE (*recog_data.dup_loc[i]) == SUBREG)
2528 	*recog_data.dup_loc[i] = alter_subreg (recog_data.dup_loc[i]);
2529       else if (GET_CODE (*recog_data.dup_loc[i]) == PLUS
2530 	       || GET_CODE (*recog_data.dup_loc[i]) == MULT
2531 	       || GET_CODE (*recog_data.dup_loc[i]) == MEM)
2532 	*recog_data.dup_loc[i] = walk_alter_subreg (recog_data.dup_loc[i]);
2533     }
2534 }
2535 
2536 /* If X is a SUBREG, replace it with a REG or a MEM,
2537    based on the thing it is a subreg of.  */
2538 
2539 rtx
alter_subreg(rtx * xp)2540 alter_subreg (rtx *xp)
2541 {
2542   rtx x = *xp;
2543   rtx y = SUBREG_REG (x);
2544 
2545   /* simplify_subreg does not remove subreg from volatile references.
2546      We are required to.  */
2547   if (GET_CODE (y) == MEM)
2548     *xp = adjust_address (y, GET_MODE (x), SUBREG_BYTE (x));
2549   else
2550     {
2551       rtx new = simplify_subreg (GET_MODE (x), y, GET_MODE (y),
2552 				 SUBREG_BYTE (x));
2553 
2554       if (new != 0)
2555 	*xp = new;
2556       /* Simplify_subreg can't handle some REG cases, but we have to.  */
2557       else if (GET_CODE (y) == REG)
2558 	{
2559 	  unsigned int regno = subreg_hard_regno (x, 1);
2560 	  *xp = gen_rtx_REG_offset (y, GET_MODE (x), regno, SUBREG_BYTE (x));
2561 	}
2562       else
2563 	abort ();
2564     }
2565 
2566   return *xp;
2567 }
2568 
2569 /* Do alter_subreg on all the SUBREGs contained in X.  */
2570 
2571 static rtx
walk_alter_subreg(rtx * xp)2572 walk_alter_subreg (rtx *xp)
2573 {
2574   rtx x = *xp;
2575   switch (GET_CODE (x))
2576     {
2577     case PLUS:
2578     case MULT:
2579       XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0));
2580       XEXP (x, 1) = walk_alter_subreg (&XEXP (x, 1));
2581       break;
2582 
2583     case MEM:
2584       XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0));
2585       break;
2586 
2587     case SUBREG:
2588       return alter_subreg (xp);
2589 
2590     default:
2591       break;
2592     }
2593 
2594   return *xp;
2595 }
2596 
2597 #ifdef HAVE_cc0
2598 
2599 /* Given BODY, the body of a jump instruction, alter the jump condition
2600    as required by the bits that are set in cc_status.flags.
2601    Not all of the bits there can be handled at this level in all cases.
2602 
2603    The value is normally 0.
2604    1 means that the condition has become always true.
2605    -1 means that the condition has become always false.
2606    2 means that COND has been altered.  */
2607 
2608 static int
alter_cond(rtx cond)2609 alter_cond (rtx cond)
2610 {
2611   int value = 0;
2612 
2613   if (cc_status.flags & CC_REVERSED)
2614     {
2615       value = 2;
2616       PUT_CODE (cond, swap_condition (GET_CODE (cond)));
2617     }
2618 
2619   if (cc_status.flags & CC_INVERTED)
2620     {
2621       value = 2;
2622       PUT_CODE (cond, reverse_condition (GET_CODE (cond)));
2623     }
2624 
2625   if (cc_status.flags & CC_NOT_POSITIVE)
2626     switch (GET_CODE (cond))
2627       {
2628       case LE:
2629       case LEU:
2630       case GEU:
2631 	/* Jump becomes unconditional.  */
2632 	return 1;
2633 
2634       case GT:
2635       case GTU:
2636       case LTU:
2637 	/* Jump becomes no-op.  */
2638 	return -1;
2639 
2640       case GE:
2641 	PUT_CODE (cond, EQ);
2642 	value = 2;
2643 	break;
2644 
2645       case LT:
2646 	PUT_CODE (cond, NE);
2647 	value = 2;
2648 	break;
2649 
2650       default:
2651 	break;
2652       }
2653 
2654   if (cc_status.flags & CC_NOT_NEGATIVE)
2655     switch (GET_CODE (cond))
2656       {
2657       case GE:
2658       case GEU:
2659 	/* Jump becomes unconditional.  */
2660 	return 1;
2661 
2662       case LT:
2663       case LTU:
2664 	/* Jump becomes no-op.  */
2665 	return -1;
2666 
2667       case LE:
2668       case LEU:
2669 	PUT_CODE (cond, EQ);
2670 	value = 2;
2671 	break;
2672 
2673       case GT:
2674       case GTU:
2675 	PUT_CODE (cond, NE);
2676 	value = 2;
2677 	break;
2678 
2679       default:
2680 	break;
2681       }
2682 
2683   if (cc_status.flags & CC_NO_OVERFLOW)
2684     switch (GET_CODE (cond))
2685       {
2686       case GEU:
2687 	/* Jump becomes unconditional.  */
2688 	return 1;
2689 
2690       case LEU:
2691 	PUT_CODE (cond, EQ);
2692 	value = 2;
2693 	break;
2694 
2695       case GTU:
2696 	PUT_CODE (cond, NE);
2697 	value = 2;
2698 	break;
2699 
2700       case LTU:
2701 	/* Jump becomes no-op.  */
2702 	return -1;
2703 
2704       default:
2705 	break;
2706       }
2707 
2708   if (cc_status.flags & (CC_Z_IN_NOT_N | CC_Z_IN_N))
2709     switch (GET_CODE (cond))
2710       {
2711       default:
2712 	abort ();
2713 
2714       case NE:
2715 	PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? GE : LT);
2716 	value = 2;
2717 	break;
2718 
2719       case EQ:
2720 	PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? LT : GE);
2721 	value = 2;
2722 	break;
2723       }
2724 
2725   if (cc_status.flags & CC_NOT_SIGNED)
2726     /* The flags are valid if signed condition operators are converted
2727        to unsigned.  */
2728     switch (GET_CODE (cond))
2729       {
2730       case LE:
2731 	PUT_CODE (cond, LEU);
2732 	value = 2;
2733 	break;
2734 
2735       case LT:
2736 	PUT_CODE (cond, LTU);
2737 	value = 2;
2738 	break;
2739 
2740       case GT:
2741 	PUT_CODE (cond, GTU);
2742 	value = 2;
2743 	break;
2744 
2745       case GE:
2746 	PUT_CODE (cond, GEU);
2747 	value = 2;
2748 	break;
2749 
2750       default:
2751 	break;
2752       }
2753 
2754   return value;
2755 }
2756 #endif
2757 
2758 /* Report inconsistency between the assembler template and the operands.
2759    In an `asm', it's the user's fault; otherwise, the compiler's fault.  */
2760 
2761 void
output_operand_lossage(const char * msgid,...)2762 output_operand_lossage (const char *msgid, ...)
2763 {
2764   char *fmt_string;
2765   char *new_message;
2766   const char *pfx_str;
2767   va_list ap;
2768 
2769   va_start (ap, msgid);
2770 
2771   pfx_str = this_is_asm_operands ? _("invalid `asm': ") : "output_operand: ";
2772   asprintf (&fmt_string, "%s%s", pfx_str, _(msgid));
2773   vasprintf (&new_message, fmt_string, ap);
2774 
2775   if (this_is_asm_operands)
2776     error_for_asm (this_is_asm_operands, "%s", new_message);
2777   else
2778     internal_error ("%s", new_message);
2779 
2780   free (fmt_string);
2781   free (new_message);
2782   va_end (ap);
2783 }
2784 
2785 /* Output of assembler code from a template, and its subroutines.  */
2786 
2787 /* Annotate the assembly with a comment describing the pattern and
2788    alternative used.  */
2789 
2790 static void
output_asm_name(void)2791 output_asm_name (void)
2792 {
2793   if (debug_insn)
2794     {
2795       int num = INSN_CODE (debug_insn);
2796       fprintf (asm_out_file, "\t%s %d\t%s",
2797 	       ASM_COMMENT_START, INSN_UID (debug_insn),
2798 	       insn_data[num].name);
2799       if (insn_data[num].n_alternatives > 1)
2800 	fprintf (asm_out_file, "/%d", which_alternative + 1);
2801 #ifdef HAVE_ATTR_length
2802       fprintf (asm_out_file, "\t[length = %d]",
2803 	       get_attr_length (debug_insn));
2804 #endif
2805       /* Clear this so only the first assembler insn
2806 	 of any rtl insn will get the special comment for -dp.  */
2807       debug_insn = 0;
2808     }
2809 }
2810 
2811 /* If OP is a REG or MEM and we can find a MEM_EXPR corresponding to it
2812    or its address, return that expr .  Set *PADDRESSP to 1 if the expr
2813    corresponds to the address of the object and 0 if to the object.  */
2814 
2815 static tree
get_mem_expr_from_op(rtx op,int * paddressp)2816 get_mem_expr_from_op (rtx op, int *paddressp)
2817 {
2818   tree expr;
2819   int inner_addressp;
2820 
2821   *paddressp = 0;
2822 
2823   if (GET_CODE (op) == REG)
2824     return REG_EXPR (op);
2825   else if (GET_CODE (op) != MEM)
2826     return 0;
2827 
2828   if (MEM_EXPR (op) != 0)
2829     return MEM_EXPR (op);
2830 
2831   /* Otherwise we have an address, so indicate it and look at the address.  */
2832   *paddressp = 1;
2833   op = XEXP (op, 0);
2834 
2835   /* First check if we have a decl for the address, then look at the right side
2836      if it is a PLUS.  Otherwise, strip off arithmetic and keep looking.
2837      But don't allow the address to itself be indirect.  */
2838   if ((expr = get_mem_expr_from_op (op, &inner_addressp)) && ! inner_addressp)
2839     return expr;
2840   else if (GET_CODE (op) == PLUS
2841 	   && (expr = get_mem_expr_from_op (XEXP (op, 1), &inner_addressp)))
2842     return expr;
2843 
2844   while (GET_RTX_CLASS (GET_CODE (op)) == '1'
2845 	 || GET_RTX_CLASS (GET_CODE (op)) == '2')
2846     op = XEXP (op, 0);
2847 
2848   expr = get_mem_expr_from_op (op, &inner_addressp);
2849   return inner_addressp ? 0 : expr;
2850 }
2851 
2852 /* Output operand names for assembler instructions.  OPERANDS is the
2853    operand vector, OPORDER is the order to write the operands, and NOPS
2854    is the number of operands to write.  */
2855 
2856 static void
output_asm_operand_names(rtx * operands,int * oporder,int nops)2857 output_asm_operand_names (rtx *operands, int *oporder, int nops)
2858 {
2859   int wrote = 0;
2860   int i;
2861 
2862   for (i = 0; i < nops; i++)
2863     {
2864       int addressp;
2865       rtx op = operands[oporder[i]];
2866       tree expr = get_mem_expr_from_op (op, &addressp);
2867 
2868       fprintf (asm_out_file, "%c%s",
2869 	       wrote ? ',' : '\t', wrote ? "" : ASM_COMMENT_START);
2870       wrote = 1;
2871       if (expr)
2872 	{
2873 	  fprintf (asm_out_file, "%s",
2874 		   addressp ? "*" : "");
2875 	  print_mem_expr (asm_out_file, expr);
2876 	  wrote = 1;
2877 	}
2878       else if (REG_P (op) && ORIGINAL_REGNO (op)
2879 	       && ORIGINAL_REGNO (op) != REGNO (op))
2880 	fprintf (asm_out_file, " tmp%i", ORIGINAL_REGNO (op));
2881     }
2882 }
2883 
2884 /* Output text from TEMPLATE to the assembler output file,
2885    obeying %-directions to substitute operands taken from
2886    the vector OPERANDS.
2887 
2888    %N (for N a digit) means print operand N in usual manner.
2889    %lN means require operand N to be a CODE_LABEL or LABEL_REF
2890       and print the label name with no punctuation.
2891    %cN means require operand N to be a constant
2892       and print the constant expression with no punctuation.
2893    %aN means expect operand N to be a memory address
2894       (not a memory reference!) and print a reference
2895       to that address.
2896    %nN means expect operand N to be a constant
2897       and print a constant expression for minus the value
2898       of the operand, with no other punctuation.  */
2899 
2900 void
output_asm_insn(const char * template,rtx * operands)2901 output_asm_insn (const char *template, rtx *operands)
2902 {
2903   const char *p;
2904   int c;
2905 #ifdef ASSEMBLER_DIALECT
2906   int dialect = 0;
2907 #endif
2908   int oporder[MAX_RECOG_OPERANDS];
2909   char opoutput[MAX_RECOG_OPERANDS];
2910   int ops = 0;
2911 
2912   /* An insn may return a null string template
2913      in a case where no assembler code is needed.  */
2914   if (*template == 0)
2915     return;
2916 
2917   memset (opoutput, 0, sizeof opoutput);
2918   p = template;
2919   putc ('\t', asm_out_file);
2920 
2921 #ifdef ASM_OUTPUT_OPCODE
2922   ASM_OUTPUT_OPCODE (asm_out_file, p);
2923 #endif
2924 
2925   while ((c = *p++))
2926     switch (c)
2927       {
2928       case '\n':
2929 	if (flag_verbose_asm)
2930 	  output_asm_operand_names (operands, oporder, ops);
2931 	if (flag_print_asm_name)
2932 	  output_asm_name ();
2933 
2934 	ops = 0;
2935 	memset (opoutput, 0, sizeof opoutput);
2936 
2937 	putc (c, asm_out_file);
2938 #ifdef ASM_OUTPUT_OPCODE
2939 	while ((c = *p) == '\t')
2940 	  {
2941 	    putc (c, asm_out_file);
2942 	    p++;
2943 	  }
2944 	ASM_OUTPUT_OPCODE (asm_out_file, p);
2945 #endif
2946 	break;
2947 
2948 #ifdef ASSEMBLER_DIALECT
2949       case '{':
2950 	{
2951 	  int i;
2952 
2953 	  if (dialect)
2954 	    output_operand_lossage ("nested assembly dialect alternatives");
2955 	  else
2956 	    dialect = 1;
2957 
2958 	  /* If we want the first dialect, do nothing.  Otherwise, skip
2959 	     DIALECT_NUMBER of strings ending with '|'.  */
2960 	  for (i = 0; i < dialect_number; i++)
2961 	    {
2962 	      while (*p && *p != '}' && *p++ != '|')
2963 		;
2964 	      if (*p == '}')
2965 		break;
2966 	      if (*p == '|')
2967 		p++;
2968 	    }
2969 
2970 	  if (*p == '\0')
2971 	    output_operand_lossage ("unterminated assembly dialect alternative");
2972 	}
2973 	break;
2974 
2975       case '|':
2976 	if (dialect)
2977 	  {
2978 	    /* Skip to close brace.  */
2979 	    do
2980 	      {
2981 		if (*p == '\0')
2982 		  {
2983 		    output_operand_lossage ("unterminated assembly dialect alternative");
2984 		    break;
2985 		  }
2986 	      }
2987 	    while (*p++ != '}');
2988 	    dialect = 0;
2989 	  }
2990 	else
2991 	  putc (c, asm_out_file);
2992 	break;
2993 
2994       case '}':
2995 	if (! dialect)
2996 	  putc (c, asm_out_file);
2997 	dialect = 0;
2998 	break;
2999 #endif
3000 
3001       case '%':
3002 	/* %% outputs a single %.  */
3003 	if (*p == '%')
3004 	  {
3005 	    p++;
3006 	    putc (c, asm_out_file);
3007 	  }
3008 	/* %= outputs a number which is unique to each insn in the entire
3009 	   compilation.  This is useful for making local labels that are
3010 	   referred to more than once in a given insn.  */
3011 	else if (*p == '=')
3012 	  {
3013 	    p++;
3014 	    fprintf (asm_out_file, "%d", insn_counter);
3015 	  }
3016 	/* % followed by a letter and some digits
3017 	   outputs an operand in a special way depending on the letter.
3018 	   Letters `acln' are implemented directly.
3019 	   Other letters are passed to `output_operand' so that
3020 	   the PRINT_OPERAND macro can define them.  */
3021 	else if (ISALPHA (*p))
3022 	  {
3023 	    int letter = *p++;
3024 	    c = atoi (p);
3025 
3026 	    if (! ISDIGIT (*p))
3027 	      output_operand_lossage ("operand number missing after %%-letter");
3028 	    else if (this_is_asm_operands
3029 		     && (c < 0 || (unsigned int) c >= insn_noperands))
3030 	      output_operand_lossage ("operand number out of range");
3031 	    else if (letter == 'l')
3032 	      output_asm_label (operands[c]);
3033 	    else if (letter == 'a')
3034 	      output_address (operands[c]);
3035 	    else if (letter == 'c')
3036 	      {
3037 		if (CONSTANT_ADDRESS_P (operands[c]))
3038 		  output_addr_const (asm_out_file, operands[c]);
3039 		else
3040 		  output_operand (operands[c], 'c');
3041 	      }
3042 	    else if (letter == 'n')
3043 	      {
3044 		if (GET_CODE (operands[c]) == CONST_INT)
3045 		  fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC,
3046 			   - INTVAL (operands[c]));
3047 		else
3048 		  {
3049 		    putc ('-', asm_out_file);
3050 		    output_addr_const (asm_out_file, operands[c]);
3051 		  }
3052 	      }
3053 	    else
3054 	      output_operand (operands[c], letter);
3055 
3056 	    if (!opoutput[c])
3057 	      oporder[ops++] = c;
3058 	    opoutput[c] = 1;
3059 
3060 	    while (ISDIGIT (c = *p))
3061 	      p++;
3062 	  }
3063 	/* % followed by a digit outputs an operand the default way.  */
3064 	else if (ISDIGIT (*p))
3065 	  {
3066 	    c = atoi (p);
3067 	    if (this_is_asm_operands
3068 		&& (c < 0 || (unsigned int) c >= insn_noperands))
3069 	      output_operand_lossage ("operand number out of range");
3070 	    else
3071 	      output_operand (operands[c], 0);
3072 
3073 	    if (!opoutput[c])
3074 	      oporder[ops++] = c;
3075 	    opoutput[c] = 1;
3076 
3077 	    while (ISDIGIT (c = *p))
3078 	      p++;
3079 	  }
3080 	/* % followed by punctuation: output something for that
3081 	   punctuation character alone, with no operand.
3082 	   The PRINT_OPERAND macro decides what is actually done.  */
3083 #ifdef PRINT_OPERAND_PUNCT_VALID_P
3084 	else if (PRINT_OPERAND_PUNCT_VALID_P ((unsigned char) *p))
3085 	  output_operand (NULL_RTX, *p++);
3086 #endif
3087 	else
3088 	  output_operand_lossage ("invalid %%-code");
3089 	break;
3090 
3091       default:
3092 	putc (c, asm_out_file);
3093       }
3094 
3095   /* Write out the variable names for operands, if we know them.  */
3096   if (flag_verbose_asm)
3097     output_asm_operand_names (operands, oporder, ops);
3098   if (flag_print_asm_name)
3099     output_asm_name ();
3100 
3101   putc ('\n', asm_out_file);
3102 }
3103 
3104 /* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol.  */
3105 
3106 void
output_asm_label(rtx x)3107 output_asm_label (rtx x)
3108 {
3109   char buf[256];
3110 
3111   if (GET_CODE (x) == LABEL_REF)
3112     x = XEXP (x, 0);
3113   if (GET_CODE (x) == CODE_LABEL
3114       || (GET_CODE (x) == NOTE
3115 	  && NOTE_LINE_NUMBER (x) == NOTE_INSN_DELETED_LABEL))
3116     ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3117   else
3118     output_operand_lossage ("`%%l' operand isn't a label");
3119 
3120   assemble_name (asm_out_file, buf);
3121 }
3122 
3123 /* Print operand X using machine-dependent assembler syntax.
3124    The macro PRINT_OPERAND is defined just to control this function.
3125    CODE is a non-digit that preceded the operand-number in the % spec,
3126    such as 'z' if the spec was `%z3'.  CODE is 0 if there was no char
3127    between the % and the digits.
3128    When CODE is a non-letter, X is 0.
3129 
3130    The meanings of the letters are machine-dependent and controlled
3131    by PRINT_OPERAND.  */
3132 
3133 static void
output_operand(rtx x,int code ATTRIBUTE_UNUSED)3134 output_operand (rtx x, int code ATTRIBUTE_UNUSED)
3135 {
3136   if (x && GET_CODE (x) == SUBREG)
3137     x = alter_subreg (&x);
3138 
3139   /* If X is a pseudo-register, abort now rather than writing trash to the
3140      assembler file.  */
3141 
3142   if (x && GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER)
3143     abort ();
3144 
3145   PRINT_OPERAND (asm_out_file, x, code);
3146 }
3147 
3148 /* Print a memory reference operand for address X
3149    using machine-dependent assembler syntax.
3150    The macro PRINT_OPERAND_ADDRESS exists just to control this function.  */
3151 
3152 void
output_address(rtx x)3153 output_address (rtx x)
3154 {
3155   walk_alter_subreg (&x);
3156   PRINT_OPERAND_ADDRESS (asm_out_file, x);
3157 }
3158 
3159 /* Print an integer constant expression in assembler syntax.
3160    Addition and subtraction are the only arithmetic
3161    that may appear in these expressions.  */
3162 
3163 void
output_addr_const(FILE * file,rtx x)3164 output_addr_const (FILE *file, rtx x)
3165 {
3166   char buf[256];
3167 
3168  restart:
3169   switch (GET_CODE (x))
3170     {
3171     case PC:
3172       putc ('.', file);
3173       break;
3174 
3175     case SYMBOL_REF:
3176 #ifdef ASM_OUTPUT_SYMBOL_REF
3177       ASM_OUTPUT_SYMBOL_REF (file, x);
3178 #else
3179       assemble_name (file, XSTR (x, 0));
3180 #endif
3181       break;
3182 
3183     case LABEL_REF:
3184       x = XEXP (x, 0);
3185       /* Fall through.  */
3186     case CODE_LABEL:
3187       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3188 #ifdef ASM_OUTPUT_LABEL_REF
3189       ASM_OUTPUT_LABEL_REF (file, buf);
3190 #else
3191       assemble_name (file, buf);
3192 #endif
3193       break;
3194 
3195     case CONST_INT:
3196       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
3197       break;
3198 
3199     case CONST:
3200       /* This used to output parentheses around the expression,
3201 	 but that does not work on the 386 (either ATT or BSD assembler).  */
3202       output_addr_const (file, XEXP (x, 0));
3203       break;
3204 
3205     case CONST_DOUBLE:
3206       if (GET_MODE (x) == VOIDmode)
3207 	{
3208 	  /* We can use %d if the number is one word and positive.  */
3209 	  if (CONST_DOUBLE_HIGH (x))
3210 	    fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
3211 		     CONST_DOUBLE_HIGH (x), CONST_DOUBLE_LOW (x));
3212 	  else if (CONST_DOUBLE_LOW (x) < 0)
3213 	    fprintf (file, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_LOW (x));
3214 	  else
3215 	    fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
3216 	}
3217       else
3218 	/* We can't handle floating point constants;
3219 	   PRINT_OPERAND must handle them.  */
3220 	output_operand_lossage ("floating constant misused");
3221       break;
3222 
3223     case PLUS:
3224       /* Some assemblers need integer constants to appear last (eg masm).  */
3225       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
3226 	{
3227 	  output_addr_const (file, XEXP (x, 1));
3228 	  if (INTVAL (XEXP (x, 0)) >= 0)
3229 	    fprintf (file, "+");
3230 	  output_addr_const (file, XEXP (x, 0));
3231 	}
3232       else
3233 	{
3234 	  output_addr_const (file, XEXP (x, 0));
3235 	  if (GET_CODE (XEXP (x, 1)) != CONST_INT
3236 	      || INTVAL (XEXP (x, 1)) >= 0)
3237 	    fprintf (file, "+");
3238 	  output_addr_const (file, XEXP (x, 1));
3239 	}
3240       break;
3241 
3242     case MINUS:
3243       /* Avoid outputting things like x-x or x+5-x,
3244 	 since some assemblers can't handle that.  */
3245       x = simplify_subtraction (x);
3246       if (GET_CODE (x) != MINUS)
3247 	goto restart;
3248 
3249       output_addr_const (file, XEXP (x, 0));
3250       fprintf (file, "-");
3251       if ((GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0)
3252 	  || GET_CODE (XEXP (x, 1)) == PC
3253 	  || GET_CODE (XEXP (x, 1)) == SYMBOL_REF)
3254 	output_addr_const (file, XEXP (x, 1));
3255       else
3256 	{
3257 	  fputs (targetm.asm_out.open_paren, file);
3258 	  output_addr_const (file, XEXP (x, 1));
3259 	  fputs (targetm.asm_out.close_paren, file);
3260 	}
3261       break;
3262 
3263     case ZERO_EXTEND:
3264     case SIGN_EXTEND:
3265     case SUBREG:
3266       output_addr_const (file, XEXP (x, 0));
3267       break;
3268 
3269     default:
3270 #ifdef OUTPUT_ADDR_CONST_EXTRA
3271       OUTPUT_ADDR_CONST_EXTRA (file, x, fail);
3272       break;
3273 
3274     fail:
3275 #endif
3276       output_operand_lossage ("invalid expression as operand");
3277     }
3278 }
3279 
3280 /* A poor man's fprintf, with the added features of %I, %R, %L, and %U.
3281    %R prints the value of REGISTER_PREFIX.
3282    %L prints the value of LOCAL_LABEL_PREFIX.
3283    %U prints the value of USER_LABEL_PREFIX.
3284    %I prints the value of IMMEDIATE_PREFIX.
3285    %O runs ASM_OUTPUT_OPCODE to transform what follows in the string.
3286    Also supported are %d, %i, %u, %x, %X, %o, %c, %s and %%.
3287 
3288    We handle alternate assembler dialects here, just like output_asm_insn.  */
3289 
3290 void
asm_fprintf(FILE * file,const char * p,...)3291 asm_fprintf (FILE *file, const char *p, ...)
3292 {
3293   char buf[10];
3294   char *q, c;
3295   va_list argptr;
3296 
3297   va_start (argptr, p);
3298 
3299   buf[0] = '%';
3300 
3301   while ((c = *p++))
3302     switch (c)
3303       {
3304 #ifdef ASSEMBLER_DIALECT
3305       case '{':
3306 	{
3307 	  int i;
3308 
3309 	  /* If we want the first dialect, do nothing.  Otherwise, skip
3310 	     DIALECT_NUMBER of strings ending with '|'.  */
3311 	  for (i = 0; i < dialect_number; i++)
3312 	    {
3313 	      while (*p && *p++ != '|')
3314 		;
3315 
3316 	      if (*p == '|')
3317 		p++;
3318 	    }
3319 	}
3320 	break;
3321 
3322       case '|':
3323 	/* Skip to close brace.  */
3324 	while (*p && *p++ != '}')
3325 	  ;
3326 	break;
3327 
3328       case '}':
3329 	break;
3330 #endif
3331 
3332       case '%':
3333 	c = *p++;
3334 	q = &buf[1];
3335 	while (strchr ("-+ #0", c))
3336 	  {
3337 	    *q++ = c;
3338 	    c = *p++;
3339 	  }
3340 	while (ISDIGIT (c) || c == '.')
3341 	  {
3342 	    *q++ = c;
3343 	    c = *p++;
3344 	  }
3345 	switch (c)
3346 	  {
3347 	  case '%':
3348 	    putc ('%', file);
3349 	    break;
3350 
3351 	  case 'd':  case 'i':  case 'u':
3352 	  case 'x':  case 'X':  case 'o':
3353 	  case 'c':
3354 	    *q++ = c;
3355 	    *q = 0;
3356 	    fprintf (file, buf, va_arg (argptr, int));
3357 	    break;
3358 
3359 	  case 'w':
3360 	    /* This is a prefix to the 'd', 'i', 'u', 'x', 'X', and
3361 	       'o' cases, but we do not check for those cases.  It
3362 	       means that the value is a HOST_WIDE_INT, which may be
3363 	       either `long' or `long long'.  */
3364 	    memcpy (q, HOST_WIDE_INT_PRINT, strlen (HOST_WIDE_INT_PRINT));
3365 	    q += strlen (HOST_WIDE_INT_PRINT);
3366 	    *q++ = *p++;
3367 	    *q = 0;
3368 	    fprintf (file, buf, va_arg (argptr, HOST_WIDE_INT));
3369 	    break;
3370 
3371 	  case 'l':
3372 	    *q++ = c;
3373 #ifdef HAVE_LONG_LONG
3374 	    if (*p == 'l')
3375 	      {
3376 		*q++ = *p++;
3377 		*q++ = *p++;
3378 		*q = 0;
3379 		fprintf (file, buf, va_arg (argptr, long long));
3380 	      }
3381 	    else
3382 #endif
3383 	      {
3384 		*q++ = *p++;
3385 		*q = 0;
3386 		fprintf (file, buf, va_arg (argptr, long));
3387 	      }
3388 
3389 	    break;
3390 
3391 	  case 's':
3392 	    *q++ = c;
3393 	    *q = 0;
3394 	    fprintf (file, buf, va_arg (argptr, char *));
3395 	    break;
3396 
3397 	  case 'O':
3398 #ifdef ASM_OUTPUT_OPCODE
3399 	    ASM_OUTPUT_OPCODE (asm_out_file, p);
3400 #endif
3401 	    break;
3402 
3403 	  case 'R':
3404 #ifdef REGISTER_PREFIX
3405 	    fprintf (file, "%s", REGISTER_PREFIX);
3406 #endif
3407 	    break;
3408 
3409 	  case 'I':
3410 #ifdef IMMEDIATE_PREFIX
3411 	    fprintf (file, "%s", IMMEDIATE_PREFIX);
3412 #endif
3413 	    break;
3414 
3415 	  case 'L':
3416 #ifdef LOCAL_LABEL_PREFIX
3417 	    fprintf (file, "%s", LOCAL_LABEL_PREFIX);
3418 #endif
3419 	    break;
3420 
3421 	  case 'U':
3422 	    fputs (user_label_prefix, file);
3423 	    break;
3424 
3425 #ifdef ASM_FPRINTF_EXTENSIONS
3426 	    /* Uppercase letters are reserved for general use by asm_fprintf
3427 	       and so are not available to target specific code.  In order to
3428 	       prevent the ASM_FPRINTF_EXTENSIONS macro from using them then,
3429 	       they are defined here.  As they get turned into real extensions
3430 	       to asm_fprintf they should be removed from this list.  */
3431 	  case 'A': case 'B': case 'C': case 'D': case 'E':
3432 	  case 'F': case 'G': case 'H': case 'J': case 'K':
3433 	  case 'M': case 'N': case 'P': case 'Q': case 'S':
3434 	  case 'T': case 'V': case 'W': case 'Y': case 'Z':
3435 	    break;
3436 
3437 	  ASM_FPRINTF_EXTENSIONS (file, argptr, p)
3438 #endif
3439 	  default:
3440 	    abort ();
3441 	  }
3442 	break;
3443 
3444       default:
3445 	putc (c, file);
3446       }
3447   va_end (argptr);
3448 }
3449 
3450 /* Split up a CONST_DOUBLE or integer constant rtx
3451    into two rtx's for single words,
3452    storing in *FIRST the word that comes first in memory in the target
3453    and in *SECOND the other.  */
3454 
3455 void
split_double(rtx value,rtx * first,rtx * second)3456 split_double (rtx value, rtx *first, rtx *second)
3457 {
3458   if (GET_CODE (value) == CONST_INT)
3459     {
3460       if (HOST_BITS_PER_WIDE_INT >= (2 * BITS_PER_WORD))
3461 	{
3462 	  /* In this case the CONST_INT holds both target words.
3463 	     Extract the bits from it into two word-sized pieces.
3464 	     Sign extend each half to HOST_WIDE_INT.  */
3465 	  unsigned HOST_WIDE_INT low, high;
3466 	  unsigned HOST_WIDE_INT mask, sign_bit, sign_extend;
3467 
3468 	  /* Set sign_bit to the most significant bit of a word.  */
3469 	  sign_bit = 1;
3470 	  sign_bit <<= BITS_PER_WORD - 1;
3471 
3472 	  /* Set mask so that all bits of the word are set.  We could
3473 	     have used 1 << BITS_PER_WORD instead of basing the
3474 	     calculation on sign_bit.  However, on machines where
3475 	     HOST_BITS_PER_WIDE_INT == BITS_PER_WORD, it could cause a
3476 	     compiler warning, even though the code would never be
3477 	     executed.  */
3478 	  mask = sign_bit << 1;
3479 	  mask--;
3480 
3481 	  /* Set sign_extend as any remaining bits.  */
3482 	  sign_extend = ~mask;
3483 
3484 	  /* Pick the lower word and sign-extend it.  */
3485 	  low = INTVAL (value);
3486 	  low &= mask;
3487 	  if (low & sign_bit)
3488 	    low |= sign_extend;
3489 
3490 	  /* Pick the higher word, shifted to the least significant
3491 	     bits, and sign-extend it.  */
3492 	  high = INTVAL (value);
3493 	  high >>= BITS_PER_WORD - 1;
3494 	  high >>= 1;
3495 	  high &= mask;
3496 	  if (high & sign_bit)
3497 	    high |= sign_extend;
3498 
3499 	  /* Store the words in the target machine order.  */
3500 	  if (WORDS_BIG_ENDIAN)
3501 	    {
3502 	      *first = GEN_INT (high);
3503 	      *second = GEN_INT (low);
3504 	    }
3505 	  else
3506 	    {
3507 	      *first = GEN_INT (low);
3508 	      *second = GEN_INT (high);
3509 	    }
3510 	}
3511       else
3512 	{
3513 	  /* The rule for using CONST_INT for a wider mode
3514 	     is that we regard the value as signed.
3515 	     So sign-extend it.  */
3516 	  rtx high = (INTVAL (value) < 0 ? constm1_rtx : const0_rtx);
3517 	  if (WORDS_BIG_ENDIAN)
3518 	    {
3519 	      *first = high;
3520 	      *second = value;
3521 	    }
3522 	  else
3523 	    {
3524 	      *first = value;
3525 	      *second = high;
3526 	    }
3527 	}
3528     }
3529   else if (GET_CODE (value) != CONST_DOUBLE)
3530     {
3531       if (WORDS_BIG_ENDIAN)
3532 	{
3533 	  *first = const0_rtx;
3534 	  *second = value;
3535 	}
3536       else
3537 	{
3538 	  *first = value;
3539 	  *second = const0_rtx;
3540 	}
3541     }
3542   else if (GET_MODE (value) == VOIDmode
3543 	   /* This is the old way we did CONST_DOUBLE integers.  */
3544 	   || GET_MODE_CLASS (GET_MODE (value)) == MODE_INT)
3545     {
3546       /* In an integer, the words are defined as most and least significant.
3547 	 So order them by the target's convention.  */
3548       if (WORDS_BIG_ENDIAN)
3549 	{
3550 	  *first = GEN_INT (CONST_DOUBLE_HIGH (value));
3551 	  *second = GEN_INT (CONST_DOUBLE_LOW (value));
3552 	}
3553       else
3554 	{
3555 	  *first = GEN_INT (CONST_DOUBLE_LOW (value));
3556 	  *second = GEN_INT (CONST_DOUBLE_HIGH (value));
3557 	}
3558     }
3559   else
3560     {
3561       REAL_VALUE_TYPE r;
3562       long l[2];
3563       REAL_VALUE_FROM_CONST_DOUBLE (r, value);
3564 
3565       /* Note, this converts the REAL_VALUE_TYPE to the target's
3566 	 format, splits up the floating point double and outputs
3567 	 exactly 32 bits of it into each of l[0] and l[1] --
3568 	 not necessarily BITS_PER_WORD bits.  */
3569       REAL_VALUE_TO_TARGET_DOUBLE (r, l);
3570 
3571       /* If 32 bits is an entire word for the target, but not for the host,
3572 	 then sign-extend on the host so that the number will look the same
3573 	 way on the host that it would on the target.  See for instance
3574 	 simplify_unary_operation.  The #if is needed to avoid compiler
3575 	 warnings.  */
3576 
3577 #if HOST_BITS_PER_LONG > 32
3578       if (BITS_PER_WORD < HOST_BITS_PER_LONG && BITS_PER_WORD == 32)
3579 	{
3580 	  if (l[0] & ((long) 1 << 31))
3581 	    l[0] |= ((long) (-1) << 32);
3582 	  if (l[1] & ((long) 1 << 31))
3583 	    l[1] |= ((long) (-1) << 32);
3584 	}
3585 #endif
3586 
3587       *first = GEN_INT ((HOST_WIDE_INT) l[0]);
3588       *second = GEN_INT ((HOST_WIDE_INT) l[1]);
3589     }
3590 }
3591 
3592 /* Return nonzero if this function has no function calls.  */
3593 
3594 int
leaf_function_p(void)3595 leaf_function_p (void)
3596 {
3597   rtx insn;
3598   rtx link;
3599 
3600   if (current_function_profile || profile_arc_flag)
3601     return 0;
3602 
3603   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3604     {
3605       if (GET_CODE (insn) == CALL_INSN
3606 	  && ! SIBLING_CALL_P (insn))
3607 	return 0;
3608       if (GET_CODE (insn) == INSN
3609 	  && GET_CODE (PATTERN (insn)) == SEQUENCE
3610 	  && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == CALL_INSN
3611 	  && ! SIBLING_CALL_P (XVECEXP (PATTERN (insn), 0, 0)))
3612 	return 0;
3613     }
3614   for (link = current_function_epilogue_delay_list;
3615        link;
3616        link = XEXP (link, 1))
3617     {
3618       insn = XEXP (link, 0);
3619 
3620       if (GET_CODE (insn) == CALL_INSN
3621 	  && ! SIBLING_CALL_P (insn))
3622 	return 0;
3623       if (GET_CODE (insn) == INSN
3624 	  && GET_CODE (PATTERN (insn)) == SEQUENCE
3625 	  && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == CALL_INSN
3626 	  && ! SIBLING_CALL_P (XVECEXP (PATTERN (insn), 0, 0)))
3627 	return 0;
3628     }
3629 
3630   return 1;
3631 }
3632 
3633 /* Return 1 if branch is a forward branch.
3634    Uses insn_shuid array, so it works only in the final pass.  May be used by
3635    output templates to customary add branch prediction hints.
3636  */
3637 int
final_forward_branch_p(rtx insn)3638 final_forward_branch_p (rtx insn)
3639 {
3640   int insn_id, label_id;
3641   if (!uid_shuid)
3642     abort ();
3643   insn_id = INSN_SHUID (insn);
3644   label_id = INSN_SHUID (JUMP_LABEL (insn));
3645   /* We've hit some insns that does not have id information available.  */
3646   if (!insn_id || !label_id)
3647     abort ();
3648   return insn_id < label_id;
3649 }
3650 
3651 /* On some machines, a function with no call insns
3652    can run faster if it doesn't create its own register window.
3653    When output, the leaf function should use only the "output"
3654    registers.  Ordinarily, the function would be compiled to use
3655    the "input" registers to find its arguments; it is a candidate
3656    for leaf treatment if it uses only the "input" registers.
3657    Leaf function treatment means renumbering so the function
3658    uses the "output" registers instead.  */
3659 
3660 #ifdef LEAF_REGISTERS
3661 
3662 /* Return 1 if this function uses only the registers that can be
3663    safely renumbered.  */
3664 
3665 int
only_leaf_regs_used(void)3666 only_leaf_regs_used (void)
3667 {
3668   int i;
3669   const char *const permitted_reg_in_leaf_functions = LEAF_REGISTERS;
3670 
3671   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3672     if ((regs_ever_live[i] || global_regs[i])
3673 	&& ! permitted_reg_in_leaf_functions[i])
3674       return 0;
3675 
3676   if (current_function_uses_pic_offset_table
3677       && pic_offset_table_rtx != 0
3678       && GET_CODE (pic_offset_table_rtx) == REG
3679       && ! permitted_reg_in_leaf_functions[REGNO (pic_offset_table_rtx)])
3680     return 0;
3681 
3682   return 1;
3683 }
3684 
3685 /* Scan all instructions and renumber all registers into those
3686    available in leaf functions.  */
3687 
3688 static void
leaf_renumber_regs(rtx first)3689 leaf_renumber_regs (rtx first)
3690 {
3691   rtx insn;
3692 
3693   /* Renumber only the actual patterns.
3694      The reg-notes can contain frame pointer refs,
3695      and renumbering them could crash, and should not be needed.  */
3696   for (insn = first; insn; insn = NEXT_INSN (insn))
3697     if (INSN_P (insn))
3698       leaf_renumber_regs_insn (PATTERN (insn));
3699   for (insn = current_function_epilogue_delay_list;
3700        insn;
3701        insn = XEXP (insn, 1))
3702     if (INSN_P (XEXP (insn, 0)))
3703       leaf_renumber_regs_insn (PATTERN (XEXP (insn, 0)));
3704 }
3705 
3706 /* Scan IN_RTX and its subexpressions, and renumber all regs into those
3707    available in leaf functions.  */
3708 
3709 void
leaf_renumber_regs_insn(rtx in_rtx)3710 leaf_renumber_regs_insn (rtx in_rtx)
3711 {
3712   int i, j;
3713   const char *format_ptr;
3714 
3715   if (in_rtx == 0)
3716     return;
3717 
3718   /* Renumber all input-registers into output-registers.
3719      renumbered_regs would be 1 for an output-register;
3720      they  */
3721 
3722   if (GET_CODE (in_rtx) == REG)
3723     {
3724       int newreg;
3725 
3726       /* Don't renumber the same reg twice.  */
3727       if (in_rtx->used)
3728 	return;
3729 
3730       newreg = REGNO (in_rtx);
3731       /* Don't try to renumber pseudo regs.  It is possible for a pseudo reg
3732 	 to reach here as part of a REG_NOTE.  */
3733       if (newreg >= FIRST_PSEUDO_REGISTER)
3734 	{
3735 	  in_rtx->used = 1;
3736 	  return;
3737 	}
3738       newreg = LEAF_REG_REMAP (newreg);
3739       if (newreg < 0)
3740 	abort ();
3741       regs_ever_live[REGNO (in_rtx)] = 0;
3742       regs_ever_live[newreg] = 1;
3743       REGNO (in_rtx) = newreg;
3744       in_rtx->used = 1;
3745     }
3746 
3747   if (INSN_P (in_rtx))
3748     {
3749       /* Inside a SEQUENCE, we find insns.
3750 	 Renumber just the patterns of these insns,
3751 	 just as we do for the top-level insns.  */
3752       leaf_renumber_regs_insn (PATTERN (in_rtx));
3753       return;
3754     }
3755 
3756   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
3757 
3758   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
3759     switch (*format_ptr++)
3760       {
3761       case 'e':
3762 	leaf_renumber_regs_insn (XEXP (in_rtx, i));
3763 	break;
3764 
3765       case 'E':
3766 	if (NULL != XVEC (in_rtx, i))
3767 	  {
3768 	    for (j = 0; j < XVECLEN (in_rtx, i); j++)
3769 	      leaf_renumber_regs_insn (XVECEXP (in_rtx, i, j));
3770 	  }
3771 	break;
3772 
3773       case 'S':
3774       case 's':
3775       case '0':
3776       case 'i':
3777       case 'w':
3778       case 'n':
3779       case 'u':
3780 	break;
3781 
3782       default:
3783 	abort ();
3784       }
3785 }
3786 #endif
3787 
3788 
3789 /* When -gused is used, emit debug info for only used symbols. But in
3790    addition to the standard intercepted debug_hooks there are some direct
3791    calls into this file, i.e., dbxout_symbol, dbxout_parms, and dbxout_reg_params.
3792    Those routines may also be called from a higher level intercepted routine. So
3793    to prevent recording data for an inner call to one of these for an intercept,
3794    we maintain an intercept nesting counter (debug_nesting). We only save the
3795    intercepted arguments if the nesting is 1.  */
3796 int debug_nesting = 0;
3797 
3798 static tree *symbol_queue;
3799 int symbol_queue_index = 0;
3800 static int symbol_queue_size = 0;
3801 
3802 /* Generate the symbols for any queued up type symbols we encountered
3803    while generating the type info for some originally used symbol.
3804    This might generate additional entries in the queue.  Only when
3805    the nesting depth goes to 0 is this routine called.  */
3806 
3807 void
debug_flush_symbol_queue(void)3808 debug_flush_symbol_queue (void)
3809 {
3810   int i;
3811 
3812   /* Make sure that additionally queued items are not flushed
3813      prematurely.  */
3814 
3815   ++debug_nesting;
3816 
3817   for (i = 0; i < symbol_queue_index; ++i)
3818     {
3819       /* If we pushed queued symbols then such symbols are must be
3820          output no matter what anyone else says.  Specifically,
3821          we need to make sure dbxout_symbol() thinks the symbol was
3822          used and also we need to override TYPE_DECL_SUPPRESS_DEBUG
3823          which may be set for outside reasons.  */
3824       int saved_tree_used = TREE_USED (symbol_queue[i]);
3825       int saved_suppress_debug = TYPE_DECL_SUPPRESS_DEBUG (symbol_queue[i]);
3826       TREE_USED (symbol_queue[i]) = 1;
3827       TYPE_DECL_SUPPRESS_DEBUG (symbol_queue[i]) = 0;
3828 
3829 #ifdef DBX_DEBUGGING_INFO
3830       dbxout_symbol (symbol_queue[i], 0);
3831 #endif
3832 
3833       TREE_USED (symbol_queue[i]) = saved_tree_used;
3834       TYPE_DECL_SUPPRESS_DEBUG (symbol_queue[i]) = saved_suppress_debug;
3835     }
3836 
3837   symbol_queue_index = 0;
3838   --debug_nesting;
3839 }
3840 
3841 /* Queue a type symbol needed as part of the definition of a decl
3842    symbol.  These symbols are generated when debug_flush_symbol_queue()
3843    is called.  */
3844 
3845 void
debug_queue_symbol(tree decl)3846 debug_queue_symbol (tree decl)
3847 {
3848   if (symbol_queue_index >= symbol_queue_size)
3849     {
3850       symbol_queue_size += 10;
3851       symbol_queue = xrealloc (symbol_queue,
3852 			       symbol_queue_size * sizeof (tree));
3853     }
3854 
3855   symbol_queue[symbol_queue_index++] = decl;
3856 }
3857 
3858 /* Free symbol queue.  */
3859 void
debug_free_queue(void)3860 debug_free_queue (void)
3861 {
3862   if (symbol_queue)
3863     {
3864       free (symbol_queue);
3865       symbol_queue = NULL;
3866       symbol_queue_size = 0;
3867     }
3868 }
3869