OSDN Git Service

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