OSDN Git Service

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