OSDN Git Service

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