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