OSDN Git Service

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