OSDN Git Service

* varasm.c (assemble_alias): Use DECL_ASSEMBLER_NAME, not the
[pf3gnuchains/gcc-fork.git] / gcc / reg-stack.c
1 /* Register to Stack convert for GNU compiler.
2    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001 Free Software Foundation, Inc.
4
5    This file is part of GNU CC.
6
7    GNU CC is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2, or (at your option)
10    any later version.
11
12    GNU CC is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GNU CC; see the file COPYING.  If not, write to
19    the Free Software Foundation, 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
21
22 /* This pass converts stack-like registers from the "flat register
23    file" model that gcc uses, to a stack convention that the 387 uses.
24
25    * The form of the input:
26
27    On input, the function consists of insn that have had their
28    registers fully allocated to a set of "virtual" registers.  Note that
29    the word "virtual" is used differently here than elsewhere in gcc: for
30    each virtual stack reg, there is a hard reg, but the mapping between
31    them is not known until this pass is run.  On output, hard register
32    numbers have been substituted, and various pop and exchange insns have
33    been emitted.  The hard register numbers and the virtual register
34    numbers completely overlap - before this pass, all stack register
35    numbers are virtual, and afterward they are all hard.
36
37    The virtual registers can be manipulated normally by gcc, and their
38    semantics are the same as for normal registers.  After the hard
39    register numbers are substituted, the semantics of an insn containing
40    stack-like regs are not the same as for an insn with normal regs: for
41    instance, it is not safe to delete an insn that appears to be a no-op
42    move.  In general, no insn containing hard regs should be changed
43    after this pass is done.
44
45    * The form of the output:
46
47    After this pass, hard register numbers represent the distance from
48    the current top of stack to the desired register.  A reference to
49    FIRST_STACK_REG references the top of stack, FIRST_STACK_REG + 1,
50    represents the register just below that, and so forth.  Also, REG_DEAD
51    notes indicate whether or not a stack register should be popped.
52
53    A "swap" insn looks like a parallel of two patterns, where each
54    pattern is a SET: one sets A to B, the other B to A.
55
56    A "push" or "load" insn is a SET whose SET_DEST is FIRST_STACK_REG
57    and whose SET_DEST is REG or MEM.  Any other SET_DEST, such as PLUS,
58    will replace the existing stack top, not push a new value.
59
60    A store insn is a SET whose SET_DEST is FIRST_STACK_REG, and whose
61    SET_SRC is REG or MEM.
62
63    The case where the SET_SRC and SET_DEST are both FIRST_STACK_REG
64    appears ambiguous.  As a special case, the presence of a REG_DEAD note
65    for FIRST_STACK_REG differentiates between a load insn and a pop.
66
67    If a REG_DEAD is present, the insn represents a "pop" that discards
68    the top of the register stack.  If there is no REG_DEAD note, then the
69    insn represents a "dup" or a push of the current top of stack onto the
70    stack.
71
72    * Methodology:
73
74    Existing REG_DEAD and REG_UNUSED notes for stack registers are
75    deleted and recreated from scratch.  REG_DEAD is never created for a
76    SET_DEST, only REG_UNUSED.
77
78    * asm_operands:
79
80    There are several rules on the usage of stack-like regs in
81    asm_operands insns.  These rules apply only to the operands that are
82    stack-like regs:
83
84    1. Given a set of input regs that die in an asm_operands, it is
85       necessary to know which are implicitly popped by the asm, and
86       which must be explicitly popped by gcc.
87
88         An input reg that is implicitly popped by the asm must be
89         explicitly clobbered, unless it is constrained to match an
90         output operand.
91
92    2. For any input reg that is implicitly popped by an asm, it is
93       necessary to know how to adjust the stack to compensate for the pop.
94       If any non-popped input is closer to the top of the reg-stack than
95       the implicitly popped reg, it would not be possible to know what the
96       stack looked like - it's not clear how the rest of the stack "slides
97       up".
98
99         All implicitly popped input regs must be closer to the top of
100         the reg-stack than any input that is not implicitly popped.
101
102    3. It is possible that if an input dies in an insn, reload might
103       use the input reg for an output reload.  Consider this example:
104
105                 asm ("foo" : "=t" (a) : "f" (b));
106
107       This asm says that input B is not popped by the asm, and that
108       the asm pushes a result onto the reg-stack, ie, the stack is one
109       deeper after the asm than it was before.  But, it is possible that
110       reload will think that it can use the same reg for both the input and
111       the output, if input B dies in this insn.
112
113         If any input operand uses the "f" constraint, all output reg
114         constraints must use the "&" earlyclobber.
115
116       The asm above would be written as
117
118                 asm ("foo" : "=&t" (a) : "f" (b));
119
120    4. Some operands need to be in particular places on the stack.  All
121       output operands fall in this category - there is no other way to
122       know which regs the outputs appear in unless the user indicates
123       this in the constraints.
124
125         Output operands must specifically indicate which reg an output
126         appears in after an asm.  "=f" is not allowed: the operand
127         constraints must select a class with a single reg.
128
129    5. Output operands may not be "inserted" between existing stack regs.
130       Since no 387 opcode uses a read/write operand, all output operands
131       are dead before the asm_operands, and are pushed by the asm_operands.
132       It makes no sense to push anywhere but the top of the reg-stack.
133
134         Output operands must start at the top of the reg-stack: output
135         operands may not "skip" a reg.
136
137    6. Some asm statements may need extra stack space for internal
138       calculations.  This can be guaranteed by clobbering stack registers
139       unrelated to the inputs and outputs.
140
141    Here are a couple of reasonable asms to want to write.  This asm
142    takes one input, which is internally popped, and produces two outputs.
143
144         asm ("fsincos" : "=t" (cos), "=u" (sin) : "0" (inp));
145
146    This asm takes two inputs, which are popped by the fyl2xp1 opcode,
147    and replaces them with one output.  The user must code the "st(1)"
148    clobber for reg-stack.c to know that fyl2xp1 pops both inputs.
149
150         asm ("fyl2xp1" : "=t" (result) : "0" (x), "u" (y) : "st(1)");
151
152 */
153 \f
154 #include "config.h"
155 #include "system.h"
156 #include "tree.h"
157 #include "rtl.h"
158 #include "tm_p.h"
159 #include "function.h"
160 #include "insn-config.h"
161 #include "regs.h"
162 #include "hard-reg-set.h"
163 #include "flags.h"
164 #include "insn-flags.h"
165 #include "toplev.h"
166 #include "recog.h"
167 #include "output.h"
168 #include "basic-block.h"
169 #include "varray.h"
170
171 #ifdef STACK_REGS
172
173 #define REG_STACK_SIZE (LAST_STACK_REG - FIRST_STACK_REG + 1)
174
175 /* This is the basic stack record.  TOP is an index into REG[] such
176    that REG[TOP] is the top of stack.  If TOP is -1 the stack is empty.
177
178    If TOP is -2, REG[] is not yet initialized.  Stack initialization
179    consists of placing each live reg in array `reg' and setting `top'
180    appropriately.
181
182    REG_SET indicates which registers are live.  */
183
184 typedef struct stack_def
185 {
186   int top;                      /* index to top stack element */
187   HARD_REG_SET reg_set;         /* set of live registers */
188   unsigned char reg[REG_STACK_SIZE];/* register - stack mapping */
189 } *stack;
190
191 /* This is used to carry information about basic blocks.  It is 
192    attached to the AUX field of the standard CFG block.  */
193
194 typedef struct block_info_def
195 {
196   struct stack_def stack_in;    /* Input stack configuration.  */
197   HARD_REG_SET out_reg_set;     /* Stack regs live on output.  */
198   int done;                     /* True if block already converted.  */
199 } *block_info;
200
201 #define BLOCK_INFO(B)   ((block_info) (B)->aux)
202
203 /* Passed to change_stack to indicate where to emit insns.  */
204 enum emit_where
205 {
206   EMIT_AFTER,
207   EMIT_BEFORE
208 };
209
210 /* We use this array to cache info about insns, because otherwise we
211    spend too much time in stack_regs_mentioned_p. 
212
213    Indexed by insn UIDs.  A value of zero is uninitialized, one indicates
214    the insn uses stack registers, two indicates the insn does not use
215    stack registers.  */
216 static varray_type stack_regs_mentioned_data;
217
218 /* The block we're currently working on.  */
219 static basic_block current_block;
220
221 /* This is the register file for all register after conversion */
222 static rtx
223   FP_mode_reg[LAST_STACK_REG+1-FIRST_STACK_REG][(int) MAX_MACHINE_MODE];
224
225 #define FP_MODE_REG(regno,mode) \
226   (FP_mode_reg[(regno)-FIRST_STACK_REG][(int)(mode)])
227
228 /* Used to initialize uninitialized registers.  */
229 static rtx nan;
230
231 /* Forward declarations */
232
233 static int stack_regs_mentioned_p       PARAMS ((rtx pat));
234 static void straighten_stack            PARAMS ((rtx, stack));
235 static void pop_stack                   PARAMS ((stack, int));
236 static rtx *get_true_reg                PARAMS ((rtx *));
237
238 static int check_asm_stack_operands     PARAMS ((rtx));
239 static int get_asm_operand_n_inputs     PARAMS ((rtx));
240 static rtx stack_result                 PARAMS ((tree));
241 static void replace_reg                 PARAMS ((rtx *, int));
242 static void remove_regno_note           PARAMS ((rtx, enum reg_note,
243                                                  unsigned int));
244 static int get_hard_regnum              PARAMS ((stack, rtx));
245 static void delete_insn_for_stacker     PARAMS ((rtx));
246 static rtx emit_pop_insn                PARAMS ((rtx, stack, rtx,
247                                                enum emit_where));
248 static void emit_swap_insn              PARAMS ((rtx, stack, rtx));
249 static void move_for_stack_reg          PARAMS ((rtx, stack, rtx));
250 static int swap_rtx_condition_1         PARAMS ((rtx));
251 static int swap_rtx_condition           PARAMS ((rtx));
252 static void compare_for_stack_reg       PARAMS ((rtx, stack, rtx));
253 static void subst_stack_regs_pat        PARAMS ((rtx, stack, rtx));
254 static void subst_asm_stack_regs        PARAMS ((rtx, stack));
255 static void subst_stack_regs            PARAMS ((rtx, stack));
256 static void change_stack                PARAMS ((rtx, stack, stack,
257                                                enum emit_where));
258 static int convert_regs_entry           PARAMS ((void));
259 static void convert_regs_exit           PARAMS ((void));
260 static int convert_regs_1               PARAMS ((FILE *, basic_block));
261 static int convert_regs_2               PARAMS ((FILE *, basic_block));
262 static int convert_regs                 PARAMS ((FILE *));
263 static void print_stack                 PARAMS ((FILE *, stack));
264 static rtx next_flags_user              PARAMS ((rtx));
265 static void record_label_references     PARAMS ((rtx, rtx));
266 \f
267 /* Return non-zero if any stack register is mentioned somewhere within PAT.  */
268
269 static int
270 stack_regs_mentioned_p (pat)
271      rtx pat;
272 {
273   register const char *fmt;
274   register int i;
275
276   if (STACK_REG_P (pat))
277     return 1;
278
279   fmt = GET_RTX_FORMAT (GET_CODE (pat));
280   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0; i--)
281     {
282       if (fmt[i] == 'E')
283         {
284           register int j;
285
286           for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
287             if (stack_regs_mentioned_p (XVECEXP (pat, i, j)))
288               return 1;
289         }
290       else if (fmt[i] == 'e' && stack_regs_mentioned_p (XEXP (pat, i)))
291         return 1;
292     }
293
294   return 0;
295 }
296
297 /* Return nonzero if INSN mentions stacked registers, else return zero.  */
298
299 int
300 stack_regs_mentioned (insn)
301      rtx insn;
302 {
303   unsigned int uid, max;
304   int test;
305
306   if (! INSN_P (insn))
307     return 0;
308
309   uid = INSN_UID (insn);
310   max = VARRAY_SIZE (stack_regs_mentioned_data);
311   if (uid >= max)
312     {
313       /* Allocate some extra size to avoid too many reallocs, but
314          do not grow too quickly.  */
315       max = uid + uid / 20;
316       VARRAY_GROW (stack_regs_mentioned_data, max);
317     }
318
319   test = VARRAY_CHAR (stack_regs_mentioned_data, uid);
320   if (test == 0)
321     {
322       /* This insn has yet to be examined.  Do so now.  */
323       test = stack_regs_mentioned_p (PATTERN (insn)) ? 1 : 2;
324       VARRAY_CHAR (stack_regs_mentioned_data, uid) = test;
325     }
326
327   return test == 1;
328 }
329 \f
330 static rtx ix86_flags_rtx;
331
332 static rtx
333 next_flags_user (insn)
334      rtx insn;
335 {
336   /* Search forward looking for the first use of this value. 
337      Stop at block boundaries.  */
338
339   while (insn != current_block->end)
340     {
341       insn = NEXT_INSN (insn);
342
343       if (INSN_P (insn) && reg_mentioned_p (ix86_flags_rtx, PATTERN (insn)))
344         return insn;
345
346       if (GET_CODE (insn) == CALL_INSN)
347         return NULL_RTX;
348     }
349   return NULL_RTX;
350 }
351 \f
352 /* Reorganise the stack into ascending numbers,
353    after this insn.  */
354
355 static void
356 straighten_stack (insn, regstack)
357      rtx insn;
358      stack regstack;
359 {
360   struct stack_def temp_stack;
361   int top;
362
363   /* If there is only a single register on the stack, then the stack is
364      already in increasing order and no reorganization is needed.
365
366      Similarly if the stack is empty.  */
367   if (regstack->top <= 0)
368     return;
369
370   COPY_HARD_REG_SET (temp_stack.reg_set, regstack->reg_set);
371
372   for (top = temp_stack.top = regstack->top; top >= 0; top--)
373     temp_stack.reg[top] = FIRST_STACK_REG + temp_stack.top - top;
374   
375   change_stack (insn, regstack, &temp_stack, EMIT_AFTER);
376 }
377
378 /* Pop a register from the stack */
379
380 static void
381 pop_stack (regstack, regno)
382      stack regstack;
383      int   regno;
384 {
385   int top = regstack->top;
386
387   CLEAR_HARD_REG_BIT (regstack->reg_set, regno);
388   regstack->top--;
389   /* If regno was not at the top of stack then adjust stack */
390   if (regstack->reg [top] != regno)
391     {
392       int i;
393       for (i = regstack->top; i >= 0; i--)
394         if (regstack->reg [i] == regno)
395           {
396             int j;
397             for (j = i; j < top; j++)
398               regstack->reg [j] = regstack->reg [j + 1];
399             break;
400           }
401     }
402 }
403 \f
404 /* Convert register usage from "flat" register file usage to a "stack
405    register file.  FIRST is the first insn in the function, FILE is the
406    dump file, if used.
407
408    Construct a CFG and run life analysis.  Then convert each insn one
409    by one.  Run a last jump_optimize pass, if optimizing, to eliminate
410    code duplication created when the converter inserts pop insns on
411    the edges.  */
412
413 void
414 reg_to_stack (first, file)
415      rtx first;
416      FILE *file;
417 {
418   int i;
419   int max_uid;
420   block_info bi;
421
422   /* See if there is something to do.  Flow analysis is quite
423      expensive so we might save some compilation time.  */
424   for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
425     if (regs_ever_live[i])
426       break;
427   if (i > LAST_STACK_REG)
428     return;
429
430   /* Ok, floating point instructions exist.  If not optimizing, 
431      build the CFG and run life analysis.  */
432   find_basic_blocks (first, max_reg_num (), file);
433   count_or_remove_death_notes (NULL, 1);
434   life_analysis (first, file, PROP_DEATH_NOTES);
435
436   /* Set up block info for each basic block.  */
437   bi = (block_info) xcalloc ((n_basic_blocks + 1), sizeof (*bi));
438   for (i = n_basic_blocks - 1; i >= 0; --i)
439     BASIC_BLOCK (i)->aux = bi + i;
440   EXIT_BLOCK_PTR->aux = bi + n_basic_blocks;
441
442   /* Create the replacement registers up front.  */
443   for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
444     {
445       enum machine_mode mode;
446       for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
447            mode != VOIDmode;
448            mode = GET_MODE_WIDER_MODE (mode))
449         FP_MODE_REG (i, mode) = gen_rtx_REG (mode, i);
450       for (mode = GET_CLASS_NARROWEST_MODE (MODE_COMPLEX_FLOAT);
451            mode != VOIDmode;
452            mode = GET_MODE_WIDER_MODE (mode))
453         FP_MODE_REG (i, mode) = gen_rtx_REG (mode, i);
454     }
455
456   ix86_flags_rtx = gen_rtx_REG (CCmode, FLAGS_REG);
457
458   /* A QNaN for initializing uninitialized variables.  
459
460      ??? We can't load from constant memory in PIC mode, because
461      we're insertting these instructions before the prologue and
462      the PIC register hasn't been set up.  In that case, fall back
463      on zero, which we can get from `ldz'.  */
464
465   if (flag_pic)
466     nan = CONST0_RTX (SFmode);
467   else
468     {
469       nan = gen_lowpart (SFmode, GEN_INT (0x7fc00000));
470       nan = force_const_mem (SFmode, nan);
471     }
472
473   /* Allocate a cache for stack_regs_mentioned.  */
474   max_uid = get_max_uid ();
475   VARRAY_CHAR_INIT (stack_regs_mentioned_data, max_uid + 1,
476                     "stack_regs_mentioned cache");
477
478   if (convert_regs (file) && optimize)
479     {
480       jump_optimize (first, JUMP_CROSS_JUMP_DEATH_MATTERS,
481                      !JUMP_NOOP_MOVES, !JUMP_AFTER_REGSCAN);
482     }
483
484   /* Clean up.  */
485   VARRAY_FREE (stack_regs_mentioned_data);
486   free (bi);
487 }
488 \f
489 /* Check PAT, which is in INSN, for LABEL_REFs.  Add INSN to the
490    label's chain of references, and note which insn contains each
491    reference.  */
492
493 static void
494 record_label_references (insn, pat)
495      rtx insn, pat;
496 {
497   register enum rtx_code code = GET_CODE (pat);
498   register int i;
499   register const char *fmt;
500
501   if (code == LABEL_REF)
502     {
503       register rtx label = XEXP (pat, 0);
504       register rtx ref;
505
506       if (GET_CODE (label) != CODE_LABEL)
507         abort ();
508
509       /* If this is an undefined label, LABEL_REFS (label) contains
510          garbage.  */
511       if (INSN_UID (label) == 0)
512         return;
513
514       /* Don't make a duplicate in the code_label's chain.  */
515
516       for (ref = LABEL_REFS (label);
517            ref && ref != label;
518            ref = LABEL_NEXTREF (ref))
519         if (CONTAINING_INSN (ref) == insn)
520           return;
521
522       CONTAINING_INSN (pat) = insn;
523       LABEL_NEXTREF (pat) = LABEL_REFS (label);
524       LABEL_REFS (label) = pat;
525
526       return;
527     }
528
529   fmt = GET_RTX_FORMAT (code);
530   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
531     {
532       if (fmt[i] == 'e')
533         record_label_references (insn, XEXP (pat, i));
534       if (fmt[i] == 'E')
535         {
536           register int j;
537           for (j = 0; j < XVECLEN (pat, i); j++)
538             record_label_references (insn, XVECEXP (pat, i, j));
539         }
540     }
541 }
542 \f
543 /* Return a pointer to the REG expression within PAT.  If PAT is not a
544    REG, possible enclosed by a conversion rtx, return the inner part of
545    PAT that stopped the search.  */
546
547 static rtx *
548 get_true_reg (pat)
549      rtx *pat;
550 {
551   for (;;)
552     switch (GET_CODE (*pat))
553       {
554       case SUBREG:
555         /* Eliminate FP subregister accesses in favour of the
556            actual FP register in use.  */
557         {
558           rtx subreg;
559           if (FP_REG_P (subreg = SUBREG_REG (*pat)))
560             {
561               *pat = FP_MODE_REG (REGNO (subreg) + SUBREG_WORD (*pat),
562                                   GET_MODE (subreg));
563             default:
564               return pat;
565             }
566         }
567       case FLOAT:
568       case FIX:
569       case FLOAT_EXTEND:
570         pat = & XEXP (*pat, 0);
571       }
572 }
573 \f
574 /* There are many rules that an asm statement for stack-like regs must
575    follow.  Those rules are explained at the top of this file: the rule
576    numbers below refer to that explanation.  */
577
578 static int
579 check_asm_stack_operands (insn)
580      rtx insn;
581 {
582   int i;
583   int n_clobbers;
584   int malformed_asm = 0;
585   rtx body = PATTERN (insn);
586
587   char reg_used_as_output[FIRST_PSEUDO_REGISTER];
588   char implicitly_dies[FIRST_PSEUDO_REGISTER];
589   int alt;
590
591   rtx *clobber_reg = 0;
592   int n_inputs, n_outputs;
593
594   /* Find out what the constraints require.  If no constraint
595      alternative matches, this asm is malformed.  */
596   extract_insn (insn);
597   constrain_operands (1);
598   alt = which_alternative;
599
600   preprocess_constraints ();
601
602   n_inputs = get_asm_operand_n_inputs (body);
603   n_outputs = recog_data.n_operands - n_inputs;
604
605   if (alt < 0)
606     {
607       malformed_asm = 1;
608       /* Avoid further trouble with this insn.  */
609       PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
610       return 0;
611     }
612
613   /* Strip SUBREGs here to make the following code simpler.  */
614   for (i = 0; i < recog_data.n_operands; i++)
615     if (GET_CODE (recog_data.operand[i]) == SUBREG
616         && GET_CODE (SUBREG_REG (recog_data.operand[i])) == REG)
617       recog_data.operand[i] = SUBREG_REG (recog_data.operand[i]);
618
619   /* Set up CLOBBER_REG.  */
620
621   n_clobbers = 0;
622
623   if (GET_CODE (body) == PARALLEL)
624     {
625       clobber_reg = (rtx *) alloca (XVECLEN (body, 0) * sizeof (rtx));
626
627       for (i = 0; i < XVECLEN (body, 0); i++)
628         if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
629           {
630             rtx clobber = XVECEXP (body, 0, i);
631             rtx reg = XEXP (clobber, 0);
632
633             if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
634               reg = SUBREG_REG (reg);
635
636             if (STACK_REG_P (reg))
637               {
638                 clobber_reg[n_clobbers] = reg;
639                 n_clobbers++;
640               }
641           }
642     }
643
644   /* Enforce rule #4: Output operands must specifically indicate which
645      reg an output appears in after an asm.  "=f" is not allowed: the
646      operand constraints must select a class with a single reg.
647
648      Also enforce rule #5: Output operands must start at the top of
649      the reg-stack: output operands may not "skip" a reg.  */
650
651   memset (reg_used_as_output, 0, sizeof (reg_used_as_output));
652   for (i = 0; i < n_outputs; i++)
653     if (STACK_REG_P (recog_data.operand[i]))
654       {
655         if (reg_class_size[(int) recog_op_alt[i][alt].class] != 1)
656           {
657             error_for_asm (insn, "Output constraint %d must specify a single register", i);
658             malformed_asm = 1;
659           }
660         else
661           reg_used_as_output[REGNO (recog_data.operand[i])] = 1;
662       }
663
664
665   /* Search for first non-popped reg.  */
666   for (i = FIRST_STACK_REG; i < LAST_STACK_REG + 1; i++)
667     if (! reg_used_as_output[i])
668       break;
669
670   /* If there are any other popped regs, that's an error.  */
671   for (; i < LAST_STACK_REG + 1; i++)
672     if (reg_used_as_output[i])
673       break;
674
675   if (i != LAST_STACK_REG + 1)
676     {
677       error_for_asm (insn, "Output regs must be grouped at top of stack");
678       malformed_asm = 1;
679     }
680
681   /* Enforce rule #2: All implicitly popped input regs must be closer
682      to the top of the reg-stack than any input that is not implicitly
683      popped.  */
684
685   memset (implicitly_dies, 0, sizeof (implicitly_dies));
686   for (i = n_outputs; i < n_outputs + n_inputs; i++)
687     if (STACK_REG_P (recog_data.operand[i]))
688       {
689         /* An input reg is implicitly popped if it is tied to an
690            output, or if there is a CLOBBER for it.  */
691         int j;
692
693         for (j = 0; j < n_clobbers; j++)
694           if (operands_match_p (clobber_reg[j], recog_data.operand[i]))
695             break;
696
697         if (j < n_clobbers || recog_op_alt[i][alt].matches >= 0)
698           implicitly_dies[REGNO (recog_data.operand[i])] = 1;
699       }
700
701   /* Search for first non-popped reg.  */
702   for (i = FIRST_STACK_REG; i < LAST_STACK_REG + 1; i++)
703     if (! implicitly_dies[i])
704       break;
705
706   /* If there are any other popped regs, that's an error.  */
707   for (; i < LAST_STACK_REG + 1; i++)
708     if (implicitly_dies[i])
709       break;
710
711   if (i != LAST_STACK_REG + 1)
712     {
713       error_for_asm (insn,
714                      "Implicitly popped regs must be grouped at top of stack");
715       malformed_asm = 1;
716     }
717
718   /* Enfore rule #3: If any input operand uses the "f" constraint, all
719      output constraints must use the "&" earlyclobber.
720
721      ??? Detect this more deterministically by having constrain_asm_operands
722      record any earlyclobber.  */
723
724   for (i = n_outputs; i < n_outputs + n_inputs; i++)
725     if (recog_op_alt[i][alt].matches == -1)
726       {
727         int j;
728
729         for (j = 0; j < n_outputs; j++)
730           if (operands_match_p (recog_data.operand[j], recog_data.operand[i]))
731             {
732               error_for_asm (insn,
733                              "Output operand %d must use `&' constraint", j);
734               malformed_asm = 1;
735             }
736       }
737
738   if (malformed_asm)
739     {
740       /* Avoid further trouble with this insn.  */
741       PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
742       return 0;
743     }
744
745   return 1;
746 }
747 \f
748 /* Calculate the number of inputs and outputs in BODY, an
749    asm_operands.  N_OPERANDS is the total number of operands, and
750    N_INPUTS and N_OUTPUTS are pointers to ints into which the results are
751    placed.  */
752
753 static int
754 get_asm_operand_n_inputs (body)
755      rtx body;
756 {
757   if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
758     return ASM_OPERANDS_INPUT_LENGTH (SET_SRC (body));
759
760   else if (GET_CODE (body) == ASM_OPERANDS)
761     return ASM_OPERANDS_INPUT_LENGTH (body);
762
763   else if (GET_CODE (body) == PARALLEL
764            && GET_CODE (XVECEXP (body, 0, 0)) == SET)
765     return ASM_OPERANDS_INPUT_LENGTH (SET_SRC (XVECEXP (body, 0, 0)));
766
767   else if (GET_CODE (body) == PARALLEL
768            && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
769     return ASM_OPERANDS_INPUT_LENGTH (XVECEXP (body, 0, 0));
770
771   abort ();
772 }
773
774 /* If current function returns its result in an fp stack register,
775    return the REG.  Otherwise, return 0.  */
776
777 static rtx
778 stack_result (decl)
779      tree decl;
780 {
781   rtx result;
782
783   /* If the value is supposed to be returned in memory, then clearly
784      it is not returned in a stack register.  */
785   if (aggregate_value_p (DECL_RESULT (decl)))
786     return 0;
787
788   result = DECL_RTL_IF_SET (DECL_RESULT (decl));
789   if (result != 0)
790     {
791 #ifdef FUNCTION_OUTGOING_VALUE
792       result
793         = FUNCTION_OUTGOING_VALUE (TREE_TYPE (DECL_RESULT (decl)), decl);
794 #else
795       result = FUNCTION_VALUE (TREE_TYPE (DECL_RESULT (decl)), decl);
796 #endif
797     }
798
799   return result != 0 && STACK_REG_P (result) ? result : 0;
800 }
801 \f
802
803 /*
804  * This section deals with stack register substitution, and forms the second
805  * pass over the RTL.
806  */
807
808 /* Replace REG, which is a pointer to a stack reg RTX, with an RTX for
809    the desired hard REGNO.  */
810
811 static void
812 replace_reg (reg, regno)
813      rtx *reg;
814      int regno;
815 {
816   if (regno < FIRST_STACK_REG || regno > LAST_STACK_REG
817       || ! STACK_REG_P (*reg))
818     abort ();
819
820   switch (GET_MODE_CLASS (GET_MODE (*reg)))
821     {
822     default: abort ();
823     case MODE_FLOAT:
824     case MODE_COMPLEX_FLOAT:;
825     }
826
827   *reg = FP_MODE_REG (regno, GET_MODE (*reg));
828 }
829
830 /* Remove a note of type NOTE, which must be found, for register
831    number REGNO from INSN.  Remove only one such note.  */
832
833 static void
834 remove_regno_note (insn, note, regno)
835      rtx insn;
836      enum reg_note note;
837      unsigned int regno;
838 {
839   register rtx *note_link, this;
840
841   note_link = &REG_NOTES(insn);
842   for (this = *note_link; this; this = XEXP (this, 1))
843     if (REG_NOTE_KIND (this) == note
844         && REG_P (XEXP (this, 0)) && REGNO (XEXP (this, 0)) == regno)
845       {
846         *note_link = XEXP (this, 1);
847         return;
848       }
849     else
850       note_link = &XEXP (this, 1);
851
852   abort ();
853 }
854
855 /* Find the hard register number of virtual register REG in REGSTACK.
856    The hard register number is relative to the top of the stack.  -1 is
857    returned if the register is not found.  */
858
859 static int
860 get_hard_regnum (regstack, reg)
861      stack regstack;
862      rtx reg;
863 {
864   int i;
865
866   if (! STACK_REG_P (reg))
867     abort ();
868
869   for (i = regstack->top; i >= 0; i--)
870     if (regstack->reg[i] == REGNO (reg))
871       break;
872
873   return i >= 0 ? (FIRST_STACK_REG + regstack->top - i) : -1;
874 }
875
876 /* Delete INSN from the RTL.  Mark the insn, but don't remove it from
877    the chain of insns.  Doing so could confuse block_begin and block_end
878    if this were the only insn in the block.  */
879
880 static void
881 delete_insn_for_stacker (insn)
882      rtx insn;
883 {
884   PUT_CODE (insn, NOTE);
885   NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
886   NOTE_SOURCE_FILE (insn) = 0;
887 }
888 \f
889 /* Emit an insn to pop virtual register REG before or after INSN.
890    REGSTACK is the stack state after INSN and is updated to reflect this
891    pop.  WHEN is either emit_insn_before or emit_insn_after.  A pop insn
892    is represented as a SET whose destination is the register to be popped
893    and source is the top of stack.  A death note for the top of stack
894    cases the movdf pattern to pop.  */
895
896 static rtx
897 emit_pop_insn (insn, regstack, reg, where)
898      rtx insn;
899      stack regstack;
900      rtx reg;
901      enum emit_where where;
902 {
903   rtx pop_insn, pop_rtx;
904   int hard_regno;
905
906   hard_regno = get_hard_regnum (regstack, reg);
907
908   if (hard_regno < FIRST_STACK_REG)
909     abort ();
910
911   pop_rtx = gen_rtx_SET (VOIDmode, FP_MODE_REG (hard_regno, DFmode),
912                          FP_MODE_REG (FIRST_STACK_REG, DFmode));
913
914   if (where == EMIT_AFTER)
915     pop_insn = emit_block_insn_after (pop_rtx, insn, current_block);
916   else
917     pop_insn = emit_block_insn_before (pop_rtx, insn, current_block);
918
919   REG_NOTES (pop_insn)
920     = gen_rtx_EXPR_LIST (REG_DEAD, FP_MODE_REG (FIRST_STACK_REG, DFmode),
921                          REG_NOTES (pop_insn));
922
923   regstack->reg[regstack->top - (hard_regno - FIRST_STACK_REG)]
924     = regstack->reg[regstack->top];
925   regstack->top -= 1;
926   CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (reg));
927
928   return pop_insn;
929 }
930 \f
931 /* Emit an insn before or after INSN to swap virtual register REG with
932    the top of stack.  REGSTACK is the stack state before the swap, and
933    is updated to reflect the swap.  A swap insn is represented as a
934    PARALLEL of two patterns: each pattern moves one reg to the other.
935
936    If REG is already at the top of the stack, no insn is emitted.  */
937
938 static void
939 emit_swap_insn (insn, regstack, reg)
940      rtx insn;
941      stack regstack;
942      rtx reg;
943 {
944   int hard_regno;
945   rtx swap_rtx;
946   int tmp, other_reg;           /* swap regno temps */
947   rtx i1;                       /* the stack-reg insn prior to INSN */
948   rtx i1set = NULL_RTX;         /* the SET rtx within I1 */
949
950   hard_regno = get_hard_regnum (regstack, reg);
951
952   if (hard_regno < FIRST_STACK_REG)
953     abort ();
954   if (hard_regno == FIRST_STACK_REG)
955     return;
956
957   other_reg = regstack->top - (hard_regno - FIRST_STACK_REG);
958
959   tmp = regstack->reg[other_reg];
960   regstack->reg[other_reg] = regstack->reg[regstack->top];
961   regstack->reg[regstack->top] = tmp;
962
963   /* Find the previous insn involving stack regs, but don't pass a
964      block boundary.  */
965   i1 = NULL;
966   if (current_block && insn != current_block->head)
967     {
968       rtx tmp = PREV_INSN (insn);
969       rtx limit = PREV_INSN (current_block->head);
970       while (tmp != limit)
971         {
972           if (GET_CODE (tmp) == CODE_LABEL
973               || NOTE_INSN_BASIC_BLOCK_P (tmp)
974               || (GET_CODE (tmp) == INSN
975                   && stack_regs_mentioned (tmp)))
976             {
977               i1 = tmp;
978               break;
979             }
980           tmp = PREV_INSN (tmp);
981         }
982     }
983
984   if (i1 != NULL_RTX
985       && (i1set = single_set (i1)) != NULL_RTX)
986     {
987       rtx i1src = *get_true_reg (&SET_SRC (i1set));
988       rtx i1dest = *get_true_reg (&SET_DEST (i1set));
989
990       /* If the previous register stack push was from the reg we are to
991          swap with, omit the swap.  */
992
993       if (GET_CODE (i1dest) == REG && REGNO (i1dest) == FIRST_STACK_REG
994           && GET_CODE (i1src) == REG && REGNO (i1src) == hard_regno - 1
995           && find_regno_note (i1, REG_DEAD, FIRST_STACK_REG) == NULL_RTX)
996         return;
997
998       /* If the previous insn wrote to the reg we are to swap with,
999          omit the swap.  */
1000
1001       if (GET_CODE (i1dest) == REG && REGNO (i1dest) == hard_regno
1002           && GET_CODE (i1src) == REG && REGNO (i1src) == FIRST_STACK_REG
1003           && find_regno_note (i1, REG_DEAD, FIRST_STACK_REG) == NULL_RTX)
1004         return;
1005     }
1006
1007   swap_rtx = gen_swapxf (FP_MODE_REG (hard_regno, XFmode),
1008                          FP_MODE_REG (FIRST_STACK_REG, XFmode));
1009
1010   if (i1)
1011     emit_block_insn_after (swap_rtx, i1, current_block);
1012   else if (current_block)
1013     emit_block_insn_before (swap_rtx, current_block->head, current_block);
1014   else
1015     emit_insn_before (swap_rtx, insn);
1016 }
1017 \f
1018 /* Handle a move to or from a stack register in PAT, which is in INSN.
1019    REGSTACK is the current stack.  */
1020
1021 static void
1022 move_for_stack_reg (insn, regstack, pat)
1023      rtx insn;
1024      stack regstack;
1025      rtx pat;
1026 {
1027   rtx *psrc =  get_true_reg (&SET_SRC (pat));
1028   rtx *pdest = get_true_reg (&SET_DEST (pat));
1029   rtx src, dest;
1030   rtx note;
1031
1032   src = *psrc; dest = *pdest;
1033
1034   if (STACK_REG_P (src) && STACK_REG_P (dest))
1035     {
1036       /* Write from one stack reg to another.  If SRC dies here, then
1037          just change the register mapping and delete the insn.  */
1038
1039       note = find_regno_note (insn, REG_DEAD, REGNO (src));
1040       if (note)
1041         {
1042           int i;
1043
1044           /* If this is a no-op move, there must not be a REG_DEAD note.  */
1045           if (REGNO (src) == REGNO (dest))
1046             abort ();
1047
1048           for (i = regstack->top; i >= 0; i--)
1049             if (regstack->reg[i] == REGNO (src))
1050               break;
1051
1052           /* The source must be live, and the dest must be dead.  */
1053           if (i < 0 || get_hard_regnum (regstack, dest) >= FIRST_STACK_REG)
1054             abort ();
1055
1056           /* It is possible that the dest is unused after this insn.
1057              If so, just pop the src.  */
1058
1059           if (find_regno_note (insn, REG_UNUSED, REGNO (dest)))
1060             {
1061               emit_pop_insn (insn, regstack, src, EMIT_AFTER);
1062
1063               delete_insn_for_stacker (insn);
1064               return;
1065             }
1066
1067           regstack->reg[i] = REGNO (dest);
1068
1069           SET_HARD_REG_BIT (regstack->reg_set, REGNO (dest));
1070           CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (src));
1071
1072           delete_insn_for_stacker (insn);
1073
1074           return;
1075         }
1076
1077       /* The source reg does not die.  */
1078
1079       /* If this appears to be a no-op move, delete it, or else it
1080          will confuse the machine description output patterns. But if
1081          it is REG_UNUSED, we must pop the reg now, as per-insn processing
1082          for REG_UNUSED will not work for deleted insns.  */
1083
1084       if (REGNO (src) == REGNO (dest))
1085         {
1086           if (find_regno_note (insn, REG_UNUSED, REGNO (dest)))
1087             emit_pop_insn (insn, regstack, dest, EMIT_AFTER);
1088
1089           delete_insn_for_stacker (insn);
1090           return;
1091         }
1092
1093       /* The destination ought to be dead */
1094       if (get_hard_regnum (regstack, dest) >= FIRST_STACK_REG)
1095         abort ();
1096
1097       replace_reg (psrc, get_hard_regnum (regstack, src));
1098
1099       regstack->reg[++regstack->top] = REGNO (dest);
1100       SET_HARD_REG_BIT (regstack->reg_set, REGNO (dest));
1101       replace_reg (pdest, FIRST_STACK_REG);
1102     }
1103   else if (STACK_REG_P (src))
1104     {
1105       /* Save from a stack reg to MEM, or possibly integer reg.  Since
1106          only top of stack may be saved, emit an exchange first if
1107          needs be.  */
1108
1109       emit_swap_insn (insn, regstack, src);
1110
1111       note = find_regno_note (insn, REG_DEAD, REGNO (src));
1112       if (note)
1113         {
1114           replace_reg (&XEXP (note, 0), FIRST_STACK_REG);
1115           regstack->top--;
1116           CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (src));
1117         }
1118       else if ((GET_MODE (src) == XFmode || GET_MODE (src) == TFmode)
1119                && regstack->top < REG_STACK_SIZE - 1)
1120         {
1121           /* A 387 cannot write an XFmode value to a MEM without
1122              clobbering the source reg.  The output code can handle
1123              this by reading back the value from the MEM.
1124              But it is more efficient to use a temp register if one is
1125              available.  Push the source value here if the register
1126              stack is not full, and then write the value to memory via
1127              a pop.  */
1128           rtx push_rtx, push_insn;
1129           rtx top_stack_reg = FP_MODE_REG (FIRST_STACK_REG, XFmode);
1130
1131           push_rtx = gen_movxf (top_stack_reg, top_stack_reg);
1132           push_insn = emit_insn_before (push_rtx, insn);
1133           REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD, top_stack_reg,
1134                                                 REG_NOTES (insn));
1135         }
1136
1137       replace_reg (psrc, FIRST_STACK_REG);
1138     }
1139   else if (STACK_REG_P (dest))
1140     {
1141       /* Load from MEM, or possibly integer REG or constant, into the
1142          stack regs.  The actual target is always the top of the
1143          stack. The stack mapping is changed to reflect that DEST is
1144          now at top of stack.  */
1145
1146       /* The destination ought to be dead */
1147       if (get_hard_regnum (regstack, dest) >= FIRST_STACK_REG)
1148         abort ();
1149
1150       if (regstack->top >= REG_STACK_SIZE)
1151         abort ();
1152
1153       regstack->reg[++regstack->top] = REGNO (dest);
1154       SET_HARD_REG_BIT (regstack->reg_set, REGNO (dest));
1155       replace_reg (pdest, FIRST_STACK_REG);
1156     }
1157   else
1158     abort ();
1159 }
1160 \f
1161 /* Swap the condition on a branch, if there is one.  Return true if we
1162    found a condition to swap.  False if the condition was not used as
1163    such. */
1164
1165 static int
1166 swap_rtx_condition_1 (pat)
1167      rtx pat;
1168 {
1169   register const char *fmt;
1170   register int i, r = 0;
1171
1172   if (GET_RTX_CLASS (GET_CODE (pat)) == '<')
1173     {
1174       PUT_CODE (pat, swap_condition (GET_CODE (pat)));
1175       r = 1;
1176     }
1177   else
1178     {
1179       fmt = GET_RTX_FORMAT (GET_CODE (pat));
1180       for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0; i--)
1181         {
1182           if (fmt[i] == 'E')
1183             {
1184               register int j;
1185
1186               for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
1187                 r |= swap_rtx_condition_1 (XVECEXP (pat, i, j));
1188             }
1189           else if (fmt[i] == 'e')
1190             r |= swap_rtx_condition_1 (XEXP (pat, i));
1191         }
1192     }
1193
1194   return r;
1195 }
1196
1197 static int
1198 swap_rtx_condition (insn)
1199      rtx insn;
1200 {
1201   rtx pat = PATTERN (insn);
1202
1203   /* We're looking for a single set to cc0 or an HImode temporary.  */
1204
1205   if (GET_CODE (pat) == SET
1206       && GET_CODE (SET_DEST (pat)) == REG
1207       && REGNO (SET_DEST (pat)) == FLAGS_REG)
1208     {
1209       insn = next_flags_user (insn);
1210       if (insn == NULL_RTX)
1211         return 0;
1212       pat = PATTERN (insn);
1213     }
1214
1215   /* See if this is, or ends in, a fnstsw, aka unspec 9.  If so, we're
1216      not doing anything with the cc value right now.  We may be able to
1217      search for one though.  */
1218
1219   if (GET_CODE (pat) == SET
1220       && GET_CODE (SET_SRC (pat)) == UNSPEC
1221       && XINT (SET_SRC (pat), 1) == 9)
1222     {
1223       rtx dest = SET_DEST (pat);
1224
1225       /* Search forward looking for the first use of this value. 
1226          Stop at block boundaries.  */
1227       while (insn != current_block->end)
1228         {
1229           insn = NEXT_INSN (insn);
1230           if (INSN_P (insn) && reg_mentioned_p (dest, insn))
1231             break;
1232           if (GET_CODE (insn) == CALL_INSN)
1233             return 0;
1234         }
1235
1236       /* So we've found the insn using this value.  If it is anything
1237          other than sahf, aka unspec 10, or the value does not die
1238          (meaning we'd have to search further), then we must give up.  */
1239       pat = PATTERN (insn);
1240       if (GET_CODE (pat) != SET
1241           || GET_CODE (SET_SRC (pat)) != UNSPEC
1242           || XINT (SET_SRC (pat), 1) != 10
1243           || ! dead_or_set_p (insn, dest))
1244         return 0;
1245
1246       /* Now we are prepared to handle this as a normal cc0 setter.  */
1247       insn = next_flags_user (insn);
1248       if (insn == NULL_RTX)
1249         return 0;
1250       pat = PATTERN (insn);
1251     }
1252
1253   if (swap_rtx_condition_1 (pat))
1254     {
1255       int fail = 0;
1256       INSN_CODE (insn) = -1;
1257       if (recog_memoized (insn) == -1)
1258         fail = 1;
1259       /* In case the flags don't die here, recurse to try fix
1260          following user too.  */
1261       else if (! dead_or_set_p (insn, ix86_flags_rtx))
1262         {
1263           insn = next_flags_user (insn);
1264           if (!insn || !swap_rtx_condition (insn))
1265             fail = 1;
1266         }
1267       if (fail)
1268         {
1269           swap_rtx_condition_1 (pat);
1270           return 0;
1271         }
1272       return 1;
1273     }
1274   return 0;
1275 }
1276
1277 /* Handle a comparison.  Special care needs to be taken to avoid
1278    causing comparisons that a 387 cannot do correctly, such as EQ.
1279
1280    Also, a pop insn may need to be emitted.  The 387 does have an
1281    `fcompp' insn that can pop two regs, but it is sometimes too expensive
1282    to do this - a `fcomp' followed by a `fstpl %st(0)' may be easier to
1283    set up.  */
1284
1285 static void
1286 compare_for_stack_reg (insn, regstack, pat_src)
1287      rtx insn;
1288      stack regstack;
1289      rtx pat_src;
1290 {
1291   rtx *src1, *src2;
1292   rtx src1_note, src2_note;
1293   rtx flags_user;
1294
1295   src1 = get_true_reg (&XEXP (pat_src, 0));
1296   src2 = get_true_reg (&XEXP (pat_src, 1));
1297   flags_user = next_flags_user (insn);
1298
1299   /* ??? If fxch turns out to be cheaper than fstp, give priority to
1300      registers that die in this insn - move those to stack top first.  */
1301   if ((! STACK_REG_P (*src1)
1302        || (STACK_REG_P (*src2)
1303            && get_hard_regnum (regstack, *src2) == FIRST_STACK_REG))
1304       && swap_rtx_condition (insn))
1305     {
1306       rtx temp;
1307       temp = XEXP (pat_src, 0);
1308       XEXP (pat_src, 0) = XEXP (pat_src, 1);
1309       XEXP (pat_src, 1) = temp;
1310
1311       src1 = get_true_reg (&XEXP (pat_src, 0));
1312       src2 = get_true_reg (&XEXP (pat_src, 1));
1313
1314       INSN_CODE (insn) = -1;
1315     }
1316
1317   /* We will fix any death note later.  */
1318
1319   src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1320
1321   if (STACK_REG_P (*src2))
1322     src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1323   else
1324     src2_note = NULL_RTX;
1325
1326   emit_swap_insn (insn, regstack, *src1);
1327
1328   replace_reg (src1, FIRST_STACK_REG);
1329
1330   if (STACK_REG_P (*src2))
1331     replace_reg (src2, get_hard_regnum (regstack, *src2));
1332
1333   if (src1_note)
1334     {
1335       pop_stack (regstack, REGNO (XEXP (src1_note, 0)));
1336       replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1337     }
1338
1339   /* If the second operand dies, handle that.  But if the operands are
1340      the same stack register, don't bother, because only one death is
1341      needed, and it was just handled.  */
1342
1343   if (src2_note
1344       && ! (STACK_REG_P (*src1) && STACK_REG_P (*src2)
1345             && REGNO (*src1) == REGNO (*src2)))
1346     {
1347       /* As a special case, two regs may die in this insn if src2 is
1348          next to top of stack and the top of stack also dies.  Since
1349          we have already popped src1, "next to top of stack" is really
1350          at top (FIRST_STACK_REG) now.  */
1351
1352       if (get_hard_regnum (regstack, XEXP (src2_note, 0)) == FIRST_STACK_REG
1353           && src1_note)
1354         {
1355           pop_stack (regstack, REGNO (XEXP (src2_note, 0)));
1356           replace_reg (&XEXP (src2_note, 0), FIRST_STACK_REG + 1);
1357         }
1358       else
1359         {
1360           /* The 386 can only represent death of the first operand in
1361              the case handled above.  In all other cases, emit a separate
1362              pop and remove the death note from here.  */
1363
1364           /* link_cc0_insns (insn); */
1365
1366           remove_regno_note (insn, REG_DEAD, REGNO (XEXP (src2_note, 0)));
1367
1368           emit_pop_insn (insn, regstack, XEXP (src2_note, 0),
1369                          EMIT_AFTER);
1370         }
1371     }
1372 }
1373 \f
1374 /* Substitute new registers in PAT, which is part of INSN.  REGSTACK
1375    is the current register layout.  */
1376
1377 static void
1378 subst_stack_regs_pat (insn, regstack, pat)
1379      rtx insn;
1380      stack regstack;
1381      rtx pat;
1382 {
1383   rtx *dest, *src;
1384
1385   switch (GET_CODE (pat))
1386     {
1387     case USE:
1388       /* Deaths in USE insns can happen in non optimizing compilation.
1389          Handle them by popping the dying register.  */
1390       src = get_true_reg (&XEXP (pat, 0));
1391       if (STACK_REG_P (*src) 
1392           && find_regno_note (insn, REG_DEAD, REGNO (*src)))
1393         {
1394            emit_pop_insn (insn, regstack, *src, EMIT_AFTER);
1395            return;
1396         }
1397       /* ??? Uninitialized USE should not happen.  */
1398       else if (get_hard_regnum (regstack, *src) == -1)
1399         abort();
1400       break;
1401
1402     case CLOBBER:
1403       {
1404         rtx note;
1405
1406         dest = get_true_reg (&XEXP (pat, 0));
1407         if (STACK_REG_P (*dest))
1408           {
1409             note = find_reg_note (insn, REG_DEAD, *dest);
1410
1411             if (pat != PATTERN (insn))
1412               {
1413                 /* The fix_truncdi_1 pattern wants to be able to allocate
1414                    it's own scratch register.  It does this by clobbering
1415                    an fp reg so that it is assured of an empty reg-stack
1416                    register.  If the register is live, kill it now. 
1417                    Remove the DEAD/UNUSED note so we don't try to kill it
1418                    later too.  */
1419
1420                 if (note)
1421                   emit_pop_insn (insn, regstack, *dest, EMIT_BEFORE);
1422                 else
1423                   {
1424                     note = find_reg_note (insn, REG_UNUSED, *dest);
1425                     if (!note)
1426                       abort ();
1427                   }
1428                 remove_note (insn, note);
1429                 replace_reg (dest, LAST_STACK_REG);
1430               }
1431             else
1432               {
1433                 /* A top-level clobber with no REG_DEAD, and no hard-regnum
1434                    indicates an uninitialized value.  Because reload removed
1435                    all other clobbers, this must be due to a function 
1436                    returning without a value.  Load up a NaN.  */
1437
1438                 if (! note
1439                     && get_hard_regnum (regstack, *dest) == -1)
1440                   {
1441                     pat = gen_rtx_SET (VOIDmode,
1442                                        FP_MODE_REG (REGNO (*dest), SFmode),
1443                                        nan);
1444                     PATTERN (insn) = pat;
1445                     move_for_stack_reg (insn, regstack, pat);
1446                   }
1447               }
1448           }
1449         break;
1450       }
1451
1452     case SET:
1453       {
1454         rtx *src1 = (rtx *) NULL_PTR, *src2;
1455         rtx src1_note, src2_note;
1456         rtx pat_src;
1457
1458         dest = get_true_reg (&SET_DEST (pat));
1459         src  = get_true_reg (&SET_SRC (pat));
1460         pat_src = SET_SRC (pat);
1461
1462         /* See if this is a `movM' pattern, and handle elsewhere if so.  */
1463         if (STACK_REG_P (*src)
1464             || (STACK_REG_P (*dest)
1465                 && (GET_CODE (*src) == REG || GET_CODE (*src) == MEM
1466                     || GET_CODE (*src) == CONST_DOUBLE)))
1467           {
1468             move_for_stack_reg (insn, regstack, pat);
1469             break;
1470           }
1471
1472         switch (GET_CODE (pat_src))
1473           {
1474           case COMPARE:
1475             compare_for_stack_reg (insn, regstack, pat_src);
1476             break;
1477
1478           case CALL:
1479             {
1480               int count;
1481               for (count = HARD_REGNO_NREGS (REGNO (*dest), GET_MODE (*dest));
1482                    --count >= 0;)
1483                 {
1484                   regstack->reg[++regstack->top] = REGNO (*dest) + count;
1485                   SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest) + count);
1486                 }
1487             }
1488             replace_reg (dest, FIRST_STACK_REG);
1489             break;
1490
1491           case REG:
1492             /* This is a `tstM2' case.  */
1493             if (*dest != cc0_rtx)
1494               abort ();
1495             src1 = src;
1496
1497             /* Fall through.  */
1498
1499           case FLOAT_TRUNCATE:
1500           case SQRT:
1501           case ABS:
1502           case NEG:
1503             /* These insns only operate on the top of the stack. DEST might
1504                be cc0_rtx if we're processing a tstM pattern. Also, it's
1505                possible that the tstM case results in a REG_DEAD note on the
1506                source.  */
1507
1508             if (src1 == 0)
1509               src1 = get_true_reg (&XEXP (pat_src, 0));
1510
1511             emit_swap_insn (insn, regstack, *src1);
1512
1513             src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1514
1515             if (STACK_REG_P (*dest))
1516               replace_reg (dest, FIRST_STACK_REG);
1517
1518             if (src1_note)
1519               {
1520                 replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1521                 regstack->top--;
1522                 CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (*src1));
1523               }
1524
1525             replace_reg (src1, FIRST_STACK_REG);
1526             break;
1527
1528           case MINUS:
1529           case DIV:
1530             /* On i386, reversed forms of subM3 and divM3 exist for
1531                MODE_FLOAT, so the same code that works for addM3 and mulM3
1532                can be used.  */
1533           case MULT:
1534           case PLUS:
1535             /* These insns can accept the top of stack as a destination
1536                from a stack reg or mem, or can use the top of stack as a
1537                source and some other stack register (possibly top of stack)
1538                as a destination.  */
1539
1540             src1 = get_true_reg (&XEXP (pat_src, 0));
1541             src2 = get_true_reg (&XEXP (pat_src, 1));
1542
1543             /* We will fix any death note later.  */
1544
1545             if (STACK_REG_P (*src1))
1546               src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1547             else
1548               src1_note = NULL_RTX;
1549             if (STACK_REG_P (*src2))
1550               src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1551             else
1552               src2_note = NULL_RTX;
1553
1554             /* If either operand is not a stack register, then the dest
1555                must be top of stack.  */
1556
1557             if (! STACK_REG_P (*src1) || ! STACK_REG_P (*src2))
1558               emit_swap_insn (insn, regstack, *dest);
1559             else
1560               {
1561                 /* Both operands are REG.  If neither operand is already
1562                    at the top of stack, choose to make the one that is the dest
1563                    the new top of stack.  */
1564
1565                 int src1_hard_regnum, src2_hard_regnum;
1566
1567                 src1_hard_regnum = get_hard_regnum (regstack, *src1);
1568                 src2_hard_regnum = get_hard_regnum (regstack, *src2);
1569                 if (src1_hard_regnum == -1 || src2_hard_regnum == -1)
1570                   abort ();
1571
1572                 if (src1_hard_regnum != FIRST_STACK_REG
1573                     && src2_hard_regnum != FIRST_STACK_REG)
1574                   emit_swap_insn (insn, regstack, *dest);
1575               }
1576
1577             if (STACK_REG_P (*src1))
1578               replace_reg (src1, get_hard_regnum (regstack, *src1));
1579             if (STACK_REG_P (*src2))
1580               replace_reg (src2, get_hard_regnum (regstack, *src2));
1581
1582             if (src1_note)
1583               {
1584                 rtx src1_reg = XEXP (src1_note, 0);
1585
1586                 /* If the register that dies is at the top of stack, then
1587                    the destination is somewhere else - merely substitute it.
1588                    But if the reg that dies is not at top of stack, then
1589                    move the top of stack to the dead reg, as though we had
1590                    done the insn and then a store-with-pop.  */
1591
1592                 if (REGNO (src1_reg) == regstack->reg[regstack->top])
1593                   {
1594                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1595                     replace_reg (dest, get_hard_regnum (regstack, *dest));
1596                   }
1597                 else
1598                   {
1599                     int regno = get_hard_regnum (regstack, src1_reg);
1600
1601                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1602                     replace_reg (dest, regno);
1603
1604                     regstack->reg[regstack->top - (regno - FIRST_STACK_REG)]
1605                       = regstack->reg[regstack->top];
1606                   }
1607
1608                 CLEAR_HARD_REG_BIT (regstack->reg_set,
1609                                     REGNO (XEXP (src1_note, 0)));
1610                 replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1611                 regstack->top--;
1612               }
1613             else if (src2_note)
1614               {
1615                 rtx src2_reg = XEXP (src2_note, 0);
1616                 if (REGNO (src2_reg) == regstack->reg[regstack->top])
1617                   {
1618                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1619                     replace_reg (dest, get_hard_regnum (regstack, *dest));
1620                   }
1621                 else
1622                   {
1623                     int regno = get_hard_regnum (regstack, src2_reg);
1624
1625                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1626                     replace_reg (dest, regno);
1627
1628                     regstack->reg[regstack->top - (regno - FIRST_STACK_REG)]
1629                       = regstack->reg[regstack->top];
1630                   }
1631
1632                 CLEAR_HARD_REG_BIT (regstack->reg_set,
1633                                     REGNO (XEXP (src2_note, 0)));
1634                 replace_reg (&XEXP (src2_note, 0), FIRST_STACK_REG);
1635                 regstack->top--;
1636               }
1637             else
1638               {
1639                 SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1640                 replace_reg (dest, get_hard_regnum (regstack, *dest));
1641               }
1642
1643             /* Keep operand 1 maching with destination.  */
1644             if (GET_RTX_CLASS (GET_CODE (pat_src)) == 'c'
1645                 && REG_P (*src1) && REG_P (*src2)
1646                 && REGNO (*src1) != REGNO (*dest))
1647              {
1648                 int tmp = REGNO (*src1);
1649                 replace_reg (src1, REGNO (*src2));
1650                 replace_reg (src2, tmp);
1651              }
1652             break;
1653
1654           case UNSPEC:
1655             switch (XINT (pat_src, 1))
1656               {
1657               case 1: /* sin */
1658               case 2: /* cos */
1659                 /* These insns only operate on the top of the stack.  */
1660
1661                 src1 = get_true_reg (&XVECEXP (pat_src, 0, 0));
1662
1663                 emit_swap_insn (insn, regstack, *src1);
1664
1665                 src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1666
1667                 if (STACK_REG_P (*dest))
1668                   replace_reg (dest, FIRST_STACK_REG);
1669
1670                 if (src1_note)
1671                   {
1672                     replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1673                     regstack->top--;
1674                     CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (*src1));
1675                   }
1676
1677                 replace_reg (src1, FIRST_STACK_REG);
1678                 break;
1679
1680               case 10:
1681                 /* (unspec [(unspec [(compare ..)] 9)] 10)
1682                    Unspec 9 is fnstsw; unspec 10 is sahf.  The combination
1683                    matches the PPRO fcomi instruction.  */
1684
1685                 pat_src = XVECEXP (pat_src, 0, 0);
1686                 if (GET_CODE (pat_src) != UNSPEC
1687                     || XINT (pat_src, 1) != 9)
1688                   abort ();
1689                 /* FALLTHRU */
1690
1691               case 9:
1692                 /* (unspec [(compare ..)] 9) */
1693                 /* Combined fcomp+fnstsw generated for doing well with
1694                    CSE.  When optimizing this would have been broken
1695                    up before now.  */
1696
1697                 pat_src = XVECEXP (pat_src, 0, 0);
1698                 if (GET_CODE (pat_src) != COMPARE)
1699                   abort ();
1700
1701                 compare_for_stack_reg (insn, regstack, pat_src);
1702                 break;
1703
1704               default:
1705                 abort ();
1706               }
1707             break;
1708
1709           case IF_THEN_ELSE:
1710             /* This insn requires the top of stack to be the destination. */
1711
1712             /* If the comparison operator is an FP comparison operator,
1713                it is handled correctly by compare_for_stack_reg () who
1714                will move the destination to the top of stack. But if the
1715                comparison operator is not an FP comparison operator, we
1716                have to handle it here. */
1717             if (get_hard_regnum (regstack, *dest) >= FIRST_STACK_REG
1718                 && REGNO (*dest) != regstack->reg[regstack->top])
1719               emit_swap_insn (insn, regstack, *dest);   
1720
1721             src1 = get_true_reg (&XEXP (pat_src, 1));
1722             src2 = get_true_reg (&XEXP (pat_src, 2));
1723
1724             src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1725             src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1726
1727             {
1728               rtx src_note [3];
1729               int i;
1730
1731               src_note[0] = 0;
1732               src_note[1] = src1_note;
1733               src_note[2] = src2_note;
1734
1735               if (STACK_REG_P (*src1))
1736                 replace_reg (src1, get_hard_regnum (regstack, *src1));
1737               if (STACK_REG_P (*src2))
1738                 replace_reg (src2, get_hard_regnum (regstack, *src2));
1739
1740               for (i = 1; i <= 2; i++)
1741                 if (src_note [i])
1742                   {
1743                     int regno = REGNO (XEXP (src_note[i], 0));
1744
1745                     /* If the register that dies is not at the top of
1746                        stack, then move the top of stack to the dead reg */
1747                     if (regno != regstack->reg[regstack->top])
1748                       {
1749                         remove_regno_note (insn, REG_DEAD, regno);
1750                         emit_pop_insn (insn, regstack, XEXP (src_note[i], 0),
1751                                        EMIT_AFTER);
1752                       }
1753                     else
1754                       {
1755                         CLEAR_HARD_REG_BIT (regstack->reg_set, regno);
1756                         replace_reg (&XEXP (src_note[i], 0), FIRST_STACK_REG);
1757                         regstack->top--;
1758                       }
1759                   }
1760             }
1761
1762             /* Make dest the top of stack.  Add dest to regstack if
1763                not present. */
1764             if (get_hard_regnum (regstack, *dest) < FIRST_STACK_REG)
1765               regstack->reg[++regstack->top] = REGNO (*dest);   
1766             SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1767             replace_reg (dest, FIRST_STACK_REG);
1768             break;
1769
1770           default:
1771             abort ();
1772           }
1773         break;
1774       }
1775
1776     default:
1777       break;
1778     }
1779 }
1780 \f
1781 /* Substitute hard regnums for any stack regs in INSN, which has
1782    N_INPUTS inputs and N_OUTPUTS outputs.  REGSTACK is the stack info
1783    before the insn, and is updated with changes made here.
1784
1785    There are several requirements and assumptions about the use of
1786    stack-like regs in asm statements.  These rules are enforced by
1787    record_asm_stack_regs; see comments there for details.  Any
1788    asm_operands left in the RTL at this point may be assume to meet the
1789    requirements, since record_asm_stack_regs removes any problem asm.  */
1790
1791 static void
1792 subst_asm_stack_regs (insn, regstack)
1793      rtx insn;
1794      stack regstack;
1795 {
1796   rtx body = PATTERN (insn);
1797   int alt;
1798
1799   rtx *note_reg;                /* Array of note contents */
1800   rtx **note_loc;               /* Address of REG field of each note */
1801   enum reg_note *note_kind;     /* The type of each note */
1802
1803   rtx *clobber_reg = 0;
1804   rtx **clobber_loc = 0;
1805
1806   struct stack_def temp_stack;
1807   int n_notes;
1808   int n_clobbers;
1809   rtx note;
1810   int i;
1811   int n_inputs, n_outputs;
1812
1813   if (! check_asm_stack_operands (insn))
1814     return;
1815
1816   /* Find out what the constraints required.  If no constraint
1817      alternative matches, that is a compiler bug: we should have caught
1818      such an insn in check_asm_stack_operands.  */
1819   extract_insn (insn);
1820   constrain_operands (1);
1821   alt = which_alternative;
1822
1823   preprocess_constraints ();
1824
1825   n_inputs = get_asm_operand_n_inputs (body);
1826   n_outputs = recog_data.n_operands - n_inputs;
1827   
1828   if (alt < 0)
1829     abort ();
1830
1831   /* Strip SUBREGs here to make the following code simpler.  */
1832   for (i = 0; i < recog_data.n_operands; i++)
1833     if (GET_CODE (recog_data.operand[i]) == SUBREG
1834         && GET_CODE (SUBREG_REG (recog_data.operand[i])) == REG)
1835       {
1836         recog_data.operand_loc[i] = & SUBREG_REG (recog_data.operand[i]);
1837         recog_data.operand[i] = SUBREG_REG (recog_data.operand[i]);
1838       }
1839
1840   /* Set up NOTE_REG, NOTE_LOC and NOTE_KIND.  */
1841
1842   for (i = 0, note = REG_NOTES (insn); note; note = XEXP (note, 1))
1843     i++;
1844
1845   note_reg = (rtx *) alloca (i * sizeof (rtx));
1846   note_loc = (rtx **) alloca (i * sizeof (rtx *));
1847   note_kind = (enum reg_note *) alloca (i * sizeof (enum reg_note));
1848
1849   n_notes = 0;
1850   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1851     {
1852       rtx reg = XEXP (note, 0);
1853       rtx *loc = & XEXP (note, 0);
1854
1855       if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
1856         {
1857           loc = & SUBREG_REG (reg);
1858           reg = SUBREG_REG (reg);
1859         }
1860
1861       if (STACK_REG_P (reg)
1862           && (REG_NOTE_KIND (note) == REG_DEAD
1863               || REG_NOTE_KIND (note) == REG_UNUSED))
1864         {
1865           note_reg[n_notes] = reg;
1866           note_loc[n_notes] = loc;
1867           note_kind[n_notes] = REG_NOTE_KIND (note);
1868           n_notes++;
1869         }
1870     }
1871
1872   /* Set up CLOBBER_REG and CLOBBER_LOC.  */
1873
1874   n_clobbers = 0;
1875
1876   if (GET_CODE (body) == PARALLEL)
1877     {
1878       clobber_reg = (rtx *) alloca (XVECLEN (body, 0) * sizeof (rtx));
1879       clobber_loc = (rtx **) alloca (XVECLEN (body, 0) * sizeof (rtx *));
1880
1881       for (i = 0; i < XVECLEN (body, 0); i++)
1882         if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1883           {
1884             rtx clobber = XVECEXP (body, 0, i);
1885             rtx reg = XEXP (clobber, 0);
1886             rtx *loc = & XEXP (clobber, 0);
1887
1888             if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
1889               {
1890                 loc = & SUBREG_REG (reg);
1891                 reg = SUBREG_REG (reg);
1892               }
1893
1894             if (STACK_REG_P (reg))
1895               {
1896                 clobber_reg[n_clobbers] = reg;
1897                 clobber_loc[n_clobbers] = loc;
1898                 n_clobbers++;
1899               }
1900           }
1901     }
1902
1903   temp_stack = *regstack;
1904
1905   /* Put the input regs into the desired place in TEMP_STACK.  */
1906
1907   for (i = n_outputs; i < n_outputs + n_inputs; i++)
1908     if (STACK_REG_P (recog_data.operand[i])
1909         && reg_class_subset_p (recog_op_alt[i][alt].class,
1910                                FLOAT_REGS)
1911         && recog_op_alt[i][alt].class != FLOAT_REGS)
1912       {
1913         /* If an operand needs to be in a particular reg in
1914            FLOAT_REGS, the constraint was either 't' or 'u'.  Since
1915            these constraints are for single register classes, and
1916            reload guaranteed that operand[i] is already in that class,
1917            we can just use REGNO (recog_data.operand[i]) to know which
1918            actual reg this operand needs to be in.  */
1919
1920         int regno = get_hard_regnum (&temp_stack, recog_data.operand[i]);
1921
1922         if (regno < 0)
1923           abort ();
1924
1925         if (regno != REGNO (recog_data.operand[i]))
1926           {
1927             /* recog_data.operand[i] is not in the right place.  Find
1928                it and swap it with whatever is already in I's place.
1929                K is where recog_data.operand[i] is now.  J is where it
1930                should be.  */
1931             int j, k, temp;
1932
1933             k = temp_stack.top - (regno - FIRST_STACK_REG);
1934             j = (temp_stack.top
1935                  - (REGNO (recog_data.operand[i]) - FIRST_STACK_REG));
1936
1937             temp = temp_stack.reg[k];
1938             temp_stack.reg[k] = temp_stack.reg[j];
1939             temp_stack.reg[j] = temp;
1940           }
1941       }
1942
1943   /* Emit insns before INSN to make sure the reg-stack is in the right
1944      order.  */
1945
1946   change_stack (insn, regstack, &temp_stack, EMIT_BEFORE);
1947
1948   /* Make the needed input register substitutions.  Do death notes and
1949      clobbers too, because these are for inputs, not outputs.  */
1950
1951   for (i = n_outputs; i < n_outputs + n_inputs; i++)
1952     if (STACK_REG_P (recog_data.operand[i]))
1953       {
1954         int regnum = get_hard_regnum (regstack, recog_data.operand[i]);
1955
1956         if (regnum < 0)
1957           abort ();
1958
1959         replace_reg (recog_data.operand_loc[i], regnum);
1960       }
1961
1962   for (i = 0; i < n_notes; i++)
1963     if (note_kind[i] == REG_DEAD)
1964       {
1965         int regnum = get_hard_regnum (regstack, note_reg[i]);
1966
1967         if (regnum < 0)
1968           abort ();
1969
1970         replace_reg (note_loc[i], regnum);
1971       }
1972
1973   for (i = 0; i < n_clobbers; i++)
1974     {
1975       /* It's OK for a CLOBBER to reference a reg that is not live.
1976          Don't try to replace it in that case.  */
1977       int regnum = get_hard_regnum (regstack, clobber_reg[i]);
1978
1979       if (regnum >= 0)
1980         {
1981           /* Sigh - clobbers always have QImode.  But replace_reg knows
1982              that these regs can't be MODE_INT and will abort.  Just put
1983              the right reg there without calling replace_reg.  */
1984
1985           *clobber_loc[i] = FP_MODE_REG (regnum, DFmode);
1986         }
1987     }
1988
1989   /* Now remove from REGSTACK any inputs that the asm implicitly popped.  */
1990
1991   for (i = n_outputs; i < n_outputs + n_inputs; i++)
1992     if (STACK_REG_P (recog_data.operand[i]))
1993       {
1994         /* An input reg is implicitly popped if it is tied to an
1995            output, or if there is a CLOBBER for it.  */
1996         int j;
1997
1998         for (j = 0; j < n_clobbers; j++)
1999           if (operands_match_p (clobber_reg[j], recog_data.operand[i]))
2000             break;
2001
2002         if (j < n_clobbers || recog_op_alt[i][alt].matches >= 0)
2003           {
2004             /* recog_data.operand[i] might not be at the top of stack.
2005                But that's OK, because all we need to do is pop the
2006                right number of regs off of the top of the reg-stack.
2007                record_asm_stack_regs guaranteed that all implicitly
2008                popped regs were grouped at the top of the reg-stack.  */
2009
2010             CLEAR_HARD_REG_BIT (regstack->reg_set,
2011                                 regstack->reg[regstack->top]);
2012             regstack->top--;
2013           }
2014       }
2015
2016   /* Now add to REGSTACK any outputs that the asm implicitly pushed.
2017      Note that there isn't any need to substitute register numbers.
2018      ???  Explain why this is true.  */
2019
2020   for (i = LAST_STACK_REG; i >= FIRST_STACK_REG; i--)
2021     {
2022       /* See if there is an output for this hard reg.  */
2023       int j;
2024
2025       for (j = 0; j < n_outputs; j++)
2026         if (STACK_REG_P (recog_data.operand[j])
2027             && REGNO (recog_data.operand[j]) == i)
2028           {
2029             regstack->reg[++regstack->top] = i;
2030             SET_HARD_REG_BIT (regstack->reg_set, i);
2031             break;
2032           }
2033     }
2034
2035   /* Now emit a pop insn for any REG_UNUSED output, or any REG_DEAD
2036      input that the asm didn't implicitly pop.  If the asm didn't
2037      implicitly pop an input reg, that reg will still be live.
2038
2039      Note that we can't use find_regno_note here: the register numbers
2040      in the death notes have already been substituted.  */
2041
2042   for (i = 0; i < n_outputs; i++)
2043     if (STACK_REG_P (recog_data.operand[i]))
2044       {
2045         int j;
2046
2047         for (j = 0; j < n_notes; j++)
2048           if (REGNO (recog_data.operand[i]) == REGNO (note_reg[j])
2049               && note_kind[j] == REG_UNUSED)
2050             {
2051               insn = emit_pop_insn (insn, regstack, recog_data.operand[i],
2052                                     EMIT_AFTER);
2053               break;
2054             }
2055       }
2056
2057   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2058     if (STACK_REG_P (recog_data.operand[i]))
2059       {
2060         int j;
2061
2062         for (j = 0; j < n_notes; j++)
2063           if (REGNO (recog_data.operand[i]) == REGNO (note_reg[j])
2064               && note_kind[j] == REG_DEAD
2065               && TEST_HARD_REG_BIT (regstack->reg_set,
2066                                     REGNO (recog_data.operand[i])))
2067             {
2068               insn = emit_pop_insn (insn, regstack, recog_data.operand[i],
2069                                     EMIT_AFTER);
2070               break;
2071             }
2072       }
2073 }
2074 \f
2075 /* Substitute stack hard reg numbers for stack virtual registers in
2076    INSN.  Non-stack register numbers are not changed.  REGSTACK is the
2077    current stack content.  Insns may be emitted as needed to arrange the
2078    stack for the 387 based on the contents of the insn.  */
2079
2080 static void
2081 subst_stack_regs (insn, regstack)
2082      rtx insn;
2083      stack regstack;
2084 {
2085   register rtx *note_link, note;
2086   register int i;
2087
2088   if (GET_CODE (insn) == CALL_INSN)
2089     {
2090       int top = regstack->top;
2091
2092       /* If there are any floating point parameters to be passed in
2093          registers for this call, make sure they are in the right
2094          order.  */
2095
2096       if (top >= 0)
2097         {
2098           straighten_stack (PREV_INSN (insn), regstack);
2099
2100           /* Now mark the arguments as dead after the call.  */
2101
2102           while (regstack->top >= 0)
2103             {
2104               CLEAR_HARD_REG_BIT (regstack->reg_set, FIRST_STACK_REG + regstack->top);
2105               regstack->top--;
2106             }
2107         }
2108     }
2109
2110   /* Do the actual substitution if any stack regs are mentioned.
2111      Since we only record whether entire insn mentions stack regs, and
2112      subst_stack_regs_pat only works for patterns that contain stack regs,
2113      we must check each pattern in a parallel here.  A call_value_pop could
2114      fail otherwise.  */
2115
2116   if (stack_regs_mentioned (insn))
2117     {
2118       int n_operands = asm_noperands (PATTERN (insn));
2119       if (n_operands >= 0)
2120         {
2121           /* This insn is an `asm' with operands.  Decode the operands,
2122              decide how many are inputs, and do register substitution.
2123              Any REG_UNUSED notes will be handled by subst_asm_stack_regs.  */
2124
2125           subst_asm_stack_regs (insn, regstack);
2126           return;
2127         }
2128
2129       if (GET_CODE (PATTERN (insn)) == PARALLEL)
2130         for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
2131           {
2132             if (stack_regs_mentioned_p (XVECEXP (PATTERN (insn), 0, i)))
2133               subst_stack_regs_pat (insn, regstack,
2134                                     XVECEXP (PATTERN (insn), 0, i));
2135           }
2136       else
2137         subst_stack_regs_pat (insn, regstack, PATTERN (insn));
2138     }
2139
2140   /* subst_stack_regs_pat may have deleted a no-op insn.  If so, any
2141      REG_UNUSED will already have been dealt with, so just return.  */
2142
2143   if (GET_CODE (insn) == NOTE)
2144     return;
2145
2146   /* If there is a REG_UNUSED note on a stack register on this insn,
2147      the indicated reg must be popped.  The REG_UNUSED note is removed,
2148      since the form of the newly emitted pop insn references the reg,
2149      making it no longer `unset'.  */
2150
2151   note_link = &REG_NOTES(insn);
2152   for (note = *note_link; note; note = XEXP (note, 1))
2153     if (REG_NOTE_KIND (note) == REG_UNUSED && STACK_REG_P (XEXP (note, 0)))
2154       {
2155         *note_link = XEXP (note, 1);
2156         insn = emit_pop_insn (insn, regstack, XEXP (note, 0), EMIT_AFTER);
2157       }
2158     else
2159       note_link = &XEXP (note, 1);
2160 }
2161 \f
2162 /* Change the organization of the stack so that it fits a new basic
2163    block.  Some registers might have to be popped, but there can never be
2164    a register live in the new block that is not now live.
2165
2166    Insert any needed insns before or after INSN, as indicated by
2167    WHERE.  OLD is the original stack layout, and NEW is the desired
2168    form.  OLD is updated to reflect the code emitted, ie, it will be
2169    the same as NEW upon return.
2170
2171    This function will not preserve block_end[].  But that information
2172    is no longer needed once this has executed.  */
2173
2174 static void
2175 change_stack (insn, old, new, where)
2176      rtx insn;
2177      stack old;
2178      stack new;
2179      enum emit_where where;
2180 {
2181   int reg;
2182   int update_end = 0;
2183
2184   /* We will be inserting new insns "backwards".  If we are to insert
2185      after INSN, find the next insn, and insert before it.  */
2186
2187   if (where == EMIT_AFTER)
2188     {
2189       if (current_block && current_block->end == insn)
2190         update_end = 1;
2191       insn = NEXT_INSN (insn);
2192     }
2193
2194   /* Pop any registers that are not needed in the new block.  */
2195
2196   for (reg = old->top; reg >= 0; reg--)
2197     if (! TEST_HARD_REG_BIT (new->reg_set, old->reg[reg]))
2198       emit_pop_insn (insn, old, FP_MODE_REG (old->reg[reg], DFmode),
2199                      EMIT_BEFORE);
2200
2201   if (new->top == -2)
2202     {
2203       /* If the new block has never been processed, then it can inherit
2204          the old stack order.  */
2205
2206       new->top = old->top;
2207       memcpy (new->reg, old->reg, sizeof (new->reg));
2208     }
2209   else
2210     {
2211       /* This block has been entered before, and we must match the
2212          previously selected stack order.  */
2213
2214       /* By now, the only difference should be the order of the stack,
2215          not their depth or liveliness.  */
2216
2217       GO_IF_HARD_REG_EQUAL (old->reg_set, new->reg_set, win);
2218       abort ();
2219     win:
2220       if (old->top != new->top)
2221         abort ();
2222
2223       /* If the stack is not empty (new->top != -1), loop here emitting
2224          swaps until the stack is correct. 
2225
2226          The worst case number of swaps emitted is N + 2, where N is the
2227          depth of the stack.  In some cases, the reg at the top of
2228          stack may be correct, but swapped anyway in order to fix
2229          other regs.  But since we never swap any other reg away from
2230          its correct slot, this algorithm will converge.  */
2231
2232       if (new->top != -1)
2233         do
2234           {
2235             /* Swap the reg at top of stack into the position it is
2236                supposed to be in, until the correct top of stack appears.  */
2237
2238             while (old->reg[old->top] != new->reg[new->top])
2239               {
2240                 for (reg = new->top; reg >= 0; reg--)
2241                   if (new->reg[reg] == old->reg[old->top])
2242                     break;
2243
2244                 if (reg == -1)
2245                   abort ();
2246
2247                 emit_swap_insn (insn, old,
2248                                 FP_MODE_REG (old->reg[reg], DFmode));
2249               }
2250
2251             /* See if any regs remain incorrect.  If so, bring an
2252              incorrect reg to the top of stack, and let the while loop
2253              above fix it.  */
2254
2255             for (reg = new->top; reg >= 0; reg--)
2256               if (new->reg[reg] != old->reg[reg])
2257                 {
2258                   emit_swap_insn (insn, old,
2259                                   FP_MODE_REG (old->reg[reg], DFmode));
2260                   break;
2261                 }
2262           } while (reg >= 0);
2263
2264       /* At this point there must be no differences.  */
2265
2266       for (reg = old->top; reg >= 0; reg--)
2267         if (old->reg[reg] != new->reg[reg])
2268           abort ();
2269     }
2270
2271   if (update_end)
2272     current_block->end = PREV_INSN (insn);
2273 }
2274 \f
2275 /* Print stack configuration.  */
2276
2277 static void
2278 print_stack (file, s)
2279      FILE *file;
2280      stack s;
2281 {
2282   if (! file)
2283     return;
2284
2285   if (s->top == -2)
2286     fprintf (file, "uninitialized\n");
2287   else if (s->top == -1)
2288     fprintf (file, "empty\n");
2289   else
2290     {
2291       int i;
2292       fputs ("[ ", file);
2293       for (i = 0; i <= s->top; ++i)
2294         fprintf (file, "%d ", s->reg[i]);
2295       fputs ("]\n", file);
2296     }
2297 }
2298 \f
2299 /* This function was doing life analysis.  We now let the regular live
2300    code do it's job, so we only need to check some extra invariants 
2301    that reg-stack expects.  Primary among these being that all registers
2302    are initialized before use.
2303
2304    The function returns true when code was emitted to CFG edges and
2305    commit_edge_insertions needs to be called.  */
2306
2307 static int
2308 convert_regs_entry ()
2309 {
2310   int inserted = 0, i;
2311   edge e;
2312
2313   for (i = n_basic_blocks - 1; i >= 0; --i)
2314     {
2315       basic_block block = BASIC_BLOCK (i);
2316       block_info bi = BLOCK_INFO (block);
2317       int reg;
2318       
2319       /* Set current register status at last instruction `uninitialized'.  */
2320       bi->stack_in.top = -2;
2321   
2322       /* Copy live_at_end and live_at_start into temporaries.  */
2323       for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; reg++)
2324         {
2325           if (REGNO_REG_SET_P (block->global_live_at_end, reg))
2326             SET_HARD_REG_BIT (bi->out_reg_set, reg);
2327           if (REGNO_REG_SET_P (block->global_live_at_start, reg))
2328             SET_HARD_REG_BIT (bi->stack_in.reg_set, reg);
2329         }
2330     }
2331
2332   /* Load something into each stack register live at function entry. 
2333      Such live registers can be caused by uninitialized variables or
2334      functions not returning values on all paths.  In order to keep 
2335      the push/pop code happy, and to not scrog the register stack, we
2336      must put something in these registers.  Use a QNaN.  
2337
2338      Note that we are insertting converted code here.  This code is
2339      never seen by the convert_regs pass.  */
2340
2341   for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2342     {
2343       basic_block block = e->dest;
2344       block_info bi = BLOCK_INFO (block);
2345       int reg, top = -1;
2346
2347       for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
2348         if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
2349           {
2350             rtx init;
2351
2352             bi->stack_in.reg[++top] = reg;
2353
2354             init = gen_rtx_SET (VOIDmode,
2355                                 FP_MODE_REG (FIRST_STACK_REG, SFmode),
2356                                 nan);
2357             insert_insn_on_edge (init, e);
2358             inserted = 1;
2359           }
2360
2361       bi->stack_in.top = top;
2362     }
2363
2364   return inserted;
2365 }
2366
2367 /* Construct the desired stack for function exit.  This will either
2368    be `empty', or the function return value at top-of-stack.  */
2369
2370 static void
2371 convert_regs_exit ()
2372 {
2373   int value_reg_low, value_reg_high;
2374   stack output_stack;
2375   rtx retvalue;
2376
2377   retvalue = stack_result (current_function_decl);
2378   value_reg_low = value_reg_high = -1;
2379   if (retvalue)
2380     {
2381       value_reg_low = REGNO (retvalue);
2382       value_reg_high = value_reg_low
2383         + HARD_REGNO_NREGS (value_reg_low, GET_MODE (retvalue)) - 1;
2384     }
2385
2386   output_stack = &BLOCK_INFO (EXIT_BLOCK_PTR)->stack_in;
2387   if (value_reg_low == -1)
2388     output_stack->top = -1;
2389   else
2390     {
2391       int reg;
2392
2393       output_stack->top = value_reg_high - value_reg_low;
2394       for (reg = value_reg_low; reg <= value_reg_high; ++reg)
2395         {
2396           output_stack->reg[reg - value_reg_low] = reg;
2397           SET_HARD_REG_BIT (output_stack->reg_set, reg);
2398         }
2399     }
2400 }
2401
2402 /* Convert stack register references in one block.  */
2403
2404 static int
2405 convert_regs_1 (file, block)
2406      FILE *file;
2407      basic_block block;
2408 {
2409   struct stack_def regstack, tmpstack;
2410   block_info bi = BLOCK_INFO (block);
2411   int inserted, reg;
2412   rtx insn, next;
2413   edge e;
2414
2415   current_block = block;
2416   
2417   if (file)
2418     {
2419       fprintf (file, "\nBasic block %d\nInput stack: ", block->index);
2420       print_stack (file, &bi->stack_in);
2421     }
2422
2423   /* Process all insns in this block.  Keep track of NEXT so that we
2424      don't process insns emitted while substituting in INSN.  */
2425   next = block->head;
2426   regstack = bi->stack_in;
2427   do
2428     {
2429       insn = next;
2430       next = NEXT_INSN (insn);
2431
2432       /* Ensure we have not missed a block boundary.  */
2433       if (next == NULL)
2434         abort ();
2435       if (insn == block->end)
2436         next = NULL;
2437
2438       /* Don't bother processing unless there is a stack reg
2439          mentioned or if it's a CALL_INSN.  */
2440       if (stack_regs_mentioned (insn)
2441           || GET_CODE (insn) == CALL_INSN)
2442         {
2443           if (file)
2444             {
2445               fprintf (file, "  insn %d input stack: ",
2446                        INSN_UID (insn));
2447               print_stack (file, &regstack);
2448             }
2449           subst_stack_regs (insn, &regstack);
2450         }
2451     }
2452   while (next);
2453
2454   if (file)
2455     {
2456       fprintf (file, "Expected live registers [");
2457       for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; ++reg)
2458         if (TEST_HARD_REG_BIT (bi->out_reg_set, reg))
2459           fprintf (file, " %d", reg);
2460       fprintf (file, " ]\nOutput stack: ");
2461       print_stack (file, &regstack);
2462     }
2463
2464   insn = block->end;
2465   if (GET_CODE (insn) == JUMP_INSN)
2466     insn = PREV_INSN (insn);
2467
2468   /* If the function is declared to return a value, but it returns one
2469      in only some cases, some registers might come live here.  Emit
2470      necessary moves for them.  */
2471
2472   for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; ++reg)
2473     {
2474       if (TEST_HARD_REG_BIT (bi->out_reg_set, reg)
2475           && ! TEST_HARD_REG_BIT (regstack.reg_set, reg))
2476         {
2477           rtx set;
2478
2479           if (file)
2480             {
2481               fprintf (file, "Emitting insn initializing reg %d\n",
2482                        reg);
2483             }
2484
2485           set = gen_rtx_SET (VOIDmode, FP_MODE_REG (reg, SFmode),
2486                              nan);
2487           insn = emit_block_insn_after (set, insn, block);
2488           subst_stack_regs (insn, &regstack);
2489         }
2490     }
2491
2492   /* Something failed if the stack lives don't match.  */
2493   GO_IF_HARD_REG_EQUAL (regstack.reg_set, bi->out_reg_set, win);
2494   abort ();
2495  win:
2496
2497   /* Adjust the stack of this block on exit to match the stack of the
2498      target block, or copy stack info into the stack of the successor
2499      of the successor hasn't been processed yet.  */
2500   inserted = 0;
2501   for (e = block->succ; e ; e = e->succ_next)
2502     {
2503       basic_block target = e->dest;
2504       stack target_stack = &BLOCK_INFO (target)->stack_in;
2505
2506       if (file)
2507         fprintf (file, "Edge to block %d: ", target->index);
2508
2509       if (target_stack->top == -2)
2510         {
2511           /* The target block hasn't had a stack order selected.
2512              We need merely ensure that no pops are needed.  */
2513           for (reg = regstack.top; reg >= 0; --reg)
2514             if (! TEST_HARD_REG_BIT (target_stack->reg_set,
2515                                      regstack.reg[reg]))
2516               break;
2517
2518           if (reg == -1)
2519             {
2520               if (file)
2521                 fprintf (file, "new block; copying stack position\n");
2522
2523               /* change_stack kills values in regstack.  */
2524               tmpstack = regstack;
2525
2526               change_stack (block->end, &tmpstack,
2527                             target_stack, EMIT_AFTER);
2528               continue;
2529             }
2530
2531           if (file)
2532             fprintf (file, "new block; pops needed\n");
2533         }
2534       else
2535         {
2536           if (target_stack->top == regstack.top)
2537             {
2538               for (reg = target_stack->top; reg >= 0; --reg)
2539                 if (target_stack->reg[reg] != regstack.reg[reg])
2540                   break;
2541
2542               if (reg == -1)
2543                 {
2544                   if (file)
2545                     fprintf (file, "no changes needed\n");
2546                   continue;
2547                 }
2548             }
2549
2550           if (file)
2551             {
2552               fprintf (file, "correcting stack to ");
2553               print_stack (file, target_stack);
2554             }
2555         }
2556
2557       /* Care for EH edges specially.  The normal return path may return
2558          a value in st(0), but the EH path will not, and there's no need
2559          to add popping code to the edge.  */
2560       if (e->flags & (EDGE_EH | EDGE_ABNORMAL_CALL))
2561         {
2562           /* Assert that the lifetimes are as we expect -- one value
2563              live at st(0) on the end of the source block, and no
2564              values live at the beginning of the destination block.  */
2565           HARD_REG_SET tmp;
2566
2567           CLEAR_HARD_REG_SET (tmp);
2568           GO_IF_HARD_REG_EQUAL (target_stack->reg_set, tmp, eh1);
2569           abort();
2570         eh1:
2571
2572           SET_HARD_REG_BIT (tmp, FIRST_STACK_REG);
2573           GO_IF_HARD_REG_EQUAL (regstack.reg_set, tmp, eh2);
2574           abort();
2575         eh2:
2576
2577           target_stack->top = -1;
2578         }
2579
2580       /* It is better to output directly to the end of the block
2581          instead of to the edge, because emit_swap can do minimal
2582          insn scheduling.  We can do this when there is only one
2583          edge out, and it is not abnormal.  */
2584       else if (block->succ->succ_next == NULL
2585                && ! (e->flags & EDGE_ABNORMAL))
2586         {
2587           /* change_stack kills values in regstack.  */
2588           tmpstack = regstack;
2589
2590           change_stack (block->end, &tmpstack, target_stack,
2591                         (GET_CODE (block->end) == JUMP_INSN
2592                          ? EMIT_BEFORE : EMIT_AFTER));
2593         }
2594       else
2595         {
2596           rtx seq, after;
2597
2598           /* We don't support abnormal edges.  Global takes care to
2599              avoid any live register across them, so we should never
2600              have to insert instructions on such edges.  */
2601           if (e->flags & EDGE_ABNORMAL)
2602             abort ();
2603
2604           current_block = NULL;
2605           start_sequence ();
2606                   
2607           /* ??? change_stack needs some point to emit insns after. 
2608              Also needed to keep gen_sequence from returning a 
2609              pattern as opposed to a sequence, which would lose
2610              REG_DEAD notes.  */
2611           after = emit_note (NULL, NOTE_INSN_DELETED);
2612
2613           tmpstack = regstack;
2614           change_stack (after, &tmpstack, target_stack, EMIT_BEFORE);
2615
2616           seq = gen_sequence ();
2617           end_sequence ();
2618
2619           insert_insn_on_edge (seq, e);
2620           inserted = 1;
2621           current_block = block;
2622         }
2623     }
2624
2625   return inserted;
2626 }
2627
2628 /* Convert registers in all blocks reachable from BLOCK.  */
2629
2630 static int
2631 convert_regs_2 (file, block)
2632      FILE *file;
2633      basic_block block;
2634 {
2635   basic_block *stack, *sp;
2636   int inserted;
2637
2638   stack = (basic_block *) xmalloc (sizeof (*stack) * n_basic_blocks);
2639   sp = stack;
2640
2641   *sp++ = block;
2642   BLOCK_INFO (block)->done = 1;
2643
2644   inserted = 0;
2645   do
2646     {
2647       edge e;
2648
2649       block = *--sp;
2650       inserted |= convert_regs_1 (file, block);
2651
2652       for (e = block->succ; e ; e = e->succ_next)
2653         if (! BLOCK_INFO (e->dest)->done)
2654           {
2655             *sp++ = e->dest;
2656             BLOCK_INFO (e->dest)->done = 1;
2657           }
2658     }
2659   while (sp != stack);
2660
2661   return inserted;
2662 }
2663
2664 /* Traverse all basic blocks in a function, converting the register
2665    references in each insn from the "flat" register file that gcc uses,
2666    to the stack-like registers the 387 uses.  */
2667
2668 static int
2669 convert_regs (file)
2670      FILE *file;
2671 {
2672   int inserted, i;
2673   edge e;
2674
2675   /* Initialize uninitialized registers on function entry.  */
2676   inserted = convert_regs_entry ();
2677
2678   /* Construct the desired stack for function exit.  */
2679   convert_regs_exit ();
2680   BLOCK_INFO (EXIT_BLOCK_PTR)->done = 1;
2681
2682   /* ??? Future: process inner loops first, and give them arbitrary
2683      initial stacks which emit_swap_insn can modify.  This ought to
2684      prevent double fxch that aften appears at the head of a loop.  */
2685
2686   /* Process all blocks reachable from all entry points.  */
2687   for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2688     inserted |= convert_regs_2 (file, e->dest);
2689   
2690   /* ??? Process all unreachable blocks.  Though there's no excuse 
2691      for keeping these even when not optimizing.  */
2692   for (i = 0; i < n_basic_blocks; ++i)
2693     {
2694       basic_block b = BASIC_BLOCK (i);
2695       block_info bi = BLOCK_INFO (b);
2696
2697       if (! bi->done)
2698         {
2699           int reg;
2700
2701           /* Create an arbitrary input stack.  */
2702           bi->stack_in.top = -1;
2703           for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
2704             if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
2705               bi->stack_in.reg[++bi->stack_in.top] = reg;
2706
2707           inserted |= convert_regs_2 (file, b);
2708         }
2709     }
2710
2711   if (inserted)
2712     commit_edge_insertions ();
2713
2714   if (file)
2715     fputc ('\n', file);
2716
2717   return inserted;
2718 }
2719 #endif /* STACK_REGS */