OSDN Git Service

* reg-stack.c (next_flags_user): Use current_block->end
[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 (DECL_RESULT (decl));
789   /* ?!?  What is this code supposed to do?  Can this code actually
790      trigger if we kick out aggregates above?  */
791   if (result != 0
792       && ! (GET_CODE (result) == REG
793             && REGNO (result) < FIRST_PSEUDO_REGISTER))
794     {
795 #ifdef FUNCTION_OUTGOING_VALUE
796       result
797         = FUNCTION_OUTGOING_VALUE (TREE_TYPE (DECL_RESULT (decl)), decl);
798 #else
799       result = FUNCTION_VALUE (TREE_TYPE (DECL_RESULT (decl)), decl);
800 #endif
801     }
802
803   return result != 0 && STACK_REG_P (result) ? result : 0;
804 }
805 \f
806
807 /*
808  * This section deals with stack register substitution, and forms the second
809  * pass over the RTL.
810  */
811
812 /* Replace REG, which is a pointer to a stack reg RTX, with an RTX for
813    the desired hard REGNO.  */
814
815 static void
816 replace_reg (reg, regno)
817      rtx *reg;
818      int regno;
819 {
820   if (regno < FIRST_STACK_REG || regno > LAST_STACK_REG
821       || ! STACK_REG_P (*reg))
822     abort ();
823
824   switch (GET_MODE_CLASS (GET_MODE (*reg)))
825     {
826     default: abort ();
827     case MODE_FLOAT:
828     case MODE_COMPLEX_FLOAT:;
829     }
830
831   *reg = FP_MODE_REG (regno, GET_MODE (*reg));
832 }
833
834 /* Remove a note of type NOTE, which must be found, for register
835    number REGNO from INSN.  Remove only one such note.  */
836
837 static void
838 remove_regno_note (insn, note, regno)
839      rtx insn;
840      enum reg_note note;
841      unsigned int regno;
842 {
843   register rtx *note_link, this;
844
845   note_link = &REG_NOTES(insn);
846   for (this = *note_link; this; this = XEXP (this, 1))
847     if (REG_NOTE_KIND (this) == note
848         && REG_P (XEXP (this, 0)) && REGNO (XEXP (this, 0)) == regno)
849       {
850         *note_link = XEXP (this, 1);
851         return;
852       }
853     else
854       note_link = &XEXP (this, 1);
855
856   abort ();
857 }
858
859 /* Find the hard register number of virtual register REG in REGSTACK.
860    The hard register number is relative to the top of the stack.  -1 is
861    returned if the register is not found.  */
862
863 static int
864 get_hard_regnum (regstack, reg)
865      stack regstack;
866      rtx reg;
867 {
868   int i;
869
870   if (! STACK_REG_P (reg))
871     abort ();
872
873   for (i = regstack->top; i >= 0; i--)
874     if (regstack->reg[i] == REGNO (reg))
875       break;
876
877   return i >= 0 ? (FIRST_STACK_REG + regstack->top - i) : -1;
878 }
879
880 /* Delete INSN from the RTL.  Mark the insn, but don't remove it from
881    the chain of insns.  Doing so could confuse block_begin and block_end
882    if this were the only insn in the block.  */
883
884 static void
885 delete_insn_for_stacker (insn)
886      rtx insn;
887 {
888   PUT_CODE (insn, NOTE);
889   NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
890   NOTE_SOURCE_FILE (insn) = 0;
891 }
892 \f
893 /* Emit an insn to pop virtual register REG before or after INSN.
894    REGSTACK is the stack state after INSN and is updated to reflect this
895    pop.  WHEN is either emit_insn_before or emit_insn_after.  A pop insn
896    is represented as a SET whose destination is the register to be popped
897    and source is the top of stack.  A death note for the top of stack
898    cases the movdf pattern to pop.  */
899
900 static rtx
901 emit_pop_insn (insn, regstack, reg, where)
902      rtx insn;
903      stack regstack;
904      rtx reg;
905      enum emit_where where;
906 {
907   rtx pop_insn, pop_rtx;
908   int hard_regno;
909
910   hard_regno = get_hard_regnum (regstack, reg);
911
912   if (hard_regno < FIRST_STACK_REG)
913     abort ();
914
915   pop_rtx = gen_rtx_SET (VOIDmode, FP_MODE_REG (hard_regno, DFmode),
916                          FP_MODE_REG (FIRST_STACK_REG, DFmode));
917
918   if (where == EMIT_AFTER)
919     pop_insn = emit_block_insn_after (pop_rtx, insn, current_block);
920   else
921     pop_insn = emit_block_insn_before (pop_rtx, insn, current_block);
922
923   REG_NOTES (pop_insn)
924     = gen_rtx_EXPR_LIST (REG_DEAD, FP_MODE_REG (FIRST_STACK_REG, DFmode),
925                          REG_NOTES (pop_insn));
926
927   regstack->reg[regstack->top - (hard_regno - FIRST_STACK_REG)]
928     = regstack->reg[regstack->top];
929   regstack->top -= 1;
930   CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (reg));
931
932   return pop_insn;
933 }
934 \f
935 /* Emit an insn before or after INSN to swap virtual register REG with
936    the top of stack.  REGSTACK is the stack state before the swap, and
937    is updated to reflect the swap.  A swap insn is represented as a
938    PARALLEL of two patterns: each pattern moves one reg to the other.
939
940    If REG is already at the top of the stack, no insn is emitted.  */
941
942 static void
943 emit_swap_insn (insn, regstack, reg)
944      rtx insn;
945      stack regstack;
946      rtx reg;
947 {
948   int hard_regno;
949   rtx swap_rtx;
950   int tmp, other_reg;           /* swap regno temps */
951   rtx i1;                       /* the stack-reg insn prior to INSN */
952   rtx i1set = NULL_RTX;         /* the SET rtx within I1 */
953
954   hard_regno = get_hard_regnum (regstack, reg);
955
956   if (hard_regno < FIRST_STACK_REG)
957     abort ();
958   if (hard_regno == FIRST_STACK_REG)
959     return;
960
961   other_reg = regstack->top - (hard_regno - FIRST_STACK_REG);
962
963   tmp = regstack->reg[other_reg];
964   regstack->reg[other_reg] = regstack->reg[regstack->top];
965   regstack->reg[regstack->top] = tmp;
966
967   /* Find the previous insn involving stack regs, but don't pass a
968      block boundary.  */
969   i1 = NULL;
970   if (current_block && insn != current_block->head)
971     {
972       rtx tmp = PREV_INSN (insn);
973       rtx limit = PREV_INSN (current_block->head);
974       while (tmp != limit)
975         {
976           if (GET_CODE (tmp) == CODE_LABEL
977               || NOTE_INSN_BASIC_BLOCK_P (tmp)
978               || (GET_CODE (tmp) == INSN
979                   && stack_regs_mentioned (tmp)))
980             {
981               i1 = tmp;
982               break;
983             }
984           tmp = PREV_INSN (tmp);
985         }
986     }
987
988   if (i1 != NULL_RTX
989       && (i1set = single_set (i1)) != NULL_RTX)
990     {
991       rtx i1src = *get_true_reg (&SET_SRC (i1set));
992       rtx i1dest = *get_true_reg (&SET_DEST (i1set));
993
994       /* If the previous register stack push was from the reg we are to
995          swap with, omit the swap.  */
996
997       if (GET_CODE (i1dest) == REG && REGNO (i1dest) == FIRST_STACK_REG
998           && GET_CODE (i1src) == REG && REGNO (i1src) == hard_regno - 1
999           && find_regno_note (i1, REG_DEAD, FIRST_STACK_REG) == NULL_RTX)
1000         return;
1001
1002       /* If the previous insn wrote to the reg we are to swap with,
1003          omit the swap.  */
1004
1005       if (GET_CODE (i1dest) == REG && REGNO (i1dest) == hard_regno
1006           && GET_CODE (i1src) == REG && REGNO (i1src) == FIRST_STACK_REG
1007           && find_regno_note (i1, REG_DEAD, FIRST_STACK_REG) == NULL_RTX)
1008         return;
1009     }
1010
1011   swap_rtx = gen_swapxf (FP_MODE_REG (hard_regno, XFmode),
1012                          FP_MODE_REG (FIRST_STACK_REG, XFmode));
1013
1014   if (i1)
1015     emit_block_insn_after (swap_rtx, i1, current_block);
1016   else if (current_block)
1017     emit_block_insn_before (swap_rtx, current_block->head, current_block);
1018   else
1019     emit_insn_before (swap_rtx, insn);
1020 }
1021 \f
1022 /* Handle a move to or from a stack register in PAT, which is in INSN.
1023    REGSTACK is the current stack.  */
1024
1025 static void
1026 move_for_stack_reg (insn, regstack, pat)
1027      rtx insn;
1028      stack regstack;
1029      rtx pat;
1030 {
1031   rtx *psrc =  get_true_reg (&SET_SRC (pat));
1032   rtx *pdest = get_true_reg (&SET_DEST (pat));
1033   rtx src, dest;
1034   rtx note;
1035
1036   src = *psrc; dest = *pdest;
1037
1038   if (STACK_REG_P (src) && STACK_REG_P (dest))
1039     {
1040       /* Write from one stack reg to another.  If SRC dies here, then
1041          just change the register mapping and delete the insn.  */
1042
1043       note = find_regno_note (insn, REG_DEAD, REGNO (src));
1044       if (note)
1045         {
1046           int i;
1047
1048           /* If this is a no-op move, there must not be a REG_DEAD note.  */
1049           if (REGNO (src) == REGNO (dest))
1050             abort ();
1051
1052           for (i = regstack->top; i >= 0; i--)
1053             if (regstack->reg[i] == REGNO (src))
1054               break;
1055
1056           /* The source must be live, and the dest must be dead.  */
1057           if (i < 0 || get_hard_regnum (regstack, dest) >= FIRST_STACK_REG)
1058             abort ();
1059
1060           /* It is possible that the dest is unused after this insn.
1061              If so, just pop the src.  */
1062
1063           if (find_regno_note (insn, REG_UNUSED, REGNO (dest)))
1064             {
1065               emit_pop_insn (insn, regstack, src, EMIT_AFTER);
1066
1067               delete_insn_for_stacker (insn);
1068               return;
1069             }
1070
1071           regstack->reg[i] = REGNO (dest);
1072
1073           SET_HARD_REG_BIT (regstack->reg_set, REGNO (dest));
1074           CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (src));
1075
1076           delete_insn_for_stacker (insn);
1077
1078           return;
1079         }
1080
1081       /* The source reg does not die.  */
1082
1083       /* If this appears to be a no-op move, delete it, or else it
1084          will confuse the machine description output patterns. But if
1085          it is REG_UNUSED, we must pop the reg now, as per-insn processing
1086          for REG_UNUSED will not work for deleted insns.  */
1087
1088       if (REGNO (src) == REGNO (dest))
1089         {
1090           if (find_regno_note (insn, REG_UNUSED, REGNO (dest)))
1091             emit_pop_insn (insn, regstack, dest, EMIT_AFTER);
1092
1093           delete_insn_for_stacker (insn);
1094           return;
1095         }
1096
1097       /* The destination ought to be dead */
1098       if (get_hard_regnum (regstack, dest) >= FIRST_STACK_REG)
1099         abort ();
1100
1101       replace_reg (psrc, get_hard_regnum (regstack, src));
1102
1103       regstack->reg[++regstack->top] = REGNO (dest);
1104       SET_HARD_REG_BIT (regstack->reg_set, REGNO (dest));
1105       replace_reg (pdest, FIRST_STACK_REG);
1106     }
1107   else if (STACK_REG_P (src))
1108     {
1109       /* Save from a stack reg to MEM, or possibly integer reg.  Since
1110          only top of stack may be saved, emit an exchange first if
1111          needs be.  */
1112
1113       emit_swap_insn (insn, regstack, src);
1114
1115       note = find_regno_note (insn, REG_DEAD, REGNO (src));
1116       if (note)
1117         {
1118           replace_reg (&XEXP (note, 0), FIRST_STACK_REG);
1119           regstack->top--;
1120           CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (src));
1121         }
1122       else if (GET_MODE (src) == XFmode && regstack->top < REG_STACK_SIZE - 1)
1123         {
1124           /* A 387 cannot write an XFmode value to a MEM without
1125              clobbering the source reg.  The output code can handle
1126              this by reading back the value from the MEM.
1127              But it is more efficient to use a temp register if one is
1128              available.  Push the source value here if the register
1129              stack is not full, and then write the value to memory via
1130              a pop.  */
1131           rtx push_rtx, push_insn;
1132           rtx top_stack_reg = FP_MODE_REG (FIRST_STACK_REG, XFmode);
1133
1134           push_rtx = gen_movxf (top_stack_reg, top_stack_reg);
1135           push_insn = emit_insn_before (push_rtx, insn);
1136           REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD, top_stack_reg,
1137                                                 REG_NOTES (insn));
1138         }
1139
1140       replace_reg (psrc, FIRST_STACK_REG);
1141     }
1142   else if (STACK_REG_P (dest))
1143     {
1144       /* Load from MEM, or possibly integer REG or constant, into the
1145          stack regs.  The actual target is always the top of the
1146          stack. The stack mapping is changed to reflect that DEST is
1147          now at top of stack.  */
1148
1149       /* The destination ought to be dead */
1150       if (get_hard_regnum (regstack, dest) >= FIRST_STACK_REG)
1151         abort ();
1152
1153       if (regstack->top >= REG_STACK_SIZE)
1154         abort ();
1155
1156       regstack->reg[++regstack->top] = REGNO (dest);
1157       SET_HARD_REG_BIT (regstack->reg_set, REGNO (dest));
1158       replace_reg (pdest, FIRST_STACK_REG);
1159     }
1160   else
1161     abort ();
1162 }
1163 \f
1164 /* Swap the condition on a branch, if there is one.  Return true if we
1165    found a condition to swap.  False if the condition was not used as
1166    such. */
1167
1168 static int
1169 swap_rtx_condition_1 (pat)
1170      rtx pat;
1171 {
1172   register const char *fmt;
1173   register int i, r = 0;
1174
1175   if (GET_RTX_CLASS (GET_CODE (pat)) == '<')
1176     {
1177       PUT_CODE (pat, swap_condition (GET_CODE (pat)));
1178       r = 1;
1179     }
1180   else
1181     {
1182       fmt = GET_RTX_FORMAT (GET_CODE (pat));
1183       for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0; i--)
1184         {
1185           if (fmt[i] == 'E')
1186             {
1187               register int j;
1188
1189               for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
1190                 r |= swap_rtx_condition_1 (XVECEXP (pat, i, j));
1191             }
1192           else if (fmt[i] == 'e')
1193             r |= swap_rtx_condition_1 (XEXP (pat, i));
1194         }
1195     }
1196
1197   return r;
1198 }
1199
1200 static int
1201 swap_rtx_condition (insn)
1202      rtx insn;
1203 {
1204   rtx pat = PATTERN (insn);
1205
1206   /* We're looking for a single set to cc0 or an HImode temporary.  */
1207
1208   if (GET_CODE (pat) == SET
1209       && GET_CODE (SET_DEST (pat)) == REG
1210       && REGNO (SET_DEST (pat)) == FLAGS_REG)
1211     {
1212       insn = next_flags_user (insn);
1213       if (insn == NULL_RTX)
1214         return 0;
1215       pat = PATTERN (insn);
1216     }
1217
1218   /* See if this is, or ends in, a fnstsw, aka unspec 9.  If so, we're
1219      not doing anything with the cc value right now.  We may be able to
1220      search for one though.  */
1221
1222   if (GET_CODE (pat) == SET
1223       && GET_CODE (SET_SRC (pat)) == UNSPEC
1224       && XINT (SET_SRC (pat), 1) == 9)
1225     {
1226       rtx dest = SET_DEST (pat);
1227
1228       /* Search forward looking for the first use of this value. 
1229          Stop at block boundaries.  */
1230       while (insn != current_block->end)
1231         {
1232           insn = NEXT_INSN (insn);
1233           if (INSN_P (insn) && reg_mentioned_p (dest, insn))
1234             break;
1235           if (GET_CODE (insn) == CALL_INSN)
1236             return 0;
1237         }
1238
1239       /* So we've found the insn using this value.  If it is anything
1240          other than sahf, aka unspec 10, or the value does not die
1241          (meaning we'd have to search further), then we must give up.  */
1242       pat = PATTERN (insn);
1243       if (GET_CODE (pat) != SET
1244           || GET_CODE (SET_SRC (pat)) != UNSPEC
1245           || XINT (SET_SRC (pat), 1) != 10
1246           || ! dead_or_set_p (insn, dest))
1247         return 0;
1248
1249       /* Now we are prepared to handle this as a normal cc0 setter.  */
1250       insn = next_flags_user (insn);
1251       if (insn == NULL_RTX)
1252         return 0;
1253       pat = PATTERN (insn);
1254     }
1255
1256   if (swap_rtx_condition_1 (pat))
1257     {
1258       int fail = 0;
1259       INSN_CODE (insn) = -1;
1260       if (recog_memoized (insn) == -1)
1261         fail = 1;
1262       /* In case the flags don't die here, recurse to try fix
1263          following user too.  */
1264       else if (! dead_or_set_p (insn, ix86_flags_rtx))
1265         {
1266           insn = next_flags_user (insn);
1267           if (!insn || !swap_rtx_condition (insn))
1268             fail = 1;
1269         }
1270       if (fail)
1271         {
1272           swap_rtx_condition_1 (pat);
1273           return 0;
1274         }
1275       return 1;
1276     }
1277   return 0;
1278 }
1279
1280 /* Handle a comparison.  Special care needs to be taken to avoid
1281    causing comparisons that a 387 cannot do correctly, such as EQ.
1282
1283    Also, a pop insn may need to be emitted.  The 387 does have an
1284    `fcompp' insn that can pop two regs, but it is sometimes too expensive
1285    to do this - a `fcomp' followed by a `fstpl %st(0)' may be easier to
1286    set up.  */
1287
1288 static void
1289 compare_for_stack_reg (insn, regstack, pat_src)
1290      rtx insn;
1291      stack regstack;
1292      rtx pat_src;
1293 {
1294   rtx *src1, *src2;
1295   rtx src1_note, src2_note;
1296   rtx flags_user;
1297
1298   src1 = get_true_reg (&XEXP (pat_src, 0));
1299   src2 = get_true_reg (&XEXP (pat_src, 1));
1300   flags_user = next_flags_user (insn);
1301
1302   /* ??? If fxch turns out to be cheaper than fstp, give priority to
1303      registers that die in this insn - move those to stack top first.  */
1304   if ((! STACK_REG_P (*src1)
1305        || (STACK_REG_P (*src2)
1306            && get_hard_regnum (regstack, *src2) == FIRST_STACK_REG))
1307       && swap_rtx_condition (insn))
1308     {
1309       rtx temp;
1310       temp = XEXP (pat_src, 0);
1311       XEXP (pat_src, 0) = XEXP (pat_src, 1);
1312       XEXP (pat_src, 1) = temp;
1313
1314       src1 = get_true_reg (&XEXP (pat_src, 0));
1315       src2 = get_true_reg (&XEXP (pat_src, 1));
1316
1317       INSN_CODE (insn) = -1;
1318     }
1319
1320   /* We will fix any death note later.  */
1321
1322   src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1323
1324   if (STACK_REG_P (*src2))
1325     src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1326   else
1327     src2_note = NULL_RTX;
1328
1329   emit_swap_insn (insn, regstack, *src1);
1330
1331   replace_reg (src1, FIRST_STACK_REG);
1332
1333   if (STACK_REG_P (*src2))
1334     replace_reg (src2, get_hard_regnum (regstack, *src2));
1335
1336   if (src1_note)
1337     {
1338       pop_stack (regstack, REGNO (XEXP (src1_note, 0)));
1339       replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1340     }
1341
1342   /* If the second operand dies, handle that.  But if the operands are
1343      the same stack register, don't bother, because only one death is
1344      needed, and it was just handled.  */
1345
1346   if (src2_note
1347       && ! (STACK_REG_P (*src1) && STACK_REG_P (*src2)
1348             && REGNO (*src1) == REGNO (*src2)))
1349     {
1350       /* As a special case, two regs may die in this insn if src2 is
1351          next to top of stack and the top of stack also dies.  Since
1352          we have already popped src1, "next to top of stack" is really
1353          at top (FIRST_STACK_REG) now.  */
1354
1355       if (get_hard_regnum (regstack, XEXP (src2_note, 0)) == FIRST_STACK_REG
1356           && src1_note)
1357         {
1358           pop_stack (regstack, REGNO (XEXP (src2_note, 0)));
1359           replace_reg (&XEXP (src2_note, 0), FIRST_STACK_REG + 1);
1360         }
1361       else
1362         {
1363           /* The 386 can only represent death of the first operand in
1364              the case handled above.  In all other cases, emit a separate
1365              pop and remove the death note from here.  */
1366
1367           /* link_cc0_insns (insn); */
1368
1369           remove_regno_note (insn, REG_DEAD, REGNO (XEXP (src2_note, 0)));
1370
1371           emit_pop_insn (insn, regstack, XEXP (src2_note, 0),
1372                          EMIT_AFTER);
1373         }
1374     }
1375 }
1376 \f
1377 /* Substitute new registers in PAT, which is part of INSN.  REGSTACK
1378    is the current register layout.  */
1379
1380 static void
1381 subst_stack_regs_pat (insn, regstack, pat)
1382      rtx insn;
1383      stack regstack;
1384      rtx pat;
1385 {
1386   rtx *dest, *src;
1387
1388   switch (GET_CODE (pat))
1389     {
1390     case USE:
1391       /* Deaths in USE insns can happen in non optimizing compilation.
1392          Handle them by popping the dying register.  */
1393       src = get_true_reg (&XEXP (pat, 0));
1394       if (STACK_REG_P (*src) 
1395           && find_regno_note (insn, REG_DEAD, REGNO (*src)))
1396         {
1397            emit_pop_insn (insn, regstack, *src, EMIT_AFTER);
1398            return;
1399         }
1400       /* ??? Uninitialized USE should not happen.  */
1401       else if (get_hard_regnum (regstack, *src) == -1)
1402         abort();
1403       break;
1404
1405     case CLOBBER:
1406       {
1407         rtx note;
1408
1409         dest = get_true_reg (&XEXP (pat, 0));
1410         if (STACK_REG_P (*dest))
1411           {
1412             note = find_reg_note (insn, REG_DEAD, *dest);
1413
1414             if (pat != PATTERN (insn))
1415               {
1416                 /* The fix_truncdi_1 pattern wants to be able to allocate
1417                    it's own scratch register.  It does this by clobbering
1418                    an fp reg so that it is assured of an empty reg-stack
1419                    register.  If the register is live, kill it now. 
1420                    Remove the DEAD/UNUSED note so we don't try to kill it
1421                    later too.  */
1422
1423                 if (note)
1424                   emit_pop_insn (insn, regstack, *dest, EMIT_BEFORE);
1425                 else
1426                   {
1427                     note = find_reg_note (insn, REG_UNUSED, *dest);
1428                     if (!note)
1429                       abort ();
1430                   }
1431                 remove_note (insn, note);
1432                 replace_reg (dest, LAST_STACK_REG);
1433               }
1434             else
1435               {
1436                 /* A top-level clobber with no REG_DEAD, and no hard-regnum
1437                    indicates an uninitialized value.  Because reload removed
1438                    all other clobbers, this must be due to a function 
1439                    returning without a value.  Load up a NaN.  */
1440
1441                 if (! note
1442                     && get_hard_regnum (regstack, *dest) == -1)
1443                   {
1444                     pat = gen_rtx_SET (VOIDmode,
1445                                        FP_MODE_REG (REGNO (*dest), SFmode),
1446                                        nan);
1447                     PATTERN (insn) = pat;
1448                     move_for_stack_reg (insn, regstack, pat);
1449                   }
1450               }
1451           }
1452         break;
1453       }
1454
1455     case SET:
1456       {
1457         rtx *src1 = (rtx *) NULL_PTR, *src2;
1458         rtx src1_note, src2_note;
1459         rtx pat_src;
1460
1461         dest = get_true_reg (&SET_DEST (pat));
1462         src  = get_true_reg (&SET_SRC (pat));
1463         pat_src = SET_SRC (pat);
1464
1465         /* See if this is a `movM' pattern, and handle elsewhere if so.  */
1466         if (STACK_REG_P (*src)
1467             || (STACK_REG_P (*dest)
1468                 && (GET_CODE (*src) == REG || GET_CODE (*src) == MEM
1469                     || GET_CODE (*src) == CONST_DOUBLE)))
1470           {
1471             move_for_stack_reg (insn, regstack, pat);
1472             break;
1473           }
1474
1475         switch (GET_CODE (pat_src))
1476           {
1477           case COMPARE:
1478             compare_for_stack_reg (insn, regstack, pat_src);
1479             break;
1480
1481           case CALL:
1482             {
1483               int count;
1484               for (count = HARD_REGNO_NREGS (REGNO (*dest), GET_MODE (*dest));
1485                    --count >= 0;)
1486                 {
1487                   regstack->reg[++regstack->top] = REGNO (*dest) + count;
1488                   SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest) + count);
1489                 }
1490             }
1491             replace_reg (dest, FIRST_STACK_REG);
1492             break;
1493
1494           case REG:
1495             /* This is a `tstM2' case.  */
1496             if (*dest != cc0_rtx)
1497               abort ();
1498             src1 = src;
1499
1500             /* Fall through.  */
1501
1502           case FLOAT_TRUNCATE:
1503           case SQRT:
1504           case ABS:
1505           case NEG:
1506             /* These insns only operate on the top of the stack. DEST might
1507                be cc0_rtx if we're processing a tstM pattern. Also, it's
1508                possible that the tstM case results in a REG_DEAD note on the
1509                source.  */
1510
1511             if (src1 == 0)
1512               src1 = get_true_reg (&XEXP (pat_src, 0));
1513
1514             emit_swap_insn (insn, regstack, *src1);
1515
1516             src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1517
1518             if (STACK_REG_P (*dest))
1519               replace_reg (dest, FIRST_STACK_REG);
1520
1521             if (src1_note)
1522               {
1523                 replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1524                 regstack->top--;
1525                 CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (*src1));
1526               }
1527
1528             replace_reg (src1, FIRST_STACK_REG);
1529             break;
1530
1531           case MINUS:
1532           case DIV:
1533             /* On i386, reversed forms of subM3 and divM3 exist for
1534                MODE_FLOAT, so the same code that works for addM3 and mulM3
1535                can be used.  */
1536           case MULT:
1537           case PLUS:
1538             /* These insns can accept the top of stack as a destination
1539                from a stack reg or mem, or can use the top of stack as a
1540                source and some other stack register (possibly top of stack)
1541                as a destination.  */
1542
1543             src1 = get_true_reg (&XEXP (pat_src, 0));
1544             src2 = get_true_reg (&XEXP (pat_src, 1));
1545
1546             /* We will fix any death note later.  */
1547
1548             if (STACK_REG_P (*src1))
1549               src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1550             else
1551               src1_note = NULL_RTX;
1552             if (STACK_REG_P (*src2))
1553               src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1554             else
1555               src2_note = NULL_RTX;
1556
1557             /* If either operand is not a stack register, then the dest
1558                must be top of stack.  */
1559
1560             if (! STACK_REG_P (*src1) || ! STACK_REG_P (*src2))
1561               emit_swap_insn (insn, regstack, *dest);
1562             else
1563               {
1564                 /* Both operands are REG.  If neither operand is already
1565                    at the top of stack, choose to make the one that is the dest
1566                    the new top of stack.  */
1567
1568                 int src1_hard_regnum, src2_hard_regnum;
1569
1570                 src1_hard_regnum = get_hard_regnum (regstack, *src1);
1571                 src2_hard_regnum = get_hard_regnum (regstack, *src2);
1572                 if (src1_hard_regnum == -1 || src2_hard_regnum == -1)
1573                   abort ();
1574
1575                 if (src1_hard_regnum != FIRST_STACK_REG
1576                     && src2_hard_regnum != FIRST_STACK_REG)
1577                   emit_swap_insn (insn, regstack, *dest);
1578               }
1579
1580             if (STACK_REG_P (*src1))
1581               replace_reg (src1, get_hard_regnum (regstack, *src1));
1582             if (STACK_REG_P (*src2))
1583               replace_reg (src2, get_hard_regnum (regstack, *src2));
1584
1585             if (src1_note)
1586               {
1587                 rtx src1_reg = XEXP (src1_note, 0);
1588
1589                 /* If the register that dies is at the top of stack, then
1590                    the destination is somewhere else - merely substitute it.
1591                    But if the reg that dies is not at top of stack, then
1592                    move the top of stack to the dead reg, as though we had
1593                    done the insn and then a store-with-pop.  */
1594
1595                 if (REGNO (src1_reg) == regstack->reg[regstack->top])
1596                   {
1597                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1598                     replace_reg (dest, get_hard_regnum (regstack, *dest));
1599                   }
1600                 else
1601                   {
1602                     int regno = get_hard_regnum (regstack, src1_reg);
1603
1604                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1605                     replace_reg (dest, regno);
1606
1607                     regstack->reg[regstack->top - (regno - FIRST_STACK_REG)]
1608                       = regstack->reg[regstack->top];
1609                   }
1610
1611                 CLEAR_HARD_REG_BIT (regstack->reg_set,
1612                                     REGNO (XEXP (src1_note, 0)));
1613                 replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1614                 regstack->top--;
1615               }
1616             else if (src2_note)
1617               {
1618                 rtx src2_reg = XEXP (src2_note, 0);
1619                 if (REGNO (src2_reg) == regstack->reg[regstack->top])
1620                   {
1621                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1622                     replace_reg (dest, get_hard_regnum (regstack, *dest));
1623                   }
1624                 else
1625                   {
1626                     int regno = get_hard_regnum (regstack, src2_reg);
1627
1628                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1629                     replace_reg (dest, regno);
1630
1631                     regstack->reg[regstack->top - (regno - FIRST_STACK_REG)]
1632                       = regstack->reg[regstack->top];
1633                   }
1634
1635                 CLEAR_HARD_REG_BIT (regstack->reg_set,
1636                                     REGNO (XEXP (src2_note, 0)));
1637                 replace_reg (&XEXP (src2_note, 0), FIRST_STACK_REG);
1638                 regstack->top--;
1639               }
1640             else
1641               {
1642                 SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1643                 replace_reg (dest, get_hard_regnum (regstack, *dest));
1644               }
1645
1646             /* Keep operand 1 maching with destination.  */
1647             if (GET_RTX_CLASS (GET_CODE (pat_src)) == 'c'
1648                 && REG_P (*src1) && REG_P (*src2)
1649                 && REGNO (*src1) != REGNO (*dest))
1650              {
1651                 int tmp = REGNO (*src1);
1652                 replace_reg (src1, REGNO (*src2));
1653                 replace_reg (src2, tmp);
1654              }
1655             break;
1656
1657           case UNSPEC:
1658             switch (XINT (pat_src, 1))
1659               {
1660               case 1: /* sin */
1661               case 2: /* cos */
1662                 /* These insns only operate on the top of the stack.  */
1663
1664                 src1 = get_true_reg (&XVECEXP (pat_src, 0, 0));
1665
1666                 emit_swap_insn (insn, regstack, *src1);
1667
1668                 src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1669
1670                 if (STACK_REG_P (*dest))
1671                   replace_reg (dest, FIRST_STACK_REG);
1672
1673                 if (src1_note)
1674                   {
1675                     replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1676                     regstack->top--;
1677                     CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (*src1));
1678                   }
1679
1680                 replace_reg (src1, FIRST_STACK_REG);
1681                 break;
1682
1683               case 10:
1684                 /* (unspec [(unspec [(compare ..)] 9)] 10)
1685                    Unspec 9 is fnstsw; unspec 10 is sahf.  The combination
1686                    matches the PPRO fcomi instruction.  */
1687
1688                 pat_src = XVECEXP (pat_src, 0, 0);
1689                 if (GET_CODE (pat_src) != UNSPEC
1690                     || XINT (pat_src, 1) != 9)
1691                   abort ();
1692                 /* FALLTHRU */
1693
1694               case 9:
1695                 /* (unspec [(compare ..)] 9) */
1696                 /* Combined fcomp+fnstsw generated for doing well with
1697                    CSE.  When optimizing this would have been broken
1698                    up before now.  */
1699
1700                 pat_src = XVECEXP (pat_src, 0, 0);
1701                 if (GET_CODE (pat_src) != COMPARE)
1702                   abort ();
1703
1704                 compare_for_stack_reg (insn, regstack, pat_src);
1705                 break;
1706
1707               default:
1708                 abort ();
1709               }
1710             break;
1711
1712           case IF_THEN_ELSE:
1713             /* This insn requires the top of stack to be the destination. */
1714
1715             /* If the comparison operator is an FP comparison operator,
1716                it is handled correctly by compare_for_stack_reg () who
1717                will move the destination to the top of stack. But if the
1718                comparison operator is not an FP comparison operator, we
1719                have to handle it here. */
1720             if (get_hard_regnum (regstack, *dest) >= FIRST_STACK_REG
1721                 && REGNO (*dest) != regstack->reg[regstack->top])
1722               emit_swap_insn (insn, regstack, *dest);   
1723
1724             src1 = get_true_reg (&XEXP (pat_src, 1));
1725             src2 = get_true_reg (&XEXP (pat_src, 2));
1726
1727             src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1728             src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1729
1730             {
1731               rtx src_note [3];
1732               int i;
1733
1734               src_note[0] = 0;
1735               src_note[1] = src1_note;
1736               src_note[2] = src2_note;
1737
1738               if (STACK_REG_P (*src1))
1739                 replace_reg (src1, get_hard_regnum (regstack, *src1));
1740               if (STACK_REG_P (*src2))
1741                 replace_reg (src2, get_hard_regnum (regstack, *src2));
1742
1743               for (i = 1; i <= 2; i++)
1744                 if (src_note [i])
1745                   {
1746                     int regno = REGNO (XEXP (src_note[i], 0));
1747
1748                     /* If the register that dies is not at the top of
1749                        stack, then move the top of stack to the dead reg */
1750                     if (regno != regstack->reg[regstack->top])
1751                       {
1752                         remove_regno_note (insn, REG_DEAD, regno);
1753                         emit_pop_insn (insn, regstack, XEXP (src_note[i], 0),
1754                                        EMIT_AFTER);
1755                       }
1756                     else
1757                       {
1758                         CLEAR_HARD_REG_BIT (regstack->reg_set, regno);
1759                         replace_reg (&XEXP (src_note[i], 0), FIRST_STACK_REG);
1760                         regstack->top--;
1761                       }
1762                   }
1763             }
1764
1765             /* Make dest the top of stack.  Add dest to regstack if
1766                not present. */
1767             if (get_hard_regnum (regstack, *dest) < FIRST_STACK_REG)
1768               regstack->reg[++regstack->top] = REGNO (*dest);   
1769             SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1770             replace_reg (dest, FIRST_STACK_REG);
1771             break;
1772
1773           default:
1774             abort ();
1775           }
1776         break;
1777       }
1778
1779     default:
1780       break;
1781     }
1782 }
1783 \f
1784 /* Substitute hard regnums for any stack regs in INSN, which has
1785    N_INPUTS inputs and N_OUTPUTS outputs.  REGSTACK is the stack info
1786    before the insn, and is updated with changes made here.
1787
1788    There are several requirements and assumptions about the use of
1789    stack-like regs in asm statements.  These rules are enforced by
1790    record_asm_stack_regs; see comments there for details.  Any
1791    asm_operands left in the RTL at this point may be assume to meet the
1792    requirements, since record_asm_stack_regs removes any problem asm.  */
1793
1794 static void
1795 subst_asm_stack_regs (insn, regstack)
1796      rtx insn;
1797      stack regstack;
1798 {
1799   rtx body = PATTERN (insn);
1800   int alt;
1801
1802   rtx *note_reg;                /* Array of note contents */
1803   rtx **note_loc;               /* Address of REG field of each note */
1804   enum reg_note *note_kind;     /* The type of each note */
1805
1806   rtx *clobber_reg = 0;
1807   rtx **clobber_loc = 0;
1808
1809   struct stack_def temp_stack;
1810   int n_notes;
1811   int n_clobbers;
1812   rtx note;
1813   int i;
1814   int n_inputs, n_outputs;
1815
1816   if (! check_asm_stack_operands (insn))
1817     return;
1818
1819   /* Find out what the constraints required.  If no constraint
1820      alternative matches, that is a compiler bug: we should have caught
1821      such an insn in check_asm_stack_operands.  */
1822   extract_insn (insn);
1823   constrain_operands (1);
1824   alt = which_alternative;
1825
1826   preprocess_constraints ();
1827
1828   n_inputs = get_asm_operand_n_inputs (body);
1829   n_outputs = recog_data.n_operands - n_inputs;
1830   
1831   if (alt < 0)
1832     abort ();
1833
1834   /* Strip SUBREGs here to make the following code simpler.  */
1835   for (i = 0; i < recog_data.n_operands; i++)
1836     if (GET_CODE (recog_data.operand[i]) == SUBREG
1837         && GET_CODE (SUBREG_REG (recog_data.operand[i])) == REG)
1838       {
1839         recog_data.operand_loc[i] = & SUBREG_REG (recog_data.operand[i]);
1840         recog_data.operand[i] = SUBREG_REG (recog_data.operand[i]);
1841       }
1842
1843   /* Set up NOTE_REG, NOTE_LOC and NOTE_KIND.  */
1844
1845   for (i = 0, note = REG_NOTES (insn); note; note = XEXP (note, 1))
1846     i++;
1847
1848   note_reg = (rtx *) alloca (i * sizeof (rtx));
1849   note_loc = (rtx **) alloca (i * sizeof (rtx *));
1850   note_kind = (enum reg_note *) alloca (i * sizeof (enum reg_note));
1851
1852   n_notes = 0;
1853   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1854     {
1855       rtx reg = XEXP (note, 0);
1856       rtx *loc = & XEXP (note, 0);
1857
1858       if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
1859         {
1860           loc = & SUBREG_REG (reg);
1861           reg = SUBREG_REG (reg);
1862         }
1863
1864       if (STACK_REG_P (reg)
1865           && (REG_NOTE_KIND (note) == REG_DEAD
1866               || REG_NOTE_KIND (note) == REG_UNUSED))
1867         {
1868           note_reg[n_notes] = reg;
1869           note_loc[n_notes] = loc;
1870           note_kind[n_notes] = REG_NOTE_KIND (note);
1871           n_notes++;
1872         }
1873     }
1874
1875   /* Set up CLOBBER_REG and CLOBBER_LOC.  */
1876
1877   n_clobbers = 0;
1878
1879   if (GET_CODE (body) == PARALLEL)
1880     {
1881       clobber_reg = (rtx *) alloca (XVECLEN (body, 0) * sizeof (rtx));
1882       clobber_loc = (rtx **) alloca (XVECLEN (body, 0) * sizeof (rtx *));
1883
1884       for (i = 0; i < XVECLEN (body, 0); i++)
1885         if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1886           {
1887             rtx clobber = XVECEXP (body, 0, i);
1888             rtx reg = XEXP (clobber, 0);
1889             rtx *loc = & XEXP (clobber, 0);
1890
1891             if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
1892               {
1893                 loc = & SUBREG_REG (reg);
1894                 reg = SUBREG_REG (reg);
1895               }
1896
1897             if (STACK_REG_P (reg))
1898               {
1899                 clobber_reg[n_clobbers] = reg;
1900                 clobber_loc[n_clobbers] = loc;
1901                 n_clobbers++;
1902               }
1903           }
1904     }
1905
1906   temp_stack = *regstack;
1907
1908   /* Put the input regs into the desired place in TEMP_STACK.  */
1909
1910   for (i = n_outputs; i < n_outputs + n_inputs; i++)
1911     if (STACK_REG_P (recog_data.operand[i])
1912         && reg_class_subset_p (recog_op_alt[i][alt].class,
1913                                FLOAT_REGS)
1914         && recog_op_alt[i][alt].class != FLOAT_REGS)
1915       {
1916         /* If an operand needs to be in a particular reg in
1917            FLOAT_REGS, the constraint was either 't' or 'u'.  Since
1918            these constraints are for single register classes, and
1919            reload guaranteed that operand[i] is already in that class,
1920            we can just use REGNO (recog_data.operand[i]) to know which
1921            actual reg this operand needs to be in.  */
1922
1923         int regno = get_hard_regnum (&temp_stack, recog_data.operand[i]);
1924
1925         if (regno < 0)
1926           abort ();
1927
1928         if (regno != REGNO (recog_data.operand[i]))
1929           {
1930             /* recog_data.operand[i] is not in the right place.  Find
1931                it and swap it with whatever is already in I's place.
1932                K is where recog_data.operand[i] is now.  J is where it
1933                should be.  */
1934             int j, k, temp;
1935
1936             k = temp_stack.top - (regno - FIRST_STACK_REG);
1937             j = (temp_stack.top
1938                  - (REGNO (recog_data.operand[i]) - FIRST_STACK_REG));
1939
1940             temp = temp_stack.reg[k];
1941             temp_stack.reg[k] = temp_stack.reg[j];
1942             temp_stack.reg[j] = temp;
1943           }
1944       }
1945
1946   /* Emit insns before INSN to make sure the reg-stack is in the right
1947      order.  */
1948
1949   change_stack (insn, regstack, &temp_stack, EMIT_BEFORE);
1950
1951   /* Make the needed input register substitutions.  Do death notes and
1952      clobbers too, because these are for inputs, not outputs.  */
1953
1954   for (i = n_outputs; i < n_outputs + n_inputs; i++)
1955     if (STACK_REG_P (recog_data.operand[i]))
1956       {
1957         int regnum = get_hard_regnum (regstack, recog_data.operand[i]);
1958
1959         if (regnum < 0)
1960           abort ();
1961
1962         replace_reg (recog_data.operand_loc[i], regnum);
1963       }
1964
1965   for (i = 0; i < n_notes; i++)
1966     if (note_kind[i] == REG_DEAD)
1967       {
1968         int regnum = get_hard_regnum (regstack, note_reg[i]);
1969
1970         if (regnum < 0)
1971           abort ();
1972
1973         replace_reg (note_loc[i], regnum);
1974       }
1975
1976   for (i = 0; i < n_clobbers; i++)
1977     {
1978       /* It's OK for a CLOBBER to reference a reg that is not live.
1979          Don't try to replace it in that case.  */
1980       int regnum = get_hard_regnum (regstack, clobber_reg[i]);
1981
1982       if (regnum >= 0)
1983         {
1984           /* Sigh - clobbers always have QImode.  But replace_reg knows
1985              that these regs can't be MODE_INT and will abort.  Just put
1986              the right reg there without calling replace_reg.  */
1987
1988           *clobber_loc[i] = FP_MODE_REG (regnum, DFmode);
1989         }
1990     }
1991
1992   /* Now remove from REGSTACK any inputs that the asm implicitly popped.  */
1993
1994   for (i = n_outputs; i < n_outputs + n_inputs; i++)
1995     if (STACK_REG_P (recog_data.operand[i]))
1996       {
1997         /* An input reg is implicitly popped if it is tied to an
1998            output, or if there is a CLOBBER for it.  */
1999         int j;
2000
2001         for (j = 0; j < n_clobbers; j++)
2002           if (operands_match_p (clobber_reg[j], recog_data.operand[i]))
2003             break;
2004
2005         if (j < n_clobbers || recog_op_alt[i][alt].matches >= 0)
2006           {
2007             /* recog_data.operand[i] might not be at the top of stack.
2008                But that's OK, because all we need to do is pop the
2009                right number of regs off of the top of the reg-stack.
2010                record_asm_stack_regs guaranteed that all implicitly
2011                popped regs were grouped at the top of the reg-stack.  */
2012
2013             CLEAR_HARD_REG_BIT (regstack->reg_set,
2014                                 regstack->reg[regstack->top]);
2015             regstack->top--;
2016           }
2017       }
2018
2019   /* Now add to REGSTACK any outputs that the asm implicitly pushed.
2020      Note that there isn't any need to substitute register numbers.
2021      ???  Explain why this is true.  */
2022
2023   for (i = LAST_STACK_REG; i >= FIRST_STACK_REG; i--)
2024     {
2025       /* See if there is an output for this hard reg.  */
2026       int j;
2027
2028       for (j = 0; j < n_outputs; j++)
2029         if (STACK_REG_P (recog_data.operand[j])
2030             && REGNO (recog_data.operand[j]) == i)
2031           {
2032             regstack->reg[++regstack->top] = i;
2033             SET_HARD_REG_BIT (regstack->reg_set, i);
2034             break;
2035           }
2036     }
2037
2038   /* Now emit a pop insn for any REG_UNUSED output, or any REG_DEAD
2039      input that the asm didn't implicitly pop.  If the asm didn't
2040      implicitly pop an input reg, that reg will still be live.
2041
2042      Note that we can't use find_regno_note here: the register numbers
2043      in the death notes have already been substituted.  */
2044
2045   for (i = 0; i < n_outputs; i++)
2046     if (STACK_REG_P (recog_data.operand[i]))
2047       {
2048         int j;
2049
2050         for (j = 0; j < n_notes; j++)
2051           if (REGNO (recog_data.operand[i]) == REGNO (note_reg[j])
2052               && note_kind[j] == REG_UNUSED)
2053             {
2054               insn = emit_pop_insn (insn, regstack, recog_data.operand[i],
2055                                     EMIT_AFTER);
2056               break;
2057             }
2058       }
2059
2060   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2061     if (STACK_REG_P (recog_data.operand[i]))
2062       {
2063         int j;
2064
2065         for (j = 0; j < n_notes; j++)
2066           if (REGNO (recog_data.operand[i]) == REGNO (note_reg[j])
2067               && note_kind[j] == REG_DEAD
2068               && TEST_HARD_REG_BIT (regstack->reg_set,
2069                                     REGNO (recog_data.operand[i])))
2070             {
2071               insn = emit_pop_insn (insn, regstack, recog_data.operand[i],
2072                                     EMIT_AFTER);
2073               break;
2074             }
2075       }
2076 }
2077 \f
2078 /* Substitute stack hard reg numbers for stack virtual registers in
2079    INSN.  Non-stack register numbers are not changed.  REGSTACK is the
2080    current stack content.  Insns may be emitted as needed to arrange the
2081    stack for the 387 based on the contents of the insn.  */
2082
2083 static void
2084 subst_stack_regs (insn, regstack)
2085      rtx insn;
2086      stack regstack;
2087 {
2088   register rtx *note_link, note;
2089   register int i;
2090
2091   if (GET_CODE (insn) == CALL_INSN)
2092     {
2093       int top = regstack->top;
2094
2095       /* If there are any floating point parameters to be passed in
2096          registers for this call, make sure they are in the right
2097          order.  */
2098
2099       if (top >= 0)
2100         {
2101           straighten_stack (PREV_INSN (insn), regstack);
2102
2103           /* Now mark the arguments as dead after the call.  */
2104
2105           while (regstack->top >= 0)
2106             {
2107               CLEAR_HARD_REG_BIT (regstack->reg_set, FIRST_STACK_REG + regstack->top);
2108               regstack->top--;
2109             }
2110         }
2111     }
2112
2113   /* Do the actual substitution if any stack regs are mentioned.
2114      Since we only record whether entire insn mentions stack regs, and
2115      subst_stack_regs_pat only works for patterns that contain stack regs,
2116      we must check each pattern in a parallel here.  A call_value_pop could
2117      fail otherwise.  */
2118
2119   if (stack_regs_mentioned (insn))
2120     {
2121       int n_operands = asm_noperands (PATTERN (insn));
2122       if (n_operands >= 0)
2123         {
2124           /* This insn is an `asm' with operands.  Decode the operands,
2125              decide how many are inputs, and do register substitution.
2126              Any REG_UNUSED notes will be handled by subst_asm_stack_regs.  */
2127
2128           subst_asm_stack_regs (insn, regstack);
2129           return;
2130         }
2131
2132       if (GET_CODE (PATTERN (insn)) == PARALLEL)
2133         for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
2134           {
2135             if (stack_regs_mentioned_p (XVECEXP (PATTERN (insn), 0, i)))
2136               subst_stack_regs_pat (insn, regstack,
2137                                     XVECEXP (PATTERN (insn), 0, i));
2138           }
2139       else
2140         subst_stack_regs_pat (insn, regstack, PATTERN (insn));
2141     }
2142
2143   /* subst_stack_regs_pat may have deleted a no-op insn.  If so, any
2144      REG_UNUSED will already have been dealt with, so just return.  */
2145
2146   if (GET_CODE (insn) == NOTE)
2147     return;
2148
2149   /* If there is a REG_UNUSED note on a stack register on this insn,
2150      the indicated reg must be popped.  The REG_UNUSED note is removed,
2151      since the form of the newly emitted pop insn references the reg,
2152      making it no longer `unset'.  */
2153
2154   note_link = &REG_NOTES(insn);
2155   for (note = *note_link; note; note = XEXP (note, 1))
2156     if (REG_NOTE_KIND (note) == REG_UNUSED && STACK_REG_P (XEXP (note, 0)))
2157       {
2158         *note_link = XEXP (note, 1);
2159         insn = emit_pop_insn (insn, regstack, XEXP (note, 0), EMIT_AFTER);
2160       }
2161     else
2162       note_link = &XEXP (note, 1);
2163 }
2164 \f
2165 /* Change the organization of the stack so that it fits a new basic
2166    block.  Some registers might have to be popped, but there can never be
2167    a register live in the new block that is not now live.
2168
2169    Insert any needed insns before or after INSN, as indicated by
2170    WHERE.  OLD is the original stack layout, and NEW is the desired
2171    form.  OLD is updated to reflect the code emitted, ie, it will be
2172    the same as NEW upon return.
2173
2174    This function will not preserve block_end[].  But that information
2175    is no longer needed once this has executed.  */
2176
2177 static void
2178 change_stack (insn, old, new, where)
2179      rtx insn;
2180      stack old;
2181      stack new;
2182      enum emit_where where;
2183 {
2184   int reg;
2185   int update_end = 0;
2186
2187   /* We will be inserting new insns "backwards".  If we are to insert
2188      after INSN, find the next insn, and insert before it.  */
2189
2190   if (where == EMIT_AFTER)
2191     {
2192       if (current_block && current_block->end == insn)
2193         update_end = 1;
2194       insn = NEXT_INSN (insn);
2195     }
2196
2197   /* Pop any registers that are not needed in the new block.  */
2198
2199   for (reg = old->top; reg >= 0; reg--)
2200     if (! TEST_HARD_REG_BIT (new->reg_set, old->reg[reg]))
2201       emit_pop_insn (insn, old, FP_MODE_REG (old->reg[reg], DFmode),
2202                      EMIT_BEFORE);
2203
2204   if (new->top == -2)
2205     {
2206       /* If the new block has never been processed, then it can inherit
2207          the old stack order.  */
2208
2209       new->top = old->top;
2210       memcpy (new->reg, old->reg, sizeof (new->reg));
2211     }
2212   else
2213     {
2214       /* This block has been entered before, and we must match the
2215          previously selected stack order.  */
2216
2217       /* By now, the only difference should be the order of the stack,
2218          not their depth or liveliness.  */
2219
2220       GO_IF_HARD_REG_EQUAL (old->reg_set, new->reg_set, win);
2221       abort ();
2222     win:
2223       if (old->top != new->top)
2224         abort ();
2225
2226       /* If the stack is not empty (new->top != -1), loop here emitting
2227          swaps until the stack is correct. 
2228
2229          The worst case number of swaps emitted is N + 2, where N is the
2230          depth of the stack.  In some cases, the reg at the top of
2231          stack may be correct, but swapped anyway in order to fix
2232          other regs.  But since we never swap any other reg away from
2233          its correct slot, this algorithm will converge.  */
2234
2235       if (new->top != -1)
2236         do
2237           {
2238             /* Swap the reg at top of stack into the position it is
2239                supposed to be in, until the correct top of stack appears.  */
2240
2241             while (old->reg[old->top] != new->reg[new->top])
2242               {
2243                 for (reg = new->top; reg >= 0; reg--)
2244                   if (new->reg[reg] == old->reg[old->top])
2245                     break;
2246
2247                 if (reg == -1)
2248                   abort ();
2249
2250                 emit_swap_insn (insn, old,
2251                                 FP_MODE_REG (old->reg[reg], DFmode));
2252               }
2253
2254             /* See if any regs remain incorrect.  If so, bring an
2255              incorrect reg to the top of stack, and let the while loop
2256              above fix it.  */
2257
2258             for (reg = new->top; reg >= 0; reg--)
2259               if (new->reg[reg] != old->reg[reg])
2260                 {
2261                   emit_swap_insn (insn, old,
2262                                   FP_MODE_REG (old->reg[reg], DFmode));
2263                   break;
2264                 }
2265           } while (reg >= 0);
2266
2267       /* At this point there must be no differences.  */
2268
2269       for (reg = old->top; reg >= 0; reg--)
2270         if (old->reg[reg] != new->reg[reg])
2271           abort ();
2272     }
2273
2274   if (update_end)
2275     current_block->end = PREV_INSN (insn);
2276 }
2277 \f
2278 /* Print stack configuration.  */
2279
2280 static void
2281 print_stack (file, s)
2282      FILE *file;
2283      stack s;
2284 {
2285   if (! file)
2286     return;
2287
2288   if (s->top == -2)
2289     fprintf (file, "uninitialized\n");
2290   else if (s->top == -1)
2291     fprintf (file, "empty\n");
2292   else
2293     {
2294       int i;
2295       fputs ("[ ", file);
2296       for (i = 0; i <= s->top; ++i)
2297         fprintf (file, "%d ", s->reg[i]);
2298       fputs ("]\n", file);
2299     }
2300 }
2301 \f
2302 /* This function was doing life analysis.  We now let the regular live
2303    code do it's job, so we only need to check some extra invariants 
2304    that reg-stack expects.  Primary among these being that all registers
2305    are initialized before use.
2306
2307    The function returns true when code was emitted to CFG edges and
2308    commit_edge_insertions needs to be called.  */
2309
2310 static int
2311 convert_regs_entry ()
2312 {
2313   int inserted = 0, i;
2314   edge e;
2315
2316   for (i = n_basic_blocks - 1; i >= 0; --i)
2317     {
2318       basic_block block = BASIC_BLOCK (i);
2319       block_info bi = BLOCK_INFO (block);
2320       int reg;
2321       
2322       /* Set current register status at last instruction `uninitialized'.  */
2323       bi->stack_in.top = -2;
2324   
2325       /* Copy live_at_end and live_at_start into temporaries.  */
2326       for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; reg++)
2327         {
2328           if (REGNO_REG_SET_P (block->global_live_at_end, reg))
2329             SET_HARD_REG_BIT (bi->out_reg_set, reg);
2330           if (REGNO_REG_SET_P (block->global_live_at_start, reg))
2331             SET_HARD_REG_BIT (bi->stack_in.reg_set, reg);
2332         }
2333     }
2334
2335   /* Load something into each stack register live at function entry. 
2336      Such live registers can be caused by uninitialized variables or
2337      functions not returning values on all paths.  In order to keep 
2338      the push/pop code happy, and to not scrog the register stack, we
2339      must put something in these registers.  Use a QNaN.  
2340
2341      Note that we are insertting converted code here.  This code is
2342      never seen by the convert_regs pass.  */
2343
2344   for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2345     {
2346       basic_block block = e->dest;
2347       block_info bi = BLOCK_INFO (block);
2348       int reg, top = -1;
2349
2350       for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
2351         if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
2352           {
2353             rtx init;
2354
2355             bi->stack_in.reg[++top] = reg;
2356
2357             init = gen_rtx_SET (VOIDmode,
2358                                 FP_MODE_REG (FIRST_STACK_REG, SFmode),
2359                                 nan);
2360             insert_insn_on_edge (init, e);
2361             inserted = 1;
2362           }
2363
2364       bi->stack_in.top = top;
2365     }
2366
2367   return inserted;
2368 }
2369
2370 /* Construct the desired stack for function exit.  This will either
2371    be `empty', or the function return value at top-of-stack.  */
2372
2373 static void
2374 convert_regs_exit ()
2375 {
2376   int value_reg_low, value_reg_high;
2377   stack output_stack;
2378   rtx retvalue;
2379
2380   retvalue = stack_result (current_function_decl);
2381   value_reg_low = value_reg_high = -1;
2382   if (retvalue)
2383     {
2384       value_reg_low = REGNO (retvalue);
2385       value_reg_high = value_reg_low
2386         + HARD_REGNO_NREGS (value_reg_low, GET_MODE (retvalue)) - 1;
2387     }
2388
2389   output_stack = &BLOCK_INFO (EXIT_BLOCK_PTR)->stack_in;
2390   if (value_reg_low == -1)
2391     output_stack->top = -1;
2392   else
2393     {
2394       int reg;
2395
2396       output_stack->top = value_reg_high - value_reg_low;
2397       for (reg = value_reg_low; reg <= value_reg_high; ++reg)
2398         {
2399           output_stack->reg[reg - value_reg_low] = reg;
2400           SET_HARD_REG_BIT (output_stack->reg_set, reg);
2401         }
2402     }
2403 }
2404
2405 /* Convert stack register references in one block.  */
2406
2407 static int
2408 convert_regs_1 (file, block)
2409      FILE *file;
2410      basic_block block;
2411 {
2412   struct stack_def regstack, tmpstack;
2413   block_info bi = BLOCK_INFO (block);
2414   int inserted, reg;
2415   rtx insn, next;
2416   edge e;
2417
2418   current_block = block;
2419   
2420   if (file)
2421     {
2422       fprintf (file, "\nBasic block %d\nInput stack: ", block->index);
2423       print_stack (file, &bi->stack_in);
2424     }
2425
2426   /* Process all insns in this block.  Keep track of NEXT so that we
2427      don't process insns emitted while substituting in INSN.  */
2428   next = block->head;
2429   regstack = bi->stack_in;
2430   do
2431     {
2432       insn = next;
2433       next = NEXT_INSN (insn);
2434
2435       /* Ensure we have not missed a block boundary.  */
2436       if (next == NULL)
2437         abort ();
2438       if (insn == block->end)
2439         next = NULL;
2440
2441       /* Don't bother processing unless there is a stack reg
2442          mentioned or if it's a CALL_INSN.  */
2443       if (stack_regs_mentioned (insn)
2444           || GET_CODE (insn) == CALL_INSN)
2445         {
2446           if (file)
2447             {
2448               fprintf (file, "  insn %d input stack: ",
2449                        INSN_UID (insn));
2450               print_stack (file, &regstack);
2451             }
2452           subst_stack_regs (insn, &regstack);
2453         }
2454     }
2455   while (next);
2456
2457   if (file)
2458     {
2459       fprintf (file, "Expected live registers [");
2460       for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; ++reg)
2461         if (TEST_HARD_REG_BIT (bi->out_reg_set, reg))
2462           fprintf (file, " %d", reg);
2463       fprintf (file, " ]\nOutput stack: ");
2464       print_stack (file, &regstack);
2465     }
2466
2467   insn = block->end;
2468   if (GET_CODE (insn) == JUMP_INSN)
2469     insn = PREV_INSN (insn);
2470
2471   /* If the function is declared to return a value, but it returns one
2472      in only some cases, some registers might come live here.  Emit
2473      necessary moves for them.  */
2474
2475   for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; ++reg)
2476     {
2477       if (TEST_HARD_REG_BIT (bi->out_reg_set, reg)
2478           && ! TEST_HARD_REG_BIT (regstack.reg_set, reg))
2479         {
2480           rtx set;
2481
2482           if (file)
2483             {
2484               fprintf (file, "Emitting insn initializing reg %d\n",
2485                        reg);
2486             }
2487
2488           set = gen_rtx_SET (VOIDmode, FP_MODE_REG (reg, SFmode),
2489                              nan);
2490           insn = emit_block_insn_after (set, insn, block);
2491           subst_stack_regs (insn, &regstack);
2492         }
2493     }
2494
2495   /* Something failed if the stack lives don't match.  */
2496   GO_IF_HARD_REG_EQUAL (regstack.reg_set, bi->out_reg_set, win);
2497   abort ();
2498  win:
2499
2500   /* Adjust the stack of this block on exit to match the stack of the
2501      target block, or copy stack info into the stack of the successor
2502      of the successor hasn't been processed yet.  */
2503   inserted = 0;
2504   for (e = block->succ; e ; e = e->succ_next)
2505     {
2506       basic_block target = e->dest;
2507       stack target_stack = &BLOCK_INFO (target)->stack_in;
2508
2509       if (file)
2510         fprintf (file, "Edge to block %d: ", target->index);
2511
2512       if (target_stack->top == -2)
2513         {
2514           /* The target block hasn't had a stack order selected.
2515              We need merely ensure that no pops are needed.  */
2516           for (reg = regstack.top; reg >= 0; --reg)
2517             if (! TEST_HARD_REG_BIT (target_stack->reg_set,
2518                                      regstack.reg[reg]))
2519               break;
2520
2521           if (reg == -1)
2522             {
2523               if (file)
2524                 fprintf (file, "new block; copying stack position\n");
2525
2526               /* change_stack kills values in regstack.  */
2527               tmpstack = regstack;
2528
2529               change_stack (block->end, &tmpstack,
2530                             target_stack, EMIT_AFTER);
2531               continue;
2532             }
2533
2534           if (file)
2535             fprintf (file, "new block; pops needed\n");
2536         }
2537       else
2538         {
2539           if (target_stack->top == regstack.top)
2540             {
2541               for (reg = target_stack->top; reg >= 0; --reg)
2542                 if (target_stack->reg[reg] != regstack.reg[reg])
2543                   break;
2544
2545               if (reg == -1)
2546                 {
2547                   if (file)
2548                     fprintf (file, "no changes needed\n");
2549                   continue;
2550                 }
2551             }
2552
2553           if (file)
2554             {
2555               fprintf (file, "correcting stack to ");
2556               print_stack (file, target_stack);
2557             }
2558         }
2559
2560       /* Care for EH edges specially.  The normal return path may return
2561          a value in st(0), but the EH path will not, and there's no need
2562          to add popping code to the edge.  */
2563       if (e->flags & (EDGE_EH | EDGE_ABNORMAL_CALL))
2564         {
2565           /* Assert that the lifetimes are as we expect -- one value
2566              live at st(0) on the end of the source block, and no
2567              values live at the beginning of the destination block.  */
2568           HARD_REG_SET tmp;
2569
2570           CLEAR_HARD_REG_SET (tmp);
2571           GO_IF_HARD_REG_EQUAL (target_stack->reg_set, tmp, eh1);
2572           abort();
2573         eh1:
2574
2575           SET_HARD_REG_BIT (tmp, FIRST_STACK_REG);
2576           GO_IF_HARD_REG_EQUAL (regstack.reg_set, tmp, eh2);
2577           abort();
2578         eh2:
2579
2580           target_stack->top = -1;
2581         }
2582
2583       /* It is better to output directly to the end of the block
2584          instead of to the edge, because emit_swap can do minimal
2585          insn scheduling.  We can do this when there is only one
2586          edge out, and it is not abnormal.  */
2587       else if (block->succ->succ_next == NULL
2588                && ! (e->flags & EDGE_ABNORMAL))
2589         {
2590           /* change_stack kills values in regstack.  */
2591           tmpstack = regstack;
2592
2593           change_stack (block->end, &tmpstack, target_stack,
2594                         (GET_CODE (block->end) == JUMP_INSN
2595                          ? EMIT_BEFORE : EMIT_AFTER));
2596         }
2597       else
2598         {
2599           rtx seq, after;
2600
2601           /* We don't support abnormal edges.  Global takes care to
2602              avoid any live register across them, so we should never
2603              have to insert instructions on such edges.  */
2604           if (e->flags & EDGE_ABNORMAL)
2605             abort ();
2606
2607           current_block = NULL;
2608           start_sequence ();
2609                   
2610           /* ??? change_stack needs some point to emit insns after. 
2611              Also needed to keep gen_sequence from returning a 
2612              pattern as opposed to a sequence, which would lose
2613              REG_DEAD notes.  */
2614           after = emit_note (NULL, NOTE_INSN_DELETED);
2615
2616           tmpstack = regstack;
2617           change_stack (after, &tmpstack, target_stack, EMIT_BEFORE);
2618
2619           seq = gen_sequence ();
2620           end_sequence ();
2621
2622           insert_insn_on_edge (seq, e);
2623           inserted = 1;
2624           current_block = block;
2625         }
2626     }
2627
2628   return inserted;
2629 }
2630
2631 /* Convert registers in all blocks reachable from BLOCK.  */
2632
2633 static int
2634 convert_regs_2 (file, block)
2635      FILE *file;
2636      basic_block block;
2637 {
2638   basic_block *stack, *sp;
2639   int inserted;
2640
2641   stack = (basic_block *) xmalloc (sizeof (*stack) * n_basic_blocks);
2642   sp = stack;
2643
2644   *sp++ = block;
2645   BLOCK_INFO (block)->done = 1;
2646
2647   inserted = 0;
2648   do
2649     {
2650       edge e;
2651
2652       block = *--sp;
2653       inserted |= convert_regs_1 (file, block);
2654
2655       for (e = block->succ; e ; e = e->succ_next)
2656         if (! BLOCK_INFO (e->dest)->done)
2657           {
2658             *sp++ = e->dest;
2659             BLOCK_INFO (e->dest)->done = 1;
2660           }
2661     }
2662   while (sp != stack);
2663
2664   return inserted;
2665 }
2666
2667 /* Traverse all basic blocks in a function, converting the register
2668    references in each insn from the "flat" register file that gcc uses,
2669    to the stack-like registers the 387 uses.  */
2670
2671 static int
2672 convert_regs (file)
2673      FILE *file;
2674 {
2675   int inserted, i;
2676   edge e;
2677
2678   /* Initialize uninitialized registers on function entry.  */
2679   inserted = convert_regs_entry ();
2680
2681   /* Construct the desired stack for function exit.  */
2682   convert_regs_exit ();
2683   BLOCK_INFO (EXIT_BLOCK_PTR)->done = 1;
2684
2685   /* ??? Future: process inner loops first, and give them arbitrary
2686      initial stacks which emit_swap_insn can modify.  This ought to
2687      prevent double fxch that aften appears at the head of a loop.  */
2688
2689   /* Process all blocks reachable from all entry points.  */
2690   for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2691     inserted |= convert_regs_2 (file, e->dest);
2692   
2693   /* ??? Process all unreachable blocks.  Though there's no excuse 
2694      for keeping these even when not optimizing.  */
2695   for (i = 0; i < n_basic_blocks; ++i)
2696     {
2697       basic_block b = BASIC_BLOCK (i);
2698       block_info bi = BLOCK_INFO (b);
2699
2700       if (! bi->done)
2701         {
2702           int reg;
2703
2704           /* Create an arbitrary input stack.  */
2705           bi->stack_in.top = -1;
2706           for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
2707             if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
2708               bi->stack_in.reg[++bi->stack_in.top] = reg;
2709
2710           inserted |= convert_regs_2 (file, b);
2711         }
2712     }
2713
2714   if (inserted)
2715     commit_edge_insertions ();
2716
2717   if (file)
2718     fputc ('\n', file);
2719
2720   return inserted;
2721 }
2722 #endif /* STACK_REGS */