OSDN Git Service

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