OSDN Git Service

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