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