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