]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/gcc/config/i386/i386.c
This commit was generated by cvs2svn to compensate for changes in r56101,
[FreeBSD/FreeBSD.git] / contrib / gcc / config / i386 / i386.c
1 /* Subroutines for insn-output.c for Intel X86.
2    Copyright (C) 1988, 92, 94-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 /* $FreeBSD$ */
22
23 #include <setjmp.h>
24 #include "config.h"
25 #include "system.h"
26 #include "rtl.h"
27 #include "regs.h"
28 #include "hard-reg-set.h"
29 #include "real.h"
30 #include "insn-config.h"
31 #include "conditions.h"
32 #include "insn-flags.h"
33 #include "output.h"
34 #include "insn-attr.h"
35 #include "tree.h"
36 #include "flags.h"
37 #include "except.h"
38 #include "function.h"
39 #include "recog.h"
40 #include "expr.h"
41 #include "toplev.h"
42
43 #ifdef EXTRA_CONSTRAINT
44 /* If EXTRA_CONSTRAINT is defined, then the 'S'
45    constraint in REG_CLASS_FROM_LETTER will no longer work, and various
46    asm statements that need 'S' for class SIREG will break.  */
47  error EXTRA_CONSTRAINT conflicts with S constraint letter
48 /* The previous line used to be #error, but some compilers barf
49    even if the conditional was untrue.  */
50 #endif
51
52 #ifndef CHECK_STACK_LIMIT
53 #define CHECK_STACK_LIMIT -1
54 #endif
55
56 #define PIC_REG_USED                                    \
57   (flag_pic && (current_function_uses_pic_offset_table  \
58                 || current_function_uses_const_pool     \
59                 || profile_flag || profile_block_flag))
60
61 /* Type of an operand for ix86_{binary,unary}_operator_ok */
62 enum reg_mem
63 {
64   reg_p,
65   mem_p,
66   imm_p
67 };
68
69 /* Processor costs (relative to an add) */
70 struct processor_costs i386_cost = {    /* 386 specific costs */
71   1,                                    /* cost of an add instruction */
72   1,                                    /* cost of a lea instruction */
73   3,                                    /* variable shift costs */
74   2,                                    /* constant shift costs */
75   6,                                    /* cost of starting a multiply */
76   1,                                    /* cost of multiply per each bit set */
77   23                                    /* cost of a divide/mod */
78 };
79
80 struct processor_costs i486_cost = {    /* 486 specific costs */
81   1,                                    /* cost of an add instruction */
82   1,                                    /* cost of a lea instruction */
83   3,                                    /* variable shift costs */
84   2,                                    /* constant shift costs */
85   12,                                   /* cost of starting a multiply */
86   1,                                    /* cost of multiply per each bit set */
87   40                                    /* cost of a divide/mod */
88 };
89
90 struct processor_costs pentium_cost = {
91   1,                                    /* cost of an add instruction */
92   1,                                    /* cost of a lea instruction */
93   4,                                    /* variable shift costs */
94   1,                                    /* constant shift costs */
95   11,                                   /* cost of starting a multiply */
96   0,                                    /* cost of multiply per each bit set */
97   25                                    /* cost of a divide/mod */
98 };
99
100 struct processor_costs pentiumpro_cost = {
101   1,                                    /* cost of an add instruction */
102   1,                                    /* cost of a lea instruction */
103   3,                                    /* variable shift costs */
104   1,                                    /* constant shift costs */
105   4,                                    /* cost of starting a multiply */
106   0,                                    /* cost of multiply per each bit set */
107   17                                    /* cost of a divide/mod */
108 };
109
110 /* We use decoding time together with execution time. 
111    To get correct vale add 1 for short decodable, 2 for long decodable
112    and 4 for vector decodable instruction to execution time and divide
113    by two (because CPU is able to do two insns at a time). */
114
115 struct processor_costs k6_cost = {
116   1,                                    /* cost of an add instruction */
117   1,                                    /* cost of a lea instruction */
118   1,                                    /* variable shift costs */
119   1,                                    /* constant shift costs */
120   3,                                    /* cost of starting a multiply */
121   0,                                    /* cost of multiply per each bit set */
122   20                                    /* cost of a divide/mod */
123 };
124
125 struct processor_costs *ix86_cost = &pentium_cost;
126
127 /* Processor feature/optimization bitmasks.  */
128 #define m_386 (1<<PROCESSOR_I386)
129 #define m_486 (1<<PROCESSOR_I486)
130 #define m_PENT (1<<PROCESSOR_PENTIUM)
131 #define m_PPRO (1<<PROCESSOR_PENTIUMPRO)
132 #define m_K6  (1<<PROCESSOR_K6)
133
134 const int x86_use_leave = m_386 | m_K6;
135 const int x86_push_memory = m_386 | m_K6;
136 const int x86_zero_extend_with_and = m_486 | m_PENT;
137 const int x86_movx = m_386 | m_PPRO | m_K6;
138 const int x86_double_with_add = ~(m_386 | m_PENT | m_PPRO);
139 const int x86_use_bit_test = m_386;
140 const int x86_unroll_strlen = m_486 | m_PENT | m_PPRO;
141 const int x86_use_q_reg = m_PENT | m_PPRO | m_K6;
142 const int x86_use_any_reg = m_486;
143 const int x86_cmove = m_PPRO;
144 const int x86_deep_branch = m_PPRO| m_K6;
145
146 #define AT_BP(mode) (gen_rtx_MEM ((mode), frame_pointer_rtx))
147
148 extern FILE *asm_out_file;
149 extern char *strcat ();
150
151 static void ix86_epilogue PROTO((int));
152 static void ix86_prologue PROTO((int));
153
154 char *singlemove_string ();
155 char *output_move_const_single ();
156 char *output_fp_cc0_set ();
157
158 char *hi_reg_name[] = HI_REGISTER_NAMES;
159 char *qi_reg_name[] = QI_REGISTER_NAMES;
160 char *qi_high_reg_name[] = QI_HIGH_REGISTER_NAMES;
161
162 /* Array of the smallest class containing reg number REGNO, indexed by
163    REGNO.  Used by REGNO_REG_CLASS in i386.h. */
164
165 enum reg_class regclass_map[FIRST_PSEUDO_REGISTER] =
166 {
167   /* ax, dx, cx, bx */
168   AREG, DREG, CREG, BREG,
169   /* si, di, bp, sp */
170   SIREG, DIREG, INDEX_REGS, GENERAL_REGS,
171   /* FP registers */
172   FP_TOP_REG, FP_SECOND_REG, FLOAT_REGS, FLOAT_REGS,
173   FLOAT_REGS, FLOAT_REGS, FLOAT_REGS, FLOAT_REGS,
174   /* arg pointer */
175   INDEX_REGS
176 };
177
178 /* Test and compare insns in i386.md store the information needed to
179    generate branch and scc insns here.  */
180
181 struct rtx_def *i386_compare_op0 = NULL_RTX;
182 struct rtx_def *i386_compare_op1 = NULL_RTX;
183 struct rtx_def *(*i386_compare_gen)(), *(*i386_compare_gen_eq)();
184
185 /* which cpu are we scheduling for */
186 enum processor_type ix86_cpu;
187
188 /* which instruction set architecture to use.  */
189 int ix86_arch;
190
191 /* Strings to hold which cpu and instruction set architecture  to use.  */
192 char *ix86_cpu_string;          /* for -mcpu=<xxx> */
193 char *ix86_arch_string;         /* for -march=<xxx> */
194
195 /* Register allocation order */
196 char *i386_reg_alloc_order;
197 static char regs_allocated[FIRST_PSEUDO_REGISTER];
198
199 /* # of registers to use to pass arguments. */
200 char *i386_regparm_string;
201
202 /* i386_regparm_string as a number */
203 int i386_regparm;
204
205 /* Alignment to use for loops and jumps:  */
206
207 /* Power of two alignment for loops. */
208 char *i386_align_loops_string;
209
210 /* Power of two alignment for non-loop jumps. */
211 char *i386_align_jumps_string;
212
213 /* Power of two alignment for stack boundary in bytes.  */
214 char *i386_preferred_stack_boundary_string;
215
216 /* Preferred alignment for stack boundary in bits.  */
217 int i386_preferred_stack_boundary;
218
219 /* Values 1-5: see jump.c */
220 int i386_branch_cost;
221 char *i386_branch_cost_string;
222
223 /* Power of two alignment for functions. */
224 int i386_align_funcs;
225 char *i386_align_funcs_string;
226
227 /* Power of two alignment for loops. */
228 int i386_align_loops;
229
230 /* Power of two alignment for non-loop jumps. */
231 int i386_align_jumps;
232
233 /* Sometimes certain combinations of command options do not make
234    sense on a particular target machine.  You can define a macro
235    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
236    defined, is executed once just after all the command options have
237    been parsed.
238
239    Don't use this macro to turn on various extra optimizations for
240    `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.  */
241
242 void
243 override_options ()
244 {
245   int ch, i, j;
246   int def_align;
247
248   static struct ptt
249     {
250       char *name;               /* Canonical processor name.  */
251       enum processor_type processor; /* Processor type enum value.  */
252       struct processor_costs *cost; /* Processor costs */
253       int target_enable;        /* Target flags to enable.  */
254       int target_disable;       /* Target flags to disable.  */
255     } processor_target_table[] = {
256       {PROCESSOR_I386_STRING, PROCESSOR_I386, &i386_cost, 0, 0},
257       {PROCESSOR_I486_STRING, PROCESSOR_I486, &i486_cost, 0, 0},
258       {PROCESSOR_I586_STRING, PROCESSOR_PENTIUM, &pentium_cost, 0, 0},
259       {PROCESSOR_PENTIUM_STRING, PROCESSOR_PENTIUM, &pentium_cost, 0, 0},
260       {PROCESSOR_I686_STRING, PROCESSOR_PENTIUMPRO, &pentiumpro_cost, 0, 0},
261       {PROCESSOR_PENTIUMPRO_STRING, PROCESSOR_PENTIUMPRO,
262        &pentiumpro_cost, 0, 0},
263       {PROCESSOR_K6_STRING, PROCESSOR_K6, &k6_cost, 0, 0}
264     };
265
266   int ptt_size = sizeof (processor_target_table) / sizeof (struct ptt);
267
268 #ifdef SUBTARGET_OVERRIDE_OPTIONS
269   SUBTARGET_OVERRIDE_OPTIONS;
270 #endif
271
272   /* Validate registers in register allocation order.  */
273   if (i386_reg_alloc_order)
274     {
275       for (i = 0; (ch = i386_reg_alloc_order[i]) != '\0'; i++)
276         {
277           int regno = 0;
278
279           switch (ch)
280             {
281             case 'a':   regno = 0;      break;
282             case 'd':   regno = 1;      break;
283             case 'c':   regno = 2;      break;
284             case 'b':   regno = 3;      break;
285             case 'S':   regno = 4;      break;
286             case 'D':   regno = 5;      break;
287             case 'B':   regno = 6;      break;
288
289             default:    fatal ("Register '%c' is unknown", ch);
290             }
291
292           if (regs_allocated[regno])
293             fatal ("Register '%c' already specified in allocation order", ch);
294
295           regs_allocated[regno] = 1;
296         }
297     }
298
299   if (ix86_arch_string == 0)
300     {
301       ix86_arch_string = PROCESSOR_PENTIUM_STRING;
302       if (ix86_cpu_string == 0)
303         ix86_cpu_string = PROCESSOR_DEFAULT_STRING;
304     }
305
306   for (i = 0; i < ptt_size; i++)
307     if (! strcmp (ix86_arch_string, processor_target_table[i].name))
308       {
309         ix86_arch = processor_target_table[i].processor;
310         if (ix86_cpu_string == 0)
311           ix86_cpu_string = processor_target_table[i].name;
312         break;
313       }
314
315   if (i == ptt_size)
316     {
317       error ("bad value (%s) for -march= switch", ix86_arch_string);
318       ix86_arch_string = PROCESSOR_PENTIUM_STRING;
319       ix86_arch = PROCESSOR_DEFAULT;
320     }
321
322   if (ix86_cpu_string == 0)
323     ix86_cpu_string = PROCESSOR_DEFAULT_STRING;
324
325   for (j = 0; j < ptt_size; j++)
326     if (! strcmp (ix86_cpu_string, processor_target_table[j].name))
327       {
328         ix86_cpu = processor_target_table[j].processor;
329         ix86_cost = processor_target_table[j].cost;
330         if (i > j && (int) ix86_arch >= (int) PROCESSOR_K6)
331           error ("-mcpu=%s does not support -march=%s",
332                  ix86_cpu_string, ix86_arch_string);
333
334         target_flags |= processor_target_table[j].target_enable;
335         target_flags &= ~processor_target_table[j].target_disable;
336         break;
337       }
338
339   if (j == ptt_size)
340     {
341       error ("bad value (%s) for -mcpu= switch", ix86_cpu_string);
342       ix86_cpu_string = PROCESSOR_DEFAULT_STRING;
343       ix86_cpu = PROCESSOR_DEFAULT;
344     }
345
346   /* Validate -mregparm= value. */
347   if (i386_regparm_string)
348     {
349       i386_regparm = atoi (i386_regparm_string);
350       if (i386_regparm < 0 || i386_regparm > REGPARM_MAX)
351         fatal ("-mregparm=%d is not between 0 and %d",
352                i386_regparm, REGPARM_MAX);
353     }
354
355   /* The 486 suffers more from non-aligned cache line fills, and the
356      larger code size results in a larger cache foot-print and more misses.
357      The 486 has a 16 byte cache line, pentium and pentiumpro have a 32 byte
358      cache line.  */
359   def_align = (TARGET_486) ? 4 : 2;
360
361   /* Validate -malign-loops= value, or provide default.  */
362 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
363   i386_align_loops = 4;
364 #else
365   i386_align_loops = 2;
366 #endif
367   if (i386_align_loops_string)
368     {
369       i386_align_loops = atoi (i386_align_loops_string);
370       if (i386_align_loops < 0 || i386_align_loops > MAX_CODE_ALIGN)
371         fatal ("-malign-loops=%d is not between 0 and %d",
372                i386_align_loops, MAX_CODE_ALIGN);
373     }
374
375   /* Validate -malign-jumps= value, or provide default.  */
376 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
377   i386_align_jumps = 4;
378 #else
379   i386_align_jumps = def_align;
380 #endif
381   if (i386_align_jumps_string)
382     {
383       i386_align_jumps = atoi (i386_align_jumps_string);
384       if (i386_align_jumps < 0 || i386_align_jumps > MAX_CODE_ALIGN)
385         fatal ("-malign-jumps=%d is not between 0 and %d",
386                i386_align_jumps, MAX_CODE_ALIGN);
387     }
388
389   /* Validate -malign-functions= value, or provide default. */
390   i386_align_funcs = def_align;
391   if (i386_align_funcs_string)
392     {
393       i386_align_funcs = atoi (i386_align_funcs_string);
394       if (i386_align_funcs < 0 || i386_align_funcs > MAX_CODE_ALIGN)
395         fatal ("-malign-functions=%d is not between 0 and %d",
396                i386_align_funcs, MAX_CODE_ALIGN);
397     }
398
399   /* Validate -mpreferred_stack_boundary= value, or provide default.
400      The default of 128 bits is for Pentium III's SSE __m128.  */
401   i386_preferred_stack_boundary = 128;
402   if (i386_preferred_stack_boundary_string)
403     {
404       i = atoi (i386_preferred_stack_boundary_string);
405       if (i < 2 || i > 31)
406         fatal ("-mpreferred_stack_boundary=%d is not between 2 and 31", i);
407       i386_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
408     }
409
410   /* Validate -mbranch-cost= value, or provide default. */
411   i386_branch_cost = 1;
412   if (i386_branch_cost_string)
413     {
414       i386_branch_cost = atoi (i386_branch_cost_string);
415       if (i386_branch_cost < 0 || i386_branch_cost > 5)
416         fatal ("-mbranch-cost=%d is not between 0 and 5", i386_branch_cost);
417     }
418
419   /* Keep nonleaf frame pointers.  */
420   if (TARGET_OMIT_LEAF_FRAME_POINTER)
421     flag_omit_frame_pointer = 1;
422 }
423 \f
424 /* A C statement (sans semicolon) to choose the order in which to
425    allocate hard registers for pseudo-registers local to a basic
426    block.
427
428    Store the desired register order in the array `reg_alloc_order'.
429    Element 0 should be the register to allocate first; element 1, the
430    next register; and so on.
431
432    The macro body should not assume anything about the contents of
433    `reg_alloc_order' before execution of the macro.
434
435    On most machines, it is not necessary to define this macro.  */
436
437 void
438 order_regs_for_local_alloc ()
439 {
440   int i, ch, order;
441
442   /* User specified the register allocation order.  */
443
444   if (i386_reg_alloc_order)
445     {
446       for (i = order = 0; (ch = i386_reg_alloc_order[i]) != '\0'; i++)
447         {
448           int regno = 0;
449
450           switch (ch)
451             {
452             case 'a':   regno = 0;      break;
453             case 'd':   regno = 1;      break;
454             case 'c':   regno = 2;      break;
455             case 'b':   regno = 3;      break;
456             case 'S':   regno = 4;      break;
457             case 'D':   regno = 5;      break;
458             case 'B':   regno = 6;      break;
459             }
460
461           reg_alloc_order[order++] = regno;
462         }
463
464       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
465         {
466           if (! regs_allocated[i])
467             reg_alloc_order[order++] = i;
468         }
469     }
470
471   /* If user did not specify a register allocation order, use natural order. */
472   else
473     {
474       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
475         reg_alloc_order[i] = i;
476     }
477 }
478 \f
479 void
480 optimization_options (level, size)
481      int level;
482      int size ATTRIBUTE_UNUSED;
483 {
484   /* For -O2 and beyond, turn off -fschedule-insns by default.  It tends to
485      make the problem with not enough registers even worse.  */
486 #ifdef INSN_SCHEDULING
487   if (level > 1)
488     flag_schedule_insns = 0;
489 #endif
490 }
491 \f
492 /* Sign-extend a 16-bit constant */
493
494 struct rtx_def *
495 i386_sext16_if_const (op)
496      struct rtx_def *op;
497 {
498   if (GET_CODE (op) == CONST_INT)
499     {
500       HOST_WIDE_INT val = INTVAL (op);
501       HOST_WIDE_INT sext_val;
502       if (val & 0x8000)
503         sext_val = val | ~0xffff;
504       else
505         sext_val = val & 0xffff;
506       if (sext_val != val)
507         op = GEN_INT (sext_val);
508     }
509   return op;
510 }
511 \f
512 /* Return nonzero if the rtx is aligned */
513
514 static int
515 i386_aligned_reg_p (regno)
516      int regno;
517 {
518   return (regno == STACK_POINTER_REGNUM
519           || (! flag_omit_frame_pointer && regno == FRAME_POINTER_REGNUM));
520 }
521
522 int
523 i386_aligned_p (op)
524      rtx op;
525 {
526   /* Registers and immediate operands are always "aligned". */
527   if (GET_CODE (op) != MEM)
528     return 1;
529
530   /* Don't even try to do any aligned optimizations with volatiles. */
531   if (MEM_VOLATILE_P (op))
532     return 0;
533
534   /* Get address of memory operand. */
535   op = XEXP (op, 0);
536
537   switch (GET_CODE (op))
538     {
539     case CONST_INT:
540       if (INTVAL (op) & 3)
541         break;
542       return 1;
543
544       /* Match "reg + offset" */
545     case PLUS:
546       if (GET_CODE (XEXP (op, 1)) != CONST_INT)
547         break;
548       if (INTVAL (XEXP (op, 1)) & 3)
549         break;
550
551       op = XEXP (op, 0);
552       if (GET_CODE (op) != REG)
553         break;
554
555       /* ... fall through ... */
556
557     case REG:
558       return i386_aligned_reg_p (REGNO (op));
559
560     default:
561       break;
562     }
563
564   return 0;
565 }
566 \f
567 /* Return nonzero if INSN looks like it won't compute useful cc bits
568    as a side effect.  This information is only a hint. */
569
570 int
571 i386_cc_probably_useless_p (insn)
572      rtx insn;
573 {
574   return ! next_cc0_user (insn);
575 }
576 \f
577 /* Return nonzero if IDENTIFIER with arguments ARGS is a valid machine specific
578    attribute for DECL.  The attributes in ATTRIBUTES have previously been
579    assigned to DECL.  */
580
581 int
582 i386_valid_decl_attribute_p (decl, attributes, identifier, args)
583      tree decl ATTRIBUTE_UNUSED;
584      tree attributes ATTRIBUTE_UNUSED;
585      tree identifier ATTRIBUTE_UNUSED;
586      tree args ATTRIBUTE_UNUSED;
587 {
588   return 0;
589 }
590
591 /* Return nonzero if IDENTIFIER with arguments ARGS is a valid machine specific
592    attribute for TYPE.  The attributes in ATTRIBUTES have previously been
593    assigned to TYPE.  */
594
595 int
596 i386_valid_type_attribute_p (type, attributes, identifier, args)
597      tree type;
598      tree attributes ATTRIBUTE_UNUSED;
599      tree identifier;
600      tree args;
601 {
602   if (TREE_CODE (type) != FUNCTION_TYPE
603       && TREE_CODE (type) != METHOD_TYPE
604       && TREE_CODE (type) != FIELD_DECL
605       && TREE_CODE (type) != TYPE_DECL)
606     return 0;
607
608   /* Stdcall attribute says callee is responsible for popping arguments
609      if they are not variable.  */
610   if (is_attribute_p ("stdcall", identifier))
611     return (args == NULL_TREE);
612
613   /* Cdecl attribute says the callee is a normal C declaration. */
614   if (is_attribute_p ("cdecl", identifier))
615     return (args == NULL_TREE);
616
617   /* Regparm attribute specifies how many integer arguments are to be
618      passed in registers. */
619   if (is_attribute_p ("regparm", identifier))
620     {
621       tree cst;
622
623       if (! args || TREE_CODE (args) != TREE_LIST
624           || TREE_CHAIN (args) != NULL_TREE
625           || TREE_VALUE (args) == NULL_TREE)
626         return 0;
627
628       cst = TREE_VALUE (args);
629       if (TREE_CODE (cst) != INTEGER_CST)
630         return 0;
631
632       if (TREE_INT_CST_HIGH (cst) != 0
633           || TREE_INT_CST_LOW (cst) < 0
634           || TREE_INT_CST_LOW (cst) > REGPARM_MAX)
635         return 0;
636
637       return 1;
638     }
639
640   return 0;
641 }
642
643 /* Return 0 if the attributes for two types are incompatible, 1 if they
644    are compatible, and 2 if they are nearly compatible (which causes a
645    warning to be generated).  */
646
647 int
648 i386_comp_type_attributes (type1, type2)
649      tree type1;
650      tree type2;
651 {
652   /* Check for mismatch of non-default calling convention. */
653   char *rtdstr = TARGET_RTD ? "cdecl" : "stdcall";
654
655   if (TREE_CODE (type1) != FUNCTION_TYPE)
656     return 1;
657
658   /* Check for mismatched return types (cdecl vs stdcall).  */
659   if (!lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type1))
660       != !lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type2)))
661     return 0;
662   return 1;
663 }
664
665 \f
666 /* Value is the number of bytes of arguments automatically
667    popped when returning from a subroutine call.
668    FUNDECL is the declaration node of the function (as a tree),
669    FUNTYPE is the data type of the function (as a tree),
670    or for a library call it is an identifier node for the subroutine name.
671    SIZE is the number of bytes of arguments passed on the stack.
672
673    On the 80386, the RTD insn may be used to pop them if the number
674      of args is fixed, but if the number is variable then the caller
675      must pop them all.  RTD can't be used for library calls now
676      because the library is compiled with the Unix compiler.
677    Use of RTD is a selectable option, since it is incompatible with
678    standard Unix calling sequences.  If the option is not selected,
679    the caller must always pop the args.
680
681    The attribute stdcall is equivalent to RTD on a per module basis.  */
682
683 int
684 i386_return_pops_args (fundecl, funtype, size)
685      tree fundecl;
686      tree funtype;
687      int size;
688 {
689   int rtd = TARGET_RTD && (!fundecl || TREE_CODE (fundecl) != IDENTIFIER_NODE);
690
691     /* Cdecl functions override -mrtd, and never pop the stack. */
692   if (! lookup_attribute ("cdecl", TYPE_ATTRIBUTES (funtype))) {
693
694     /* Stdcall functions will pop the stack if not variable args. */
695     if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (funtype)))
696       rtd = 1;
697
698     if (rtd
699         && (TYPE_ARG_TYPES (funtype) == NULL_TREE
700             || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (funtype)))
701                 == void_type_node)))
702       return size;
703   }
704
705   /* Lose any fake structure return argument.  */
706   if (aggregate_value_p (TREE_TYPE (funtype)))
707     return GET_MODE_SIZE (Pmode);
708
709     return 0;
710 }
711
712 \f
713 /* Argument support functions.  */
714
715 /* Initialize a variable CUM of type CUMULATIVE_ARGS
716    for a call to a function whose data type is FNTYPE.
717    For a library call, FNTYPE is 0.  */
718
719 void
720 init_cumulative_args (cum, fntype, libname)
721      CUMULATIVE_ARGS *cum;      /* Argument info to initialize */
722      tree fntype;               /* tree ptr for function decl */
723      rtx libname;               /* SYMBOL_REF of library name or 0 */
724 {
725   static CUMULATIVE_ARGS zero_cum;
726   tree param, next_param;
727
728   if (TARGET_DEBUG_ARG)
729     {
730       fprintf (stderr, "\ninit_cumulative_args (");
731       if (fntype)
732         fprintf (stderr, "fntype code = %s, ret code = %s",
733                  tree_code_name[(int) TREE_CODE (fntype)],
734                  tree_code_name[(int) TREE_CODE (TREE_TYPE (fntype))]);
735       else
736         fprintf (stderr, "no fntype");
737
738       if (libname)
739         fprintf (stderr, ", libname = %s", XSTR (libname, 0));
740     }
741
742   *cum = zero_cum;
743
744   /* Set up the number of registers to use for passing arguments.  */
745   cum->nregs = i386_regparm;
746   if (fntype)
747     {
748       tree attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (fntype));
749
750       if (attr)
751         cum->nregs = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
752     }
753
754   /* Determine if this function has variable arguments.  This is
755      indicated by the last argument being 'void_type_mode' if there
756      are no variable arguments.  If there are variable arguments, then
757      we won't pass anything in registers */
758
759   if (cum->nregs)
760     {
761       for (param = (fntype) ? TYPE_ARG_TYPES (fntype) : 0;
762            param != 0; param = next_param)
763         {
764           next_param = TREE_CHAIN (param);
765           if (next_param == 0 && TREE_VALUE (param) != void_type_node)
766             cum->nregs = 0;
767         }
768     }
769
770   if (TARGET_DEBUG_ARG)
771     fprintf (stderr, ", nregs=%d )\n", cum->nregs);
772
773   return;
774 }
775
776 /* Update the data in CUM to advance over an argument
777    of mode MODE and data type TYPE.
778    (TYPE is null for libcalls where that information may not be available.)  */
779
780 void
781 function_arg_advance (cum, mode, type, named)
782      CUMULATIVE_ARGS *cum;      /* current arg information */
783      enum machine_mode mode;    /* current arg mode */
784      tree type;                 /* type of the argument or 0 if lib support */
785      int named;                 /* whether or not the argument was named */
786 {
787   int bytes
788     = (mode == BLKmode) ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
789   int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
790
791   if (TARGET_DEBUG_ARG)
792     fprintf (stderr,
793              "function_adv (sz=%d, wds=%2d, nregs=%d, mode=%s, named=%d)\n\n",
794              words, cum->words, cum->nregs, GET_MODE_NAME (mode), named);
795
796   cum->words += words;
797   cum->nregs -= words;
798   cum->regno += words;
799
800   if (cum->nregs <= 0)
801     {
802       cum->nregs = 0;
803       cum->regno = 0;
804     }
805
806   return;
807 }
808
809 /* Define where to put the arguments to a function.
810    Value is zero to push the argument on the stack,
811    or a hard register in which to store the argument.
812
813    MODE is the argument's machine mode.
814    TYPE is the data type of the argument (as a tree).
815     This is null for libcalls where that information may
816     not be available.
817    CUM is a variable of type CUMULATIVE_ARGS which gives info about
818     the preceding args and about the function being called.
819    NAMED is nonzero if this argument is a named parameter
820     (otherwise it is an extra parameter matching an ellipsis).  */
821
822 struct rtx_def *
823 function_arg (cum, mode, type, named)
824      CUMULATIVE_ARGS *cum;      /* current arg information */
825      enum machine_mode mode;    /* current arg mode */
826      tree type;                 /* type of the argument or 0 if lib support */
827      int named;                 /* != 0 for normal args, == 0 for ... args */
828 {
829   rtx ret   = NULL_RTX;
830   int bytes
831     = (mode == BLKmode) ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
832   int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
833
834   switch (mode)
835     {
836       /* For now, pass fp/complex values on the stack. */
837     default:
838       break;
839
840     case BLKmode:
841     case DImode:
842     case SImode:
843     case HImode:
844     case QImode:
845       if (words <= cum->nregs)
846         ret = gen_rtx_REG (mode, cum->regno);
847       break;
848     }
849
850   if (TARGET_DEBUG_ARG)
851     {
852       fprintf (stderr,
853                "function_arg (size=%d, wds=%2d, nregs=%d, mode=%4s, named=%d",
854                words, cum->words, cum->nregs, GET_MODE_NAME (mode), named);
855
856       if (ret)
857         fprintf (stderr, ", reg=%%e%s", reg_names[ REGNO(ret) ]);
858       else
859         fprintf (stderr, ", stack");
860
861       fprintf (stderr, " )\n");
862     }
863
864   return ret;
865 }
866
867 /* For an arg passed partly in registers and partly in memory,
868    this is the number of registers used.
869    For args passed entirely in registers or entirely in memory, zero.  */
870
871 int
872 function_arg_partial_nregs (cum, mode, type, named)
873      CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED;     /* current arg information */
874      enum machine_mode mode ATTRIBUTE_UNUSED;   /* current arg mode */
875      tree type ATTRIBUTE_UNUSED;                /* type of the argument or 0 if lib support */
876      int named ATTRIBUTE_UNUSED;                /* != 0 for normal args, == 0 for ... args */
877 {
878   return 0;
879 }
880 \f
881 char *
882 singlemove_string (operands)
883      rtx *operands;
884 {
885   rtx x;
886   if (GET_CODE (operands[0]) == MEM
887       && GET_CODE (x = XEXP (operands[0], 0)) == PRE_DEC)
888     {
889       if (XEXP (x, 0) != stack_pointer_rtx)
890         abort ();
891       return "push%L1 %1";
892     }
893   else if (GET_CODE (operands[1]) == CONST_DOUBLE)
894     return output_move_const_single (operands);
895   else if (GET_CODE (operands[0]) == REG || GET_CODE (operands[1]) == REG)
896     return AS2 (mov%L0,%1,%0);
897   else if (CONSTANT_P (operands[1]))
898     return AS2 (mov%L0,%1,%0);
899   else
900     {
901       output_asm_insn ("push%L1 %1", operands);
902       return "pop%L0 %0";
903     }
904 }
905 \f
906 /* Output an insn to add the constant N to the register X.  */
907
908 static void
909 asm_add (n, x)
910      int n;
911      rtx x;
912 {
913   rtx xops[2];
914   xops[0] = x;
915
916   if (n == -1)
917     output_asm_insn (AS1 (dec%L0,%0), xops);
918   else if (n == 1)
919     output_asm_insn (AS1 (inc%L0,%0), xops);
920   else if (n < 0 || n == 128)
921     {
922       xops[1] = GEN_INT (-n);
923       output_asm_insn (AS2 (sub%L0,%1,%0), xops);
924     }
925   else if (n > 0)
926     {
927       xops[1] = GEN_INT (n);
928       output_asm_insn (AS2 (add%L0,%1,%0), xops);
929     }
930 }
931 \f
932 /* Output assembler code to perform a doubleword move insn
933    with operands OPERANDS.  */
934
935 char *
936 output_move_double (operands)
937      rtx *operands;
938 {
939   enum {REGOP, OFFSOP, MEMOP, PUSHOP, POPOP, CNSTOP, RNDOP } optype0, optype1;
940   rtx latehalf[2];
941   rtx middlehalf[2];
942   rtx xops[2];
943   int dest_overlapped_low = 0;
944   int size = GET_MODE_SIZE (GET_MODE (operands[0]));
945
946   middlehalf[0] = 0;
947   middlehalf[1] = 0;
948
949   /* First classify both operands.  */
950
951   if (REG_P (operands[0]))
952     optype0 = REGOP;
953   else if (offsettable_memref_p (operands[0]))
954     optype0 = OFFSOP;
955   else if (GET_CODE (XEXP (operands[0], 0)) == POST_INC)
956     optype0 = POPOP;
957   else if (GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
958     optype0 = PUSHOP;
959   else if (GET_CODE (operands[0]) == MEM)
960     optype0 = MEMOP;
961   else
962     optype0 = RNDOP;
963
964   if (REG_P (operands[1]))
965     optype1 = REGOP;
966   else if (CONSTANT_P (operands[1]))
967     optype1 = CNSTOP;
968   else if (offsettable_memref_p (operands[1]))
969     optype1 = OFFSOP;
970   else if (GET_CODE (XEXP (operands[1], 0)) == POST_INC)
971     optype1 = POPOP;
972   else if (GET_CODE (XEXP (operands[1], 0)) == PRE_DEC)
973     optype1 = PUSHOP;
974   else if (GET_CODE (operands[1]) == MEM)
975     optype1 = MEMOP;
976   else
977     optype1 = RNDOP;
978
979   /* Check for the cases that are not supposed to happen
980      either due to the operand constraints or the fact
981      that all memory operands on the x86 are offsettable.
982      Abort if we get one, because generating code for these
983      cases is painful.  */
984
985   if (optype0 == RNDOP || optype1 == RNDOP
986       || optype0 == MEMOP || optype1 == MEMOP)
987     abort ();
988
989   /* If one operand is decrementing and one is incrementing
990      decrement the former register explicitly
991      and change that operand into ordinary indexing.  */
992
993   if (optype0 == PUSHOP && optype1 == POPOP)
994     {
995       /* ??? Can this ever happen on i386? */
996       operands[0] = XEXP (XEXP (operands[0], 0), 0);
997       asm_add (-size, operands[0]);
998       if (GET_MODE (operands[1]) == XFmode)
999         operands[0] = gen_rtx_MEM (XFmode, operands[0]);
1000       else if (GET_MODE (operands[0]) == DFmode)
1001         operands[0] = gen_rtx_MEM (DFmode, operands[0]);
1002       else
1003         operands[0] = gen_rtx_MEM (DImode, operands[0]);
1004       optype0 = OFFSOP;
1005     }
1006
1007   if (optype0 == POPOP && optype1 == PUSHOP)
1008     {
1009       /* ??? Can this ever happen on i386? */
1010       operands[1] = XEXP (XEXP (operands[1], 0), 0);
1011       asm_add (-size, operands[1]);
1012       if (GET_MODE (operands[1]) == XFmode)
1013         operands[1] = gen_rtx_MEM (XFmode, operands[1]);
1014       else if (GET_MODE (operands[1]) == DFmode)
1015         operands[1] = gen_rtx_MEM (DFmode, operands[1]);
1016       else
1017         operands[1] = gen_rtx_MEM (DImode, operands[1]);
1018       optype1 = OFFSOP;
1019     }
1020
1021   /* Ok, we can do one word at a time.
1022      Normally we do the low-numbered word first,
1023      but if either operand is autodecrementing then we
1024      do the high-numbered word first.
1025
1026      In either case, set up in LATEHALF the operands to use
1027      for the high-numbered word and in some cases alter the
1028      operands in OPERANDS to be suitable for the low-numbered word.  */
1029
1030   if (size == 12)
1031     {
1032       if (optype0 == REGOP)
1033         {
1034           middlehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
1035           latehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 2);
1036         }
1037       else if (optype0 == OFFSOP)
1038         {
1039           middlehalf[0] = adj_offsettable_operand (operands[0], 4);
1040           latehalf[0] = adj_offsettable_operand (operands[0], 8);
1041         }
1042       else
1043         {
1044          middlehalf[0] = operands[0];
1045          latehalf[0] = operands[0];
1046         }
1047
1048       if (optype1 == REGOP)
1049         {
1050           middlehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
1051           latehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2);
1052         }
1053       else if (optype1 == OFFSOP)
1054         {
1055           middlehalf[1] = adj_offsettable_operand (operands[1], 4);
1056           latehalf[1] = adj_offsettable_operand (operands[1], 8);
1057         }
1058       else if (optype1 == CNSTOP)
1059         {
1060           if (GET_CODE (operands[1]) == CONST_DOUBLE)
1061             {
1062               REAL_VALUE_TYPE r; long l[3];
1063
1064               REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
1065               REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
1066               operands[1] = GEN_INT (l[0]);
1067               middlehalf[1] = GEN_INT (l[1]);
1068               latehalf[1] = GEN_INT (l[2]);
1069             }
1070           else if (CONSTANT_P (operands[1]))
1071             /* No non-CONST_DOUBLE constant should ever appear here.  */
1072             abort ();
1073         }
1074       else
1075         {
1076           middlehalf[1] = operands[1];
1077           latehalf[1] = operands[1];
1078         }
1079     }
1080
1081   else
1082     {
1083       /* Size is not 12. */
1084
1085       if (optype0 == REGOP)
1086         latehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
1087       else if (optype0 == OFFSOP)
1088         latehalf[0] = adj_offsettable_operand (operands[0], 4);
1089       else
1090         latehalf[0] = operands[0];
1091
1092       if (optype1 == REGOP)
1093         latehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
1094       else if (optype1 == OFFSOP)
1095         latehalf[1] = adj_offsettable_operand (operands[1], 4);
1096       else if (optype1 == CNSTOP)
1097         split_double (operands[1], &operands[1], &latehalf[1]);
1098       else
1099         latehalf[1] = operands[1];
1100     }
1101
1102   /* If insn is effectively movd N (sp),-(sp) then we will do the
1103      high word first.  We should use the adjusted operand 1
1104      (which is N+4 (sp) or N+8 (sp))
1105      for the low word and middle word as well,
1106      to compensate for the first decrement of sp.  */
1107   if (optype0 == PUSHOP
1108       && REGNO (XEXP (XEXP (operands[0], 0), 0)) == STACK_POINTER_REGNUM
1109       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
1110     middlehalf[1] = operands[1] = latehalf[1];
1111
1112   /* For (set (reg:DI N) (mem:DI ... (reg:SI N) ...)),
1113      if the upper part of reg N does not appear in the MEM, arrange to
1114      emit the move late-half first.  Otherwise, compute the MEM address
1115      into the upper part of N and use that as a pointer to the memory
1116      operand.  */
1117   if (optype0 == REGOP && optype1 == OFFSOP)
1118     {
1119       if (reg_mentioned_p (operands[0], XEXP (operands[1], 0))
1120           && reg_mentioned_p (latehalf[0], XEXP (operands[1], 0)))
1121         {
1122           /* If both halves of dest are used in the src memory address,
1123              compute the address into latehalf of dest.  */
1124         compadr:
1125           xops[0] = latehalf[0];
1126           xops[1] = XEXP (operands[1], 0);
1127           output_asm_insn (AS2 (lea%L0,%a1,%0), xops);
1128           if (GET_MODE (operands[1]) == XFmode)
1129             {
1130               operands[1] = gen_rtx_MEM (XFmode, latehalf[0]);
1131               middlehalf[1] = adj_offsettable_operand (operands[1], size-8);
1132               latehalf[1] = adj_offsettable_operand (operands[1], size-4);
1133             }
1134           else
1135             {
1136               operands[1] = gen_rtx_MEM (DImode, latehalf[0]);
1137               latehalf[1] = adj_offsettable_operand (operands[1], size-4);
1138             }
1139         }
1140
1141       else if (size == 12
1142                  && reg_mentioned_p (middlehalf[0], XEXP (operands[1], 0)))
1143         {
1144           /* Check for two regs used by both source and dest. */
1145           if (reg_mentioned_p (operands[0], XEXP (operands[1], 0))
1146                 || reg_mentioned_p (latehalf[0], XEXP (operands[1], 0)))
1147             goto compadr;
1148
1149           /* Only the middle reg conflicts; simply put it last. */
1150           output_asm_insn (singlemove_string (operands), operands);
1151           output_asm_insn (singlemove_string (latehalf), latehalf);
1152           output_asm_insn (singlemove_string (middlehalf), middlehalf);
1153           return "";
1154         }
1155
1156       else if (reg_mentioned_p (operands[0], XEXP (operands[1], 0)))
1157         /* If the low half of dest is mentioned in the source memory
1158            address, the arrange to emit the move late half first.  */
1159         dest_overlapped_low = 1;
1160     }
1161
1162   /* If one or both operands autodecrementing,
1163      do the two words, high-numbered first.  */
1164
1165   /* Likewise,  the first move would clobber the source of the second one,
1166      do them in the other order.  This happens only for registers;
1167      such overlap can't happen in memory unless the user explicitly
1168      sets it up, and that is an undefined circumstance.  */
1169
1170 #if 0
1171   if (optype0 == PUSHOP || optype1 == PUSHOP
1172       || (optype0 == REGOP && optype1 == REGOP
1173           && REGNO (operands[0]) == REGNO (latehalf[1]))
1174       || dest_overlapped_low)
1175 #endif
1176
1177   if (optype0 == PUSHOP || optype1 == PUSHOP
1178       || (optype0 == REGOP && optype1 == REGOP
1179           && ((middlehalf[1] && REGNO (operands[0]) == REGNO (middlehalf[1]))
1180               || REGNO (operands[0]) == REGNO (latehalf[1])))
1181       || dest_overlapped_low)
1182     {
1183       /* Do the high-numbered word.  */
1184       output_asm_insn (singlemove_string (latehalf), latehalf);
1185
1186       if (size == 12)
1187         output_asm_insn (singlemove_string (middlehalf), middlehalf);
1188
1189       /* Do low-numbered word.  */
1190       return singlemove_string (operands);
1191     }
1192
1193   /* Normal case: do the two words, low-numbered first.  */
1194
1195   output_asm_insn (singlemove_string (operands), operands);
1196
1197   /* Do the middle one of the three words for long double */
1198   if (size == 12)
1199     output_asm_insn (singlemove_string (middlehalf), middlehalf);
1200
1201   /* Do the high-numbered word.  */
1202   output_asm_insn (singlemove_string (latehalf), latehalf);
1203
1204   return "";
1205 }
1206 \f
1207 #define MAX_TMPS 2              /* max temporary registers used */
1208
1209 /* Output the appropriate code to move push memory on the stack */
1210
1211 char *
1212 output_move_pushmem (operands, insn, length, tmp_start, n_operands)
1213      rtx operands[];
1214      rtx insn;
1215      int length;
1216      int tmp_start;
1217      int n_operands;
1218 {
1219   struct
1220     {
1221       char *load;
1222       char *push;
1223       rtx   xops[2];
1224     } tmp_info[MAX_TMPS];
1225
1226   rtx src = operands[1];
1227   int max_tmps = 0;
1228   int offset = 0;
1229   int stack_p = reg_overlap_mentioned_p (stack_pointer_rtx, src);
1230   int stack_offset = 0;
1231   int i, num_tmps;
1232   rtx xops[1];
1233
1234   if (! offsettable_memref_p (src))
1235     fatal_insn ("Source is not offsettable", insn);
1236
1237   if ((length & 3) != 0)
1238     fatal_insn ("Pushing non-word aligned size", insn);
1239
1240   /* Figure out which temporary registers we have available */
1241   for (i = tmp_start; i < n_operands; i++)
1242     {
1243       if (GET_CODE (operands[i]) == REG)
1244         {
1245           if (reg_overlap_mentioned_p (operands[i], src))
1246             continue;
1247
1248           tmp_info[ max_tmps++ ].xops[1] = operands[i];
1249           if (max_tmps == MAX_TMPS)
1250             break;
1251         }
1252     }
1253
1254   if (max_tmps == 0)
1255     for (offset = length - 4; offset >= 0; offset -= 4)
1256       {
1257         xops[0] = adj_offsettable_operand (src, offset + stack_offset);
1258         output_asm_insn (AS1(push%L0,%0), xops);
1259         if (stack_p)
1260           stack_offset += 4;
1261       }
1262
1263   else
1264     for (offset = length - 4; offset >= 0; )
1265       {
1266         for (num_tmps = 0; num_tmps < max_tmps && offset >= 0; num_tmps++)
1267           {
1268             tmp_info[num_tmps].load    = AS2(mov%L0,%0,%1);
1269             tmp_info[num_tmps].push    = AS1(push%L0,%1);
1270             tmp_info[num_tmps].xops[0]
1271               = adj_offsettable_operand (src, offset + stack_offset);
1272             offset -= 4;
1273           }
1274
1275         for (i = 0; i < num_tmps; i++)
1276           output_asm_insn (tmp_info[i].load, tmp_info[i].xops);
1277
1278         for (i = 0; i < num_tmps; i++)
1279           output_asm_insn (tmp_info[i].push, tmp_info[i].xops);
1280
1281         if (stack_p)
1282           stack_offset += 4*num_tmps;
1283       }
1284
1285   return "";
1286 }
1287 \f
1288 int
1289 standard_80387_constant_p (x)
1290      rtx x;
1291 {
1292 #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1293   REAL_VALUE_TYPE d;
1294   jmp_buf handler;
1295   int is0, is1;
1296
1297   if (setjmp (handler))
1298     return 0;
1299
1300   set_float_handler (handler);
1301   REAL_VALUE_FROM_CONST_DOUBLE (d, x);
1302   is0 = REAL_VALUES_EQUAL (d, dconst0) && !REAL_VALUE_MINUS_ZERO (d);
1303   is1 = REAL_VALUES_EQUAL (d, dconst1);
1304   set_float_handler (NULL_PTR);
1305
1306   if (is0)
1307     return 1;
1308
1309   if (is1)
1310     return 2;
1311
1312   /* Note that on the 80387, other constants, such as pi,
1313      are much slower to load as standard constants
1314      than to load from doubles in memory!  */
1315   /* ??? Not true on K6: all constants are equal cost.  */
1316 #endif
1317
1318   return 0;
1319 }
1320
1321 char *
1322 output_move_const_single (operands)
1323      rtx *operands;
1324 {
1325   if (FP_REG_P (operands[0]))
1326     {
1327       int conval = standard_80387_constant_p (operands[1]);
1328
1329       if (conval == 1)
1330         return "fldz";
1331
1332       if (conval == 2)
1333         return "fld1";
1334     }
1335
1336   if (GET_CODE (operands[1]) == CONST_DOUBLE)
1337     {
1338       REAL_VALUE_TYPE r; long l;
1339
1340       if (GET_MODE (operands[1]) == XFmode)
1341         abort ();
1342
1343       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
1344       REAL_VALUE_TO_TARGET_SINGLE (r, l);
1345       operands[1] = GEN_INT (l);
1346     }
1347
1348   return singlemove_string (operands);
1349 }
1350 \f
1351 /* Returns 1 if OP is either a symbol reference or a sum of a symbol
1352    reference and a constant.  */
1353
1354 int
1355 symbolic_operand (op, mode)
1356      register rtx op;
1357      enum machine_mode mode ATTRIBUTE_UNUSED;
1358 {
1359   switch (GET_CODE (op))
1360     {
1361     case SYMBOL_REF:
1362     case LABEL_REF:
1363       return 1;
1364
1365     case CONST:
1366       op = XEXP (op, 0);
1367       return ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
1368                || GET_CODE (XEXP (op, 0)) == LABEL_REF)
1369               && GET_CODE (XEXP (op, 1)) == CONST_INT);
1370
1371     default:
1372       return 0;
1373     }
1374 }
1375
1376 /* Return nonzero if OP is a constant shift count small enough to
1377    encode into an lea instruction.  */
1378
1379 int
1380 small_shift_operand (op, mode)
1381      rtx op;
1382      enum machine_mode mode ATTRIBUTE_UNUSED;
1383 {
1384   return (GET_CODE (op) == CONST_INT && INTVAL (op) > 0 && INTVAL (op) < 4);
1385 }
1386
1387 /* Test for a valid operand for a call instruction.
1388    Don't allow the arg pointer register or virtual regs
1389    since they may change into reg + const, which the patterns
1390    can't handle yet.  */
1391
1392 int
1393 call_insn_operand (op, mode)
1394      rtx op;
1395      enum machine_mode mode ATTRIBUTE_UNUSED;
1396 {
1397   if (GET_CODE (op) == MEM
1398       && ((CONSTANT_ADDRESS_P (XEXP (op, 0))
1399            /* This makes a difference for PIC.  */
1400            && general_operand (XEXP (op, 0), Pmode))
1401           || (GET_CODE (XEXP (op, 0)) == REG
1402               && XEXP (op, 0) != arg_pointer_rtx
1403               && ! (REGNO (XEXP (op, 0)) >= FIRST_PSEUDO_REGISTER
1404                     && REGNO (XEXP (op, 0)) <= LAST_VIRTUAL_REGISTER))))
1405     return 1;
1406
1407   return 0;
1408 }
1409
1410 /* Like call_insn_operand but allow (mem (symbol_ref ...))
1411    even if pic.  */
1412
1413 int
1414 expander_call_insn_operand (op, mode)
1415      rtx op;
1416      enum machine_mode mode ATTRIBUTE_UNUSED;
1417 {
1418   if (GET_CODE (op) == MEM
1419       && (CONSTANT_ADDRESS_P (XEXP (op, 0))
1420           || (GET_CODE (XEXP (op, 0)) == REG
1421               && XEXP (op, 0) != arg_pointer_rtx
1422               && ! (REGNO (XEXP (op, 0)) >= FIRST_PSEUDO_REGISTER
1423                     && REGNO (XEXP (op, 0)) <= LAST_VIRTUAL_REGISTER))))
1424     return 1;
1425
1426   return 0;
1427 }
1428
1429 /* Return 1 if OP is a comparison operator that can use the condition code
1430    generated by an arithmetic operation. */
1431
1432 int
1433 arithmetic_comparison_operator (op, mode)
1434      register rtx op;
1435      enum machine_mode mode;
1436 {
1437   enum rtx_code code;
1438
1439   if (mode != VOIDmode && mode != GET_MODE (op))
1440     return 0;
1441
1442   code = GET_CODE (op);
1443   if (GET_RTX_CLASS (code) != '<')
1444     return 0;
1445
1446   return (code != GT && code != LE);
1447 }
1448
1449 int
1450 ix86_logical_operator (op, mode)
1451      register rtx op;
1452      enum machine_mode mode ATTRIBUTE_UNUSED;
1453 {
1454   return GET_CODE (op) == AND || GET_CODE (op) == IOR || GET_CODE (op) == XOR;
1455 }
1456
1457 \f
1458 /* Returns 1 if OP contains a symbol reference */
1459
1460 int
1461 symbolic_reference_mentioned_p (op)
1462      rtx op;
1463 {
1464   register char *fmt;
1465   register int i;
1466
1467   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
1468     return 1;
1469
1470   fmt = GET_RTX_FORMAT (GET_CODE (op));
1471   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
1472     {
1473       if (fmt[i] == 'E')
1474         {
1475           register int j;
1476
1477           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
1478             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
1479               return 1;
1480         }
1481
1482       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
1483         return 1;
1484     }
1485
1486   return 0;
1487 }
1488 \f
1489 /* Attempt to expand a binary operator.  Make the expansion closer to the
1490    actual machine, then just general_operand, which will allow 3 separate
1491    memory references (one output, two input) in a single insn.  Return
1492    whether the insn fails, or succeeds.  */
1493
1494 int
1495 ix86_expand_binary_operator (code, mode, operands)
1496      enum rtx_code code;
1497      enum machine_mode mode;
1498      rtx operands[];
1499 {
1500   int modified;
1501
1502   /* Recognize <var1> = <value> <op> <var1> for commutative operators */
1503   if (GET_RTX_CLASS (code) == 'c'
1504       && (rtx_equal_p (operands[0], operands[2])
1505           || immediate_operand (operands[1], mode)))
1506     {
1507       rtx temp = operands[1];
1508       operands[1] = operands[2];
1509       operands[2] = temp;
1510     }
1511
1512   /* If optimizing, copy to regs to improve CSE */
1513   if (TARGET_PSEUDO && optimize
1514       && ((reload_in_progress | reload_completed) == 0))
1515     {
1516       if (GET_CODE (operands[1]) == MEM
1517           && ! rtx_equal_p (operands[0], operands[1]))
1518         operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
1519
1520       if (GET_CODE (operands[2]) == MEM)
1521         operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
1522
1523       if (GET_CODE (operands[1]) == CONST_INT && code == MINUS)
1524         {
1525           rtx temp = gen_reg_rtx (GET_MODE (operands[0]));
1526
1527           emit_move_insn (temp, operands[1]);
1528           operands[1] = temp;
1529           return TRUE;
1530         }
1531     }
1532
1533   if (!ix86_binary_operator_ok (code, mode, operands))
1534     {
1535       /* If not optimizing, try to make a valid insn (optimize code
1536          previously did this above to improve chances of CSE) */
1537
1538       if ((! TARGET_PSEUDO || !optimize)
1539           && ((reload_in_progress | reload_completed) == 0)
1540           && (GET_CODE (operands[1]) == MEM || GET_CODE (operands[2]) == MEM))
1541         {
1542           modified = FALSE;
1543           if (GET_CODE (operands[1]) == MEM
1544               && ! rtx_equal_p (operands[0], operands[1]))
1545             {
1546               operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
1547               modified = TRUE;
1548             }
1549
1550           if (GET_CODE (operands[2]) == MEM)
1551             {
1552               operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
1553               modified = TRUE;
1554             }
1555
1556           if (GET_CODE (operands[1]) == CONST_INT && code == MINUS)
1557             {
1558               rtx temp = gen_reg_rtx (GET_MODE (operands[0]));
1559
1560               emit_move_insn (temp, operands[1]);
1561               operands[1] = temp;
1562               return TRUE;
1563             }
1564
1565           if (modified && ! ix86_binary_operator_ok (code, mode, operands))
1566             return FALSE;
1567         }
1568       else
1569         return FALSE;
1570     }
1571
1572   return TRUE;
1573 }
1574 \f
1575 /* Return TRUE or FALSE depending on whether the binary operator meets the
1576    appropriate constraints.  */
1577
1578 int
1579 ix86_binary_operator_ok (code, mode, operands)
1580      enum rtx_code code;
1581      enum machine_mode mode ATTRIBUTE_UNUSED;
1582      rtx operands[3];
1583 {
1584   return (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)
1585     && (GET_CODE (operands[1]) != CONST_INT || GET_RTX_CLASS (code) == 'c');
1586 }
1587 \f
1588 /* Attempt to expand a unary operator.  Make the expansion closer to the
1589    actual machine, then just general_operand, which will allow 2 separate
1590    memory references (one output, one input) in a single insn.  Return
1591    whether the insn fails, or succeeds.  */
1592
1593 int
1594 ix86_expand_unary_operator (code, mode, operands)
1595      enum rtx_code code;
1596      enum machine_mode mode;
1597      rtx operands[];
1598 {
1599   /* If optimizing, copy to regs to improve CSE */
1600   if (TARGET_PSEUDO
1601       && optimize
1602       && ((reload_in_progress | reload_completed) == 0)
1603       && GET_CODE (operands[1]) == MEM)
1604     operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
1605
1606   if (! ix86_unary_operator_ok (code, mode, operands))
1607     {
1608       if ((! TARGET_PSEUDO || optimize == 0)
1609           && ((reload_in_progress | reload_completed) == 0)
1610           && GET_CODE (operands[1]) == MEM)
1611         {
1612           operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
1613           if (! ix86_unary_operator_ok (code, mode, operands))
1614             return FALSE;
1615         }
1616       else
1617         return FALSE;
1618     }
1619
1620   return TRUE;
1621 }
1622 \f
1623 /* Return TRUE or FALSE depending on whether the unary operator meets the
1624    appropriate constraints.  */
1625
1626 int
1627 ix86_unary_operator_ok (code, mode, operands)
1628      enum rtx_code code ATTRIBUTE_UNUSED;
1629      enum machine_mode mode ATTRIBUTE_UNUSED;
1630      rtx operands[2] ATTRIBUTE_UNUSED;
1631 {
1632   return TRUE;
1633 }
1634 \f
1635 static rtx pic_label_rtx;
1636 static char pic_label_name [256];
1637 static int pic_label_no = 0;
1638
1639 /* This function generates code for -fpic that loads %ebx with
1640    the return address of the caller and then returns.  */
1641
1642 void
1643 asm_output_function_prefix (file, name)
1644      FILE *file;
1645      char *name ATTRIBUTE_UNUSED;
1646 {
1647   rtx xops[2];
1648   xops[0] = pic_offset_table_rtx;
1649   xops[1] = stack_pointer_rtx;
1650
1651   /* Deep branch prediction favors having a return for every call. */
1652   if (PIC_REG_USED && TARGET_DEEP_BRANCH_PREDICTION)
1653     {
1654       tree prologue_node;
1655
1656       if (pic_label_rtx == 0)
1657         {
1658           pic_label_rtx = gen_label_rtx ();
1659           ASM_GENERATE_INTERNAL_LABEL (pic_label_name, "LPR", pic_label_no++);
1660           LABEL_NAME (pic_label_rtx) = pic_label_name;
1661         }
1662
1663       prologue_node = make_node (FUNCTION_DECL);
1664       DECL_RESULT (prologue_node) = 0;
1665
1666       /* This used to call ASM_DECLARE_FUNCTION_NAME() but since it's an
1667          internal (non-global) label that's being emitted, it didn't make
1668          sense to have .type information for local labels.   This caused
1669          the SCO OpenServer 5.0.4 ELF assembler grief (why are you giving
1670          me debug info for a label that you're declaring non-global?) this
1671          was changed to call ASM_OUTPUT_LABEL() instead. */
1672
1673
1674       ASM_OUTPUT_LABEL (file, pic_label_name); 
1675       output_asm_insn ("movl (%1),%0", xops);
1676       output_asm_insn ("ret", xops);
1677     }
1678 }
1679
1680 /* Generate the assembly code for function entry.
1681    FILE is an stdio stream to output the code to.
1682    SIZE is an int: how many units of temporary storage to allocate. */
1683
1684 void
1685 function_prologue (file, size)
1686      FILE *file ATTRIBUTE_UNUSED;
1687      int size ATTRIBUTE_UNUSED;
1688 {
1689   if (TARGET_SCHEDULE_PROLOGUE)
1690     {
1691       pic_label_rtx = 0;
1692       return;
1693     }
1694
1695   ix86_prologue (0);
1696 }
1697
1698 /* Expand the prologue into a bunch of separate insns. */
1699
1700 void
1701 ix86_expand_prologue ()
1702 {
1703   if (! TARGET_SCHEDULE_PROLOGUE)
1704       return;
1705
1706   ix86_prologue (1);
1707 }
1708
1709 void
1710 load_pic_register (do_rtl)
1711      int do_rtl;
1712 {
1713   rtx xops[4];
1714
1715   if (TARGET_DEEP_BRANCH_PREDICTION)
1716     {
1717       xops[0] = pic_offset_table_rtx;
1718       if (pic_label_rtx == 0)
1719         {
1720           pic_label_rtx = gen_label_rtx ();
1721           ASM_GENERATE_INTERNAL_LABEL (pic_label_name, "LPR", pic_label_no++);
1722           LABEL_NAME (pic_label_rtx) = pic_label_name;
1723         }
1724
1725       xops[1] = gen_rtx_MEM (QImode,
1726                          gen_rtx (SYMBOL_REF, Pmode,
1727                                   LABEL_NAME (pic_label_rtx)));
1728
1729       if (do_rtl)
1730         {
1731           emit_insn (gen_prologue_get_pc (xops[0], xops[1]));
1732           emit_insn (gen_prologue_set_got (xops[0],
1733 #ifdef YES_UNDERSCORES
1734                                            gen_rtx_SYMBOL_REF (Pmode,
1735                                                     "$__GLOBAL_OFFSET_TABLE_"),
1736 #else
1737                                            gen_rtx_SYMBOL_REF (Pmode,
1738                                                     "$_GLOBAL_OFFSET_TABLE_"),
1739 #endif
1740                                            xops[1]));
1741         }
1742       else
1743         {
1744           output_asm_insn (AS1 (call,%X1), xops);
1745           output_asm_insn ("addl $%__GLOBAL_OFFSET_TABLE_,%0", xops);
1746           pic_label_rtx = 0;
1747         }
1748     }
1749
1750   else
1751     {
1752       xops[0] = pic_offset_table_rtx;
1753       xops[1] = gen_label_rtx ();
1754
1755       if (do_rtl)
1756         {
1757           /* We can't put a raw CODE_LABEL into the RTL, and we can't emit
1758              a new CODE_LABEL after reload, so we need a single pattern to
1759              emit the 3 necessary instructions.  */
1760           emit_insn (gen_prologue_get_pc_and_set_got (xops[0]));
1761         }
1762       else
1763         {
1764           output_asm_insn (AS1 (call,%P1), xops);
1765           ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
1766                                      CODE_LABEL_NUMBER (xops[1]));
1767           output_asm_insn (AS1 (pop%L0,%0), xops);
1768           output_asm_insn ("addl $%__GLOBAL_OFFSET_TABLE_+[.-%P1],%0", xops);
1769         }
1770     }
1771
1772   /* When -fpic, we must emit a scheduling barrier, so that the instruction
1773      that restores %ebx (which is PIC_OFFSET_TABLE_REGNUM), does not get
1774      moved before any instruction which implicitly uses the got.   */
1775
1776   if (do_rtl)
1777     emit_insn (gen_blockage ());
1778 }
1779
1780 /* Compute the size of local storage taking into consideration the
1781    desired stack alignment which is to be maintained.  Also determine
1782    the number of registers saved below the local storage.  */
1783
1784 HOST_WIDE_INT
1785 ix86_compute_frame_size (size, nregs_on_stack)
1786      HOST_WIDE_INT size;
1787      int *nregs_on_stack;
1788 {
1789   int limit;
1790   int nregs;
1791   int regno;
1792   int padding;
1793   int pic_reg_used = PIC_REG_USED;
1794   HOST_WIDE_INT total_size;
1795
1796   limit = frame_pointer_needed
1797           ? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM;
1798
1799   nregs = 0;
1800
1801   for (regno = limit - 1; regno >= 0; regno--)
1802     if ((regs_ever_live[regno] && ! call_used_regs[regno])
1803         || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
1804       nregs++;
1805
1806   padding = 0;
1807   total_size = size + (nregs * UNITS_PER_WORD);
1808
1809 #ifdef PREFERRED_STACK_BOUNDARY
1810   {
1811     int offset;
1812     int preferred_alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
1813
1814     offset = 4;
1815     if (frame_pointer_needed)
1816       offset += UNITS_PER_WORD;
1817
1818     total_size += offset;
1819     
1820     padding = ((total_size + preferred_alignment - 1)
1821                & -preferred_alignment) - total_size;
1822
1823     if (padding < (((offset + preferred_alignment - 1)
1824                     & -preferred_alignment) - offset))
1825       padding += preferred_alignment;
1826
1827     /* Don't bother aligning the stack of a leaf function
1828        which doesn't allocate any stack slots.  */
1829     if (size == 0 && current_function_is_leaf)
1830       padding = 0;
1831   }
1832 #endif
1833
1834   if (nregs_on_stack)
1835     *nregs_on_stack = nregs;
1836
1837   return size + padding;
1838 }
1839
1840 static void
1841 ix86_prologue (do_rtl)
1842      int do_rtl;
1843 {
1844   register int regno;
1845   int limit;
1846   rtx xops[4];
1847   int pic_reg_used = PIC_REG_USED;
1848   HOST_WIDE_INT tsize = ix86_compute_frame_size (get_frame_size (), (int *)0);
1849   rtx insn;
1850   int cfa_offset = INCOMING_FRAME_SP_OFFSET, cfa_store_offset = cfa_offset;
1851
1852   xops[0] = stack_pointer_rtx;
1853   xops[1] = frame_pointer_rtx;
1854   xops[2] = GEN_INT (tsize);
1855
1856   if (frame_pointer_needed)
1857     {
1858       if (do_rtl)
1859         {
1860           insn = emit_insn (gen_rtx (SET, VOIDmode,
1861                                      gen_rtx_MEM (SImode,
1862                                               gen_rtx (PRE_DEC, SImode,
1863                                                        stack_pointer_rtx)),
1864                                      frame_pointer_rtx));
1865
1866           RTX_FRAME_RELATED_P (insn) = 1;
1867           insn = emit_move_insn (xops[1], xops[0]);
1868           RTX_FRAME_RELATED_P (insn) = 1;
1869         }
1870
1871       else
1872         {
1873           output_asm_insn ("push%L1 %1", xops);
1874 #ifdef INCOMING_RETURN_ADDR_RTX
1875           if (dwarf2out_do_frame ())
1876             {
1877               char *l = dwarf2out_cfi_label ();
1878
1879               cfa_store_offset += 4;
1880               cfa_offset = cfa_store_offset;
1881               dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, cfa_offset);
1882               dwarf2out_reg_save (l, FRAME_POINTER_REGNUM, - cfa_store_offset);
1883             }
1884 #endif
1885
1886           output_asm_insn (AS2 (mov%L0,%0,%1), xops);
1887 #ifdef INCOMING_RETURN_ADDR_RTX
1888           if (dwarf2out_do_frame ())
1889             dwarf2out_def_cfa ("", FRAME_POINTER_REGNUM, cfa_offset);
1890 #endif
1891         }
1892     }
1893
1894   if (tsize == 0)
1895     ;
1896   else if (! TARGET_STACK_PROBE || tsize < CHECK_STACK_LIMIT)
1897     {
1898       if (do_rtl)
1899         {
1900           insn = emit_insn (gen_prologue_set_stack_ptr (xops[2]));
1901           RTX_FRAME_RELATED_P (insn) = 1;
1902         }
1903       else
1904         {
1905           output_asm_insn (AS2 (sub%L0,%2,%0), xops);
1906 #ifdef INCOMING_RETURN_ADDR_RTX
1907           if (dwarf2out_do_frame ())
1908             {
1909               cfa_store_offset += tsize;
1910               if (! frame_pointer_needed)
1911                 {
1912                   cfa_offset = cfa_store_offset;
1913                   dwarf2out_def_cfa ("", STACK_POINTER_REGNUM, cfa_offset);
1914                 }
1915             }
1916 #endif
1917         }
1918     }
1919   else
1920     {
1921       xops[3] = gen_rtx_REG (SImode, 0);
1922       if (do_rtl)
1923       emit_move_insn (xops[3], xops[2]);
1924       else
1925         output_asm_insn (AS2 (mov%L0,%2,%3), xops);
1926
1927       xops[3] = gen_rtx_MEM (FUNCTION_MODE,
1928                          gen_rtx (SYMBOL_REF, Pmode, "_alloca"));
1929
1930       if (do_rtl)
1931         emit_call_insn (gen_rtx (CALL, VOIDmode, xops[3], const0_rtx));
1932       else
1933         output_asm_insn (AS1 (call,%P3), xops);
1934     }
1935
1936   /* Note If use enter it is NOT reversed args.
1937      This one is not reversed from intel!!
1938      I think enter is slower.  Also sdb doesn't like it.
1939      But if you want it the code is:
1940      {
1941      xops[3] = const0_rtx;
1942      output_asm_insn ("enter %2,%3", xops);
1943      }
1944      */
1945
1946   limit = (frame_pointer_needed ? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM);
1947   for (regno = limit - 1; regno >= 0; regno--)
1948     if ((regs_ever_live[regno] && ! call_used_regs[regno])
1949         || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
1950       {
1951         xops[0] = gen_rtx_REG (SImode, regno);
1952         if (do_rtl)
1953           {
1954             insn = emit_insn (gen_rtx (SET, VOIDmode,
1955                                        gen_rtx_MEM (SImode,
1956                                                 gen_rtx (PRE_DEC, SImode,
1957                                                          stack_pointer_rtx)),
1958                                        xops[0]));
1959
1960             RTX_FRAME_RELATED_P (insn) = 1;
1961           }
1962         else
1963           {
1964             output_asm_insn ("push%L0 %0", xops);
1965 #ifdef INCOMING_RETURN_ADDR_RTX
1966             if (dwarf2out_do_frame ())
1967               {
1968                 char *l = dwarf2out_cfi_label ();
1969
1970                 cfa_store_offset += 4;
1971                 if (! frame_pointer_needed)
1972                   {
1973                     cfa_offset = cfa_store_offset;
1974                     dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, cfa_offset);
1975                   }
1976
1977                 dwarf2out_reg_save (l, regno, - cfa_store_offset);
1978               }
1979 #endif
1980           }
1981       }
1982
1983 #ifdef SUBTARGET_PROLOGUE
1984   SUBTARGET_PROLOGUE;
1985 #endif  
1986
1987   if (pic_reg_used)
1988     load_pic_register (do_rtl);
1989
1990   /* If we are profiling, make sure no instructions are scheduled before
1991      the call to mcount.  However, if -fpic, the above call will have
1992      done that.  */
1993   if ((profile_flag || profile_block_flag)
1994       && ! pic_reg_used && do_rtl)
1995     emit_insn (gen_blockage ());
1996 }
1997
1998 /* Return 1 if it is appropriate to emit `ret' instructions in the
1999    body of a function.  Do this only if the epilogue is simple, needing a
2000    couple of insns.  Prior to reloading, we can't tell how many registers
2001    must be saved, so return 0 then.  Return 0 if there is no frame
2002    marker to de-allocate.
2003
2004    If NON_SAVING_SETJMP is defined and true, then it is not possible
2005    for the epilogue to be simple, so return 0.  This is a special case
2006    since NON_SAVING_SETJMP will not cause regs_ever_live to change
2007    until final, but jump_optimize may need to know sooner if a
2008    `return' is OK.  */
2009
2010 int
2011 ix86_can_use_return_insn_p ()
2012 {
2013   int regno;
2014   int nregs = 0;
2015   int reglimit = (frame_pointer_needed
2016                   ? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM);
2017
2018 #ifdef NON_SAVING_SETJMP
2019   if (NON_SAVING_SETJMP && current_function_calls_setjmp)
2020     return 0;
2021 #endif
2022
2023   if (! reload_completed)
2024     return 0;
2025
2026   for (regno = reglimit - 1; regno >= 0; regno--)
2027     if ((regs_ever_live[regno] && ! call_used_regs[regno])
2028         || (regno == PIC_OFFSET_TABLE_REGNUM && PIC_REG_USED))
2029       nregs++;
2030
2031   return nregs == 0 || ! frame_pointer_needed;
2032 }
2033
2034 /* This function generates the assembly code for function exit.
2035    FILE is an stdio stream to output the code to.
2036    SIZE is an int: how many units of temporary storage to deallocate. */
2037
2038 void
2039 function_epilogue (file, size)
2040      FILE *file ATTRIBUTE_UNUSED;
2041      int size ATTRIBUTE_UNUSED;
2042 {
2043     return;
2044 }
2045
2046 /* Restore function stack, frame, and registers. */
2047
2048 void
2049 ix86_expand_epilogue ()
2050 {
2051   ix86_epilogue (1);
2052 }
2053
2054 static void
2055 ix86_epilogue (do_rtl)
2056      int do_rtl;
2057 {
2058   register int regno;
2059   register int limit;
2060   int nregs;
2061   rtx xops[3];
2062   int pic_reg_used = PIC_REG_USED;
2063   int sp_valid = !frame_pointer_needed || current_function_sp_is_unchanging;
2064   HOST_WIDE_INT offset;
2065   HOST_WIDE_INT tsize = ix86_compute_frame_size (get_frame_size (), &nregs);
2066
2067   /* sp is often unreliable so we may have to go off the frame pointer. */
2068
2069   offset = -(tsize + nregs * UNITS_PER_WORD);
2070
2071   xops[2] = stack_pointer_rtx;
2072
2073   /* When -fpic, we must emit a scheduling barrier, so that the instruction
2074      that restores %ebx (which is PIC_OFFSET_TABLE_REGNUM), does not get
2075      moved before any instruction which implicitly uses the got.  This
2076      includes any instruction which uses a SYMBOL_REF or a LABEL_REF.
2077
2078      Alternatively, this could be fixed by making the dependence on the
2079      PIC_OFFSET_TABLE_REGNUM explicit in the RTL.  */
2080
2081   if (flag_pic || profile_flag || profile_block_flag)
2082     emit_insn (gen_blockage ());
2083
2084   /* If we're only restoring one register and sp is not valid then
2085      using a move instruction to restore the register since it's
2086      less work than reloading sp and popping the register.  Otherwise,
2087      restore sp (if necessary) and pop the registers. */
2088
2089   limit = frame_pointer_needed
2090           ? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM;
2091
2092   if (nregs > 1 || sp_valid)
2093     {
2094       if ( !sp_valid )
2095         {
2096           xops[0] = adj_offsettable_operand (AT_BP (QImode), offset);
2097           if (do_rtl)
2098             emit_insn (gen_movsi_lea (xops[2], XEXP (xops[0], 0)));
2099           else
2100             output_asm_insn (AS2 (lea%L2,%0,%2), xops);
2101         }
2102
2103       for (regno = 0; regno < limit; regno++)
2104         if ((regs_ever_live[regno] && ! call_used_regs[regno])
2105             || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
2106           {
2107             xops[0] = gen_rtx_REG (SImode, regno);
2108
2109             if (do_rtl)
2110               emit_insn (gen_pop (xops[0]));
2111             else
2112               output_asm_insn ("pop%L0 %0", xops);
2113           }
2114     }
2115
2116   else
2117     for (regno = 0; regno < limit; regno++)
2118       if ((regs_ever_live[regno] && ! call_used_regs[regno])
2119           || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
2120         {
2121           xops[0] = gen_rtx_REG (SImode, regno);
2122           xops[1] = adj_offsettable_operand (AT_BP (Pmode), offset);
2123
2124           if (do_rtl)
2125             emit_move_insn (xops[0], xops[1]);
2126           else
2127             output_asm_insn (AS2 (mov%L0,%1,%0), xops);
2128
2129           offset += 4;
2130         }
2131
2132   if (frame_pointer_needed)
2133     {
2134       /* If not an i386, mov & pop is faster than "leave". */
2135
2136       if (TARGET_USE_LEAVE)
2137         {
2138           if (do_rtl)
2139             emit_insn (gen_leave());
2140           else
2141             output_asm_insn ("leave", xops);
2142         }
2143       else
2144         {
2145           xops[0] = frame_pointer_rtx;
2146           xops[1] = stack_pointer_rtx;
2147
2148           if (do_rtl)
2149             {
2150               emit_insn (gen_epilogue_set_stack_ptr());
2151               emit_insn (gen_pop (xops[0]));
2152             }
2153           else
2154             {
2155               output_asm_insn (AS2 (mov%L2,%0,%2), xops);
2156               output_asm_insn ("pop%L0 %0", xops);
2157             }
2158         }
2159     }
2160
2161   else if (tsize)
2162     {
2163       /* Intel's docs say that for 4 or 8 bytes of stack frame one should
2164          use `pop' and not `add'.  */
2165       int use_pop = tsize == 4;
2166
2167       /* Use two pops only for the Pentium processors.  */
2168       if (tsize == 8 && !TARGET_386 && !TARGET_486)
2169         {
2170           rtx retval = current_function_return_rtx;
2171
2172           xops[1] = gen_rtx_REG (SImode, 1);    /* %edx */
2173
2174           /* This case is a bit more complex.  Since we cannot pop into
2175              %ecx twice we need a second register.  But this is only
2176              available if the return value is not of DImode in which
2177              case the %edx register is not available.  */
2178           use_pop = (retval == NULL
2179                      || ! reg_overlap_mentioned_p (xops[1], retval));
2180         }
2181
2182       if (use_pop)
2183         {
2184           xops[0] = gen_rtx_REG (SImode, 2);    /* %ecx */
2185
2186           if (do_rtl)
2187             {
2188               /* We have to prevent the two pops here from being scheduled.
2189                  GCC otherwise would try in some situation to put other
2190                  instructions in between them which has a bad effect.  */
2191               emit_insn (gen_blockage ());
2192               emit_insn (gen_pop (xops[0]));
2193               if (tsize == 8)
2194                 emit_insn (gen_pop (xops[1]));
2195             }
2196           else
2197             {
2198               output_asm_insn ("pop%L0 %0", xops);
2199               if (tsize == 8)
2200                 output_asm_insn ("pop%L1 %1", xops);
2201             }
2202         }
2203       else
2204         {
2205           /* If there is no frame pointer, we must still release the frame. */
2206           xops[0] = GEN_INT (tsize);
2207
2208           if (do_rtl)
2209             emit_insn (gen_rtx (SET, VOIDmode, xops[2],
2210                                 gen_rtx (PLUS, SImode, xops[2], xops[0])));
2211           else
2212             output_asm_insn (AS2 (add%L2,%0,%2), xops);
2213         }
2214     }
2215
2216 #ifdef FUNCTION_BLOCK_PROFILER_EXIT
2217   if (profile_block_flag == 2)
2218     {
2219       FUNCTION_BLOCK_PROFILER_EXIT(file);
2220     }
2221 #endif
2222
2223   if (current_function_pops_args && current_function_args_size)
2224     {
2225       xops[1] = GEN_INT (current_function_pops_args);
2226
2227       /* i386 can only pop 32K bytes (maybe 64K?  Is it signed?).  If
2228          asked to pop more, pop return address, do explicit add, and jump
2229          indirectly to the caller. */
2230
2231       if (current_function_pops_args >= 32768)
2232         {
2233           /* ??? Which register to use here? */
2234           xops[0] = gen_rtx_REG (SImode, 2);
2235
2236           if (do_rtl)
2237             {
2238               emit_insn (gen_pop (xops[0]));
2239               emit_insn (gen_rtx (SET, VOIDmode, xops[2],
2240                                   gen_rtx (PLUS, SImode, xops[1], xops[2])));
2241               emit_jump_insn (xops[0]);
2242             }
2243           else
2244             {
2245               output_asm_insn ("pop%L0 %0", xops);
2246               output_asm_insn (AS2 (add%L2,%1,%2), xops);
2247               output_asm_insn ("jmp %*%0", xops);
2248             }
2249         }
2250       else
2251         {
2252           if (do_rtl)
2253             emit_jump_insn (gen_return_pop_internal (xops[1]));
2254           else
2255             output_asm_insn ("ret %1", xops);
2256         }
2257     }
2258   else
2259     {
2260       if (do_rtl)
2261         emit_jump_insn (gen_return_internal ());
2262       else
2263         output_asm_insn ("ret", xops);
2264     }
2265 }
2266 \f
2267 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
2268    that is a valid memory address for an instruction.
2269    The MODE argument is the machine mode for the MEM expression
2270    that wants to use this address.
2271
2272    On x86, legitimate addresses are:
2273         base                            movl (base),reg
2274         displacement                    movl disp,reg
2275         base + displacement             movl disp(base),reg
2276         index + base                    movl (base,index),reg
2277         (index + base) + displacement   movl disp(base,index),reg
2278         index*scale                     movl (,index,scale),reg
2279         index*scale + disp              movl disp(,index,scale),reg
2280         index*scale + base              movl (base,index,scale),reg
2281         (index*scale + base) + disp     movl disp(base,index,scale),reg
2282
2283         In each case, scale can be 1, 2, 4, 8.  */
2284
2285 /* This is exactly the same as print_operand_addr, except that
2286    it recognizes addresses instead of printing them.
2287
2288    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
2289    convert common non-canonical forms to canonical form so that they will
2290    be recognized.  */
2291
2292 #define ADDR_INVALID(msg,insn)                                          \
2293 do {                                                                    \
2294   if (TARGET_DEBUG_ADDR)                                                \
2295     {                                                                   \
2296       fprintf (stderr, msg);                                            \
2297       debug_rtx (insn);                                                 \
2298     }                                                                   \
2299 } while (0)
2300
2301 int
2302 legitimate_pic_address_disp_p (disp)
2303      register rtx disp;
2304 {
2305   if (GET_CODE (disp) != CONST)
2306     return 0;
2307   disp = XEXP (disp, 0);
2308
2309   if (GET_CODE (disp) == PLUS)
2310     {
2311       if (GET_CODE (XEXP (disp, 1)) != CONST_INT)
2312         return 0;
2313       disp = XEXP (disp, 0);
2314     }
2315
2316   if (GET_CODE (disp) != UNSPEC
2317       || XVECLEN (disp, 0) != 1)
2318     return 0;
2319
2320   /* Must be @GOT or @GOTOFF.  */
2321   if (XINT (disp, 1) != 6
2322       && XINT (disp, 1) != 7)
2323     return 0;
2324
2325   if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
2326       && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
2327     return 0;
2328
2329   return 1;
2330 }
2331
2332 int
2333 legitimate_address_p (mode, addr, strict)
2334      enum machine_mode mode;
2335      register rtx addr;
2336      int strict;
2337 {
2338   rtx base  = NULL_RTX;
2339   rtx indx  = NULL_RTX;
2340   rtx scale = NULL_RTX;
2341   rtx disp  = NULL_RTX;
2342
2343   if (TARGET_DEBUG_ADDR)
2344     {
2345       fprintf (stderr,
2346                "\n======\nGO_IF_LEGITIMATE_ADDRESS, mode = %s, strict = %d\n",
2347                GET_MODE_NAME (mode), strict);
2348
2349       debug_rtx (addr);
2350     }
2351
2352   if (GET_CODE (addr) == REG || GET_CODE (addr) == SUBREG)
2353     base = addr;
2354
2355   else if (GET_CODE (addr) == PLUS)
2356     {
2357       rtx op0 = XEXP (addr, 0);
2358       rtx op1 = XEXP (addr, 1);
2359       enum rtx_code code0 = GET_CODE (op0);
2360       enum rtx_code code1 = GET_CODE (op1);
2361
2362       if (code0 == REG || code0 == SUBREG)
2363         {
2364           if (code1 == REG || code1 == SUBREG)
2365             {
2366               indx = op0;       /* index + base */
2367               base = op1;
2368             }
2369
2370           else
2371             {
2372               base = op0;       /* base + displacement */
2373               disp = op1;
2374             }
2375         }
2376
2377       else if (code0 == MULT)
2378         {
2379           indx  = XEXP (op0, 0);
2380           scale = XEXP (op0, 1);
2381
2382           if (code1 == REG || code1 == SUBREG)
2383             base = op1;         /* index*scale + base */
2384
2385           else
2386             disp = op1;         /* index*scale + disp */
2387         }
2388
2389       else if (code0 == PLUS && GET_CODE (XEXP (op0, 0)) == MULT)
2390         {
2391           indx  = XEXP (XEXP (op0, 0), 0);      /* index*scale + base + disp */
2392           scale = XEXP (XEXP (op0, 0), 1);
2393           base  = XEXP (op0, 1);
2394           disp  = op1;
2395         }
2396
2397       else if (code0 == PLUS)
2398         {
2399           indx = XEXP (op0, 0); /* index + base + disp */
2400           base = XEXP (op0, 1);
2401           disp = op1;
2402         }
2403
2404       else
2405         {
2406           ADDR_INVALID ("PLUS subcode is not valid.\n", op0);
2407           return FALSE;
2408         }
2409     }
2410
2411   else if (GET_CODE (addr) == MULT)
2412     {
2413       indx  = XEXP (addr, 0);   /* index*scale */
2414       scale = XEXP (addr, 1);
2415     }
2416
2417   else
2418     disp = addr;                /* displacement */
2419
2420   /* Allow arg pointer and stack pointer as index if there is not scaling */
2421   if (base && indx && !scale
2422       && (indx == arg_pointer_rtx || indx == stack_pointer_rtx))
2423     {
2424       rtx tmp = base;
2425       base = indx;
2426       indx = tmp;
2427     }
2428
2429   /* Validate base register:
2430
2431      Don't allow SUBREG's here, it can lead to spill failures when the base
2432      is one word out of a two word structure, which is represented internally
2433      as a DImode int.  */
2434
2435   if (base)
2436     {
2437       if (GET_CODE (base) != REG)
2438         {
2439           ADDR_INVALID ("Base is not a register.\n", base);
2440           return FALSE;
2441         }
2442
2443       if (GET_MODE (base) != Pmode)
2444         {
2445           ADDR_INVALID ("Base is not in Pmode.\n", base);
2446           return FALSE;
2447         }
2448
2449       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (base))
2450           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (base)))
2451         {
2452           ADDR_INVALID ("Base is not valid.\n", base);
2453           return FALSE;
2454         }
2455     }
2456
2457   /* Validate index register:
2458
2459      Don't allow SUBREG's here, it can lead to spill failures when the index
2460      is one word out of a two word structure, which is represented internally
2461      as a DImode int.  */
2462   if (indx)
2463     {
2464       if (GET_CODE (indx) != REG)
2465         {
2466           ADDR_INVALID ("Index is not a register.\n", indx);
2467           return FALSE;
2468         }
2469
2470       if (GET_MODE (indx) != Pmode)
2471         {
2472           ADDR_INVALID ("Index is not in Pmode.\n", indx);
2473           return FALSE;
2474         }
2475
2476       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (indx))
2477           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (indx)))
2478         {
2479           ADDR_INVALID ("Index is not valid.\n", indx);
2480           return FALSE;
2481         }
2482     }
2483   else if (scale)
2484     abort ();                   /* scale w/o index invalid */
2485
2486   /* Validate scale factor: */
2487   if (scale)
2488     {
2489       HOST_WIDE_INT value;
2490
2491       if (GET_CODE (scale) != CONST_INT)
2492         {
2493           ADDR_INVALID ("Scale is not valid.\n", scale);
2494           return FALSE;
2495         }
2496
2497       value = INTVAL (scale);
2498       if (value != 1 && value != 2 && value != 4 && value != 8)
2499         {
2500           ADDR_INVALID ("Scale is not a good multiplier.\n", scale);
2501           return FALSE;
2502         }
2503     }
2504
2505   /* Validate displacement.  */
2506   if (disp)
2507     {
2508       if (!CONSTANT_ADDRESS_P (disp))
2509         {
2510           ADDR_INVALID ("Displacement is not valid.\n", disp);
2511           return FALSE;
2512         }
2513
2514       else if (GET_CODE (disp) == CONST_DOUBLE)
2515         {
2516           ADDR_INVALID ("Displacement is a const_double.\n", disp);
2517           return FALSE;
2518         }
2519
2520       if (flag_pic && SYMBOLIC_CONST (disp))
2521         {
2522           if (! legitimate_pic_address_disp_p (disp))
2523             {
2524               ADDR_INVALID ("Displacement is an invalid PIC construct.\n",
2525                             disp);
2526               return FALSE;
2527             }
2528
2529           if (base != pic_offset_table_rtx
2530               && (indx != pic_offset_table_rtx || scale != NULL_RTX))
2531             {
2532               ADDR_INVALID ("PIC displacement against invalid base.\n", disp);
2533               return FALSE;
2534             }
2535         }
2536
2537       else if (HALF_PIC_P ())
2538         {
2539           if (! HALF_PIC_ADDRESS_P (disp)
2540               || (base != NULL_RTX || indx != NULL_RTX))
2541             {
2542               ADDR_INVALID ("Displacement is an invalid half-pic reference.\n",
2543                             disp);
2544               return FALSE;
2545             }
2546         }
2547     }
2548
2549   if (TARGET_DEBUG_ADDR)
2550     fprintf (stderr, "Address is valid.\n");
2551
2552   /* Everything looks valid, return true */
2553   return TRUE;
2554 }
2555 \f
2556 /* Return a legitimate reference for ORIG (an address) using the
2557    register REG.  If REG is 0, a new pseudo is generated.
2558
2559    There are two types of references that must be handled:
2560
2561    1. Global data references must load the address from the GOT, via
2562       the PIC reg.  An insn is emitted to do this load, and the reg is
2563       returned.
2564
2565    2. Static data references, constant pool addresses, and code labels
2566       compute the address as an offset from the GOT, whose base is in
2567       the PIC reg.  Static data objects have SYMBOL_REF_FLAG set to
2568       differentiate them from global data objects.  The returned
2569       address is the PIC reg + an unspec constant.
2570
2571    GO_IF_LEGITIMATE_ADDRESS rejects symbolic references unless the PIC
2572    reg also appears in the address.  */
2573
2574 rtx
2575 legitimize_pic_address (orig, reg)
2576      rtx orig;
2577      rtx reg;
2578 {
2579   rtx addr = orig;
2580   rtx new = orig;
2581   rtx base;
2582
2583   if (GET_CODE (addr) == LABEL_REF
2584       || (GET_CODE (addr) == SYMBOL_REF
2585           && (CONSTANT_POOL_ADDRESS_P (addr)
2586               || SYMBOL_REF_FLAG (addr))))
2587     {
2588       /* This symbol may be referenced via a displacement from the PIC
2589          base address (@GOTOFF).  */
2590
2591       current_function_uses_pic_offset_table = 1;
2592       new = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, addr), 7);
2593       new = gen_rtx_CONST (VOIDmode, new);
2594       new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new);
2595
2596       if (reg != 0)
2597         {
2598           emit_move_insn (reg, new);
2599           new = reg;
2600         }
2601     }
2602   else if (GET_CODE (addr) == SYMBOL_REF)
2603     {
2604       /* This symbol must be referenced via a load from the
2605          Global Offset Table (@GOT). */
2606
2607       current_function_uses_pic_offset_table = 1;
2608       new = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, addr), 6);
2609       new = gen_rtx_CONST (VOIDmode, new);
2610       new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new);
2611       new = gen_rtx_MEM (Pmode, new);
2612       RTX_UNCHANGING_P (new) = 1;
2613
2614       if (reg == 0)
2615         reg = gen_reg_rtx (Pmode);
2616       emit_move_insn (reg, new);
2617       new = reg;
2618     }      
2619   else
2620     {
2621       if (GET_CODE (addr) == CONST)
2622         {
2623           addr = XEXP (addr, 0);
2624           if (GET_CODE (addr) == UNSPEC)
2625             {
2626               /* Check that the unspec is one of the ones we generate?  */
2627             }
2628           else if (GET_CODE (addr) != PLUS)
2629             abort();
2630         }
2631       if (GET_CODE (addr) == PLUS)
2632         {
2633           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
2634
2635           /* Check first to see if this is a constant offset from a @GOTOFF
2636              symbol reference.  */
2637           if ((GET_CODE (op0) == LABEL_REF
2638                || (GET_CODE (op0) == SYMBOL_REF
2639                    && (CONSTANT_POOL_ADDRESS_P (op0)
2640                        || SYMBOL_REF_FLAG (op0))))
2641               && GET_CODE (op1) == CONST_INT)
2642             {
2643               current_function_uses_pic_offset_table = 1;
2644               new = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, op0), 7);
2645               new = gen_rtx_PLUS (VOIDmode, new, op1);
2646               new = gen_rtx_CONST (VOIDmode, new);
2647               new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new);
2648
2649               if (reg != 0)
2650                 {
2651                   emit_move_insn (reg, new);
2652                   new = reg;
2653                 }
2654             }
2655           else
2656             {
2657               base = legitimize_pic_address (XEXP (addr, 0), reg);
2658               new  = legitimize_pic_address (XEXP (addr, 1),
2659                                              base == reg ? NULL_RTX : reg);
2660
2661               if (GET_CODE (new) == CONST_INT)
2662                 new = plus_constant (base, INTVAL (new));
2663               else
2664                 {
2665                   if (GET_CODE (new) == PLUS && CONSTANT_P (XEXP (new, 1)))
2666                     {
2667                       base = gen_rtx_PLUS (Pmode, base, XEXP (new, 0));
2668                       new = XEXP (new, 1);
2669                     }
2670                   new = gen_rtx_PLUS (Pmode, base, new);
2671                 }
2672             }
2673         }
2674     }
2675   return new;
2676 }
2677 \f
2678 /* Emit insns to move operands[1] into operands[0].  */
2679
2680 void
2681 emit_pic_move (operands, mode)
2682      rtx *operands;
2683      enum machine_mode mode ATTRIBUTE_UNUSED;
2684 {
2685   rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);
2686
2687   if (GET_CODE (operands[0]) == MEM && SYMBOLIC_CONST (operands[1]))
2688     operands[1] = force_reg (Pmode, operands[1]);
2689   else
2690     operands[1] = legitimize_pic_address (operands[1], temp);
2691 }
2692 \f
2693 /* Try machine-dependent ways of modifying an illegitimate address
2694    to be legitimate.  If we find one, return the new, valid address.
2695    This macro is used in only one place: `memory_address' in explow.c.
2696
2697    OLDX is the address as it was before break_out_memory_refs was called.
2698    In some cases it is useful to look at this to decide what needs to be done.
2699
2700    MODE and WIN are passed so that this macro can use
2701    GO_IF_LEGITIMATE_ADDRESS.
2702
2703    It is always safe for this macro to do nothing.  It exists to recognize
2704    opportunities to optimize the output.
2705
2706    For the 80386, we handle X+REG by loading X into a register R and
2707    using R+REG.  R will go in a general reg and indexing will be used.
2708    However, if REG is a broken-out memory address or multiplication,
2709    nothing needs to be done because REG can certainly go in a general reg.
2710
2711    When -fpic is used, special handling is needed for symbolic references.
2712    See comments by legitimize_pic_address in i386.c for details.  */
2713
2714 rtx
2715 legitimize_address (x, oldx, mode)
2716      register rtx x;
2717      register rtx oldx ATTRIBUTE_UNUSED;
2718      enum machine_mode mode;
2719 {
2720   int changed = 0;
2721   unsigned log;
2722
2723   if (TARGET_DEBUG_ADDR)
2724     {
2725       fprintf (stderr, "\n==========\nLEGITIMIZE_ADDRESS, mode = %s\n",
2726                GET_MODE_NAME (mode));
2727       debug_rtx (x);
2728     }
2729
2730   if (flag_pic && SYMBOLIC_CONST (x))
2731     return legitimize_pic_address (x, 0);
2732
2733   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
2734   if (GET_CODE (x) == ASHIFT
2735       && GET_CODE (XEXP (x, 1)) == CONST_INT
2736       && (log = (unsigned)exact_log2 (INTVAL (XEXP (x, 1)))) < 4)
2737     {
2738       changed = 1;
2739       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
2740                         GEN_INT (1 << log));
2741     }
2742
2743   if (GET_CODE (x) == PLUS)
2744     {
2745       /* Canonicalize shifts by 0, 1, 2, 3 into multiply. */
2746
2747       if (GET_CODE (XEXP (x, 0)) == ASHIFT
2748           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2749           && (log = (unsigned)exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) < 4)
2750         {
2751           changed = 1;
2752           XEXP (x, 0) = gen_rtx (MULT, Pmode,
2753                                  force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
2754                                  GEN_INT (1 << log));
2755         }
2756
2757       if (GET_CODE (XEXP (x, 1)) == ASHIFT
2758           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
2759           && (log = (unsigned)exact_log2 (INTVAL (XEXP (XEXP (x, 1), 1)))) < 4)
2760         {
2761           changed = 1;
2762           XEXP (x, 1) = gen_rtx (MULT, Pmode,
2763                                  force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
2764                                  GEN_INT (1 << log));
2765         }
2766
2767       /* Put multiply first if it isn't already. */
2768       if (GET_CODE (XEXP (x, 1)) == MULT)
2769         {
2770           rtx tmp = XEXP (x, 0);
2771           XEXP (x, 0) = XEXP (x, 1);
2772           XEXP (x, 1) = tmp;
2773           changed = 1;
2774         }
2775
2776       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
2777          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
2778          created by virtual register instantiation, register elimination, and
2779          similar optimizations.  */
2780       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
2781         {
2782           changed = 1;
2783           x = gen_rtx (PLUS, Pmode,
2784                        gen_rtx (PLUS, Pmode, XEXP (x, 0),
2785                                 XEXP (XEXP (x, 1), 0)),
2786                        XEXP (XEXP (x, 1), 1));
2787         }
2788
2789       /* Canonicalize
2790          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
2791          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
2792       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
2793                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
2794                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
2795                && CONSTANT_P (XEXP (x, 1)))
2796         {
2797           rtx constant;
2798           rtx other = NULL_RTX;
2799
2800           if (GET_CODE (XEXP (x, 1)) == CONST_INT)
2801             {
2802               constant = XEXP (x, 1);
2803               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
2804             }
2805           else if (GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 1)) == CONST_INT)
2806             {
2807               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
2808               other = XEXP (x, 1);
2809             }
2810           else
2811             constant = 0;
2812
2813           if (constant)
2814             {
2815               changed = 1;
2816               x = gen_rtx (PLUS, Pmode,
2817                            gen_rtx (PLUS, Pmode, XEXP (XEXP (x, 0), 0),
2818                                     XEXP (XEXP (XEXP (x, 0), 1), 0)),
2819                            plus_constant (other, INTVAL (constant)));
2820             }
2821         }
2822
2823       if (changed && legitimate_address_p (mode, x, FALSE))
2824         return x;
2825
2826       if (GET_CODE (XEXP (x, 0)) == MULT)
2827         {
2828           changed = 1;
2829           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
2830         }
2831
2832       if (GET_CODE (XEXP (x, 1)) == MULT)
2833         {
2834           changed = 1;
2835           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
2836         }
2837
2838       if (changed
2839           && GET_CODE (XEXP (x, 1)) == REG
2840           && GET_CODE (XEXP (x, 0)) == REG)
2841         return x;
2842
2843       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
2844         {
2845           changed = 1;
2846           x = legitimize_pic_address (x, 0);
2847         }
2848
2849       if (changed && legitimate_address_p (mode, x, FALSE))
2850         return x;
2851
2852       if (GET_CODE (XEXP (x, 0)) == REG)
2853         {
2854           register rtx temp = gen_reg_rtx (Pmode);
2855           register rtx val  = force_operand (XEXP (x, 1), temp);
2856           if (val != temp)
2857             emit_move_insn (temp, val);
2858
2859           XEXP (x, 1) = temp;
2860           return x;
2861         }
2862
2863       else if (GET_CODE (XEXP (x, 1)) == REG)
2864         {
2865           register rtx temp = gen_reg_rtx (Pmode);
2866           register rtx val  = force_operand (XEXP (x, 0), temp);
2867           if (val != temp)
2868             emit_move_insn (temp, val);
2869
2870           XEXP (x, 0) = temp;
2871           return x;
2872         }
2873     }
2874
2875   return x;
2876 }
2877 \f
2878 /* Print an integer constant expression in assembler syntax.  Addition
2879    and subtraction are the only arithmetic that may appear in these
2880    expressions.  FILE is the stdio stream to write to, X is the rtx, and
2881    CODE is the operand print code from the output string.  */
2882
2883 static void
2884 output_pic_addr_const (file, x, code)
2885      FILE *file;
2886      rtx x;
2887      int code;
2888 {
2889   char buf[256];
2890
2891   switch (GET_CODE (x))
2892     {
2893     case PC:
2894       if (flag_pic)
2895         putc ('.', file);
2896       else
2897         abort ();
2898       break;
2899
2900     case SYMBOL_REF:
2901       assemble_name (file, XSTR (x, 0));
2902       if (code == 'P' && ! SYMBOL_REF_FLAG (x))
2903         fputs ("@PLT", file);
2904       break;
2905
2906     case LABEL_REF:
2907       x = XEXP (x, 0);
2908       /* FALLTHRU */
2909     case CODE_LABEL:
2910       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
2911       assemble_name (asm_out_file, buf);
2912       break;
2913
2914     case CONST_INT:
2915       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
2916       break;
2917
2918     case CONST:
2919       /* This used to output parentheses around the expression,
2920          but that does not work on the 386 (either ATT or BSD assembler).  */
2921       output_pic_addr_const (file, XEXP (x, 0), code);
2922       break;
2923
2924     case CONST_DOUBLE:
2925       if (GET_MODE (x) == VOIDmode)
2926         {
2927           /* We can use %d if the number is <32 bits and positive.  */
2928           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
2929             fprintf (file, "0x%lx%08lx",
2930                      (unsigned long) CONST_DOUBLE_HIGH (x),
2931                      (unsigned long) CONST_DOUBLE_LOW (x));
2932           else
2933             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
2934         }
2935       else
2936         /* We can't handle floating point constants;
2937            PRINT_OPERAND must handle them.  */
2938         output_operand_lossage ("floating constant misused");
2939       break;
2940
2941     case PLUS:
2942       /* Some assemblers need integer constants to appear first.  */
2943       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
2944         {
2945           output_pic_addr_const (file, XEXP (x, 0), code);
2946           fprintf (file, "+");
2947           output_pic_addr_const (file, XEXP (x, 1), code);
2948         }
2949       else if (GET_CODE (XEXP (x, 1)) == CONST_INT)
2950         {
2951           output_pic_addr_const (file, XEXP (x, 1), code);
2952           fprintf (file, "+");
2953           output_pic_addr_const (file, XEXP (x, 0), code);
2954         }
2955       else
2956         abort ();
2957       break;
2958
2959     case MINUS:
2960       output_pic_addr_const (file, XEXP (x, 0), code);
2961       fprintf (file, "-");
2962       output_pic_addr_const (file, XEXP (x, 1), code);
2963       break;
2964
2965      case UNSPEC:
2966        if (XVECLEN (x, 0) != 1)
2967         abort ();
2968        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
2969        switch (XINT (x, 1))
2970         {
2971         case 6:
2972           fputs ("@GOT", file);
2973           break;
2974         case 7:
2975           fputs ("@GOTOFF", file);
2976           break;
2977         case 8:
2978           fputs ("@PLT", file);
2979           break;
2980         default:
2981           output_operand_lossage ("invalid UNSPEC as operand");
2982           break;
2983         }
2984        break;
2985
2986     default:
2987       output_operand_lossage ("invalid expression as operand");
2988     }
2989 }
2990 \f
2991 static void
2992 put_jump_code (code, reverse, file)
2993      enum rtx_code code;
2994      int reverse;
2995      FILE *file;
2996 {
2997   int flags = cc_prev_status.flags;
2998   int ieee = (TARGET_IEEE_FP && (flags & CC_IN_80387)
2999               && !(cc_prev_status.flags & CC_FCOMI));
3000   const char *suffix;
3001
3002   if (flags & CC_Z_IN_NOT_C)
3003     switch (code)
3004       {
3005       case EQ:
3006         fputs (reverse ? "c" : "nc", file);
3007         return;
3008
3009       case NE:
3010         fputs (reverse ? "nc" : "c", file);
3011         return;
3012
3013       default:
3014         abort ();
3015       }
3016   if (ieee)
3017     {
3018       switch (code)
3019         {
3020         case LE:
3021           suffix = reverse ? "ae" : "b";
3022           break;
3023         case GT:
3024         case LT:
3025         case GE:
3026           suffix = reverse ? "ne" : "e";
3027           break;
3028         case EQ:
3029           suffix = reverse ? "ne" : "e";
3030           break;
3031         case NE:
3032           suffix = reverse ? "e" : "ne";
3033           break;
3034         default:
3035           abort ();
3036         }
3037       fputs (suffix, file);
3038       return;
3039     }
3040   if (flags & CC_TEST_AX)
3041     abort();
3042   if ((flags & CC_NO_OVERFLOW) && (code == LE || code == GT))
3043     abort ();
3044   if (reverse)
3045     code = reverse_condition (code);
3046   switch (code)
3047     {
3048     case EQ:
3049       suffix = "e";
3050       break;
3051
3052     case NE:
3053       suffix = "ne";
3054       break;
3055
3056     case GT:
3057       suffix = flags & CC_IN_80387 ? "a" : "g";
3058       break;
3059
3060     case GTU:
3061       suffix = "a";
3062       break;
3063
3064     case LT:
3065       if (flags & CC_NO_OVERFLOW)
3066         suffix = "s";
3067       else
3068         suffix = flags & CC_IN_80387 ? "b" : "l";
3069       break;
3070
3071     case LTU:
3072       suffix = "b";
3073       break;
3074
3075     case GE:
3076       if (flags & CC_NO_OVERFLOW)
3077         suffix = "ns";
3078       else
3079         suffix = flags & CC_IN_80387 ? "ae" : "ge";
3080       break;
3081
3082     case GEU:
3083       suffix = "ae";
3084       break;
3085
3086     case LE:
3087       suffix = flags & CC_IN_80387 ? "be" : "le";
3088       break;
3089
3090     case LEU:
3091       suffix = "be";
3092       break;
3093
3094     default:
3095       abort ();
3096     }
3097   fputs (suffix, file);
3098 }
3099
3100 /* Append the correct conditional move suffix which corresponds to CODE.  */
3101
3102 static void
3103 put_condition_code (code, reverse_cc, mode, file)
3104      enum rtx_code code;
3105      int  reverse_cc;
3106      enum mode_class mode;
3107      FILE * file;
3108 {
3109   int ieee = (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387)
3110               && ! (cc_prev_status.flags & CC_FCOMI));
3111   if (reverse_cc && ! ieee)
3112     code = reverse_condition (code);
3113
3114   if (mode == MODE_INT)
3115     switch (code)
3116       {
3117       case NE:
3118         if (cc_prev_status.flags & CC_Z_IN_NOT_C)
3119           fputs ("b", file);
3120         else
3121           fputs ("ne", file);
3122         return;
3123
3124       case EQ:
3125         if (cc_prev_status.flags & CC_Z_IN_NOT_C)
3126           fputs ("ae", file);
3127         else
3128           fputs ("e", file);
3129         return;
3130
3131       case GE:
3132         if (cc_prev_status.flags & CC_NO_OVERFLOW)
3133           fputs ("ns", file);
3134         else
3135           fputs ("ge", file);
3136         return;
3137
3138       case GT:
3139         fputs ("g", file);
3140         return;
3141
3142       case LE:
3143         fputs ("le", file);
3144         return;
3145
3146       case LT:
3147         if (cc_prev_status.flags & CC_NO_OVERFLOW)
3148           fputs ("s", file);
3149         else
3150           fputs ("l", file);
3151         return;
3152
3153       case GEU:
3154         fputs ("ae", file);
3155         return;
3156
3157       case GTU:
3158         fputs ("a", file);
3159         return;
3160
3161       case LEU:
3162         fputs ("be", file);
3163         return;
3164
3165       case LTU:
3166         fputs ("b", file);
3167         return;
3168
3169       default:
3170         output_operand_lossage ("Invalid %%C operand");
3171       }
3172
3173   else if (mode == MODE_FLOAT)
3174     switch (code)
3175       {
3176       case NE:
3177         fputs (ieee ? (reverse_cc ? "ne" : "e") : "ne", file);
3178         return;
3179       case EQ:
3180         fputs (ieee ? (reverse_cc ? "ne" : "e") : "e", file);
3181         return;
3182       case GE:
3183         fputs (ieee ? (reverse_cc ? "ne" : "e") : "nb", file);
3184         return;
3185       case GT:
3186         fputs (ieee ? (reverse_cc ? "ne" : "e") : "nbe", file);
3187         return;
3188       case LE:
3189         fputs (ieee ? (reverse_cc ? "nb" : "b") : "be", file);
3190         return;
3191       case LT:
3192         fputs (ieee ? (reverse_cc ? "ne" : "e") : "b", file);
3193         return;
3194       case GEU:
3195         fputs (ieee ? (reverse_cc ? "ne" : "e") : "nb", file);
3196         return;
3197       case GTU:
3198         fputs (ieee ? (reverse_cc ? "ne" : "e") : "nbe", file);
3199         return;
3200       case LEU:
3201         fputs (ieee ? (reverse_cc ? "nb" : "b") : "be", file);
3202         return;
3203       case LTU:
3204         fputs (ieee ? (reverse_cc ? "ne" : "e") : "b", file);
3205         return;
3206       default:
3207         output_operand_lossage ("Invalid %%C operand");
3208     }
3209 }
3210
3211 /* Meaning of CODE:
3212    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
3213    C -- print opcode suffix for set/cmov insn.
3214    c -- like C, but print reversed condition
3215    F -- print opcode suffix for fcmov insn.
3216    f -- like F, but print reversed condition
3217    D -- print the opcode suffix for a jump
3218    d -- like D, but print reversed condition
3219    R -- print the prefix for register names.
3220    z -- print the opcode suffix for the size of the current operand.
3221    * -- print a star (in certain assembler syntax)
3222    w -- print the operand as if it's a "word" (HImode) even if it isn't.
3223    J -- print the appropriate jump operand.
3224    s -- print a shift double count, followed by the assemblers argument
3225         delimiter.
3226    b -- print the QImode name of the register for the indicated operand.
3227         %b0 would print %al if operands[0] is reg 0.
3228    w --  likewise, print the HImode name of the register.
3229    k --  likewise, print the SImode name of the register.
3230    h --  print the QImode name for a "high" register, either ah, bh, ch or dh.
3231    y --  print "st(0)" instead of "st" as a register.
3232    P --  print as a PIC constant 
3233    _ --  output "_" if YES_UNDERSCORES */
3234
3235 void
3236 print_operand (file, x, code)
3237      FILE *file;
3238      rtx x;
3239      int code;
3240 {
3241   if (code)
3242     {
3243       switch (code)
3244         {
3245         case '*':
3246           if (USE_STAR)
3247             putc ('*', file);
3248           return;
3249
3250         case '_':
3251 #ifdef YES_UNDERSCORES
3252           putc ('_', file);
3253 #endif
3254           return;
3255
3256         case 'L':
3257           PUT_OP_SIZE (code, 'l', file);
3258           return;
3259
3260         case 'W':
3261           PUT_OP_SIZE (code, 'w', file);
3262           return;
3263
3264         case 'B':
3265           PUT_OP_SIZE (code, 'b', file);
3266           return;
3267
3268         case 'Q':
3269           PUT_OP_SIZE (code, 'l', file);
3270           return;
3271
3272         case 'S':
3273           PUT_OP_SIZE (code, 's', file);
3274           return;
3275
3276         case 'T':
3277           PUT_OP_SIZE (code, 't', file);
3278           return;
3279
3280         case 'z':
3281           /* 387 opcodes don't get size suffixes if the operands are
3282              registers. */
3283
3284           if (STACK_REG_P (x))
3285             return;
3286
3287           /* this is the size of op from size of operand */
3288           switch (GET_MODE_SIZE (GET_MODE (x)))
3289             {
3290             case 2:
3291 #ifdef HAVE_GAS_FILDS_FISTS
3292               PUT_OP_SIZE ('W', 's', file);
3293 #endif
3294               return;
3295
3296             case 4:
3297               if (GET_MODE (x) == SFmode)
3298                 {
3299                   PUT_OP_SIZE ('S', 's', file);
3300                   return;
3301                 }
3302               else
3303                 PUT_OP_SIZE ('L', 'l', file);
3304               return;
3305
3306             case 12:
3307                   PUT_OP_SIZE ('T', 't', file);
3308                   return;
3309
3310             case 8:
3311               if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
3312                 {
3313 #ifdef GAS_MNEMONICS
3314                   PUT_OP_SIZE ('Q', 'q', file);
3315                   return;
3316 #else
3317                   PUT_OP_SIZE ('Q', 'l', file); /* Fall through */
3318 #endif
3319                 }
3320
3321               PUT_OP_SIZE ('Q', 'l', file);
3322               return;
3323
3324             default:
3325               abort ();
3326             }
3327
3328         case 'b':
3329         case 'w':
3330         case 'k':
3331         case 'h':
3332         case 'y':
3333         case 'P':
3334         case 'X':
3335           break;
3336
3337         case 'J':
3338           switch (GET_CODE (x))
3339             {
3340               /* These conditions are appropriate for testing the result
3341                  of an arithmetic operation, not for a compare operation.
3342                  Cases GE, LT assume CC_NO_OVERFLOW true. All cases assume
3343                  CC_Z_IN_NOT_C false and not floating point.  */
3344             case NE:  fputs ("jne", file); return;
3345             case EQ:  fputs ("je",  file); return;
3346             case GE:  fputs ("jns", file); return;
3347             case LT:  fputs ("js",  file); return;
3348             case GEU: fputs ("jmp", file); return;
3349             case GTU: fputs ("jne",  file); return;
3350             case LEU: fputs ("je", file); return;
3351             case LTU: fputs ("#branch never",  file); return;
3352
3353             /* no matching branches for GT nor LE */
3354
3355             default:
3356               abort ();
3357             }
3358
3359         case 's':
3360           if (GET_CODE (x) == CONST_INT || ! SHIFT_DOUBLE_OMITS_COUNT)
3361             {
3362               PRINT_OPERAND (file, x, 0);
3363               fputs (AS2C (,) + 1, file);
3364             }
3365
3366           return;
3367
3368         case 'D':
3369           put_jump_code (GET_CODE (x), 0, file);
3370           return;
3371
3372         case 'd':
3373           put_jump_code (GET_CODE (x), 1, file);
3374           return;
3375
3376           /* This is used by the conditional move instructions.  */
3377         case 'C':
3378           put_condition_code (GET_CODE (x), 0, MODE_INT, file);
3379           return;
3380
3381           /* Like above, but reverse condition */
3382         case 'c':
3383           put_condition_code (GET_CODE (x), 1, MODE_INT, file); return;
3384
3385         case 'F':
3386           put_condition_code (GET_CODE (x), 0, MODE_FLOAT, file);
3387           return;
3388
3389           /* Like above, but reverse condition */
3390         case 'f':
3391           put_condition_code (GET_CODE (x), 1, MODE_FLOAT, file);
3392           return;
3393
3394         default:
3395           {
3396             char str[50];
3397
3398             sprintf (str, "invalid operand code `%c'", code);
3399             output_operand_lossage (str);
3400           }
3401         }
3402     }
3403
3404   if (GET_CODE (x) == REG)
3405     {
3406       PRINT_REG (x, code, file);
3407     }
3408
3409   else if (GET_CODE (x) == MEM)
3410     {
3411       PRINT_PTR (x, file);
3412       if (CONSTANT_ADDRESS_P (XEXP (x, 0)))
3413         {
3414           if (flag_pic)
3415             output_pic_addr_const (file, XEXP (x, 0), code);
3416           else
3417             output_addr_const (file, XEXP (x, 0));
3418         }
3419       else
3420         output_address (XEXP (x, 0));
3421     }
3422
3423   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
3424     {
3425       REAL_VALUE_TYPE r;
3426       long l;
3427
3428       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3429       REAL_VALUE_TO_TARGET_SINGLE (r, l);
3430       PRINT_IMMED_PREFIX (file);
3431       fprintf (file, "0x%lx", l);
3432     }
3433
3434  /* These float cases don't actually occur as immediate operands. */
3435  else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
3436     {
3437       REAL_VALUE_TYPE r;
3438       char dstr[30];
3439
3440       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3441       REAL_VALUE_TO_DECIMAL (r, "%.22e", dstr);
3442       fprintf (file, "%s", dstr);
3443     }
3444
3445   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == XFmode)
3446     {
3447       REAL_VALUE_TYPE r;
3448       char dstr[30];
3449
3450       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3451       REAL_VALUE_TO_DECIMAL (r, "%.22e", dstr);
3452       fprintf (file, "%s", dstr);
3453     }
3454   else
3455     {
3456       if (code != 'P')
3457         {
3458           if (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE)
3459             PRINT_IMMED_PREFIX (file);
3460           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
3461                    || GET_CODE (x) == LABEL_REF)
3462             PRINT_OFFSET_PREFIX (file);
3463         }
3464       if (flag_pic)
3465         output_pic_addr_const (file, x, code);
3466       else
3467         output_addr_const (file, x);
3468     }
3469 }
3470 \f
3471 /* Print a memory operand whose address is ADDR.  */
3472
3473 void
3474 print_operand_address (file, addr)
3475      FILE *file;
3476      register rtx addr;
3477 {
3478   register rtx reg1, reg2, breg, ireg;
3479   rtx offset;
3480
3481   switch (GET_CODE (addr))
3482     {
3483     case REG:
3484       /* ESI addressing makes instruction vector decoded on the K6.  We can
3485          avoid this by ESI+0 addressing.  */
3486       if (REGNO_REG_CLASS (REGNO (addr)) == SIREG
3487           && ix86_cpu == PROCESSOR_K6 && !optimize_size)
3488         output_addr_const (file, const0_rtx);
3489       ADDR_BEG (file);
3490       fprintf (file, "%se", RP);
3491       fputs (hi_reg_name[REGNO (addr)], file);
3492       ADDR_END (file);
3493       break;
3494
3495     case PLUS:
3496       reg1 = 0;
3497       reg2 = 0;
3498       ireg = 0;
3499       breg = 0;
3500       offset = 0;
3501       if (CONSTANT_ADDRESS_P (XEXP (addr, 0)))
3502         {
3503           offset = XEXP (addr, 0);
3504           addr = XEXP (addr, 1);
3505         }
3506       else if (CONSTANT_ADDRESS_P (XEXP (addr, 1)))
3507         {
3508           offset = XEXP (addr, 1);
3509           addr = XEXP (addr, 0);
3510         }
3511
3512       if (GET_CODE (addr) != PLUS)
3513         ;
3514       else if (GET_CODE (XEXP (addr, 0)) == MULT)
3515         reg1 = XEXP (addr, 0), addr = XEXP (addr, 1);
3516       else if (GET_CODE (XEXP (addr, 1)) == MULT)
3517         reg1 = XEXP (addr, 1), addr = XEXP (addr, 0);
3518       else if (GET_CODE (XEXP (addr, 0)) == REG)
3519         reg1 = XEXP (addr, 0), addr = XEXP (addr, 1);
3520       else if (GET_CODE (XEXP (addr, 1)) == REG)
3521         reg1 = XEXP (addr, 1), addr = XEXP (addr, 0);
3522
3523       if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT)
3524         {
3525           if (reg1 == 0)
3526             reg1 = addr;
3527           else
3528             reg2 = addr;
3529
3530           addr = 0;
3531         }
3532
3533       if (offset != 0)
3534         {
3535           if (addr != 0)
3536             abort ();
3537           addr = offset;
3538         }
3539
3540       if ((reg1 && GET_CODE (reg1) == MULT)
3541           || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2))))
3542         {
3543           breg = reg2;
3544           ireg = reg1;
3545         }
3546       else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1)))
3547         {
3548           breg = reg1;
3549           ireg = reg2;
3550         }
3551
3552       if (ireg != 0 || breg != 0)
3553         {
3554           int scale = 1;
3555
3556           if (addr != 0)
3557             {
3558               if (flag_pic)
3559                 output_pic_addr_const (file, addr, 0);
3560               else if (GET_CODE (addr) == LABEL_REF)
3561                 output_asm_label (addr);
3562               else
3563                 output_addr_const (file, addr);
3564             }
3565
3566           if (ireg != 0 && GET_CODE (ireg) == MULT)
3567             {
3568               scale = INTVAL (XEXP (ireg, 1));
3569               ireg = XEXP (ireg, 0);
3570             }
3571
3572           /* The stack pointer can only appear as a base register,
3573              never an index register, so exchange the regs if it is wrong. */
3574
3575           if (scale == 1 && ireg && REGNO (ireg) == STACK_POINTER_REGNUM)
3576             {
3577               rtx tmp;
3578
3579               tmp = breg;
3580               breg = ireg;
3581               ireg = tmp;
3582             }
3583
3584           /* output breg+ireg*scale */
3585           PRINT_B_I_S (breg, ireg, scale, file);
3586           break;
3587         }
3588
3589     case MULT:
3590       {
3591         int scale;
3592
3593         if (GET_CODE (XEXP (addr, 0)) == CONST_INT)
3594           {
3595             scale = INTVAL (XEXP (addr, 0));
3596             ireg = XEXP (addr, 1);
3597           }
3598         else
3599           {
3600             scale = INTVAL (XEXP (addr, 1));
3601             ireg = XEXP (addr, 0);
3602           }
3603
3604         /* (reg,reg,) is shorter than (,reg,2).  */
3605         if (scale == 2)
3606           {
3607             PRINT_B_I_S (ireg, ireg, 1, file);
3608           } 
3609         else 
3610           {
3611             output_addr_const (file, const0_rtx);
3612             PRINT_B_I_S (NULL_RTX, ireg, scale, file);
3613           }
3614       }
3615       break;
3616
3617     default:
3618       if (GET_CODE (addr) == CONST_INT
3619           && INTVAL (addr) < 0x8000
3620           && INTVAL (addr) >= -0x8000)
3621         fprintf (file, "%d", (int) INTVAL (addr));
3622       else
3623         {
3624           if (flag_pic)
3625             output_pic_addr_const (file, addr, 0);
3626           else
3627             output_addr_const (file, addr);
3628         }
3629     }
3630 }
3631 \f
3632 /* Set the cc_status for the results of an insn whose pattern is EXP.
3633    On the 80386, we assume that only test and compare insns, as well
3634    as SI, HI, & DI mode ADD, SUB, NEG, AND, IOR, XOR, BSF, ASHIFT,
3635    ASHIFTRT, and LSHIFTRT instructions set the condition codes usefully.
3636    Also, we assume that jumps, moves and sCOND don't affect the condition
3637    codes.  All else clobbers the condition codes, by assumption.
3638
3639    We assume that ALL integer add, minus, etc. instructions effect the
3640    condition codes.  This MUST be consistent with i386.md.
3641
3642    We don't record any float test or compare - the redundant test &
3643    compare check in final.c does not handle stack-like regs correctly. */
3644
3645 void
3646 notice_update_cc (exp)
3647      rtx exp;
3648 {
3649   if (GET_CODE (exp) == SET)
3650     {
3651       /* Jumps do not alter the cc's.  */
3652       if (SET_DEST (exp) == pc_rtx)
3653         return;
3654
3655       /* Moving register or memory into a register:
3656          it doesn't alter the cc's, but it might invalidate
3657          the RTX's which we remember the cc's came from.
3658          (Note that moving a constant 0 or 1 MAY set the cc's).  */
3659       if (REG_P (SET_DEST (exp))
3660           && (REG_P (SET_SRC (exp)) || GET_CODE (SET_SRC (exp)) == MEM
3661               || GET_RTX_CLASS (GET_CODE (SET_SRC (exp))) == '<'
3662               || GET_CODE (SET_SRC (exp)) == IF_THEN_ELSE))
3663         {
3664           if (cc_status.value1
3665               && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value1))
3666             cc_status.value1 = 0;
3667
3668           if (cc_status.value2
3669               && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value2))
3670             cc_status.value2 = 0;
3671
3672           return;
3673         }
3674
3675       /* Moving register into memory doesn't alter the cc's.
3676          It may invalidate the RTX's which we remember the cc's came from.  */
3677       if (GET_CODE (SET_DEST (exp)) == MEM
3678           && (REG_P (SET_SRC (exp))
3679               || GET_RTX_CLASS (GET_CODE (SET_SRC (exp))) == '<'))
3680         {
3681           if (cc_status.value1
3682               && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value1))
3683             cc_status.value1 = 0;
3684           if (cc_status.value2
3685               && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value2))
3686             cc_status.value2 = 0;
3687
3688           return;
3689         }
3690
3691       /* Function calls clobber the cc's.  */
3692       else if (GET_CODE (SET_SRC (exp)) == CALL)
3693         {
3694           CC_STATUS_INIT;
3695           return;
3696         }
3697
3698       /* Tests and compares set the cc's in predictable ways.  */
3699       else if (SET_DEST (exp) == cc0_rtx)
3700         {
3701           CC_STATUS_INIT;
3702           cc_status.value1 = SET_SRC (exp);
3703           return;
3704         }
3705
3706       /* Certain instructions effect the condition codes. */
3707       else if (GET_MODE (SET_SRC (exp)) == SImode
3708                || GET_MODE (SET_SRC (exp)) == HImode
3709                || GET_MODE (SET_SRC (exp)) == QImode)
3710         switch (GET_CODE (SET_SRC (exp)))
3711           {
3712           case ASHIFTRT: case LSHIFTRT: case ASHIFT:
3713             /* Shifts on the 386 don't set the condition codes if the
3714                shift count is zero. */
3715             if (GET_CODE (XEXP (SET_SRC (exp), 1)) != CONST_INT)
3716               {
3717                 CC_STATUS_INIT;
3718                 break;
3719               }
3720
3721             /* We assume that the CONST_INT is non-zero (this rtx would
3722                have been deleted if it were zero. */
3723
3724           case PLUS: case MINUS: case NEG:
3725           case AND: case IOR: case XOR:
3726             cc_status.flags = CC_NO_OVERFLOW;
3727             cc_status.value1 = SET_SRC (exp);
3728             cc_status.value2 = SET_DEST (exp);
3729             break;
3730
3731             /* This is the bsf pattern used by ffs.  */
3732           case UNSPEC:
3733             if (XINT (SET_SRC (exp), 1) == 5)
3734               {
3735                 /* Only the Z flag is defined after bsf.  */
3736                 cc_status.flags
3737                   = CC_NOT_POSITIVE | CC_NOT_NEGATIVE | CC_NO_OVERFLOW;
3738                 cc_status.value1 = XVECEXP (SET_SRC (exp), 0, 0);
3739                 cc_status.value2 = 0;
3740                 break;
3741               }
3742             /* FALLTHRU */
3743
3744           default:
3745             CC_STATUS_INIT;
3746           }
3747       else
3748         {
3749           CC_STATUS_INIT;
3750         }
3751     }
3752   else if (GET_CODE (exp) == PARALLEL
3753            && GET_CODE (XVECEXP (exp, 0, 0)) == SET)
3754     {
3755       if (SET_DEST (XVECEXP (exp, 0, 0)) == pc_rtx)
3756         return;
3757       if (SET_DEST (XVECEXP (exp, 0, 0)) == cc0_rtx)
3758
3759         {
3760           CC_STATUS_INIT;
3761           if (stack_regs_mentioned_p (SET_SRC (XVECEXP (exp, 0, 0))))
3762             {
3763               cc_status.flags |= CC_IN_80387;
3764               if (TARGET_CMOVE && stack_regs_mentioned_p
3765                   (XEXP (SET_SRC (XVECEXP (exp, 0, 0)), 1)))
3766                 cc_status.flags |= CC_FCOMI;
3767             }
3768           else
3769             cc_status.value1 = SET_SRC (XVECEXP (exp, 0, 0));
3770           return;
3771         }
3772
3773       CC_STATUS_INIT;
3774     }
3775   else
3776     {
3777       CC_STATUS_INIT;
3778     }
3779 }
3780 \f
3781 /* Split one or more DImode RTL references into pairs of SImode
3782    references.  The RTL can be REG, offsettable MEM, integer constant, or
3783    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
3784    split and "num" is its length.  lo_half and hi_half are output arrays
3785    that parallel "operands". */
3786
3787 void
3788 split_di (operands, num, lo_half, hi_half)
3789      rtx operands[];
3790      int num;
3791      rtx lo_half[], hi_half[];
3792 {
3793   while (num--)
3794     {
3795       rtx op = operands[num];
3796       if (! reload_completed)
3797         {
3798           lo_half[num] = gen_lowpart (SImode, op);
3799           hi_half[num] = gen_highpart (SImode, op);
3800         }
3801       else if (GET_CODE (op) == REG)
3802         {
3803           lo_half[num] = gen_rtx_REG (SImode, REGNO (op));
3804           hi_half[num] = gen_rtx_REG (SImode, REGNO (op) + 1);
3805         }
3806       else if (CONSTANT_P (op))
3807         split_double (op, &lo_half[num], &hi_half[num]);
3808       else if (offsettable_memref_p (op))
3809         {
3810           rtx lo_addr = XEXP (op, 0);
3811           rtx hi_addr = XEXP (adj_offsettable_operand (op, 4), 0);
3812           lo_half[num] = change_address (op, SImode, lo_addr);
3813           hi_half[num] = change_address (op, SImode, hi_addr);
3814         }
3815       else
3816         abort();
3817     }
3818 }
3819 \f
3820 /* Return 1 if this is a valid binary operation on a 387.
3821    OP is the expression matched, and MODE is its mode. */
3822
3823 int
3824 binary_387_op (op, mode)
3825     register rtx op;
3826     enum machine_mode mode;
3827 {
3828   if (mode != VOIDmode && mode != GET_MODE (op))
3829     return 0;
3830
3831   switch (GET_CODE (op))
3832     {
3833     case PLUS:
3834     case MINUS:
3835     case MULT:
3836     case DIV:
3837       return GET_MODE_CLASS (GET_MODE (op)) == MODE_FLOAT;
3838
3839     default:
3840       return 0;
3841     }
3842 }
3843 \f
3844 /* Return 1 if this is a valid shift or rotate operation on a 386.
3845    OP is the expression matched, and MODE is its mode. */
3846
3847 int
3848 shift_op (op, mode)
3849     register rtx op;
3850     enum machine_mode mode;
3851 {
3852   rtx operand = XEXP (op, 0);
3853
3854   if (mode != VOIDmode && mode != GET_MODE (op))
3855     return 0;
3856
3857   if (GET_MODE (operand) != GET_MODE (op)
3858       || GET_MODE_CLASS (GET_MODE (op)) != MODE_INT)
3859     return 0;
3860
3861   return (GET_CODE (op) == ASHIFT
3862           || GET_CODE (op) == ASHIFTRT
3863           || GET_CODE (op) == LSHIFTRT
3864           || GET_CODE (op) == ROTATE
3865           || GET_CODE (op) == ROTATERT);
3866 }
3867
3868 /* Return 1 if OP is COMPARE rtx with mode VOIDmode.
3869    MODE is not used.  */
3870
3871 int
3872 VOIDmode_compare_op (op, mode)
3873     register rtx op;
3874     enum machine_mode mode ATTRIBUTE_UNUSED;
3875 {
3876   return GET_CODE (op) == COMPARE && GET_MODE (op) == VOIDmode;
3877 }
3878 \f
3879 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
3880    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
3881    is the expression of the binary operation.  The output may either be
3882    emitted here, or returned to the caller, like all output_* functions.
3883
3884    There is no guarantee that the operands are the same mode, as they
3885    might be within FLOAT or FLOAT_EXTEND expressions. */
3886
3887 char *
3888 output_387_binary_op (insn, operands)
3889      rtx insn;
3890      rtx *operands;
3891 {
3892   rtx temp;
3893   char *base_op;
3894   static char buf[100];
3895
3896   switch (GET_CODE (operands[3]))
3897     {
3898     case PLUS:
3899       base_op = "fadd";
3900       break;
3901
3902     case MINUS:
3903       base_op = "fsub";
3904       break;
3905
3906     case MULT:
3907       base_op = "fmul";
3908       break;
3909
3910     case DIV:
3911       base_op = "fdiv";
3912       break;
3913
3914     default:
3915       abort ();
3916     }
3917
3918   strcpy (buf, base_op);
3919
3920   switch (GET_CODE (operands[3]))
3921     {
3922     case MULT:
3923     case PLUS:
3924       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
3925         {
3926           temp = operands[2];
3927           operands[2] = operands[1];
3928           operands[1] = temp;
3929         }
3930
3931       if (GET_CODE (operands[2]) == MEM)
3932         return strcat (buf, AS1 (%z2,%2));
3933
3934       if (! STACK_REG_P (operands[1]) || ! STACK_REG_P (operands[2]))
3935         abort ();
3936
3937       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
3938         {
3939           if (STACK_TOP_P (operands[0]))
3940             return strcat (buf, AS2 (p,%0,%2));
3941           else
3942             return strcat (buf, AS2 (p,%2,%0));
3943         }
3944
3945       if (STACK_TOP_P (operands[0]))
3946         return strcat (buf, AS2C (%y2,%0));
3947       else
3948         return strcat (buf, AS2C (%2,%0));
3949
3950     case MINUS:
3951     case DIV:
3952       if (GET_CODE (operands[1]) == MEM)
3953         return strcat (buf, AS1 (r%z1,%1));
3954
3955       if (GET_CODE (operands[2]) == MEM)
3956         return strcat (buf, AS1 (%z2,%2));
3957
3958       if (! STACK_REG_P (operands[1]) || ! STACK_REG_P (operands[2]))
3959         abort ();
3960
3961       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
3962         {
3963           if (STACK_TOP_P (operands[0]))
3964             return strcat (buf, AS2 (p,%0,%2));
3965           else
3966             return strcat (buf, AS2 (rp,%2,%0));
3967         }
3968
3969       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
3970         {
3971           if (STACK_TOP_P (operands[0]))
3972             return strcat (buf, AS2 (rp,%0,%1));
3973           else
3974             return strcat (buf, AS2 (p,%1,%0));
3975         }
3976
3977       if (STACK_TOP_P (operands[0]))
3978         {
3979           if (STACK_TOP_P (operands[1]))
3980             return strcat (buf, AS2C (%y2,%0));
3981           else
3982             return strcat (buf, AS2 (r,%y1,%0));
3983         }
3984       else if (STACK_TOP_P (operands[1]))
3985         return strcat (buf, AS2C (%1,%0));
3986       else
3987         return strcat (buf, AS2 (r,%2,%0));
3988
3989     default:
3990       abort ();
3991     }
3992 }
3993 \f
3994 /* Output code for INSN to convert a float to a signed int.  OPERANDS
3995    are the insn operands.  The input may be SFmode, DFmode, or XFmode
3996    and the output operand may be SImode or DImode.  As a special case,
3997    make sure that the 387 stack top dies if the output mode is DImode,
3998    because the hardware requires this.  */
3999
4000 char *
4001 output_fix_trunc (insn, operands)
4002      rtx insn;
4003      rtx *operands;
4004 {
4005   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
4006   rtx xops[2];
4007
4008   if (! STACK_TOP_P (operands[1]))
4009     abort ();
4010
4011   if (GET_MODE (operands[0]) == DImode && ! stack_top_dies)
4012     abort ();
4013
4014   xops[0] = GEN_INT (0x0c00);
4015   xops[1] = operands[5];
4016
4017   output_asm_insn (AS1 (fnstc%W2,%2), operands);
4018   output_asm_insn (AS2 (mov%W5,%2,%w5), operands);
4019   output_asm_insn (AS2 (or%W1,%0,%w1), xops);
4020   output_asm_insn (AS2 (mov%W3,%w5,%3), operands);
4021   output_asm_insn (AS1 (fldc%W3,%3), operands);
4022
4023   xops[0] = NON_STACK_REG_P (operands[0]) ? operands[4] : operands[0];
4024
4025   if (stack_top_dies)
4026     output_asm_insn (AS1 (fistp%z0,%y0), xops);
4027   else
4028     output_asm_insn (AS1 (fist%z0,%y0), xops);
4029
4030   if (NON_STACK_REG_P (operands[0]))
4031     {
4032       if (GET_MODE (operands[0]) == SImode)
4033         output_asm_insn (AS2 (mov%L0,%4,%0), operands);
4034       else
4035         {
4036           xops[0] = operands[0];
4037           xops[1] = operands[4];
4038           output_asm_insn (output_move_double (xops), xops);
4039         }
4040     }
4041
4042   return AS1 (fldc%W2,%2);
4043 }
4044 \f
4045 /* Output code for INSN to extend a float.  OPERANDS are the insn
4046    operands.  The output may be DFmode or XFmode and the input operand
4047    may be SFmode or DFmode.  Operands 2 and 3 are scratch memory and
4048    are only necessary if operands 0 or 1 are non-stack registers.  */
4049
4050 void
4051 output_float_extend (insn, operands)
4052      rtx insn;
4053      rtx *operands;
4054 {
4055   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
4056   rtx xops[2];
4057
4058   if (! STACK_TOP_P (operands[0]) && ! STACK_TOP_P (operands[1]))
4059     abort ();
4060
4061   if (STACK_TOP_P (operands[0]) && STACK_TOP_P (operands[1]) && stack_top_dies)
4062     return;
4063
4064   if (STACK_TOP_P (operands[0]) )
4065     {
4066       if (NON_STACK_REG_P (operands[1]))
4067         {
4068           if (GET_MODE (operands[1]) == SFmode)
4069             output_asm_insn (AS2 (mov%L0,%1,%2), operands);
4070           else
4071             {
4072               xops[0] = operands[2];
4073               xops[1] = operands[1];
4074               output_asm_insn (output_move_double (xops), xops);
4075             }
4076         }
4077
4078       xops[0] = NON_STACK_REG_P (operands[1]) ? operands[2] : operands[1];
4079
4080       output_asm_insn (AS1 (fld%z0,%y0), xops);
4081     }
4082   else
4083     {
4084       xops[0] = NON_STACK_REG_P (operands[0]) ? operands[3] : operands[0];
4085
4086       if (stack_top_dies
4087           || (GET_CODE (xops[0]) == MEM && GET_MODE (xops[0]) == XFmode))
4088         {
4089           output_asm_insn (AS1 (fstp%z0,%y0), xops);
4090           if (! stack_top_dies)
4091             output_asm_insn (AS1 (fld%z0,%y0), xops);
4092         }
4093       else
4094         output_asm_insn (AS1 (fst%z0,%y0), xops);
4095
4096       if (NON_STACK_REG_P (operands[0]))
4097         {
4098           xops[0] = operands[0];
4099           xops[1] = operands[3];
4100           output_asm_insn (output_move_double (xops), xops);
4101         }
4102     }
4103 }
4104 \f
4105 /* Output code for INSN to compare OPERANDS.  The two operands might
4106    not have the same mode: one might be within a FLOAT or FLOAT_EXTEND
4107    expression.  If the compare is in mode CCFPEQmode, use an opcode that
4108    will not fault if a qNaN is present. */
4109
4110 char *
4111 output_float_compare (insn, operands)
4112      rtx insn;
4113      rtx *operands;
4114 {
4115   int stack_top_dies;
4116   rtx body = XVECEXP (PATTERN (insn), 0, 0);
4117   int unordered_compare = GET_MODE (SET_SRC (body)) == CCFPEQmode;
4118   rtx tmp;
4119   int cc0_set = 1;
4120   int i;
4121
4122   if (TARGET_CMOVE && STACK_REG_P (operands[1])
4123       && STACK_REG_P (operands[0]))
4124     {
4125       cc_status.flags |= CC_FCOMI;
4126       cc_prev_status.flags &= ~CC_TEST_AX;
4127     }
4128
4129   if (! STACK_TOP_P (operands[0]))
4130     {
4131       tmp = operands[0];
4132       operands[0] = operands[1];
4133       operands[1] = tmp;
4134       cc_status.flags |= CC_REVERSED;
4135     }
4136
4137   if (! STACK_TOP_P (operands[0]))
4138     abort ();
4139
4140   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
4141
4142   if (STACK_REG_P (operands[1])
4143       && stack_top_dies
4144       && find_regno_note (insn, REG_DEAD, REGNO (operands[1]))
4145       && REGNO (operands[1]) == FIRST_STACK_REG + 1)
4146     {
4147       /* If both the top of the 387 stack dies, and the other operand
4148          is also a stack register that dies, then this must be a
4149          `fcompp' float compare */
4150
4151       if (unordered_compare)
4152         {
4153           if (cc_status.flags & CC_FCOMI)
4154             {
4155               output_asm_insn (AS2 (fucomip,%y1,%0), operands);
4156               output_asm_insn (AS1 (fstp, %y0), operands);
4157               if (!TARGET_IEEE_FP)
4158                 cc0_set = 0; 
4159             }
4160           else
4161             output_asm_insn ("fucompp", operands);
4162         }
4163       else
4164         {
4165           if (cc_status.flags & CC_FCOMI)
4166             {
4167               output_asm_insn (AS2 (fcomip, %y1,%0), operands);
4168               output_asm_insn (AS1 (fstp, %y0), operands);
4169               if (!TARGET_IEEE_FP)
4170                 cc0_set = 0; 
4171             }
4172           else
4173             output_asm_insn ("fcompp", operands);
4174         }
4175     }
4176   else
4177     {
4178       static char buf[100];
4179
4180       /* Decide if this is a float compare or an unordered float compare. */
4181
4182       if (unordered_compare)
4183         strcpy (buf, (cc_status.flags & CC_FCOMI) ? "fucomi" : "fucom");
4184       else
4185         strcpy (buf, (cc_status.flags & CC_FCOMI) ? "fcomi" : "fcom");
4186
4187       /* Modify the opcode if the 387 stack is to be popped. */
4188
4189       if (stack_top_dies)
4190         strcat (buf, "p");
4191
4192       if (cc_status.flags & CC_FCOMI)
4193         {
4194           output_asm_insn (strcat (buf, AS2 (%z1,%y1,%0)), operands);
4195           if (!TARGET_IEEE_FP)
4196             cc0_set = 0; 
4197         }
4198       else
4199         output_asm_insn (strcat (buf, AS1 (%z1,%y1)), operands);
4200     }
4201
4202   /* Now retrieve the condition code. */
4203   if (cc0_set) 
4204     {
4205       char *r = output_fp_cc0_set (insn); 
4206       if (r[0]) output_asm_insn (r, operands);
4207     }
4208
4209
4210   /* We emit fstp instruction after integer comparsions to improve
4211      scheduling. */
4212   for (i = 0; i < 2 ; i++)
4213     {
4214       if (STACK_REG_P (operands[i])
4215           && find_regno_note (insn, REG_DEAD, REGNO (operands[i]))
4216           && REGNO (operands[i]) != FIRST_STACK_REG 
4217           && (!stack_top_dies || REGNO (operands[i]) != FIRST_STACK_REG + 1))
4218         {
4219           rtx xexp[2];
4220           xexp[0] = gen_rtx_REG (DFmode,
4221                                  REGNO (operands[i]) - (stack_top_dies != 0));
4222           output_asm_insn (AS1 (fstp, %y0), xexp);
4223         }
4224     }
4225
4226   return "";
4227
4228
4229 }
4230 \f
4231 /* Output opcodes to transfer the results of FP compare or test INSN
4232    from the FPU to the CPU flags.  If TARGET_IEEE_FP, ensure that if the
4233    result of the compare or test is unordered, no comparison operator
4234    succeeds except NE.  Return an output template, if any.  */
4235
4236 char *
4237 output_fp_cc0_set (insn)
4238      rtx insn;
4239 {
4240   rtx xops[3];
4241   rtx next;
4242   enum rtx_code code;
4243
4244   if (!(cc_status.flags & CC_FCOMI))
4245     {
4246       xops[0] = gen_rtx_REG (HImode, 0);
4247       output_asm_insn (AS1 (fnsts%W0,%0), xops);
4248     }
4249
4250   if (! TARGET_IEEE_FP)
4251     {
4252       if (!(cc_status.flags & CC_REVERSED))
4253         {
4254           next = next_cc0_user (insn);
4255   
4256           if (GET_CODE (PATTERN (next)) == SET
4257               && SET_DEST (PATTERN (next)) == pc_rtx
4258               && GET_CODE (SET_SRC (PATTERN (next))) == IF_THEN_ELSE)
4259             code = GET_CODE (XEXP (SET_SRC (PATTERN (next)), 0));
4260           else if (GET_CODE (PATTERN (next)) == SET)
4261             code = GET_CODE (SET_SRC (PATTERN (next)));
4262           else
4263             return "sahf";
4264
4265           if (code == GT || code == LT || code == EQ || code == NE
4266               || code == LE || code == GE)
4267             {
4268               /* We will test eax directly. */
4269               cc_status.flags |= CC_TEST_AX;
4270               return "";
4271             }
4272         }
4273
4274       return "sahf";
4275     }
4276
4277   next = next_cc0_user (insn);
4278   if (next == NULL_RTX)
4279     abort ();
4280
4281   if (GET_CODE (PATTERN (next)) == SET
4282       && SET_DEST (PATTERN (next)) == pc_rtx
4283       && GET_CODE (SET_SRC (PATTERN (next))) == IF_THEN_ELSE)
4284     code = GET_CODE (XEXP (SET_SRC (PATTERN (next)), 0));
4285   else if (GET_CODE (PATTERN (next)) == SET)
4286     {
4287       if (GET_CODE (SET_SRC (PATTERN (next))) == IF_THEN_ELSE)
4288         code = GET_CODE (XEXP (SET_SRC (PATTERN (next)), 0));
4289       else
4290         code = GET_CODE (SET_SRC (PATTERN (next)));
4291     }
4292
4293   else if (GET_CODE (PATTERN (next)) == PARALLEL
4294            && GET_CODE (XVECEXP (PATTERN (next), 0, 0)) == SET)
4295     {
4296       if (GET_CODE (SET_SRC (XVECEXP (PATTERN (next), 0, 0))) == IF_THEN_ELSE)
4297         code = GET_CODE (XEXP (SET_SRC (XVECEXP (PATTERN (next), 0, 0)), 0));
4298       else
4299         code = GET_CODE (SET_SRC (XVECEXP (PATTERN (next), 0, 0)));
4300     }
4301   else
4302     abort ();
4303
4304   if (cc_status.flags & CC_FCOMI)
4305     {
4306       /* It is very tricky. We have to do it right. */
4307
4308       xops [0] = gen_rtx_REG (QImode, 0);
4309
4310       switch (code)
4311         {
4312         case GT:
4313         case GE:
4314           break;
4315
4316         case LT:
4317           output_asm_insn (AS1 (setb,%b0), xops);
4318           output_asm_insn (AS1 (setp,%h0), xops);
4319           output_asm_insn (AS2 (cmp%B0,%b0,%h0), xops);
4320           break;
4321
4322         case LE:
4323           output_asm_insn (AS1 (setbe,%b0), xops);
4324           output_asm_insn (AS1 (setnp,%h0), xops);
4325           output_asm_insn (AS2 (xor%B0,%b0,%h0), xops);
4326           break;
4327
4328         case EQ:
4329         case NE:
4330           output_asm_insn (AS1 (setne,%b0), xops);
4331           output_asm_insn (AS1 (setp,%h0), xops);
4332           output_asm_insn (AS2 (or%B0,%b0,%h0), xops);
4333           break;
4334
4335         case GTU:
4336         case LTU:
4337         case GEU:
4338         case LEU:
4339         default:
4340           abort ();
4341         }
4342     }
4343   else
4344     {
4345       xops[0] = gen_rtx_REG (QImode, 0);
4346
4347       switch (code)
4348         {
4349         case GT:
4350           xops[1] = GEN_INT (0x45);
4351           output_asm_insn (AS2 (and%B0,%1,%h0), xops);
4352           /* je label */
4353           break;
4354
4355         case LT:
4356           xops[1] = GEN_INT (0x45);
4357           xops[2] = GEN_INT (0x01);
4358           output_asm_insn (AS2 (and%B0,%1,%h0), xops);
4359           output_asm_insn (AS2 (cmp%B0,%2,%h0), xops);
4360           /* je label */
4361           break;
4362
4363         case GE:
4364           xops[1] = GEN_INT (0x05);
4365           output_asm_insn (AS2 (and%B0,%1,%h0), xops);
4366           /* je label */
4367           break;
4368
4369         case LE:
4370           xops[1] = GEN_INT (0x45);
4371           xops[2] = GEN_INT (0x40);
4372           output_asm_insn (AS2 (and%B0,%1,%h0), xops);
4373           output_asm_insn (AS1 (dec%B0,%h0), xops);
4374           output_asm_insn (AS2 (cmp%B0,%2,%h0), xops);
4375           /* jb label */
4376           break;
4377
4378         case EQ:
4379           xops[1] = GEN_INT (0x45);
4380           xops[2] = GEN_INT (0x40);
4381           output_asm_insn (AS2 (and%B0,%1,%h0), xops);
4382           output_asm_insn (AS2 (cmp%B0,%2,%h0), xops);
4383           /* je label */
4384           break;
4385
4386         case NE:
4387           xops[1] = GEN_INT (0x44);
4388           xops[2] = GEN_INT (0x40);
4389           output_asm_insn (AS2 (and%B0,%1,%h0), xops);
4390           output_asm_insn (AS2 (xor%B0,%2,%h0), xops);
4391           /* jne label */
4392           break;
4393
4394         case GTU:
4395         case LTU:
4396         case GEU:
4397         case LEU:
4398         default:
4399           abort ();
4400         }
4401     }
4402
4403   return "";
4404 }
4405 \f
4406 #define MAX_386_STACK_LOCALS 2
4407
4408 static rtx i386_stack_locals[(int) MAX_MACHINE_MODE][MAX_386_STACK_LOCALS];
4409
4410 /* Define the structure for the machine field in struct function.  */
4411 struct machine_function
4412 {
4413   rtx i386_stack_locals[(int) MAX_MACHINE_MODE][MAX_386_STACK_LOCALS];
4414   rtx pic_label_rtx;
4415   char pic_label_name[256];
4416 };
4417
4418 /* Functions to save and restore i386_stack_locals.
4419    These will be called, via pointer variables,
4420    from push_function_context and pop_function_context.  */
4421
4422 void
4423 save_386_machine_status (p)
4424      struct function *p;
4425 {
4426   p->machine
4427     = (struct machine_function *) xmalloc (sizeof (struct machine_function));
4428   bcopy ((char *) i386_stack_locals, (char *) p->machine->i386_stack_locals,
4429          sizeof i386_stack_locals);
4430   p->machine->pic_label_rtx = pic_label_rtx;
4431   bcopy (pic_label_name, p->machine->pic_label_name, 256);
4432 }
4433
4434 void
4435 restore_386_machine_status (p)
4436      struct function *p;
4437 {
4438   bcopy ((char *) p->machine->i386_stack_locals, (char *) i386_stack_locals,
4439          sizeof i386_stack_locals);
4440   pic_label_rtx = p->machine->pic_label_rtx;
4441   bcopy (p->machine->pic_label_name, pic_label_name, 256);
4442   free (p->machine);
4443   p->machine = NULL;
4444 }
4445
4446 /* Clear stack slot assignments remembered from previous functions.
4447    This is called from INIT_EXPANDERS once before RTL is emitted for each
4448    function.  */
4449
4450 void
4451 clear_386_stack_locals ()
4452 {
4453   enum machine_mode mode;
4454   int n;
4455
4456   for (mode = VOIDmode; (int) mode < (int) MAX_MACHINE_MODE;
4457        mode = (enum machine_mode) ((int) mode + 1))
4458     for (n = 0; n < MAX_386_STACK_LOCALS; n++)
4459       i386_stack_locals[(int) mode][n] = NULL_RTX;
4460
4461   pic_label_rtx = NULL_RTX;
4462   bzero (pic_label_name, 256);
4463   /* Arrange to save and restore i386_stack_locals around nested functions.  */
4464   save_machine_status = save_386_machine_status;
4465   restore_machine_status = restore_386_machine_status;
4466 }
4467
4468 /* Return a MEM corresponding to a stack slot with mode MODE.
4469    Allocate a new slot if necessary.
4470
4471    The RTL for a function can have several slots available: N is
4472    which slot to use.  */
4473
4474 rtx
4475 assign_386_stack_local (mode, n)
4476      enum machine_mode mode;
4477      int n;
4478 {
4479   if (n < 0 || n >= MAX_386_STACK_LOCALS)
4480     abort ();
4481
4482   if (i386_stack_locals[(int) mode][n] == NULL_RTX)
4483     i386_stack_locals[(int) mode][n]
4484       = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
4485
4486   return i386_stack_locals[(int) mode][n];
4487 }
4488 \f
4489 int is_mul(op,mode)
4490     register rtx op;
4491     enum machine_mode mode ATTRIBUTE_UNUSED;
4492 {
4493   return (GET_CODE (op) == MULT);
4494 }
4495
4496 int is_div(op,mode)
4497     register rtx op;
4498     enum machine_mode mode ATTRIBUTE_UNUSED;
4499 {
4500   return (GET_CODE (op) == DIV);
4501 }
4502 \f
4503 #ifdef NOTYET
4504 /* Create a new copy of an rtx.
4505    Recursively copies the operands of the rtx,
4506    except for those few rtx codes that are sharable.
4507    Doesn't share CONST  */
4508
4509 rtx
4510 copy_all_rtx (orig)
4511      register rtx orig;
4512 {
4513   register rtx copy;
4514   register int i, j;
4515   register RTX_CODE code;
4516   register char *format_ptr;
4517
4518   code = GET_CODE (orig);
4519
4520   switch (code)
4521     {
4522     case REG:
4523     case QUEUED:
4524     case CONST_INT:
4525     case CONST_DOUBLE:
4526     case SYMBOL_REF:
4527     case CODE_LABEL:
4528     case PC:
4529     case CC0:
4530     case SCRATCH:
4531       /* SCRATCH must be shared because they represent distinct values. */
4532       return orig;
4533
4534 #if 0
4535     case CONST:
4536       /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
4537          a LABEL_REF, it isn't sharable.  */
4538       if (GET_CODE (XEXP (orig, 0)) == PLUS
4539           && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
4540           && GET_CODE (XEXP (XEXP (orig, 0), 1)) == CONST_INT)
4541         return orig;
4542       break;
4543 #endif
4544       /* A MEM with a constant address is not sharable.  The problem is that
4545          the constant address may need to be reloaded.  If the mem is shared,
4546          then reloading one copy of this mem will cause all copies to appear
4547          to have been reloaded.  */
4548     }
4549
4550   copy = rtx_alloc (code);
4551   PUT_MODE (copy, GET_MODE (orig));
4552   copy->in_struct = orig->in_struct;
4553   copy->volatil = orig->volatil;
4554   copy->unchanging = orig->unchanging;
4555   copy->integrated = orig->integrated;
4556   /* intel1 */
4557   copy->is_spill_rtx = orig->is_spill_rtx;
4558
4559   format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
4560
4561   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
4562     {
4563       switch (*format_ptr++)
4564         {
4565         case 'e':
4566           XEXP (copy, i) = XEXP (orig, i);
4567           if (XEXP (orig, i) != NULL)
4568             XEXP (copy, i) = copy_rtx (XEXP (orig, i));
4569           break;
4570
4571         case '0':
4572         case 'u':
4573           XEXP (copy, i) = XEXP (orig, i);
4574           break;
4575
4576         case 'E':
4577         case 'V':
4578           XVEC (copy, i) = XVEC (orig, i);
4579           if (XVEC (orig, i) != NULL)
4580             {
4581               XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
4582               for (j = 0; j < XVECLEN (copy, i); j++)
4583                 XVECEXP (copy, i, j) = copy_rtx (XVECEXP (orig, i, j));
4584             }
4585           break;
4586
4587         case 'w':
4588           XWINT (copy, i) = XWINT (orig, i);
4589           break;
4590
4591         case 'i':
4592           XINT (copy, i) = XINT (orig, i);
4593           break;
4594
4595         case 's':
4596         case 'S':
4597           XSTR (copy, i) = XSTR (orig, i);
4598           break;
4599
4600         default:
4601           abort ();
4602         }
4603     }
4604   return copy;
4605 }
4606
4607 \f
4608 /* Try to rewrite a memory address to make it valid */
4609
4610 void
4611 rewrite_address (mem_rtx)
4612      rtx mem_rtx;
4613 {
4614   rtx index_rtx, base_rtx, offset_rtx, scale_rtx, ret_rtx;
4615   int scale = 1;
4616   int offset_adjust = 0;
4617   int was_only_offset = 0;
4618   rtx mem_addr = XEXP (mem_rtx, 0);
4619   char *storage = oballoc (0);
4620   int in_struct = 0;
4621   int is_spill_rtx = 0;
4622
4623   in_struct = MEM_IN_STRUCT_P (mem_rtx);
4624   is_spill_rtx = RTX_IS_SPILL_P (mem_rtx);
4625
4626   if (GET_CODE (mem_addr) == PLUS
4627       && GET_CODE (XEXP (mem_addr, 1)) == PLUS
4628       && GET_CODE (XEXP (XEXP (mem_addr, 1), 0)) == REG)
4629     {
4630       /* This part is utilized by the combiner. */
4631       ret_rtx
4632         = gen_rtx (PLUS, GET_MODE (mem_addr),
4633                    gen_rtx (PLUS, GET_MODE (XEXP (mem_addr, 1)),
4634                             XEXP (mem_addr, 0), XEXP (XEXP (mem_addr, 1), 0)),
4635                    XEXP (XEXP (mem_addr, 1), 1));
4636
4637       if (memory_address_p (GET_MODE (mem_rtx), ret_rtx))
4638         {
4639           XEXP (mem_rtx, 0) = ret_rtx;
4640           RTX_IS_SPILL_P (ret_rtx) = is_spill_rtx;
4641           return;
4642         }
4643
4644       obfree (storage);
4645     }
4646
4647   /* This part is utilized by loop.c.
4648      If the address contains PLUS (reg,const) and this pattern is invalid
4649      in this case - try to rewrite the address to make it valid. */
4650   storage = oballoc (0);
4651   index_rtx = base_rtx = offset_rtx = NULL;
4652
4653   /* Find the base index and offset elements of the memory address. */
4654   if (GET_CODE (mem_addr) == PLUS)
4655     {
4656       if (GET_CODE (XEXP (mem_addr, 0)) == REG)
4657         {
4658           if (GET_CODE (XEXP (mem_addr, 1)) == REG)
4659             base_rtx = XEXP (mem_addr, 1), index_rtx = XEXP (mem_addr, 0);
4660           else
4661             base_rtx = XEXP (mem_addr, 0), offset_rtx = XEXP (mem_addr, 1);
4662         }
4663
4664       else if (GET_CODE (XEXP (mem_addr, 0)) == MULT)
4665         {
4666           index_rtx = XEXP (mem_addr, 0);
4667           if (GET_CODE (XEXP (mem_addr, 1)) == REG)
4668             base_rtx = XEXP (mem_addr, 1);
4669           else
4670             offset_rtx = XEXP (mem_addr, 1);
4671         }
4672
4673       else if (GET_CODE (XEXP (mem_addr, 0)) == PLUS)
4674         {
4675           if (GET_CODE (XEXP (XEXP (mem_addr, 0), 0)) == PLUS
4676               && GET_CODE (XEXP (XEXP (XEXP (mem_addr, 0), 0), 0)) == MULT
4677               && (GET_CODE (XEXP (XEXP (XEXP (XEXP (mem_addr, 0), 0), 0), 0))
4678                   == REG)
4679               && (GET_CODE (XEXP (XEXP (XEXP (XEXP (mem_addr, 0), 0), 0), 1))
4680                   == CONST_INT)
4681               && (GET_CODE (XEXP (XEXP (XEXP (mem_addr, 0), 0), 1))
4682                   == CONST_INT)
4683               && GET_CODE (XEXP (XEXP (mem_addr, 0), 1)) == REG
4684               && GET_CODE (XEXP (mem_addr, 1)) == SYMBOL_REF)
4685             {
4686               index_rtx = XEXP (XEXP (XEXP (mem_addr, 0), 0), 0);
4687               offset_rtx = XEXP (mem_addr, 1);
4688               base_rtx = XEXP (XEXP (mem_addr, 0), 1);
4689               offset_adjust = INTVAL (XEXP (XEXP (XEXP (mem_addr, 0), 0), 1));
4690             }
4691           else
4692             {
4693               offset_rtx = XEXP (mem_addr, 1);
4694               index_rtx = XEXP (XEXP (mem_addr, 0), 0);
4695               base_rtx = XEXP (XEXP (mem_addr, 0), 1);
4696             }
4697         }
4698
4699       else if (GET_CODE (XEXP (mem_addr, 0)) == CONST_INT)
4700         {
4701           was_only_offset = 1;
4702           index_rtx = NULL;
4703           base_rtx = NULL;
4704           offset_rtx = XEXP (mem_addr, 1);
4705           offset_adjust = INTVAL (XEXP (mem_addr, 0));
4706           if (offset_adjust == 0)
4707             {
4708               XEXP (mem_rtx, 0) = offset_rtx;
4709               RTX_IS_SPILL_P (XEXP (mem_rtx, 0)) = is_spill_rtx;
4710               return;
4711             }
4712         }
4713       else
4714         {
4715           obfree (storage);
4716           return;
4717         }
4718     }
4719   else if (GET_CODE (mem_addr) == MULT)
4720     index_rtx = mem_addr;
4721   else
4722     {
4723       obfree (storage);
4724       return;
4725     }
4726
4727   if (index_rtx != 0 && GET_CODE (index_rtx) == MULT)
4728     {
4729       if (GET_CODE (XEXP (index_rtx, 1)) != CONST_INT)
4730         {
4731           obfree (storage);
4732           return;
4733         }
4734
4735       scale_rtx = XEXP (index_rtx, 1);
4736       scale = INTVAL (scale_rtx);
4737       index_rtx = copy_all_rtx (XEXP (index_rtx, 0));
4738     }
4739
4740   /* Now find which of the elements are invalid and try to fix them. */
4741   if (index_rtx && GET_CODE (index_rtx) == CONST_INT && base_rtx == NULL)
4742     {
4743       offset_adjust = INTVAL (index_rtx) * scale;
4744
4745       if (offset_rtx != 0 && CONSTANT_P (offset_rtx))
4746         offset_rtx = plus_constant (offset_rtx, offset_adjust);
4747       else if (offset_rtx == 0)
4748         offset_rtx = const0_rtx;
4749
4750       RTX_IS_SPILL_P (XEXP (mem_rtx, 0)) = is_spill_rtx;
4751       XEXP (mem_rtx, 0) = offset_rtx;
4752       return;
4753     }
4754
4755   if (base_rtx && GET_CODE (base_rtx) == PLUS
4756       && GET_CODE (XEXP (base_rtx, 0)) == REG
4757       && GET_CODE (XEXP (base_rtx, 1)) == CONST_INT)
4758     {
4759       offset_adjust += INTVAL (XEXP (base_rtx, 1));
4760       base_rtx = copy_all_rtx (XEXP (base_rtx, 0));
4761     }
4762
4763   else if (base_rtx && GET_CODE (base_rtx) == CONST_INT)
4764     {
4765       offset_adjust += INTVAL (base_rtx);
4766       base_rtx = NULL;
4767     }
4768
4769   if (index_rtx && GET_CODE (index_rtx) == PLUS
4770       && GET_CODE (XEXP (index_rtx, 0)) == REG
4771       && GET_CODE (XEXP (index_rtx, 1)) == CONST_INT)
4772     {
4773       offset_adjust += INTVAL (XEXP (index_rtx, 1)) * scale;
4774       index_rtx = copy_all_rtx (XEXP (index_rtx, 0));
4775     }
4776
4777   if (index_rtx)
4778     {
4779       if (! LEGITIMATE_INDEX_P (index_rtx)
4780           && ! (index_rtx == stack_pointer_rtx && scale == 1
4781                 && base_rtx == NULL))
4782         {
4783           obfree (storage);
4784           return;
4785         }
4786     }
4787
4788   if (base_rtx)
4789     {
4790       if (! LEGITIMATE_INDEX_P (base_rtx) && GET_CODE (base_rtx) != REG)
4791         {
4792           obfree (storage);
4793           return;
4794         }
4795     }
4796
4797   if (offset_adjust != 0)
4798     {
4799       if (offset_rtx != 0 && CONSTANT_P (offset_rtx))
4800         offset_rtx = plus_constant (offset_rtx, offset_adjust);
4801       else
4802         offset_rtx = const0_rtx;
4803
4804       if (index_rtx)
4805         {
4806           if (base_rtx)
4807             {
4808               if (scale != 1)
4809                 {
4810                   ret_rtx = gen_rtx (PLUS, GET_MODE (base_rtx),
4811                                      gen_rtx (MULT, GET_MODE (index_rtx),
4812                                               index_rtx, scale_rtx),
4813                                      base_rtx);
4814
4815                   if (GET_CODE (offset_rtx) != CONST_INT
4816                       || INTVAL (offset_rtx) != 0)
4817                     ret_rtx = gen_rtx (PLUS, GET_MODE (ret_rtx),
4818                                        ret_rtx, offset_rtx);
4819                 }
4820               else
4821                 {
4822                   ret_rtx = gen_rtx (PLUS, GET_MODE (index_rtx),
4823                                      index_rtx, base_rtx);
4824
4825                   if (GET_CODE (offset_rtx) != CONST_INT
4826                       || INTVAL (offset_rtx) != 0)
4827                     ret_rtx = gen_rtx (PLUS, GET_MODE (ret_rtx),
4828                                        ret_rtx, offset_rtx);
4829                 }
4830             }
4831           else
4832             {
4833               if (scale != 1)
4834                 {
4835                   ret_rtx = gen_rtx (MULT, GET_MODE (index_rtx),
4836                                      index_rtx, scale_rtx);
4837
4838                   if (GET_CODE (offset_rtx) != CONST_INT
4839                       || INTVAL (offset_rtx) != 0)
4840                     ret_rtx = gen_rtx (PLUS, GET_MODE (ret_rtx),
4841                                        ret_rtx, offset_rtx);
4842                 }
4843               else
4844                 {
4845                   if (GET_CODE (offset_rtx) == CONST_INT
4846                       && INTVAL (offset_rtx) == 0)
4847                     ret_rtx = index_rtx;
4848                   else
4849                     ret_rtx = gen_rtx (PLUS, GET_MODE (index_rtx),
4850                                        index_rtx, offset_rtx);
4851                 }
4852             }
4853         }
4854       else
4855         {
4856           if (base_rtx)
4857             {
4858               if (GET_CODE (offset_rtx) == CONST_INT
4859                   && INTVAL (offset_rtx) == 0)
4860                 ret_rtx = base_rtx;
4861               else
4862                 ret_rtx = gen_rtx (PLUS, GET_MODE (base_rtx), base_rtx,
4863                                    offset_rtx);
4864             }
4865           else if (was_only_offset)
4866             ret_rtx = offset_rtx;
4867           else
4868             {
4869               obfree (storage);
4870               return;
4871             }
4872         }
4873
4874       XEXP (mem_rtx, 0) = ret_rtx;
4875       RTX_IS_SPILL_P (XEXP (mem_rtx, 0)) = is_spill_rtx;
4876       return;
4877     }
4878   else
4879     {
4880       obfree (storage);
4881       return;
4882     }
4883 }
4884 #endif /* NOTYET */
4885 \f
4886 /* Return 1 if the first insn to set cc before INSN also sets the register
4887    REG_RTX; otherwise return 0. */
4888 int
4889 last_to_set_cc (reg_rtx, insn)
4890      rtx reg_rtx, insn;
4891 {
4892   rtx prev_insn = PREV_INSN (insn);
4893
4894   while (prev_insn)
4895     {
4896       if (GET_CODE (prev_insn) == NOTE)
4897         ;
4898
4899       else if (GET_CODE (prev_insn) == INSN)
4900         {
4901           if (GET_CODE (PATTERN (prev_insn)) != SET)
4902             return (0);
4903
4904           if (rtx_equal_p (SET_DEST (PATTERN (prev_insn)), reg_rtx))
4905             {
4906               if (sets_condition_code (SET_SRC (PATTERN (prev_insn))))
4907                 return (1);
4908
4909               return (0);
4910             }
4911
4912           else if (! doesnt_set_condition_code (SET_SRC (PATTERN (prev_insn))))
4913             return (0);
4914         }
4915
4916       else
4917         return (0);
4918
4919       prev_insn = PREV_INSN (prev_insn);
4920     }
4921
4922   return (0);
4923 }
4924 \f
4925 int
4926 doesnt_set_condition_code (pat)
4927      rtx pat;
4928 {
4929   switch (GET_CODE (pat))
4930     {
4931     case MEM:
4932     case REG:
4933       return 1;
4934
4935     default:
4936       return 0;
4937
4938     }
4939 }
4940 \f
4941 int
4942 sets_condition_code (pat)
4943      rtx pat;
4944 {
4945   switch (GET_CODE (pat))
4946     {
4947     case PLUS:
4948     case MINUS:
4949     case AND:
4950     case IOR:
4951     case XOR:
4952     case NOT:
4953     case NEG:
4954     case MULT:
4955     case DIV:
4956     case MOD:
4957     case UDIV:
4958     case UMOD:
4959       return 1;
4960
4961     default:
4962       return (0);
4963     }
4964 }
4965 \f
4966 int
4967 str_immediate_operand (op, mode)
4968      register rtx op;
4969      enum machine_mode mode ATTRIBUTE_UNUSED;
4970 {
4971   if (GET_CODE (op) == CONST_INT && INTVAL (op) <= 32 && INTVAL (op) >= 0)
4972     return 1;
4973
4974   return 0;
4975 }
4976 \f
4977 int
4978 is_fp_insn (insn)
4979      rtx insn;
4980 {
4981   if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SET
4982       && (GET_MODE (SET_DEST (PATTERN (insn))) == DFmode
4983           || GET_MODE (SET_DEST (PATTERN (insn))) == SFmode
4984           || GET_MODE (SET_DEST (PATTERN (insn))) == XFmode))
4985     return 1;
4986
4987   return 0;
4988 }
4989
4990 /* Return 1 if the mode of the SET_DEST of insn is floating point
4991    and it is not an fld or a move from memory to memory.
4992    Otherwise return 0 */
4993
4994 int
4995 is_fp_dest (insn)
4996      rtx insn;
4997 {
4998   if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SET
4999       && (GET_MODE (SET_DEST (PATTERN (insn))) == DFmode
5000           || GET_MODE (SET_DEST (PATTERN (insn))) == SFmode
5001           || GET_MODE (SET_DEST (PATTERN (insn))) == XFmode)
5002       && GET_CODE (SET_DEST (PATTERN (insn))) == REG
5003       && REGNO (SET_DEST (PATTERN (insn))) >= FIRST_FLOAT_REG
5004       && GET_CODE (SET_SRC (PATTERN (insn))) != MEM)
5005     return 1;
5006
5007   return 0;
5008 }
5009
5010 /* Return 1 if the mode of the SET_DEST of INSN is floating point and is
5011    memory and the source is a register.  */
5012
5013 int
5014 is_fp_store (insn)
5015      rtx insn;
5016 {
5017   if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SET
5018       && (GET_MODE (SET_DEST (PATTERN (insn))) == DFmode
5019           || GET_MODE (SET_DEST (PATTERN (insn))) == SFmode
5020           || GET_MODE (SET_DEST (PATTERN (insn))) == XFmode)
5021       && GET_CODE (SET_DEST (PATTERN (insn))) == MEM
5022       && GET_CODE (SET_SRC (PATTERN (insn))) == REG)
5023     return 1;
5024
5025   return 0;
5026 }
5027 \f
5028 /* Return 1 if DEP_INSN sets a register which INSN uses as a base
5029    or index to reference memory.
5030    otherwise return 0 */
5031
5032 int
5033 agi_dependent (insn, dep_insn)
5034      rtx insn, dep_insn;
5035 {
5036   int push = 0, push_dep = 0;
5037   if (GET_CODE (dep_insn) == INSN
5038       && GET_CODE (PATTERN (dep_insn)) == SET
5039       && GET_CODE (SET_DEST (PATTERN (dep_insn))) == REG
5040       && reg_mentioned_in_mem (SET_DEST (PATTERN (dep_insn)), insn))
5041     return 1;
5042
5043   if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SET
5044       && GET_CODE (SET_DEST (PATTERN (insn))) == MEM
5045       && push_operand (SET_DEST (PATTERN (insn)),
5046                        GET_MODE (SET_DEST (PATTERN (insn)))))
5047     push = 1;
5048
5049   if (GET_CODE (dep_insn) == INSN && GET_CODE (PATTERN (dep_insn)) == SET
5050       && GET_CODE (SET_DEST (PATTERN (dep_insn))) == MEM
5051       && push_operand (SET_DEST (PATTERN (dep_insn)),
5052                        GET_MODE (SET_DEST (PATTERN (dep_insn)))))
5053     push_dep = 1;
5054
5055   /* CPUs contain special hardware to allow two pushes.  */
5056   if (push && push_dep) 
5057     return 0;
5058
5059   /* Push operation implicitly change stack pointer causing AGI stalls.  */
5060   if (push_dep && reg_mentioned_in_mem (stack_pointer_rtx, insn))
5061     return 1;
5062
5063   /* Push also implicitly read stack pointer.  */
5064   if (push && modified_in_p (stack_pointer_rtx, dep_insn))
5065     return 1;
5066
5067   return 0;
5068 }
5069 \f
5070 /* Return 1 if reg is used in rtl as a base or index for a memory ref
5071    otherwise return 0. */
5072
5073 int
5074 reg_mentioned_in_mem (reg, rtl)
5075      rtx reg, rtl;
5076 {
5077   register char *fmt;
5078   register int i, j;
5079   register enum rtx_code code;
5080
5081   if (rtl == NULL)
5082     return 0;
5083
5084   code = GET_CODE (rtl);
5085
5086   switch (code)
5087     {
5088     case HIGH:
5089     case CONST_INT:
5090     case CONST:
5091     case CONST_DOUBLE:
5092     case SYMBOL_REF:
5093     case LABEL_REF:
5094     case PC:
5095     case CC0:
5096     case SUBREG:
5097       return 0;
5098     default:
5099       break;
5100     }
5101
5102   if (code == MEM && reg_mentioned_p (reg, rtl))
5103     return 1;
5104
5105   fmt = GET_RTX_FORMAT (code);
5106   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
5107     {
5108       if (fmt[i] == 'E')
5109         {
5110           for (j = XVECLEN (rtl, i) - 1; j >= 0; j--)
5111             if (reg_mentioned_in_mem (reg, XVECEXP (rtl, i, j)))
5112               return 1;
5113         }
5114
5115       else if (fmt[i] == 'e' && reg_mentioned_in_mem (reg, XEXP (rtl, i)))
5116         return 1;
5117     }
5118
5119   return 0;
5120 }
5121 \f
5122 /* Output the appropriate insns for doing strlen if not just doing repnz; scasb
5123
5124    operands[0] = result, initialized with the startaddress
5125    operands[1] = alignment of the address.
5126    operands[2] = scratch register, initialized with the startaddress when
5127                  not aligned, otherwise undefined
5128
5129    This is just the body. It needs the initialisations mentioned above and
5130    some address computing at the end.  These things are done in i386.md.  */
5131
5132 char *
5133 output_strlen_unroll (operands)
5134      rtx operands[];
5135 {
5136   rtx xops[18];
5137
5138   xops[0] = operands[0];                /* Result */
5139   /*        operands[1];                 * Alignment */
5140   xops[1] = operands[2];                /* Scratch */
5141   xops[2] = GEN_INT (0);
5142   xops[3] = GEN_INT (2);
5143   xops[4] = GEN_INT (3);
5144   xops[5] = GEN_INT (4);
5145   /* xops[6] = gen_label_rtx ();         * label when aligned to 3-byte */
5146   /* xops[7] = gen_label_rtx ();         * label when aligned to 2-byte */
5147   xops[8] = gen_label_rtx ();           /* label of main loop */
5148
5149   if (TARGET_USE_Q_REG && QI_REG_P (xops[1]))
5150     xops[9] = gen_label_rtx ();         /* pentium optimisation */
5151
5152   xops[10] = gen_label_rtx ();          /* end label 2 */
5153   xops[11] = gen_label_rtx ();          /* end label 1 */
5154   xops[12] = gen_label_rtx ();          /* end label */
5155   /* xops[13]                            * Temporary used */
5156   xops[14] = GEN_INT (0xff);
5157   xops[15] = GEN_INT (0xff00);
5158   xops[16] = GEN_INT (0xff0000);
5159   xops[17] = GEN_INT (0xff000000);
5160
5161   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
5162
5163   /* Is there a known alignment and is it less than 4?  */
5164   if (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) < 4)
5165     {
5166       /* Is there a known alignment and is it not 2? */
5167       if (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 2)
5168         {
5169           xops[6] = gen_label_rtx (); /* Label when aligned to 3-byte */
5170           xops[7] = gen_label_rtx (); /* Label when aligned to 2-byte */
5171
5172           /* Leave just the 3 lower bits.
5173              If this is a q-register, then the high part is used later
5174              therefore use andl rather than andb. */
5175           output_asm_insn (AS2 (and%L1,%4,%1), xops);
5176
5177           /* Is aligned to 4-byte address when zero */
5178           output_asm_insn (AS1 (je,%l8), xops);
5179
5180           /* Side-effect even Parity when %eax == 3 */
5181           output_asm_insn (AS1 (jp,%6), xops);
5182
5183           /* Is it aligned to 2 bytes ? */
5184           if (QI_REG_P (xops[1]))
5185             output_asm_insn (AS2 (cmp%L1,%3,%1), xops);
5186           else
5187             output_asm_insn (AS2 (cmp%L1,%3,%1), xops);
5188
5189           output_asm_insn (AS1 (je,%7), xops);
5190         }
5191       else
5192         {
5193           /* Since the alignment is 2, we have to check 2 or 0 bytes;
5194              check if is aligned to 4 - byte.  */
5195           output_asm_insn (AS2 (and%L1,%3,%1), xops);
5196
5197           /* Is aligned to 4-byte address when zero */
5198           output_asm_insn (AS1 (je,%l8), xops);
5199         }
5200
5201       xops[13] = gen_rtx_MEM (QImode, xops[0]);
5202
5203       /* Now compare the bytes; compare with the high part of a q-reg
5204          gives shorter code. */
5205       if (QI_REG_P (xops[1]))
5206         {
5207           /* Compare the first n unaligned byte on a byte per byte basis. */
5208           output_asm_insn (AS2 (cmp%B1,%h1,%13), xops);
5209
5210           /* When zero we reached the end. */
5211           output_asm_insn (AS1 (je,%l12), xops);
5212
5213           /* Increment the address. */
5214           output_asm_insn (AS1 (inc%L0,%0), xops);
5215
5216           /* Not needed with an alignment of 2 */
5217           if (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 2)
5218             {
5219               ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
5220                                          CODE_LABEL_NUMBER (xops[7]));
5221               output_asm_insn (AS2 (cmp%B1,%h1,%13), xops);
5222               output_asm_insn (AS1 (je,%l12), xops);
5223               output_asm_insn (AS1 (inc%L0,%0), xops);
5224
5225               ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
5226                                          CODE_LABEL_NUMBER (xops[6]));
5227             }
5228
5229           output_asm_insn (AS2 (cmp%B1,%h1,%13), xops);
5230         }
5231       else
5232         {
5233           output_asm_insn (AS2 (cmp%B13,%2,%13), xops);
5234           output_asm_insn (AS1 (je,%l12), xops);
5235           output_asm_insn (AS1 (inc%L0,%0), xops);
5236
5237           /* Not needed with an alignment of 2 */
5238           if (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 2)
5239             {
5240           ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
5241                                      CODE_LABEL_NUMBER (xops[7]));
5242           output_asm_insn (AS2 (cmp%B13,%2,%13), xops);
5243           output_asm_insn (AS1 (je,%l12), xops);
5244           output_asm_insn (AS1 (inc%L0,%0), xops);
5245
5246           ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
5247                                      CODE_LABEL_NUMBER (xops[6]));
5248             }
5249
5250           output_asm_insn (AS2 (cmp%B13,%2,%13), xops);
5251         }
5252
5253       output_asm_insn (AS1 (je,%l12), xops);
5254       output_asm_insn (AS1 (inc%L0,%0), xops);
5255     }
5256
5257     /* Generate loop to check 4 bytes at a time.  It is not a good idea to
5258        align this loop.  It gives only huge programs, but does not help to
5259        speed up.  */
5260   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (xops[8]));
5261
5262   xops[13] = gen_rtx_MEM (SImode, xops[0]);
5263   output_asm_insn (AS2 (mov%L1,%13,%1), xops);
5264
5265   if (QI_REG_P (xops[1]))
5266     {
5267       /* On i586 it is faster to combine the hi- and lo- part as
5268          a kind of lookahead.  If anding both yields zero, then one
5269          of both *could* be zero, otherwise none of both is zero;
5270          this saves one instruction, on i486 this is slower
5271          tested with P-90, i486DX2-66, AMD486DX2-66  */
5272       if (TARGET_PENTIUM)
5273         {
5274           output_asm_insn (AS2 (test%B1,%h1,%b1), xops);
5275           output_asm_insn (AS1 (jne,%l9), xops);
5276         }
5277
5278       /* Check first byte. */
5279       output_asm_insn (AS2 (test%B1,%b1,%b1), xops);
5280       output_asm_insn (AS1 (je,%l12), xops);
5281
5282       /* Check second byte. */
5283       output_asm_insn (AS2 (test%B1,%h1,%h1), xops);
5284       output_asm_insn (AS1 (je,%l11), xops);
5285
5286       if (TARGET_PENTIUM)
5287         ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
5288                                    CODE_LABEL_NUMBER (xops[9]));
5289     }
5290
5291   else
5292     {
5293       /* Check first byte. */
5294       output_asm_insn (AS2 (test%L1,%14,%1), xops);
5295       output_asm_insn (AS1 (je,%l12), xops);
5296
5297       /* Check second byte. */
5298       output_asm_insn (AS2 (test%L1,%15,%1), xops);
5299       output_asm_insn (AS1 (je,%l11), xops);
5300     }
5301
5302   /* Check third byte. */
5303   output_asm_insn (AS2 (test%L1,%16,%1), xops);
5304   output_asm_insn (AS1 (je,%l10), xops);
5305
5306   /* Check fourth byte and increment address. */
5307   output_asm_insn (AS2 (add%L0,%5,%0), xops);
5308   output_asm_insn (AS2 (test%L1,%17,%1), xops);
5309   output_asm_insn (AS1 (jne,%l8), xops);
5310
5311   /* Now generate fixups when the compare stops within a 4-byte word. */
5312   output_asm_insn (AS2 (sub%L0,%4,%0), xops);
5313
5314   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (xops[10]));
5315   output_asm_insn (AS1 (inc%L0,%0), xops);
5316
5317   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (xops[11]));
5318   output_asm_insn (AS1 (inc%L0,%0), xops);
5319
5320   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (xops[12]));
5321
5322   return "";
5323 }
5324
5325 char *
5326 output_fp_conditional_move (which_alternative, operands)
5327      int which_alternative;
5328      rtx operands[];
5329 {
5330   enum rtx_code code = GET_CODE (operands[1]);
5331
5332   /* This should never happen.  */
5333   if (!(cc_prev_status.flags & CC_IN_80387)
5334       && (code == GT || code == LE || code == GE || code == LT))
5335     abort ();
5336
5337   switch (which_alternative)
5338     {
5339     case 0:
5340       /* r <- cond ? arg : r */
5341       output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
5342       break;
5343
5344     case 1:
5345       /* r <- cond ? r : arg */
5346       output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
5347       break;
5348
5349     default:
5350       abort ();
5351     }
5352
5353   return "";
5354 }
5355
5356 char *
5357 output_int_conditional_move (which_alternative, operands)
5358      int which_alternative;
5359      rtx operands[];
5360 {
5361   enum rtx_code code = GET_CODE (operands[1]);
5362
5363   /* This is very tricky. We have to do it right. For a code segement
5364      like:
5365
5366         int foo, bar;
5367         ....
5368         foo = foo - x;
5369         if (foo >= 0)
5370           bar = y;
5371
5372      final_scan_insn () may delete the insn which sets CC. We have to
5373      tell final_scan_insn () if it should be reinserted. When CODE is
5374      GT or LE, we have to check the CC_NO_OVERFLOW bit and return
5375      NULL_PTR to tell final to reinsert the test insn because the
5376      conditional move cannot be handled properly without it. */
5377   if ((code == GT || code == LE)
5378       && (cc_prev_status.flags & CC_NO_OVERFLOW))
5379     return NULL_PTR;
5380
5381   switch (which_alternative)
5382     {
5383     case 0:
5384       /* r <- cond ? arg : r */
5385       output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
5386       break;
5387
5388     case 1:
5389       /* r <- cond ? r : arg */
5390       output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
5391       break;
5392
5393     default:
5394       abort ();
5395     }
5396
5397   return "";
5398 }
5399
5400 int
5401 x86_adjust_cost (insn, link, dep_insn, cost)
5402      rtx insn, link, dep_insn;
5403      int cost;
5404 {
5405   rtx next_inst;
5406
5407   if (GET_CODE (dep_insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN)
5408     return 0;
5409
5410   if (GET_CODE (dep_insn) == INSN
5411       && GET_CODE (PATTERN (dep_insn)) == SET
5412       && GET_CODE (SET_DEST (PATTERN (dep_insn))) == REG
5413       && GET_CODE (insn) == INSN
5414       && GET_CODE (PATTERN (insn)) == SET
5415       && !reg_overlap_mentioned_p (SET_DEST (PATTERN (dep_insn)),
5416                                    SET_SRC (PATTERN (insn))))
5417     return 0;   /* ??? */
5418
5419
5420   switch (ix86_cpu)
5421     {
5422     case PROCESSOR_PENTIUM:
5423       if (cost != 0 && is_fp_insn (insn) && is_fp_insn (dep_insn)
5424           && !is_fp_dest (dep_insn))
5425         return 0;
5426
5427       if (agi_dependent (insn, dep_insn))
5428         return cost ? cost + 1 : 2;
5429
5430       if (GET_CODE (insn) == INSN
5431           && GET_CODE (PATTERN (insn)) == SET
5432           && SET_DEST (PATTERN (insn)) == cc0_rtx
5433           && (next_inst = next_nonnote_insn (insn))
5434           && GET_CODE (next_inst) == JUMP_INSN)
5435         /* compare probably paired with jump */
5436         return 0;
5437
5438       /* Stores stalls one cycle longer than other insns.  */
5439       if (is_fp_insn (insn) && cost && is_fp_store (dep_insn))
5440         cost++;
5441       break;
5442     case PROCESSOR_K6:
5443     default:
5444       if (!is_fp_dest (dep_insn))
5445         {
5446           if(!agi_dependent (insn, dep_insn))
5447             return 0;
5448           if (TARGET_486)
5449             return 2;
5450         }
5451       else
5452         if (is_fp_store (insn) && is_fp_insn (dep_insn)
5453             && NEXT_INSN (insn) && NEXT_INSN (NEXT_INSN (insn))
5454             && NEXT_INSN (NEXT_INSN (NEXT_INSN (insn)))
5455             && (GET_CODE (NEXT_INSN (insn)) == INSN)
5456             && (GET_CODE (NEXT_INSN (NEXT_INSN (insn))) == JUMP_INSN)
5457             && (GET_CODE (NEXT_INSN (NEXT_INSN (NEXT_INSN (insn)))) == NOTE)
5458             && (NOTE_LINE_NUMBER (NEXT_INSN (NEXT_INSN (NEXT_INSN (insn))))
5459                 == NOTE_INSN_LOOP_END))
5460           return 3;
5461       break;
5462     }
5463
5464   return cost;
5465 }
5466
5467 /* Output assembly code for a left shift.
5468
5469    Always use "sal" when shifting a memory operand or for a non constant
5470    shift count.
5471
5472    When optimizing for size, we know that src == dest, and we should always
5473    use "sal".  If src != dest, then copy src to dest and use "sal".
5474    
5475    Pentium and PPro (speed):
5476
5477      When src == dest, use "add" for a shift counts of one, else use
5478      "sal".  If we modeled Pentium AGI stalls and U/V pipelining better we
5479      would want to generate lea for some shifts on the Pentium.
5480
5481      When src != dest, use "lea" for small shift counts.  Otherwise,
5482      copy src to dest and use the normal shifting code.  Exception for
5483      TARGET_DOUBLE_WITH_ADD.  */
5484
5485 char *
5486 output_ashl (insn, operands)
5487      rtx insn, *operands;
5488 {
5489   /* Handle case where srcreg != dstreg.  */
5490   if (REG_P (operands[0]) && REGNO (operands[0]) != REGNO (operands[1]))
5491     {
5492       if (TARGET_DOUBLE_WITH_ADD && INTVAL (operands[2]) == 1)
5493         switch (GET_MODE (operands[0]))
5494           {
5495           case SImode:
5496             output_asm_insn (AS2 (mov%L0,%1,%0), operands);
5497             return AS2 (add%L0,%1,%0);
5498           case HImode:
5499             output_asm_insn (AS2 (mov%L0,%k1,%k0), operands);
5500             if (i386_cc_probably_useless_p (insn))
5501               {
5502                 CC_STATUS_INIT;
5503                 return AS2 (add%L0,%k1,%k0);
5504               }
5505             return AS2 (add%W0,%k1,%k0);
5506           case QImode:
5507             output_asm_insn (AS2 (mov%B0,%1,%0), operands);
5508             return AS2 (add%B0,%1,%0);
5509           default:
5510             abort ();
5511           }
5512       else
5513         {
5514           CC_STATUS_INIT;
5515
5516           /* This should be extremely rare (impossible?).  We can not encode a
5517              shift of the stack pointer using an lea instruction.  So copy the
5518              stack pointer into the destination register and use an lea.  */
5519           if (operands[1] == stack_pointer_rtx)
5520             {
5521               output_asm_insn (AS2 (mov%L0,%k1,%k0), operands);
5522               operands[1] = operands[0];
5523             }
5524
5525           /* For shifts up to and including 3 bits, use lea.  */
5526           operands[1] = gen_rtx_MULT (SImode,
5527                                       gen_rtx_REG (SImode, REGNO (operands[1])),
5528                                       GEN_INT (1 << INTVAL (operands[2])));
5529           return AS2 (lea%L0,%a1,%k0);
5530         }
5531     }
5532
5533   /* Source and destination match.  */
5534
5535   /* Handle variable shift.  */
5536   if (REG_P (operands[2]))
5537     switch (GET_MODE (operands[0]))
5538       {
5539       case SImode:
5540         return AS2 (sal%L0,%b2,%0);
5541       case HImode:
5542         if (REG_P (operands[0]) && i386_cc_probably_useless_p (insn))
5543           {
5544             CC_STATUS_INIT;
5545             return AS2 (sal%L0,%b2,%k0);
5546           }
5547         else
5548           return AS2 (sal%W0,%b2,%0);
5549       case QImode:
5550         return AS2 (sal%B0,%b2,%0);
5551       default:
5552         abort ();
5553       }
5554
5555   /* Always perform shift by 1 using an add instruction.  */
5556   if (REG_P (operands[0]) && operands[2] == const1_rtx)
5557     switch (GET_MODE (operands[0]))
5558       {
5559       case SImode:
5560         return AS2 (add%L0,%0,%0);
5561       case HImode:
5562         if (REG_P (operands[0]) && i386_cc_probably_useless_p (insn))
5563           {
5564             CC_STATUS_INIT;
5565             return AS2 (add%L0,%k0,%k0);
5566           }
5567         else
5568           return AS2 (add%W0,%0,%0);
5569       case QImode:
5570           return AS2 (add%B0,%0,%0);
5571       default:
5572           abort ();
5573       }
5574
5575 #if 0
5576   /* ??? Currently disabled.  Because our model of Pentium is far from being
5577      exact, this change will need some benchmarking.  */
5578   /* Shift reg by 2 or 3 use an lea instruction for Pentium if this is
5579      insn is expected to issue into the V pipe (the insn's mode will be
5580      TImode for a U pipe, and !TImode for a V pipe instruction).  */
5581   if (! optimize_size
5582       && REG_P (operands[0])
5583       && GET_CODE (operands[2]) == CONST_INT
5584       && INTVAL (operands[2]) <= 3
5585       && (int)ix86_cpu == (int)PROCESSOR_PENTIUM
5586       && GET_MODE (insn) != TImode)
5587     {
5588       CC_STATUS_INIT;
5589       operands[1] = gen_rtx_MULT (SImode, gen_rtx_REG (SImode, REGNO (operands[1])),
5590                                   GEN_INT (1 << INTVAL (operands[2])));
5591       return AS2 (lea%L0,%a1,%0);
5592     }
5593 #endif
5594
5595   /* Otherwise use a shift instruction.  */
5596   switch (GET_MODE (operands[0]))
5597     {
5598     case SImode:
5599       return AS2 (sal%L0,%2,%0);
5600     case HImode:
5601       if (REG_P (operands[0]) && i386_cc_probably_useless_p (insn))
5602         {
5603           CC_STATUS_INIT;
5604           return AS2 (sal%L0,%2,%k0);
5605         }
5606       else
5607         return AS2 (sal%W0,%2,%0);
5608     case QImode:
5609       return AS2 (sal%B0,%2,%0);
5610     default:
5611       abort ();
5612     }
5613 }
5614
5615 /* Given the memory address ADDR, calculate the length of the address or
5616    the length of just the displacement (controlled by DISP_LENGTH).
5617   
5618    The length returned does not include the one-byte modrm, opcode,
5619    or prefix.  */
5620
5621 int
5622 memory_address_info (addr, disp_length)
5623      rtx addr;
5624      int disp_length;
5625 {
5626   rtx base, index, disp, scale;
5627   rtx op0, op1;
5628   int len;
5629
5630   if (GET_CODE (addr) == PRE_DEC
5631       || GET_CODE (addr) == POST_INC)
5632     return 0;
5633
5634   /* Register Indirect.  */
5635   if (register_operand (addr, Pmode))
5636     {
5637       /* Special cases: ebp and esp need the two-byte modrm form. 
5638
5639          We change [ESI] to [ESI+0] on the K6 when not optimizing
5640          for size.  */
5641       if (addr == stack_pointer_rtx
5642           || addr == arg_pointer_rtx
5643           || addr == frame_pointer_rtx
5644           || (REGNO_REG_CLASS (REGNO (addr)) == SIREG
5645               && ix86_cpu == PROCESSOR_K6 && !optimize_size))
5646         return 1;
5647       else
5648         return 0;
5649     }
5650
5651   /* Direct Addressing.  */
5652   if (CONSTANT_P (addr))
5653     return 4;
5654
5655   index = base = disp = scale = NULL_RTX;
5656   op0 = XEXP (addr, 0);
5657   op1 = XEXP (addr, 1);
5658
5659   if (GET_CODE (addr) == PLUS)
5660     {
5661       if (register_operand (op0, Pmode))
5662         {
5663           if (register_operand (op1, Pmode))
5664             index = op0, base = op1;
5665           else
5666             base = op0, disp = op1;
5667         }
5668       else if (GET_CODE (op0) == MULT)
5669         {
5670           index = XEXP (op0, 0);
5671           scale = XEXP (op0, 1);
5672           if (register_operand (op1, Pmode))
5673             base = op1;
5674           else
5675             disp = op1;
5676         }
5677       else if (GET_CODE (op0) == PLUS && GET_CODE (XEXP (op0, 0)) == MULT)
5678         {
5679           index = XEXP (XEXP (op0, 0), 0);
5680           scale = XEXP (XEXP (op0, 0), 1);
5681           base = XEXP (op0, 1);
5682           disp = op1;
5683         }
5684       else if (GET_CODE (op0) == PLUS)
5685         {
5686           index = XEXP (op0, 0);
5687           base = XEXP (op0, 1);
5688           disp = op1;
5689         }
5690       else
5691         abort ();
5692     }
5693   else if (GET_CODE (addr) == MULT
5694            /* We're called for lea too, which implements ashift on occasion.  */
5695            || GET_CODE (addr) == ASHIFT)
5696     {
5697       index = XEXP (addr, 0);
5698       scale = XEXP (addr, 1);
5699     }
5700   else
5701     abort ();
5702       
5703   /* Allow arg pointer and stack pointer as index if there is not scaling */
5704   if (base && index && !scale
5705       && (index == stack_pointer_rtx
5706           || index == arg_pointer_rtx
5707           || index == frame_pointer_rtx))
5708     {
5709       rtx tmp = base;
5710       base = index;
5711       index = tmp;
5712     }
5713
5714   /* Special case: ebp cannot be encoded as a base without a displacement.  */
5715   if (base == frame_pointer_rtx && !disp)
5716     disp = const0_rtx;
5717
5718   /* Scaling can not be encoded without base or displacement.  
5719      Except for scale == 1 where we can encode reg + reg instead of reg * 2.  */
5720   if (!base && index
5721       && (!scale || GET_CODE (scale) != CONST_INT || (INTVAL (scale) != 1)))
5722     disp = const0_rtx;
5723
5724   /* Find the length of the displacement constant.  */
5725   len = 0;
5726   if (disp)
5727     {
5728       if (GET_CODE (disp) == CONST_INT
5729           && CONST_OK_FOR_LETTER_P (INTVAL (disp), 'K'))
5730         len = 1;
5731       else
5732         len = 4;
5733     }
5734
5735   /* An index requires the two-byte modrm form.  Not important
5736      if we are computing just length of the displacement.  */
5737   if (index && ! disp_length)
5738     len += 1;
5739
5740   return len;
5741 }