OSDN Git Service

* ChangeLog: Follow spelling conventions.
[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, 2002 Free Software Foundation, Inc.
4
5    This file is part of GCC.
6
7    GCC is free software; you can redistribute it and/or modify it
8    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    GCC is distributed in the hope that it will be useful, but WITHOUT
13    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15    License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GCC; see the file COPYING.  If not, write to the Free
19    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20    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 #include "ggc.h"
171
172 /* We use this array to cache info about insns, because otherwise we
173    spend too much time in stack_regs_mentioned_p.
174
175    Indexed by insn UIDs.  A value of zero is uninitialized, one indicates
176    the insn uses stack registers, two indicates the insn does not use
177    stack registers.  */
178 static GTY(()) varray_type stack_regs_mentioned_data;
179
180 #ifdef STACK_REGS
181
182 #define REG_STACK_SIZE (LAST_STACK_REG - FIRST_STACK_REG + 1)
183
184 /* This is the basic stack record.  TOP is an index into REG[] such
185    that REG[TOP] is the top of stack.  If TOP is -1 the stack is empty.
186
187    If TOP is -2, REG[] is not yet initialized.  Stack initialization
188    consists of placing each live reg in array `reg' and setting `top'
189    appropriately.
190
191    REG_SET indicates which registers are live.  */
192
193 typedef struct stack_def
194 {
195   int top;                      /* index to top stack element */
196   HARD_REG_SET reg_set;         /* set of live registers */
197   unsigned char reg[REG_STACK_SIZE];/* register - stack mapping */
198 } *stack;
199
200 /* This is used to carry information about basic blocks.  It is
201    attached to the AUX field of the standard CFG block.  */
202
203 typedef struct block_info_def
204 {
205   struct stack_def stack_in;    /* Input stack configuration.  */
206   struct stack_def stack_out;   /* Output stack configuration.  */
207   HARD_REG_SET out_reg_set;     /* Stack regs live on output.  */
208   int done;                     /* True if block already converted.  */
209   int predecessors;             /* Number of predecessors that needs
210                                    to be visited.  */
211 } *block_info;
212
213 #define BLOCK_INFO(B)   ((block_info) (B)->aux)
214
215 /* Passed to change_stack to indicate where to emit insns.  */
216 enum emit_where
217 {
218   EMIT_AFTER,
219   EMIT_BEFORE
220 };
221
222 /* The block we're currently working on.  */
223 static basic_block current_block;
224
225 /* This is the register file for all register after conversion */
226 static rtx
227   FP_mode_reg[LAST_STACK_REG+1-FIRST_STACK_REG][(int) MAX_MACHINE_MODE];
228
229 #define FP_MODE_REG(regno,mode) \
230   (FP_mode_reg[(regno)-FIRST_STACK_REG][(int) (mode)])
231
232 /* Used to initialize uninitialized registers.  */
233 static rtx nan;
234
235 /* Forward declarations */
236
237 static int stack_regs_mentioned_p       PARAMS ((rtx pat));
238 static void straighten_stack            PARAMS ((rtx, stack));
239 static void pop_stack                   PARAMS ((stack, int));
240 static rtx *get_true_reg                PARAMS ((rtx *));
241
242 static int check_asm_stack_operands     PARAMS ((rtx));
243 static int get_asm_operand_n_inputs     PARAMS ((rtx));
244 static rtx stack_result                 PARAMS ((tree));
245 static void replace_reg                 PARAMS ((rtx *, int));
246 static void remove_regno_note           PARAMS ((rtx, enum reg_note,
247                                                  unsigned int));
248 static int get_hard_regnum              PARAMS ((stack, rtx));
249 static rtx emit_pop_insn                PARAMS ((rtx, stack, rtx,
250                                                enum emit_where));
251 static void emit_swap_insn              PARAMS ((rtx, stack, rtx));
252 static void move_for_stack_reg          PARAMS ((rtx, stack, rtx));
253 static int swap_rtx_condition_1         PARAMS ((rtx));
254 static int swap_rtx_condition           PARAMS ((rtx));
255 static void compare_for_stack_reg       PARAMS ((rtx, stack, rtx));
256 static void subst_stack_regs_pat        PARAMS ((rtx, stack, rtx));
257 static void subst_asm_stack_regs        PARAMS ((rtx, stack));
258 static void subst_stack_regs            PARAMS ((rtx, stack));
259 static void change_stack                PARAMS ((rtx, stack, stack,
260                                                enum emit_where));
261 static int convert_regs_entry           PARAMS ((void));
262 static void convert_regs_exit           PARAMS ((void));
263 static int convert_regs_1               PARAMS ((FILE *, basic_block));
264 static int convert_regs_2               PARAMS ((FILE *, basic_block));
265 static int convert_regs                 PARAMS ((FILE *));
266 static void print_stack                 PARAMS ((FILE *, stack));
267 static rtx next_flags_user              PARAMS ((rtx));
268 static void record_label_references     PARAMS ((rtx, rtx));
269 static bool compensate_edge             PARAMS ((edge, FILE *));
270 \f
271 /* Return non-zero if any stack register is mentioned somewhere within PAT.  */
272
273 static int
274 stack_regs_mentioned_p (pat)
275      rtx pat;
276 {
277   const char *fmt;
278   int i;
279
280   if (STACK_REG_P (pat))
281     return 1;
282
283   fmt = GET_RTX_FORMAT (GET_CODE (pat));
284   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0; i--)
285     {
286       if (fmt[i] == 'E')
287         {
288           int j;
289
290           for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
291             if (stack_regs_mentioned_p (XVECEXP (pat, i, j)))
292               return 1;
293         }
294       else if (fmt[i] == 'e' && stack_regs_mentioned_p (XEXP (pat, i)))
295         return 1;
296     }
297
298   return 0;
299 }
300
301 /* Return nonzero if INSN mentions stacked registers, else return zero.  */
302
303 int
304 stack_regs_mentioned (insn)
305      rtx insn;
306 {
307   unsigned int uid, max;
308   int test;
309
310   if (! INSN_P (insn) || !stack_regs_mentioned_data)
311     return 0;
312
313   uid = INSN_UID (insn);
314   max = VARRAY_SIZE (stack_regs_mentioned_data);
315   if (uid >= max)
316     {
317       /* Allocate some extra size to avoid too many reallocs, but
318          do not grow too quickly.  */
319       max = uid + uid / 20;
320       VARRAY_GROW (stack_regs_mentioned_data, max);
321     }
322
323   test = VARRAY_CHAR (stack_regs_mentioned_data, uid);
324   if (test == 0)
325     {
326       /* This insn has yet to be examined.  Do so now.  */
327       test = stack_regs_mentioned_p (PATTERN (insn)) ? 1 : 2;
328       VARRAY_CHAR (stack_regs_mentioned_data, uid) = test;
329     }
330
331   return test == 1;
332 }
333 \f
334 static rtx ix86_flags_rtx;
335
336 static rtx
337 next_flags_user (insn)
338      rtx insn;
339 {
340   /* Search forward looking for the first use of this value.
341      Stop at block boundaries.  */
342
343   while (insn != current_block->end)
344     {
345       insn = NEXT_INSN (insn);
346
347       if (INSN_P (insn) && reg_mentioned_p (ix86_flags_rtx, PATTERN (insn)))
348         return insn;
349
350       if (GET_CODE (insn) == CALL_INSN)
351         return NULL_RTX;
352     }
353   return NULL_RTX;
354 }
355 \f
356 /* Reorganize the stack into ascending numbers,
357    after this insn.  */
358
359 static void
360 straighten_stack (insn, regstack)
361      rtx insn;
362      stack regstack;
363 {
364   struct stack_def temp_stack;
365   int top;
366
367   /* If there is only a single register on the stack, then the stack is
368      already in increasing order and no reorganization is needed.
369
370      Similarly if the stack is empty.  */
371   if (regstack->top <= 0)
372     return;
373
374   COPY_HARD_REG_SET (temp_stack.reg_set, regstack->reg_set);
375
376   for (top = temp_stack.top = regstack->top; top >= 0; top--)
377     temp_stack.reg[top] = FIRST_STACK_REG + temp_stack.top - top;
378
379   change_stack (insn, regstack, &temp_stack, EMIT_AFTER);
380 }
381
382 /* Pop a register from the stack */
383
384 static void
385 pop_stack (regstack, regno)
386      stack regstack;
387      int   regno;
388 {
389   int top = regstack->top;
390
391   CLEAR_HARD_REG_BIT (regstack->reg_set, regno);
392   regstack->top--;
393   /* If regno was not at the top of stack then adjust stack */
394   if (regstack->reg [top] != regno)
395     {
396       int i;
397       for (i = regstack->top; i >= 0; i--)
398         if (regstack->reg [i] == regno)
399           {
400             int j;
401             for (j = i; j < top; j++)
402               regstack->reg [j] = regstack->reg [j + 1];
403             break;
404           }
405     }
406 }
407 \f
408 /* Convert register usage from "flat" register file usage to a "stack
409    register file.  FIRST is the first insn in the function, FILE is the
410    dump file, if used.
411
412    Construct a CFG and run life analysis.  Then convert each insn one
413    by one.  Run a last cleanup_cfg pass, if optimizing, to eliminate
414    code duplication created when the converter inserts pop insns on
415    the edges.  */
416
417 void
418 reg_to_stack (first, file)
419      rtx first;
420      FILE *file;
421 {
422   basic_block bb;
423   int i;
424   int max_uid;
425
426   /* Clean up previous run.  */
427   stack_regs_mentioned_data = 0;
428
429   if (!optimize)
430     split_all_insns (0);
431
432   /* See if there is something to do.  Flow analysis is quite
433      expensive so we might save some compilation time.  */
434   for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
435     if (regs_ever_live[i])
436       break;
437   if (i > LAST_STACK_REG)
438     return;
439
440   /* Ok, floating point instructions exist.  If not optimizing,
441      build the CFG and run life analysis.  */
442   if (!optimize)
443     {
444       count_or_remove_death_notes (NULL, 1);
445       life_analysis (first, file, PROP_DEATH_NOTES);
446     }
447   mark_dfs_back_edges ();
448
449   /* Set up block info for each basic block.  */
450   alloc_aux_for_blocks (sizeof (struct block_info_def));
451   FOR_EACH_BB_REVERSE (bb)
452     {
453       edge e;
454       for (e = bb->pred; e; e=e->pred_next)
455         if (!(e->flags & EDGE_DFS_BACK)
456             && e->src != ENTRY_BLOCK_PTR)
457           BLOCK_INFO (bb)->predecessors++;
458     }
459
460   /* Create the replacement registers up front.  */
461   for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
462     {
463       enum machine_mode mode;
464       for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
465            mode != VOIDmode;
466            mode = GET_MODE_WIDER_MODE (mode))
467         FP_MODE_REG (i, mode) = gen_rtx_REG (mode, i);
468       for (mode = GET_CLASS_NARROWEST_MODE (MODE_COMPLEX_FLOAT);
469            mode != VOIDmode;
470            mode = GET_MODE_WIDER_MODE (mode))
471         FP_MODE_REG (i, mode) = gen_rtx_REG (mode, i);
472     }
473
474   ix86_flags_rtx = gen_rtx_REG (CCmode, FLAGS_REG);
475
476   /* A QNaN for initializing uninitialized variables.
477
478      ??? We can't load from constant memory in PIC mode, because
479      we're insertting these instructions before the prologue and
480      the PIC register hasn't been set up.  In that case, fall back
481      on zero, which we can get from `ldz'.  */
482
483   if (flag_pic)
484     nan = CONST0_RTX (SFmode);
485   else
486     {
487       nan = gen_lowpart (SFmode, GEN_INT (0x7fc00000));
488       nan = force_const_mem (SFmode, nan);
489     }
490
491   /* Allocate a cache for stack_regs_mentioned.  */
492   max_uid = get_max_uid ();
493   VARRAY_CHAR_INIT (stack_regs_mentioned_data, max_uid + 1,
494                     "stack_regs_mentioned cache");
495
496   convert_regs (file);
497
498   free_aux_for_blocks ();
499 }
500 \f
501 /* Check PAT, which is in INSN, for LABEL_REFs.  Add INSN to the
502    label's chain of references, and note which insn contains each
503    reference.  */
504
505 static void
506 record_label_references (insn, pat)
507      rtx insn, pat;
508 {
509   enum rtx_code code = GET_CODE (pat);
510   int i;
511   const char *fmt;
512
513   if (code == LABEL_REF)
514     {
515       rtx label = XEXP (pat, 0);
516       rtx ref;
517
518       if (GET_CODE (label) != CODE_LABEL)
519         abort ();
520
521       /* If this is an undefined label, LABEL_REFS (label) contains
522          garbage.  */
523       if (INSN_UID (label) == 0)
524         return;
525
526       /* Don't make a duplicate in the code_label's chain.  */
527
528       for (ref = LABEL_REFS (label);
529            ref && ref != label;
530            ref = LABEL_NEXTREF (ref))
531         if (CONTAINING_INSN (ref) == insn)
532           return;
533
534       CONTAINING_INSN (pat) = insn;
535       LABEL_NEXTREF (pat) = LABEL_REFS (label);
536       LABEL_REFS (label) = pat;
537
538       return;
539     }
540
541   fmt = GET_RTX_FORMAT (code);
542   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
543     {
544       if (fmt[i] == 'e')
545         record_label_references (insn, XEXP (pat, i));
546       if (fmt[i] == 'E')
547         {
548           int j;
549           for (j = 0; j < XVECLEN (pat, i); j++)
550             record_label_references (insn, XVECEXP (pat, i, j));
551         }
552     }
553 }
554 \f
555 /* Return a pointer to the REG expression within PAT.  If PAT is not a
556    REG, possible enclosed by a conversion rtx, return the inner part of
557    PAT that stopped the search.  */
558
559 static rtx *
560 get_true_reg (pat)
561      rtx *pat;
562 {
563   for (;;)
564     switch (GET_CODE (*pat))
565       {
566       case SUBREG:
567         /* Eliminate FP subregister accesses in favour of the
568            actual FP register in use.  */
569         {
570           rtx subreg;
571           if (FP_REG_P (subreg = SUBREG_REG (*pat)))
572             {
573               int regno_off = subreg_regno_offset (REGNO (subreg),
574                                                    GET_MODE (subreg),
575                                                    SUBREG_BYTE (*pat),
576                                                    GET_MODE (*pat));
577               *pat = FP_MODE_REG (REGNO (subreg) + regno_off,
578                                   GET_MODE (subreg));
579             default:
580               return pat;
581             }
582         }
583       case FLOAT:
584       case FIX:
585       case FLOAT_EXTEND:
586         pat = & XEXP (*pat, 0);
587       }
588 }
589 \f
590 /* There are many rules that an asm statement for stack-like regs must
591    follow.  Those rules are explained at the top of this file: the rule
592    numbers below refer to that explanation.  */
593
594 static int
595 check_asm_stack_operands (insn)
596      rtx insn;
597 {
598   int i;
599   int n_clobbers;
600   int malformed_asm = 0;
601   rtx body = PATTERN (insn);
602
603   char reg_used_as_output[FIRST_PSEUDO_REGISTER];
604   char implicitly_dies[FIRST_PSEUDO_REGISTER];
605   int alt;
606
607   rtx *clobber_reg = 0;
608   int n_inputs, n_outputs;
609
610   /* Find out what the constraints require.  If no constraint
611      alternative matches, this asm is malformed.  */
612   extract_insn (insn);
613   constrain_operands (1);
614   alt = which_alternative;
615
616   preprocess_constraints ();
617
618   n_inputs = get_asm_operand_n_inputs (body);
619   n_outputs = recog_data.n_operands - n_inputs;
620
621   if (alt < 0)
622     {
623       malformed_asm = 1;
624       /* Avoid further trouble with this insn.  */
625       PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
626       return 0;
627     }
628
629   /* Strip SUBREGs here to make the following code simpler.  */
630   for (i = 0; i < recog_data.n_operands; i++)
631     if (GET_CODE (recog_data.operand[i]) == SUBREG
632         && GET_CODE (SUBREG_REG (recog_data.operand[i])) == REG)
633       recog_data.operand[i] = SUBREG_REG (recog_data.operand[i]);
634
635   /* Set up CLOBBER_REG.  */
636
637   n_clobbers = 0;
638
639   if (GET_CODE (body) == PARALLEL)
640     {
641       clobber_reg = (rtx *) alloca (XVECLEN (body, 0) * sizeof (rtx));
642
643       for (i = 0; i < XVECLEN (body, 0); i++)
644         if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
645           {
646             rtx clobber = XVECEXP (body, 0, i);
647             rtx reg = XEXP (clobber, 0);
648
649             if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
650               reg = SUBREG_REG (reg);
651
652             if (STACK_REG_P (reg))
653               {
654                 clobber_reg[n_clobbers] = reg;
655                 n_clobbers++;
656               }
657           }
658     }
659
660   /* Enforce rule #4: Output operands must specifically indicate which
661      reg an output appears in after an asm.  "=f" is not allowed: the
662      operand constraints must select a class with a single reg.
663
664      Also enforce rule #5: Output operands must start at the top of
665      the reg-stack: output operands may not "skip" a reg.  */
666
667   memset (reg_used_as_output, 0, sizeof (reg_used_as_output));
668   for (i = 0; i < n_outputs; i++)
669     if (STACK_REG_P (recog_data.operand[i]))
670       {
671         if (reg_class_size[(int) recog_op_alt[i][alt].class] != 1)
672           {
673             error_for_asm (insn, "output constraint %d must specify a single register", i);
674             malformed_asm = 1;
675           }
676         else
677           {
678             int j;
679
680             for (j = 0; j < n_clobbers; j++)
681               if (REGNO (recog_data.operand[i]) == REGNO (clobber_reg[j]))
682                 {
683                   error_for_asm (insn, "output constraint %d cannot be specified together with \"%s\" clobber",
684                                  i, reg_names [REGNO (clobber_reg[j])]);
685                   malformed_asm = 1;
686                   break;
687                 }
688             if (j == n_clobbers)
689               reg_used_as_output[REGNO (recog_data.operand[i])] = 1;
690           }
691       }
692
693
694   /* Search for first non-popped reg.  */
695   for (i = FIRST_STACK_REG; i < LAST_STACK_REG + 1; i++)
696     if (! reg_used_as_output[i])
697       break;
698
699   /* If there are any other popped regs, that's an error.  */
700   for (; i < LAST_STACK_REG + 1; i++)
701     if (reg_used_as_output[i])
702       break;
703
704   if (i != LAST_STACK_REG + 1)
705     {
706       error_for_asm (insn, "output regs must be grouped at top of stack");
707       malformed_asm = 1;
708     }
709
710   /* Enforce rule #2: All implicitly popped input regs must be closer
711      to the top of the reg-stack than any input that is not implicitly
712      popped.  */
713
714   memset (implicitly_dies, 0, sizeof (implicitly_dies));
715   for (i = n_outputs; i < n_outputs + n_inputs; i++)
716     if (STACK_REG_P (recog_data.operand[i]))
717       {
718         /* An input reg is implicitly popped if it is tied to an
719            output, or if there is a CLOBBER for it.  */
720         int j;
721
722         for (j = 0; j < n_clobbers; j++)
723           if (operands_match_p (clobber_reg[j], recog_data.operand[i]))
724             break;
725
726         if (j < n_clobbers || recog_op_alt[i][alt].matches >= 0)
727           implicitly_dies[REGNO (recog_data.operand[i])] = 1;
728       }
729
730   /* Search for first non-popped reg.  */
731   for (i = FIRST_STACK_REG; i < LAST_STACK_REG + 1; i++)
732     if (! implicitly_dies[i])
733       break;
734
735   /* If there are any other popped regs, that's an error.  */
736   for (; i < LAST_STACK_REG + 1; i++)
737     if (implicitly_dies[i])
738       break;
739
740   if (i != LAST_STACK_REG + 1)
741     {
742       error_for_asm (insn,
743                      "implicitly popped regs must be grouped at top of stack");
744       malformed_asm = 1;
745     }
746
747   /* Enfore rule #3: If any input operand uses the "f" constraint, all
748      output constraints must use the "&" earlyclobber.
749
750      ??? Detect this more deterministically by having constrain_asm_operands
751      record any earlyclobber.  */
752
753   for (i = n_outputs; i < n_outputs + n_inputs; i++)
754     if (recog_op_alt[i][alt].matches == -1)
755       {
756         int j;
757
758         for (j = 0; j < n_outputs; j++)
759           if (operands_match_p (recog_data.operand[j], recog_data.operand[i]))
760             {
761               error_for_asm (insn,
762                              "output operand %d must use `&' constraint", j);
763               malformed_asm = 1;
764             }
765       }
766
767   if (malformed_asm)
768     {
769       /* Avoid further trouble with this insn.  */
770       PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
771       return 0;
772     }
773
774   return 1;
775 }
776 \f
777 /* Calculate the number of inputs and outputs in BODY, an
778    asm_operands.  N_OPERANDS is the total number of operands, and
779    N_INPUTS and N_OUTPUTS are pointers to ints into which the results are
780    placed.  */
781
782 static int
783 get_asm_operand_n_inputs (body)
784      rtx body;
785 {
786   if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
787     return ASM_OPERANDS_INPUT_LENGTH (SET_SRC (body));
788
789   else if (GET_CODE (body) == ASM_OPERANDS)
790     return ASM_OPERANDS_INPUT_LENGTH (body);
791
792   else if (GET_CODE (body) == PARALLEL
793            && GET_CODE (XVECEXP (body, 0, 0)) == SET)
794     return ASM_OPERANDS_INPUT_LENGTH (SET_SRC (XVECEXP (body, 0, 0)));
795
796   else if (GET_CODE (body) == PARALLEL
797            && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
798     return ASM_OPERANDS_INPUT_LENGTH (XVECEXP (body, 0, 0));
799
800   abort ();
801 }
802
803 /* If current function returns its result in an fp stack register,
804    return the REG.  Otherwise, return 0.  */
805
806 static rtx
807 stack_result (decl)
808      tree decl;
809 {
810   rtx result;
811
812   /* If the value is supposed to be returned in memory, then clearly
813      it is not returned in a stack register.  */
814   if (aggregate_value_p (DECL_RESULT (decl)))
815     return 0;
816
817   result = DECL_RTL_IF_SET (DECL_RESULT (decl));
818   if (result != 0)
819     {
820 #ifdef FUNCTION_OUTGOING_VALUE
821       result
822         = FUNCTION_OUTGOING_VALUE (TREE_TYPE (DECL_RESULT (decl)), decl);
823 #else
824       result = FUNCTION_VALUE (TREE_TYPE (DECL_RESULT (decl)), decl);
825 #endif
826     }
827
828   return result != 0 && STACK_REG_P (result) ? result : 0;
829 }
830 \f
831
832 /*
833  * This section deals with stack register substitution, and forms the second
834  * pass over the RTL.
835  */
836
837 /* Replace REG, which is a pointer to a stack reg RTX, with an RTX for
838    the desired hard REGNO.  */
839
840 static void
841 replace_reg (reg, regno)
842      rtx *reg;
843      int regno;
844 {
845   if (regno < FIRST_STACK_REG || regno > LAST_STACK_REG
846       || ! STACK_REG_P (*reg))
847     abort ();
848
849   switch (GET_MODE_CLASS (GET_MODE (*reg)))
850     {
851     default: abort ();
852     case MODE_FLOAT:
853     case MODE_COMPLEX_FLOAT:;
854     }
855
856   *reg = FP_MODE_REG (regno, GET_MODE (*reg));
857 }
858
859 /* Remove a note of type NOTE, which must be found, for register
860    number REGNO from INSN.  Remove only one such note.  */
861
862 static void
863 remove_regno_note (insn, note, regno)
864      rtx insn;
865      enum reg_note note;
866      unsigned int regno;
867 {
868   rtx *note_link, this;
869
870   note_link = &REG_NOTES (insn);
871   for (this = *note_link; this; this = XEXP (this, 1))
872     if (REG_NOTE_KIND (this) == note
873         && REG_P (XEXP (this, 0)) && REGNO (XEXP (this, 0)) == regno)
874       {
875         *note_link = XEXP (this, 1);
876         return;
877       }
878     else
879       note_link = &XEXP (this, 1);
880
881   abort ();
882 }
883
884 /* Find the hard register number of virtual register REG in REGSTACK.
885    The hard register number is relative to the top of the stack.  -1 is
886    returned if the register is not found.  */
887
888 static int
889 get_hard_regnum (regstack, reg)
890      stack regstack;
891      rtx reg;
892 {
893   int i;
894
895   if (! STACK_REG_P (reg))
896     abort ();
897
898   for (i = regstack->top; i >= 0; i--)
899     if (regstack->reg[i] == REGNO (reg))
900       break;
901
902   return i >= 0 ? (FIRST_STACK_REG + regstack->top - i) : -1;
903 }
904 \f
905 /* Emit an insn to pop virtual register REG before or after INSN.
906    REGSTACK is the stack state after INSN and is updated to reflect this
907    pop.  WHEN is either emit_insn_before or emit_insn_after.  A pop insn
908    is represented as a SET whose destination is the register to be popped
909    and source is the top of stack.  A death note for the top of stack
910    cases the movdf pattern to pop.  */
911
912 static rtx
913 emit_pop_insn (insn, regstack, reg, where)
914      rtx insn;
915      stack regstack;
916      rtx reg;
917      enum emit_where where;
918 {
919   rtx pop_insn, pop_rtx;
920   int hard_regno;
921
922   /* For complex types take care to pop both halves.  These may survive in
923      CLOBBER and USE expressions.  */
924   if (COMPLEX_MODE_P (GET_MODE (reg)))
925     {
926       rtx reg1 = FP_MODE_REG (REGNO (reg), DFmode);
927       rtx reg2 = FP_MODE_REG (REGNO (reg) + 1, DFmode);
928
929       pop_insn = NULL_RTX;
930       if (get_hard_regnum (regstack, reg1) >= 0)
931         pop_insn = emit_pop_insn (insn, regstack, reg1, where);
932       if (get_hard_regnum (regstack, reg2) >= 0)
933         pop_insn = emit_pop_insn (insn, regstack, reg2, where);
934       if (!pop_insn)
935         abort ();
936       return pop_insn;
937     }
938
939   hard_regno = get_hard_regnum (regstack, reg);
940
941   if (hard_regno < FIRST_STACK_REG)
942     abort ();
943
944   pop_rtx = gen_rtx_SET (VOIDmode, FP_MODE_REG (hard_regno, DFmode),
945                          FP_MODE_REG (FIRST_STACK_REG, DFmode));
946
947   if (where == EMIT_AFTER)
948     pop_insn = emit_insn_after (pop_rtx, insn);
949   else
950     pop_insn = emit_insn_before (pop_rtx, insn);
951
952   REG_NOTES (pop_insn)
953     = gen_rtx_EXPR_LIST (REG_DEAD, FP_MODE_REG (FIRST_STACK_REG, DFmode),
954                          REG_NOTES (pop_insn));
955
956   regstack->reg[regstack->top - (hard_regno - FIRST_STACK_REG)]
957     = regstack->reg[regstack->top];
958   regstack->top -= 1;
959   CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (reg));
960
961   return pop_insn;
962 }
963 \f
964 /* Emit an insn before or after INSN to swap virtual register REG with
965    the top of stack.  REGSTACK is the stack state before the swap, and
966    is updated to reflect the swap.  A swap insn is represented as a
967    PARALLEL of two patterns: each pattern moves one reg to the other.
968
969    If REG is already at the top of the stack, no insn is emitted.  */
970
971 static void
972 emit_swap_insn (insn, regstack, reg)
973      rtx insn;
974      stack regstack;
975      rtx reg;
976 {
977   int hard_regno;
978   rtx swap_rtx;
979   int tmp, other_reg;           /* swap regno temps */
980   rtx i1;                       /* the stack-reg insn prior to INSN */
981   rtx i1set = NULL_RTX;         /* the SET rtx within I1 */
982
983   hard_regno = get_hard_regnum (regstack, reg);
984
985   if (hard_regno < FIRST_STACK_REG)
986     abort ();
987   if (hard_regno == FIRST_STACK_REG)
988     return;
989
990   other_reg = regstack->top - (hard_regno - FIRST_STACK_REG);
991
992   tmp = regstack->reg[other_reg];
993   regstack->reg[other_reg] = regstack->reg[regstack->top];
994   regstack->reg[regstack->top] = tmp;
995
996   /* Find the previous insn involving stack regs, but don't pass a
997      block boundary.  */
998   i1 = NULL;
999   if (current_block && insn != current_block->head)
1000     {
1001       rtx tmp = PREV_INSN (insn);
1002       rtx limit = PREV_INSN (current_block->head);
1003       while (tmp != limit)
1004         {
1005           if (GET_CODE (tmp) == CODE_LABEL
1006               || GET_CODE (tmp) == CALL_INSN
1007               || NOTE_INSN_BASIC_BLOCK_P (tmp)
1008               || (GET_CODE (tmp) == INSN
1009                   && stack_regs_mentioned (tmp)))
1010             {
1011               i1 = tmp;
1012               break;
1013             }
1014           tmp = PREV_INSN (tmp);
1015         }
1016     }
1017
1018   if (i1 != NULL_RTX
1019       && (i1set = single_set (i1)) != NULL_RTX)
1020     {
1021       rtx i1src = *get_true_reg (&SET_SRC (i1set));
1022       rtx i1dest = *get_true_reg (&SET_DEST (i1set));
1023
1024       /* If the previous register stack push was from the reg we are to
1025          swap with, omit the swap.  */
1026
1027       if (GET_CODE (i1dest) == REG && REGNO (i1dest) == FIRST_STACK_REG
1028           && GET_CODE (i1src) == REG
1029           && REGNO (i1src) == (unsigned) 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) == (unsigned) 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_insn_after (swap_rtx, i1);
1047   else if (current_block)
1048     emit_insn_before (swap_rtx, current_block->head);
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 (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 (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 (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   const char *fmt;
1208   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               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) == UNSPEC_FNSTSW)
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) != UNSPEC_SAHF
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 UNSPEC_SIN:
1705               case UNSPEC_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 UNSPEC_SAHF:
1728                 /* (unspec [(unspec [(compare)] UNSPEC_FNSTSW)] UNSPEC_SAHF)
1729                    The combination matches the PPRO fcomi instruction.  */
1730
1731                 pat_src = XVECEXP (pat_src, 0, 0);
1732                 if (GET_CODE (pat_src) != UNSPEC
1733                     || XINT (pat_src, 1) != UNSPEC_FNSTSW)
1734                   abort ();
1735                 /* FALLTHRU */
1736
1737               case UNSPEC_FNSTSW:
1738                 /* Combined fcomp+fnstsw generated for doing well with
1739                    CSE.  When optimizing this would have been broken
1740                    up before now.  */
1741
1742                 pat_src = XVECEXP (pat_src, 0, 0);
1743                 if (GET_CODE (pat_src) != COMPARE)
1744                   abort ();
1745
1746                 compare_for_stack_reg (insn, regstack, pat_src);
1747                 break;
1748
1749               default:
1750                 abort ();
1751               }
1752             break;
1753
1754           case IF_THEN_ELSE:
1755             /* This insn requires the top of stack to be the destination.  */
1756
1757             src1 = get_true_reg (&XEXP (pat_src, 1));
1758             src2 = get_true_reg (&XEXP (pat_src, 2));
1759
1760             src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1761             src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1762
1763             /* If the comparison operator is an FP comparison operator,
1764                it is handled correctly by compare_for_stack_reg () who
1765                will move the destination to the top of stack. But if the
1766                comparison operator is not an FP comparison operator, we
1767                have to handle it here.  */
1768             if (get_hard_regnum (regstack, *dest) >= FIRST_STACK_REG
1769                 && REGNO (*dest) != regstack->reg[regstack->top])
1770               {
1771                 /* In case one of operands is the top of stack and the operands
1772                    dies, it is safe to make it the destination operand by
1773                    reversing the direction of cmove and avoid fxch.  */
1774                 if ((REGNO (*src1) == regstack->reg[regstack->top]
1775                      && src1_note)
1776                     || (REGNO (*src2) == regstack->reg[regstack->top]
1777                         && src2_note))
1778                   {
1779                     int idx1 = (get_hard_regnum (regstack, *src1)
1780                                 - FIRST_STACK_REG);
1781                     int idx2 = (get_hard_regnum (regstack, *src2)
1782                                 - FIRST_STACK_REG);
1783
1784                     /* Make reg-stack believe that the operands are already
1785                        swapped on the stack */
1786                     regstack->reg[regstack->top - idx1] = REGNO (*src2);
1787                     regstack->reg[regstack->top - idx2] = REGNO (*src1);
1788
1789                     /* Reverse condition to compensate the operand swap.
1790                        i386 do have comparison always reversible.  */
1791                     PUT_CODE (XEXP (pat_src, 0),
1792                               reversed_comparison_code (XEXP (pat_src, 0), insn));
1793                   }
1794                 else
1795                   emit_swap_insn (insn, regstack, *dest);
1796               }
1797
1798             {
1799               rtx src_note [3];
1800               int i;
1801
1802               src_note[0] = 0;
1803               src_note[1] = src1_note;
1804               src_note[2] = src2_note;
1805
1806               if (STACK_REG_P (*src1))
1807                 replace_reg (src1, get_hard_regnum (regstack, *src1));
1808               if (STACK_REG_P (*src2))
1809                 replace_reg (src2, get_hard_regnum (regstack, *src2));
1810
1811               for (i = 1; i <= 2; i++)
1812                 if (src_note [i])
1813                   {
1814                     int regno = REGNO (XEXP (src_note[i], 0));
1815
1816                     /* If the register that dies is not at the top of
1817                        stack, then move the top of stack to the dead reg */
1818                     if (regno != regstack->reg[regstack->top])
1819                       {
1820                         remove_regno_note (insn, REG_DEAD, regno);
1821                         emit_pop_insn (insn, regstack, XEXP (src_note[i], 0),
1822                                        EMIT_AFTER);
1823                       }
1824                     else
1825                       /* Top of stack never dies, as it is the
1826                          destination.  */
1827                       abort ();
1828                   }
1829             }
1830
1831             /* Make dest the top of stack.  Add dest to regstack if
1832                not present.  */
1833             if (get_hard_regnum (regstack, *dest) < FIRST_STACK_REG)
1834               regstack->reg[++regstack->top] = REGNO (*dest);
1835             SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1836             replace_reg (dest, FIRST_STACK_REG);
1837             break;
1838
1839           default:
1840             abort ();
1841           }
1842         break;
1843       }
1844
1845     default:
1846       break;
1847     }
1848 }
1849 \f
1850 /* Substitute hard regnums for any stack regs in INSN, which has
1851    N_INPUTS inputs and N_OUTPUTS outputs.  REGSTACK is the stack info
1852    before the insn, and is updated with changes made here.
1853
1854    There are several requirements and assumptions about the use of
1855    stack-like regs in asm statements.  These rules are enforced by
1856    record_asm_stack_regs; see comments there for details.  Any
1857    asm_operands left in the RTL at this point may be assume to meet the
1858    requirements, since record_asm_stack_regs removes any problem asm.  */
1859
1860 static void
1861 subst_asm_stack_regs (insn, regstack)
1862      rtx insn;
1863      stack regstack;
1864 {
1865   rtx body = PATTERN (insn);
1866   int alt;
1867
1868   rtx *note_reg;                /* Array of note contents */
1869   rtx **note_loc;               /* Address of REG field of each note */
1870   enum reg_note *note_kind;     /* The type of each note */
1871
1872   rtx *clobber_reg = 0;
1873   rtx **clobber_loc = 0;
1874
1875   struct stack_def temp_stack;
1876   int n_notes;
1877   int n_clobbers;
1878   rtx note;
1879   int i;
1880   int n_inputs, n_outputs;
1881
1882   if (! check_asm_stack_operands (insn))
1883     return;
1884
1885   /* Find out what the constraints required.  If no constraint
1886      alternative matches, that is a compiler bug: we should have caught
1887      such an insn in check_asm_stack_operands.  */
1888   extract_insn (insn);
1889   constrain_operands (1);
1890   alt = which_alternative;
1891
1892   preprocess_constraints ();
1893
1894   n_inputs = get_asm_operand_n_inputs (body);
1895   n_outputs = recog_data.n_operands - n_inputs;
1896
1897   if (alt < 0)
1898     abort ();
1899
1900   /* Strip SUBREGs here to make the following code simpler.  */
1901   for (i = 0; i < recog_data.n_operands; i++)
1902     if (GET_CODE (recog_data.operand[i]) == SUBREG
1903         && GET_CODE (SUBREG_REG (recog_data.operand[i])) == REG)
1904       {
1905         recog_data.operand_loc[i] = & SUBREG_REG (recog_data.operand[i]);
1906         recog_data.operand[i] = SUBREG_REG (recog_data.operand[i]);
1907       }
1908
1909   /* Set up NOTE_REG, NOTE_LOC and NOTE_KIND.  */
1910
1911   for (i = 0, note = REG_NOTES (insn); note; note = XEXP (note, 1))
1912     i++;
1913
1914   note_reg = (rtx *) alloca (i * sizeof (rtx));
1915   note_loc = (rtx **) alloca (i * sizeof (rtx *));
1916   note_kind = (enum reg_note *) alloca (i * sizeof (enum reg_note));
1917
1918   n_notes = 0;
1919   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1920     {
1921       rtx reg = XEXP (note, 0);
1922       rtx *loc = & XEXP (note, 0);
1923
1924       if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
1925         {
1926           loc = & SUBREG_REG (reg);
1927           reg = SUBREG_REG (reg);
1928         }
1929
1930       if (STACK_REG_P (reg)
1931           && (REG_NOTE_KIND (note) == REG_DEAD
1932               || REG_NOTE_KIND (note) == REG_UNUSED))
1933         {
1934           note_reg[n_notes] = reg;
1935           note_loc[n_notes] = loc;
1936           note_kind[n_notes] = REG_NOTE_KIND (note);
1937           n_notes++;
1938         }
1939     }
1940
1941   /* Set up CLOBBER_REG and CLOBBER_LOC.  */
1942
1943   n_clobbers = 0;
1944
1945   if (GET_CODE (body) == PARALLEL)
1946     {
1947       clobber_reg = (rtx *) alloca (XVECLEN (body, 0) * sizeof (rtx));
1948       clobber_loc = (rtx **) alloca (XVECLEN (body, 0) * sizeof (rtx *));
1949
1950       for (i = 0; i < XVECLEN (body, 0); i++)
1951         if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1952           {
1953             rtx clobber = XVECEXP (body, 0, i);
1954             rtx reg = XEXP (clobber, 0);
1955             rtx *loc = & XEXP (clobber, 0);
1956
1957             if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
1958               {
1959                 loc = & SUBREG_REG (reg);
1960                 reg = SUBREG_REG (reg);
1961               }
1962
1963             if (STACK_REG_P (reg))
1964               {
1965                 clobber_reg[n_clobbers] = reg;
1966                 clobber_loc[n_clobbers] = loc;
1967                 n_clobbers++;
1968               }
1969           }
1970     }
1971
1972   temp_stack = *regstack;
1973
1974   /* Put the input regs into the desired place in TEMP_STACK.  */
1975
1976   for (i = n_outputs; i < n_outputs + n_inputs; i++)
1977     if (STACK_REG_P (recog_data.operand[i])
1978         && reg_class_subset_p (recog_op_alt[i][alt].class,
1979                                FLOAT_REGS)
1980         && recog_op_alt[i][alt].class != FLOAT_REGS)
1981       {
1982         /* If an operand needs to be in a particular reg in
1983            FLOAT_REGS, the constraint was either 't' or 'u'.  Since
1984            these constraints are for single register classes, and
1985            reload guaranteed that operand[i] is already in that class,
1986            we can just use REGNO (recog_data.operand[i]) to know which
1987            actual reg this operand needs to be in.  */
1988
1989         int regno = get_hard_regnum (&temp_stack, recog_data.operand[i]);
1990
1991         if (regno < 0)
1992           abort ();
1993
1994         if ((unsigned int) regno != REGNO (recog_data.operand[i]))
1995           {
1996             /* recog_data.operand[i] is not in the right place.  Find
1997                it and swap it with whatever is already in I's place.
1998                K is where recog_data.operand[i] is now.  J is where it
1999                should be.  */
2000             int j, k, temp;
2001
2002             k = temp_stack.top - (regno - FIRST_STACK_REG);
2003             j = (temp_stack.top
2004                  - (REGNO (recog_data.operand[i]) - FIRST_STACK_REG));
2005
2006             temp = temp_stack.reg[k];
2007             temp_stack.reg[k] = temp_stack.reg[j];
2008             temp_stack.reg[j] = temp;
2009           }
2010       }
2011
2012   /* Emit insns before INSN to make sure the reg-stack is in the right
2013      order.  */
2014
2015   change_stack (insn, regstack, &temp_stack, EMIT_BEFORE);
2016
2017   /* Make the needed input register substitutions.  Do death notes and
2018      clobbers too, because these are for inputs, not outputs.  */
2019
2020   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2021     if (STACK_REG_P (recog_data.operand[i]))
2022       {
2023         int regnum = get_hard_regnum (regstack, recog_data.operand[i]);
2024
2025         if (regnum < 0)
2026           abort ();
2027
2028         replace_reg (recog_data.operand_loc[i], regnum);
2029       }
2030
2031   for (i = 0; i < n_notes; i++)
2032     if (note_kind[i] == REG_DEAD)
2033       {
2034         int regnum = get_hard_regnum (regstack, note_reg[i]);
2035
2036         if (regnum < 0)
2037           abort ();
2038
2039         replace_reg (note_loc[i], regnum);
2040       }
2041
2042   for (i = 0; i < n_clobbers; i++)
2043     {
2044       /* It's OK for a CLOBBER to reference a reg that is not live.
2045          Don't try to replace it in that case.  */
2046       int regnum = get_hard_regnum (regstack, clobber_reg[i]);
2047
2048       if (regnum >= 0)
2049         {
2050           /* Sigh - clobbers always have QImode.  But replace_reg knows
2051              that these regs can't be MODE_INT and will abort.  Just put
2052              the right reg there without calling replace_reg.  */
2053
2054           *clobber_loc[i] = FP_MODE_REG (regnum, DFmode);
2055         }
2056     }
2057
2058   /* Now remove from REGSTACK any inputs that the asm implicitly popped.  */
2059
2060   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2061     if (STACK_REG_P (recog_data.operand[i]))
2062       {
2063         /* An input reg is implicitly popped if it is tied to an
2064            output, or if there is a CLOBBER for it.  */
2065         int j;
2066
2067         for (j = 0; j < n_clobbers; j++)
2068           if (operands_match_p (clobber_reg[j], recog_data.operand[i]))
2069             break;
2070
2071         if (j < n_clobbers || recog_op_alt[i][alt].matches >= 0)
2072           {
2073             /* recog_data.operand[i] might not be at the top of stack.
2074                But that's OK, because all we need to do is pop the
2075                right number of regs off of the top of the reg-stack.
2076                record_asm_stack_regs guaranteed that all implicitly
2077                popped regs were grouped at the top of the reg-stack.  */
2078
2079             CLEAR_HARD_REG_BIT (regstack->reg_set,
2080                                 regstack->reg[regstack->top]);
2081             regstack->top--;
2082           }
2083       }
2084
2085   /* Now add to REGSTACK any outputs that the asm implicitly pushed.
2086      Note that there isn't any need to substitute register numbers.
2087      ???  Explain why this is true.  */
2088
2089   for (i = LAST_STACK_REG; i >= FIRST_STACK_REG; i--)
2090     {
2091       /* See if there is an output for this hard reg.  */
2092       int j;
2093
2094       for (j = 0; j < n_outputs; j++)
2095         if (STACK_REG_P (recog_data.operand[j])
2096             && REGNO (recog_data.operand[j]) == (unsigned) i)
2097           {
2098             regstack->reg[++regstack->top] = i;
2099             SET_HARD_REG_BIT (regstack->reg_set, i);
2100             break;
2101           }
2102     }
2103
2104   /* Now emit a pop insn for any REG_UNUSED output, or any REG_DEAD
2105      input that the asm didn't implicitly pop.  If the asm didn't
2106      implicitly pop an input reg, that reg will still be live.
2107
2108      Note that we can't use find_regno_note here: the register numbers
2109      in the death notes have already been substituted.  */
2110
2111   for (i = 0; i < n_outputs; i++)
2112     if (STACK_REG_P (recog_data.operand[i]))
2113       {
2114         int j;
2115
2116         for (j = 0; j < n_notes; j++)
2117           if (REGNO (recog_data.operand[i]) == REGNO (note_reg[j])
2118               && note_kind[j] == REG_UNUSED)
2119             {
2120               insn = emit_pop_insn (insn, regstack, recog_data.operand[i],
2121                                     EMIT_AFTER);
2122               break;
2123             }
2124       }
2125
2126   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2127     if (STACK_REG_P (recog_data.operand[i]))
2128       {
2129         int j;
2130
2131         for (j = 0; j < n_notes; j++)
2132           if (REGNO (recog_data.operand[i]) == REGNO (note_reg[j])
2133               && note_kind[j] == REG_DEAD
2134               && TEST_HARD_REG_BIT (regstack->reg_set,
2135                                     REGNO (recog_data.operand[i])))
2136             {
2137               insn = emit_pop_insn (insn, regstack, recog_data.operand[i],
2138                                     EMIT_AFTER);
2139               break;
2140             }
2141       }
2142 }
2143 \f
2144 /* Substitute stack hard reg numbers for stack virtual registers in
2145    INSN.  Non-stack register numbers are not changed.  REGSTACK is the
2146    current stack content.  Insns may be emitted as needed to arrange the
2147    stack for the 387 based on the contents of the insn.  */
2148
2149 static void
2150 subst_stack_regs (insn, regstack)
2151      rtx insn;
2152      stack regstack;
2153 {
2154   rtx *note_link, note;
2155   int i;
2156
2157   if (GET_CODE (insn) == CALL_INSN)
2158     {
2159       int top = regstack->top;
2160
2161       /* If there are any floating point parameters to be passed in
2162          registers for this call, make sure they are in the right
2163          order.  */
2164
2165       if (top >= 0)
2166         {
2167           straighten_stack (PREV_INSN (insn), regstack);
2168
2169           /* Now mark the arguments as dead after the call.  */
2170
2171           while (regstack->top >= 0)
2172             {
2173               CLEAR_HARD_REG_BIT (regstack->reg_set, FIRST_STACK_REG + regstack->top);
2174               regstack->top--;
2175             }
2176         }
2177     }
2178
2179   /* Do the actual substitution if any stack regs are mentioned.
2180      Since we only record whether entire insn mentions stack regs, and
2181      subst_stack_regs_pat only works for patterns that contain stack regs,
2182      we must check each pattern in a parallel here.  A call_value_pop could
2183      fail otherwise.  */
2184
2185   if (stack_regs_mentioned (insn))
2186     {
2187       int n_operands = asm_noperands (PATTERN (insn));
2188       if (n_operands >= 0)
2189         {
2190           /* This insn is an `asm' with operands.  Decode the operands,
2191              decide how many are inputs, and do register substitution.
2192              Any REG_UNUSED notes will be handled by subst_asm_stack_regs.  */
2193
2194           subst_asm_stack_regs (insn, regstack);
2195           return;
2196         }
2197
2198       if (GET_CODE (PATTERN (insn)) == PARALLEL)
2199         for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
2200           {
2201             if (stack_regs_mentioned_p (XVECEXP (PATTERN (insn), 0, i)))
2202               subst_stack_regs_pat (insn, regstack,
2203                                     XVECEXP (PATTERN (insn), 0, i));
2204           }
2205       else
2206         subst_stack_regs_pat (insn, regstack, PATTERN (insn));
2207     }
2208
2209   /* subst_stack_regs_pat may have deleted a no-op insn.  If so, any
2210      REG_UNUSED will already have been dealt with, so just return.  */
2211
2212   if (GET_CODE (insn) == NOTE || INSN_DELETED_P (insn))
2213     return;
2214
2215   /* If there is a REG_UNUSED note on a stack register on this insn,
2216      the indicated reg must be popped.  The REG_UNUSED note is removed,
2217      since the form of the newly emitted pop insn references the reg,
2218      making it no longer `unset'.  */
2219
2220   note_link = &REG_NOTES (insn);
2221   for (note = *note_link; note; note = XEXP (note, 1))
2222     if (REG_NOTE_KIND (note) == REG_UNUSED && STACK_REG_P (XEXP (note, 0)))
2223       {
2224         *note_link = XEXP (note, 1);
2225         insn = emit_pop_insn (insn, regstack, XEXP (note, 0), EMIT_AFTER);
2226       }
2227     else
2228       note_link = &XEXP (note, 1);
2229 }
2230 \f
2231 /* Change the organization of the stack so that it fits a new basic
2232    block.  Some registers might have to be popped, but there can never be
2233    a register live in the new block that is not now live.
2234
2235    Insert any needed insns before or after INSN, as indicated by
2236    WHERE.  OLD is the original stack layout, and NEW is the desired
2237    form.  OLD is updated to reflect the code emitted, ie, it will be
2238    the same as NEW upon return.
2239
2240    This function will not preserve block_end[].  But that information
2241    is no longer needed once this has executed.  */
2242
2243 static void
2244 change_stack (insn, old, new, where)
2245      rtx insn;
2246      stack old;
2247      stack new;
2248      enum emit_where where;
2249 {
2250   int reg;
2251   int update_end = 0;
2252
2253   /* We will be inserting new insns "backwards".  If we are to insert
2254      after INSN, find the next insn, and insert before it.  */
2255
2256   if (where == EMIT_AFTER)
2257     {
2258       if (current_block && current_block->end == insn)
2259         update_end = 1;
2260       insn = NEXT_INSN (insn);
2261     }
2262
2263   /* Pop any registers that are not needed in the new block.  */
2264
2265   for (reg = old->top; reg >= 0; reg--)
2266     if (! TEST_HARD_REG_BIT (new->reg_set, old->reg[reg]))
2267       emit_pop_insn (insn, old, FP_MODE_REG (old->reg[reg], DFmode),
2268                      EMIT_BEFORE);
2269
2270   if (new->top == -2)
2271     {
2272       /* If the new block has never been processed, then it can inherit
2273          the old stack order.  */
2274
2275       new->top = old->top;
2276       memcpy (new->reg, old->reg, sizeof (new->reg));
2277     }
2278   else
2279     {
2280       /* This block has been entered before, and we must match the
2281          previously selected stack order.  */
2282
2283       /* By now, the only difference should be the order of the stack,
2284          not their depth or liveliness.  */
2285
2286       GO_IF_HARD_REG_EQUAL (old->reg_set, new->reg_set, win);
2287       abort ();
2288     win:
2289       if (old->top != new->top)
2290         abort ();
2291
2292       /* If the stack is not empty (new->top != -1), loop here emitting
2293          swaps until the stack is correct.
2294
2295          The worst case number of swaps emitted is N + 2, where N is the
2296          depth of the stack.  In some cases, the reg at the top of
2297          stack may be correct, but swapped anyway in order to fix
2298          other regs.  But since we never swap any other reg away from
2299          its correct slot, this algorithm will converge.  */
2300
2301       if (new->top != -1)
2302         do
2303           {
2304             /* Swap the reg at top of stack into the position it is
2305                supposed to be in, until the correct top of stack appears.  */
2306
2307             while (old->reg[old->top] != new->reg[new->top])
2308               {
2309                 for (reg = new->top; reg >= 0; reg--)
2310                   if (new->reg[reg] == old->reg[old->top])
2311                     break;
2312
2313                 if (reg == -1)
2314                   abort ();
2315
2316                 emit_swap_insn (insn, old,
2317                                 FP_MODE_REG (old->reg[reg], DFmode));
2318               }
2319
2320             /* See if any regs remain incorrect.  If so, bring an
2321              incorrect reg to the top of stack, and let the while loop
2322              above fix it.  */
2323
2324             for (reg = new->top; reg >= 0; reg--)
2325               if (new->reg[reg] != old->reg[reg])
2326                 {
2327                   emit_swap_insn (insn, old,
2328                                   FP_MODE_REG (old->reg[reg], DFmode));
2329                   break;
2330                 }
2331           } while (reg >= 0);
2332
2333       /* At this point there must be no differences.  */
2334
2335       for (reg = old->top; reg >= 0; reg--)
2336         if (old->reg[reg] != new->reg[reg])
2337           abort ();
2338     }
2339
2340   if (update_end)
2341     current_block->end = PREV_INSN (insn);
2342 }
2343 \f
2344 /* Print stack configuration.  */
2345
2346 static void
2347 print_stack (file, s)
2348      FILE *file;
2349      stack s;
2350 {
2351   if (! file)
2352     return;
2353
2354   if (s->top == -2)
2355     fprintf (file, "uninitialized\n");
2356   else if (s->top == -1)
2357     fprintf (file, "empty\n");
2358   else
2359     {
2360       int i;
2361       fputs ("[ ", file);
2362       for (i = 0; i <= s->top; ++i)
2363         fprintf (file, "%d ", s->reg[i]);
2364       fputs ("]\n", file);
2365     }
2366 }
2367 \f
2368 /* This function was doing life analysis.  We now let the regular live
2369    code do it's job, so we only need to check some extra invariants
2370    that reg-stack expects.  Primary among these being that all registers
2371    are initialized before use.
2372
2373    The function returns true when code was emitted to CFG edges and
2374    commit_edge_insertions needs to be called.  */
2375
2376 static int
2377 convert_regs_entry ()
2378 {
2379   int inserted = 0;
2380   edge e;
2381   basic_block block;
2382
2383   FOR_EACH_BB_REVERSE (block)
2384     {
2385       block_info bi = BLOCK_INFO (block);
2386       int reg;
2387
2388       /* Set current register status at last instruction `uninitialized'.  */
2389       bi->stack_in.top = -2;
2390
2391       /* Copy live_at_end and live_at_start into temporaries.  */
2392       for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; reg++)
2393         {
2394           if (REGNO_REG_SET_P (block->global_live_at_end, reg))
2395             SET_HARD_REG_BIT (bi->out_reg_set, reg);
2396           if (REGNO_REG_SET_P (block->global_live_at_start, reg))
2397             SET_HARD_REG_BIT (bi->stack_in.reg_set, reg);
2398         }
2399     }
2400
2401   /* Load something into each stack register live at function entry.
2402      Such live registers can be caused by uninitialized variables or
2403      functions not returning values on all paths.  In order to keep
2404      the push/pop code happy, and to not scrog the register stack, we
2405      must put something in these registers.  Use a QNaN.
2406
2407      Note that we are insertting converted code here.  This code is
2408      never seen by the convert_regs pass.  */
2409
2410   for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2411     {
2412       basic_block block = e->dest;
2413       block_info bi = BLOCK_INFO (block);
2414       int reg, top = -1;
2415
2416       for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
2417         if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
2418           {
2419             rtx init;
2420
2421             bi->stack_in.reg[++top] = reg;
2422
2423             init = gen_rtx_SET (VOIDmode,
2424                                 FP_MODE_REG (FIRST_STACK_REG, SFmode),
2425                                 nan);
2426             insert_insn_on_edge (init, e);
2427             inserted = 1;
2428           }
2429
2430       bi->stack_in.top = top;
2431     }
2432
2433   return inserted;
2434 }
2435
2436 /* Construct the desired stack for function exit.  This will either
2437    be `empty', or the function return value at top-of-stack.  */
2438
2439 static void
2440 convert_regs_exit ()
2441 {
2442   int value_reg_low, value_reg_high;
2443   stack output_stack;
2444   rtx retvalue;
2445
2446   retvalue = stack_result (current_function_decl);
2447   value_reg_low = value_reg_high = -1;
2448   if (retvalue)
2449     {
2450       value_reg_low = REGNO (retvalue);
2451       value_reg_high = value_reg_low
2452         + HARD_REGNO_NREGS (value_reg_low, GET_MODE (retvalue)) - 1;
2453     }
2454
2455   output_stack = &BLOCK_INFO (EXIT_BLOCK_PTR)->stack_in;
2456   if (value_reg_low == -1)
2457     output_stack->top = -1;
2458   else
2459     {
2460       int reg;
2461
2462       output_stack->top = value_reg_high - value_reg_low;
2463       for (reg = value_reg_low; reg <= value_reg_high; ++reg)
2464         {
2465           output_stack->reg[value_reg_high - reg] = reg;
2466           SET_HARD_REG_BIT (output_stack->reg_set, reg);
2467         }
2468     }
2469 }
2470
2471 /* Adjust the stack of this block on exit to match the stack of the
2472    target block, or copy stack info into the stack of the successor
2473    of the successor hasn't been processed yet.  */
2474 static bool
2475 compensate_edge (e, file)
2476     edge e;
2477     FILE *file;
2478 {
2479   basic_block block = e->src, target = e->dest;
2480   block_info bi = BLOCK_INFO (block);
2481   struct stack_def regstack, tmpstack;
2482   stack target_stack = &BLOCK_INFO (target)->stack_in;
2483   int reg;
2484
2485   current_block = block;
2486   regstack = bi->stack_out;
2487   if (file)
2488     fprintf (file, "Edge %d->%d: ", block->index, target->index);
2489
2490   if (target_stack->top == -2)
2491     {
2492       /* The target block hasn't had a stack order selected.
2493          We need merely ensure that no pops are needed.  */
2494       for (reg = regstack.top; reg >= 0; --reg)
2495         if (!TEST_HARD_REG_BIT (target_stack->reg_set, regstack.reg[reg]))
2496           break;
2497
2498       if (reg == -1)
2499         {
2500           if (file)
2501             fprintf (file, "new block; copying stack position\n");
2502
2503           /* change_stack kills values in regstack.  */
2504           tmpstack = regstack;
2505
2506           change_stack (block->end, &tmpstack, target_stack, EMIT_AFTER);
2507           return false;
2508         }
2509
2510       if (file)
2511         fprintf (file, "new block; pops needed\n");
2512     }
2513   else
2514     {
2515       if (target_stack->top == regstack.top)
2516         {
2517           for (reg = target_stack->top; reg >= 0; --reg)
2518             if (target_stack->reg[reg] != regstack.reg[reg])
2519               break;
2520
2521           if (reg == -1)
2522             {
2523               if (file)
2524                 fprintf (file, "no changes needed\n");
2525               return false;
2526             }
2527         }
2528
2529       if (file)
2530         {
2531           fprintf (file, "correcting stack to ");
2532           print_stack (file, target_stack);
2533         }
2534     }
2535
2536   /* Care for non-call EH edges specially.  The normal return path have
2537      values in registers.  These will be popped en masse by the unwind
2538      library.  */
2539   if ((e->flags & (EDGE_EH | EDGE_ABNORMAL_CALL)) == EDGE_EH)
2540     target_stack->top = -1;
2541
2542   /* Other calls may appear to have values live in st(0), but the
2543      abnormal return path will not have actually loaded the values.  */
2544   else if (e->flags & EDGE_ABNORMAL_CALL)
2545     {
2546       /* Assert that the lifetimes are as we expect -- one value
2547          live at st(0) on the end of the source block, and no
2548          values live at the beginning of the destination block.  */
2549       HARD_REG_SET tmp;
2550
2551       CLEAR_HARD_REG_SET (tmp);
2552       GO_IF_HARD_REG_EQUAL (target_stack->reg_set, tmp, eh1);
2553       abort ();
2554     eh1:
2555
2556       SET_HARD_REG_BIT (tmp, FIRST_STACK_REG);
2557       GO_IF_HARD_REG_EQUAL (regstack.reg_set, tmp, eh2);
2558       abort ();
2559     eh2:
2560
2561       target_stack->top = -1;
2562     }
2563
2564   /* It is better to output directly to the end of the block
2565      instead of to the edge, because emit_swap can do minimal
2566      insn scheduling.  We can do this when there is only one
2567      edge out, and it is not abnormal.  */
2568   else if (block->succ->succ_next == NULL && !(e->flags & EDGE_ABNORMAL))
2569     {
2570       /* change_stack kills values in regstack.  */
2571       tmpstack = regstack;
2572
2573       change_stack (block->end, &tmpstack, target_stack,
2574                     (GET_CODE (block->end) == JUMP_INSN
2575                      ? EMIT_BEFORE : EMIT_AFTER));
2576     }
2577   else
2578     {
2579       rtx seq, after;
2580
2581       /* We don't support abnormal edges.  Global takes care to
2582          avoid any live register across them, so we should never
2583          have to insert instructions on such edges.  */
2584       if (e->flags & EDGE_ABNORMAL)
2585         abort ();
2586
2587       current_block = NULL;
2588       start_sequence ();
2589
2590       /* ??? change_stack needs some point to emit insns after.  */
2591       after = emit_note (NULL, NOTE_INSN_DELETED);
2592
2593       tmpstack = regstack;
2594       change_stack (after, &tmpstack, target_stack, EMIT_BEFORE);
2595
2596       seq = get_insns ();
2597       end_sequence ();
2598
2599       insert_insn_on_edge (seq, e);
2600       return true;
2601     }
2602   return false;
2603 }
2604
2605 /* Convert stack register references in one block.  */
2606
2607 static int
2608 convert_regs_1 (file, block)
2609      FILE *file;
2610      basic_block block;
2611 {
2612   struct stack_def regstack;
2613   block_info bi = BLOCK_INFO (block);
2614   int inserted, reg;
2615   rtx insn, next;
2616   edge e, beste = NULL;
2617
2618   inserted = 0;
2619
2620   /* Find the edge we will copy stack from.  It should be the most frequent
2621      one as it will get cheapest after compensation code is generated,
2622      if multiple such exists, take one with largest count, prefer critical
2623      one (as splitting critical edges is more expensive), or one with lowest
2624      index, to avoid random changes with different orders of the edges.  */
2625   for (e = block->pred; e ; e = e->pred_next)
2626     {
2627       if (e->flags & EDGE_DFS_BACK)
2628         ;
2629       else if (! beste)
2630         beste = e;
2631       else if (EDGE_FREQUENCY (beste) < EDGE_FREQUENCY (e))
2632         beste = e;
2633       else if (EDGE_FREQUENCY (beste) > EDGE_FREQUENCY (e))
2634         ;
2635       else if (beste->count < e->count)
2636         beste = e;
2637       else if (beste->count > e->count)
2638         ;
2639       else if ((EDGE_CRITICAL_P (e) != 0)
2640                != (EDGE_CRITICAL_P (beste) != 0))
2641         {
2642           if (EDGE_CRITICAL_P (e))
2643             beste = e;
2644         }
2645       else if (e->src->index < beste->src->index)
2646         beste = e;
2647     }
2648
2649   /* Entry block does have stack already initialized.  */
2650   if (bi->stack_in.top == -2)
2651     inserted |= compensate_edge (beste, file);
2652   else
2653     beste = NULL;
2654
2655   current_block = block;
2656
2657   if (file)
2658     {
2659       fprintf (file, "\nBasic block %d\nInput stack: ", block->index);
2660       print_stack (file, &bi->stack_in);
2661     }
2662
2663   /* Process all insns in this block.  Keep track of NEXT so that we
2664      don't process insns emitted while substituting in INSN.  */
2665   next = block->head;
2666   regstack = bi->stack_in;
2667   do
2668     {
2669       insn = next;
2670       next = NEXT_INSN (insn);
2671
2672       /* Ensure we have not missed a block boundary.  */
2673       if (next == NULL)
2674         abort ();
2675       if (insn == block->end)
2676         next = NULL;
2677
2678       /* Don't bother processing unless there is a stack reg
2679          mentioned or if it's a CALL_INSN.  */
2680       if (stack_regs_mentioned (insn)
2681           || GET_CODE (insn) == CALL_INSN)
2682         {
2683           if (file)
2684             {
2685               fprintf (file, "  insn %d input stack: ",
2686                        INSN_UID (insn));
2687               print_stack (file, &regstack);
2688             }
2689           subst_stack_regs (insn, &regstack);
2690         }
2691     }
2692   while (next);
2693
2694   if (file)
2695     {
2696       fprintf (file, "Expected live registers [");
2697       for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; ++reg)
2698         if (TEST_HARD_REG_BIT (bi->out_reg_set, reg))
2699           fprintf (file, " %d", reg);
2700       fprintf (file, " ]\nOutput stack: ");
2701       print_stack (file, &regstack);
2702     }
2703
2704   insn = block->end;
2705   if (GET_CODE (insn) == JUMP_INSN)
2706     insn = PREV_INSN (insn);
2707
2708   /* If the function is declared to return a value, but it returns one
2709      in only some cases, some registers might come live here.  Emit
2710      necessary moves for them.  */
2711
2712   for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; ++reg)
2713     {
2714       if (TEST_HARD_REG_BIT (bi->out_reg_set, reg)
2715           && ! TEST_HARD_REG_BIT (regstack.reg_set, reg))
2716         {
2717           rtx set;
2718
2719           if (file)
2720             {
2721               fprintf (file, "Emitting insn initializing reg %d\n",
2722                        reg);
2723             }
2724
2725           set = gen_rtx_SET (VOIDmode, FP_MODE_REG (reg, SFmode),
2726                              nan);
2727           insn = emit_insn_after (set, insn);
2728           subst_stack_regs (insn, &regstack);
2729         }
2730     }
2731
2732   /* Something failed if the stack lives don't match.  */
2733   GO_IF_HARD_REG_EQUAL (regstack.reg_set, bi->out_reg_set, win);
2734   abort ();
2735  win:
2736   bi->stack_out = regstack;
2737
2738   /* Compensate the back edges, as those wasn't visited yet.  */
2739   for (e = block->succ; e ; e = e->succ_next)
2740     {
2741       if (e->flags & EDGE_DFS_BACK
2742           || (e->dest == EXIT_BLOCK_PTR))
2743         {
2744           if (!BLOCK_INFO (e->dest)->done
2745               && e->dest != block)
2746             abort ();
2747           inserted |= compensate_edge (e, file);
2748         }
2749     }
2750   for (e = block->pred; e ; e = e->pred_next)
2751     {
2752       if (e != beste && !(e->flags & EDGE_DFS_BACK)
2753           && e->src != ENTRY_BLOCK_PTR)
2754         {
2755           if (!BLOCK_INFO (e->src)->done)
2756             abort ();
2757           inserted |= compensate_edge (e, file);
2758         }
2759     }
2760
2761   return inserted;
2762 }
2763
2764 /* Convert registers in all blocks reachable from BLOCK.  */
2765
2766 static int
2767 convert_regs_2 (file, block)
2768      FILE *file;
2769      basic_block block;
2770 {
2771   basic_block *stack, *sp;
2772   int inserted;
2773
2774   stack = (basic_block *) xmalloc (sizeof (*stack) * n_basic_blocks);
2775   sp = stack;
2776
2777   *sp++ = block;
2778
2779   inserted = 0;
2780   do
2781     {
2782       edge e;
2783
2784       block = *--sp;
2785       inserted |= convert_regs_1 (file, block);
2786       BLOCK_INFO (block)->done = 1;
2787
2788       for (e = block->succ; e ; e = e->succ_next)
2789         if (! (e->flags & EDGE_DFS_BACK))
2790           {
2791             BLOCK_INFO (e->dest)->predecessors--;
2792             if (!BLOCK_INFO (e->dest)->predecessors)
2793                *sp++ = e->dest;
2794           }
2795     }
2796   while (sp != stack);
2797
2798   return inserted;
2799 }
2800
2801 /* Traverse all basic blocks in a function, converting the register
2802    references in each insn from the "flat" register file that gcc uses,
2803    to the stack-like registers the 387 uses.  */
2804
2805 static int
2806 convert_regs (file)
2807      FILE *file;
2808 {
2809   int inserted;
2810   basic_block b;
2811   edge e;
2812
2813   /* Initialize uninitialized registers on function entry.  */
2814   inserted = convert_regs_entry ();
2815
2816   /* Construct the desired stack for function exit.  */
2817   convert_regs_exit ();
2818   BLOCK_INFO (EXIT_BLOCK_PTR)->done = 1;
2819
2820   /* ??? Future: process inner loops first, and give them arbitrary
2821      initial stacks which emit_swap_insn can modify.  This ought to
2822      prevent double fxch that aften appears at the head of a loop.  */
2823
2824   /* Process all blocks reachable from all entry points.  */
2825   for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2826     inserted |= convert_regs_2 (file, e->dest);
2827
2828   /* ??? Process all unreachable blocks.  Though there's no excuse
2829      for keeping these even when not optimizing.  */
2830   FOR_EACH_BB (b)
2831     {
2832       block_info bi = BLOCK_INFO (b);
2833
2834       if (! bi->done)
2835         {
2836           int reg;
2837
2838           /* Create an arbitrary input stack.  */
2839           bi->stack_in.top = -1;
2840           for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
2841             if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
2842               bi->stack_in.reg[++bi->stack_in.top] = reg;
2843
2844           inserted |= convert_regs_2 (file, b);
2845         }
2846     }
2847
2848   fixup_abnormal_edges ();
2849   if (inserted)
2850     commit_edge_insertions ();
2851
2852   if (file)
2853     fputc ('\n', file);
2854
2855   return inserted;
2856 }
2857 #endif /* STACK_REGS */
2858
2859 #include "gt-reg-stack.h"