OSDN Git Service

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