OSDN Git Service

* de.po: Update.
[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 && svrtx != NULL_RTX && 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 && svrtx != NULL_RTX && 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 #ifdef FINAL_PRESCAN_INSN
2058             FINAL_PRESCAN_INSN (insn, ops, insn_noperands);
2059 #endif
2060
2061             /* Output the insn using them.  */
2062             if (string[0])
2063               {
2064                 if (! app_on)
2065                   {
2066                     fputs (ASM_APP_ON, file);
2067                     app_on = 1;
2068                   }
2069                 output_asm_insn (string, ops);
2070               }
2071
2072             this_is_asm_operands = 0;
2073             break;
2074           }
2075
2076         if (prescan <= 0 && app_on)
2077           {
2078             fputs (ASM_APP_OFF, file);
2079             app_on = 0;
2080           }
2081
2082         if (GET_CODE (body) == SEQUENCE)
2083           {
2084             /* A delayed-branch sequence */
2085             int i;
2086             rtx next;
2087
2088             if (prescan > 0)
2089               break;
2090             final_sequence = body;
2091
2092             /* Record the delay slots' frame information before the branch.
2093                This is needed for delayed calls: see execute_cfa_program().  */
2094 #if defined (DWARF2_UNWIND_INFO)
2095             if (dwarf2out_do_frame ())
2096               for (i = 1; i < XVECLEN (body, 0); i++)
2097                 dwarf2out_frame_debug (XVECEXP (body, 0, i));
2098 #endif
2099
2100             /* The first insn in this SEQUENCE might be a JUMP_INSN that will
2101                force the restoration of a comparison that was previously
2102                thought unnecessary.  If that happens, cancel this sequence
2103                and cause that insn to be restored.  */
2104
2105             next = final_scan_insn (XVECEXP (body, 0, 0), file, 0, prescan, 1);
2106             if (next != XVECEXP (body, 0, 1))
2107               {
2108                 final_sequence = 0;
2109                 return next;
2110               }
2111
2112             for (i = 1; i < XVECLEN (body, 0); i++)
2113               {
2114                 rtx insn = XVECEXP (body, 0, i);
2115                 rtx next = NEXT_INSN (insn);
2116                 /* We loop in case any instruction in a delay slot gets
2117                    split.  */
2118                 do
2119                   insn = final_scan_insn (insn, file, 0, prescan, 1);
2120                 while (insn != next);
2121               }
2122 #ifdef DBR_OUTPUT_SEQEND
2123             DBR_OUTPUT_SEQEND (file);
2124 #endif
2125             final_sequence = 0;
2126
2127             /* If the insn requiring the delay slot was a CALL_INSN, the
2128                insns in the delay slot are actually executed before the
2129                called function.  Hence we don't preserve any CC-setting
2130                actions in these insns and the CC must be marked as being
2131                clobbered by the function.  */
2132             if (GET_CODE (XVECEXP (body, 0, 0)) == CALL_INSN)
2133               {
2134                 CC_STATUS_INIT;
2135               }
2136             break;
2137           }
2138
2139         /* We have a real machine instruction as rtl.  */
2140
2141         body = PATTERN (insn);
2142
2143 #ifdef HAVE_cc0
2144         set = single_set (insn);
2145
2146         /* Check for redundant test and compare instructions
2147            (when the condition codes are already set up as desired).
2148            This is done only when optimizing; if not optimizing,
2149            it should be possible for the user to alter a variable
2150            with the debugger in between statements
2151            and the next statement should reexamine the variable
2152            to compute the condition codes.  */
2153
2154         if (optimize)
2155           {
2156 #if 0
2157             rtx set = single_set (insn);
2158 #endif
2159
2160             if (set
2161                 && GET_CODE (SET_DEST (set)) == CC0
2162                 && insn != last_ignored_compare)
2163               {
2164                 if (GET_CODE (SET_SRC (set)) == SUBREG)
2165                   SET_SRC (set) = alter_subreg (&SET_SRC (set));
2166                 else if (GET_CODE (SET_SRC (set)) == COMPARE)
2167                   {
2168                     if (GET_CODE (XEXP (SET_SRC (set), 0)) == SUBREG)
2169                       XEXP (SET_SRC (set), 0)
2170                         = alter_subreg (&XEXP (SET_SRC (set), 0));
2171                     if (GET_CODE (XEXP (SET_SRC (set), 1)) == SUBREG)
2172                       XEXP (SET_SRC (set), 1)
2173                         = alter_subreg (&XEXP (SET_SRC (set), 1));
2174                   }
2175                 if ((cc_status.value1 != 0
2176                      && rtx_equal_p (SET_SRC (set), cc_status.value1))
2177                     || (cc_status.value2 != 0
2178                         && rtx_equal_p (SET_SRC (set), cc_status.value2)))
2179                   {
2180                     /* Don't delete insn if it has an addressing side-effect.  */
2181                     if (! FIND_REG_INC_NOTE (insn, NULL_RTX)
2182                         /* or if anything in it is volatile.  */
2183                         && ! volatile_refs_p (PATTERN (insn)))
2184                       {
2185                         /* We don't really delete the insn; just ignore it.  */
2186                         last_ignored_compare = insn;
2187                         break;
2188                       }
2189                   }
2190               }
2191           }
2192 #endif
2193
2194 #ifndef STACK_REGS
2195         /* Don't bother outputting obvious no-ops, even without -O.
2196            This optimization is fast and doesn't interfere with debugging.
2197            Don't do this if the insn is in a delay slot, since this
2198            will cause an improper number of delay insns to be written.  */
2199         if (final_sequence == 0
2200             && prescan >= 0
2201             && GET_CODE (insn) == INSN && GET_CODE (body) == SET
2202             && GET_CODE (SET_SRC (body)) == REG
2203             && GET_CODE (SET_DEST (body)) == REG
2204             && REGNO (SET_SRC (body)) == REGNO (SET_DEST (body)))
2205           break;
2206 #endif
2207
2208 #ifdef HAVE_cc0
2209         /* If this is a conditional branch, maybe modify it
2210            if the cc's are in a nonstandard state
2211            so that it accomplishes the same thing that it would
2212            do straightforwardly if the cc's were set up normally.  */
2213
2214         if (cc_status.flags != 0
2215             && GET_CODE (insn) == JUMP_INSN
2216             && GET_CODE (body) == SET
2217             && SET_DEST (body) == pc_rtx
2218             && GET_CODE (SET_SRC (body)) == IF_THEN_ELSE
2219             && GET_RTX_CLASS (GET_CODE (XEXP (SET_SRC (body), 0))) == '<'
2220             && XEXP (XEXP (SET_SRC (body), 0), 0) == cc0_rtx
2221             /* This is done during prescan; it is not done again
2222                in final scan when prescan has been done.  */
2223             && prescan >= 0)
2224           {
2225             /* This function may alter the contents of its argument
2226                and clear some of the cc_status.flags bits.
2227                It may also return 1 meaning condition now always true
2228                or -1 meaning condition now always false
2229                or 2 meaning condition nontrivial but altered.  */
2230             int result = alter_cond (XEXP (SET_SRC (body), 0));
2231             /* If condition now has fixed value, replace the IF_THEN_ELSE
2232                with its then-operand or its else-operand.  */
2233             if (result == 1)
2234               SET_SRC (body) = XEXP (SET_SRC (body), 1);
2235             if (result == -1)
2236               SET_SRC (body) = XEXP (SET_SRC (body), 2);
2237
2238             /* The jump is now either unconditional or a no-op.
2239                If it has become a no-op, don't try to output it.
2240                (It would not be recognized.)  */
2241             if (SET_SRC (body) == pc_rtx)
2242               {
2243                 delete_insn (insn);
2244                 break;
2245               }
2246             else if (GET_CODE (SET_SRC (body)) == RETURN)
2247               /* Replace (set (pc) (return)) with (return).  */
2248               PATTERN (insn) = body = SET_SRC (body);
2249
2250             /* Rerecognize the instruction if it has changed.  */
2251             if (result != 0)
2252               INSN_CODE (insn) = -1;
2253           }
2254
2255         /* Make same adjustments to instructions that examine the
2256            condition codes without jumping and instructions that
2257            handle conditional moves (if this machine has either one).  */
2258
2259         if (cc_status.flags != 0
2260             && set != 0)
2261           {
2262             rtx cond_rtx, then_rtx, else_rtx;
2263
2264             if (GET_CODE (insn) != JUMP_INSN
2265                 && GET_CODE (SET_SRC (set)) == IF_THEN_ELSE)
2266               {
2267                 cond_rtx = XEXP (SET_SRC (set), 0);
2268                 then_rtx = XEXP (SET_SRC (set), 1);
2269                 else_rtx = XEXP (SET_SRC (set), 2);
2270               }
2271             else
2272               {
2273                 cond_rtx = SET_SRC (set);
2274                 then_rtx = const_true_rtx;
2275                 else_rtx = const0_rtx;
2276               }
2277
2278             switch (GET_CODE (cond_rtx))
2279               {
2280               case GTU:
2281               case GT:
2282               case LTU:
2283               case LT:
2284               case GEU:
2285               case GE:
2286               case LEU:
2287               case LE:
2288               case EQ:
2289               case NE:
2290                 {
2291                   int result;
2292                   if (XEXP (cond_rtx, 0) != cc0_rtx)
2293                     break;
2294                   result = alter_cond (cond_rtx);
2295                   if (result == 1)
2296                     validate_change (insn, &SET_SRC (set), then_rtx, 0);
2297                   else if (result == -1)
2298                     validate_change (insn, &SET_SRC (set), else_rtx, 0);
2299                   else if (result == 2)
2300                     INSN_CODE (insn) = -1;
2301                   if (SET_DEST (set) == SET_SRC (set))
2302                     delete_insn (insn);
2303                 }
2304                 break;
2305
2306               default:
2307                 break;
2308               }
2309           }
2310
2311 #endif
2312
2313 #ifdef HAVE_peephole
2314         /* Do machine-specific peephole optimizations if desired.  */
2315
2316         if (optimize && !flag_no_peephole && !nopeepholes)
2317           {
2318             rtx next = peephole (insn);
2319             /* When peepholing, if there were notes within the peephole,
2320                emit them before the peephole.  */
2321             if (next != 0 && next != NEXT_INSN (insn))
2322               {
2323                 rtx prev = PREV_INSN (insn);
2324
2325                 for (note = NEXT_INSN (insn); note != next;
2326                      note = NEXT_INSN (note))
2327                   final_scan_insn (note, file, optimize, prescan, nopeepholes);
2328
2329                 /* In case this is prescan, put the notes
2330                    in proper position for later rescan.  */
2331                 note = NEXT_INSN (insn);
2332                 PREV_INSN (note) = prev;
2333                 NEXT_INSN (prev) = note;
2334                 NEXT_INSN (PREV_INSN (next)) = insn;
2335                 PREV_INSN (insn) = PREV_INSN (next);
2336                 NEXT_INSN (insn) = next;
2337                 PREV_INSN (next) = insn;
2338               }
2339
2340             /* PEEPHOLE might have changed this.  */
2341             body = PATTERN (insn);
2342           }
2343 #endif
2344
2345         /* Try to recognize the instruction.
2346            If successful, verify that the operands satisfy the
2347            constraints for the instruction.  Crash if they don't,
2348            since `reload' should have changed them so that they do.  */
2349
2350         insn_code_number = recog_memoized (insn);
2351         cleanup_subreg_operands (insn);
2352
2353         /* Dump the insn in the assembly for debugging.  */
2354         if (flag_dump_rtl_in_asm)
2355           {
2356             print_rtx_head = ASM_COMMENT_START;
2357             print_rtl_single (asm_out_file, insn);
2358             print_rtx_head = "";
2359           }
2360
2361         if (! constrain_operands_cached (1))
2362           fatal_insn_not_found (insn);
2363
2364         /* Some target machines need to prescan each insn before
2365            it is output.  */
2366
2367 #ifdef FINAL_PRESCAN_INSN
2368         FINAL_PRESCAN_INSN (insn, recog_data.operand, recog_data.n_operands);
2369 #endif
2370
2371 #ifdef HAVE_conditional_execution
2372         if (GET_CODE (PATTERN (insn)) == COND_EXEC)
2373           current_insn_predicate = COND_EXEC_TEST (PATTERN (insn));
2374         else
2375           current_insn_predicate = NULL_RTX;
2376 #endif
2377
2378 #ifdef HAVE_cc0
2379         cc_prev_status = cc_status;
2380
2381         /* Update `cc_status' for this instruction.
2382            The instruction's output routine may change it further.
2383            If the output routine for a jump insn needs to depend
2384            on the cc status, it should look at cc_prev_status.  */
2385
2386         NOTICE_UPDATE_CC (body, insn);
2387 #endif
2388
2389         current_output_insn = debug_insn = insn;
2390
2391 #if defined (DWARF2_UNWIND_INFO)
2392         if (GET_CODE (insn) == CALL_INSN && dwarf2out_do_frame ())
2393           dwarf2out_frame_debug (insn);
2394 #endif
2395
2396         /* Find the proper template for this insn.  */
2397         template = get_insn_template (insn_code_number, insn);
2398
2399         /* If the C code returns 0, it means that it is a jump insn
2400            which follows a deleted test insn, and that test insn
2401            needs to be reinserted.  */
2402         if (template == 0)
2403           {
2404             rtx prev;
2405
2406             if (prev_nonnote_insn (insn) != last_ignored_compare)
2407               abort ();
2408
2409             /* We have already processed the notes between the setter and
2410                the user.  Make sure we don't process them again, this is
2411                particularly important if one of the notes is a block
2412                scope note or an EH note.  */
2413             for (prev = insn;
2414                  prev != last_ignored_compare;
2415                  prev = PREV_INSN (prev))
2416               {
2417                 if (GET_CODE (prev) == NOTE)
2418                   delete_insn (prev);   /* Use delete_note.  */
2419               }
2420
2421             return prev;
2422           }
2423
2424         /* If the template is the string "#", it means that this insn must
2425            be split.  */
2426         if (template[0] == '#' && template[1] == '\0')
2427           {
2428             rtx new = try_split (body, insn, 0);
2429
2430             /* If we didn't split the insn, go away.  */
2431             if (new == insn && PATTERN (new) == body)
2432               fatal_insn ("could not split insn", insn);
2433
2434 #ifdef HAVE_ATTR_length
2435             /* This instruction should have been split in shorten_branches,
2436                to ensure that we would have valid length info for the
2437                splitees.  */
2438             abort ();
2439 #endif
2440
2441             return new;
2442           }
2443
2444         if (prescan > 0)
2445           break;
2446
2447 #ifdef IA64_UNWIND_INFO
2448         IA64_UNWIND_EMIT (asm_out_file, insn);
2449 #endif
2450         /* Output assembler code from the template.  */
2451
2452         output_asm_insn (template, recog_data.operand);
2453
2454         /* If necessary, report the effect that the instruction has on
2455            the unwind info.   We've already done this for delay slots
2456            and call instructions.  */
2457 #if defined (DWARF2_UNWIND_INFO)
2458         if (GET_CODE (insn) == INSN
2459 #if !defined (HAVE_prologue)
2460             && !ACCUMULATE_OUTGOING_ARGS
2461 #endif
2462             && final_sequence == 0
2463             && dwarf2out_do_frame ())
2464           dwarf2out_frame_debug (insn);
2465 #endif
2466
2467 #if 0
2468         /* It's not at all clear why we did this and doing so used to
2469            interfere with tests that used REG_WAS_0 notes, which are
2470            now gone, so let's try with this out.  */
2471
2472         /* Mark this insn as having been output.  */
2473         INSN_DELETED_P (insn) = 1;
2474 #endif
2475
2476         /* Emit information for vtable gc.  */
2477         note = find_reg_note (insn, REG_VTABLE_REF, NULL_RTX);
2478
2479         current_output_insn = debug_insn = 0;
2480       }
2481     }
2482   return NEXT_INSN (insn);
2483 }
2484 \f
2485 /* Output debugging info to the assembler file FILE
2486    based on the NOTE-insn INSN, assumed to be a line number.  */
2487
2488 static bool
2489 notice_source_line (rtx insn)
2490 {
2491   const char *filename = insn_file (insn);
2492   int linenum = insn_line (insn);
2493
2494   if (filename && (filename != last_filename || last_linenum != linenum))
2495     {
2496       last_filename = filename;
2497       last_linenum = linenum;
2498       high_block_linenum = MAX (last_linenum, high_block_linenum);
2499       high_function_linenum = MAX (last_linenum, high_function_linenum);
2500       return true;
2501     }
2502   return false;
2503 }
2504 \f
2505 /* For each operand in INSN, simplify (subreg (reg)) so that it refers
2506    directly to the desired hard register.  */
2507
2508 void
2509 cleanup_subreg_operands (rtx insn)
2510 {
2511   int i;
2512   extract_insn_cached (insn);
2513   for (i = 0; i < recog_data.n_operands; i++)
2514     {
2515       /* The following test cannot use recog_data.operand when testing
2516          for a SUBREG: the underlying object might have been changed
2517          already if we are inside a match_operator expression that
2518          matches the else clause.  Instead we test the underlying
2519          expression directly.  */
2520       if (GET_CODE (*recog_data.operand_loc[i]) == SUBREG)
2521         recog_data.operand[i] = alter_subreg (recog_data.operand_loc[i]);
2522       else if (GET_CODE (recog_data.operand[i]) == PLUS
2523                || GET_CODE (recog_data.operand[i]) == MULT
2524                || GET_CODE (recog_data.operand[i]) == MEM)
2525         recog_data.operand[i] = walk_alter_subreg (recog_data.operand_loc[i]);
2526     }
2527
2528   for (i = 0; i < recog_data.n_dups; i++)
2529     {
2530       if (GET_CODE (*recog_data.dup_loc[i]) == SUBREG)
2531         *recog_data.dup_loc[i] = alter_subreg (recog_data.dup_loc[i]);
2532       else if (GET_CODE (*recog_data.dup_loc[i]) == PLUS
2533                || GET_CODE (*recog_data.dup_loc[i]) == MULT
2534                || GET_CODE (*recog_data.dup_loc[i]) == MEM)
2535         *recog_data.dup_loc[i] = walk_alter_subreg (recog_data.dup_loc[i]);
2536     }
2537 }
2538
2539 /* If X is a SUBREG, replace it with a REG or a MEM,
2540    based on the thing it is a subreg of.  */
2541
2542 rtx
2543 alter_subreg (rtx *xp)
2544 {
2545   rtx x = *xp;
2546   rtx y = SUBREG_REG (x);
2547
2548   /* simplify_subreg does not remove subreg from volatile references.
2549      We are required to.  */
2550   if (GET_CODE (y) == MEM)
2551     *xp = adjust_address (y, GET_MODE (x), SUBREG_BYTE (x));
2552   else
2553     {
2554       rtx new = simplify_subreg (GET_MODE (x), y, GET_MODE (y),
2555                                  SUBREG_BYTE (x));
2556
2557       if (new != 0)
2558         *xp = new;
2559       /* Simplify_subreg can't handle some REG cases, but we have to.  */
2560       else if (GET_CODE (y) == REG)
2561         {
2562           unsigned int regno = subreg_hard_regno (x, 1);
2563           *xp = gen_rtx_REG_offset (y, GET_MODE (x), regno, SUBREG_BYTE (x));
2564         }
2565       else
2566         abort ();
2567     }
2568
2569   return *xp;
2570 }
2571
2572 /* Do alter_subreg on all the SUBREGs contained in X.  */
2573
2574 static rtx
2575 walk_alter_subreg (rtx *xp)
2576 {
2577   rtx x = *xp;
2578   switch (GET_CODE (x))
2579     {
2580     case PLUS:
2581     case MULT:
2582       XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0));
2583       XEXP (x, 1) = walk_alter_subreg (&XEXP (x, 1));
2584       break;
2585
2586     case MEM:
2587       XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0));
2588       break;
2589
2590     case SUBREG:
2591       return alter_subreg (xp);
2592
2593     default:
2594       break;
2595     }
2596
2597   return *xp;
2598 }
2599 \f
2600 #ifdef HAVE_cc0
2601
2602 /* Given BODY, the body of a jump instruction, alter the jump condition
2603    as required by the bits that are set in cc_status.flags.
2604    Not all of the bits there can be handled at this level in all cases.
2605
2606    The value is normally 0.
2607    1 means that the condition has become always true.
2608    -1 means that the condition has become always false.
2609    2 means that COND has been altered.  */
2610
2611 static int
2612 alter_cond (rtx cond)
2613 {
2614   int value = 0;
2615
2616   if (cc_status.flags & CC_REVERSED)
2617     {
2618       value = 2;
2619       PUT_CODE (cond, swap_condition (GET_CODE (cond)));
2620     }
2621
2622   if (cc_status.flags & CC_INVERTED)
2623     {
2624       value = 2;
2625       PUT_CODE (cond, reverse_condition (GET_CODE (cond)));
2626     }
2627
2628   if (cc_status.flags & CC_NOT_POSITIVE)
2629     switch (GET_CODE (cond))
2630       {
2631       case LE:
2632       case LEU:
2633       case GEU:
2634         /* Jump becomes unconditional.  */
2635         return 1;
2636
2637       case GT:
2638       case GTU:
2639       case LTU:
2640         /* Jump becomes no-op.  */
2641         return -1;
2642
2643       case GE:
2644         PUT_CODE (cond, EQ);
2645         value = 2;
2646         break;
2647
2648       case LT:
2649         PUT_CODE (cond, NE);
2650         value = 2;
2651         break;
2652
2653       default:
2654         break;
2655       }
2656
2657   if (cc_status.flags & CC_NOT_NEGATIVE)
2658     switch (GET_CODE (cond))
2659       {
2660       case GE:
2661       case GEU:
2662         /* Jump becomes unconditional.  */
2663         return 1;
2664
2665       case LT:
2666       case LTU:
2667         /* Jump becomes no-op.  */
2668         return -1;
2669
2670       case LE:
2671       case LEU:
2672         PUT_CODE (cond, EQ);
2673         value = 2;
2674         break;
2675
2676       case GT:
2677       case GTU:
2678         PUT_CODE (cond, NE);
2679         value = 2;
2680         break;
2681
2682       default:
2683         break;
2684       }
2685
2686   if (cc_status.flags & CC_NO_OVERFLOW)
2687     switch (GET_CODE (cond))
2688       {
2689       case GEU:
2690         /* Jump becomes unconditional.  */
2691         return 1;
2692
2693       case LEU:
2694         PUT_CODE (cond, EQ);
2695         value = 2;
2696         break;
2697
2698       case GTU:
2699         PUT_CODE (cond, NE);
2700         value = 2;
2701         break;
2702
2703       case LTU:
2704         /* Jump becomes no-op.  */
2705         return -1;
2706
2707       default:
2708         break;
2709       }
2710
2711   if (cc_status.flags & (CC_Z_IN_NOT_N | CC_Z_IN_N))
2712     switch (GET_CODE (cond))
2713       {
2714       default:
2715         abort ();
2716
2717       case NE:
2718         PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? GE : LT);
2719         value = 2;
2720         break;
2721
2722       case EQ:
2723         PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? LT : GE);
2724         value = 2;
2725         break;
2726       }
2727
2728   if (cc_status.flags & CC_NOT_SIGNED)
2729     /* The flags are valid if signed condition operators are converted
2730        to unsigned.  */
2731     switch (GET_CODE (cond))
2732       {
2733       case LE:
2734         PUT_CODE (cond, LEU);
2735         value = 2;
2736         break;
2737
2738       case LT:
2739         PUT_CODE (cond, LTU);
2740         value = 2;
2741         break;
2742
2743       case GT:
2744         PUT_CODE (cond, GTU);
2745         value = 2;
2746         break;
2747
2748       case GE:
2749         PUT_CODE (cond, GEU);
2750         value = 2;
2751         break;
2752
2753       default:
2754         break;
2755       }
2756
2757   return value;
2758 }
2759 #endif
2760 \f
2761 /* Report inconsistency between the assembler template and the operands.
2762    In an `asm', it's the user's fault; otherwise, the compiler's fault.  */
2763
2764 void
2765 output_operand_lossage (const char *msgid, ...)
2766 {
2767   char *fmt_string;
2768   char *new_message;
2769   const char *pfx_str;
2770   va_list ap;
2771
2772   va_start (ap, msgid);
2773
2774   pfx_str = this_is_asm_operands ? _("invalid `asm': ") : "output_operand: ";
2775   asprintf (&fmt_string, "%s%s", pfx_str, _(msgid));
2776   vasprintf (&new_message, fmt_string, ap);
2777
2778   if (this_is_asm_operands)
2779     error_for_asm (this_is_asm_operands, "%s", new_message);
2780   else
2781     internal_error ("%s", new_message);
2782
2783   free (fmt_string);
2784   free (new_message);
2785   va_end (ap);
2786 }
2787 \f
2788 /* Output of assembler code from a template, and its subroutines.  */
2789
2790 /* Annotate the assembly with a comment describing the pattern and
2791    alternative used.  */
2792
2793 static void
2794 output_asm_name (void)
2795 {
2796   if (debug_insn)
2797     {
2798       int num = INSN_CODE (debug_insn);
2799       fprintf (asm_out_file, "\t%s %d\t%s",
2800                ASM_COMMENT_START, INSN_UID (debug_insn),
2801                insn_data[num].name);
2802       if (insn_data[num].n_alternatives > 1)
2803         fprintf (asm_out_file, "/%d", which_alternative + 1);
2804 #ifdef HAVE_ATTR_length
2805       fprintf (asm_out_file, "\t[length = %d]",
2806                get_attr_length (debug_insn));
2807 #endif
2808       /* Clear this so only the first assembler insn
2809          of any rtl insn will get the special comment for -dp.  */
2810       debug_insn = 0;
2811     }
2812 }
2813
2814 /* If OP is a REG or MEM and we can find a MEM_EXPR corresponding to it
2815    or its address, return that expr .  Set *PADDRESSP to 1 if the expr
2816    corresponds to the address of the object and 0 if to the object.  */
2817
2818 static tree
2819 get_mem_expr_from_op (rtx op, int *paddressp)
2820 {
2821   tree expr;
2822   int inner_addressp;
2823
2824   *paddressp = 0;
2825
2826   if (GET_CODE (op) == REG)
2827     return REG_EXPR (op);
2828   else if (GET_CODE (op) != MEM)
2829     return 0;
2830
2831   if (MEM_EXPR (op) != 0)
2832     return MEM_EXPR (op);
2833
2834   /* Otherwise we have an address, so indicate it and look at the address.  */
2835   *paddressp = 1;
2836   op = XEXP (op, 0);
2837
2838   /* First check if we have a decl for the address, then look at the right side
2839      if it is a PLUS.  Otherwise, strip off arithmetic and keep looking.
2840      But don't allow the address to itself be indirect.  */
2841   if ((expr = get_mem_expr_from_op (op, &inner_addressp)) && ! inner_addressp)
2842     return expr;
2843   else if (GET_CODE (op) == PLUS
2844            && (expr = get_mem_expr_from_op (XEXP (op, 1), &inner_addressp)))
2845     return expr;
2846
2847   while (GET_RTX_CLASS (GET_CODE (op)) == '1'
2848          || GET_RTX_CLASS (GET_CODE (op)) == '2')
2849     op = XEXP (op, 0);
2850
2851   expr = get_mem_expr_from_op (op, &inner_addressp);
2852   return inner_addressp ? 0 : expr;
2853 }
2854
2855 /* Output operand names for assembler instructions.  OPERANDS is the
2856    operand vector, OPORDER is the order to write the operands, and NOPS
2857    is the number of operands to write.  */
2858
2859 static void
2860 output_asm_operand_names (rtx *operands, int *oporder, int nops)
2861 {
2862   int wrote = 0;
2863   int i;
2864
2865   for (i = 0; i < nops; i++)
2866     {
2867       int addressp;
2868       rtx op = operands[oporder[i]];
2869       tree expr = get_mem_expr_from_op (op, &addressp);
2870
2871       fprintf (asm_out_file, "%c%s",
2872                wrote ? ',' : '\t', wrote ? "" : ASM_COMMENT_START);
2873       wrote = 1;
2874       if (expr)
2875         {
2876           fprintf (asm_out_file, "%s",
2877                    addressp ? "*" : "");
2878           print_mem_expr (asm_out_file, expr);
2879           wrote = 1;
2880         }
2881       else if (REG_P (op) && ORIGINAL_REGNO (op)
2882                && ORIGINAL_REGNO (op) != REGNO (op))
2883         fprintf (asm_out_file, " tmp%i", ORIGINAL_REGNO (op));
2884     }
2885 }
2886
2887 /* Output text from TEMPLATE to the assembler output file,
2888    obeying %-directions to substitute operands taken from
2889    the vector OPERANDS.
2890
2891    %N (for N a digit) means print operand N in usual manner.
2892    %lN means require operand N to be a CODE_LABEL or LABEL_REF
2893       and print the label name with no punctuation.
2894    %cN means require operand N to be a constant
2895       and print the constant expression with no punctuation.
2896    %aN means expect operand N to be a memory address
2897       (not a memory reference!) and print a reference
2898       to that address.
2899    %nN means expect operand N to be a constant
2900       and print a constant expression for minus the value
2901       of the operand, with no other punctuation.  */
2902
2903 void
2904 output_asm_insn (const char *template, rtx *operands)
2905 {
2906   const char *p;
2907   int c;
2908 #ifdef ASSEMBLER_DIALECT
2909   int dialect = 0;
2910 #endif
2911   int oporder[MAX_RECOG_OPERANDS];
2912   char opoutput[MAX_RECOG_OPERANDS];
2913   int ops = 0;
2914
2915   /* An insn may return a null string template
2916      in a case where no assembler code is needed.  */
2917   if (*template == 0)
2918     return;
2919
2920   memset (opoutput, 0, sizeof opoutput);
2921   p = template;
2922   putc ('\t', asm_out_file);
2923
2924 #ifdef ASM_OUTPUT_OPCODE
2925   ASM_OUTPUT_OPCODE (asm_out_file, p);
2926 #endif
2927
2928   while ((c = *p++))
2929     switch (c)
2930       {
2931       case '\n':
2932         if (flag_verbose_asm)
2933           output_asm_operand_names (operands, oporder, ops);
2934         if (flag_print_asm_name)
2935           output_asm_name ();
2936
2937         ops = 0;
2938         memset (opoutput, 0, sizeof opoutput);
2939
2940         putc (c, asm_out_file);
2941 #ifdef ASM_OUTPUT_OPCODE
2942         while ((c = *p) == '\t')
2943           {
2944             putc (c, asm_out_file);
2945             p++;
2946           }
2947         ASM_OUTPUT_OPCODE (asm_out_file, p);
2948 #endif
2949         break;
2950
2951 #ifdef ASSEMBLER_DIALECT
2952       case '{':
2953         {
2954           int i;
2955
2956           if (dialect)
2957             output_operand_lossage ("nested assembly dialect alternatives");
2958           else
2959             dialect = 1;
2960
2961           /* If we want the first dialect, do nothing.  Otherwise, skip
2962              DIALECT_NUMBER of strings ending with '|'.  */
2963           for (i = 0; i < dialect_number; i++)
2964             {
2965               while (*p && *p != '}' && *p++ != '|')
2966                 ;
2967               if (*p == '}')
2968                 break;
2969               if (*p == '|')
2970                 p++;
2971             }
2972
2973           if (*p == '\0')
2974             output_operand_lossage ("unterminated assembly dialect alternative");
2975         }
2976         break;
2977
2978       case '|':
2979         if (dialect)
2980           {
2981             /* Skip to close brace.  */
2982             do
2983               {
2984                 if (*p == '\0')
2985                   {
2986                     output_operand_lossage ("unterminated assembly dialect alternative");
2987                     break;
2988                   }
2989               }
2990             while (*p++ != '}');
2991             dialect = 0;
2992           }
2993         else
2994           putc (c, asm_out_file);
2995         break;
2996
2997       case '}':
2998         if (! dialect)
2999           putc (c, asm_out_file);
3000         dialect = 0;
3001         break;
3002 #endif
3003
3004       case '%':
3005         /* %% outputs a single %.  */
3006         if (*p == '%')
3007           {
3008             p++;
3009             putc (c, asm_out_file);
3010           }
3011         /* %= outputs a number which is unique to each insn in the entire
3012            compilation.  This is useful for making local labels that are
3013            referred to more than once in a given insn.  */
3014         else if (*p == '=')
3015           {
3016             p++;
3017             fprintf (asm_out_file, "%d", insn_counter);
3018           }
3019         /* % followed by a letter and some digits
3020            outputs an operand in a special way depending on the letter.
3021            Letters `acln' are implemented directly.
3022            Other letters are passed to `output_operand' so that
3023            the PRINT_OPERAND macro can define them.  */
3024         else if (ISALPHA (*p))
3025           {
3026             int letter = *p++;
3027             c = atoi (p);
3028
3029             if (! ISDIGIT (*p))
3030               output_operand_lossage ("operand number missing after %%-letter");
3031             else if (this_is_asm_operands
3032                      && (c < 0 || (unsigned int) c >= insn_noperands))
3033               output_operand_lossage ("operand number out of range");
3034             else if (letter == 'l')
3035               output_asm_label (operands[c]);
3036             else if (letter == 'a')
3037               output_address (operands[c]);
3038             else if (letter == 'c')
3039               {
3040                 if (CONSTANT_ADDRESS_P (operands[c]))
3041                   output_addr_const (asm_out_file, operands[c]);
3042                 else
3043                   output_operand (operands[c], 'c');
3044               }
3045             else if (letter == 'n')
3046               {
3047                 if (GET_CODE (operands[c]) == CONST_INT)
3048                   fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC,
3049                            - INTVAL (operands[c]));
3050                 else
3051                   {
3052                     putc ('-', asm_out_file);
3053                     output_addr_const (asm_out_file, operands[c]);
3054                   }
3055               }
3056             else
3057               output_operand (operands[c], letter);
3058
3059             if (!opoutput[c])
3060               oporder[ops++] = c;
3061             opoutput[c] = 1;
3062
3063             while (ISDIGIT (c = *p))
3064               p++;
3065           }
3066         /* % followed by a digit outputs an operand the default way.  */
3067         else if (ISDIGIT (*p))
3068           {
3069             c = atoi (p);
3070             if (this_is_asm_operands
3071                 && (c < 0 || (unsigned int) c >= insn_noperands))
3072               output_operand_lossage ("operand number out of range");
3073             else
3074               output_operand (operands[c], 0);
3075
3076             if (!opoutput[c])
3077               oporder[ops++] = c;
3078             opoutput[c] = 1;
3079
3080             while (ISDIGIT (c = *p))
3081               p++;
3082           }
3083         /* % followed by punctuation: output something for that
3084            punctuation character alone, with no operand.
3085            The PRINT_OPERAND macro decides what is actually done.  */
3086 #ifdef PRINT_OPERAND_PUNCT_VALID_P
3087         else if (PRINT_OPERAND_PUNCT_VALID_P ((unsigned char) *p))
3088           output_operand (NULL_RTX, *p++);
3089 #endif
3090         else
3091           output_operand_lossage ("invalid %%-code");
3092         break;
3093
3094       default:
3095         putc (c, asm_out_file);
3096       }
3097
3098   /* Write out the variable names for operands, if we know them.  */
3099   if (flag_verbose_asm)
3100     output_asm_operand_names (operands, oporder, ops);
3101   if (flag_print_asm_name)
3102     output_asm_name ();
3103
3104   putc ('\n', asm_out_file);
3105 }
3106 \f
3107 /* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol.  */
3108
3109 void
3110 output_asm_label (rtx x)
3111 {
3112   char buf[256];
3113
3114   if (GET_CODE (x) == LABEL_REF)
3115     x = XEXP (x, 0);
3116   if (GET_CODE (x) == CODE_LABEL
3117       || (GET_CODE (x) == NOTE
3118           && NOTE_LINE_NUMBER (x) == NOTE_INSN_DELETED_LABEL))
3119     ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3120   else
3121     output_operand_lossage ("`%%l' operand isn't a label");
3122
3123   assemble_name (asm_out_file, buf);
3124 }
3125
3126 /* Print operand X using machine-dependent assembler syntax.
3127    The macro PRINT_OPERAND is defined just to control this function.
3128    CODE is a non-digit that preceded the operand-number in the % spec,
3129    such as 'z' if the spec was `%z3'.  CODE is 0 if there was no char
3130    between the % and the digits.
3131    When CODE is a non-letter, X is 0.
3132
3133    The meanings of the letters are machine-dependent and controlled
3134    by PRINT_OPERAND.  */
3135
3136 static void
3137 output_operand (rtx x, int code ATTRIBUTE_UNUSED)
3138 {
3139   if (x && GET_CODE (x) == SUBREG)
3140     x = alter_subreg (&x);
3141
3142   /* If X is a pseudo-register, abort now rather than writing trash to the
3143      assembler file.  */
3144
3145   if (x && GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER)
3146     abort ();
3147
3148   PRINT_OPERAND (asm_out_file, x, code);
3149 }
3150
3151 /* Print a memory reference operand for address X
3152    using machine-dependent assembler syntax.
3153    The macro PRINT_OPERAND_ADDRESS exists just to control this function.  */
3154
3155 void
3156 output_address (rtx x)
3157 {
3158   walk_alter_subreg (&x);
3159   PRINT_OPERAND_ADDRESS (asm_out_file, x);
3160 }
3161 \f
3162 /* Print an integer constant expression in assembler syntax.
3163    Addition and subtraction are the only arithmetic
3164    that may appear in these expressions.  */
3165
3166 void
3167 output_addr_const (FILE *file, rtx x)
3168 {
3169   char buf[256];
3170
3171  restart:
3172   switch (GET_CODE (x))
3173     {
3174     case PC:
3175       putc ('.', file);
3176       break;
3177
3178     case SYMBOL_REF:
3179 #ifdef ASM_OUTPUT_SYMBOL_REF
3180       ASM_OUTPUT_SYMBOL_REF (file, x);
3181 #else
3182       assemble_name (file, XSTR (x, 0));
3183 #endif
3184       break;
3185
3186     case LABEL_REF:
3187       x = XEXP (x, 0);
3188       /* Fall through.  */
3189     case CODE_LABEL:
3190       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3191 #ifdef ASM_OUTPUT_LABEL_REF
3192       ASM_OUTPUT_LABEL_REF (file, buf);
3193 #else
3194       assemble_name (file, buf);
3195 #endif
3196       break;
3197
3198     case CONST_INT:
3199       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
3200       break;
3201
3202     case CONST:
3203       /* This used to output parentheses around the expression,
3204          but that does not work on the 386 (either ATT or BSD assembler).  */
3205       output_addr_const (file, XEXP (x, 0));
3206       break;
3207
3208     case CONST_DOUBLE:
3209       if (GET_MODE (x) == VOIDmode)
3210         {
3211           /* We can use %d if the number is one word and positive.  */
3212           if (CONST_DOUBLE_HIGH (x))
3213             fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
3214                      CONST_DOUBLE_HIGH (x), CONST_DOUBLE_LOW (x));
3215           else if (CONST_DOUBLE_LOW (x) < 0)
3216             fprintf (file, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_LOW (x));
3217           else
3218             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
3219         }
3220       else
3221         /* We can't handle floating point constants;
3222            PRINT_OPERAND must handle them.  */
3223         output_operand_lossage ("floating constant misused");
3224       break;
3225
3226     case PLUS:
3227       /* Some assemblers need integer constants to appear last (eg masm).  */
3228       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
3229         {
3230           output_addr_const (file, XEXP (x, 1));
3231           if (INTVAL (XEXP (x, 0)) >= 0)
3232             fprintf (file, "+");
3233           output_addr_const (file, XEXP (x, 0));
3234         }
3235       else
3236         {
3237           output_addr_const (file, XEXP (x, 0));
3238           if (GET_CODE (XEXP (x, 1)) != CONST_INT
3239               || INTVAL (XEXP (x, 1)) >= 0)
3240             fprintf (file, "+");
3241           output_addr_const (file, XEXP (x, 1));
3242         }
3243       break;
3244
3245     case MINUS:
3246       /* Avoid outputting things like x-x or x+5-x,
3247          since some assemblers can't handle that.  */
3248       x = simplify_subtraction (x);
3249       if (GET_CODE (x) != MINUS)
3250         goto restart;
3251
3252       output_addr_const (file, XEXP (x, 0));
3253       fprintf (file, "-");
3254       if ((GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0)
3255           || GET_CODE (XEXP (x, 1)) == PC
3256           || GET_CODE (XEXP (x, 1)) == SYMBOL_REF)
3257         output_addr_const (file, XEXP (x, 1));
3258       else
3259         {
3260           fputs (targetm.asm_out.open_paren, file);
3261           output_addr_const (file, XEXP (x, 1));
3262           fputs (targetm.asm_out.close_paren, file);
3263         }
3264       break;
3265
3266     case ZERO_EXTEND:
3267     case SIGN_EXTEND:
3268     case SUBREG:
3269       output_addr_const (file, XEXP (x, 0));
3270       break;
3271
3272     default:
3273 #ifdef OUTPUT_ADDR_CONST_EXTRA
3274       OUTPUT_ADDR_CONST_EXTRA (file, x, fail);
3275       break;
3276
3277     fail:
3278 #endif
3279       output_operand_lossage ("invalid expression as operand");
3280     }
3281 }
3282 \f
3283 /* A poor man's fprintf, with the added features of %I, %R, %L, and %U.
3284    %R prints the value of REGISTER_PREFIX.
3285    %L prints the value of LOCAL_LABEL_PREFIX.
3286    %U prints the value of USER_LABEL_PREFIX.
3287    %I prints the value of IMMEDIATE_PREFIX.
3288    %O runs ASM_OUTPUT_OPCODE to transform what follows in the string.
3289    Also supported are %d, %i, %u, %x, %X, %o, %c, %s and %%.
3290
3291    We handle alternate assembler dialects here, just like output_asm_insn.  */
3292
3293 void
3294 asm_fprintf (FILE *file, const char *p, ...)
3295 {
3296   char buf[10];
3297   char *q, c;
3298   va_list argptr;
3299
3300   va_start (argptr, p);
3301
3302   buf[0] = '%';
3303
3304   while ((c = *p++))
3305     switch (c)
3306       {
3307 #ifdef ASSEMBLER_DIALECT
3308       case '{':
3309         {
3310           int i;
3311
3312           /* If we want the first dialect, do nothing.  Otherwise, skip
3313              DIALECT_NUMBER of strings ending with '|'.  */
3314           for (i = 0; i < dialect_number; i++)
3315             {
3316               while (*p && *p++ != '|')
3317                 ;
3318
3319               if (*p == '|')
3320                 p++;
3321             }
3322         }
3323         break;
3324
3325       case '|':
3326         /* Skip to close brace.  */
3327         while (*p && *p++ != '}')
3328           ;
3329         break;
3330
3331       case '}':
3332         break;
3333 #endif
3334
3335       case '%':
3336         c = *p++;
3337         q = &buf[1];
3338         while (strchr ("-+ #0", c))
3339           {
3340             *q++ = c;
3341             c = *p++;
3342           }
3343         while (ISDIGIT (c) || c == '.')
3344           {
3345             *q++ = c;
3346             c = *p++;
3347           }
3348         switch (c)
3349           {
3350           case '%':
3351             putc ('%', file);
3352             break;
3353
3354           case 'd':  case 'i':  case 'u':
3355           case 'x':  case 'X':  case 'o':
3356           case 'c':
3357             *q++ = c;
3358             *q = 0;
3359             fprintf (file, buf, va_arg (argptr, int));
3360             break;
3361
3362           case 'w':
3363             /* This is a prefix to the 'd', 'i', 'u', 'x', 'X', and
3364                'o' cases, but we do not check for those cases.  It
3365                means that the value is a HOST_WIDE_INT, which may be
3366                either `long' or `long long'.  */
3367             memcpy (q, HOST_WIDE_INT_PRINT, strlen (HOST_WIDE_INT_PRINT));
3368             q += strlen (HOST_WIDE_INT_PRINT);
3369             *q++ = *p++;
3370             *q = 0;
3371             fprintf (file, buf, va_arg (argptr, HOST_WIDE_INT));
3372             break;
3373
3374           case 'l':
3375             *q++ = c;
3376 #ifdef HAVE_LONG_LONG
3377             if (*p == 'l')
3378               {
3379                 *q++ = *p++;
3380                 *q++ = *p++;
3381                 *q = 0;
3382                 fprintf (file, buf, va_arg (argptr, long long));
3383               }
3384             else
3385 #endif
3386               {
3387                 *q++ = *p++;
3388                 *q = 0;
3389                 fprintf (file, buf, va_arg (argptr, long));
3390               }
3391
3392             break;
3393
3394           case 's':
3395             *q++ = c;
3396             *q = 0;
3397             fprintf (file, buf, va_arg (argptr, char *));
3398             break;
3399
3400           case 'O':
3401 #ifdef ASM_OUTPUT_OPCODE
3402             ASM_OUTPUT_OPCODE (asm_out_file, p);
3403 #endif
3404             break;
3405
3406           case 'R':
3407 #ifdef REGISTER_PREFIX
3408             fprintf (file, "%s", REGISTER_PREFIX);
3409 #endif
3410             break;
3411
3412           case 'I':
3413 #ifdef IMMEDIATE_PREFIX
3414             fprintf (file, "%s", IMMEDIATE_PREFIX);
3415 #endif
3416             break;
3417
3418           case 'L':
3419 #ifdef LOCAL_LABEL_PREFIX
3420             fprintf (file, "%s", LOCAL_LABEL_PREFIX);
3421 #endif
3422             break;
3423
3424           case 'U':
3425             fputs (user_label_prefix, file);
3426             break;
3427
3428 #ifdef ASM_FPRINTF_EXTENSIONS
3429             /* Uppercase letters are reserved for general use by asm_fprintf
3430                and so are not available to target specific code.  In order to
3431                prevent the ASM_FPRINTF_EXTENSIONS macro from using them then,
3432                they are defined here.  As they get turned into real extensions
3433                to asm_fprintf they should be removed from this list.  */
3434           case 'A': case 'B': case 'C': case 'D': case 'E':
3435           case 'F': case 'G': case 'H': case 'J': case 'K':
3436           case 'M': case 'N': case 'P': case 'Q': case 'S':
3437           case 'T': case 'V': case 'W': case 'Y': case 'Z':
3438             break;
3439
3440           ASM_FPRINTF_EXTENSIONS (file, argptr, p)
3441 #endif
3442           default:
3443             abort ();
3444           }
3445         break;
3446
3447       default:
3448         putc (c, file);
3449       }
3450   va_end (argptr);
3451 }
3452 \f
3453 /* Split up a CONST_DOUBLE or integer constant rtx
3454    into two rtx's for single words,
3455    storing in *FIRST the word that comes first in memory in the target
3456    and in *SECOND the other.  */
3457
3458 void
3459 split_double (rtx value, rtx *first, rtx *second)
3460 {
3461   if (GET_CODE (value) == CONST_INT)
3462     {
3463       if (HOST_BITS_PER_WIDE_INT >= (2 * BITS_PER_WORD))
3464         {
3465           /* In this case the CONST_INT holds both target words.
3466              Extract the bits from it into two word-sized pieces.
3467              Sign extend each half to HOST_WIDE_INT.  */
3468           unsigned HOST_WIDE_INT low, high;
3469           unsigned HOST_WIDE_INT mask, sign_bit, sign_extend;
3470
3471           /* Set sign_bit to the most significant bit of a word.  */
3472           sign_bit = 1;
3473           sign_bit <<= BITS_PER_WORD - 1;
3474
3475           /* Set mask so that all bits of the word are set.  We could
3476              have used 1 << BITS_PER_WORD instead of basing the
3477              calculation on sign_bit.  However, on machines where
3478              HOST_BITS_PER_WIDE_INT == BITS_PER_WORD, it could cause a
3479              compiler warning, even though the code would never be
3480              executed.  */
3481           mask = sign_bit << 1;
3482           mask--;
3483
3484           /* Set sign_extend as any remaining bits.  */
3485           sign_extend = ~mask;
3486
3487           /* Pick the lower word and sign-extend it.  */
3488           low = INTVAL (value);
3489           low &= mask;
3490           if (low & sign_bit)
3491             low |= sign_extend;
3492
3493           /* Pick the higher word, shifted to the least significant
3494              bits, and sign-extend it.  */
3495           high = INTVAL (value);
3496           high >>= BITS_PER_WORD - 1;
3497           high >>= 1;
3498           high &= mask;
3499           if (high & sign_bit)
3500             high |= sign_extend;
3501
3502           /* Store the words in the target machine order.  */
3503           if (WORDS_BIG_ENDIAN)
3504             {
3505               *first = GEN_INT (high);
3506               *second = GEN_INT (low);
3507             }
3508           else
3509             {
3510               *first = GEN_INT (low);
3511               *second = GEN_INT (high);
3512             }
3513         }
3514       else
3515         {
3516           /* The rule for using CONST_INT for a wider mode
3517              is that we regard the value as signed.
3518              So sign-extend it.  */
3519           rtx high = (INTVAL (value) < 0 ? constm1_rtx : const0_rtx);
3520           if (WORDS_BIG_ENDIAN)
3521             {
3522               *first = high;
3523               *second = value;
3524             }
3525           else
3526             {
3527               *first = value;
3528               *second = high;
3529             }
3530         }
3531     }
3532   else if (GET_CODE (value) != CONST_DOUBLE)
3533     {
3534       if (WORDS_BIG_ENDIAN)
3535         {
3536           *first = const0_rtx;
3537           *second = value;
3538         }
3539       else
3540         {
3541           *first = value;
3542           *second = const0_rtx;
3543         }
3544     }
3545   else if (GET_MODE (value) == VOIDmode
3546            /* This is the old way we did CONST_DOUBLE integers.  */
3547            || GET_MODE_CLASS (GET_MODE (value)) == MODE_INT)
3548     {
3549       /* In an integer, the words are defined as most and least significant.
3550          So order them by the target's convention.  */
3551       if (WORDS_BIG_ENDIAN)
3552         {
3553           *first = GEN_INT (CONST_DOUBLE_HIGH (value));
3554           *second = GEN_INT (CONST_DOUBLE_LOW (value));
3555         }
3556       else
3557         {
3558           *first = GEN_INT (CONST_DOUBLE_LOW (value));
3559           *second = GEN_INT (CONST_DOUBLE_HIGH (value));
3560         }
3561     }
3562   else
3563     {
3564       REAL_VALUE_TYPE r;
3565       long l[2];
3566       REAL_VALUE_FROM_CONST_DOUBLE (r, value);
3567
3568       /* Note, this converts the REAL_VALUE_TYPE to the target's
3569          format, splits up the floating point double and outputs
3570          exactly 32 bits of it into each of l[0] and l[1] --
3571          not necessarily BITS_PER_WORD bits.  */
3572       REAL_VALUE_TO_TARGET_DOUBLE (r, l);
3573
3574       /* If 32 bits is an entire word for the target, but not for the host,
3575          then sign-extend on the host so that the number will look the same
3576          way on the host that it would on the target.  See for instance
3577          simplify_unary_operation.  The #if is needed to avoid compiler
3578          warnings.  */
3579
3580 #if HOST_BITS_PER_LONG > 32
3581       if (BITS_PER_WORD < HOST_BITS_PER_LONG && BITS_PER_WORD == 32)
3582         {
3583           if (l[0] & ((long) 1 << 31))
3584             l[0] |= ((long) (-1) << 32);
3585           if (l[1] & ((long) 1 << 31))
3586             l[1] |= ((long) (-1) << 32);
3587         }
3588 #endif
3589
3590       *first = GEN_INT ((HOST_WIDE_INT) l[0]);
3591       *second = GEN_INT ((HOST_WIDE_INT) l[1]);
3592     }
3593 }
3594 \f
3595 /* Return nonzero if this function has no function calls.  */
3596
3597 int
3598 leaf_function_p (void)
3599 {
3600   rtx insn;
3601   rtx link;
3602
3603   if (current_function_profile || profile_arc_flag)
3604     return 0;
3605
3606   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3607     {
3608       if (GET_CODE (insn) == CALL_INSN
3609           && ! SIBLING_CALL_P (insn))
3610         return 0;
3611       if (GET_CODE (insn) == INSN
3612           && GET_CODE (PATTERN (insn)) == SEQUENCE
3613           && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == CALL_INSN
3614           && ! SIBLING_CALL_P (XVECEXP (PATTERN (insn), 0, 0)))
3615         return 0;
3616     }
3617   for (link = current_function_epilogue_delay_list;
3618        link;
3619        link = XEXP (link, 1))
3620     {
3621       insn = XEXP (link, 0);
3622
3623       if (GET_CODE (insn) == CALL_INSN
3624           && ! SIBLING_CALL_P (insn))
3625         return 0;
3626       if (GET_CODE (insn) == INSN
3627           && GET_CODE (PATTERN (insn)) == SEQUENCE
3628           && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == CALL_INSN
3629           && ! SIBLING_CALL_P (XVECEXP (PATTERN (insn), 0, 0)))
3630         return 0;
3631     }
3632
3633   return 1;
3634 }
3635
3636 /* Return 1 if branch is a forward branch.
3637    Uses insn_shuid array, so it works only in the final pass.  May be used by
3638    output templates to customary add branch prediction hints.
3639  */
3640 int
3641 final_forward_branch_p (rtx insn)
3642 {
3643   int insn_id, label_id;
3644   if (!uid_shuid)
3645     abort ();
3646   insn_id = INSN_SHUID (insn);
3647   label_id = INSN_SHUID (JUMP_LABEL (insn));
3648   /* We've hit some insns that does not have id information available.  */
3649   if (!insn_id || !label_id)
3650     abort ();
3651   return insn_id < label_id;
3652 }
3653
3654 /* On some machines, a function with no call insns
3655    can run faster if it doesn't create its own register window.
3656    When output, the leaf function should use only the "output"
3657    registers.  Ordinarily, the function would be compiled to use
3658    the "input" registers to find its arguments; it is a candidate
3659    for leaf treatment if it uses only the "input" registers.
3660    Leaf function treatment means renumbering so the function
3661    uses the "output" registers instead.  */
3662
3663 #ifdef LEAF_REGISTERS
3664
3665 /* Return 1 if this function uses only the registers that can be
3666    safely renumbered.  */
3667
3668 int
3669 only_leaf_regs_used (void)
3670 {
3671   int i;
3672   const char *const permitted_reg_in_leaf_functions = LEAF_REGISTERS;
3673
3674   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3675     if ((regs_ever_live[i] || global_regs[i])
3676         && ! permitted_reg_in_leaf_functions[i])
3677       return 0;
3678
3679   if (current_function_uses_pic_offset_table
3680       && pic_offset_table_rtx != 0
3681       && GET_CODE (pic_offset_table_rtx) == REG
3682       && ! permitted_reg_in_leaf_functions[REGNO (pic_offset_table_rtx)])
3683     return 0;
3684
3685   return 1;
3686 }
3687
3688 /* Scan all instructions and renumber all registers into those
3689    available in leaf functions.  */
3690
3691 static void
3692 leaf_renumber_regs (rtx first)
3693 {
3694   rtx insn;
3695
3696   /* Renumber only the actual patterns.
3697      The reg-notes can contain frame pointer refs,
3698      and renumbering them could crash, and should not be needed.  */
3699   for (insn = first; insn; insn = NEXT_INSN (insn))
3700     if (INSN_P (insn))
3701       leaf_renumber_regs_insn (PATTERN (insn));
3702   for (insn = current_function_epilogue_delay_list;
3703        insn;
3704        insn = XEXP (insn, 1))
3705     if (INSN_P (XEXP (insn, 0)))
3706       leaf_renumber_regs_insn (PATTERN (XEXP (insn, 0)));
3707 }
3708
3709 /* Scan IN_RTX and its subexpressions, and renumber all regs into those
3710    available in leaf functions.  */
3711
3712 void
3713 leaf_renumber_regs_insn (rtx in_rtx)
3714 {
3715   int i, j;
3716   const char *format_ptr;
3717
3718   if (in_rtx == 0)
3719     return;
3720
3721   /* Renumber all input-registers into output-registers.
3722      renumbered_regs would be 1 for an output-register;
3723      they  */
3724
3725   if (GET_CODE (in_rtx) == REG)
3726     {
3727       int newreg;
3728
3729       /* Don't renumber the same reg twice.  */
3730       if (in_rtx->used)
3731         return;
3732
3733       newreg = REGNO (in_rtx);
3734       /* Don't try to renumber pseudo regs.  It is possible for a pseudo reg
3735          to reach here as part of a REG_NOTE.  */
3736       if (newreg >= FIRST_PSEUDO_REGISTER)
3737         {
3738           in_rtx->used = 1;
3739           return;
3740         }
3741       newreg = LEAF_REG_REMAP (newreg);
3742       if (newreg < 0)
3743         abort ();
3744       regs_ever_live[REGNO (in_rtx)] = 0;
3745       regs_ever_live[newreg] = 1;
3746       REGNO (in_rtx) = newreg;
3747       in_rtx->used = 1;
3748     }
3749
3750   if (INSN_P (in_rtx))
3751     {
3752       /* Inside a SEQUENCE, we find insns.
3753          Renumber just the patterns of these insns,
3754          just as we do for the top-level insns.  */
3755       leaf_renumber_regs_insn (PATTERN (in_rtx));
3756       return;
3757     }
3758
3759   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
3760
3761   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
3762     switch (*format_ptr++)
3763       {
3764       case 'e':
3765         leaf_renumber_regs_insn (XEXP (in_rtx, i));
3766         break;
3767
3768       case 'E':
3769         if (NULL != XVEC (in_rtx, i))
3770           {
3771             for (j = 0; j < XVECLEN (in_rtx, i); j++)
3772               leaf_renumber_regs_insn (XVECEXP (in_rtx, i, j));
3773           }
3774         break;
3775
3776       case 'S':
3777       case 's':
3778       case '0':
3779       case 'i':
3780       case 'w':
3781       case 'n':
3782       case 'u':
3783         break;
3784
3785       default:
3786         abort ();
3787       }
3788 }
3789 #endif
3790
3791
3792 /* When -gused is used, emit debug info for only used symbols. But in
3793    addition to the standard intercepted debug_hooks there are some direct
3794    calls into this file, i.e., dbxout_symbol, dbxout_parms, and dbxout_reg_params.
3795    Those routines may also be called from a higher level intercepted routine. So
3796    to prevent recording data for an inner call to one of these for an intercept,
3797    we maintain a intercept nesting counter (debug_nesting). We only save the
3798    intercepted arguments if the nesting is 1.  */
3799 int debug_nesting = 0;
3800
3801 static tree *symbol_queue;
3802 int symbol_queue_index = 0;
3803 static int symbol_queue_size = 0;
3804
3805 /* Generate the symbols for any queued up type symbols we encountered
3806    while generating the type info for some originally used symbol.
3807    This might generate additional entries in the queue.  Only when
3808    the nesting depth goes to 0 is this routine called.  */
3809
3810 void
3811 debug_flush_symbol_queue (void)
3812 {
3813   int i;
3814
3815   /* Make sure that additionally queued items are not flushed
3816      prematurely.  */
3817
3818   ++debug_nesting;
3819
3820   for (i = 0; i < symbol_queue_index; ++i)
3821     {
3822       /* If we pushed queued symbols then such symbols are must be
3823          output no matter what anyone else says.  Specifically,
3824          we need to make sure dbxout_symbol() thinks the symbol was
3825          used and also we need to override TYPE_DECL_SUPPRESS_DEBUG
3826          which may be set for outside reasons.  */
3827       int saved_tree_used = TREE_USED (symbol_queue[i]);
3828       int saved_suppress_debug = TYPE_DECL_SUPPRESS_DEBUG (symbol_queue[i]);
3829       TREE_USED (symbol_queue[i]) = 1;
3830       TYPE_DECL_SUPPRESS_DEBUG (symbol_queue[i]) = 0;
3831
3832 #ifdef DBX_DEBUGGING_INFO
3833       dbxout_symbol (symbol_queue[i], 0);
3834 #endif
3835
3836       TREE_USED (symbol_queue[i]) = saved_tree_used;
3837       TYPE_DECL_SUPPRESS_DEBUG (symbol_queue[i]) = saved_suppress_debug;
3838     }
3839
3840   symbol_queue_index = 0;
3841   --debug_nesting;
3842 }
3843
3844 /* Queue a type symbol needed as part of the definition of a decl
3845    symbol.  These symbols are generated when debug_flush_symbol_queue()
3846    is called.  */
3847
3848 void
3849 debug_queue_symbol (tree decl)
3850 {
3851   if (symbol_queue_index >= symbol_queue_size)
3852     {
3853       symbol_queue_size += 10;
3854       symbol_queue = xrealloc (symbol_queue,
3855                                symbol_queue_size * sizeof (tree));
3856     }
3857
3858   symbol_queue[symbol_queue_index++] = decl;
3859 }
3860
3861 /* Free symbol queue.  */
3862 void
3863 debug_free_queue (void)
3864 {
3865   if (symbol_queue)
3866     {
3867       free (symbol_queue);
3868       symbol_queue = NULL;
3869       symbol_queue_size = 0;
3870     }
3871 }