OSDN Git Service

* longlong.h (umul_ppmm): Add ColdFire support.
[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)))
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 || GET_MODE (src) == TFmode)
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           if (GET_MODE (src) == TFmode)
1141             push_rtx = gen_movtf (top_stack_reg, top_stack_reg);
1142           else
1143             push_rtx = gen_movxf (top_stack_reg, top_stack_reg);
1144           push_insn = emit_insn_before (push_rtx, insn);
1145           REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD, top_stack_reg,
1146                                                 REG_NOTES (insn));
1147         }
1148
1149       replace_reg (psrc, FIRST_STACK_REG);
1150     }
1151   else if (STACK_REG_P (dest))
1152     {
1153       /* Load from MEM, or possibly integer REG or constant, into the
1154          stack regs.  The actual target is always the top of the
1155          stack. The stack mapping is changed to reflect that DEST is
1156          now at top of stack.  */
1157
1158       /* The destination ought to be dead.  */
1159       if (get_hard_regnum (regstack, dest) >= FIRST_STACK_REG)
1160         abort ();
1161
1162       if (regstack->top >= REG_STACK_SIZE)
1163         abort ();
1164
1165       regstack->reg[++regstack->top] = REGNO (dest);
1166       SET_HARD_REG_BIT (regstack->reg_set, REGNO (dest));
1167       replace_reg (pdest, FIRST_STACK_REG);
1168     }
1169   else
1170     abort ();
1171 }
1172 \f
1173 /* Swap the condition on a branch, if there is one.  Return true if we
1174    found a condition to swap.  False if the condition was not used as
1175    such.  */
1176
1177 static int
1178 swap_rtx_condition_1 (rtx pat)
1179 {
1180   const char *fmt;
1181   int i, r = 0;
1182
1183   if (GET_RTX_CLASS (GET_CODE (pat)) == '<')
1184     {
1185       PUT_CODE (pat, swap_condition (GET_CODE (pat)));
1186       r = 1;
1187     }
1188   else
1189     {
1190       fmt = GET_RTX_FORMAT (GET_CODE (pat));
1191       for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0; i--)
1192         {
1193           if (fmt[i] == 'E')
1194             {
1195               int j;
1196
1197               for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
1198                 r |= swap_rtx_condition_1 (XVECEXP (pat, i, j));
1199             }
1200           else if (fmt[i] == 'e')
1201             r |= swap_rtx_condition_1 (XEXP (pat, i));
1202         }
1203     }
1204
1205   return r;
1206 }
1207
1208 static int
1209 swap_rtx_condition (rtx insn)
1210 {
1211   rtx pat = PATTERN (insn);
1212
1213   /* We're looking for a single set to cc0 or an HImode temporary.  */
1214
1215   if (GET_CODE (pat) == SET
1216       && GET_CODE (SET_DEST (pat)) == REG
1217       && REGNO (SET_DEST (pat)) == FLAGS_REG)
1218     {
1219       insn = next_flags_user (insn);
1220       if (insn == NULL_RTX)
1221         return 0;
1222       pat = PATTERN (insn);
1223     }
1224
1225   /* See if this is, or ends in, a fnstsw, aka unspec 9.  If so, we're
1226      not doing anything with the cc value right now.  We may be able to
1227      search for one though.  */
1228
1229   if (GET_CODE (pat) == SET
1230       && GET_CODE (SET_SRC (pat)) == UNSPEC
1231       && XINT (SET_SRC (pat), 1) == UNSPEC_FNSTSW)
1232     {
1233       rtx dest = SET_DEST (pat);
1234
1235       /* Search forward looking for the first use of this value.
1236          Stop at block boundaries.  */
1237       while (insn != current_block->end)
1238         {
1239           insn = NEXT_INSN (insn);
1240           if (INSN_P (insn) && reg_mentioned_p (dest, insn))
1241             break;
1242           if (GET_CODE (insn) == CALL_INSN)
1243             return 0;
1244         }
1245
1246       /* So we've found the insn using this value.  If it is anything
1247          other than sahf, aka unspec 10, or the value does not die
1248          (meaning we'd have to search further), then we must give up.  */
1249       pat = PATTERN (insn);
1250       if (GET_CODE (pat) != SET
1251           || GET_CODE (SET_SRC (pat)) != UNSPEC
1252           || XINT (SET_SRC (pat), 1) != UNSPEC_SAHF
1253           || ! dead_or_set_p (insn, dest))
1254         return 0;
1255
1256       /* Now we are prepared to handle this as a normal cc0 setter.  */
1257       insn = next_flags_user (insn);
1258       if (insn == NULL_RTX)
1259         return 0;
1260       pat = PATTERN (insn);
1261     }
1262
1263   if (swap_rtx_condition_1 (pat))
1264     {
1265       int fail = 0;
1266       INSN_CODE (insn) = -1;
1267       if (recog_memoized (insn) == -1)
1268         fail = 1;
1269       /* In case the flags don't die here, recurse to try fix
1270          following user too.  */
1271       else if (! dead_or_set_p (insn, ix86_flags_rtx))
1272         {
1273           insn = next_flags_user (insn);
1274           if (!insn || !swap_rtx_condition (insn))
1275             fail = 1;
1276         }
1277       if (fail)
1278         {
1279           swap_rtx_condition_1 (pat);
1280           return 0;
1281         }
1282       return 1;
1283     }
1284   return 0;
1285 }
1286
1287 /* Handle a comparison.  Special care needs to be taken to avoid
1288    causing comparisons that a 387 cannot do correctly, such as EQ.
1289
1290    Also, a pop insn may need to be emitted.  The 387 does have an
1291    `fcompp' insn that can pop two regs, but it is sometimes too expensive
1292    to do this - a `fcomp' followed by a `fstpl %st(0)' may be easier to
1293    set up.  */
1294
1295 static void
1296 compare_for_stack_reg (rtx insn, stack regstack, rtx pat_src)
1297 {
1298   rtx *src1, *src2;
1299   rtx src1_note, src2_note;
1300   rtx flags_user;
1301
1302   src1 = get_true_reg (&XEXP (pat_src, 0));
1303   src2 = get_true_reg (&XEXP (pat_src, 1));
1304   flags_user = next_flags_user (insn);
1305
1306   /* ??? If fxch turns out to be cheaper than fstp, give priority to
1307      registers that die in this insn - move those to stack top first.  */
1308   if ((! STACK_REG_P (*src1)
1309        || (STACK_REG_P (*src2)
1310            && get_hard_regnum (regstack, *src2) == FIRST_STACK_REG))
1311       && swap_rtx_condition (insn))
1312     {
1313       rtx temp;
1314       temp = XEXP (pat_src, 0);
1315       XEXP (pat_src, 0) = XEXP (pat_src, 1);
1316       XEXP (pat_src, 1) = temp;
1317
1318       src1 = get_true_reg (&XEXP (pat_src, 0));
1319       src2 = get_true_reg (&XEXP (pat_src, 1));
1320
1321       INSN_CODE (insn) = -1;
1322     }
1323
1324   /* We will fix any death note later.  */
1325
1326   src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1327
1328   if (STACK_REG_P (*src2))
1329     src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1330   else
1331     src2_note = NULL_RTX;
1332
1333   emit_swap_insn (insn, regstack, *src1);
1334
1335   replace_reg (src1, FIRST_STACK_REG);
1336
1337   if (STACK_REG_P (*src2))
1338     replace_reg (src2, get_hard_regnum (regstack, *src2));
1339
1340   if (src1_note)
1341     {
1342       pop_stack (regstack, REGNO (XEXP (src1_note, 0)));
1343       replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1344     }
1345
1346   /* If the second operand dies, handle that.  But if the operands are
1347      the same stack register, don't bother, because only one death is
1348      needed, and it was just handled.  */
1349
1350   if (src2_note
1351       && ! (STACK_REG_P (*src1) && STACK_REG_P (*src2)
1352             && REGNO (*src1) == REGNO (*src2)))
1353     {
1354       /* As a special case, two regs may die in this insn if src2 is
1355          next to top of stack and the top of stack also dies.  Since
1356          we have already popped src1, "next to top of stack" is really
1357          at top (FIRST_STACK_REG) now.  */
1358
1359       if (get_hard_regnum (regstack, XEXP (src2_note, 0)) == FIRST_STACK_REG
1360           && src1_note)
1361         {
1362           pop_stack (regstack, REGNO (XEXP (src2_note, 0)));
1363           replace_reg (&XEXP (src2_note, 0), FIRST_STACK_REG + 1);
1364         }
1365       else
1366         {
1367           /* The 386 can only represent death of the first operand in
1368              the case handled above.  In all other cases, emit a separate
1369              pop and remove the death note from here.  */
1370
1371           /* link_cc0_insns (insn); */
1372
1373           remove_regno_note (insn, REG_DEAD, REGNO (XEXP (src2_note, 0)));
1374
1375           emit_pop_insn (insn, regstack, XEXP (src2_note, 0),
1376                          EMIT_AFTER);
1377         }
1378     }
1379 }
1380 \f
1381 /* Substitute new registers in PAT, which is part of INSN.  REGSTACK
1382    is the current register layout.  */
1383
1384 static void
1385 subst_stack_regs_pat (rtx insn, stack regstack, rtx pat)
1386 {
1387   rtx *dest, *src;
1388
1389   switch (GET_CODE (pat))
1390     {
1391     case USE:
1392       /* Deaths in USE insns can happen in non optimizing compilation.
1393          Handle them by popping the dying register.  */
1394       src = get_true_reg (&XEXP (pat, 0));
1395       if (STACK_REG_P (*src)
1396           && find_regno_note (insn, REG_DEAD, REGNO (*src)))
1397         {
1398           emit_pop_insn (insn, regstack, *src, EMIT_AFTER);
1399           return;
1400         }
1401       /* ??? Uninitialized USE should not happen.  */
1402       else if (get_hard_regnum (regstack, *src) == -1)
1403         abort ();
1404       break;
1405
1406     case CLOBBER:
1407       {
1408         rtx note;
1409
1410         dest = get_true_reg (&XEXP (pat, 0));
1411         if (STACK_REG_P (*dest))
1412           {
1413             note = find_reg_note (insn, REG_DEAD, *dest);
1414
1415             if (pat != PATTERN (insn))
1416               {
1417                 /* The fix_truncdi_1 pattern wants to be able to allocate
1418                    it's own scratch register.  It does this by clobbering
1419                    an fp reg so that it is assured of an empty reg-stack
1420                    register.  If the register is live, kill it now.
1421                    Remove the DEAD/UNUSED note so we don't try to kill it
1422                    later too.  */
1423
1424                 if (note)
1425                   emit_pop_insn (insn, regstack, *dest, EMIT_BEFORE);
1426                 else
1427                   {
1428                     note = find_reg_note (insn, REG_UNUSED, *dest);
1429                     if (!note)
1430                       abort ();
1431                   }
1432                 remove_note (insn, note);
1433                 replace_reg (dest, LAST_STACK_REG);
1434               }
1435             else
1436               {
1437                 /* A top-level clobber with no REG_DEAD, and no hard-regnum
1438                    indicates an uninitialized value.  Because reload removed
1439                    all other clobbers, this must be due to a function
1440                    returning without a value.  Load up a NaN.  */
1441
1442                 if (! note
1443                     && get_hard_regnum (regstack, *dest) == -1)
1444                   {
1445                     pat = gen_rtx_SET (VOIDmode,
1446                                        FP_MODE_REG (REGNO (*dest), SFmode),
1447                                        nan);
1448                     PATTERN (insn) = pat;
1449                     move_for_stack_reg (insn, regstack, pat);
1450                   }
1451                 if (! note && COMPLEX_MODE_P (GET_MODE (*dest))
1452                     && get_hard_regnum (regstack, FP_MODE_REG (REGNO (*dest), DFmode)) == -1)
1453                   {
1454                     pat = gen_rtx_SET (VOIDmode,
1455                                        FP_MODE_REG (REGNO (*dest) + 1, SFmode),
1456                                        nan);
1457                     PATTERN (insn) = pat;
1458                     move_for_stack_reg (insn, regstack, pat);
1459                   }
1460               }
1461           }
1462         break;
1463       }
1464
1465     case SET:
1466       {
1467         rtx *src1 = (rtx *) 0, *src2;
1468         rtx src1_note, src2_note;
1469         rtx pat_src;
1470
1471         dest = get_true_reg (&SET_DEST (pat));
1472         src  = get_true_reg (&SET_SRC (pat));
1473         pat_src = SET_SRC (pat);
1474
1475         /* See if this is a `movM' pattern, and handle elsewhere if so.  */
1476         if (STACK_REG_P (*src)
1477             || (STACK_REG_P (*dest)
1478                 && (GET_CODE (*src) == REG || GET_CODE (*src) == MEM
1479                     || GET_CODE (*src) == CONST_DOUBLE)))
1480           {
1481             move_for_stack_reg (insn, regstack, pat);
1482             break;
1483           }
1484
1485         switch (GET_CODE (pat_src))
1486           {
1487           case COMPARE:
1488             compare_for_stack_reg (insn, regstack, pat_src);
1489             break;
1490
1491           case CALL:
1492             {
1493               int count;
1494               for (count = HARD_REGNO_NREGS (REGNO (*dest), GET_MODE (*dest));
1495                    --count >= 0;)
1496                 {
1497                   regstack->reg[++regstack->top] = REGNO (*dest) + count;
1498                   SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest) + count);
1499                 }
1500             }
1501             replace_reg (dest, FIRST_STACK_REG);
1502             break;
1503
1504           case REG:
1505             /* This is a `tstM2' case.  */
1506             if (*dest != cc0_rtx)
1507               abort ();
1508             src1 = src;
1509
1510             /* Fall through.  */
1511
1512           case FLOAT_TRUNCATE:
1513           case SQRT:
1514           case ABS:
1515           case NEG:
1516             /* These insns only operate on the top of the stack. DEST might
1517                be cc0_rtx if we're processing a tstM pattern. Also, it's
1518                possible that the tstM case results in a REG_DEAD note on the
1519                source.  */
1520
1521             if (src1 == 0)
1522               src1 = get_true_reg (&XEXP (pat_src, 0));
1523
1524             emit_swap_insn (insn, regstack, *src1);
1525
1526             src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1527
1528             if (STACK_REG_P (*dest))
1529               replace_reg (dest, FIRST_STACK_REG);
1530
1531             if (src1_note)
1532               {
1533                 replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1534                 regstack->top--;
1535                 CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (*src1));
1536               }
1537
1538             replace_reg (src1, FIRST_STACK_REG);
1539             break;
1540
1541           case MINUS:
1542           case DIV:
1543             /* On i386, reversed forms of subM3 and divM3 exist for
1544                MODE_FLOAT, so the same code that works for addM3 and mulM3
1545                can be used.  */
1546           case MULT:
1547           case PLUS:
1548             /* These insns can accept the top of stack as a destination
1549                from a stack reg or mem, or can use the top of stack as a
1550                source and some other stack register (possibly top of stack)
1551                as a destination.  */
1552
1553             src1 = get_true_reg (&XEXP (pat_src, 0));
1554             src2 = get_true_reg (&XEXP (pat_src, 1));
1555
1556             /* We will fix any death note later.  */
1557
1558             if (STACK_REG_P (*src1))
1559               src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1560             else
1561               src1_note = NULL_RTX;
1562             if (STACK_REG_P (*src2))
1563               src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1564             else
1565               src2_note = NULL_RTX;
1566
1567             /* If either operand is not a stack register, then the dest
1568                must be top of stack.  */
1569
1570             if (! STACK_REG_P (*src1) || ! STACK_REG_P (*src2))
1571               emit_swap_insn (insn, regstack, *dest);
1572             else
1573               {
1574                 /* Both operands are REG.  If neither operand is already
1575                    at the top of stack, choose to make the one that is the dest
1576                    the new top of stack.  */
1577
1578                 int src1_hard_regnum, src2_hard_regnum;
1579
1580                 src1_hard_regnum = get_hard_regnum (regstack, *src1);
1581                 src2_hard_regnum = get_hard_regnum (regstack, *src2);
1582                 if (src1_hard_regnum == -1 || src2_hard_regnum == -1)
1583                   abort ();
1584
1585                 if (src1_hard_regnum != FIRST_STACK_REG
1586                     && src2_hard_regnum != FIRST_STACK_REG)
1587                   emit_swap_insn (insn, regstack, *dest);
1588               }
1589
1590             if (STACK_REG_P (*src1))
1591               replace_reg (src1, get_hard_regnum (regstack, *src1));
1592             if (STACK_REG_P (*src2))
1593               replace_reg (src2, get_hard_regnum (regstack, *src2));
1594
1595             if (src1_note)
1596               {
1597                 rtx src1_reg = XEXP (src1_note, 0);
1598
1599                 /* If the register that dies is at the top of stack, then
1600                    the destination is somewhere else - merely substitute it.
1601                    But if the reg that dies is not at top of stack, then
1602                    move the top of stack to the dead reg, as though we had
1603                    done the insn and then a store-with-pop.  */
1604
1605                 if (REGNO (src1_reg) == regstack->reg[regstack->top])
1606                   {
1607                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1608                     replace_reg (dest, get_hard_regnum (regstack, *dest));
1609                   }
1610                 else
1611                   {
1612                     int regno = get_hard_regnum (regstack, src1_reg);
1613
1614                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1615                     replace_reg (dest, regno);
1616
1617                     regstack->reg[regstack->top - (regno - FIRST_STACK_REG)]
1618                       = regstack->reg[regstack->top];
1619                   }
1620
1621                 CLEAR_HARD_REG_BIT (regstack->reg_set,
1622                                     REGNO (XEXP (src1_note, 0)));
1623                 replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1624                 regstack->top--;
1625               }
1626             else if (src2_note)
1627               {
1628                 rtx src2_reg = XEXP (src2_note, 0);
1629                 if (REGNO (src2_reg) == regstack->reg[regstack->top])
1630                   {
1631                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1632                     replace_reg (dest, get_hard_regnum (regstack, *dest));
1633                   }
1634                 else
1635                   {
1636                     int regno = get_hard_regnum (regstack, src2_reg);
1637
1638                     SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1639                     replace_reg (dest, regno);
1640
1641                     regstack->reg[regstack->top - (regno - FIRST_STACK_REG)]
1642                       = regstack->reg[regstack->top];
1643                   }
1644
1645                 CLEAR_HARD_REG_BIT (regstack->reg_set,
1646                                     REGNO (XEXP (src2_note, 0)));
1647                 replace_reg (&XEXP (src2_note, 0), FIRST_STACK_REG);
1648                 regstack->top--;
1649               }
1650             else
1651               {
1652                 SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1653                 replace_reg (dest, get_hard_regnum (regstack, *dest));
1654               }
1655
1656             /* Keep operand 1 matching with destination.  */
1657             if (GET_RTX_CLASS (GET_CODE (pat_src)) == 'c'
1658                 && REG_P (*src1) && REG_P (*src2)
1659                 && REGNO (*src1) != REGNO (*dest))
1660              {
1661                 int tmp = REGNO (*src1);
1662                 replace_reg (src1, REGNO (*src2));
1663                 replace_reg (src2, tmp);
1664              }
1665             break;
1666
1667           case UNSPEC:
1668             switch (XINT (pat_src, 1))
1669               {
1670               case UNSPEC_SIN:
1671               case UNSPEC_COS:
1672               case UNSPEC_FRNDINT:
1673               case UNSPEC_F2XM1:
1674                 /* These insns only operate on the top of the stack.  */
1675
1676                 src1 = get_true_reg (&XVECEXP (pat_src, 0, 0));
1677
1678                 emit_swap_insn (insn, regstack, *src1);
1679
1680                 src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1681
1682                 if (STACK_REG_P (*dest))
1683                   replace_reg (dest, FIRST_STACK_REG);
1684
1685                 if (src1_note)
1686                   {
1687                     replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1688                     regstack->top--;
1689                     CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (*src1));
1690                   }
1691
1692                 replace_reg (src1, FIRST_STACK_REG);
1693                 break;
1694
1695               case UNSPEC_FPATAN:
1696               case UNSPEC_FYL2X:
1697               case UNSPEC_FSCALE:
1698                 /* These insns operate on the top two stack slots.  */
1699
1700                 src1 = get_true_reg (&XVECEXP (pat_src, 0, 0));
1701                 src2 = get_true_reg (&XVECEXP (pat_src, 0, 1));
1702
1703                 src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1704                 src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1705
1706                 {
1707                   struct stack_def temp_stack;
1708                   int regno, j, k, temp;
1709
1710                   temp_stack = *regstack;
1711
1712                   /* Place operand 1 at the top of stack.  */
1713                   regno = get_hard_regnum (&temp_stack, *src1);
1714                   if (regno < 0)
1715                     abort ();
1716                   if (regno != FIRST_STACK_REG)
1717                     {
1718                       k = temp_stack.top - (regno - FIRST_STACK_REG);
1719                       j = temp_stack.top;
1720
1721                       temp = temp_stack.reg[k];
1722                       temp_stack.reg[k] = temp_stack.reg[j];
1723                       temp_stack.reg[j] = temp;
1724                     }
1725
1726                   /* Place operand 2 next on the stack.  */
1727                   regno = get_hard_regnum (&temp_stack, *src2);
1728                   if (regno < 0)
1729                     abort ();
1730                   if (regno != FIRST_STACK_REG + 1)
1731                     {
1732                       k = temp_stack.top - (regno - FIRST_STACK_REG);
1733                       j = temp_stack.top - 1;
1734
1735                       temp = temp_stack.reg[k];
1736                       temp_stack.reg[k] = temp_stack.reg[j];
1737                       temp_stack.reg[j] = temp;
1738                     }
1739
1740                   change_stack (insn, regstack, &temp_stack, EMIT_BEFORE);
1741                 }
1742
1743                 replace_reg (src1, FIRST_STACK_REG);
1744                 replace_reg (src2, FIRST_STACK_REG + 1);
1745
1746                 if (src1_note)
1747                   replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
1748                 if (src2_note)
1749                   replace_reg (&XEXP (src2_note, 0), FIRST_STACK_REG + 1);
1750
1751                 /* Pop both input operands from the stack.  */
1752                 CLEAR_HARD_REG_BIT (regstack->reg_set,
1753                                     regstack->reg[regstack->top]);
1754                 CLEAR_HARD_REG_BIT (regstack->reg_set,
1755                                     regstack->reg[regstack->top - 1]);
1756                 regstack->top -= 2;
1757
1758                 /* Push the result back onto the stack.  */
1759                 regstack->reg[++regstack->top] = REGNO (*dest);
1760                 SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1761                 replace_reg (dest, FIRST_STACK_REG);
1762                 break;
1763
1764               case UNSPEC_SAHF:
1765                 /* (unspec [(unspec [(compare)] UNSPEC_FNSTSW)] UNSPEC_SAHF)
1766                    The combination matches the PPRO fcomi instruction.  */
1767
1768                 pat_src = XVECEXP (pat_src, 0, 0);
1769                 if (GET_CODE (pat_src) != UNSPEC
1770                     || XINT (pat_src, 1) != UNSPEC_FNSTSW)
1771                   abort ();
1772                 /* FALLTHRU */
1773
1774               case UNSPEC_FNSTSW:
1775                 /* Combined fcomp+fnstsw generated for doing well with
1776                    CSE.  When optimizing this would have been broken
1777                    up before now.  */
1778
1779                 pat_src = XVECEXP (pat_src, 0, 0);
1780                 if (GET_CODE (pat_src) != COMPARE)
1781                   abort ();
1782
1783                 compare_for_stack_reg (insn, regstack, pat_src);
1784                 break;
1785
1786               default:
1787                 abort ();
1788               }
1789             break;
1790
1791           case IF_THEN_ELSE:
1792             /* This insn requires the top of stack to be the destination.  */
1793
1794             src1 = get_true_reg (&XEXP (pat_src, 1));
1795             src2 = get_true_reg (&XEXP (pat_src, 2));
1796
1797             src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
1798             src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
1799
1800             /* If the comparison operator is an FP comparison operator,
1801                it is handled correctly by compare_for_stack_reg () who
1802                will move the destination to the top of stack. But if the
1803                comparison operator is not an FP comparison operator, we
1804                have to handle it here.  */
1805             if (get_hard_regnum (regstack, *dest) >= FIRST_STACK_REG
1806                 && REGNO (*dest) != regstack->reg[regstack->top])
1807               {
1808                 /* In case one of operands is the top of stack and the operands
1809                    dies, it is safe to make it the destination operand by
1810                    reversing the direction of cmove and avoid fxch.  */
1811                 if ((REGNO (*src1) == regstack->reg[regstack->top]
1812                      && src1_note)
1813                     || (REGNO (*src2) == regstack->reg[regstack->top]
1814                         && src2_note))
1815                   {
1816                     int idx1 = (get_hard_regnum (regstack, *src1)
1817                                 - FIRST_STACK_REG);
1818                     int idx2 = (get_hard_regnum (regstack, *src2)
1819                                 - FIRST_STACK_REG);
1820
1821                     /* Make reg-stack believe that the operands are already
1822                        swapped on the stack */
1823                     regstack->reg[regstack->top - idx1] = REGNO (*src2);
1824                     regstack->reg[regstack->top - idx2] = REGNO (*src1);
1825
1826                     /* Reverse condition to compensate the operand swap.
1827                        i386 do have comparison always reversible.  */
1828                     PUT_CODE (XEXP (pat_src, 0),
1829                               reversed_comparison_code (XEXP (pat_src, 0), insn));
1830                   }
1831                 else
1832                   emit_swap_insn (insn, regstack, *dest);
1833               }
1834
1835             {
1836               rtx src_note [3];
1837               int i;
1838
1839               src_note[0] = 0;
1840               src_note[1] = src1_note;
1841               src_note[2] = src2_note;
1842
1843               if (STACK_REG_P (*src1))
1844                 replace_reg (src1, get_hard_regnum (regstack, *src1));
1845               if (STACK_REG_P (*src2))
1846                 replace_reg (src2, get_hard_regnum (regstack, *src2));
1847
1848               for (i = 1; i <= 2; i++)
1849                 if (src_note [i])
1850                   {
1851                     int regno = REGNO (XEXP (src_note[i], 0));
1852
1853                     /* If the register that dies is not at the top of
1854                        stack, then move the top of stack to the dead reg */
1855                     if (regno != regstack->reg[regstack->top])
1856                       {
1857                         remove_regno_note (insn, REG_DEAD, regno);
1858                         emit_pop_insn (insn, regstack, XEXP (src_note[i], 0),
1859                                        EMIT_AFTER);
1860                       }
1861                     else
1862                       /* Top of stack never dies, as it is the
1863                          destination.  */
1864                       abort ();
1865                   }
1866             }
1867
1868             /* Make dest the top of stack.  Add dest to regstack if
1869                not present.  */
1870             if (get_hard_regnum (regstack, *dest) < FIRST_STACK_REG)
1871               regstack->reg[++regstack->top] = REGNO (*dest);
1872             SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
1873             replace_reg (dest, FIRST_STACK_REG);
1874             break;
1875
1876           default:
1877             abort ();
1878           }
1879         break;
1880       }
1881
1882     default:
1883       break;
1884     }
1885 }
1886 \f
1887 /* Substitute hard regnums for any stack regs in INSN, which has
1888    N_INPUTS inputs and N_OUTPUTS outputs.  REGSTACK is the stack info
1889    before the insn, and is updated with changes made here.
1890
1891    There are several requirements and assumptions about the use of
1892    stack-like regs in asm statements.  These rules are enforced by
1893    record_asm_stack_regs; see comments there for details.  Any
1894    asm_operands left in the RTL at this point may be assume to meet the
1895    requirements, since record_asm_stack_regs removes any problem asm.  */
1896
1897 static void
1898 subst_asm_stack_regs (rtx insn, stack regstack)
1899 {
1900   rtx body = PATTERN (insn);
1901   int alt;
1902
1903   rtx *note_reg;                /* Array of note contents */
1904   rtx **note_loc;               /* Address of REG field of each note */
1905   enum reg_note *note_kind;     /* The type of each note */
1906
1907   rtx *clobber_reg = 0;
1908   rtx **clobber_loc = 0;
1909
1910   struct stack_def temp_stack;
1911   int n_notes;
1912   int n_clobbers;
1913   rtx note;
1914   int i;
1915   int n_inputs, n_outputs;
1916
1917   if (! check_asm_stack_operands (insn))
1918     return;
1919
1920   /* Find out what the constraints required.  If no constraint
1921      alternative matches, that is a compiler bug: we should have caught
1922      such an insn in check_asm_stack_operands.  */
1923   extract_insn (insn);
1924   constrain_operands (1);
1925   alt = which_alternative;
1926
1927   preprocess_constraints ();
1928
1929   n_inputs = get_asm_operand_n_inputs (body);
1930   n_outputs = recog_data.n_operands - n_inputs;
1931
1932   if (alt < 0)
1933     abort ();
1934
1935   /* Strip SUBREGs here to make the following code simpler.  */
1936   for (i = 0; i < recog_data.n_operands; i++)
1937     if (GET_CODE (recog_data.operand[i]) == SUBREG
1938         && GET_CODE (SUBREG_REG (recog_data.operand[i])) == REG)
1939       {
1940         recog_data.operand_loc[i] = & SUBREG_REG (recog_data.operand[i]);
1941         recog_data.operand[i] = SUBREG_REG (recog_data.operand[i]);
1942       }
1943
1944   /* Set up NOTE_REG, NOTE_LOC and NOTE_KIND.  */
1945
1946   for (i = 0, note = REG_NOTES (insn); note; note = XEXP (note, 1))
1947     i++;
1948
1949   note_reg = alloca (i * sizeof (rtx));
1950   note_loc = alloca (i * sizeof (rtx *));
1951   note_kind = alloca (i * sizeof (enum reg_note));
1952
1953   n_notes = 0;
1954   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1955     {
1956       rtx reg = XEXP (note, 0);
1957       rtx *loc = & XEXP (note, 0);
1958
1959       if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
1960         {
1961           loc = & SUBREG_REG (reg);
1962           reg = SUBREG_REG (reg);
1963         }
1964
1965       if (STACK_REG_P (reg)
1966           && (REG_NOTE_KIND (note) == REG_DEAD
1967               || REG_NOTE_KIND (note) == REG_UNUSED))
1968         {
1969           note_reg[n_notes] = reg;
1970           note_loc[n_notes] = loc;
1971           note_kind[n_notes] = REG_NOTE_KIND (note);
1972           n_notes++;
1973         }
1974     }
1975
1976   /* Set up CLOBBER_REG and CLOBBER_LOC.  */
1977
1978   n_clobbers = 0;
1979
1980   if (GET_CODE (body) == PARALLEL)
1981     {
1982       clobber_reg = alloca (XVECLEN (body, 0) * sizeof (rtx));
1983       clobber_loc = alloca (XVECLEN (body, 0) * sizeof (rtx *));
1984
1985       for (i = 0; i < XVECLEN (body, 0); i++)
1986         if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1987           {
1988             rtx clobber = XVECEXP (body, 0, i);
1989             rtx reg = XEXP (clobber, 0);
1990             rtx *loc = & XEXP (clobber, 0);
1991
1992             if (GET_CODE (reg) == SUBREG && GET_CODE (SUBREG_REG (reg)) == REG)
1993               {
1994                 loc = & SUBREG_REG (reg);
1995                 reg = SUBREG_REG (reg);
1996               }
1997
1998             if (STACK_REG_P (reg))
1999               {
2000                 clobber_reg[n_clobbers] = reg;
2001                 clobber_loc[n_clobbers] = loc;
2002                 n_clobbers++;
2003               }
2004           }
2005     }
2006
2007   temp_stack = *regstack;
2008
2009   /* Put the input regs into the desired place in TEMP_STACK.  */
2010
2011   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2012     if (STACK_REG_P (recog_data.operand[i])
2013         && reg_class_subset_p (recog_op_alt[i][alt].class,
2014                                FLOAT_REGS)
2015         && recog_op_alt[i][alt].class != FLOAT_REGS)
2016       {
2017         /* If an operand needs to be in a particular reg in
2018            FLOAT_REGS, the constraint was either 't' or 'u'.  Since
2019            these constraints are for single register classes, and
2020            reload guaranteed that operand[i] is already in that class,
2021            we can just use REGNO (recog_data.operand[i]) to know which
2022            actual reg this operand needs to be in.  */
2023
2024         int regno = get_hard_regnum (&temp_stack, recog_data.operand[i]);
2025
2026         if (regno < 0)
2027           abort ();
2028
2029         if ((unsigned int) regno != REGNO (recog_data.operand[i]))
2030           {
2031             /* recog_data.operand[i] is not in the right place.  Find
2032                it and swap it with whatever is already in I's place.
2033                K is where recog_data.operand[i] is now.  J is where it
2034                should be.  */
2035             int j, k, temp;
2036
2037             k = temp_stack.top - (regno - FIRST_STACK_REG);
2038             j = (temp_stack.top
2039                  - (REGNO (recog_data.operand[i]) - FIRST_STACK_REG));
2040
2041             temp = temp_stack.reg[k];
2042             temp_stack.reg[k] = temp_stack.reg[j];
2043             temp_stack.reg[j] = temp;
2044           }
2045       }
2046
2047   /* Emit insns before INSN to make sure the reg-stack is in the right
2048      order.  */
2049
2050   change_stack (insn, regstack, &temp_stack, EMIT_BEFORE);
2051
2052   /* Make the needed input register substitutions.  Do death notes and
2053      clobbers too, because these are for inputs, not outputs.  */
2054
2055   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2056     if (STACK_REG_P (recog_data.operand[i]))
2057       {
2058         int regnum = get_hard_regnum (regstack, recog_data.operand[i]);
2059
2060         if (regnum < 0)
2061           abort ();
2062
2063         replace_reg (recog_data.operand_loc[i], regnum);
2064       }
2065
2066   for (i = 0; i < n_notes; i++)
2067     if (note_kind[i] == REG_DEAD)
2068       {
2069         int regnum = get_hard_regnum (regstack, note_reg[i]);
2070
2071         if (regnum < 0)
2072           abort ();
2073
2074         replace_reg (note_loc[i], regnum);
2075       }
2076
2077   for (i = 0; i < n_clobbers; i++)
2078     {
2079       /* It's OK for a CLOBBER to reference a reg that is not live.
2080          Don't try to replace it in that case.  */
2081       int regnum = get_hard_regnum (regstack, clobber_reg[i]);
2082
2083       if (regnum >= 0)
2084         {
2085           /* Sigh - clobbers always have QImode.  But replace_reg knows
2086              that these regs can't be MODE_INT and will abort.  Just put
2087              the right reg there without calling replace_reg.  */
2088
2089           *clobber_loc[i] = FP_MODE_REG (regnum, DFmode);
2090         }
2091     }
2092
2093   /* Now remove from REGSTACK any inputs that the asm implicitly popped.  */
2094
2095   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2096     if (STACK_REG_P (recog_data.operand[i]))
2097       {
2098         /* An input reg is implicitly popped if it is tied to an
2099            output, or if there is a CLOBBER for it.  */
2100         int j;
2101
2102         for (j = 0; j < n_clobbers; j++)
2103           if (operands_match_p (clobber_reg[j], recog_data.operand[i]))
2104             break;
2105
2106         if (j < n_clobbers || recog_op_alt[i][alt].matches >= 0)
2107           {
2108             /* recog_data.operand[i] might not be at the top of stack.
2109                But that's OK, because all we need to do is pop the
2110                right number of regs off of the top of the reg-stack.
2111                record_asm_stack_regs guaranteed that all implicitly
2112                popped regs were grouped at the top of the reg-stack.  */
2113
2114             CLEAR_HARD_REG_BIT (regstack->reg_set,
2115                                 regstack->reg[regstack->top]);
2116             regstack->top--;
2117           }
2118       }
2119
2120   /* Now add to REGSTACK any outputs that the asm implicitly pushed.
2121      Note that there isn't any need to substitute register numbers.
2122      ???  Explain why this is true.  */
2123
2124   for (i = LAST_STACK_REG; i >= FIRST_STACK_REG; i--)
2125     {
2126       /* See if there is an output for this hard reg.  */
2127       int j;
2128
2129       for (j = 0; j < n_outputs; j++)
2130         if (STACK_REG_P (recog_data.operand[j])
2131             && REGNO (recog_data.operand[j]) == (unsigned) i)
2132           {
2133             regstack->reg[++regstack->top] = i;
2134             SET_HARD_REG_BIT (regstack->reg_set, i);
2135             break;
2136           }
2137     }
2138
2139   /* Now emit a pop insn for any REG_UNUSED output, or any REG_DEAD
2140      input that the asm didn't implicitly pop.  If the asm didn't
2141      implicitly pop an input reg, that reg will still be live.
2142
2143      Note that we can't use find_regno_note here: the register numbers
2144      in the death notes have already been substituted.  */
2145
2146   for (i = 0; i < n_outputs; i++)
2147     if (STACK_REG_P (recog_data.operand[i]))
2148       {
2149         int j;
2150
2151         for (j = 0; j < n_notes; j++)
2152           if (REGNO (recog_data.operand[i]) == REGNO (note_reg[j])
2153               && note_kind[j] == REG_UNUSED)
2154             {
2155               insn = emit_pop_insn (insn, regstack, recog_data.operand[i],
2156                                     EMIT_AFTER);
2157               break;
2158             }
2159       }
2160
2161   for (i = n_outputs; i < n_outputs + n_inputs; i++)
2162     if (STACK_REG_P (recog_data.operand[i]))
2163       {
2164         int j;
2165
2166         for (j = 0; j < n_notes; j++)
2167           if (REGNO (recog_data.operand[i]) == REGNO (note_reg[j])
2168               && note_kind[j] == REG_DEAD
2169               && TEST_HARD_REG_BIT (regstack->reg_set,
2170                                     REGNO (recog_data.operand[i])))
2171             {
2172               insn = emit_pop_insn (insn, regstack, recog_data.operand[i],
2173                                     EMIT_AFTER);
2174               break;
2175             }
2176       }
2177 }
2178 \f
2179 /* Substitute stack hard reg numbers for stack virtual registers in
2180    INSN.  Non-stack register numbers are not changed.  REGSTACK is the
2181    current stack content.  Insns may be emitted as needed to arrange the
2182    stack for the 387 based on the contents of the insn.  */
2183
2184 static void
2185 subst_stack_regs (rtx insn, stack regstack)
2186 {
2187   rtx *note_link, note;
2188   int i;
2189
2190   if (GET_CODE (insn) == CALL_INSN)
2191     {
2192       int top = regstack->top;
2193
2194       /* If there are any floating point parameters to be passed in
2195          registers for this call, make sure they are in the right
2196          order.  */
2197
2198       if (top >= 0)
2199         {
2200           straighten_stack (PREV_INSN (insn), regstack);
2201
2202           /* Now mark the arguments as dead after the call.  */
2203
2204           while (regstack->top >= 0)
2205             {
2206               CLEAR_HARD_REG_BIT (regstack->reg_set, FIRST_STACK_REG + regstack->top);
2207               regstack->top--;
2208             }
2209         }
2210     }
2211
2212   /* Do the actual substitution if any stack regs are mentioned.
2213      Since we only record whether entire insn mentions stack regs, and
2214      subst_stack_regs_pat only works for patterns that contain stack regs,
2215      we must check each pattern in a parallel here.  A call_value_pop could
2216      fail otherwise.  */
2217
2218   if (stack_regs_mentioned (insn))
2219     {
2220       int n_operands = asm_noperands (PATTERN (insn));
2221       if (n_operands >= 0)
2222         {
2223           /* This insn is an `asm' with operands.  Decode the operands,
2224              decide how many are inputs, and do register substitution.
2225              Any REG_UNUSED notes will be handled by subst_asm_stack_regs.  */
2226
2227           subst_asm_stack_regs (insn, regstack);
2228           return;
2229         }
2230
2231       if (GET_CODE (PATTERN (insn)) == PARALLEL)
2232         for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
2233           {
2234             if (stack_regs_mentioned_p (XVECEXP (PATTERN (insn), 0, i)))
2235               subst_stack_regs_pat (insn, regstack,
2236                                     XVECEXP (PATTERN (insn), 0, i));
2237           }
2238       else
2239         subst_stack_regs_pat (insn, regstack, PATTERN (insn));
2240     }
2241
2242   /* subst_stack_regs_pat may have deleted a no-op insn.  If so, any
2243      REG_UNUSED will already have been dealt with, so just return.  */
2244
2245   if (GET_CODE (insn) == NOTE || INSN_DELETED_P (insn))
2246     return;
2247
2248   /* If there is a REG_UNUSED note on a stack register on this insn,
2249      the indicated reg must be popped.  The REG_UNUSED note is removed,
2250      since the form of the newly emitted pop insn references the reg,
2251      making it no longer `unset'.  */
2252
2253   note_link = &REG_NOTES (insn);
2254   for (note = *note_link; note; note = XEXP (note, 1))
2255     if (REG_NOTE_KIND (note) == REG_UNUSED && STACK_REG_P (XEXP (note, 0)))
2256       {
2257         *note_link = XEXP (note, 1);
2258         insn = emit_pop_insn (insn, regstack, XEXP (note, 0), EMIT_AFTER);
2259       }
2260     else
2261       note_link = &XEXP (note, 1);
2262 }
2263 \f
2264 /* Change the organization of the stack so that it fits a new basic
2265    block.  Some registers might have to be popped, but there can never be
2266    a register live in the new block that is not now live.
2267
2268    Insert any needed insns before or after INSN, as indicated by
2269    WHERE.  OLD is the original stack layout, and NEW is the desired
2270    form.  OLD is updated to reflect the code emitted, ie, it will be
2271    the same as NEW upon return.
2272
2273    This function will not preserve block_end[].  But that information
2274    is no longer needed once this has executed.  */
2275
2276 static void
2277 change_stack (rtx insn, stack old, stack new, enum emit_where where)
2278 {
2279   int reg;
2280   int update_end = 0;
2281
2282   /* We will be inserting new insns "backwards".  If we are to insert
2283      after INSN, find the next insn, and insert before it.  */
2284
2285   if (where == EMIT_AFTER)
2286     {
2287       if (current_block && current_block->end == insn)
2288         update_end = 1;
2289       insn = NEXT_INSN (insn);
2290     }
2291
2292   /* Pop any registers that are not needed in the new block.  */
2293
2294   for (reg = old->top; reg >= 0; reg--)
2295     if (! TEST_HARD_REG_BIT (new->reg_set, old->reg[reg]))
2296       emit_pop_insn (insn, old, FP_MODE_REG (old->reg[reg], DFmode),
2297                      EMIT_BEFORE);
2298
2299   if (new->top == -2)
2300     {
2301       /* If the new block has never been processed, then it can inherit
2302          the old stack order.  */
2303
2304       new->top = old->top;
2305       memcpy (new->reg, old->reg, sizeof (new->reg));
2306     }
2307   else
2308     {
2309       /* This block has been entered before, and we must match the
2310          previously selected stack order.  */
2311
2312       /* By now, the only difference should be the order of the stack,
2313          not their depth or liveliness.  */
2314
2315       GO_IF_HARD_REG_EQUAL (old->reg_set, new->reg_set, win);
2316       abort ();
2317     win:
2318       if (old->top != new->top)
2319         abort ();
2320
2321       /* If the stack is not empty (new->top != -1), loop here emitting
2322          swaps until the stack is correct.
2323
2324          The worst case number of swaps emitted is N + 2, where N is the
2325          depth of the stack.  In some cases, the reg at the top of
2326          stack may be correct, but swapped anyway in order to fix
2327          other regs.  But since we never swap any other reg away from
2328          its correct slot, this algorithm will converge.  */
2329
2330       if (new->top != -1)
2331         do
2332           {
2333             /* Swap the reg at top of stack into the position it is
2334                supposed to be in, until the correct top of stack appears.  */
2335
2336             while (old->reg[old->top] != new->reg[new->top])
2337               {
2338                 for (reg = new->top; reg >= 0; reg--)
2339                   if (new->reg[reg] == old->reg[old->top])
2340                     break;
2341
2342                 if (reg == -1)
2343                   abort ();
2344
2345                 emit_swap_insn (insn, old,
2346                                 FP_MODE_REG (old->reg[reg], DFmode));
2347               }
2348
2349             /* See if any regs remain incorrect.  If so, bring an
2350              incorrect reg to the top of stack, and let the while loop
2351              above fix it.  */
2352
2353             for (reg = new->top; reg >= 0; reg--)
2354               if (new->reg[reg] != old->reg[reg])
2355                 {
2356                   emit_swap_insn (insn, old,
2357                                   FP_MODE_REG (old->reg[reg], DFmode));
2358                   break;
2359                 }
2360           } while (reg >= 0);
2361
2362       /* At this point there must be no differences.  */
2363
2364       for (reg = old->top; reg >= 0; reg--)
2365         if (old->reg[reg] != new->reg[reg])
2366           abort ();
2367     }
2368
2369   if (update_end)
2370     current_block->end = PREV_INSN (insn);
2371 }
2372 \f
2373 /* Print stack configuration.  */
2374
2375 static void
2376 print_stack (FILE *file, stack s)
2377 {
2378   if (! file)
2379     return;
2380
2381   if (s->top == -2)
2382     fprintf (file, "uninitialized\n");
2383   else if (s->top == -1)
2384     fprintf (file, "empty\n");
2385   else
2386     {
2387       int i;
2388       fputs ("[ ", file);
2389       for (i = 0; i <= s->top; ++i)
2390         fprintf (file, "%d ", s->reg[i]);
2391       fputs ("]\n", file);
2392     }
2393 }
2394 \f
2395 /* This function was doing life analysis.  We now let the regular live
2396    code do it's job, so we only need to check some extra invariants
2397    that reg-stack expects.  Primary among these being that all registers
2398    are initialized before use.
2399
2400    The function returns true when code was emitted to CFG edges and
2401    commit_edge_insertions needs to be called.  */
2402
2403 static int
2404 convert_regs_entry (void)
2405 {
2406   int inserted = 0;
2407   edge e;
2408   basic_block block;
2409
2410   FOR_EACH_BB_REVERSE (block)
2411     {
2412       block_info bi = BLOCK_INFO (block);
2413       int reg;
2414
2415       /* Set current register status at last instruction `uninitialized'.  */
2416       bi->stack_in.top = -2;
2417
2418       /* Copy live_at_end and live_at_start into temporaries.  */
2419       for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; reg++)
2420         {
2421           if (REGNO_REG_SET_P (block->global_live_at_end, reg))
2422             SET_HARD_REG_BIT (bi->out_reg_set, reg);
2423           if (REGNO_REG_SET_P (block->global_live_at_start, reg))
2424             SET_HARD_REG_BIT (bi->stack_in.reg_set, reg);
2425         }
2426     }
2427
2428   /* Load something into each stack register live at function entry.
2429      Such live registers can be caused by uninitialized variables or
2430      functions not returning values on all paths.  In order to keep
2431      the push/pop code happy, and to not scrog the register stack, we
2432      must put something in these registers.  Use a QNaN.
2433
2434      Note that we are inserting converted code here.  This code is
2435      never seen by the convert_regs pass.  */
2436
2437   for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2438     {
2439       basic_block block = e->dest;
2440       block_info bi = BLOCK_INFO (block);
2441       int reg, top = -1;
2442
2443       for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
2444         if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
2445           {
2446             rtx init;
2447
2448             bi->stack_in.reg[++top] = reg;
2449
2450             init = gen_rtx_SET (VOIDmode,
2451                                 FP_MODE_REG (FIRST_STACK_REG, SFmode),
2452                                 nan);
2453             insert_insn_on_edge (init, e);
2454             inserted = 1;
2455           }
2456
2457       bi->stack_in.top = top;
2458     }
2459
2460   return inserted;
2461 }
2462
2463 /* Construct the desired stack for function exit.  This will either
2464    be `empty', or the function return value at top-of-stack.  */
2465
2466 static void
2467 convert_regs_exit (void)
2468 {
2469   int value_reg_low, value_reg_high;
2470   stack output_stack;
2471   rtx retvalue;
2472
2473   retvalue = stack_result (current_function_decl);
2474   value_reg_low = value_reg_high = -1;
2475   if (retvalue)
2476     {
2477       value_reg_low = REGNO (retvalue);
2478       value_reg_high = value_reg_low
2479         + HARD_REGNO_NREGS (value_reg_low, GET_MODE (retvalue)) - 1;
2480     }
2481
2482   output_stack = &BLOCK_INFO (EXIT_BLOCK_PTR)->stack_in;
2483   if (value_reg_low == -1)
2484     output_stack->top = -1;
2485   else
2486     {
2487       int reg;
2488
2489       output_stack->top = value_reg_high - value_reg_low;
2490       for (reg = value_reg_low; reg <= value_reg_high; ++reg)
2491         {
2492           output_stack->reg[value_reg_high - reg] = reg;
2493           SET_HARD_REG_BIT (output_stack->reg_set, reg);
2494         }
2495     }
2496 }
2497
2498 /* Adjust the stack of this block on exit to match the stack of the
2499    target block, or copy stack info into the stack of the successor
2500    of the successor hasn't been processed yet.  */
2501 static bool
2502 compensate_edge (edge e, FILE *file)
2503 {
2504   basic_block block = e->src, target = e->dest;
2505   block_info bi = BLOCK_INFO (block);
2506   struct stack_def regstack, tmpstack;
2507   stack target_stack = &BLOCK_INFO (target)->stack_in;
2508   int reg;
2509
2510   current_block = block;
2511   regstack = bi->stack_out;
2512   if (file)
2513     fprintf (file, "Edge %d->%d: ", block->index, target->index);
2514
2515   if (target_stack->top == -2)
2516     {
2517       /* The target block hasn't had a stack order selected.
2518          We need merely ensure that no pops are needed.  */
2519       for (reg = regstack.top; reg >= 0; --reg)
2520         if (!TEST_HARD_REG_BIT (target_stack->reg_set, regstack.reg[reg]))
2521           break;
2522
2523       if (reg == -1)
2524         {
2525           if (file)
2526             fprintf (file, "new block; copying stack position\n");
2527
2528           /* change_stack kills values in regstack.  */
2529           tmpstack = regstack;
2530
2531           change_stack (block->end, &tmpstack, target_stack, EMIT_AFTER);
2532           return false;
2533         }
2534
2535       if (file)
2536         fprintf (file, "new block; pops needed\n");
2537     }
2538   else
2539     {
2540       if (target_stack->top == regstack.top)
2541         {
2542           for (reg = target_stack->top; reg >= 0; --reg)
2543             if (target_stack->reg[reg] != regstack.reg[reg])
2544               break;
2545
2546           if (reg == -1)
2547             {
2548               if (file)
2549                 fprintf (file, "no changes needed\n");
2550               return false;
2551             }
2552         }
2553
2554       if (file)
2555         {
2556           fprintf (file, "correcting stack to ");
2557           print_stack (file, target_stack);
2558         }
2559     }
2560
2561   /* Care for non-call EH edges specially.  The normal return path have
2562      values in registers.  These will be popped en masse by the unwind
2563      library.  */
2564   if ((e->flags & (EDGE_EH | EDGE_ABNORMAL_CALL)) == EDGE_EH)
2565     target_stack->top = -1;
2566
2567   /* Other calls may appear to have values live in st(0), but the
2568      abnormal return path will not have actually loaded the values.  */
2569   else if (e->flags & EDGE_ABNORMAL_CALL)
2570     {
2571       /* Assert that the lifetimes are as we expect -- one value
2572          live at st(0) on the end of the source block, and no
2573          values live at the beginning of the destination block.  */
2574       HARD_REG_SET tmp;
2575
2576       CLEAR_HARD_REG_SET (tmp);
2577       GO_IF_HARD_REG_EQUAL (target_stack->reg_set, tmp, eh1);
2578       abort ();
2579     eh1:
2580
2581       /* We are sure that there is st(0) live, otherwise we won't compensate.
2582          For complex return values, we may have st(1) live as well.  */
2583       SET_HARD_REG_BIT (tmp, FIRST_STACK_REG);
2584       if (TEST_HARD_REG_BIT (regstack.reg_set, FIRST_STACK_REG + 1))
2585         SET_HARD_REG_BIT (tmp, FIRST_STACK_REG + 1);
2586       GO_IF_HARD_REG_EQUAL (regstack.reg_set, tmp, eh2);
2587       abort ();
2588     eh2:
2589
2590       target_stack->top = -1;
2591     }
2592
2593   /* It is better to output directly to the end of the block
2594      instead of to the edge, because emit_swap can do minimal
2595      insn scheduling.  We can do this when there is only one
2596      edge out, and it is not abnormal.  */
2597   else if (block->succ->succ_next == NULL && !(e->flags & EDGE_ABNORMAL))
2598     {
2599       /* change_stack kills values in regstack.  */
2600       tmpstack = regstack;
2601
2602       change_stack (block->end, &tmpstack, target_stack,
2603                     (GET_CODE (block->end) == JUMP_INSN
2604                      ? EMIT_BEFORE : EMIT_AFTER));
2605     }
2606   else
2607     {
2608       rtx seq, after;
2609
2610       /* We don't support abnormal edges.  Global takes care to
2611          avoid any live register across them, so we should never
2612          have to insert instructions on such edges.  */
2613       if (e->flags & EDGE_ABNORMAL)
2614         abort ();
2615
2616       current_block = NULL;
2617       start_sequence ();
2618
2619       /* ??? change_stack needs some point to emit insns after.  */
2620       after = emit_note (NOTE_INSN_DELETED);
2621
2622       tmpstack = regstack;
2623       change_stack (after, &tmpstack, target_stack, EMIT_BEFORE);
2624
2625       seq = get_insns ();
2626       end_sequence ();
2627
2628       insert_insn_on_edge (seq, e);
2629       return true;
2630     }
2631   return false;
2632 }
2633
2634 /* Convert stack register references in one block.  */
2635
2636 static int
2637 convert_regs_1 (FILE *file, basic_block block)
2638 {
2639   struct stack_def regstack;
2640   block_info bi = BLOCK_INFO (block);
2641   int inserted, reg;
2642   rtx insn, next;
2643   edge e, beste = NULL;
2644
2645   inserted = 0;
2646   any_malformed_asm = false;
2647
2648   /* Find the edge we will copy stack from.  It should be the most frequent
2649      one as it will get cheapest after compensation code is generated,
2650      if multiple such exists, take one with largest count, prefer critical
2651      one (as splitting critical edges is more expensive), or one with lowest
2652      index, to avoid random changes with different orders of the edges.  */
2653   for (e = block->pred; e ; e = e->pred_next)
2654     {
2655       if (e->flags & EDGE_DFS_BACK)
2656         ;
2657       else if (! beste)
2658         beste = e;
2659       else if (EDGE_FREQUENCY (beste) < EDGE_FREQUENCY (e))
2660         beste = e;
2661       else if (EDGE_FREQUENCY (beste) > EDGE_FREQUENCY (e))
2662         ;
2663       else if (beste->count < e->count)
2664         beste = e;
2665       else if (beste->count > e->count)
2666         ;
2667       else if ((EDGE_CRITICAL_P (e) != 0)
2668                != (EDGE_CRITICAL_P (beste) != 0))
2669         {
2670           if (EDGE_CRITICAL_P (e))
2671             beste = e;
2672         }
2673       else if (e->src->index < beste->src->index)
2674         beste = e;
2675     }
2676
2677   /* Entry block does have stack already initialized.  */
2678   if (bi->stack_in.top == -2)
2679     inserted |= compensate_edge (beste, file);
2680   else
2681     beste = NULL;
2682
2683   current_block = block;
2684
2685   if (file)
2686     {
2687       fprintf (file, "\nBasic block %d\nInput stack: ", block->index);
2688       print_stack (file, &bi->stack_in);
2689     }
2690
2691   /* Process all insns in this block.  Keep track of NEXT so that we
2692      don't process insns emitted while substituting in INSN.  */
2693   next = block->head;
2694   regstack = bi->stack_in;
2695   do
2696     {
2697       insn = next;
2698       next = NEXT_INSN (insn);
2699
2700       /* Ensure we have not missed a block boundary.  */
2701       if (next == NULL)
2702         abort ();
2703       if (insn == block->end)
2704         next = NULL;
2705
2706       /* Don't bother processing unless there is a stack reg
2707          mentioned or if it's a CALL_INSN.  */
2708       if (stack_regs_mentioned (insn)
2709           || GET_CODE (insn) == CALL_INSN)
2710         {
2711           if (file)
2712             {
2713               fprintf (file, "  insn %d input stack: ",
2714                        INSN_UID (insn));
2715               print_stack (file, &regstack);
2716             }
2717           subst_stack_regs (insn, &regstack);
2718         }
2719     }
2720   while (next);
2721
2722   if (file)
2723     {
2724       fprintf (file, "Expected live registers [");
2725       for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; ++reg)
2726         if (TEST_HARD_REG_BIT (bi->out_reg_set, reg))
2727           fprintf (file, " %d", reg);
2728       fprintf (file, " ]\nOutput stack: ");
2729       print_stack (file, &regstack);
2730     }
2731
2732   insn = block->end;
2733   if (GET_CODE (insn) == JUMP_INSN)
2734     insn = PREV_INSN (insn);
2735
2736   /* If the function is declared to return a value, but it returns one
2737      in only some cases, some registers might come live here.  Emit
2738      necessary moves for them.  */
2739
2740   for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; ++reg)
2741     {
2742       if (TEST_HARD_REG_BIT (bi->out_reg_set, reg)
2743           && ! TEST_HARD_REG_BIT (regstack.reg_set, reg))
2744         {
2745           rtx set;
2746
2747           if (file)
2748             {
2749               fprintf (file, "Emitting insn initializing reg %d\n",
2750                        reg);
2751             }
2752
2753           set = gen_rtx_SET (VOIDmode, FP_MODE_REG (reg, SFmode),
2754                              nan);
2755           insn = emit_insn_after (set, insn);
2756           subst_stack_regs (insn, &regstack);
2757         }
2758     }
2759
2760   /* Something failed if the stack lives don't match.  If we had malformed
2761      asms, we zapped the instruction itself, but that didn't produce the
2762      same pattern of register kills as before.  */
2763   GO_IF_HARD_REG_EQUAL (regstack.reg_set, bi->out_reg_set, win);
2764   if (!any_malformed_asm)
2765     abort ();
2766  win:
2767   bi->stack_out = regstack;
2768
2769   /* Compensate the back edges, as those wasn't visited yet.  */
2770   for (e = block->succ; e ; e = e->succ_next)
2771     {
2772       if (e->flags & EDGE_DFS_BACK
2773           || (e->dest == EXIT_BLOCK_PTR))
2774         {
2775           if (!BLOCK_INFO (e->dest)->done
2776               && e->dest != block)
2777             abort ();
2778           inserted |= compensate_edge (e, file);
2779         }
2780     }
2781   for (e = block->pred; e ; e = e->pred_next)
2782     {
2783       if (e != beste && !(e->flags & EDGE_DFS_BACK)
2784           && e->src != ENTRY_BLOCK_PTR)
2785         {
2786           if (!BLOCK_INFO (e->src)->done)
2787             abort ();
2788           inserted |= compensate_edge (e, file);
2789         }
2790     }
2791
2792   return inserted;
2793 }
2794
2795 /* Convert registers in all blocks reachable from BLOCK.  */
2796
2797 static int
2798 convert_regs_2 (FILE *file, basic_block block)
2799 {
2800   basic_block *stack, *sp;
2801   int inserted;
2802
2803   stack = xmalloc (sizeof (*stack) * n_basic_blocks);
2804   sp = stack;
2805
2806   *sp++ = block;
2807
2808   inserted = 0;
2809   do
2810     {
2811       edge e;
2812
2813       block = *--sp;
2814       inserted |= convert_regs_1 (file, block);
2815       BLOCK_INFO (block)->done = 1;
2816
2817       for (e = block->succ; e ; e = e->succ_next)
2818         if (! (e->flags & EDGE_DFS_BACK))
2819           {
2820             BLOCK_INFO (e->dest)->predecessors--;
2821             if (!BLOCK_INFO (e->dest)->predecessors)
2822                *sp++ = e->dest;
2823           }
2824     }
2825   while (sp != stack);
2826
2827   return inserted;
2828 }
2829
2830 /* Traverse all basic blocks in a function, converting the register
2831    references in each insn from the "flat" register file that gcc uses,
2832    to the stack-like registers the 387 uses.  */
2833
2834 static int
2835 convert_regs (FILE *file)
2836 {
2837   int inserted;
2838   basic_block b;
2839   edge e;
2840
2841   /* Initialize uninitialized registers on function entry.  */
2842   inserted = convert_regs_entry ();
2843
2844   /* Construct the desired stack for function exit.  */
2845   convert_regs_exit ();
2846   BLOCK_INFO (EXIT_BLOCK_PTR)->done = 1;
2847
2848   /* ??? Future: process inner loops first, and give them arbitrary
2849      initial stacks which emit_swap_insn can modify.  This ought to
2850      prevent double fxch that aften appears at the head of a loop.  */
2851
2852   /* Process all blocks reachable from all entry points.  */
2853   for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2854     inserted |= convert_regs_2 (file, e->dest);
2855
2856   /* ??? Process all unreachable blocks.  Though there's no excuse
2857      for keeping these even when not optimizing.  */
2858   FOR_EACH_BB (b)
2859     {
2860       block_info bi = BLOCK_INFO (b);
2861
2862       if (! bi->done)
2863         {
2864           int reg;
2865
2866           /* Create an arbitrary input stack.  */
2867           bi->stack_in.top = -1;
2868           for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
2869             if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
2870               bi->stack_in.reg[++bi->stack_in.top] = reg;
2871
2872           inserted |= convert_regs_2 (file, b);
2873         }
2874     }
2875   clear_aux_for_blocks ();
2876
2877   fixup_abnormal_edges ();
2878   if (inserted)
2879     commit_edge_insertions ();
2880
2881   if (file)
2882     fputc ('\n', file);
2883
2884   return inserted;
2885 }
2886 #endif /* STACK_REGS */
2887
2888 #include "gt-reg-stack.h"