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