OSDN Git Service

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