OSDN Git Service

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