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