OSDN Git Service

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