OSDN Git Service

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