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