OSDN Git Service

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