OSDN Git Service

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