OSDN Git Service

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