OSDN Git Service

* config/fp-bit.h (LSHIFT): Take shift count parameter.
[pf3gnuchains/gcc-fork.git] / gcc / final.c
1 /* Convert RTL to assembler code and output it, for GNU compiler.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002, 2003, 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               unlikely_text_section ();
1724             }
1725           else
1726             {
1727               (*debug_hooks->switch_text_section) ();
1728               text_section ();
1729             }
1730           break;
1731           
1732         case NOTE_INSN_BASIC_BLOCK:
1733           
1734 #ifdef TARGET_UNWIND_INFO
1735           targetm.asm_out.unwind_emit (asm_out_file, insn);
1736 #endif
1737
1738           if (flag_debug_asm)
1739             fprintf (asm_out_file, "\t%s basic block %d\n",
1740                      ASM_COMMENT_START, NOTE_BASIC_BLOCK (insn)->index);
1741
1742           if ((*seen & (SEEN_EMITTED | SEEN_BB)) == SEEN_BB)
1743             {
1744               *seen |= SEEN_EMITTED;
1745               force_source_line = true;
1746             }
1747           else
1748             *seen |= SEEN_BB;
1749
1750           break;
1751
1752         case NOTE_INSN_EH_REGION_BEG:
1753           ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LEHB",
1754                                   NOTE_EH_HANDLER (insn));
1755           break;
1756
1757         case NOTE_INSN_EH_REGION_END:
1758           ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LEHE",
1759                                   NOTE_EH_HANDLER (insn));
1760           break;
1761
1762         case NOTE_INSN_PROLOGUE_END:
1763           targetm.asm_out.function_end_prologue (file);
1764           profile_after_prologue (file);
1765
1766           if ((*seen & (SEEN_EMITTED | SEEN_NOTE)) == SEEN_NOTE)
1767             {
1768               *seen |= SEEN_EMITTED;
1769               force_source_line = true;
1770             }
1771           else
1772             *seen |= SEEN_NOTE;
1773
1774           break;
1775
1776         case NOTE_INSN_EPILOGUE_BEG:
1777           targetm.asm_out.function_begin_epilogue (file);
1778           break;
1779
1780         case NOTE_INSN_FUNCTION_BEG:
1781           app_disable ();
1782           (*debug_hooks->end_prologue) (last_linenum, last_filename);
1783
1784           if ((*seen & (SEEN_EMITTED | SEEN_NOTE)) == SEEN_NOTE)
1785             {
1786               *seen |= SEEN_EMITTED;
1787               force_source_line = true;
1788             }
1789           else
1790             *seen |= SEEN_NOTE;
1791
1792           break;
1793
1794         case NOTE_INSN_BLOCK_BEG:
1795           if (debug_info_level == DINFO_LEVEL_NORMAL
1796               || debug_info_level == DINFO_LEVEL_VERBOSE
1797               || write_symbols == DWARF2_DEBUG
1798               || write_symbols == VMS_AND_DWARF2_DEBUG
1799               || write_symbols == VMS_DEBUG)
1800             {
1801               int n = BLOCK_NUMBER (NOTE_BLOCK (insn));
1802
1803               app_disable ();
1804               ++block_depth;
1805               high_block_linenum = last_linenum;
1806
1807               /* Output debugging info about the symbol-block beginning.  */
1808               (*debug_hooks->begin_block) (last_linenum, n);
1809
1810               /* Mark this block as output.  */
1811               TREE_ASM_WRITTEN (NOTE_BLOCK (insn)) = 1;
1812             }
1813           break;
1814
1815         case NOTE_INSN_BLOCK_END:
1816           if (debug_info_level == DINFO_LEVEL_NORMAL
1817               || debug_info_level == DINFO_LEVEL_VERBOSE
1818               || write_symbols == DWARF2_DEBUG
1819               || write_symbols == VMS_AND_DWARF2_DEBUG
1820               || write_symbols == VMS_DEBUG)
1821             {
1822               int n = BLOCK_NUMBER (NOTE_BLOCK (insn));
1823
1824               app_disable ();
1825
1826               /* End of a symbol-block.  */
1827               --block_depth;
1828               gcc_assert (block_depth >= 0);
1829
1830               (*debug_hooks->end_block) (high_block_linenum, n);
1831             }
1832           break;
1833
1834         case NOTE_INSN_DELETED_LABEL:
1835           /* Emit the label.  We may have deleted the CODE_LABEL because
1836              the label could be proved to be unreachable, though still
1837              referenced (in the form of having its address taken.  */
1838           ASM_OUTPUT_DEBUG_LABEL (file, "L", CODE_LABEL_NUMBER (insn));
1839           break;
1840
1841         case NOTE_INSN_VAR_LOCATION:
1842           (*debug_hooks->var_location) (insn);
1843           break;
1844
1845         case 0:
1846           break;
1847
1848         default:
1849           gcc_assert (NOTE_LINE_NUMBER (insn) > 0);
1850           break;
1851         }
1852       break;
1853
1854     case BARRIER:
1855 #if defined (DWARF2_UNWIND_INFO)
1856       if (dwarf2out_do_frame ())
1857         dwarf2out_frame_debug (insn, false);
1858 #endif
1859       break;
1860
1861     case CODE_LABEL:
1862       /* The target port might emit labels in the output function for
1863          some insn, e.g. sh.c output_branchy_insn.  */
1864       if (CODE_LABEL_NUMBER (insn) <= max_labelno)
1865         {
1866           int align = LABEL_TO_ALIGNMENT (insn);
1867 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1868           int max_skip = LABEL_TO_MAX_SKIP (insn);
1869 #endif
1870
1871           if (align && NEXT_INSN (insn))
1872             {
1873 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1874               ASM_OUTPUT_MAX_SKIP_ALIGN (file, align, max_skip);
1875 #else
1876 #ifdef ASM_OUTPUT_ALIGN_WITH_NOP
1877               ASM_OUTPUT_ALIGN_WITH_NOP (file, align);
1878 #else
1879               ASM_OUTPUT_ALIGN (file, align);
1880 #endif
1881 #endif
1882             }
1883         }
1884 #ifdef HAVE_cc0
1885       CC_STATUS_INIT;
1886       /* If this label is reached from only one place, set the condition
1887          codes from the instruction just before the branch.  */
1888
1889       /* Disabled because some insns set cc_status in the C output code
1890          and NOTICE_UPDATE_CC alone can set incorrect status.  */
1891       if (0 /* optimize && LABEL_NUSES (insn) == 1*/)
1892         {
1893           rtx jump = LABEL_REFS (insn);
1894           rtx barrier = prev_nonnote_insn (insn);
1895           rtx prev;
1896           /* If the LABEL_REFS field of this label has been set to point
1897              at a branch, the predecessor of the branch is a regular
1898              insn, and that branch is the only way to reach this label,
1899              set the condition codes based on the branch and its
1900              predecessor.  */
1901           if (barrier && BARRIER_P (barrier)
1902               && jump && JUMP_P (jump)
1903               && (prev = prev_nonnote_insn (jump))
1904               && NONJUMP_INSN_P (prev))
1905             {
1906               NOTICE_UPDATE_CC (PATTERN (prev), prev);
1907               NOTICE_UPDATE_CC (PATTERN (jump), jump);
1908             }
1909         }
1910 #endif
1911
1912       if (LABEL_NAME (insn))
1913         (*debug_hooks->label) (insn);
1914
1915       if (app_on)
1916         {
1917           fputs (ASM_APP_OFF, file);
1918           app_on = 0;
1919         }
1920
1921       next = next_nonnote_insn (insn);
1922       if (next != 0 && JUMP_P (next))
1923         {
1924           rtx nextbody = PATTERN (next);
1925
1926           /* If this label is followed by a jump-table,
1927              make sure we put the label in the read-only section.  Also
1928              possibly write the label and jump table together.  */
1929
1930           if (GET_CODE (nextbody) == ADDR_VEC
1931               || GET_CODE (nextbody) == ADDR_DIFF_VEC)
1932             {
1933 #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
1934               /* In this case, the case vector is being moved by the
1935                  target, so don't output the label at all.  Leave that
1936                  to the back end macros.  */
1937 #else
1938               if (! JUMP_TABLES_IN_TEXT_SECTION)
1939                 {
1940                   int log_align;
1941
1942                   targetm.asm_out.function_rodata_section (current_function_decl);
1943
1944 #ifdef ADDR_VEC_ALIGN
1945                   log_align = ADDR_VEC_ALIGN (next);
1946 #else
1947                   log_align = exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT);
1948 #endif
1949                   ASM_OUTPUT_ALIGN (file, log_align);
1950                 }
1951               else
1952                 current_function_section (current_function_decl);
1953
1954 #ifdef ASM_OUTPUT_CASE_LABEL
1955               ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn),
1956                                      next);
1957 #else
1958               targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
1959 #endif
1960 #endif
1961               break;
1962             }
1963         }
1964       if (LABEL_ALT_ENTRY_P (insn))
1965         output_alternate_entry_point (file, insn);
1966       else
1967         targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
1968       break;
1969
1970     default:
1971       {
1972         rtx body = PATTERN (insn);
1973         int insn_code_number;
1974         const char *template;
1975
1976         /* An INSN, JUMP_INSN or CALL_INSN.
1977            First check for special kinds that recog doesn't recognize.  */
1978
1979         if (GET_CODE (body) == USE /* These are just declarations.  */
1980             || GET_CODE (body) == CLOBBER)
1981           break;
1982
1983 #ifdef HAVE_cc0
1984         {
1985           /* If there is a REG_CC_SETTER note on this insn, it means that
1986              the setting of the condition code was done in the delay slot
1987              of the insn that branched here.  So recover the cc status
1988              from the insn that set it.  */
1989
1990           rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
1991           if (note)
1992             {
1993               NOTICE_UPDATE_CC (PATTERN (XEXP (note, 0)), XEXP (note, 0));
1994               cc_prev_status = cc_status;
1995             }
1996         }
1997 #endif
1998
1999         /* Detect insns that are really jump-tables
2000            and output them as such.  */
2001
2002         if (GET_CODE (body) == ADDR_VEC || GET_CODE (body) == ADDR_DIFF_VEC)
2003           {
2004 #if !(defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC))
2005             int vlen, idx;
2006 #endif
2007
2008             if (! JUMP_TABLES_IN_TEXT_SECTION)
2009               targetm.asm_out.function_rodata_section (current_function_decl);
2010             else
2011               current_function_section (current_function_decl);
2012
2013             if (app_on)
2014               {
2015                 fputs (ASM_APP_OFF, file);
2016                 app_on = 0;
2017               }
2018
2019 #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
2020             if (GET_CODE (body) == ADDR_VEC)
2021               {
2022 #ifdef ASM_OUTPUT_ADDR_VEC
2023                 ASM_OUTPUT_ADDR_VEC (PREV_INSN (insn), body);
2024 #else
2025                 gcc_unreachable ();
2026 #endif
2027               }
2028             else
2029               {
2030 #ifdef ASM_OUTPUT_ADDR_DIFF_VEC
2031                 ASM_OUTPUT_ADDR_DIFF_VEC (PREV_INSN (insn), body);
2032 #else
2033                 gcc_unreachable ();
2034 #endif
2035               }
2036 #else
2037             vlen = XVECLEN (body, GET_CODE (body) == ADDR_DIFF_VEC);
2038             for (idx = 0; idx < vlen; idx++)
2039               {
2040                 if (GET_CODE (body) == ADDR_VEC)
2041                   {
2042 #ifdef ASM_OUTPUT_ADDR_VEC_ELT
2043                     ASM_OUTPUT_ADDR_VEC_ELT
2044                       (file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
2045 #else
2046                     gcc_unreachable ();
2047 #endif
2048                   }
2049                 else
2050                   {
2051 #ifdef ASM_OUTPUT_ADDR_DIFF_ELT
2052                     ASM_OUTPUT_ADDR_DIFF_ELT
2053                       (file,
2054                        body,
2055                        CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
2056                        CODE_LABEL_NUMBER (XEXP (XEXP (body, 0), 0)));
2057 #else
2058                     gcc_unreachable ();
2059 #endif
2060                   }
2061               }
2062 #ifdef ASM_OUTPUT_CASE_END
2063             ASM_OUTPUT_CASE_END (file,
2064                                  CODE_LABEL_NUMBER (PREV_INSN (insn)),
2065                                  insn);
2066 #endif
2067 #endif
2068
2069             current_function_section (current_function_decl);
2070
2071             break;
2072           }
2073         /* Output this line note if it is the first or the last line
2074            note in a row.  */
2075         if (notice_source_line (insn))
2076           {
2077             (*debug_hooks->source_line) (last_linenum, last_filename);
2078           }
2079
2080         if (GET_CODE (body) == ASM_INPUT)
2081           {
2082             const char *string = XSTR (body, 0);
2083
2084             /* There's no telling what that did to the condition codes.  */
2085             CC_STATUS_INIT;
2086
2087             if (string[0])
2088               {
2089                 if (! app_on)
2090                   {
2091                     fputs (ASM_APP_ON, file);
2092                     app_on = 1;
2093                   }
2094                 fprintf (asm_out_file, "\t%s\n", string);
2095               }
2096             break;
2097           }
2098
2099         /* Detect `asm' construct with operands.  */
2100         if (asm_noperands (body) >= 0)
2101           {
2102             unsigned int noperands = asm_noperands (body);
2103             rtx *ops = alloca (noperands * sizeof (rtx));
2104             const char *string;
2105
2106             /* There's no telling what that did to the condition codes.  */
2107             CC_STATUS_INIT;
2108
2109             /* Get out the operand values.  */
2110             string = decode_asm_operands (body, ops, NULL, NULL, NULL);
2111             /* Inhibit dieing on what would otherwise be compiler bugs.  */
2112             insn_noperands = noperands;
2113             this_is_asm_operands = insn;
2114
2115 #ifdef FINAL_PRESCAN_INSN
2116             FINAL_PRESCAN_INSN (insn, ops, insn_noperands);
2117 #endif
2118
2119             /* Output the insn using them.  */
2120             if (string[0])
2121               {
2122                 if (! app_on)
2123                   {
2124                     fputs (ASM_APP_ON, file);
2125                     app_on = 1;
2126                   }
2127                 output_asm_insn (string, ops);
2128               }
2129
2130             this_is_asm_operands = 0;
2131             break;
2132           }
2133
2134         if (app_on)
2135           {
2136             fputs (ASM_APP_OFF, file);
2137             app_on = 0;
2138           }
2139
2140         if (GET_CODE (body) == SEQUENCE)
2141           {
2142             /* A delayed-branch sequence */
2143             int i;
2144
2145             final_sequence = body;
2146
2147             /* Record the delay slots' frame information before the branch.
2148                This is needed for delayed calls: see execute_cfa_program().  */
2149 #if defined (DWARF2_UNWIND_INFO)
2150             if (dwarf2out_do_frame ())
2151               for (i = 1; i < XVECLEN (body, 0); i++)
2152                 dwarf2out_frame_debug (XVECEXP (body, 0, i), false);
2153 #endif
2154
2155             /* The first insn in this SEQUENCE might be a JUMP_INSN that will
2156                force the restoration of a comparison that was previously
2157                thought unnecessary.  If that happens, cancel this sequence
2158                and cause that insn to be restored.  */
2159
2160             next = final_scan_insn (XVECEXP (body, 0, 0), file, 0, 1, seen);
2161             if (next != XVECEXP (body, 0, 1))
2162               {
2163                 final_sequence = 0;
2164                 return next;
2165               }
2166
2167             for (i = 1; i < XVECLEN (body, 0); i++)
2168               {
2169                 rtx insn = XVECEXP (body, 0, i);
2170                 rtx next = NEXT_INSN (insn);
2171                 /* We loop in case any instruction in a delay slot gets
2172                    split.  */
2173                 do
2174                   insn = final_scan_insn (insn, file, 0, 1, seen);
2175                 while (insn != next);
2176               }
2177 #ifdef DBR_OUTPUT_SEQEND
2178             DBR_OUTPUT_SEQEND (file);
2179 #endif
2180             final_sequence = 0;
2181
2182             /* If the insn requiring the delay slot was a CALL_INSN, the
2183                insns in the delay slot are actually executed before the
2184                called function.  Hence we don't preserve any CC-setting
2185                actions in these insns and the CC must be marked as being
2186                clobbered by the function.  */
2187             if (CALL_P (XVECEXP (body, 0, 0)))
2188               {
2189                 CC_STATUS_INIT;
2190               }
2191             break;
2192           }
2193
2194         /* We have a real machine instruction as rtl.  */
2195
2196         body = PATTERN (insn);
2197
2198 #ifdef HAVE_cc0
2199         set = single_set (insn);
2200
2201         /* Check for redundant test and compare instructions
2202            (when the condition codes are already set up as desired).
2203            This is done only when optimizing; if not optimizing,
2204            it should be possible for the user to alter a variable
2205            with the debugger in between statements
2206            and the next statement should reexamine the variable
2207            to compute the condition codes.  */
2208
2209         if (optimize)
2210           {
2211             if (set
2212                 && GET_CODE (SET_DEST (set)) == CC0
2213                 && insn != last_ignored_compare)
2214               {
2215                 if (GET_CODE (SET_SRC (set)) == SUBREG)
2216                   SET_SRC (set) = alter_subreg (&SET_SRC (set));
2217                 else if (GET_CODE (SET_SRC (set)) == COMPARE)
2218                   {
2219                     if (GET_CODE (XEXP (SET_SRC (set), 0)) == SUBREG)
2220                       XEXP (SET_SRC (set), 0)
2221                         = alter_subreg (&XEXP (SET_SRC (set), 0));
2222                     if (GET_CODE (XEXP (SET_SRC (set), 1)) == SUBREG)
2223                       XEXP (SET_SRC (set), 1)
2224                         = alter_subreg (&XEXP (SET_SRC (set), 1));
2225                   }
2226                 if ((cc_status.value1 != 0
2227                      && rtx_equal_p (SET_SRC (set), cc_status.value1))
2228                     || (cc_status.value2 != 0
2229                         && rtx_equal_p (SET_SRC (set), cc_status.value2)))
2230                   {
2231                     /* Don't delete insn if it has an addressing side-effect.  */
2232                     if (! FIND_REG_INC_NOTE (insn, NULL_RTX)
2233                         /* or if anything in it is volatile.  */
2234                         && ! volatile_refs_p (PATTERN (insn)))
2235                       {
2236                         /* We don't really delete the insn; just ignore it.  */
2237                         last_ignored_compare = insn;
2238                         break;
2239                       }
2240                   }
2241               }
2242           }
2243 #endif
2244
2245 #ifdef HAVE_cc0
2246         /* If this is a conditional branch, maybe modify it
2247            if the cc's are in a nonstandard state
2248            so that it accomplishes the same thing that it would
2249            do straightforwardly if the cc's were set up normally.  */
2250
2251         if (cc_status.flags != 0
2252             && JUMP_P (insn)
2253             && GET_CODE (body) == SET
2254             && SET_DEST (body) == pc_rtx
2255             && GET_CODE (SET_SRC (body)) == IF_THEN_ELSE
2256             && COMPARISON_P (XEXP (SET_SRC (body), 0))
2257             && XEXP (XEXP (SET_SRC (body), 0), 0) == cc0_rtx)
2258           {
2259             /* This function may alter the contents of its argument
2260                and clear some of the cc_status.flags bits.
2261                It may also return 1 meaning condition now always true
2262                or -1 meaning condition now always false
2263                or 2 meaning condition nontrivial but altered.  */
2264             int result = alter_cond (XEXP (SET_SRC (body), 0));
2265             /* If condition now has fixed value, replace the IF_THEN_ELSE
2266                with its then-operand or its else-operand.  */
2267             if (result == 1)
2268               SET_SRC (body) = XEXP (SET_SRC (body), 1);
2269             if (result == -1)
2270               SET_SRC (body) = XEXP (SET_SRC (body), 2);
2271
2272             /* The jump is now either unconditional or a no-op.
2273                If it has become a no-op, don't try to output it.
2274                (It would not be recognized.)  */
2275             if (SET_SRC (body) == pc_rtx)
2276               {
2277                 delete_insn (insn);
2278                 break;
2279               }
2280             else if (GET_CODE (SET_SRC (body)) == RETURN)
2281               /* Replace (set (pc) (return)) with (return).  */
2282               PATTERN (insn) = body = SET_SRC (body);
2283
2284             /* Rerecognize the instruction if it has changed.  */
2285             if (result != 0)
2286               INSN_CODE (insn) = -1;
2287           }
2288
2289         /* Make same adjustments to instructions that examine the
2290            condition codes without jumping and instructions that
2291            handle conditional moves (if this machine has either one).  */
2292
2293         if (cc_status.flags != 0
2294             && set != 0)
2295           {
2296             rtx cond_rtx, then_rtx, else_rtx;
2297
2298             if (!JUMP_P (insn)
2299                 && GET_CODE (SET_SRC (set)) == IF_THEN_ELSE)
2300               {
2301                 cond_rtx = XEXP (SET_SRC (set), 0);
2302                 then_rtx = XEXP (SET_SRC (set), 1);
2303                 else_rtx = XEXP (SET_SRC (set), 2);
2304               }
2305             else
2306               {
2307                 cond_rtx = SET_SRC (set);
2308                 then_rtx = const_true_rtx;
2309                 else_rtx = const0_rtx;
2310               }
2311
2312             switch (GET_CODE (cond_rtx))
2313               {
2314               case GTU:
2315               case GT:
2316               case LTU:
2317               case LT:
2318               case GEU:
2319               case GE:
2320               case LEU:
2321               case LE:
2322               case EQ:
2323               case NE:
2324                 {
2325                   int result;
2326                   if (XEXP (cond_rtx, 0) != cc0_rtx)
2327                     break;
2328                   result = alter_cond (cond_rtx);
2329                   if (result == 1)
2330                     validate_change (insn, &SET_SRC (set), then_rtx, 0);
2331                   else if (result == -1)
2332                     validate_change (insn, &SET_SRC (set), else_rtx, 0);
2333                   else if (result == 2)
2334                     INSN_CODE (insn) = -1;
2335                   if (SET_DEST (set) == SET_SRC (set))
2336                     delete_insn (insn);
2337                 }
2338                 break;
2339
2340               default:
2341                 break;
2342               }
2343           }
2344
2345 #endif
2346
2347 #ifdef HAVE_peephole
2348         /* Do machine-specific peephole optimizations if desired.  */
2349
2350         if (optimize && !flag_no_peephole && !nopeepholes)
2351           {
2352             rtx next = peephole (insn);
2353             /* When peepholing, if there were notes within the peephole,
2354                emit them before the peephole.  */
2355             if (next != 0 && next != NEXT_INSN (insn))
2356               {
2357                 rtx note, prev = PREV_INSN (insn);
2358
2359                 for (note = NEXT_INSN (insn); note != next;
2360                      note = NEXT_INSN (note))
2361                   final_scan_insn (note, file, optimize, nopeepholes, seen);
2362
2363                 /* Put the notes in the proper position for a later
2364                    rescan.  For example, the SH target can do this
2365                    when generating a far jump in a delayed branch
2366                    sequence.  */
2367                 note = NEXT_INSN (insn);
2368                 PREV_INSN (note) = prev;
2369                 NEXT_INSN (prev) = note;
2370                 NEXT_INSN (PREV_INSN (next)) = insn;
2371                 PREV_INSN (insn) = PREV_INSN (next);
2372                 NEXT_INSN (insn) = next;
2373                 PREV_INSN (next) = insn;
2374               }
2375
2376             /* PEEPHOLE might have changed this.  */
2377             body = PATTERN (insn);
2378           }
2379 #endif
2380
2381         /* Try to recognize the instruction.
2382            If successful, verify that the operands satisfy the
2383            constraints for the instruction.  Crash if they don't,
2384            since `reload' should have changed them so that they do.  */
2385
2386         insn_code_number = recog_memoized (insn);
2387         cleanup_subreg_operands (insn);
2388
2389         /* Dump the insn in the assembly for debugging.  */
2390         if (flag_dump_rtl_in_asm)
2391           {
2392             print_rtx_head = ASM_COMMENT_START;
2393             print_rtl_single (asm_out_file, insn);
2394             print_rtx_head = "";
2395           }
2396
2397         if (! constrain_operands_cached (1))
2398           fatal_insn_not_found (insn);
2399
2400         /* Some target machines need to prescan each insn before
2401            it is output.  */
2402
2403 #ifdef FINAL_PRESCAN_INSN
2404         FINAL_PRESCAN_INSN (insn, recog_data.operand, recog_data.n_operands);
2405 #endif
2406
2407 #ifdef HAVE_conditional_execution
2408         if (GET_CODE (PATTERN (insn)) == COND_EXEC)
2409           current_insn_predicate = COND_EXEC_TEST (PATTERN (insn));
2410         else
2411           current_insn_predicate = NULL_RTX;
2412 #endif
2413
2414 #ifdef HAVE_cc0
2415         cc_prev_status = cc_status;
2416
2417         /* Update `cc_status' for this instruction.
2418            The instruction's output routine may change it further.
2419            If the output routine for a jump insn needs to depend
2420            on the cc status, it should look at cc_prev_status.  */
2421
2422         NOTICE_UPDATE_CC (body, insn);
2423 #endif
2424
2425         current_output_insn = debug_insn = insn;
2426
2427 #if defined (DWARF2_UNWIND_INFO)
2428         if (CALL_P (insn) && dwarf2out_do_frame ())
2429           dwarf2out_frame_debug (insn, false);
2430 #endif
2431
2432         /* Find the proper template for this insn.  */
2433         template = get_insn_template (insn_code_number, insn);
2434
2435         /* If the C code returns 0, it means that it is a jump insn
2436            which follows a deleted test insn, and that test insn
2437            needs to be reinserted.  */
2438         if (template == 0)
2439           {
2440             rtx prev;
2441
2442             gcc_assert (prev_nonnote_insn (insn) == last_ignored_compare);
2443
2444             /* We have already processed the notes between the setter and
2445                the user.  Make sure we don't process them again, this is
2446                particularly important if one of the notes is a block
2447                scope note or an EH note.  */
2448             for (prev = insn;
2449                  prev != last_ignored_compare;
2450                  prev = PREV_INSN (prev))
2451               {
2452                 if (NOTE_P (prev))
2453                   delete_insn (prev);   /* Use delete_note.  */
2454               }
2455
2456             return prev;
2457           }
2458
2459         /* If the template is the string "#", it means that this insn must
2460            be split.  */
2461         if (template[0] == '#' && template[1] == '\0')
2462           {
2463             rtx new = try_split (body, insn, 0);
2464
2465             /* If we didn't split the insn, go away.  */
2466             if (new == insn && PATTERN (new) == body)
2467               fatal_insn ("could not split insn", insn);
2468
2469 #ifdef HAVE_ATTR_length
2470             /* This instruction should have been split in shorten_branches,
2471                to ensure that we would have valid length info for the
2472                splitees.  */
2473             gcc_unreachable ();
2474 #endif
2475
2476             return new;
2477           }
2478
2479 #ifdef TARGET_UNWIND_INFO
2480         /* ??? This will put the directives in the wrong place if
2481            get_insn_template outputs assembly directly.  However calling it
2482            before get_insn_template breaks if the insns is split.  */
2483         targetm.asm_out.unwind_emit (asm_out_file, insn);
2484 #endif
2485
2486         /* Output assembler code from the template.  */
2487         output_asm_insn (template, recog_data.operand);
2488
2489         /* If necessary, report the effect that the instruction has on
2490            the unwind info.   We've already done this for delay slots
2491            and call instructions.  */
2492 #if defined (DWARF2_UNWIND_INFO)
2493         if (final_sequence == 0
2494 #if !defined (HAVE_prologue)
2495             && !ACCUMULATE_OUTGOING_ARGS
2496 #endif
2497             && dwarf2out_do_frame ())
2498           dwarf2out_frame_debug (insn, true);
2499 #endif
2500
2501         current_output_insn = debug_insn = 0;
2502       }
2503     }
2504   return NEXT_INSN (insn);
2505 }
2506 \f
2507 /* Return whether a source line note needs to be emitted before INSN.  */
2508
2509 static bool
2510 notice_source_line (rtx insn)
2511 {
2512   const char *filename = insn_file (insn);
2513   int linenum = insn_line (insn);
2514
2515   if (filename
2516       && (force_source_line
2517           || filename != last_filename
2518           || last_linenum != linenum))
2519     {
2520       force_source_line = false;
2521       last_filename = filename;
2522       last_linenum = linenum;
2523       high_block_linenum = MAX (last_linenum, high_block_linenum);
2524       high_function_linenum = MAX (last_linenum, high_function_linenum);
2525       return true;
2526     }
2527   return false;
2528 }
2529 \f
2530 /* For each operand in INSN, simplify (subreg (reg)) so that it refers
2531    directly to the desired hard register.  */
2532
2533 void
2534 cleanup_subreg_operands (rtx insn)
2535 {
2536   int i;
2537   extract_insn_cached (insn);
2538   for (i = 0; i < recog_data.n_operands; i++)
2539     {
2540       /* The following test cannot use recog_data.operand when testing
2541          for a SUBREG: the underlying object might have been changed
2542          already if we are inside a match_operator expression that
2543          matches the else clause.  Instead we test the underlying
2544          expression directly.  */
2545       if (GET_CODE (*recog_data.operand_loc[i]) == SUBREG)
2546         recog_data.operand[i] = alter_subreg (recog_data.operand_loc[i]);
2547       else if (GET_CODE (recog_data.operand[i]) == PLUS
2548                || GET_CODE (recog_data.operand[i]) == MULT
2549                || MEM_P (recog_data.operand[i]))
2550         recog_data.operand[i] = walk_alter_subreg (recog_data.operand_loc[i]);
2551     }
2552
2553   for (i = 0; i < recog_data.n_dups; i++)
2554     {
2555       if (GET_CODE (*recog_data.dup_loc[i]) == SUBREG)
2556         *recog_data.dup_loc[i] = alter_subreg (recog_data.dup_loc[i]);
2557       else if (GET_CODE (*recog_data.dup_loc[i]) == PLUS
2558                || GET_CODE (*recog_data.dup_loc[i]) == MULT
2559                || MEM_P (*recog_data.dup_loc[i]))
2560         *recog_data.dup_loc[i] = walk_alter_subreg (recog_data.dup_loc[i]);
2561     }
2562 }
2563
2564 /* If X is a SUBREG, replace it with a REG or a MEM,
2565    based on the thing it is a subreg of.  */
2566
2567 rtx
2568 alter_subreg (rtx *xp)
2569 {
2570   rtx x = *xp;
2571   rtx y = SUBREG_REG (x);
2572
2573   /* simplify_subreg does not remove subreg from volatile references.
2574      We are required to.  */
2575   if (MEM_P (y))
2576     {
2577       int offset = SUBREG_BYTE (x);
2578
2579       /* For paradoxical subregs on big-endian machines, SUBREG_BYTE
2580          contains 0 instead of the proper offset.  See simplify_subreg.  */
2581       if (offset == 0
2582           && GET_MODE_SIZE (GET_MODE (y)) < GET_MODE_SIZE (GET_MODE (x)))
2583         {
2584           int difference = GET_MODE_SIZE (GET_MODE (y))
2585                            - GET_MODE_SIZE (GET_MODE (x));
2586           if (WORDS_BIG_ENDIAN)
2587             offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
2588           if (BYTES_BIG_ENDIAN)
2589             offset += difference % UNITS_PER_WORD;
2590         }
2591
2592       *xp = adjust_address (y, GET_MODE (x), offset);
2593     }
2594   else
2595     {
2596       rtx new = simplify_subreg (GET_MODE (x), y, GET_MODE (y),
2597                                  SUBREG_BYTE (x));
2598
2599       if (new != 0)
2600         *xp = new;
2601       else if (REG_P (y))
2602         {
2603           /* Simplify_subreg can't handle some REG cases, but we have to.  */
2604           unsigned int regno = subreg_regno (x);
2605           *xp = gen_rtx_REG_offset (y, GET_MODE (x), regno, SUBREG_BYTE (x));
2606         }
2607     }
2608
2609   return *xp;
2610 }
2611
2612 /* Do alter_subreg on all the SUBREGs contained in X.  */
2613
2614 static rtx
2615 walk_alter_subreg (rtx *xp)
2616 {
2617   rtx x = *xp;
2618   switch (GET_CODE (x))
2619     {
2620     case PLUS:
2621     case MULT:
2622     case AND:
2623       XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0));
2624       XEXP (x, 1) = walk_alter_subreg (&XEXP (x, 1));
2625       break;
2626
2627     case MEM:
2628     case ZERO_EXTEND:
2629       XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0));
2630       break;
2631
2632     case SUBREG:
2633       return alter_subreg (xp);
2634
2635     default:
2636       break;
2637     }
2638
2639   return *xp;
2640 }
2641 \f
2642 #ifdef HAVE_cc0
2643
2644 /* Given BODY, the body of a jump instruction, alter the jump condition
2645    as required by the bits that are set in cc_status.flags.
2646    Not all of the bits there can be handled at this level in all cases.
2647
2648    The value is normally 0.
2649    1 means that the condition has become always true.
2650    -1 means that the condition has become always false.
2651    2 means that COND has been altered.  */
2652
2653 static int
2654 alter_cond (rtx cond)
2655 {
2656   int value = 0;
2657
2658   if (cc_status.flags & CC_REVERSED)
2659     {
2660       value = 2;
2661       PUT_CODE (cond, swap_condition (GET_CODE (cond)));
2662     }
2663
2664   if (cc_status.flags & CC_INVERTED)
2665     {
2666       value = 2;
2667       PUT_CODE (cond, reverse_condition (GET_CODE (cond)));
2668     }
2669
2670   if (cc_status.flags & CC_NOT_POSITIVE)
2671     switch (GET_CODE (cond))
2672       {
2673       case LE:
2674       case LEU:
2675       case GEU:
2676         /* Jump becomes unconditional.  */
2677         return 1;
2678
2679       case GT:
2680       case GTU:
2681       case LTU:
2682         /* Jump becomes no-op.  */
2683         return -1;
2684
2685       case GE:
2686         PUT_CODE (cond, EQ);
2687         value = 2;
2688         break;
2689
2690       case LT:
2691         PUT_CODE (cond, NE);
2692         value = 2;
2693         break;
2694
2695       default:
2696         break;
2697       }
2698
2699   if (cc_status.flags & CC_NOT_NEGATIVE)
2700     switch (GET_CODE (cond))
2701       {
2702       case GE:
2703       case GEU:
2704         /* Jump becomes unconditional.  */
2705         return 1;
2706
2707       case LT:
2708       case LTU:
2709         /* Jump becomes no-op.  */
2710         return -1;
2711
2712       case LE:
2713       case LEU:
2714         PUT_CODE (cond, EQ);
2715         value = 2;
2716         break;
2717
2718       case GT:
2719       case GTU:
2720         PUT_CODE (cond, NE);
2721         value = 2;
2722         break;
2723
2724       default:
2725         break;
2726       }
2727
2728   if (cc_status.flags & CC_NO_OVERFLOW)
2729     switch (GET_CODE (cond))
2730       {
2731       case GEU:
2732         /* Jump becomes unconditional.  */
2733         return 1;
2734
2735       case LEU:
2736         PUT_CODE (cond, EQ);
2737         value = 2;
2738         break;
2739
2740       case GTU:
2741         PUT_CODE (cond, NE);
2742         value = 2;
2743         break;
2744
2745       case LTU:
2746         /* Jump becomes no-op.  */
2747         return -1;
2748
2749       default:
2750         break;
2751       }
2752
2753   if (cc_status.flags & (CC_Z_IN_NOT_N | CC_Z_IN_N))
2754     switch (GET_CODE (cond))
2755       {
2756       default:
2757         gcc_unreachable ();
2758
2759       case NE:
2760         PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? GE : LT);
2761         value = 2;
2762         break;
2763
2764       case EQ:
2765         PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? LT : GE);
2766         value = 2;
2767         break;
2768       }
2769
2770   if (cc_status.flags & CC_NOT_SIGNED)
2771     /* The flags are valid if signed condition operators are converted
2772        to unsigned.  */
2773     switch (GET_CODE (cond))
2774       {
2775       case LE:
2776         PUT_CODE (cond, LEU);
2777         value = 2;
2778         break;
2779
2780       case LT:
2781         PUT_CODE (cond, LTU);
2782         value = 2;
2783         break;
2784
2785       case GT:
2786         PUT_CODE (cond, GTU);
2787         value = 2;
2788         break;
2789
2790       case GE:
2791         PUT_CODE (cond, GEU);
2792         value = 2;
2793         break;
2794
2795       default:
2796         break;
2797       }
2798
2799   return value;
2800 }
2801 #endif
2802 \f
2803 /* Report inconsistency between the assembler template and the operands.
2804    In an `asm', it's the user's fault; otherwise, the compiler's fault.  */
2805
2806 void
2807 output_operand_lossage (const char *cmsgid, ...)
2808 {
2809   char *fmt_string;
2810   char *new_message;
2811   const char *pfx_str;
2812   va_list ap;
2813
2814   va_start (ap, cmsgid);
2815
2816   pfx_str = this_is_asm_operands ? _("invalid 'asm': ") : "output_operand: ";
2817   asprintf (&fmt_string, "%s%s", pfx_str, _(cmsgid));
2818   vasprintf (&new_message, fmt_string, ap);
2819
2820   if (this_is_asm_operands)
2821     error_for_asm (this_is_asm_operands, "%s", new_message);
2822   else
2823     internal_error ("%s", new_message);
2824
2825   free (fmt_string);
2826   free (new_message);
2827   va_end (ap);
2828 }
2829 \f
2830 /* Output of assembler code from a template, and its subroutines.  */
2831
2832 /* Annotate the assembly with a comment describing the pattern and
2833    alternative used.  */
2834
2835 static void
2836 output_asm_name (void)
2837 {
2838   if (debug_insn)
2839     {
2840       int num = INSN_CODE (debug_insn);
2841       fprintf (asm_out_file, "\t%s %d\t%s",
2842                ASM_COMMENT_START, INSN_UID (debug_insn),
2843                insn_data[num].name);
2844       if (insn_data[num].n_alternatives > 1)
2845         fprintf (asm_out_file, "/%d", which_alternative + 1);
2846 #ifdef HAVE_ATTR_length
2847       fprintf (asm_out_file, "\t[length = %d]",
2848                get_attr_length (debug_insn));
2849 #endif
2850       /* Clear this so only the first assembler insn
2851          of any rtl insn will get the special comment for -dp.  */
2852       debug_insn = 0;
2853     }
2854 }
2855
2856 /* If OP is a REG or MEM and we can find a MEM_EXPR corresponding to it
2857    or its address, return that expr .  Set *PADDRESSP to 1 if the expr
2858    corresponds to the address of the object and 0 if to the object.  */
2859
2860 static tree
2861 get_mem_expr_from_op (rtx op, int *paddressp)
2862 {
2863   tree expr;
2864   int inner_addressp;
2865
2866   *paddressp = 0;
2867
2868   if (REG_P (op))
2869     return REG_EXPR (op);
2870   else if (!MEM_P (op))
2871     return 0;
2872
2873   if (MEM_EXPR (op) != 0)
2874     return MEM_EXPR (op);
2875
2876   /* Otherwise we have an address, so indicate it and look at the address.  */
2877   *paddressp = 1;
2878   op = XEXP (op, 0);
2879
2880   /* First check if we have a decl for the address, then look at the right side
2881      if it is a PLUS.  Otherwise, strip off arithmetic and keep looking.
2882      But don't allow the address to itself be indirect.  */
2883   if ((expr = get_mem_expr_from_op (op, &inner_addressp)) && ! inner_addressp)
2884     return expr;
2885   else if (GET_CODE (op) == PLUS
2886            && (expr = get_mem_expr_from_op (XEXP (op, 1), &inner_addressp)))
2887     return expr;
2888
2889   while (GET_RTX_CLASS (GET_CODE (op)) == RTX_UNARY
2890          || GET_RTX_CLASS (GET_CODE (op)) == RTX_BIN_ARITH)
2891     op = XEXP (op, 0);
2892
2893   expr = get_mem_expr_from_op (op, &inner_addressp);
2894   return inner_addressp ? 0 : expr;
2895 }
2896
2897 /* Output operand names for assembler instructions.  OPERANDS is the
2898    operand vector, OPORDER is the order to write the operands, and NOPS
2899    is the number of operands to write.  */
2900
2901 static void
2902 output_asm_operand_names (rtx *operands, int *oporder, int nops)
2903 {
2904   int wrote = 0;
2905   int i;
2906
2907   for (i = 0; i < nops; i++)
2908     {
2909       int addressp;
2910       rtx op = operands[oporder[i]];
2911       tree expr = get_mem_expr_from_op (op, &addressp);
2912
2913       fprintf (asm_out_file, "%c%s",
2914                wrote ? ',' : '\t', wrote ? "" : ASM_COMMENT_START);
2915       wrote = 1;
2916       if (expr)
2917         {
2918           fprintf (asm_out_file, "%s",
2919                    addressp ? "*" : "");
2920           print_mem_expr (asm_out_file, expr);
2921           wrote = 1;
2922         }
2923       else if (REG_P (op) && ORIGINAL_REGNO (op)
2924                && ORIGINAL_REGNO (op) != REGNO (op))
2925         fprintf (asm_out_file, " tmp%i", ORIGINAL_REGNO (op));
2926     }
2927 }
2928
2929 /* Output text from TEMPLATE to the assembler output file,
2930    obeying %-directions to substitute operands taken from
2931    the vector OPERANDS.
2932
2933    %N (for N a digit) means print operand N in usual manner.
2934    %lN means require operand N to be a CODE_LABEL or LABEL_REF
2935       and print the label name with no punctuation.
2936    %cN means require operand N to be a constant
2937       and print the constant expression with no punctuation.
2938    %aN means expect operand N to be a memory address
2939       (not a memory reference!) and print a reference
2940       to that address.
2941    %nN means expect operand N to be a constant
2942       and print a constant expression for minus the value
2943       of the operand, with no other punctuation.  */
2944
2945 void
2946 output_asm_insn (const char *template, rtx *operands)
2947 {
2948   const char *p;
2949   int c;
2950 #ifdef ASSEMBLER_DIALECT
2951   int dialect = 0;
2952 #endif
2953   int oporder[MAX_RECOG_OPERANDS];
2954   char opoutput[MAX_RECOG_OPERANDS];
2955   int ops = 0;
2956
2957   /* An insn may return a null string template
2958      in a case where no assembler code is needed.  */
2959   if (*template == 0)
2960     return;
2961
2962   memset (opoutput, 0, sizeof opoutput);
2963   p = template;
2964   putc ('\t', asm_out_file);
2965
2966 #ifdef ASM_OUTPUT_OPCODE
2967   ASM_OUTPUT_OPCODE (asm_out_file, p);
2968 #endif
2969
2970   while ((c = *p++))
2971     switch (c)
2972       {
2973       case '\n':
2974         if (flag_verbose_asm)
2975           output_asm_operand_names (operands, oporder, ops);
2976         if (flag_print_asm_name)
2977           output_asm_name ();
2978
2979         ops = 0;
2980         memset (opoutput, 0, sizeof opoutput);
2981
2982         putc (c, asm_out_file);
2983 #ifdef ASM_OUTPUT_OPCODE
2984         while ((c = *p) == '\t')
2985           {
2986             putc (c, asm_out_file);
2987             p++;
2988           }
2989         ASM_OUTPUT_OPCODE (asm_out_file, p);
2990 #endif
2991         break;
2992
2993 #ifdef ASSEMBLER_DIALECT
2994       case '{':
2995         {
2996           int i;
2997
2998           if (dialect)
2999             output_operand_lossage ("nested assembly dialect alternatives");
3000           else
3001             dialect = 1;
3002
3003           /* If we want the first dialect, do nothing.  Otherwise, skip
3004              DIALECT_NUMBER of strings ending with '|'.  */
3005           for (i = 0; i < dialect_number; i++)
3006             {
3007               while (*p && *p != '}' && *p++ != '|')
3008                 ;
3009               if (*p == '}')
3010                 break;
3011               if (*p == '|')
3012                 p++;
3013             }
3014
3015           if (*p == '\0')
3016             output_operand_lossage ("unterminated assembly dialect alternative");
3017         }
3018         break;
3019
3020       case '|':
3021         if (dialect)
3022           {
3023             /* Skip to close brace.  */
3024             do
3025               {
3026                 if (*p == '\0')
3027                   {
3028                     output_operand_lossage ("unterminated assembly dialect alternative");
3029                     break;
3030                   }
3031               }
3032             while (*p++ != '}');
3033             dialect = 0;
3034           }
3035         else
3036           putc (c, asm_out_file);
3037         break;
3038
3039       case '}':
3040         if (! dialect)
3041           putc (c, asm_out_file);
3042         dialect = 0;
3043         break;
3044 #endif
3045
3046       case '%':
3047         /* %% outputs a single %.  */
3048         if (*p == '%')
3049           {
3050             p++;
3051             putc (c, asm_out_file);
3052           }
3053         /* %= outputs a number which is unique to each insn in the entire
3054            compilation.  This is useful for making local labels that are
3055            referred to more than once in a given insn.  */
3056         else if (*p == '=')
3057           {
3058             p++;
3059             fprintf (asm_out_file, "%d", insn_counter);
3060           }
3061         /* % followed by a letter and some digits
3062            outputs an operand in a special way depending on the letter.
3063            Letters `acln' are implemented directly.
3064            Other letters are passed to `output_operand' so that
3065            the PRINT_OPERAND macro can define them.  */
3066         else if (ISALPHA (*p))
3067           {
3068             int letter = *p++;
3069             unsigned long opnum;
3070             char *endptr;
3071             
3072             opnum = strtoul (p, &endptr, 10);
3073
3074             if (endptr == p)
3075               output_operand_lossage ("operand number missing "
3076                                       "after %%-letter");
3077             else if (this_is_asm_operands && opnum >= insn_noperands)
3078               output_operand_lossage ("operand number out of range");
3079             else if (letter == 'l')
3080               output_asm_label (operands[opnum]);
3081             else if (letter == 'a')
3082               output_address (operands[opnum]);
3083             else if (letter == 'c')
3084               {
3085                 if (CONSTANT_ADDRESS_P (operands[opnum]))
3086                   output_addr_const (asm_out_file, operands[opnum]);
3087                 else
3088                   output_operand (operands[opnum], 'c');
3089               }
3090             else if (letter == 'n')
3091               {
3092                 if (GET_CODE (operands[opnum]) == CONST_INT)
3093                   fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC,
3094                            - INTVAL (operands[opnum]));
3095                 else
3096                   {
3097                     putc ('-', asm_out_file);
3098                     output_addr_const (asm_out_file, operands[opnum]);
3099                   }
3100               }
3101             else
3102               output_operand (operands[opnum], letter);
3103
3104             if (!opoutput[opnum])
3105               oporder[ops++] = opnum;
3106             opoutput[opnum] = 1;
3107
3108             p = endptr;
3109             c = *p;
3110           }
3111         /* % followed by a digit outputs an operand the default way.  */
3112         else if (ISDIGIT (*p))
3113           {
3114             unsigned long opnum;
3115             char *endptr;
3116             
3117             opnum = strtoul (p, &endptr, 10);
3118             if (this_is_asm_operands && opnum >= insn_noperands)
3119               output_operand_lossage ("operand number out of range");
3120             else
3121               output_operand (operands[opnum], 0);
3122
3123             if (!opoutput[opnum])
3124               oporder[ops++] = opnum;
3125             opoutput[opnum] = 1;
3126
3127             p = endptr;
3128             c = *p;
3129           }
3130         /* % followed by punctuation: output something for that
3131            punctuation character alone, with no operand.
3132            The PRINT_OPERAND macro decides what is actually done.  */
3133 #ifdef PRINT_OPERAND_PUNCT_VALID_P
3134         else if (PRINT_OPERAND_PUNCT_VALID_P ((unsigned char) *p))
3135           output_operand (NULL_RTX, *p++);
3136 #endif
3137         else
3138           output_operand_lossage ("invalid %%-code");
3139         break;
3140
3141       default:
3142         putc (c, asm_out_file);
3143       }
3144
3145   /* Write out the variable names for operands, if we know them.  */
3146   if (flag_verbose_asm)
3147     output_asm_operand_names (operands, oporder, ops);
3148   if (flag_print_asm_name)
3149     output_asm_name ();
3150
3151   putc ('\n', asm_out_file);
3152 }
3153 \f
3154 /* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol.  */
3155
3156 void
3157 output_asm_label (rtx x)
3158 {
3159   char buf[256];
3160
3161   if (GET_CODE (x) == LABEL_REF)
3162     x = XEXP (x, 0);
3163   if (LABEL_P (x)
3164       || (NOTE_P (x)
3165           && NOTE_LINE_NUMBER (x) == NOTE_INSN_DELETED_LABEL))
3166     ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3167   else
3168     output_operand_lossage ("'%%l' operand isn't a label");
3169
3170   assemble_name (asm_out_file, buf);
3171 }
3172
3173 /* Print operand X using machine-dependent assembler syntax.
3174    The macro PRINT_OPERAND is defined just to control this function.
3175    CODE is a non-digit that preceded the operand-number in the % spec,
3176    such as 'z' if the spec was `%z3'.  CODE is 0 if there was no char
3177    between the % and the digits.
3178    When CODE is a non-letter, X is 0.
3179
3180    The meanings of the letters are machine-dependent and controlled
3181    by PRINT_OPERAND.  */
3182
3183 static void
3184 output_operand (rtx x, int code ATTRIBUTE_UNUSED)
3185 {
3186   if (x && GET_CODE (x) == SUBREG)
3187     x = alter_subreg (&x);
3188
3189   /* X must not be a pseudo reg.  */
3190   gcc_assert (!x || !REG_P (x) || REGNO (x) < FIRST_PSEUDO_REGISTER);
3191
3192   PRINT_OPERAND (asm_out_file, x, code);
3193 }
3194
3195 /* Print a memory reference operand for address X
3196    using machine-dependent assembler syntax.
3197    The macro PRINT_OPERAND_ADDRESS exists just to control this function.  */
3198
3199 void
3200 output_address (rtx x)
3201 {
3202   walk_alter_subreg (&x);
3203   PRINT_OPERAND_ADDRESS (asm_out_file, x);
3204 }
3205 \f
3206 /* Print an integer constant expression in assembler syntax.
3207    Addition and subtraction are the only arithmetic
3208    that may appear in these expressions.  */
3209
3210 void
3211 output_addr_const (FILE *file, rtx x)
3212 {
3213   char buf[256];
3214
3215  restart:
3216   switch (GET_CODE (x))
3217     {
3218     case PC:
3219       putc ('.', file);
3220       break;
3221
3222     case SYMBOL_REF:
3223       if (SYMBOL_REF_DECL (x))
3224         mark_decl_referenced (SYMBOL_REF_DECL (x));
3225 #ifdef ASM_OUTPUT_SYMBOL_REF
3226       ASM_OUTPUT_SYMBOL_REF (file, x);
3227 #else
3228       assemble_name (file, XSTR (x, 0));
3229 #endif
3230       break;
3231
3232     case LABEL_REF:
3233       x = XEXP (x, 0);
3234       /* Fall through.  */
3235     case CODE_LABEL:
3236       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3237 #ifdef ASM_OUTPUT_LABEL_REF
3238       ASM_OUTPUT_LABEL_REF (file, buf);
3239 #else
3240       assemble_name (file, buf);
3241 #endif
3242       break;
3243
3244     case CONST_INT:
3245       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
3246       break;
3247
3248     case CONST:
3249       /* This used to output parentheses around the expression,
3250          but that does not work on the 386 (either ATT or BSD assembler).  */
3251       output_addr_const (file, XEXP (x, 0));
3252       break;
3253
3254     case CONST_DOUBLE:
3255       if (GET_MODE (x) == VOIDmode)
3256         {
3257           /* We can use %d if the number is one word and positive.  */
3258           if (CONST_DOUBLE_HIGH (x))
3259             fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
3260                      CONST_DOUBLE_HIGH (x), CONST_DOUBLE_LOW (x));
3261           else if (CONST_DOUBLE_LOW (x) < 0)
3262             fprintf (file, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_LOW (x));
3263           else
3264             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
3265         }
3266       else
3267         /* We can't handle floating point constants;
3268            PRINT_OPERAND must handle them.  */
3269         output_operand_lossage ("floating constant misused");
3270       break;
3271
3272     case PLUS:
3273       /* Some assemblers need integer constants to appear last (eg masm).  */
3274       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
3275         {
3276           output_addr_const (file, XEXP (x, 1));
3277           if (INTVAL (XEXP (x, 0)) >= 0)
3278             fprintf (file, "+");
3279           output_addr_const (file, XEXP (x, 0));
3280         }
3281       else
3282         {
3283           output_addr_const (file, XEXP (x, 0));
3284           if (GET_CODE (XEXP (x, 1)) != CONST_INT
3285               || INTVAL (XEXP (x, 1)) >= 0)
3286             fprintf (file, "+");
3287           output_addr_const (file, XEXP (x, 1));
3288         }
3289       break;
3290
3291     case MINUS:
3292       /* Avoid outputting things like x-x or x+5-x,
3293          since some assemblers can't handle that.  */
3294       x = simplify_subtraction (x);
3295       if (GET_CODE (x) != MINUS)
3296         goto restart;
3297
3298       output_addr_const (file, XEXP (x, 0));
3299       fprintf (file, "-");
3300       if ((GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0)
3301           || GET_CODE (XEXP (x, 1)) == PC
3302           || GET_CODE (XEXP (x, 1)) == SYMBOL_REF)
3303         output_addr_const (file, XEXP (x, 1));
3304       else
3305         {
3306           fputs (targetm.asm_out.open_paren, file);
3307           output_addr_const (file, XEXP (x, 1));
3308           fputs (targetm.asm_out.close_paren, file);
3309         }
3310       break;
3311
3312     case ZERO_EXTEND:
3313     case SIGN_EXTEND:
3314     case SUBREG:
3315       output_addr_const (file, XEXP (x, 0));
3316       break;
3317
3318     default:
3319 #ifdef OUTPUT_ADDR_CONST_EXTRA
3320       OUTPUT_ADDR_CONST_EXTRA (file, x, fail);
3321       break;
3322
3323     fail:
3324 #endif
3325       output_operand_lossage ("invalid expression as operand");
3326     }
3327 }
3328 \f
3329 /* A poor man's fprintf, with the added features of %I, %R, %L, and %U.
3330    %R prints the value of REGISTER_PREFIX.
3331    %L prints the value of LOCAL_LABEL_PREFIX.
3332    %U prints the value of USER_LABEL_PREFIX.
3333    %I prints the value of IMMEDIATE_PREFIX.
3334    %O runs ASM_OUTPUT_OPCODE to transform what follows in the string.
3335    Also supported are %d, %i, %u, %x, %X, %o, %c, %s and %%.
3336
3337    We handle alternate assembler dialects here, just like output_asm_insn.  */
3338
3339 void
3340 asm_fprintf (FILE *file, const char *p, ...)
3341 {
3342   char buf[10];
3343   char *q, c;
3344   va_list argptr;
3345
3346   va_start (argptr, p);
3347
3348   buf[0] = '%';
3349
3350   while ((c = *p++))
3351     switch (c)
3352       {
3353 #ifdef ASSEMBLER_DIALECT
3354       case '{':
3355         {
3356           int i;
3357
3358           /* If we want the first dialect, do nothing.  Otherwise, skip
3359              DIALECT_NUMBER of strings ending with '|'.  */
3360           for (i = 0; i < dialect_number; i++)
3361             {
3362               while (*p && *p++ != '|')
3363                 ;
3364
3365               if (*p == '|')
3366                 p++;
3367             }
3368         }
3369         break;
3370
3371       case '|':
3372         /* Skip to close brace.  */
3373         while (*p && *p++ != '}')
3374           ;
3375         break;
3376
3377       case '}':
3378         break;
3379 #endif
3380
3381       case '%':
3382         c = *p++;
3383         q = &buf[1];
3384         while (strchr ("-+ #0", c))
3385           {
3386             *q++ = c;
3387             c = *p++;
3388           }
3389         while (ISDIGIT (c) || c == '.')
3390           {
3391             *q++ = c;
3392             c = *p++;
3393           }
3394         switch (c)
3395           {
3396           case '%':
3397             putc ('%', file);
3398             break;
3399
3400           case 'd':  case 'i':  case 'u':
3401           case 'x':  case 'X':  case 'o':
3402           case 'c':
3403             *q++ = c;
3404             *q = 0;
3405             fprintf (file, buf, va_arg (argptr, int));
3406             break;
3407
3408           case 'w':
3409             /* This is a prefix to the 'd', 'i', 'u', 'x', 'X', and
3410                'o' cases, but we do not check for those cases.  It
3411                means that the value is a HOST_WIDE_INT, which may be
3412                either `long' or `long long'.  */
3413             memcpy (q, HOST_WIDE_INT_PRINT, strlen (HOST_WIDE_INT_PRINT));
3414             q += strlen (HOST_WIDE_INT_PRINT);
3415             *q++ = *p++;
3416             *q = 0;
3417             fprintf (file, buf, va_arg (argptr, HOST_WIDE_INT));
3418             break;
3419
3420           case 'l':
3421             *q++ = c;
3422 #ifdef HAVE_LONG_LONG
3423             if (*p == 'l')
3424               {
3425                 *q++ = *p++;
3426                 *q++ = *p++;
3427                 *q = 0;
3428                 fprintf (file, buf, va_arg (argptr, long long));
3429               }
3430             else
3431 #endif
3432               {
3433                 *q++ = *p++;
3434                 *q = 0;
3435                 fprintf (file, buf, va_arg (argptr, long));
3436               }
3437
3438             break;
3439
3440           case 's':
3441             *q++ = c;
3442             *q = 0;
3443             fprintf (file, buf, va_arg (argptr, char *));
3444             break;
3445
3446           case 'O':
3447 #ifdef ASM_OUTPUT_OPCODE
3448             ASM_OUTPUT_OPCODE (asm_out_file, p);
3449 #endif
3450             break;
3451
3452           case 'R':
3453 #ifdef REGISTER_PREFIX
3454             fprintf (file, "%s", REGISTER_PREFIX);
3455 #endif
3456             break;
3457
3458           case 'I':
3459 #ifdef IMMEDIATE_PREFIX
3460             fprintf (file, "%s", IMMEDIATE_PREFIX);
3461 #endif
3462             break;
3463
3464           case 'L':
3465 #ifdef LOCAL_LABEL_PREFIX
3466             fprintf (file, "%s", LOCAL_LABEL_PREFIX);
3467 #endif
3468             break;
3469
3470           case 'U':
3471             fputs (user_label_prefix, file);
3472             break;
3473
3474 #ifdef ASM_FPRINTF_EXTENSIONS
3475             /* Uppercase letters are reserved for general use by asm_fprintf
3476                and so are not available to target specific code.  In order to
3477                prevent the ASM_FPRINTF_EXTENSIONS macro from using them then,
3478                they are defined here.  As they get turned into real extensions
3479                to asm_fprintf they should be removed from this list.  */
3480           case 'A': case 'B': case 'C': case 'D': case 'E':
3481           case 'F': case 'G': case 'H': case 'J': case 'K':
3482           case 'M': case 'N': case 'P': case 'Q': case 'S':
3483           case 'T': case 'V': case 'W': case 'Y': case 'Z':
3484             break;
3485
3486           ASM_FPRINTF_EXTENSIONS (file, argptr, p)
3487 #endif
3488           default:
3489             gcc_unreachable ();
3490           }
3491         break;
3492
3493       default:
3494         putc (c, file);
3495       }
3496   va_end (argptr);
3497 }
3498 \f
3499 /* Split up a CONST_DOUBLE or integer constant rtx
3500    into two rtx's for single words,
3501    storing in *FIRST the word that comes first in memory in the target
3502    and in *SECOND the other.  */
3503
3504 void
3505 split_double (rtx value, rtx *first, rtx *second)
3506 {
3507   if (GET_CODE (value) == CONST_INT)
3508     {
3509       if (HOST_BITS_PER_WIDE_INT >= (2 * BITS_PER_WORD))
3510         {
3511           /* In this case the CONST_INT holds both target words.
3512              Extract the bits from it into two word-sized pieces.
3513              Sign extend each half to HOST_WIDE_INT.  */
3514           unsigned HOST_WIDE_INT low, high;
3515           unsigned HOST_WIDE_INT mask, sign_bit, sign_extend;
3516
3517           /* Set sign_bit to the most significant bit of a word.  */
3518           sign_bit = 1;
3519           sign_bit <<= BITS_PER_WORD - 1;
3520
3521           /* Set mask so that all bits of the word are set.  We could
3522              have used 1 << BITS_PER_WORD instead of basing the
3523              calculation on sign_bit.  However, on machines where
3524              HOST_BITS_PER_WIDE_INT == BITS_PER_WORD, it could cause a
3525              compiler warning, even though the code would never be
3526              executed.  */
3527           mask = sign_bit << 1;
3528           mask--;
3529
3530           /* Set sign_extend as any remaining bits.  */
3531           sign_extend = ~mask;
3532
3533           /* Pick the lower word and sign-extend it.  */
3534           low = INTVAL (value);
3535           low &= mask;
3536           if (low & sign_bit)
3537             low |= sign_extend;
3538
3539           /* Pick the higher word, shifted to the least significant
3540              bits, and sign-extend it.  */
3541           high = INTVAL (value);
3542           high >>= BITS_PER_WORD - 1;
3543           high >>= 1;
3544           high &= mask;
3545           if (high & sign_bit)
3546             high |= sign_extend;
3547
3548           /* Store the words in the target machine order.  */
3549           if (WORDS_BIG_ENDIAN)
3550             {
3551               *first = GEN_INT (high);
3552               *second = GEN_INT (low);
3553             }
3554           else
3555             {
3556               *first = GEN_INT (low);
3557               *second = GEN_INT (high);
3558             }
3559         }
3560       else
3561         {
3562           /* The rule for using CONST_INT for a wider mode
3563              is that we regard the value as signed.
3564              So sign-extend it.  */
3565           rtx high = (INTVAL (value) < 0 ? constm1_rtx : const0_rtx);
3566           if (WORDS_BIG_ENDIAN)
3567             {
3568               *first = high;
3569               *second = value;
3570             }
3571           else
3572             {
3573               *first = value;
3574               *second = high;
3575             }
3576         }
3577     }
3578   else if (GET_CODE (value) != CONST_DOUBLE)
3579     {
3580       if (WORDS_BIG_ENDIAN)
3581         {
3582           *first = const0_rtx;
3583           *second = value;
3584         }
3585       else
3586         {
3587           *first = value;
3588           *second = const0_rtx;
3589         }
3590     }
3591   else if (GET_MODE (value) == VOIDmode
3592            /* This is the old way we did CONST_DOUBLE integers.  */
3593            || GET_MODE_CLASS (GET_MODE (value)) == MODE_INT)
3594     {
3595       /* In an integer, the words are defined as most and least significant.
3596          So order them by the target's convention.  */
3597       if (WORDS_BIG_ENDIAN)
3598         {
3599           *first = GEN_INT (CONST_DOUBLE_HIGH (value));
3600           *second = GEN_INT (CONST_DOUBLE_LOW (value));
3601         }
3602       else
3603         {
3604           *first = GEN_INT (CONST_DOUBLE_LOW (value));
3605           *second = GEN_INT (CONST_DOUBLE_HIGH (value));
3606         }
3607     }
3608   else
3609     {
3610       REAL_VALUE_TYPE r;
3611       long l[2];
3612       REAL_VALUE_FROM_CONST_DOUBLE (r, value);
3613
3614       /* Note, this converts the REAL_VALUE_TYPE to the target's
3615          format, splits up the floating point double and outputs
3616          exactly 32 bits of it into each of l[0] and l[1] --
3617          not necessarily BITS_PER_WORD bits.  */
3618       REAL_VALUE_TO_TARGET_DOUBLE (r, l);
3619
3620       /* If 32 bits is an entire word for the target, but not for the host,
3621          then sign-extend on the host so that the number will look the same
3622          way on the host that it would on the target.  See for instance
3623          simplify_unary_operation.  The #if is needed to avoid compiler
3624          warnings.  */
3625
3626 #if HOST_BITS_PER_LONG > 32
3627       if (BITS_PER_WORD < HOST_BITS_PER_LONG && BITS_PER_WORD == 32)
3628         {
3629           if (l[0] & ((long) 1 << 31))
3630             l[0] |= ((long) (-1) << 32);
3631           if (l[1] & ((long) 1 << 31))
3632             l[1] |= ((long) (-1) << 32);
3633         }
3634 #endif
3635
3636       *first = GEN_INT (l[0]);
3637       *second = GEN_INT (l[1]);
3638     }
3639 }
3640 \f
3641 /* Return nonzero if this function has no function calls.  */
3642
3643 int
3644 leaf_function_p (void)
3645 {
3646   rtx insn;
3647   rtx link;
3648
3649   if (current_function_profile || profile_arc_flag)
3650     return 0;
3651
3652   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3653     {
3654       if (CALL_P (insn)
3655           && ! SIBLING_CALL_P (insn))
3656         return 0;
3657       if (NONJUMP_INSN_P (insn)
3658           && GET_CODE (PATTERN (insn)) == SEQUENCE
3659           && CALL_P (XVECEXP (PATTERN (insn), 0, 0))
3660           && ! SIBLING_CALL_P (XVECEXP (PATTERN (insn), 0, 0)))
3661         return 0;
3662     }
3663   for (link = current_function_epilogue_delay_list;
3664        link;
3665        link = XEXP (link, 1))
3666     {
3667       insn = XEXP (link, 0);
3668
3669       if (CALL_P (insn)
3670           && ! SIBLING_CALL_P (insn))
3671         return 0;
3672       if (NONJUMP_INSN_P (insn)
3673           && GET_CODE (PATTERN (insn)) == SEQUENCE
3674           && CALL_P (XVECEXP (PATTERN (insn), 0, 0))
3675           && ! SIBLING_CALL_P (XVECEXP (PATTERN (insn), 0, 0)))
3676         return 0;
3677     }
3678
3679   return 1;
3680 }
3681
3682 /* Return 1 if branch is a forward branch.
3683    Uses insn_shuid array, so it works only in the final pass.  May be used by
3684    output templates to customary add branch prediction hints.
3685  */
3686 int
3687 final_forward_branch_p (rtx insn)
3688 {
3689   int insn_id, label_id;
3690   
3691   gcc_assert (uid_shuid);
3692   insn_id = INSN_SHUID (insn);
3693   label_id = INSN_SHUID (JUMP_LABEL (insn));
3694   /* We've hit some insns that does not have id information available.  */
3695   gcc_assert (insn_id && label_id);
3696   return insn_id < label_id;
3697 }
3698
3699 /* On some machines, a function with no call insns
3700    can run faster if it doesn't create its own register window.
3701    When output, the leaf function should use only the "output"
3702    registers.  Ordinarily, the function would be compiled to use
3703    the "input" registers to find its arguments; it is a candidate
3704    for leaf treatment if it uses only the "input" registers.
3705    Leaf function treatment means renumbering so the function
3706    uses the "output" registers instead.  */
3707
3708 #ifdef LEAF_REGISTERS
3709
3710 /* Return 1 if this function uses only the registers that can be
3711    safely renumbered.  */
3712
3713 int
3714 only_leaf_regs_used (void)
3715 {
3716   int i;
3717   const char *const permitted_reg_in_leaf_functions = LEAF_REGISTERS;
3718
3719   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3720     if ((regs_ever_live[i] || global_regs[i])
3721         && ! permitted_reg_in_leaf_functions[i])
3722       return 0;
3723
3724   if (current_function_uses_pic_offset_table
3725       && pic_offset_table_rtx != 0
3726       && REG_P (pic_offset_table_rtx)
3727       && ! permitted_reg_in_leaf_functions[REGNO (pic_offset_table_rtx)])
3728     return 0;
3729
3730   return 1;
3731 }
3732
3733 /* Scan all instructions and renumber all registers into those
3734    available in leaf functions.  */
3735
3736 static void
3737 leaf_renumber_regs (rtx first)
3738 {
3739   rtx insn;
3740
3741   /* Renumber only the actual patterns.
3742      The reg-notes can contain frame pointer refs,
3743      and renumbering them could crash, and should not be needed.  */
3744   for (insn = first; insn; insn = NEXT_INSN (insn))
3745     if (INSN_P (insn))
3746       leaf_renumber_regs_insn (PATTERN (insn));
3747   for (insn = current_function_epilogue_delay_list;
3748        insn;
3749        insn = XEXP (insn, 1))
3750     if (INSN_P (XEXP (insn, 0)))
3751       leaf_renumber_regs_insn (PATTERN (XEXP (insn, 0)));
3752 }
3753
3754 /* Scan IN_RTX and its subexpressions, and renumber all regs into those
3755    available in leaf functions.  */
3756
3757 void
3758 leaf_renumber_regs_insn (rtx in_rtx)
3759 {
3760   int i, j;
3761   const char *format_ptr;
3762
3763   if (in_rtx == 0)
3764     return;
3765
3766   /* Renumber all input-registers into output-registers.
3767      renumbered_regs would be 1 for an output-register;
3768      they  */
3769
3770   if (REG_P (in_rtx))
3771     {
3772       int newreg;
3773
3774       /* Don't renumber the same reg twice.  */
3775       if (in_rtx->used)
3776         return;
3777
3778       newreg = REGNO (in_rtx);
3779       /* Don't try to renumber pseudo regs.  It is possible for a pseudo reg
3780          to reach here as part of a REG_NOTE.  */
3781       if (newreg >= FIRST_PSEUDO_REGISTER)
3782         {
3783           in_rtx->used = 1;
3784           return;
3785         }
3786       newreg = LEAF_REG_REMAP (newreg);
3787       gcc_assert (newreg >= 0);
3788       regs_ever_live[REGNO (in_rtx)] = 0;
3789       regs_ever_live[newreg] = 1;
3790       REGNO (in_rtx) = newreg;
3791       in_rtx->used = 1;
3792     }
3793
3794   if (INSN_P (in_rtx))
3795     {
3796       /* Inside a SEQUENCE, we find insns.
3797          Renumber just the patterns of these insns,
3798          just as we do for the top-level insns.  */
3799       leaf_renumber_regs_insn (PATTERN (in_rtx));
3800       return;
3801     }
3802
3803   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
3804
3805   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
3806     switch (*format_ptr++)
3807       {
3808       case 'e':
3809         leaf_renumber_regs_insn (XEXP (in_rtx, i));
3810         break;
3811
3812       case 'E':
3813         if (NULL != XVEC (in_rtx, i))
3814           {
3815             for (j = 0; j < XVECLEN (in_rtx, i); j++)
3816               leaf_renumber_regs_insn (XVECEXP (in_rtx, i, j));
3817           }
3818         break;
3819
3820       case 'S':
3821       case 's':
3822       case '0':
3823       case 'i':
3824       case 'w':
3825       case 'n':
3826       case 'u':
3827         break;
3828
3829       default:
3830         gcc_unreachable ();
3831       }
3832 }
3833 #endif
3834
3835
3836 /* When -gused is used, emit debug info for only used symbols. But in
3837    addition to the standard intercepted debug_hooks there are some direct
3838    calls into this file, i.e., dbxout_symbol, dbxout_parms, and dbxout_reg_params.
3839    Those routines may also be called from a higher level intercepted routine. So
3840    to prevent recording data for an inner call to one of these for an intercept,
3841    we maintain an intercept nesting counter (debug_nesting). We only save the
3842    intercepted arguments if the nesting is 1.  */
3843 int debug_nesting = 0;
3844
3845 static tree *symbol_queue;
3846 int symbol_queue_index = 0;
3847 static int symbol_queue_size = 0;
3848
3849 /* Generate the symbols for any queued up type symbols we encountered
3850    while generating the type info for some originally used symbol.
3851    This might generate additional entries in the queue.  Only when
3852    the nesting depth goes to 0 is this routine called.  */
3853
3854 void
3855 debug_flush_symbol_queue (void)
3856 {
3857   int i;
3858
3859   /* Make sure that additionally queued items are not flushed
3860      prematurely.  */
3861
3862   ++debug_nesting;
3863
3864   for (i = 0; i < symbol_queue_index; ++i)
3865     {
3866       /* If we pushed queued symbols then such symbols are must be
3867          output no matter what anyone else says.  Specifically,
3868          we need to make sure dbxout_symbol() thinks the symbol was
3869          used and also we need to override TYPE_DECL_SUPPRESS_DEBUG
3870          which may be set for outside reasons.  */
3871       int saved_tree_used = TREE_USED (symbol_queue[i]);
3872       int saved_suppress_debug = TYPE_DECL_SUPPRESS_DEBUG (symbol_queue[i]);
3873       TREE_USED (symbol_queue[i]) = 1;
3874       TYPE_DECL_SUPPRESS_DEBUG (symbol_queue[i]) = 0;
3875
3876 #ifdef DBX_DEBUGGING_INFO
3877       dbxout_symbol (symbol_queue[i], 0);
3878 #endif
3879
3880       TREE_USED (symbol_queue[i]) = saved_tree_used;
3881       TYPE_DECL_SUPPRESS_DEBUG (symbol_queue[i]) = saved_suppress_debug;
3882     }
3883
3884   symbol_queue_index = 0;
3885   --debug_nesting;
3886 }
3887
3888 /* Queue a type symbol needed as part of the definition of a decl
3889    symbol.  These symbols are generated when debug_flush_symbol_queue()
3890    is called.  */
3891
3892 void
3893 debug_queue_symbol (tree decl)
3894 {
3895   if (symbol_queue_index >= symbol_queue_size)
3896     {
3897       symbol_queue_size += 10;
3898       symbol_queue = xrealloc (symbol_queue,
3899                                symbol_queue_size * sizeof (tree));
3900     }
3901
3902   symbol_queue[symbol_queue_index++] = decl;
3903 }
3904
3905 /* Free symbol queue.  */
3906 void
3907 debug_free_queue (void)
3908 {
3909   if (symbol_queue)
3910     {
3911       free (symbol_queue);
3912       symbol_queue = NULL;
3913       symbol_queue_size = 0;
3914     }
3915 }
3916 \f
3917 /* Turn the RTL into assembly.  */
3918 static void
3919 rest_of_handle_final (void)
3920 {
3921   rtx x;
3922   const char *fnname;
3923
3924   /* Get the function's name, as described by its RTL.  This may be
3925      different from the DECL_NAME name used in the source file.  */
3926
3927   x = DECL_RTL (current_function_decl);
3928   gcc_assert (MEM_P (x));
3929   x = XEXP (x, 0);
3930   gcc_assert (GET_CODE (x) == SYMBOL_REF);
3931   fnname = XSTR (x, 0);
3932
3933   assemble_start_function (current_function_decl, fnname);
3934   final_start_function (get_insns (), asm_out_file, optimize);
3935   final (get_insns (), asm_out_file, optimize);
3936   final_end_function ();
3937
3938 #ifdef TARGET_UNWIND_INFO
3939   /* ??? The IA-64 ".handlerdata" directive must be issued before
3940      the ".endp" directive that closes the procedure descriptor.  */
3941   output_function_exception_table ();
3942 #endif
3943
3944   assemble_end_function (current_function_decl, fnname);
3945
3946 #ifndef TARGET_UNWIND_INFO
3947   /* Otherwise, it feels unclean to switch sections in the middle.  */
3948   output_function_exception_table ();
3949 #endif
3950
3951   user_defined_section_attribute = false;
3952
3953   if (! quiet_flag)
3954     fflush (asm_out_file);
3955
3956   /* Release all memory allocated by flow.  */
3957   free_basic_block_vars ();
3958
3959   /* Write DBX symbols if requested.  */
3960
3961   /* Note that for those inline functions where we don't initially
3962      know for certain that we will be generating an out-of-line copy,
3963      the first invocation of this routine (rest_of_compilation) will
3964      skip over this code by doing a `goto exit_rest_of_compilation;'.
3965      Later on, wrapup_global_declarations will (indirectly) call
3966      rest_of_compilation again for those inline functions that need
3967      to have out-of-line copies generated.  During that call, we
3968      *will* be routed past here.  */
3969
3970   timevar_push (TV_SYMOUT);
3971   (*debug_hooks->function_decl) (current_function_decl);
3972   timevar_pop (TV_SYMOUT);
3973 }
3974
3975 struct tree_opt_pass pass_final =
3976 {
3977   NULL,                                 /* name */
3978   NULL,                                 /* gate */
3979   rest_of_handle_final,                 /* execute */
3980   NULL,                                 /* sub */
3981   NULL,                                 /* next */
3982   0,                                    /* static_pass_number */
3983   TV_FINAL,                             /* tv_id */
3984   0,                                    /* properties_required */
3985   0,                                    /* properties_provided */
3986   0,                                    /* properties_destroyed */
3987   0,                                    /* todo_flags_start */
3988   TODO_ggc_collect,                     /* todo_flags_finish */
3989   0                                     /* letter */
3990 };
3991
3992
3993 static void
3994 rest_of_handle_shorten_branches (void)
3995 {
3996   /* Shorten branches.  */
3997   shorten_branches (get_insns ());
3998 }
3999  
4000 struct tree_opt_pass pass_shorten_branches =
4001 {
4002   "shorten",                            /* name */
4003   NULL,                                 /* gate */
4004   rest_of_handle_shorten_branches,      /* execute */
4005   NULL,                                 /* sub */
4006   NULL,                                 /* next */
4007   0,                                    /* static_pass_number */
4008   TV_FINAL,                             /* tv_id */
4009   0,                                    /* properties_required */
4010   0,                                    /* properties_provided */
4011   0,                                    /* properties_destroyed */
4012   0,                                    /* todo_flags_start */
4013   TODO_dump_func,                       /* todo_flags_finish */
4014   0                                     /* letter */
4015 };
4016
4017
4018 static void
4019 rest_of_clean_state (void)
4020 {
4021   rtx insn, next;
4022
4023   /* It is very important to decompose the RTL instruction chain here:
4024      debug information keeps pointing into CODE_LABEL insns inside the function
4025      body.  If these remain pointing to the other insns, we end up preserving
4026      whole RTL chain and attached detailed debug info in memory.  */
4027   for (insn = get_insns (); insn; insn = next)
4028     {
4029       next = NEXT_INSN (insn);
4030       NEXT_INSN (insn) = NULL;
4031       PREV_INSN (insn) = NULL;
4032     }
4033
4034   /* In case the function was not output,
4035      don't leave any temporary anonymous types
4036      queued up for sdb output.  */
4037 #ifdef SDB_DEBUGGING_INFO
4038   if (write_symbols == SDB_DEBUG)
4039     sdbout_types (NULL_TREE);
4040 #endif
4041
4042   reload_completed = 0;
4043   epilogue_completed = 0;
4044   flow2_completed = 0;
4045   no_new_pseudos = 0;
4046
4047   /* Clear out the insn_length contents now that they are no
4048      longer valid.  */
4049   init_insn_lengths ();
4050
4051   /* Show no temporary slots allocated.  */
4052   init_temp_slots ();
4053
4054   free_basic_block_vars ();
4055   free_bb_for_insn ();
4056
4057
4058   if (targetm.binds_local_p (current_function_decl))
4059     {
4060       int pref = cfun->preferred_stack_boundary;
4061       if (cfun->stack_alignment_needed > cfun->preferred_stack_boundary)
4062         pref = cfun->stack_alignment_needed;
4063       cgraph_rtl_info (current_function_decl)->preferred_incoming_stack_boundary
4064         = pref;
4065     }
4066
4067   /* Make sure volatile mem refs aren't considered valid operands for
4068      arithmetic insns.  We must call this here if this is a nested inline
4069      function, since the above code leaves us in the init_recog state,
4070      and the function context push/pop code does not save/restore volatile_ok.
4071
4072      ??? Maybe it isn't necessary for expand_start_function to call this
4073      anymore if we do it here?  */
4074
4075   init_recog_no_volatile ();
4076
4077   /* We're done with this function.  Free up memory if we can.  */
4078   free_after_parsing (cfun);
4079   free_after_compilation (cfun);
4080 }
4081
4082 struct tree_opt_pass pass_clean_state =
4083 {
4084   NULL,                                 /* name */
4085   NULL,                                 /* gate */
4086   rest_of_clean_state,                  /* execute */
4087   NULL,                                 /* sub */
4088   NULL,                                 /* next */
4089   0,                                    /* static_pass_number */
4090   TV_FINAL,                             /* tv_id */
4091   0,                                    /* properties_required */
4092   0,                                    /* properties_provided */
4093   PROP_rtl,                             /* properties_destroyed */
4094   0,                                    /* todo_flags_start */
4095   0,                                    /* todo_flags_finish */
4096   0                                     /* letter */
4097 };
4098