OSDN Git Service

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