OSDN Git Service

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