OSDN Git Service

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