OSDN Git Service

PR c++/9623
[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, 1999,
3    2000, 2001, 2002, 2003 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 inserting 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   /* Enforce 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 matching 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_FPATAN:
1730                 /* These insns operate on the top two stack slots.  */
1731
1732                 src1 = get_true_reg (&XVECEXP (pat_src, 0, 0));
1733                 src2 = get_true_reg (&XVECEXP (pat_src, 0, 1));
1734
1735                 src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1736                 src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1737
1738                 {
1739                   struct stack_def temp_stack;
1740                   int regno, j, k, temp;
1741
1742                   temp_stack = *regstack;
1743
1744                   /* Place operand 1 at the top of stack.  */
1745                   regno = get_hard_regnum (&temp_stack, *src1);
1746                   if (regno < 0)
1747                     abort ();
1748                   if (regno != FIRST_STACK_REG)
1749                     {
1750                       k = temp_stack.top - (regno - FIRST_STACK_REG);
1751                       j = temp_stack.top;
1752
1753                       temp = temp_stack.reg[k];
1754                       temp_stack.reg[k] = temp_stack.reg[j];
1755                       temp_stack.reg[j] = temp;
1756                     }
1757
1758                   /* Place operand 2 next on the stack.  */
1759                   regno = get_hard_regnum (&temp_stack, *src2);
1760                   if (regno < 0)
1761                     abort ();
1762                   if (regno != FIRST_STACK_REG + 1)
1763                     {
1764                       k = temp_stack.top - (regno - FIRST_STACK_REG);
1765                       j = temp_stack.top - 1;
1766
1767                       temp = temp_stack.reg[k];
1768                       temp_stack.reg[k] = temp_stack.reg[j];
1769                       temp_stack.reg[j] = temp;
1770                     }
1771
1772                   change_stack (insn, regstack, &temp_stack, EMIT_BEFORE);
1773                 }
1774
1775                 replace_reg (src1, FIRST_STACK_REG);
1776                 replace_reg (src2, FIRST_STACK_REG + 1);
1777
1778                 if (src1_note)
1779                   replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1780                 if (src2_note)
1781                   replace_reg (&XEXP (src2_note, 0), FIRST_STACK_REG + 1);
1782
1783                 /* Pop both input operands from the stack.  */
1784                 CLEAR_HARD_REG_BIT (regstack->reg_set,
1785                                     regstack->reg[regstack->top]);
1786                 CLEAR_HARD_REG_BIT (regstack->reg_set,
1787                                     regstack->reg[regstack->top - 1]);
1788                 regstack->top -= 2;
1789
1790                 /* Push the result back onto the stack.  */
1791                 regstack->reg[++regstack->top] = REGNO (*dest);
1792                 SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1793                 replace_reg (dest, FIRST_STACK_REG);
1794                 break;
1795
1796               case UNSPEC_SAHF:
1797                 /* (unspec [(unspec [(compare)] UNSPEC_FNSTSW)] UNSPEC_SAHF)
1798                    The combination matches the PPRO fcomi instruction.  */
1799
1800                 pat_src = XVECEXP (pat_src, 0, 0);
1801                 if (GET_CODE (pat_src) != UNSPEC
1802                     || XINT (pat_src, 1) != UNSPEC_FNSTSW)
1803                   abort ();
1804                 /* FALLTHRU */
1805
1806               case UNSPEC_FNSTSW:
1807                 /* Combined fcomp+fnstsw generated for doing well with
1808                    CSE.  When optimizing this would have been broken
1809                    up before now.  */
1810
1811                 pat_src = XVECEXP (pat_src, 0, 0);
1812                 if (GET_CODE (pat_src) != COMPARE)
1813                   abort ();
1814
1815                 compare_for_stack_reg (insn, regstack, pat_src);
1816                 break;
1817
1818               default:
1819                 abort ();
1820               }
1821             break;
1822
1823           case IF_THEN_ELSE:
1824             /* This insn requires the top of stack to be the destination.  */
1825
1826             src1 = get_true_reg (&XEXP (pat_src, 1));
1827             src2 = get_true_reg (&XEXP (pat_src, 2));
1828
1829             src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1830             src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1831
1832             /* If the comparison operator is an FP comparison operator,
1833                it is handled correctly by compare_for_stack_reg () who
1834                will move the destination to the top of stack. But if the
1835                comparison operator is not an FP comparison operator, we
1836                have to handle it here.  */
1837             if (get_hard_regnum (regstack, *dest) >= FIRST_STACK_REG
1838                 && REGNO (*dest) != regstack->reg[regstack->top])
1839               {
1840                 /* In case one of operands is the top of stack and the operands
1841                    dies, it is safe to make it the destination operand by
1842                    reversing the direction of cmove and avoid fxch.  */
1843                 if ((REGNO (*src1) == regstack->reg[regstack->top]
1844                      && src1_note)
1845                     || (REGNO (*src2) == regstack->reg[regstack->top]
1846                         && src2_note))
1847                   {
1848                     int idx1 = (get_hard_regnum (regstack, *src1)
1849                                 - FIRST_STACK_REG);
1850                     int idx2 = (get_hard_regnum (regstack, *src2)
1851                                 - FIRST_STACK_REG);
1852
1853                     /* Make reg-stack believe that the operands are already
1854                        swapped on the stack */
1855                     regstack->reg[regstack->top - idx1] = REGNO (*src2);
1856                     regstack->reg[regstack->top - idx2] = REGNO (*src1);
1857
1858                     /* Reverse condition to compensate the operand swap.
1859                        i386 do have comparison always reversible.  */
1860                     PUT_CODE (XEXP (pat_src, 0),
1861                               reversed_comparison_code (XEXP (pat_src, 0), insn));
1862                   }
1863                 else
1864                   emit_swap_insn (insn, regstack, *dest);
1865               }
1866
1867             {
1868               rtx src_note [3];
1869               int i;
1870
1871               src_note[0] = 0;
1872               src_note[1] = src1_note;
1873               src_note[2] = src2_note;
1874
1875               if (STACK_REG_P (*src1))
1876                 replace_reg (src1, get_hard_regnum (regstack, *src1));
1877               if (STACK_REG_P (*src2))
1878                 replace_reg (src2, get_hard_regnum (regstack, *src2));
1879
1880               for (i = 1; i <= 2; i++)
1881                 if (src_note [i])
1882                   {
1883                     int regno = REGNO (XEXP (src_note[i], 0));
1884
1885                     /* If the register that dies is not at the top of
1886                        stack, then move the top of stack to the dead reg */
1887                     if (regno != regstack->reg[regstack->top])
1888                       {
1889                         remove_regno_note (insn, REG_DEAD, regno);
1890                         emit_pop_insn (insn, regstack, XEXP (src_note[i], 0),
1891                                        EMIT_AFTER);
1892                       }
1893                     else
1894                       /* Top of stack never dies, as it is the
1895                          destination.  */
1896                       abort ();
1897                   }
1898             }
1899
1900             /* Make dest the top of stack.  Add dest to regstack if
1901                not present.  */
1902             if (get_hard_regnum (regstack, *dest) < FIRST_STACK_REG)
1903               regstack->reg[++regstack->top] = REGNO (*dest);
1904             SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1905             replace_reg (dest, FIRST_STACK_REG);
1906             break;
1907
1908           default:
1909             abort ();
1910           }
1911         break;
1912       }
1913
1914     default:
1915       break;
1916     }
1917 }
1918 \f
1919 /* Substitute hard regnums for any stack regs in INSN, which has
1920    N_INPUTS inputs and N_OUTPUTS outputs.  REGSTACK is the stack info
1921    before the insn, and is updated with changes made here.
1922
1923    There are several requirements and assumptions about the use of
1924    stack-like regs in asm statements.  These rules are enforced by
1925    record_asm_stack_regs; see comments there for details.  Any
1926    asm_operands left in the RTL at this point may be assume to meet the
1927    requirements, since record_asm_stack_regs removes any problem asm.  */
1928
1929 static void
1930 subst_asm_stack_regs (insn, regstack)
1931      rtx insn;
1932      stack regstack;
1933 {
1934   rtx body = PATTERN (insn);
1935   int alt;
1936
1937   rtx *note_reg;                /* Array of note contents */
1938   rtx **note_loc;               /* Address of REG field of each note */
1939   enum reg_note *note_kind;     /* The type of each note */
1940
1941   rtx *clobber_reg = 0;
1942   rtx **clobber_loc = 0;
1943
1944   struct stack_def temp_stack;
1945   int n_notes;
1946   int n_clobbers;
1947   rtx note;
1948   int i;
1949   int n_inputs, n_outputs;
1950
1951   if (! check_asm_stack_operands (insn))
1952     return;
1953
1954   /* Find out what the constraints required.  If no constraint
1955      alternative matches, that is a compiler bug: we should have caught
1956      such an insn in check_asm_stack_operands.  */
1957   extract_insn (insn);
1958   constrain_operands (1);
1959   alt = which_alternative;
1960
1961   preprocess_constraints ();
1962
1963   n_inputs = get_asm_operand_n_inputs (body);
1964   n_outputs = recog_data.n_operands - n_inputs;
1965
1966   if (alt < 0)
1967     abort ();
1968
1969   /* Strip SUBREGs here to make the following code simpler.  */
1970   for (i = 0; i < recog_data.n_operands; i++)
1971     if (GET_CODE (recog_data.operand[i]) == SUBREG
1972         && GET_CODE (SUBREG_REG (recog_data.operand[i])) == REG)
1973       {
1974         recog_data.operand_loc[i] = & SUBREG_REG (recog_data.operand[i]);
1975         recog_data.operand[i] = SUBREG_REG (recog_data.operand[i]);
1976       }
1977
1978   /* Set up NOTE_REG, NOTE_LOC and NOTE_KIND.  */
1979
1980   for (i = 0, note = REG_NOTES (insn); note; note = XEXP (note, 1))
1981     i++;
1982
1983   note_reg = (rtx *) alloca (i * sizeof (rtx));
1984   note_loc = (rtx **) alloca (i * sizeof (rtx *));
1985   note_kind = (enum reg_note *) alloca (i * sizeof (enum reg_note));
1986
1987   n_notes = 0;
1988   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1989     {
1990       rtx reg = XEXP (note, 0);
1991       rtx *loc = & XEXP (note, 0);
1992
1993       if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
1994         {
1995           loc = & SUBREG_REG (reg);
1996           reg = SUBREG_REG (reg);
1997         }
1998
1999       if (STACK_REG_P (reg)
2000           && (REG_NOTE_KIND (note) == REG_DEAD
2001               || REG_NOTE_KIND (note) == REG_UNUSED))
2002         {
2003           note_reg[n_notes] = reg;
2004           note_loc[n_notes] = loc;
2005           note_kind[n_notes] = REG_NOTE_KIND (note);
2006           n_notes++;
2007         }
2008     }
2009
2010   /* Set up CLOBBER_REG and CLOBBER_LOC.  */
2011
2012   n_clobbers = 0;
2013
2014   if (GET_CODE (body) == PARALLEL)
2015     {
2016       clobber_reg = (rtx *) alloca (XVECLEN (body, 0) * sizeof (rtx));
2017       clobber_loc = (rtx **) alloca (XVECLEN (body, 0) * sizeof (rtx *));
2018
2019       for (i = 0; i < XVECLEN (body, 0); i++)
2020         if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
2021           {
2022             rtx clobber = XVECEXP (body, 0, i);
2023             rtx reg = XEXP (clobber, 0);
2024             rtx *loc = & XEXP (clobber, 0);
2025
2026             if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
2027               {
2028                 loc = & SUBREG_REG (reg);
2029                 reg = SUBREG_REG (reg);
2030               }
2031
2032             if (STACK_REG_P (reg))
2033               {
2034                 clobber_reg[n_clobbers] = reg;
2035                 clobber_loc[n_clobbers] = loc;
2036                 n_clobbers++;
2037               }
2038           }
2039     }
2040
2041   temp_stack = *regstack;
2042
2043   /* Put the input regs into the desired place in TEMP_STACK.  */
2044
2045   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2046     if (STACK_REG_P (recog_data.operand[i])
2047         && reg_class_subset_p (recog_op_alt[i][alt].class,
2048                                FLOAT_REGS)
2049         && recog_op_alt[i][alt].class != FLOAT_REGS)
2050       {
2051         /* If an operand needs to be in a particular reg in
2052            FLOAT_REGS, the constraint was either 't' or 'u'.  Since
2053            these constraints are for single register classes, and
2054            reload guaranteed that operand[i] is already in that class,
2055            we can just use REGNO (recog_data.operand[i]) to know which
2056            actual reg this operand needs to be in.  */
2057
2058         int regno = get_hard_regnum (&temp_stack, recog_data.operand[i]);
2059
2060         if (regno < 0)
2061           abort ();
2062
2063         if ((unsigned int) regno != REGNO (recog_data.operand[i]))
2064           {
2065             /* recog_data.operand[i] is not in the right place.  Find
2066                it and swap it with whatever is already in I's place.
2067                K is where recog_data.operand[i] is now.  J is where it
2068                should be.  */
2069             int j, k, temp;
2070
2071             k = temp_stack.top - (regno - FIRST_STACK_REG);
2072             j = (temp_stack.top
2073                  - (REGNO (recog_data.operand[i]) - FIRST_STACK_REG));
2074
2075             temp = temp_stack.reg[k];
2076             temp_stack.reg[k] = temp_stack.reg[j];
2077             temp_stack.reg[j] = temp;
2078           }
2079       }
2080
2081   /* Emit insns before INSN to make sure the reg-stack is in the right
2082      order.  */
2083
2084   change_stack (insn, regstack, &temp_stack, EMIT_BEFORE);
2085
2086   /* Make the needed input register substitutions.  Do death notes and
2087      clobbers too, because these are for inputs, not outputs.  */
2088
2089   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2090     if (STACK_REG_P (recog_data.operand[i]))
2091       {
2092         int regnum = get_hard_regnum (regstack, recog_data.operand[i]);
2093
2094         if (regnum < 0)
2095           abort ();
2096
2097         replace_reg (recog_data.operand_loc[i], regnum);
2098       }
2099
2100   for (i = 0; i < n_notes; i++)
2101     if (note_kind[i] == REG_DEAD)
2102       {
2103         int regnum = get_hard_regnum (regstack, note_reg[i]);
2104
2105         if (regnum < 0)
2106           abort ();
2107
2108         replace_reg (note_loc[i], regnum);
2109       }
2110
2111   for (i = 0; i < n_clobbers; i++)
2112     {
2113       /* It's OK for a CLOBBER to reference a reg that is not live.
2114          Don't try to replace it in that case.  */
2115       int regnum = get_hard_regnum (regstack, clobber_reg[i]);
2116
2117       if (regnum >= 0)
2118         {
2119           /* Sigh - clobbers always have QImode.  But replace_reg knows
2120              that these regs can't be MODE_INT and will abort.  Just put
2121              the right reg there without calling replace_reg.  */
2122
2123           *clobber_loc[i] = FP_MODE_REG (regnum, DFmode);
2124         }
2125     }
2126
2127   /* Now remove from REGSTACK any inputs that the asm implicitly popped.  */
2128
2129   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2130     if (STACK_REG_P (recog_data.operand[i]))
2131       {
2132         /* An input reg is implicitly popped if it is tied to an
2133            output, or if there is a CLOBBER for it.  */
2134         int j;
2135
2136         for (j = 0; j < n_clobbers; j++)
2137           if (operands_match_p (clobber_reg[j], recog_data.operand[i]))
2138             break;
2139
2140         if (j < n_clobbers || recog_op_alt[i][alt].matches >= 0)
2141           {
2142             /* recog_data.operand[i] might not be at the top of stack.
2143                But that's OK, because all we need to do is pop the
2144                right number of regs off of the top of the reg-stack.
2145                record_asm_stack_regs guaranteed that all implicitly
2146                popped regs were grouped at the top of the reg-stack.  */
2147
2148             CLEAR_HARD_REG_BIT (regstack->reg_set,
2149                                 regstack->reg[regstack->top]);
2150             regstack->top--;
2151           }
2152       }
2153
2154   /* Now add to REGSTACK any outputs that the asm implicitly pushed.
2155      Note that there isn't any need to substitute register numbers.
2156      ???  Explain why this is true.  */
2157
2158   for (i = LAST_STACK_REG; i >= FIRST_STACK_REG; i--)
2159     {
2160       /* See if there is an output for this hard reg.  */
2161       int j;
2162
2163       for (j = 0; j < n_outputs; j++)
2164         if (STACK_REG_P (recog_data.operand[j])
2165             && REGNO (recog_data.operand[j]) == (unsigned) i)
2166           {
2167             regstack->reg[++regstack->top] = i;
2168             SET_HARD_REG_BIT (regstack->reg_set, i);
2169             break;
2170           }
2171     }
2172
2173   /* Now emit a pop insn for any REG_UNUSED output, or any REG_DEAD
2174      input that the asm didn't implicitly pop.  If the asm didn't
2175      implicitly pop an input reg, that reg will still be live.
2176
2177      Note that we can't use find_regno_note here: the register numbers
2178      in the death notes have already been substituted.  */
2179
2180   for (i = 0; i < n_outputs; i++)
2181     if (STACK_REG_P (recog_data.operand[i]))
2182       {
2183         int j;
2184
2185         for (j = 0; j < n_notes; j++)
2186           if (REGNO (recog_data.operand[i]) == REGNO (note_reg[j])
2187               && note_kind[j] == REG_UNUSED)
2188             {
2189               insn = emit_pop_insn (insn, regstack, recog_data.operand[i],
2190                                     EMIT_AFTER);
2191               break;
2192             }
2193       }
2194
2195   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2196     if (STACK_REG_P (recog_data.operand[i]))
2197       {
2198         int j;
2199
2200         for (j = 0; j < n_notes; j++)
2201           if (REGNO (recog_data.operand[i]) == REGNO (note_reg[j])
2202               && note_kind[j] == REG_DEAD
2203               && TEST_HARD_REG_BIT (regstack->reg_set,
2204                                     REGNO (recog_data.operand[i])))
2205             {
2206               insn = emit_pop_insn (insn, regstack, recog_data.operand[i],
2207                                     EMIT_AFTER);
2208               break;
2209             }
2210       }
2211 }
2212 \f
2213 /* Substitute stack hard reg numbers for stack virtual registers in
2214    INSN.  Non-stack register numbers are not changed.  REGSTACK is the
2215    current stack content.  Insns may be emitted as needed to arrange the
2216    stack for the 387 based on the contents of the insn.  */
2217
2218 static void
2219 subst_stack_regs (insn, regstack)
2220      rtx insn;
2221      stack regstack;
2222 {
2223   rtx *note_link, note;
2224   int i;
2225
2226   if (GET_CODE (insn) == CALL_INSN)
2227     {
2228       int top = regstack->top;
2229
2230       /* If there are any floating point parameters to be passed in
2231          registers for this call, make sure they are in the right
2232          order.  */
2233
2234       if (top >= 0)
2235         {
2236           straighten_stack (PREV_INSN (insn), regstack);
2237
2238           /* Now mark the arguments as dead after the call.  */
2239
2240           while (regstack->top >= 0)
2241             {
2242               CLEAR_HARD_REG_BIT (regstack->reg_set, FIRST_STACK_REG + regstack->top);
2243               regstack->top--;
2244             }
2245         }
2246     }
2247
2248   /* Do the actual substitution if any stack regs are mentioned.
2249      Since we only record whether entire insn mentions stack regs, and
2250      subst_stack_regs_pat only works for patterns that contain stack regs,
2251      we must check each pattern in a parallel here.  A call_value_pop could
2252      fail otherwise.  */
2253
2254   if (stack_regs_mentioned (insn))
2255     {
2256       int n_operands = asm_noperands (PATTERN (insn));
2257       if (n_operands >= 0)
2258         {
2259           /* This insn is an `asm' with operands.  Decode the operands,
2260              decide how many are inputs, and do register substitution.
2261              Any REG_UNUSED notes will be handled by subst_asm_stack_regs.  */
2262
2263           subst_asm_stack_regs (insn, regstack);
2264           return;
2265         }
2266
2267       if (GET_CODE (PATTERN (insn)) == PARALLEL)
2268         for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
2269           {
2270             if (stack_regs_mentioned_p (XVECEXP (PATTERN (insn), 0, i)))
2271               subst_stack_regs_pat (insn, regstack,
2272                                     XVECEXP (PATTERN (insn), 0, i));
2273           }
2274       else
2275         subst_stack_regs_pat (insn, regstack, PATTERN (insn));
2276     }
2277
2278   /* subst_stack_regs_pat may have deleted a no-op insn.  If so, any
2279      REG_UNUSED will already have been dealt with, so just return.  */
2280
2281   if (GET_CODE (insn) == NOTE || INSN_DELETED_P (insn))
2282     return;
2283
2284   /* If there is a REG_UNUSED note on a stack register on this insn,
2285      the indicated reg must be popped.  The REG_UNUSED note is removed,
2286      since the form of the newly emitted pop insn references the reg,
2287      making it no longer `unset'.  */
2288
2289   note_link = &REG_NOTES (insn);
2290   for (note = *note_link; note; note = XEXP (note, 1))
2291     if (REG_NOTE_KIND (note) == REG_UNUSED && STACK_REG_P (XEXP (note, 0)))
2292       {
2293         *note_link = XEXP (note, 1);
2294         insn = emit_pop_insn (insn, regstack, XEXP (note, 0), EMIT_AFTER);
2295       }
2296     else
2297       note_link = &XEXP (note, 1);
2298 }
2299 \f
2300 /* Change the organization of the stack so that it fits a new basic
2301    block.  Some registers might have to be popped, but there can never be
2302    a register live in the new block that is not now live.
2303
2304    Insert any needed insns before or after INSN, as indicated by
2305    WHERE.  OLD is the original stack layout, and NEW is the desired
2306    form.  OLD is updated to reflect the code emitted, ie, it will be
2307    the same as NEW upon return.
2308
2309    This function will not preserve block_end[].  But that information
2310    is no longer needed once this has executed.  */
2311
2312 static void
2313 change_stack (insn, old, new, where)
2314      rtx insn;
2315      stack old;
2316      stack new;
2317      enum emit_where where;
2318 {
2319   int reg;
2320   int update_end = 0;
2321
2322   /* We will be inserting new insns "backwards".  If we are to insert
2323      after INSN, find the next insn, and insert before it.  */
2324
2325   if (where == EMIT_AFTER)
2326     {
2327       if (current_block && current_block->end == insn)
2328         update_end = 1;
2329       insn = NEXT_INSN (insn);
2330     }
2331
2332   /* Pop any registers that are not needed in the new block.  */
2333
2334   for (reg = old->top; reg >= 0; reg--)
2335     if (! TEST_HARD_REG_BIT (new->reg_set, old->reg[reg]))
2336       emit_pop_insn (insn, old, FP_MODE_REG (old->reg[reg], DFmode),
2337                      EMIT_BEFORE);
2338
2339   if (new->top == -2)
2340     {
2341       /* If the new block has never been processed, then it can inherit
2342          the old stack order.  */
2343
2344       new->top = old->top;
2345       memcpy (new->reg, old->reg, sizeof (new->reg));
2346     }
2347   else
2348     {
2349       /* This block has been entered before, and we must match the
2350          previously selected stack order.  */
2351
2352       /* By now, the only difference should be the order of the stack,
2353          not their depth or liveliness.  */
2354
2355       GO_IF_HARD_REG_EQUAL (old->reg_set, new->reg_set, win);
2356       abort ();
2357     win:
2358       if (old->top != new->top)
2359         abort ();
2360
2361       /* If the stack is not empty (new->top != -1), loop here emitting
2362          swaps until the stack is correct.
2363
2364          The worst case number of swaps emitted is N + 2, where N is the
2365          depth of the stack.  In some cases, the reg at the top of
2366          stack may be correct, but swapped anyway in order to fix
2367          other regs.  But since we never swap any other reg away from
2368          its correct slot, this algorithm will converge.  */
2369
2370       if (new->top != -1)
2371         do
2372           {
2373             /* Swap the reg at top of stack into the position it is
2374                supposed to be in, until the correct top of stack appears.  */
2375
2376             while (old->reg[old->top] != new->reg[new->top])
2377               {
2378                 for (reg = new->top; reg >= 0; reg--)
2379                   if (new->reg[reg] == old->reg[old->top])
2380                     break;
2381
2382                 if (reg == -1)
2383                   abort ();
2384
2385                 emit_swap_insn (insn, old,
2386                                 FP_MODE_REG (old->reg[reg], DFmode));
2387               }
2388
2389             /* See if any regs remain incorrect.  If so, bring an
2390              incorrect reg to the top of stack, and let the while loop
2391              above fix it.  */
2392
2393             for (reg = new->top; reg >= 0; reg--)
2394               if (new->reg[reg] != old->reg[reg])
2395                 {
2396                   emit_swap_insn (insn, old,
2397                                   FP_MODE_REG (old->reg[reg], DFmode));
2398                   break;
2399                 }
2400           } while (reg >= 0);
2401
2402       /* At this point there must be no differences.  */
2403
2404       for (reg = old->top; reg >= 0; reg--)
2405         if (old->reg[reg] != new->reg[reg])
2406           abort ();
2407     }
2408
2409   if (update_end)
2410     current_block->end = PREV_INSN (insn);
2411 }
2412 \f
2413 /* Print stack configuration.  */
2414
2415 static void
2416 print_stack (file, s)
2417      FILE *file;
2418      stack s;
2419 {
2420   if (! file)
2421     return;
2422
2423   if (s->top == -2)
2424     fprintf (file, "uninitialized\n");
2425   else if (s->top == -1)
2426     fprintf (file, "empty\n");
2427   else
2428     {
2429       int i;
2430       fputs ("[ ", file);
2431       for (i = 0; i <= s->top; ++i)
2432         fprintf (file, "%d ", s->reg[i]);
2433       fputs ("]\n", file);
2434     }
2435 }
2436 \f
2437 /* This function was doing life analysis.  We now let the regular live
2438    code do it's job, so we only need to check some extra invariants
2439    that reg-stack expects.  Primary among these being that all registers
2440    are initialized before use.
2441
2442    The function returns true when code was emitted to CFG edges and
2443    commit_edge_insertions needs to be called.  */
2444
2445 static int
2446 convert_regs_entry ()
2447 {
2448   int inserted = 0;
2449   edge e;
2450   basic_block block;
2451
2452   FOR_EACH_BB_REVERSE (block)
2453     {
2454       block_info bi = BLOCK_INFO (block);
2455       int reg;
2456
2457       /* Set current register status at last instruction `uninitialized'.  */
2458       bi->stack_in.top = -2;
2459
2460       /* Copy live_at_end and live_at_start into temporaries.  */
2461       for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; reg++)
2462         {
2463           if (REGNO_REG_SET_P (block->global_live_at_end, reg))
2464             SET_HARD_REG_BIT (bi->out_reg_set, reg);
2465           if (REGNO_REG_SET_P (block->global_live_at_start, reg))
2466             SET_HARD_REG_BIT (bi->stack_in.reg_set, reg);
2467         }
2468     }
2469
2470   /* Load something into each stack register live at function entry.
2471      Such live registers can be caused by uninitialized variables or
2472      functions not returning values on all paths.  In order to keep
2473      the push/pop code happy, and to not scrog the register stack, we
2474      must put something in these registers.  Use a QNaN.
2475
2476      Note that we are inserting converted code here.  This code is
2477      never seen by the convert_regs pass.  */
2478
2479   for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2480     {
2481       basic_block block = e->dest;
2482       block_info bi = BLOCK_INFO (block);
2483       int reg, top = -1;
2484
2485       for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
2486         if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
2487           {
2488             rtx init;
2489
2490             bi->stack_in.reg[++top] = reg;
2491
2492             init = gen_rtx_SET (VOIDmode,
2493                                 FP_MODE_REG (FIRST_STACK_REG, SFmode),
2494                                 nan);
2495             insert_insn_on_edge (init, e);
2496             inserted = 1;
2497           }
2498
2499       bi->stack_in.top = top;
2500     }
2501
2502   return inserted;
2503 }
2504
2505 /* Construct the desired stack for function exit.  This will either
2506    be `empty', or the function return value at top-of-stack.  */
2507
2508 static void
2509 convert_regs_exit ()
2510 {
2511   int value_reg_low, value_reg_high;
2512   stack output_stack;
2513   rtx retvalue;
2514
2515   retvalue = stack_result (current_function_decl);
2516   value_reg_low = value_reg_high = -1;
2517   if (retvalue)
2518     {
2519       value_reg_low = REGNO (retvalue);
2520       value_reg_high = value_reg_low
2521         + HARD_REGNO_NREGS (value_reg_low, GET_MODE (retvalue)) - 1;
2522     }
2523
2524   output_stack = &BLOCK_INFO (EXIT_BLOCK_PTR)->stack_in;
2525   if (value_reg_low == -1)
2526     output_stack->top = -1;
2527   else
2528     {
2529       int reg;
2530
2531       output_stack->top = value_reg_high - value_reg_low;
2532       for (reg = value_reg_low; reg <= value_reg_high; ++reg)
2533         {
2534           output_stack->reg[value_reg_high - reg] = reg;
2535           SET_HARD_REG_BIT (output_stack->reg_set, reg);
2536         }
2537     }
2538 }
2539
2540 /* Adjust the stack of this block on exit to match the stack of the
2541    target block, or copy stack info into the stack of the successor
2542    of the successor hasn't been processed yet.  */
2543 static bool
2544 compensate_edge (e, file)
2545     edge e;
2546     FILE *file;
2547 {
2548   basic_block block = e->src, target = e->dest;
2549   block_info bi = BLOCK_INFO (block);
2550   struct stack_def regstack, tmpstack;
2551   stack target_stack = &BLOCK_INFO (target)->stack_in;
2552   int reg;
2553
2554   current_block = block;
2555   regstack = bi->stack_out;
2556   if (file)
2557     fprintf (file, "Edge %d->%d: ", block->index, target->index);
2558
2559   if (target_stack->top == -2)
2560     {
2561       /* The target block hasn't had a stack order selected.
2562          We need merely ensure that no pops are needed.  */
2563       for (reg = regstack.top; reg >= 0; --reg)
2564         if (!TEST_HARD_REG_BIT (target_stack->reg_set, regstack.reg[reg]))
2565           break;
2566
2567       if (reg == -1)
2568         {
2569           if (file)
2570             fprintf (file, "new block; copying stack position\n");
2571
2572           /* change_stack kills values in regstack.  */
2573           tmpstack = regstack;
2574
2575           change_stack (block->end, &tmpstack, target_stack, EMIT_AFTER);
2576           return false;
2577         }
2578
2579       if (file)
2580         fprintf (file, "new block; pops needed\n");
2581     }
2582   else
2583     {
2584       if (target_stack->top == regstack.top)
2585         {
2586           for (reg = target_stack->top; reg >= 0; --reg)
2587             if (target_stack->reg[reg] != regstack.reg[reg])
2588               break;
2589
2590           if (reg == -1)
2591             {
2592               if (file)
2593                 fprintf (file, "no changes needed\n");
2594               return false;
2595             }
2596         }
2597
2598       if (file)
2599         {
2600           fprintf (file, "correcting stack to ");
2601           print_stack (file, target_stack);
2602         }
2603     }
2604
2605   /* Care for non-call EH edges specially.  The normal return path have
2606      values in registers.  These will be popped en masse by the unwind
2607      library.  */
2608   if ((e->flags & (EDGE_EH | EDGE_ABNORMAL_CALL)) == EDGE_EH)
2609     target_stack->top = -1;
2610
2611   /* Other calls may appear to have values live in st(0), but the
2612      abnormal return path will not have actually loaded the values.  */
2613   else if (e->flags & EDGE_ABNORMAL_CALL)
2614     {
2615       /* Assert that the lifetimes are as we expect -- one value
2616          live at st(0) on the end of the source block, and no
2617          values live at the beginning of the destination block.  */
2618       HARD_REG_SET tmp;
2619
2620       CLEAR_HARD_REG_SET (tmp);
2621       GO_IF_HARD_REG_EQUAL (target_stack->reg_set, tmp, eh1);
2622       abort ();
2623     eh1:
2624
2625       /* We are sure that there is st(0) live, otherwise we won't compensate.
2626          For complex return values, we may have st(1) live as well.  */
2627       SET_HARD_REG_BIT (tmp, FIRST_STACK_REG);
2628       if (TEST_HARD_REG_BIT (regstack.reg_set, FIRST_STACK_REG + 1))
2629         SET_HARD_REG_BIT (tmp, FIRST_STACK_REG + 1);
2630       GO_IF_HARD_REG_EQUAL (regstack.reg_set, tmp, eh2);
2631       abort ();
2632     eh2:
2633
2634       target_stack->top = -1;
2635     }
2636
2637   /* It is better to output directly to the end of the block
2638      instead of to the edge, because emit_swap can do minimal
2639      insn scheduling.  We can do this when there is only one
2640      edge out, and it is not abnormal.  */
2641   else if (block->succ->succ_next == NULL && !(e->flags & EDGE_ABNORMAL))
2642     {
2643       /* change_stack kills values in regstack.  */
2644       tmpstack = regstack;
2645
2646       change_stack (block->end, &tmpstack, target_stack,
2647                     (GET_CODE (block->end) == JUMP_INSN
2648                      ? EMIT_BEFORE : EMIT_AFTER));
2649     }
2650   else
2651     {
2652       rtx seq, after;
2653
2654       /* We don't support abnormal edges.  Global takes care to
2655          avoid any live register across them, so we should never
2656          have to insert instructions on such edges.  */
2657       if (e->flags & EDGE_ABNORMAL)
2658         abort ();
2659
2660       current_block = NULL;
2661       start_sequence ();
2662
2663       /* ??? change_stack needs some point to emit insns after.  */
2664       after = emit_note (NULL, NOTE_INSN_DELETED);
2665
2666       tmpstack = regstack;
2667       change_stack (after, &tmpstack, target_stack, EMIT_BEFORE);
2668
2669       seq = get_insns ();
2670       end_sequence ();
2671
2672       insert_insn_on_edge (seq, e);
2673       return true;
2674     }
2675   return false;
2676 }
2677
2678 /* Convert stack register references in one block.  */
2679
2680 static int
2681 convert_regs_1 (file, block)
2682      FILE *file;
2683      basic_block block;
2684 {
2685   struct stack_def regstack;
2686   block_info bi = BLOCK_INFO (block);
2687   int inserted, reg;
2688   rtx insn, next;
2689   edge e, beste = NULL;
2690
2691   inserted = 0;
2692
2693   /* Find the edge we will copy stack from.  It should be the most frequent
2694      one as it will get cheapest after compensation code is generated,
2695      if multiple such exists, take one with largest count, prefer critical
2696      one (as splitting critical edges is more expensive), or one with lowest
2697      index, to avoid random changes with different orders of the edges.  */
2698   for (e = block->pred; e ; e = e->pred_next)
2699     {
2700       if (e->flags & EDGE_DFS_BACK)
2701         ;
2702       else if (! beste)
2703         beste = e;
2704       else if (EDGE_FREQUENCY (beste) < EDGE_FREQUENCY (e))
2705         beste = e;
2706       else if (EDGE_FREQUENCY (beste) > EDGE_FREQUENCY (e))
2707         ;
2708       else if (beste->count < e->count)
2709         beste = e;
2710       else if (beste->count > e->count)
2711         ;
2712       else if ((EDGE_CRITICAL_P (e) != 0)
2713                != (EDGE_CRITICAL_P (beste) != 0))
2714         {
2715           if (EDGE_CRITICAL_P (e))
2716             beste = e;
2717         }
2718       else if (e->src->index < beste->src->index)
2719         beste = e;
2720     }
2721
2722   /* Entry block does have stack already initialized.  */
2723   if (bi->stack_in.top == -2)
2724     inserted |= compensate_edge (beste, file);
2725   else
2726     beste = NULL;
2727
2728   current_block = block;
2729
2730   if (file)
2731     {
2732       fprintf (file, "\nBasic block %d\nInput stack: ", block->index);
2733       print_stack (file, &bi->stack_in);
2734     }
2735
2736   /* Process all insns in this block.  Keep track of NEXT so that we
2737      don't process insns emitted while substituting in INSN.  */
2738   next = block->head;
2739   regstack = bi->stack_in;
2740   do
2741     {
2742       insn = next;
2743       next = NEXT_INSN (insn);
2744
2745       /* Ensure we have not missed a block boundary.  */
2746       if (next == NULL)
2747         abort ();
2748       if (insn == block->end)
2749         next = NULL;
2750
2751       /* Don't bother processing unless there is a stack reg
2752          mentioned or if it's a CALL_INSN.  */
2753       if (stack_regs_mentioned (insn)
2754           || GET_CODE (insn) == CALL_INSN)
2755         {
2756           if (file)
2757             {
2758               fprintf (file, "  insn %d input stack: ",
2759                        INSN_UID (insn));
2760               print_stack (file, &regstack);
2761             }
2762           subst_stack_regs (insn, &regstack);
2763         }
2764     }
2765   while (next);
2766
2767   if (file)
2768     {
2769       fprintf (file, "Expected live registers [");
2770       for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; ++reg)
2771         if (TEST_HARD_REG_BIT (bi->out_reg_set, reg))
2772           fprintf (file, " %d", reg);
2773       fprintf (file, " ]\nOutput stack: ");
2774       print_stack (file, &regstack);
2775     }
2776
2777   insn = block->end;
2778   if (GET_CODE (insn) == JUMP_INSN)
2779     insn = PREV_INSN (insn);
2780
2781   /* If the function is declared to return a value, but it returns one
2782      in only some cases, some registers might come live here.  Emit
2783      necessary moves for them.  */
2784
2785   for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; ++reg)
2786     {
2787       if (TEST_HARD_REG_BIT (bi->out_reg_set, reg)
2788           && ! TEST_HARD_REG_BIT (regstack.reg_set, reg))
2789         {
2790           rtx set;
2791
2792           if (file)
2793             {
2794               fprintf (file, "Emitting insn initializing reg %d\n",
2795                        reg);
2796             }
2797
2798           set = gen_rtx_SET (VOIDmode, FP_MODE_REG (reg, SFmode),
2799                              nan);
2800           insn = emit_insn_after (set, insn);
2801           subst_stack_regs (insn, &regstack);
2802         }
2803     }
2804
2805   /* Something failed if the stack lives don't match.  */
2806   GO_IF_HARD_REG_EQUAL (regstack.reg_set, bi->out_reg_set, win);
2807   abort ();
2808  win:
2809   bi->stack_out = regstack;
2810
2811   /* Compensate the back edges, as those wasn't visited yet.  */
2812   for (e = block->succ; e ; e = e->succ_next)
2813     {
2814       if (e->flags & EDGE_DFS_BACK
2815           || (e->dest == EXIT_BLOCK_PTR))
2816         {
2817           if (!BLOCK_INFO (e->dest)->done
2818               && e->dest != block)
2819             abort ();
2820           inserted |= compensate_edge (e, file);
2821         }
2822     }
2823   for (e = block->pred; e ; e = e->pred_next)
2824     {
2825       if (e != beste && !(e->flags & EDGE_DFS_BACK)
2826           && e->src != ENTRY_BLOCK_PTR)
2827         {
2828           if (!BLOCK_INFO (e->src)->done)
2829             abort ();
2830           inserted |= compensate_edge (e, file);
2831         }
2832     }
2833
2834   return inserted;
2835 }
2836
2837 /* Convert registers in all blocks reachable from BLOCK.  */
2838
2839 static int
2840 convert_regs_2 (file, block)
2841      FILE *file;
2842      basic_block block;
2843 {
2844   basic_block *stack, *sp;
2845   int inserted;
2846
2847   stack = (basic_block *) xmalloc (sizeof (*stack) * n_basic_blocks);
2848   sp = stack;
2849
2850   *sp++ = block;
2851
2852   inserted = 0;
2853   do
2854     {
2855       edge e;
2856
2857       block = *--sp;
2858       inserted |= convert_regs_1 (file, block);
2859       BLOCK_INFO (block)->done = 1;
2860
2861       for (e = block->succ; e ; e = e->succ_next)
2862         if (! (e->flags & EDGE_DFS_BACK))
2863           {
2864             BLOCK_INFO (e->dest)->predecessors--;
2865             if (!BLOCK_INFO (e->dest)->predecessors)
2866                *sp++ = e->dest;
2867           }
2868     }
2869   while (sp != stack);
2870
2871   return inserted;
2872 }
2873
2874 /* Traverse all basic blocks in a function, converting the register
2875    references in each insn from the "flat" register file that gcc uses,
2876    to the stack-like registers the 387 uses.  */
2877
2878 static int
2879 convert_regs (file)
2880      FILE *file;
2881 {
2882   int inserted;
2883   basic_block b;
2884   edge e;
2885
2886   /* Initialize uninitialized registers on function entry.  */
2887   inserted = convert_regs_entry ();
2888
2889   /* Construct the desired stack for function exit.  */
2890   convert_regs_exit ();
2891   BLOCK_INFO (EXIT_BLOCK_PTR)->done = 1;
2892
2893   /* ??? Future: process inner loops first, and give them arbitrary
2894      initial stacks which emit_swap_insn can modify.  This ought to
2895      prevent double fxch that aften appears at the head of a loop.  */
2896
2897   /* Process all blocks reachable from all entry points.  */
2898   for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2899     inserted |= convert_regs_2 (file, e->dest);
2900
2901   /* ??? Process all unreachable blocks.  Though there's no excuse
2902      for keeping these even when not optimizing.  */
2903   FOR_EACH_BB (b)
2904     {
2905       block_info bi = BLOCK_INFO (b);
2906
2907       if (! bi->done)
2908         {
2909           int reg;
2910
2911           /* Create an arbitrary input stack.  */
2912           bi->stack_in.top = -1;
2913           for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
2914             if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
2915               bi->stack_in.reg[++bi->stack_in.top] = reg;
2916
2917           inserted |= convert_regs_2 (file, b);
2918         }
2919     }
2920
2921   fixup_abnormal_edges ();
2922   if (inserted)
2923     commit_edge_insertions ();
2924
2925   if (file)
2926     fputc ('\n', file);
2927
2928   return inserted;
2929 }
2930 #endif /* STACK_REGS */
2931
2932 #include "gt-reg-stack.h"