OSDN Git Service

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