OSDN Git Service

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