OSDN Git Service

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