OSDN Git Service

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