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