OSDN Git Service

* cris.c (cris_target_asm_function_prologue,
[pf3gnuchains/gcc-fork.git] / gcc / config / cris / cris.c
1 /* Definitions for GCC.  Part of the machine description for CRIS.
2    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3    Contributed by Axis Communications.  Written by Hans-Peter Nilsson.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.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-attr.h"
33 #include "flags.h"
34 #include "tree.h"
35 #include "expr.h"
36 #include "except.h"
37 #include "function.h"
38 #include "toplev.h"
39 #include "recog.h"
40 #include "tm_p.h"
41 #include "debug.h"
42 #include "output.h"
43 #include "target.h"
44 #include "target-def.h"
45 #include "ggc.h"
46
47 /* Usable when we have an amount to add or subtract, and want the
48    optimal size of the insn.  */
49 #define ADDITIVE_SIZE_MODIFIER(size) \
50  ((size) <= 63 ? "q" : (size) <= 255 ? "u.b" : (size) <= 65535 ? "u.w" : ".d")
51
52 #define ASSERT_PLT_UNSPEC(x)                                    \
53   do                                                            \
54     {                                                           \
55       if (XEXP (x, 1) != NULL_RTX                               \
56           || (GET_CODE (XVECEXP (x, 0, 0)) != SYMBOL_REF        \
57               && GET_CODE (XVECEXP (x, 0, 0)) != LABEL_REF))    \
58         abort ();                                               \
59     } while (0)
60
61 #define LOSE_AND_RETURN(msgid, x)                       \
62   do                                            \
63     {                                           \
64       cris_operand_lossage (msgid, x);          \
65       return;                                   \
66     } while (0)
67
68 /* Per-function machine data.  */
69 struct machine_function GTY(())
70  {
71    int needs_return_address_on_stack;
72  };
73
74 /* This little fix suppresses the 'u' or 's' when '%e' in assembly
75    pattern.  */
76 static char cris_output_insn_is_bound = 0;
77
78 /* This one suppresses printing out the "rPIC+" in
79    "rPIC+sym:GOTOFF+offset" when doing PIC.  For a PLT symbol, it
80    suppresses outputting it as [rPIC+sym:GOTPLT] and outputs similarly
81    just the "sym:GOTOFF" part.  */
82 static int cris_pic_sympart_only = 0;
83
84 /* Fix for reg_overlap_mentioned_p.  */
85 static int cris_reg_overlap_mentioned_p PARAMS ((rtx, rtx));
86
87 static void cris_print_base PARAMS ((rtx, FILE *));
88
89 static void cris_print_index PARAMS ((rtx, FILE *));
90
91 static struct machine_function * cris_init_machine_status PARAMS ((void));
92
93 static int cris_initial_frame_pointer_offset PARAMS ((void));
94
95 static int saved_regs_mentioned PARAMS ((rtx));
96
97 static void cris_target_asm_function_prologue
98   PARAMS ((FILE *, HOST_WIDE_INT));
99
100 static void cris_target_asm_function_epilogue
101   PARAMS ((FILE *, HOST_WIDE_INT));
102
103 static void cris_operand_lossage PARAMS ((const char *, rtx));
104
105 static void cris_asm_output_mi_thunk
106   PARAMS ((FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT, tree));
107
108 static bool cris_rtx_costs PARAMS ((rtx, int, int, int *));
109 static int cris_address_cost PARAMS ((rtx));
110
111 /* The function cris_target_asm_function_epilogue puts the last insn to
112    output here.  It always fits; there won't be a symbol operand.  Used in
113    delay_slots_for_epilogue and function_epilogue.  */
114 static char save_last[80];
115
116 /* This is the argument from the "-max-stack-stackframe=" option.  */
117 const char *cris_max_stackframe_str;
118
119 /* This is the argument from the "-march=" option.  */
120 const char *cris_cpu_str;
121
122 /* This is the argument from the "-mtune=" option.  */
123 const char *cris_tune_str;
124
125 /* This is the argument from the "-melinux-stacksize=" option.  */
126 const char *cris_elinux_stacksize_str;
127
128 /* This is the parsed result of the "-max-stack-stackframe=" option.  If
129    it (still) is zero, then there was no such option given.  */
130 int cris_max_stackframe = 0;
131
132 /* This is the parsed result of the "-march=" option, if given.  */
133 int cris_cpu_version = CRIS_DEFAULT_CPU_VERSION;
134
135 #undef TARGET_ASM_ALIGNED_HI_OP
136 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
137 #undef TARGET_ASM_ALIGNED_SI_OP
138 #define TARGET_ASM_ALIGNED_SI_OP "\t.dword\t"
139 #undef TARGET_ASM_ALIGNED_DI_OP
140 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
141
142 /* We need to define these, since the 2byte, 4byte, 8byte op:s are only
143    available in ELF.  These "normal" pseudos do not have any alignment
144    constraints or side-effects.  */
145 #undef TARGET_ASM_UNALIGNED_HI_OP
146 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
147
148 #undef TARGET_ASM_UNALIGNED_SI_OP
149 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
150
151 #undef TARGET_ASM_UNALIGNED_DI_OP
152 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
153
154 #undef TARGET_ASM_FUNCTION_PROLOGUE
155 #define TARGET_ASM_FUNCTION_PROLOGUE cris_target_asm_function_prologue
156
157 #undef TARGET_ASM_FUNCTION_EPILOGUE
158 #define TARGET_ASM_FUNCTION_EPILOGUE cris_target_asm_function_epilogue
159
160 #undef TARGET_ASM_OUTPUT_MI_THUNK
161 #define TARGET_ASM_OUTPUT_MI_THUNK cris_asm_output_mi_thunk
162 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
163 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
164
165 #undef TARGET_RTX_COSTS
166 #define TARGET_RTX_COSTS cris_rtx_costs
167 #undef TARGET_ADDRESS_COST
168 #define TARGET_ADDRESS_COST cris_address_cost
169
170 struct gcc_target targetm = TARGET_INITIALIZER;
171
172 /* Predicate functions.  */
173
174 /* This checks a part of an address, the one that is not a plain register
175    for an addressing mode using BDAP.
176    Allowed operands is either:
177    a) a register
178    b) a CONST operand (but not a symbol when generating PIC)
179    c) a [r] or [r+] in SImode, or sign-extend from HI or QI.  */
180
181 int
182 cris_bdap_operand (op, mode)
183      rtx op;
184      enum machine_mode mode;
185 {
186   register enum rtx_code code = GET_CODE (op);
187
188   if (mode != SImode && (mode != VOIDmode || GET_MODE (op) != VOIDmode))
189     return 0;
190
191   /* Just return whether this is a simple register or constant.  */
192   if (register_operand (op, mode)
193       || (CONSTANT_P (op) && !(flag_pic && cris_symbol (op))))
194     return 1;
195
196   /* Is it a [r] or possibly a [r+]?  */
197   if (code == MEM)
198     {
199       rtx tem = XEXP (op, 0);
200
201       if (mode == SImode
202           && (register_operand (tem, SImode)
203               || (GET_CODE (tem) == POST_INC
204                   && register_operand (XEXP (tem, 0), SImode))))
205         return 1;
206       else
207         return 0;
208     }
209
210   /* Perhaps a sign-extended mem: [r].(b|w) or [r+].(b|w)?  */
211   if (code == SIGN_EXTEND)
212     {
213       rtx tem = XEXP (op, 0);
214
215       if (GET_CODE (tem) != MEM)
216         return 0;
217
218       tem = XEXP (tem, 0);
219       if (mode == SImode
220           && (register_operand (tem, SImode)
221               || (GET_CODE (tem) == POST_INC
222                   && register_operand (XEXP (tem, 0), SImode))))
223         return 1;
224       else
225         return 0;
226     }
227
228   return 0;
229 }
230
231 /* This is similar to cris_bdap_operand:
232    It checks a part of an address, the one that is not a plain register
233    for an addressing mode using BDAP *or* BIAP.
234    Allowed operands is either:
235    a) a register
236    b) a CONST operand (but not a symbol when generating PIC)
237    c) a mult of (1, 2 or 4) and a register
238    d) a [r] or [r+] in SImode, or sign-extend from HI or QI.  */
239
240 int
241 cris_bdap_biap_operand (op, mode)
242      rtx op;
243      enum machine_mode mode;
244 {
245   register enum rtx_code code = GET_CODE (op);
246   rtx reg;
247   rtx val;
248
249   /* Check for bdap operand.  */
250   if (cris_bdap_operand (op, mode))
251     return 1;
252
253   if (mode != SImode && (mode != VOIDmode || GET_MODE (op) != VOIDmode))
254     return 0;
255
256   /* Check that we're looking at a BIAP operand.  */
257   if (code != MULT)
258     return 0;
259
260   /* Canonicalize register and multiplicand.  */
261   if (GET_CODE (XEXP (op, 0)) == CONST_INT)
262     {
263       val = XEXP (op, 0);
264       reg = XEXP (op, 1);
265     }
266   else
267     {
268       val = XEXP (op, 1);
269       reg = XEXP (op, 0);
270     }
271
272   /* Check that the operands are correct after canonicalization.  */
273   if (! register_operand (reg, SImode) || GET_CODE (val) != CONST_INT)
274     return 0;
275
276   /* Check that the multiplicand has a valid value.  */
277   if ((code == MULT
278        && (INTVAL (val) == 1 || INTVAL (val) == 2 || INTVAL (val) == 4)))
279     return 1;
280
281   return 0;
282 }
283
284 /* Check if MODE is same as mode for X, and X is PLUS, MINUS, IOR or
285    AND or UMIN.  */
286
287 int
288 cris_orthogonal_operator (x, mode)
289      rtx x;
290      enum machine_mode mode;
291 {
292   enum rtx_code code = GET_CODE (x);
293
294   if (mode == VOIDmode)
295     mode = GET_MODE (x);
296
297   return (GET_MODE (x) == mode
298           && (code == PLUS || code == MINUS
299               || code == IOR || code == AND || code == UMIN));
300 }
301
302 /* Check if MODE is same as mode for X, and X is PLUS, IOR or AND or
303    UMIN.  */
304
305 int
306 cris_commutative_orth_op (x, mode)
307      rtx x;
308      enum machine_mode mode;
309 {
310   enum rtx_code code = GET_CODE (x);
311
312   if (mode == VOIDmode)
313     mode = GET_MODE (x);
314
315   return (GET_MODE (x) == mode &&
316           (code == PLUS
317            || code == IOR || code == AND || code == UMIN));
318 }
319
320 /* Check if MODE is same as mode for X, and X is PLUS or MINUS or UMIN.  */
321
322 int
323 cris_operand_extend_operator (x, mode)
324      rtx x;
325      enum machine_mode mode;
326 {
327   enum rtx_code code = GET_CODE (x);
328
329   if (mode == VOIDmode)
330     mode = GET_MODE (x);
331
332   return (GET_MODE (x) == mode
333           && (code == PLUS || code == MINUS || code == UMIN));
334 }
335
336 /* Check if MODE is same as mode for X, and X is PLUS or MINUS.  */
337
338 int
339 cris_additive_operand_extend_operator (x, mode)
340      rtx x;
341      enum machine_mode mode;
342 {
343   enum rtx_code code = GET_CODE (x);
344
345   if (mode == VOIDmode)
346     mode = GET_MODE (x);
347
348   return (GET_MODE (x) == mode
349           && (code == PLUS || code == MINUS));
350 }
351
352 /* Check to see if MODE is same as mode for X, and X is SIGN_EXTEND or
353    ZERO_EXTEND.  */
354
355 int
356 cris_extend_operator (x, mode)
357      rtx x;
358      enum machine_mode mode;
359 {
360   enum rtx_code code = GET_CODE (x);
361
362   if (mode == VOIDmode)
363     mode = GET_MODE (x);
364
365   return
366     (GET_MODE (x) == mode && (code == SIGN_EXTEND || code == ZERO_EXTEND));
367 }
368
369 /* Check to see if MODE is same as mode for X, and X is PLUS or BOUND.  */
370
371 int
372 cris_plus_or_bound_operator (x, mode)
373      rtx x;
374      enum machine_mode mode;
375 {
376   enum rtx_code code = GET_CODE (x);
377
378   if (mode == VOIDmode)
379     mode = GET_MODE (x);
380
381   return
382     (GET_MODE (x) == mode && (code == UMIN || code == PLUS));
383 }
384
385 /* Since with -fPIC, not all symbols are valid PIC symbols or indeed
386    general_operands, we have to have a predicate that matches it for the
387    "movsi" expander.  */
388
389 int
390 cris_general_operand_or_symbol (op, mode)
391      rtx op;
392      enum machine_mode mode;
393 {
394   return general_operand (op, mode)
395     || (CONSTANT_P (op) && cris_symbol (op));
396 }
397
398 /* Since a PIC symbol without a GOT entry is not a general_operand, we
399    have to have a predicate that matches it.  We use this in the expanded
400    "movsi" anonymous pattern for PIC symbols.  */
401
402 int
403 cris_general_operand_or_gotless_symbol (op, mode)
404      rtx op;
405      enum machine_mode mode;
406 {
407   return general_operand (op, mode)
408     || (CONSTANT_P (op) && cris_gotless_symbol (op));
409 }
410
411 /* Since a PLT symbol is not a general_operand, we have to have a
412    predicate that matches it when we need it.  We use this in the expanded
413    "call" and "call_value" anonymous patterns.  */
414
415 int
416 cris_general_operand_or_plt_symbol (op, mode)
417      rtx op;
418      enum machine_mode mode;
419 {
420   return general_operand (op, mode)
421     || (GET_CODE (op) == CONST
422         && GET_CODE (XEXP (op, 0)) == UNSPEC
423         && !TARGET_AVOID_GOTPLT);
424 }
425
426 /* This matches a (MEM (general_operand)) or
427    (MEM (cris_general_operand_or_symbol)).  The second one isn't a valid
428    memory_operand, so we need this predicate to recognize call
429    destinations before we change them to a PLT operand (by wrapping in
430    UNSPEC 0).  */
431
432 int
433 cris_mem_call_operand (op, mode)
434      rtx op;
435      enum machine_mode mode;
436 {
437   rtx xmem;
438
439   if (GET_CODE (op) != MEM)
440     return 0;
441
442   if (memory_operand (op, mode))
443     return 1;
444
445   xmem = XEXP (op, 0);
446
447   return cris_general_operand_or_symbol (xmem, GET_MODE (op));
448 }
449
450 /* The CONDITIONAL_REGISTER_USAGE worker.   */
451
452 void
453 cris_conditional_register_usage ()
454 {
455   /* FIXME: This isn't nice.  We should be able to use that register for
456      something else if the PIC table isn't needed.  */
457   if (flag_pic)
458     fixed_regs[PIC_OFFSET_TABLE_REGNUM]
459       = call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
460 }
461
462 /* Return current_function_uses_pic_offset_table.  For use in cris.md,
463    since some generated files do not include function.h.  */
464
465 int
466 cris_cfun_uses_pic_table ()
467 {
468   return current_function_uses_pic_offset_table;
469 }
470
471 /* Given an rtx, return the text string corresponding to the CODE of X.
472    Intended for use in the assembly language output section of a
473    define_insn.  */
474
475 const char *
476 cris_op_str (x)
477      rtx x;
478 {
479   cris_output_insn_is_bound = 0;
480   switch (GET_CODE (x))
481     {
482     case PLUS:
483       return "add";
484       break;
485
486     case MINUS:
487       return "sub";
488       break;
489
490     case MULT:
491       return "mul";
492       break;
493
494     case DIV:
495       return "div";
496       break;
497
498     case AND:
499       return "and";
500       break;
501
502     case IOR:
503       return "or";
504       break;
505
506     case XOR:
507       return "xor";
508       break;
509
510     case NOT:
511       return "not";
512       break;
513
514     case ASHIFT:
515       return "lsl";
516       break;
517
518     case LSHIFTRT:
519       return "lsr";
520       break;
521
522     case ASHIFTRT:
523       return "asr";
524       break;
525
526     case UMIN:
527       /* Used to control the sign/zero-extend character for the 'e' modifier.
528          BOUND has none.  */
529       cris_output_insn_is_bound = 1;
530       return "bound";
531       break;
532
533     default:
534       return "Unknown operator";
535       break;
536   }
537 }
538
539 /* Emit an error message when we're in an asm, and a fatal error for
540    "normal" insns.  Formatted output isn't easily implemented, since we
541    use output_operand_lossage to output the actual message and handle the
542    categorization of the error.  */
543
544 static void
545 cris_operand_lossage (msgid, op)
546      const char *msgid;
547      rtx op;
548 {
549   debug_rtx (op);
550   output_operand_lossage ("%s", msgid);
551 }
552
553 /* Print an index part of an address to file.  */
554
555 static void
556 cris_print_index (index, file)
557      rtx index;
558      FILE * file;
559 {
560   rtx inner = XEXP (index, 0);
561
562   /* Make the index "additive" unless we'll output a negative number, in
563      which case the sign character is free (as in free beer).  */
564   if (GET_CODE (index) != CONST_INT || INTVAL (index) >= 0)
565     putc ('+', file);
566
567   if (REG_P (index))
568     fprintf (file, "$%s.b", reg_names[REGNO (index)]);
569   else if (CONSTANT_P (index))
570     cris_output_addr_const (file, index);
571   else if (GET_CODE (index) == MULT)
572     {
573       fprintf (file, "$%s.",
574                reg_names[REGNO (XEXP (index, 0))]);
575
576       putc (INTVAL (XEXP (index, 1)) == 2 ? 'w' : 'd', file);
577     }
578   else if (GET_CODE (index) == SIGN_EXTEND &&
579            GET_CODE (inner) == MEM)
580     {
581       rtx inner_inner = XEXP (inner, 0);
582
583       if (GET_CODE (inner_inner) == POST_INC)
584         {
585           fprintf (file, "[$%s+].",
586                    reg_names[REGNO (XEXP (inner_inner, 0))]);
587           putc (GET_MODE (inner) == HImode ? 'w' : 'b', file);
588         }
589       else
590         {
591           fprintf (file, "[$%s].", reg_names[REGNO (inner_inner)]);
592
593           putc (GET_MODE (inner) == HImode ? 'w' : 'b', file);
594         }
595     }
596   else if (GET_CODE (index) == MEM)
597     {
598       if (GET_CODE (inner) == POST_INC)
599         fprintf (file, "[$%s+].d", reg_names[REGNO (XEXP (inner, 0))]);
600       else
601         fprintf (file, "[$%s].d", reg_names[REGNO (inner)]);
602     }
603   else
604     cris_operand_lossage ("unexpected index-type in cris_print_index",
605                           index);
606 }
607
608 /* Print a base rtx of an address to file.  */
609
610 static void
611 cris_print_base (base, file)
612      rtx base;
613      FILE *file;
614 {
615   if (REG_P (base))
616     fprintf (file, "$%s", reg_names[REGNO (base)]);
617   else if (GET_CODE (base) == POST_INC)
618     fprintf (file, "$%s+", reg_names[REGNO (XEXP (base, 0))]);
619   else
620     cris_operand_lossage ("unexpected base-type in cris_print_base",
621                           base);
622 }
623
624 /* Usable as a guard in expressions.  */
625
626 int
627 cris_fatal (arg)
628      char *arg;
629 {
630   internal_error (arg);
631
632   /* We'll never get here; this is just to appease compilers.  */
633   return 0;
634 }
635
636 /* Textual function prologue.  */
637
638 static void
639 cris_target_asm_function_prologue (file, size)
640      FILE *file;
641      HOST_WIDE_INT size;
642 {
643   int regno;
644
645   /* Shorten the used name for readability.  */
646   int cfoa_size = current_function_outgoing_args_size;
647   int last_movem_reg = -1;
648   int doing_dwarf = dwarf2out_do_frame ();
649   int framesize;
650   int faked_args_size = 0;
651   int cfa_write_offset = 0;
652   char *cfa_label = NULL;
653   int return_address_on_stack
654     = regs_ever_live[CRIS_SRP_REGNUM]
655     || cfun->machine->needs_return_address_on_stack != 0;
656
657   /* Don't do anything if no prologues or epilogues are wanted.  */
658   if (!TARGET_PROLOGUE_EPILOGUE)
659     return;
660
661   if (size < 0)
662     abort ();
663
664   /* Align the size to what's best for the CPU model.  */
665   if (TARGET_STACK_ALIGN)
666     size = TARGET_ALIGN_BY_32 ? (size + 3) & ~3 : (size + 1) & ~1;
667
668   if (current_function_pretend_args_size)
669     {
670       int pretend = current_function_pretend_args_size;
671       for (regno = CRIS_FIRST_ARG_REG + CRIS_MAX_ARGS_IN_REGS - 1;
672            pretend > 0;
673            regno--, pretend -= 4)
674         {
675           fprintf (file, "\tpush $%s\n", reg_names[regno]);
676           faked_args_size += 4;
677         }
678     }
679
680   framesize = faked_args_size;
681
682   if (doing_dwarf)
683     {
684       /* FIXME: Slightly redundant calculation, as we do the same in
685          pieces below.  This offset must be the total adjustment of the
686          stack-pointer.  We can then def_cfa call at the end of this
687          function with the current implementation of execute_cfa_insn, but
688          that wouldn't really be clean.  */
689
690       int cfa_offset
691         = faked_args_size
692         + (return_address_on_stack ? 4 : 0)
693         + (frame_pointer_needed ? 4 : 0);
694
695       int cfa_reg;
696
697       if (frame_pointer_needed)
698         cfa_reg = FRAME_POINTER_REGNUM;
699       else
700         {
701           cfa_reg = STACK_POINTER_REGNUM;
702           cfa_offset += cris_initial_frame_pointer_offset ();
703         }
704
705       cfa_label = dwarf2out_cfi_label ();
706       dwarf2out_def_cfa (cfa_label, cfa_reg, cfa_offset);
707
708       cfa_write_offset = - faked_args_size - 4;
709     }
710
711   /* Save SRP if not a leaf function.  */
712   if (return_address_on_stack)
713     {
714       fprintf (file, "\tPush $srp\n");
715       framesize += 4;
716
717       if (doing_dwarf)
718         {
719           dwarf2out_return_save (cfa_label, cfa_write_offset);
720           cfa_write_offset -= 4;
721         }
722     }
723
724   /* Set up frame pointer if needed.  */
725   if (frame_pointer_needed)
726     {
727       fprintf (file, "\tpush $%s\n\tmove.d $sp,$%s\n",
728                reg_names[FRAME_POINTER_REGNUM],
729                reg_names[FRAME_POINTER_REGNUM]);
730       framesize += 4;
731
732       if (doing_dwarf)
733         {
734           dwarf2out_reg_save (cfa_label, FRAME_POINTER_REGNUM,
735                               cfa_write_offset);
736           cfa_write_offset -= 4;
737         }
738     }
739
740   /* Local vars are located above saved regs.  */
741   cfa_write_offset -= size;
742
743   /* Get a contiguous sequence of registers, starting with r0, that need
744      to be saved.  */
745   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
746     {
747       if ((((regs_ever_live[regno]
748              && !call_used_regs[regno])
749             || (regno == (int) PIC_OFFSET_TABLE_REGNUM
750                 && (current_function_uses_pic_offset_table
751                     /* It is saved anyway, if there would be a gap.  */
752                     || (flag_pic
753                         && regs_ever_live[regno + 1]
754                         && !call_used_regs[regno + 1]))))
755            && (regno != FRAME_POINTER_REGNUM || !frame_pointer_needed)
756            && regno != CRIS_SRP_REGNUM)
757           || (current_function_calls_eh_return
758               && (regno == EH_RETURN_DATA_REGNO (0)
759                   || regno == EH_RETURN_DATA_REGNO (1)
760                   || regno == EH_RETURN_DATA_REGNO (2)
761                   || regno == EH_RETURN_DATA_REGNO (3))))
762         {
763           /* Check if movem may be used for registers so far.  */
764           if (regno == last_movem_reg + 1)
765             /* Yes, update next expected register.  */
766             last_movem_reg++;
767           else
768             {
769               /* We cannot use movem for all registers.  We have to flush
770                  any movem:ed registers we got so far.  */
771               if (last_movem_reg != -1)
772                 {
773                   /* It is a win to use a side-effect assignment for
774                      64 <= size <= 128.  But side-effect on movem was
775                      not usable for CRIS v0..3.  Also only do it if
776                      side-effects insns are allowed.  */
777                   if ((last_movem_reg + 1) * 4 + size >= 64
778                       && (last_movem_reg + 1) * 4 + size <= 128
779                       && cris_cpu_version >= CRIS_CPU_SVINTO
780                       && TARGET_SIDE_EFFECT_PREFIXES)
781                     fprintf (file, "\tmovem $%s,[$sp=$sp-"HOST_WIDE_INT_PRINT_DEC"]\n",
782                              reg_names[last_movem_reg],
783                              (last_movem_reg + 1) * 4 + size);
784                   else
785                     {
786                       /* Avoid printing multiple subsequent sub:s for sp.  */
787                       fprintf (file, "\tsub%s "HOST_WIDE_INT_PRINT_DEC",$sp\n",
788                                ADDITIVE_SIZE_MODIFIER ((last_movem_reg + 1)
789                                                        * 4 + size),
790                                (last_movem_reg + 1) * 4 + size);
791
792                       fprintf (file, "\tmovem $%s,[$sp]\n",
793                                reg_names[last_movem_reg]);
794                     }
795
796                   framesize += (last_movem_reg + 1) * 4 + size;
797
798                   if (TARGET_PDEBUG)
799                     fprintf (file, "; frame "HOST_WIDE_INT_PRINT_DEC
800                              ", #regs %d, bytes %d args %d\n",
801                              size,
802                              last_movem_reg + 1,
803                              (last_movem_reg + 1) * 4,
804                              current_function_args_size);
805
806                   last_movem_reg = -1;
807                   size = 0;
808                 }
809               else if (size > 0)
810                 {
811                   /* Local vars on stack, but there are no movem:s.
812                      Just allocate space.  */
813                   fprintf (file, "\tSub%s "HOST_WIDE_INT_PRINT_DEC",$sp\n",
814                            ADDITIVE_SIZE_MODIFIER (size),
815                            size);
816                   framesize += size;
817                   size = 0;
818                 }
819
820               fprintf (file, "\tPush $%s\n", reg_names[regno]);
821               framesize += 4;
822             }
823
824           if (doing_dwarf)
825             {
826               /* Registers are stored lowest numbered at highest address,
827                  which matches the loop order; we just need to update the
828                  write-offset.  */
829               dwarf2out_reg_save (cfa_label, regno, cfa_write_offset);
830               cfa_write_offset -= 4;
831             }
832         }
833     }
834
835   /* Check after, if we can movem all registers.  This is the normal
836      case.  */
837   if (last_movem_reg != -1)
838     {
839       /* Side-effect assignment on movem was not supported for CRIS v0..3,
840          and don't do it if we're asked not to.
841
842          The movem is already accounted for, for unwind.  */
843
844       if ((last_movem_reg + 1) * 4 + size >= 64
845           && (last_movem_reg + 1) * 4 + size <= 128
846           && cris_cpu_version >= CRIS_CPU_SVINTO
847           && TARGET_SIDE_EFFECT_PREFIXES)
848         fprintf (file, "\tmovem $%s,[$sp=$sp-"HOST_WIDE_INT_PRINT_DEC"]\n",
849                  reg_names[last_movem_reg],
850                  (last_movem_reg+1) * 4 + size);
851       else
852         {
853           /* Avoid printing multiple subsequent sub:s for sp.  FIXME:
854              Clean up the conditional expression.  */
855           fprintf (file, "\tsub%s "HOST_WIDE_INT_PRINT_DEC",$sp\n",
856                    ADDITIVE_SIZE_MODIFIER ((last_movem_reg + 1) * 4 + size),
857                    (last_movem_reg + 1) * 4 + size);
858           /* To be compatible with v0..v3 means we do not use an assignment
859              addressing mode with movem.  We normally don't need that
860              anyway.  It would only be slightly more efficient for 64..128
861              bytes frame size.  */
862           fprintf (file, "\tmovem $%s,[$sp]\n", reg_names[last_movem_reg]);
863         }
864
865       framesize += (last_movem_reg + 1) * 4 + size;
866
867       if (TARGET_PDEBUG)
868         fprintf (file, "; frame "HOST_WIDE_INT_PRINT_DEC
869                  ", #regs %d, bytes %d args %d\n",
870                  size,
871                  last_movem_reg + 1,
872                  (last_movem_reg + 1) * 4,
873                  current_function_args_size);
874
875       /* We have to put outgoing argument space after regs.  */
876       if (cfoa_size)
877         {
878           /* This does not need to be accounted for, for unwind.  */
879
880           fprintf (file, "\tSub%s %d,$sp\n",
881                    ADDITIVE_SIZE_MODIFIER (cfoa_size),
882                    cfoa_size);
883           framesize += cfoa_size;
884         }
885     }
886   else if ((size + cfoa_size) > 0)
887     {
888       /* This does not need to be accounted for, for unwind.  */
889
890       /* Local vars on stack, and we could not use movem.  Add a sub here.  */
891       fprintf (file, "\tSub%s "HOST_WIDE_INT_PRINT_DEC",$sp\n",
892                ADDITIVE_SIZE_MODIFIER (size + cfoa_size),
893                cfoa_size + size);
894       framesize += size + cfoa_size;
895     }
896
897   /* Set up the PIC register.  */
898   if (current_function_uses_pic_offset_table)
899     fprintf (file, "\tmove.d $pc,$%s\n\tsub.d .:GOTOFF,$%s\n",
900              reg_names[PIC_OFFSET_TABLE_REGNUM],
901              reg_names[PIC_OFFSET_TABLE_REGNUM]);
902
903   if (TARGET_PDEBUG)
904     fprintf (file,
905              "; parm #%d @ %d; frame " HOST_WIDE_INT_PRINT_DEC
906              ", FP-SP is %d; leaf: %s%s; fp %s, outg: %d arg %d\n",
907              CRIS_MAX_ARGS_IN_REGS + 1, FIRST_PARM_OFFSET (0),
908              get_frame_size (),
909              cris_initial_frame_pointer_offset (),
910              leaf_function_p () ? "yes" : "no",
911              return_address_on_stack ? "no" :"yes",
912              frame_pointer_needed ? "yes" : "no",
913              cfoa_size, current_function_args_size);
914
915   if (cris_max_stackframe && framesize > cris_max_stackframe)
916     warning ("stackframe too big: %d bytes", framesize);
917 }
918
919 /* Return nonzero if there are regs mentioned in the insn that are not all
920    in the call_used regs.  This is part of the decision whether an insn
921    can be put in the epilogue.  */
922
923 static int
924 saved_regs_mentioned (x)
925      rtx x;
926 {
927   int i;
928   const char *fmt;
929   RTX_CODE code;
930
931   /* Mainly stolen from refers_to_regno_p in rtlanal.c.  */
932
933   code = GET_CODE (x);
934
935   switch (code)
936     {
937     case REG:
938       i = REGNO (x);
939       return !call_used_regs[i];
940
941     case SUBREG:
942       /* If this is a SUBREG of a hard reg, we can see exactly which
943          registers are being modified.  Otherwise, handle normally.  */
944       i = REGNO (SUBREG_REG (x));
945       return !call_used_regs[i];
946
947     default:
948       ;
949     }
950
951   fmt = GET_RTX_FORMAT (code);
952   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
953     {
954       if (fmt[i] == 'e')
955         {
956           if (saved_regs_mentioned (XEXP (x, i)))
957             return 1;
958         }
959       else if (fmt[i] == 'E')
960         {
961           int j;
962           for (j = XVECLEN (x, i) - 1; j >=0; j--)
963             if (saved_regs_mentioned (XEXP (x, i)))
964               return 1;
965         }
966     }
967
968   return 0;
969 }
970
971 /* Figure out if the insn may be put in the epilogue.  */
972
973 int
974 cris_eligible_for_epilogue_delay (insn)
975      rtx insn;
976 {
977   /* First of all, it must be as slottable as for a delayed branch insn.  */
978   if (get_attr_slottable (insn) != SLOTTABLE_YES)
979     return 0;
980
981   /* It must not refer to the stack pointer (may be valid for some cases
982      that I can't think of).  */
983   if (reg_mentioned_p (stack_pointer_rtx, PATTERN (insn)))
984     return 0;
985
986   /* The frame pointer will be restored in the epilogue, before the
987      "ret", so it can't be referred to.  */
988   if (frame_pointer_needed
989       && reg_mentioned_p (frame_pointer_rtx, PATTERN (insn)))
990     return 0;
991
992   /* All saved regs are restored before the delayed insn.
993      This means that we cannot have any instructions that mention the
994      registers that are restored by the epilogue.  */
995   if (saved_regs_mentioned (PATTERN (insn)))
996     return 0;
997
998   /* It seems to be ok.  */
999   return 1;
1000 }
1001
1002 /* Return the number of delay-slots in the epilogue: return 1 if it
1003    contains "ret", else 0.  */
1004
1005 int
1006 cris_delay_slots_for_epilogue ()
1007 {
1008   /* Check if we use a return insn, which we only do for leaf functions.
1009      Else there is no slot to fill.  */
1010   if (regs_ever_live[CRIS_SRP_REGNUM]
1011       || cfun->machine->needs_return_address_on_stack != 0)
1012     return 0;
1013
1014   /* By calling function_epilogue with the same parameters as from gcc
1015      we can get info about if the epilogue can fill the delay-slot by itself.
1016      If it is filled from the epilogue, then the corresponding string
1017      is in save_last.
1018       This depends on that the "size" argument to function_epilogue
1019      always is get_frame_size.
1020      FIXME:  Kludgy.  At least make it a separate function that is not
1021      misnamed or abuses the stream parameter.  */
1022   cris_target_asm_function_epilogue (NULL, get_frame_size ());
1023
1024   if (*save_last)
1025     return 1;
1026   return 0;
1027 }
1028
1029 /* Textual function epilogue.  When file is NULL, it serves doubly as
1030    a test for whether the epilogue can fill any "ret" delay-slots by
1031    itself by storing the delay insn in save_last.  */
1032
1033 static void
1034 cris_target_asm_function_epilogue (file, size)
1035      FILE *file;
1036      HOST_WIDE_INT size;
1037 {
1038   int regno;
1039   int last_movem_reg = -1;
1040   rtx insn = get_last_insn ();
1041   int argspace_offset = current_function_outgoing_args_size;
1042   int pretend =  current_function_pretend_args_size;
1043   int return_address_on_stack
1044     = regs_ever_live[CRIS_SRP_REGNUM]
1045     || cfun->machine->needs_return_address_on_stack != 0;
1046
1047   save_last[0] = 0;
1048
1049   if (file && !TARGET_PROLOGUE_EPILOGUE)
1050     return;
1051
1052   if (TARGET_PDEBUG && file)
1053     fprintf (file, ";;\n");
1054
1055   /* Align byte count of stack frame.  */
1056   if (TARGET_STACK_ALIGN)
1057     size = TARGET_ALIGN_BY_32 ? (size + 3) & ~3 : (size + 1) & ~1;
1058
1059   /* If the last insn was a BARRIER, we don't have to write any code,
1060      then all returns were covered by "return" insns.  */
1061   if (GET_CODE (insn) == NOTE)
1062     insn = prev_nonnote_insn (insn);
1063   if (insn
1064       && (GET_CODE (insn) == BARRIER
1065           /* We must make sure that the insn really is a "return" and
1066              not a conditional branch.  Try to match the return exactly,
1067              and if it doesn't match, assume it is a conditional branch
1068              (and output an epilogue).  */
1069           || (GET_CODE (insn) == JUMP_INSN
1070               && GET_CODE (PATTERN (insn)) == RETURN)))
1071     {
1072       if (TARGET_PDEBUG && file)
1073         fprintf (file, ";;;;;\n");
1074       return;
1075     }
1076
1077   /* Check how many saved regs we can movem.  They start at r0 and must
1078      be contiguous.  */
1079   for (regno = 0;
1080        regno < FIRST_PSEUDO_REGISTER;
1081        regno++)
1082     if ((((regs_ever_live[regno]
1083            && !call_used_regs[regno])
1084           || (regno == (int) PIC_OFFSET_TABLE_REGNUM
1085               && (current_function_uses_pic_offset_table
1086                   /* It is saved anyway, if there would be a gap.  */
1087                   || (flag_pic
1088                       && regs_ever_live[regno + 1]
1089                       && !call_used_regs[regno + 1]))))
1090          && (regno != FRAME_POINTER_REGNUM || !frame_pointer_needed)
1091          && regno != CRIS_SRP_REGNUM)
1092         || (current_function_calls_eh_return
1093             && (regno == EH_RETURN_DATA_REGNO (0)
1094                 || regno == EH_RETURN_DATA_REGNO (1)
1095                 || regno == EH_RETURN_DATA_REGNO (2)
1096                 || regno == EH_RETURN_DATA_REGNO (3))))
1097
1098       {
1099         if (regno == last_movem_reg + 1)
1100           last_movem_reg++;
1101         else
1102           break;
1103       }
1104
1105   for (regno = FIRST_PSEUDO_REGISTER - 1;
1106        regno > last_movem_reg;
1107        regno--)
1108     if ((((regs_ever_live[regno]
1109            && !call_used_regs[regno])
1110           || (regno == (int) PIC_OFFSET_TABLE_REGNUM
1111               && (current_function_uses_pic_offset_table
1112                   /* It is saved anyway, if there would be a gap.  */
1113                   || (flag_pic
1114                       && regs_ever_live[regno + 1]
1115                       && !call_used_regs[regno + 1]))))
1116          && (regno != FRAME_POINTER_REGNUM || !frame_pointer_needed)
1117          && regno != CRIS_SRP_REGNUM)
1118         || (current_function_calls_eh_return
1119             && (regno == EH_RETURN_DATA_REGNO (0)
1120                 || regno == EH_RETURN_DATA_REGNO (1)
1121                 || regno == EH_RETURN_DATA_REGNO (2)
1122                 || regno == EH_RETURN_DATA_REGNO (3))))
1123       {
1124         if (argspace_offset)
1125           {
1126             /* There is an area for outgoing parameters located before
1127                the saved registers.  We have to adjust for that.  */
1128             if (file)
1129               fprintf (file, "\tAdd%s %d,$sp\n",
1130                        ADDITIVE_SIZE_MODIFIER (argspace_offset),
1131                        argspace_offset);
1132
1133             /* Make sure we only do this once.  */
1134             argspace_offset = 0;
1135           }
1136
1137         /* Flush previous non-movem:ed registers.  */
1138         if (*save_last && file)
1139           fprintf (file, save_last);
1140         sprintf (save_last, "\tPop $%s\n", reg_names[regno]);
1141       }
1142
1143   if (last_movem_reg != -1)
1144     {
1145       if (argspace_offset)
1146         {
1147           /* Adjust for the outgoing parameters area, if that's not
1148              handled yet.  */
1149           if (*save_last && file)
1150             {
1151               fprintf (file, save_last);
1152               *save_last = 0;
1153             }
1154
1155           if (file)
1156             fprintf (file, "\tAdd%s %d,$sp\n",
1157                      ADDITIVE_SIZE_MODIFIER (argspace_offset),
1158                      argspace_offset);
1159           argspace_offset = 0;
1160         }
1161       /* Flush previous non-movem:ed registers.  */
1162       else if (*save_last && file)
1163         fprintf (file, save_last);
1164       sprintf (save_last, "\tmovem [$sp+],$%s\n", reg_names[last_movem_reg]);
1165     }
1166
1167   /* Restore frame pointer if necessary.  */
1168   if (frame_pointer_needed)
1169     {
1170       if (*save_last && file)
1171         fprintf (file, save_last);
1172
1173       if (file)
1174         fprintf (file, "\tmove.d $%s,$sp\n",
1175                  reg_names[FRAME_POINTER_REGNUM]);
1176       sprintf (save_last, "\tPop $%s\n",
1177                reg_names[FRAME_POINTER_REGNUM]);
1178     }
1179   else
1180     {
1181       /* If there was no frame-pointer to restore sp from, we must
1182          explicitly deallocate local variables.  */
1183
1184       /* Handle space for outgoing parameters that hasn't been handled
1185          yet.  */
1186       size += argspace_offset;
1187
1188       if (size)
1189         {
1190           if (*save_last && file)
1191             fprintf (file, save_last);
1192
1193           sprintf (save_last, "\tadd%s "HOST_WIDE_INT_PRINT_DEC",$sp\n",
1194                    ADDITIVE_SIZE_MODIFIER (size), size);
1195         }
1196
1197       /* If the size was not in the range for a "quick", we must flush
1198          it here.  */
1199       if (size > 63)
1200         {
1201           if (file)
1202             fprintf (file, save_last);
1203           *save_last = 0;
1204         }
1205     }
1206
1207   /* If this function has no pushed register parameters
1208      (stdargs/varargs), and if it is not a leaf function, then we can
1209      just jump-return here.  */
1210   if (return_address_on_stack && pretend == 0)
1211     {
1212       if (*save_last && file)
1213         fprintf (file, save_last);
1214       *save_last = 0;
1215
1216       if (file)
1217         {
1218           if (current_function_calls_eh_return)
1219             {
1220               /* The installed EH-return address is in *this* frame, so we
1221                  need to pop it before we return.  */
1222               fprintf (file, "\tpop $srp\n");
1223               fprintf (file, "\tret\n");
1224               fprintf (file, "\tadd.d $%s,$sp\n", reg_names[CRIS_STACKADJ_REG]);
1225             }
1226           else
1227             fprintf (file, "\tJump [$sp+]\n");
1228
1229           /* Do a sanity check to avoid generating invalid code.  */
1230           if (current_function_epilogue_delay_list)
1231             internal_error ("allocated but unused delay list in epilogue");
1232         }
1233       return;
1234     }
1235
1236   /* Rather than add current_function_calls_eh_return conditions
1237      everywhere in the following code (and not be able to test it
1238      thoroughly), assert the assumption that all usage of
1239      __builtin_eh_return are handled above.  */
1240   if (current_function_calls_eh_return)
1241     internal_error ("unexpected function type needing stack adjustment for\
1242  __builtin_eh_return");
1243
1244   /* If we pushed some register parameters, then adjust the stack for
1245      them.  */
1246   if (pretend)
1247     {
1248       /* Since srp is stored on the way, we need to restore it first.  */
1249       if (return_address_on_stack)
1250         {
1251           if (*save_last && file)
1252             fprintf (file, save_last);
1253           *save_last = 0;
1254
1255           if (file)
1256             fprintf (file, "\tpop $srp\n");
1257         }
1258
1259       if (*save_last && file)
1260         fprintf (file, save_last);
1261
1262       sprintf (save_last, "\tadd%s %d,$sp\n",
1263                ADDITIVE_SIZE_MODIFIER (pretend), pretend);
1264     }
1265
1266   /* Here's where we have a delay-slot we need to fill.  */
1267   if (file && current_function_epilogue_delay_list)
1268     {
1269       /* If gcc has allocated an insn for the epilogue delay slot, but
1270          things were arranged so we now thought we could do it
1271          ourselves, don't forget to flush that insn.  */
1272       if (*save_last)
1273         fprintf (file, save_last);
1274
1275       fprintf (file, "\tRet\n");
1276
1277       /* Output the delay-slot-insn the mandated way.  */
1278       final_scan_insn (XEXP (current_function_epilogue_delay_list, 0),
1279                        file, 1, -2, 1);
1280     }
1281   else if (file)
1282     {
1283       fprintf (file, "\tRet\n");
1284
1285       /* If the GCC did not do it, we have to use whatever insn we have,
1286          or a nop.  */
1287       if (*save_last)
1288         fprintf (file, save_last);
1289       else
1290         fprintf (file, "\tnOp\n");
1291     }
1292 }
1293
1294 /* The PRINT_OPERAND worker.  */
1295
1296 void
1297 cris_print_operand (file, x, code)
1298      FILE *file;
1299      rtx x;
1300      int code;
1301 {
1302   rtx operand = x;
1303
1304   /* Size-strings corresponding to MULT expressions.  */
1305   static const char *const mults[] = { "BAD:0", ".b", ".w", "BAD:3", ".d" };
1306
1307   /* New code entries should just be added to the switch below.  If
1308      handling is finished, just return.  If handling was just a
1309      modification of the operand, the modified operand should be put in
1310      "operand", and then do a break to let default handling
1311      (zero-modifier) output the operand.  */
1312
1313   switch (code)
1314     {
1315     case 'b':
1316       /* Print the unsigned supplied integer as if it was signed
1317          and < 0, i.e print 255 or 65535 as -1, 254, 65534 as -2, etc.  */
1318       if (GET_CODE (x) != CONST_INT
1319           || ! CONST_OK_FOR_LETTER_P (INTVAL (x), 'O'))
1320         LOSE_AND_RETURN ("invalid operand for 'b' modifier", x);
1321       fprintf (file, HOST_WIDE_INT_PRINT_DEC,
1322                INTVAL (x)| (INTVAL (x) <= 255 ? ~255 : ~65535));
1323       return;
1324
1325     case 'x':
1326       /* Print assembler code for operator.  */
1327       fprintf (file, "%s", cris_op_str (operand));
1328       return;
1329
1330     case 'v':
1331       /* Print the operand without the PIC register.  */
1332       if (! flag_pic || ! CONSTANT_P (x) || ! cris_gotless_symbol (x))
1333         LOSE_AND_RETURN ("invalid operand for 'v' modifier", x);
1334       cris_pic_sympart_only++;
1335       cris_output_addr_const (file, x);
1336       cris_pic_sympart_only--;
1337       return;
1338
1339     case 'P':
1340       /* Print the PIC register.  Applied to a GOT-less PIC symbol for
1341          sanity.  */
1342       if (! flag_pic || ! CONSTANT_P (x) || ! cris_gotless_symbol (x))
1343         LOSE_AND_RETURN ("invalid operand for 'P' modifier", x);
1344       fprintf (file, "$%s", reg_names [PIC_OFFSET_TABLE_REGNUM]);
1345       return;
1346
1347     case 'p':
1348       /* Adjust a power of two to its log2.  */
1349       if (GET_CODE (x) != CONST_INT || exact_log2 (INTVAL (x)) < 0 )
1350         LOSE_AND_RETURN ("invalid operand for 'p' modifier", x);
1351       fprintf (file, "%d", exact_log2 (INTVAL (x)));
1352       return;
1353
1354     case 's':
1355       /* For an integer, print 'b' or 'w' if <= 255 or <= 65535
1356          respectively.  This modifier also terminates the inhibiting
1357          effects of the 'x' modifier.  */
1358       cris_output_insn_is_bound = 0;
1359       if (GET_MODE (x) == VOIDmode && GET_CODE (x) == CONST_INT)
1360         {
1361           if (INTVAL (x) >= 0)
1362             {
1363               if (INTVAL (x) <= 255)
1364                 putc ('b', file);
1365               else if (INTVAL (x) <= 65535)
1366                 putc ('w', file);
1367               else
1368                 putc ('d', file);
1369             }
1370           else
1371             putc ('d', file);
1372           return;
1373         }
1374
1375       /* For a non-integer, print the size of the operand.  */
1376       putc ((GET_MODE (x) == SImode || GET_MODE (x) == SFmode)
1377             ? 'd' : GET_MODE (x) == HImode ? 'w'
1378             : GET_MODE (x) == QImode ? 'b'
1379             /* If none of the above, emit an erroneous size letter.  */
1380             : 'X',
1381             file);
1382       return;
1383
1384     case 'z':
1385       /* Const_int: print b for -127 <= x <= 255,
1386          w for -32768 <= x <= 65535, else abort.  */
1387       if (GET_CODE (x) != CONST_INT
1388           || INTVAL (x) < -32768 || INTVAL (x) > 65535)
1389         LOSE_AND_RETURN ("invalid operand for 'z' modifier", x);
1390       putc (INTVAL (x) >= -128 && INTVAL (x) <= 255 ? 'b' : 'w', file);
1391       return;
1392
1393     case '#':
1394       /* Output a 'nop' if there's nothing for the delay slot.
1395          This method stolen from the sparc files.  */
1396       if (dbr_sequence_length () == 0)
1397         fputs ("\n\tnop", file);
1398       return;
1399
1400     case 'H':
1401       /* Print high (most significant) part of something.  */
1402       switch (GET_CODE (operand))
1403         {
1404         case CONST_INT:
1405           if (HOST_BITS_PER_WIDE_INT == 32)
1406             /* Sign-extension from a normal int to a long long.  */
1407             fprintf (file, INTVAL (operand) < 0 ? "-1" : "0");
1408           else
1409             fprintf (file, "0x%x", (unsigned int)(INTVAL (x) >> 31 >> 1));
1410           return;
1411
1412         case CONST_DOUBLE:
1413           /* High part of a long long constant.  */
1414           if (GET_MODE (operand) == VOIDmode)
1415             {
1416               fprintf (file, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_HIGH (x));
1417               return;
1418             }
1419           else
1420             LOSE_AND_RETURN ("invalid operand for 'H' modifier", x);
1421
1422         case REG:
1423           /* Print reg + 1.  Check that there's not an attempt to print
1424              high-parts of registers like stack-pointer or higher.  */
1425           if (REGNO (operand) > STACK_POINTER_REGNUM - 2)
1426             LOSE_AND_RETURN ("bad register", operand);
1427           fprintf (file, "$%s", reg_names[REGNO (operand) + 1]);
1428           return;
1429
1430         case MEM:
1431           /* Adjust memory address to high part.  */
1432           {
1433             rtx adj_mem = operand;
1434             int size
1435               = GET_MODE_BITSIZE (GET_MODE (operand)) / BITS_PER_UNIT;
1436
1437             /* Adjust so we can use two SImode in DImode.
1438                Calling adj_offsettable_operand will make sure it is an
1439                offsettable address.  Don't do this for a postincrement
1440                though; it should remain as it was.  */
1441             if (GET_CODE (XEXP (adj_mem, 0)) != POST_INC)
1442               adj_mem
1443                 = adjust_address (adj_mem, GET_MODE (adj_mem), size / 2);
1444
1445             output_address (XEXP (adj_mem, 0));
1446             return;
1447           }
1448
1449         default:
1450           LOSE_AND_RETURN ("invalid operand for 'H' modifier", x);
1451         }
1452
1453     case 'L':
1454       /* Strip the MEM expression.  */
1455       operand = XEXP (operand, 0);
1456       break;
1457
1458     case 'e':
1459       /* Print 's' if operand is SIGN_EXTEND or 'u' if ZERO_EXTEND unless
1460          cris_output_insn_is_bound is nonzero.  */
1461       if (GET_CODE (operand) != SIGN_EXTEND
1462           && GET_CODE (operand) != ZERO_EXTEND
1463           && GET_CODE (operand) != CONST_INT)
1464         LOSE_AND_RETURN ("invalid operand for 'e' modifier", x);
1465
1466       if (cris_output_insn_is_bound)
1467         {
1468           cris_output_insn_is_bound = 0;
1469           return;
1470         }
1471
1472       putc (GET_CODE (operand) == SIGN_EXTEND
1473             || (GET_CODE (operand) == CONST_INT && INTVAL (operand) < 0)
1474             ? 's' : 'u', file);
1475       return;
1476
1477     case 'm':
1478       /* Print the size letter of the inner element.  We can do it by
1479          calling ourselves with the 's' modifier.  */
1480       if (GET_CODE (operand) != SIGN_EXTEND && GET_CODE (operand) != ZERO_EXTEND)
1481         LOSE_AND_RETURN ("invalid operand for 'm' modifier", x);
1482       cris_print_operand (file, XEXP (operand, 0), 's');
1483       return;
1484
1485     case 'M':
1486       /* Print the least significant part of operand.  */
1487       if (GET_CODE (operand) == CONST_DOUBLE)
1488         {
1489           fprintf (file, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_LOW (x));
1490           return;
1491         }
1492       else if (HOST_BITS_PER_WIDE_INT > 32 && GET_CODE (operand) == CONST_INT)
1493         {
1494           fprintf (file, HOST_WIDE_INT_PRINT_HEX,
1495                    INTVAL (x) & ((unsigned int) 0x7fffffff * 2 + 1));
1496           return;
1497         }
1498       /* Otherwise the least significant part equals the normal part,
1499          so handle it normally.  */
1500       break;
1501
1502     case 'A':
1503       /* When emitting an add for the high part of a DImode constant, we
1504          want to use addq for 0 and adds.w for -1.  */
1505       if (GET_CODE (operand) != CONST_INT)
1506         LOSE_AND_RETURN ("invalid operand for 'A' modifier", x);
1507       fprintf (file, INTVAL (operand) < 0 ? "adds.w" : "addq");
1508       return;
1509
1510     case 'D':
1511       /* When emitting an sub for the high part of a DImode constant, we
1512          want to use subq for 0 and subs.w for -1.  */
1513       if (GET_CODE (operand) != CONST_INT)
1514         LOSE_AND_RETURN ("invalid operand for 'D' modifier", x);
1515       fprintf (file, INTVAL (operand) < 0 ? "subs.w" : "subq");
1516       return;
1517
1518     case 'S':
1519       /* Print the operand as the index-part of an address.
1520          Easiest way out is to use cris_print_index.  */
1521       cris_print_index (operand, file);
1522       return;
1523
1524     case 'T':
1525       /* Print the size letter for an operand to a MULT, which must be a
1526          const_int with a suitable value.  */
1527       if (GET_CODE (operand) != CONST_INT || INTVAL (operand) > 4)
1528         LOSE_AND_RETURN ("invalid operand for 'T' modifier", x);
1529       fprintf (file, "%s", mults[INTVAL (operand)]);
1530       return;
1531
1532     case 0:
1533       /* No code, print as usual.  */
1534       break;
1535
1536     default:
1537       LOSE_AND_RETURN ("invalid operand modifier letter", x);
1538     }
1539
1540   /* Print an operand as without a modifier letter.  */
1541   switch (GET_CODE (operand))
1542     {
1543     case REG:
1544       if (REGNO (operand) > 15)
1545         internal_error ("internal error: bad register: %d", REGNO (operand));
1546       fprintf (file, "$%s", reg_names[REGNO (operand)]);
1547       return;
1548
1549     case MEM:
1550       output_address (XEXP (operand, 0));
1551       return;
1552
1553     case CONST_DOUBLE:
1554       if (GET_MODE (operand) == VOIDmode)
1555         /* A long long constant.  */
1556         output_addr_const (file, operand);
1557       else
1558         {
1559           /* Only single precision is allowed as plain operands the
1560              moment.  FIXME:  REAL_VALUE_FROM_CONST_DOUBLE isn't
1561              documented.  */
1562           REAL_VALUE_TYPE r;
1563           long l;
1564
1565           /* FIXME:  Perhaps check overflow of the "single".  */
1566           REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
1567           REAL_VALUE_TO_TARGET_SINGLE (r, l);
1568
1569           fprintf (file, "0x%lx", l);
1570         }
1571       return;
1572
1573     case UNSPEC:
1574       ASSERT_PLT_UNSPEC (operand);
1575       /* Fall through.  */
1576
1577     case CONST:
1578       cris_output_addr_const (file, operand);
1579       return;
1580
1581     case MULT:
1582     case ASHIFT:
1583       {
1584         /* For a (MULT (reg X) const_int) we output "rX.S".  */
1585         int i = GET_CODE (XEXP (operand, 1)) == CONST_INT
1586           ? INTVAL (XEXP (operand, 1)) : INTVAL (XEXP (operand, 0));
1587         rtx reg = GET_CODE (XEXP (operand, 1)) == CONST_INT
1588           ? XEXP (operand, 0) : XEXP (operand, 1);
1589
1590         if (GET_CODE (reg) != REG
1591             || (GET_CODE (XEXP (operand, 0)) != CONST_INT
1592                 && GET_CODE (XEXP (operand, 1)) != CONST_INT))
1593           LOSE_AND_RETURN ("unexpected multiplicative operand", x);
1594
1595         cris_print_base (reg, file);
1596         fprintf (file, ".%c",
1597                  i == 0 || (i == 1 && GET_CODE (operand) == MULT) ? 'b'
1598                  : i == 4 ? 'd'
1599                  : (i == 2 && GET_CODE (operand) == MULT) || i == 1 ? 'w'
1600                  : 'd');
1601         return;
1602       }
1603
1604     default:
1605       /* No need to handle all strange variants, let output_addr_const
1606          do it for us.  */
1607       if (CONSTANT_P (operand))
1608         {
1609           cris_output_addr_const (file, operand);
1610           return;
1611         }
1612
1613       LOSE_AND_RETURN ("unexpected operand", x);
1614     }
1615 }
1616
1617 /* The PRINT_OPERAND_ADDRESS worker.  */
1618
1619 void
1620 cris_print_operand_address (file, x)
1621      FILE *file;
1622      rtx x;
1623 {
1624   /* All these were inside MEM:s so output indirection characters.  */
1625   putc ('[', file);
1626
1627   if (CONSTANT_ADDRESS_P (x))
1628     cris_output_addr_const (file, x);
1629   else if (BASE_OR_AUTOINCR_P (x))
1630     cris_print_base (x, file);
1631   else if (GET_CODE (x) == PLUS)
1632     {
1633       rtx x1, x2;
1634
1635       x1 = XEXP (x, 0);
1636       x2 = XEXP (x, 1);
1637       if (BASE_P (x1))
1638         {
1639           cris_print_base (x1, file);
1640           cris_print_index (x2, file);
1641         }
1642       else if (BASE_P (x2))
1643         {
1644           cris_print_base (x2, file);
1645           cris_print_index (x1, file);
1646         }
1647       else
1648         LOSE_AND_RETURN ("unrecognized address", x);
1649     }
1650   else if (GET_CODE (x) == MEM)
1651     {
1652       /* A DIP.  Output more indirection characters.  */
1653       putc ('[', file);
1654       cris_print_base (XEXP (x, 0), file);
1655       putc (']', file);
1656     }
1657   else
1658     LOSE_AND_RETURN ("unrecognized address", x);
1659
1660   putc (']', file);
1661 }
1662
1663 /* The RETURN_ADDR_RTX worker.
1664    We mark that the return address is used, either by EH or
1665    __builtin_return_address, for use by the function prologue and
1666    epilogue.  FIXME: This isn't optimal; we just use the mark in the
1667    prologue and epilogue to say that the return address is to be stored
1668    in the stack frame.  We could return SRP for leaf-functions and use the
1669    initial-value machinery.  */
1670
1671 rtx
1672 cris_return_addr_rtx (count, frameaddr)
1673      int count;
1674      rtx frameaddr ATTRIBUTE_UNUSED;
1675 {
1676   cfun->machine->needs_return_address_on_stack = 1;
1677
1678   /* The return-address is stored just above the saved frame-pointer (if
1679      present).  Apparently we can't eliminate from the frame-pointer in
1680      that direction, so use the incoming args (maybe pretended) pointer.  */
1681   return count == 0
1682     ? gen_rtx_MEM (Pmode, plus_constant (virtual_incoming_args_rtx, -4))
1683     : NULL_RTX;
1684 }
1685
1686 /* This used to be the INITIAL_FRAME_POINTER_OFFSET worker; now only
1687    handles FP -> SP elimination offset.  */
1688
1689 static int
1690 cris_initial_frame_pointer_offset ()
1691 {
1692   int regno;
1693
1694   /* Initial offset is 0 if we don't have a frame pointer.  */
1695   int offs = 0;
1696
1697   /* And 4 for each register pushed.  */
1698   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1699     if ((((regs_ever_live[regno]
1700            && !call_used_regs[regno])
1701           || (regno == (int) PIC_OFFSET_TABLE_REGNUM
1702               && (current_function_uses_pic_offset_table
1703                   /* It is saved anyway, if there would be a gap.  */
1704                   || (flag_pic
1705                       && regs_ever_live[regno + 1]
1706                       && !call_used_regs[regno + 1]))))
1707          && (regno != FRAME_POINTER_REGNUM || !frame_pointer_needed)
1708          && regno != CRIS_SRP_REGNUM)
1709         || (current_function_calls_eh_return
1710             && (regno == EH_RETURN_DATA_REGNO (0)
1711                 || regno == EH_RETURN_DATA_REGNO (1)
1712                 || regno == EH_RETURN_DATA_REGNO (2)
1713                 || regno == EH_RETURN_DATA_REGNO (3))))
1714       offs += 4;
1715
1716   /* And then, last, we add the locals allocated.  */
1717   offs += get_frame_size ();
1718
1719   /* And more; the accumulated args size.  */
1720   offs += current_function_outgoing_args_size;
1721
1722   /* Then round it off, in case we use aligned stack.  */
1723   if (TARGET_STACK_ALIGN)
1724     offs = TARGET_ALIGN_BY_32 ? (offs + 3) & ~3 : (offs + 1) & ~1;
1725
1726   return offs;
1727 }
1728
1729 /* The INITIAL_ELIMINATION_OFFSET worker.
1730    Calculate the difference between imaginary registers such as frame
1731    pointer and the stack pointer.  Used to eliminate the frame pointer
1732    and imaginary arg pointer.  */
1733
1734 int
1735 cris_initial_elimination_offset (fromreg, toreg)
1736      int fromreg;
1737      int toreg;
1738 {
1739   int fp_sp_offset
1740     = cris_initial_frame_pointer_offset ();
1741
1742   /* We should be able to use regs_ever_live and related prologue
1743      information here, or alpha should not as well.  */
1744   int return_address_on_stack
1745     = regs_ever_live[CRIS_SRP_REGNUM]
1746     || cfun->machine->needs_return_address_on_stack != 0;
1747
1748   /* Here we act as if the frame-pointer is needed.  */
1749   int ap_fp_offset = 4 + (return_address_on_stack ? 4 : 0);
1750
1751   if (fromreg == ARG_POINTER_REGNUM
1752       && toreg == FRAME_POINTER_REGNUM)
1753     return ap_fp_offset;
1754
1755   /* Between the frame pointer and the stack are only "normal" stack
1756      variables and saved registers.  */
1757   if (fromreg == FRAME_POINTER_REGNUM
1758       && toreg == STACK_POINTER_REGNUM)
1759     return fp_sp_offset;
1760
1761   /* We need to balance out the frame pointer here.  */
1762   if (fromreg == ARG_POINTER_REGNUM
1763       && toreg == STACK_POINTER_REGNUM)
1764     return ap_fp_offset + fp_sp_offset - 4;
1765
1766   abort ();
1767 }
1768
1769 /*  This function looks into the pattern to see how this insn affects
1770     condition codes.
1771
1772     Used when to eliminate test insns before a condition-code user,
1773     such as a "scc" insn or a conditional branch.  This includes
1774     checking if the entities that cc was updated by, are changed by the
1775     operation.
1776
1777     Currently a jumble of the old peek-inside-the-insn and the newer
1778     check-cc-attribute methods.  */
1779
1780 void
1781 cris_notice_update_cc (exp, insn)
1782      rtx exp;
1783      rtx insn;
1784 {
1785   /* Check if user specified "-mcc-init" as a bug-workaround.  FIXME:
1786      TARGET_CCINIT does not work; we must set CC_REVERSED as below.
1787      Several test-cases will otherwise fail, for example
1788      gcc.c-torture/execute/20000217-1.c -O0 and -O1.  */
1789   if (TARGET_CCINIT)
1790     {
1791       CC_STATUS_INIT;
1792       return;
1793     }
1794
1795   /* Slowly, we're converting to using attributes to control the setting
1796      of condition-code status.  */
1797   switch (get_attr_cc (insn))
1798     {
1799     case CC_NONE:
1800       /* Even if it is "none", a setting may clobber a previous
1801          cc-value, so check.  */
1802       if (GET_CODE (exp) == SET)
1803         {
1804           if (cc_status.value1
1805               && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1806                                              cc_status.value1))
1807             cc_status.value1 = 0;
1808
1809           if (cc_status.value2
1810               && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1811                                              cc_status.value2))
1812             cc_status.value2 = 0;
1813         }
1814       return;
1815
1816     case CC_CLOBBER:
1817       CC_STATUS_INIT;
1818       break;
1819
1820     case CC_NORMAL:
1821       /* Which means, for:
1822          (set (cc0) (...)):
1823          CC is (...).
1824
1825          (set (reg) (...)):
1826          CC is (reg) and (...) - unless (...) is 0, then CC does not change.
1827          CC_NO_OVERFLOW unless (...) is reg or mem.
1828
1829          (set (mem) (...)):
1830          CC does not change.
1831
1832          (set (pc) (...)):
1833          CC does not change.
1834
1835          (parallel
1836           (set (reg1) (mem (bdap/biap)))
1837           (set (reg2) (bdap/biap))):
1838          CC is (reg1) and (mem (reg2))
1839
1840          (parallel
1841           (set (mem (bdap/biap)) (reg1)) [or 0]
1842           (set (reg2) (bdap/biap))):
1843          CC does not change.
1844
1845          (where reg and mem includes strict_low_parts variants thereof)
1846
1847          For all others, assume CC is clobbered.
1848          Note that we do not have to care about setting CC_NO_OVERFLOW,
1849          since the overflow flag is set to 0 (i.e. right) for
1850          instructions where it does not have any sane sense, but where
1851          other flags have meanings.  (This includes shifts; the carry is
1852          not set by them).
1853
1854          Note that there are other parallel constructs we could match,
1855          but we don't do that yet.  */
1856
1857       if (GET_CODE (exp) == SET)
1858         {
1859           /* FIXME: Check when this happens.  It looks like we should
1860              actually do a CC_STATUS_INIT here to be safe.  */
1861           if (SET_DEST (exp) == pc_rtx)
1862             return;
1863
1864           /* Record CC0 changes, so we do not have to output multiple
1865              test insns.  */
1866           if (SET_DEST (exp) == cc0_rtx)
1867             {
1868               cc_status.value1 = SET_SRC (exp);
1869               cc_status.value2 = 0;
1870
1871               /* Handle flags for the special btstq on one bit.  */
1872               if (GET_CODE (SET_SRC (exp)) == ZERO_EXTRACT
1873                   && XEXP (SET_SRC (exp), 1) == const1_rtx)
1874                 {
1875                   if (GET_CODE (XEXP (SET_SRC (exp), 0)) == CONST_INT)
1876                     /* Using cmpq.  */
1877                     cc_status.flags = CC_INVERTED;
1878                   else
1879                     /* A one-bit btstq.  */
1880                     cc_status.flags = CC_Z_IN_NOT_N;
1881                 }
1882               else
1883                 cc_status.flags = 0;
1884
1885               if (GET_CODE (SET_SRC (exp)) == COMPARE)
1886                 {
1887                   if (!REG_P (XEXP (SET_SRC (exp), 0))
1888                       && XEXP (SET_SRC (exp), 1) != const0_rtx)
1889                     /* For some reason gcc will not canonicalize compare
1890                        operations, reversing the sign by itself if
1891                        operands are in wrong order.  */
1892                     /* (But NOT inverted; eq is still eq.) */
1893                     cc_status.flags = CC_REVERSED;
1894
1895                   /* This seems to be overlooked by gcc.  FIXME: Check again.
1896                      FIXME:  Is it really safe?  */
1897                   cc_status.value2
1898                     = gen_rtx_MINUS (GET_MODE (SET_SRC (exp)),
1899                                      XEXP (SET_SRC (exp), 0),
1900                                      XEXP (SET_SRC (exp), 1));
1901                 }
1902               return;
1903             }
1904           else if (REG_P (SET_DEST (exp))
1905                    || (GET_CODE (SET_DEST (exp)) == STRICT_LOW_PART
1906                        && REG_P (XEXP (SET_DEST (exp), 0))))
1907             {
1908               /* A register is set; normally CC is set to show that no
1909                  test insn is needed.  Catch the exceptions.  */
1910
1911               /* If not to cc0, then no "set"s in non-natural mode give
1912                  ok cc0...  */
1913               if (GET_MODE_SIZE (GET_MODE (SET_DEST (exp))) > UNITS_PER_WORD
1914                   || GET_MODE_CLASS (GET_MODE (SET_DEST (exp))) == MODE_FLOAT)
1915                 {
1916                   /* ... except add:s and sub:s in DImode.  */
1917                   if (GET_MODE (SET_DEST (exp)) == DImode
1918                       && (GET_CODE (SET_SRC (exp)) == PLUS
1919                           || GET_CODE (SET_SRC (exp)) == MINUS))
1920                     {
1921                       cc_status.flags = 0;
1922                       cc_status.value1 = SET_DEST (exp);
1923                       cc_status.value2 = SET_SRC (exp);
1924
1925                       if (cris_reg_overlap_mentioned_p (cc_status.value1,
1926                                                         cc_status.value2))
1927                         cc_status.value2 = 0;
1928
1929                       /* Add and sub may set V, which gets us
1930                          unoptimizable results in "gt" and "le" condition
1931                          codes.  */
1932                       cc_status.flags |= CC_NO_OVERFLOW;
1933
1934                       return;
1935                     }
1936                 }
1937               else if (SET_SRC (exp) == const0_rtx)
1938                 {
1939                   /* There's no CC0 change when clearing a register or
1940                      memory.  Just check for overlap.  */
1941                   if ((cc_status.value1
1942                        && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1943                                                         cc_status.value1)))
1944                     cc_status.value1 = 0;
1945
1946                   if ((cc_status.value2
1947                        && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1948                                                         cc_status.value2)))
1949                     cc_status.value2 = 0;
1950
1951                   return;
1952                 }
1953               else
1954                 {
1955                   cc_status.flags = 0;
1956                   cc_status.value1 = SET_DEST (exp);
1957                   cc_status.value2 = SET_SRC (exp);
1958
1959                   if (cris_reg_overlap_mentioned_p (cc_status.value1,
1960                                                     cc_status.value2))
1961                     cc_status.value2 = 0;
1962
1963                   /* Some operations may set V, which gets us
1964                      unoptimizable results in "gt" and "le" condition
1965                      codes.  */
1966                   if (GET_CODE (SET_SRC (exp)) == PLUS
1967                       || GET_CODE (SET_SRC (exp)) == MINUS
1968                       || GET_CODE (SET_SRC (exp)) == NEG)
1969                     cc_status.flags |= CC_NO_OVERFLOW;
1970
1971                   return;
1972                 }
1973             }
1974           else if (GET_CODE (SET_DEST (exp)) == MEM
1975                    || (GET_CODE (SET_DEST (exp)) == STRICT_LOW_PART
1976                        && GET_CODE (XEXP (SET_DEST (exp), 0)) == MEM))
1977             {
1978               /* When SET to MEM, then CC is not changed (except for
1979                  overlap).  */
1980               if ((cc_status.value1
1981                    && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1982                                                     cc_status.value1)))
1983                 cc_status.value1 = 0;
1984
1985               if ((cc_status.value2
1986                    && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1987                                                     cc_status.value2)))
1988                 cc_status.value2 = 0;
1989
1990               return;
1991             }
1992         }
1993       else if (GET_CODE (exp) == PARALLEL)
1994         {
1995           if (GET_CODE (XVECEXP (exp, 0, 0)) == SET
1996               && GET_CODE (XVECEXP (exp, 0, 1)) == SET
1997               && REG_P (XEXP (XVECEXP (exp, 0, 1), 0)))
1998             {
1999               if (REG_P (XEXP (XVECEXP (exp, 0, 0), 0))
2000                   && GET_CODE (XEXP (XVECEXP (exp, 0, 0), 1)) == MEM)
2001                 {
2002                   /* For "move.S [rx=ry+o],rz", say CC reflects
2003                      value1=rz and value2=[rx] */
2004                   cc_status.value1 = XEXP (XVECEXP (exp, 0, 0), 0);
2005                   cc_status.value2
2006                     = gen_rtx_MEM (GET_MODE (XEXP (XVECEXP (exp, 0, 0), 0)),
2007                                    XEXP (XVECEXP (exp, 0, 1), 0));
2008                   cc_status.flags = 0;
2009
2010                   /* Huh?  A side-effect cannot change the destination
2011                      register.  */
2012                   if (cris_reg_overlap_mentioned_p (cc_status.value1,
2013                                                     cc_status.value2))
2014                     internal_error ("internal error: sideeffect-insn affecting main effect");
2015                   return;
2016                 }
2017               else if ((REG_P (XEXP (XVECEXP (exp, 0, 0), 1))
2018                         || XEXP (XVECEXP (exp, 0, 0), 1) == const0_rtx)
2019                        && GET_CODE (XEXP (XVECEXP (exp, 0, 0), 0)) == MEM)
2020                 {
2021                   /* For "move.S rz,[rx=ry+o]" and "clear.S [rx=ry+o]",
2022                      say flags are not changed, except for overlap.  */
2023                   if (cc_status.value1
2024                       && cris_reg_overlap_mentioned_p (XEXP
2025                                                        (XVECEXP
2026                                                         (exp, 0, 0), 0),
2027                                                        cc_status.value1))
2028                     cc_status.value1 = 0;
2029
2030                   if (cc_status.value1
2031                       && cris_reg_overlap_mentioned_p (XEXP
2032                                                        (XVECEXP
2033                                                         (exp, 0, 1), 0),
2034                                                        cc_status.value1))
2035                     cc_status.value1 = 0;
2036
2037                   if (cc_status.value2
2038                       && cris_reg_overlap_mentioned_p (XEXP
2039                                                        (XVECEXP
2040                                                         (exp, 0, 0), 0),
2041                                                        cc_status.value2))
2042                     cc_status.value2 = 0;
2043
2044                   if (cc_status.value2
2045                       && cris_reg_overlap_mentioned_p (XEXP
2046                                                        (XVECEXP
2047                                                         (exp, 0, 1), 0),
2048                                                        cc_status.value2))
2049                     cc_status.value2 = 0;
2050
2051                   return;
2052                 }
2053             }
2054         }
2055       break;
2056
2057     default:
2058       /* Unknown cc_attr value.  */
2059       abort ();
2060     }
2061
2062   CC_STATUS_INIT;
2063 }
2064
2065 /* Return != 0 if the return sequence for the current function is short,
2066    like "ret" or "jump [sp+]".  Prior to reloading, we can't tell how
2067    many registers must be saved, so return 0 then.  */
2068
2069 int
2070 cris_simple_epilogue ()
2071 {
2072   int regno;
2073   int reglimit = STACK_POINTER_REGNUM;
2074   int lastreg = -1;
2075
2076   if (! reload_completed
2077       || frame_pointer_needed
2078       || get_frame_size () != 0
2079       || current_function_pretend_args_size
2080       || current_function_args_size
2081       || current_function_outgoing_args_size
2082       || current_function_calls_eh_return
2083
2084       /* If we're not supposed to emit prologue and epilogue, we must
2085          not emit return-type instructions.  */
2086       || !TARGET_PROLOGUE_EPILOGUE)
2087     return 0;
2088
2089   /* We allow a "movem [sp+],rN" to sit in front if the "jump [sp+]" or
2090      in the delay-slot of the "ret".  */
2091   for (regno = 0; regno < reglimit; regno++)
2092     if ((regs_ever_live[regno] && ! call_used_regs[regno])
2093         || (regno == (int) PIC_OFFSET_TABLE_REGNUM
2094             && (current_function_uses_pic_offset_table
2095                 /* It is saved anyway, if there would be a gap.  */
2096                 || (flag_pic
2097                     && regs_ever_live[regno + 1]
2098                     && !call_used_regs[regno + 1]))))
2099       {
2100         if (lastreg != regno - 1)
2101           return 0;
2102         lastreg = regno;
2103       }
2104
2105   return 1;
2106 }
2107
2108 /* Compute a (partial) cost for rtx X.  Return true if the complete
2109    cost has been computed, and false if subexpressions should be
2110    scanned.  In either case, *TOTAL contains the cost result.  */
2111
2112 static bool
2113 cris_rtx_costs (x, code, outer_code, total)
2114      rtx x;
2115      int code, outer_code;
2116      int *total;
2117 {
2118   switch (code)
2119     {
2120     case CONST_INT:
2121       {
2122         HOST_WIDE_INT val = INTVAL (x);
2123         if (val == 0)
2124           *total = 0;
2125         else if (val < 32 && val >= -32)
2126           *total = 1;
2127         /* Eight or 16 bits are a word and cycle more expensive.  */
2128         else if (val <= 32767 && val >= -32768)
2129           *total = 2;
2130         /* A 32 bit constant (or very seldom, unsigned 16 bits) costs
2131            another word.  FIXME: This isn't linear to 16 bits.  */
2132         else
2133           *total = 4;
2134         return true;
2135       }
2136
2137     case LABEL_REF:
2138       *total = 6;
2139       return true;
2140
2141     case CONST:
2142     case SYMBOL_REF:
2143       /* For PIC, we need a prefix (if it isn't already there),
2144          and the PIC register.  For a global PIC symbol, we also
2145          need a read of the GOT.  */
2146       if (flag_pic)
2147         {
2148           if (cris_got_symbol (x))
2149             *total = 2 + 4 + 6;
2150           else
2151             *total = 2 + 6;
2152         }
2153       else
2154         *total = 6;
2155       return true;
2156
2157     case CONST_DOUBLE:
2158       if (x != CONST0_RTX (GET_MODE (x) == VOIDmode ? DImode : GET_MODE (x)))
2159         *total = 12;
2160       else
2161         /* Make 0.0 cheap, else test-insns will not be used.  */
2162         *total = 0;
2163       return true;
2164
2165     case MULT:
2166       /* Identify values that are no powers of two.  Powers of 2 are
2167          taken care of already and those values should not be changed.  */
2168       if (GET_CODE (XEXP (x, 1)) != CONST_INT
2169           || exact_log2 (INTVAL (XEXP (x, 1)) < 0))
2170         {
2171           /* If we have a multiply insn, then the cost is between
2172              1 and 2 "fast" instructions.  */
2173           if (TARGET_HAS_MUL_INSNS)
2174             {
2175               *total = COSTS_N_INSNS (1) + COSTS_N_INSNS (1) / 2;
2176               return true;
2177             }
2178
2179           /* Estimate as 4 + 4 * #ofbits.  */
2180           *total = COSTS_N_INSNS (132);
2181           return true;
2182         }
2183       return false;
2184
2185     case UDIV:
2186     case MOD:
2187     case UMOD:
2188     case DIV:
2189       if (GET_CODE (XEXP (x, 1)) != CONST_INT
2190           || exact_log2 (INTVAL (XEXP (x, 1)) < 0))
2191         {
2192           /* Estimate this as 4 + 8 * #of bits.  */
2193           *total = COSTS_N_INSNS (260);
2194           return true;
2195         }
2196       return false;
2197
2198     case AND:
2199       if (GET_CODE (XEXP (x, 1)) == CONST_INT
2200           /* Two constants may actually happen before optimization.  */
2201           && GET_CODE (XEXP (x, 0)) != CONST_INT
2202           && !CONST_OK_FOR_LETTER_P (INTVAL (XEXP (x, 1)), 'I'))
2203         {
2204           *total = (rtx_cost (XEXP (x, 0), outer_code) + 2
2205                     + 2 * GET_MODE_NUNITS (GET_MODE (XEXP (x, 0))));
2206           return true;
2207         }
2208       return false;
2209
2210     case ZERO_EXTEND: case SIGN_EXTEND:
2211       *total = rtx_cost (XEXP (x, 0), outer_code);
2212       return true;
2213
2214     default:
2215       return false;
2216     }
2217 }
2218
2219 /* The ADDRESS_COST worker.  */
2220
2221 static int
2222 cris_address_cost (x)
2223      rtx x;
2224 {
2225   /* The metric to use for the cost-macros is unclear.
2226      The metric used here is (the number of cycles needed) / 2,
2227      where we consider equal a cycle for a word of code and a cycle to
2228      read memory.  */
2229
2230   /* The cheapest addressing modes get 0, since nothing extra is needed.  */
2231   if (BASE_OR_AUTOINCR_P (x))
2232     return 0;
2233
2234   /* An indirect mem must be a DIP.  This means two bytes extra for code,
2235      and 4 bytes extra for memory read, i.e.  (2 + 4) / 2.  */
2236   if (GET_CODE (x) == MEM)
2237     return (2 + 4) / 2;
2238
2239   /* Assume (2 + 4) / 2 for a single constant; a dword, since it needs
2240      an extra DIP prefix and 4 bytes of constant in most cases.
2241      For PIC and a symbol with a GOT entry, we double the cost since we
2242      add a [rPIC+...] offset.  A GOT-less symbol uses a BDAP prefix
2243      equivalent to the DIP prefix for non-PIC, hence the same cost.  */
2244   if (CONSTANT_P (x))
2245     return flag_pic && cris_got_symbol (x) ? 2 * (2 + 4) / 2 : (2 + 4) / 2;
2246
2247   /* Handle BIAP and BDAP prefixes.  */
2248   if (GET_CODE (x) == PLUS)
2249     {
2250       rtx tem1 = XEXP (x, 0);
2251       rtx tem2 = XEXP (x, 1);
2252
2253     /* A BIAP is 2 extra bytes for the prefix insn, nothing more.  We
2254        recognize the typical MULT which is always in tem1 because of
2255        insn canonicalization.  */
2256     if ((GET_CODE (tem1) == MULT && BIAP_INDEX_P (tem1))
2257         || REG_P (tem1))
2258       return 2 / 2;
2259
2260     /* A BDAP (quick) is 2 extra bytes.  Any constant operand to the
2261        PLUS is always found in tem2.  */
2262     if (GET_CODE (tem2) == CONST_INT
2263         && INTVAL (tem2) < 128 && INTVAL (tem2) >= -128)
2264       return 2 / 2;
2265
2266     /* A BDAP -32768 .. 32767 is like BDAP quick, but with 2 extra
2267        bytes.  */
2268     if (GET_CODE (tem2) == CONST_INT
2269         && CONST_OK_FOR_LETTER_P (INTVAL (tem2), 'L'))
2270       return (2 + 2) / 2;
2271
2272     /* A BDAP with some other constant is 2 bytes extra.  */
2273     if (CONSTANT_P (tem2))
2274       return (2 + 2 + 2) / 2;
2275
2276     /* BDAP with something indirect should have a higher cost than
2277        BIAP with register.   FIXME: Should it cost like a MEM or more?  */
2278     /* Don't need to check it, it's the only one left.
2279        FIXME:  There was a REG test missing, perhaps there are others.
2280        Think more.  */
2281     return (2 + 2 + 2) / 2;
2282   }
2283
2284   /* What else?  Return a high cost.  It matters only for valid
2285      addressing modes.  */
2286   return 10;
2287 }
2288
2289 /* Check various objections to the side-effect.  Used in the test-part
2290    of an anonymous insn describing an insn with a possible side-effect.
2291    Returns nonzero if the implied side-effect is ok.
2292
2293    code     : PLUS or MULT
2294    ops      : An array of rtx:es. lreg, rreg, rval,
2295               The variables multop and other_op are indexes into this,
2296               or -1 if they are not applicable.
2297    lreg     : The register that gets assigned in the side-effect.
2298    rreg     : One register in the side-effect expression
2299    rval     : The other register, or an int.
2300    multop   : An integer to multiply rval with.
2301    other_op : One of the entities of the main effect,
2302               whose mode we must consider.  */
2303
2304 int
2305 cris_side_effect_mode_ok (code, ops, lreg, rreg, rval, multop, other_op)
2306      enum rtx_code code;
2307      rtx *ops;
2308      int lreg, rreg, rval, multop, other_op;
2309 {
2310   /* Find what value to multiply with, for rx =ry + rz * n.  */
2311   int mult = multop < 0 ? 1 : INTVAL (ops[multop]);
2312
2313   rtx reg_rtx = ops[rreg];
2314   rtx val_rtx = ops[rval];
2315
2316   /* The operands may be swapped.  Canonicalize them in reg_rtx and
2317      val_rtx, where reg_rtx always is a reg (for this constraint to
2318      match).  */
2319   if (! BASE_P (reg_rtx))
2320     reg_rtx = val_rtx, val_rtx = ops[rreg];
2321
2322   /* Don't forget to check that reg_rtx really is a reg.  If it isn't,
2323      we have no business.  */
2324   if (! BASE_P (reg_rtx))
2325     return 0;
2326
2327   /* Don't do this when -mno-split.  */
2328   if (!TARGET_SIDE_EFFECT_PREFIXES)
2329     return 0;
2330
2331   /* The mult expression may be hidden in lreg.  FIXME:  Add more
2332      commentary about that.  */
2333   if (GET_CODE (val_rtx) == MULT)
2334     {
2335       mult = INTVAL (XEXP (val_rtx, 1));
2336       val_rtx = XEXP (val_rtx, 0);
2337       code = MULT;
2338     }
2339
2340   /* First check the "other operand".  */
2341   if (other_op >= 0)
2342     {
2343       if (GET_MODE_SIZE (GET_MODE (ops[other_op])) > UNITS_PER_WORD)
2344         return 0;
2345
2346       /* Check if the lvalue register is the same as the "other
2347          operand".  If so, the result is undefined and we shouldn't do
2348          this.  FIXME:  Check again.  */
2349       if ((BASE_P (ops[lreg])
2350            && BASE_P (ops[other_op])
2351            && REGNO (ops[lreg]) == REGNO (ops[other_op]))
2352           || rtx_equal_p (ops[other_op], ops[lreg]))
2353       return 0;
2354     }
2355
2356   /* Do not accept frame_pointer_rtx as any operand.  */
2357   if (ops[lreg] == frame_pointer_rtx || ops[rreg] == frame_pointer_rtx
2358       || ops[rval] == frame_pointer_rtx
2359       || (other_op >= 0 && ops[other_op] == frame_pointer_rtx))
2360     return 0;
2361
2362   if (code == PLUS
2363       && ! BASE_P (val_rtx))
2364     {
2365
2366       /* Do not allow rx = rx + n if a normal add or sub with same size
2367          would do.  */
2368       if (rtx_equal_p (ops[lreg], reg_rtx)
2369           && GET_CODE (val_rtx) == CONST_INT
2370           && (INTVAL (val_rtx) <= 63 && INTVAL (val_rtx) >= -63))
2371         return 0;
2372
2373       /* Check allowed cases, like [r(+)?].[bwd] and const.
2374          A symbol is not allowed with PIC.  */
2375       if (CONSTANT_P (val_rtx))
2376         return flag_pic == 0 || cris_symbol (val_rtx) == 0;
2377
2378       if (GET_CODE (val_rtx) == MEM
2379           && BASE_OR_AUTOINCR_P (XEXP (val_rtx, 0)))
2380         return 1;
2381
2382       if (GET_CODE (val_rtx) == SIGN_EXTEND
2383           && GET_CODE (XEXP (val_rtx, 0)) == MEM
2384           && BASE_OR_AUTOINCR_P (XEXP (XEXP (val_rtx, 0), 0)))
2385         return 1;
2386
2387       /* If we got here, it's not a valid addressing mode.  */
2388       return 0;
2389     }
2390   else if (code == MULT
2391            || (code == PLUS && BASE_P (val_rtx)))
2392     {
2393       /* Do not allow rx = rx + ry.S, since it doesn't give better code.  */
2394       if (rtx_equal_p (ops[lreg], reg_rtx)
2395           || (mult == 1 && rtx_equal_p (ops[lreg], val_rtx)))
2396         return 0;
2397
2398       /* Do not allow bad multiply-values.  */
2399       if (mult != 1 && mult != 2 && mult != 4)
2400         return 0;
2401
2402       /* Only allow  r + ...  */
2403       if (! BASE_P (reg_rtx))
2404         return 0;
2405
2406       /* If we got here, all seems ok.
2407          (All checks need to be done above).  */
2408       return 1;
2409     }
2410
2411   /* If we get here, the caller got its initial tests wrong.  */
2412   internal_error ("internal error: cris_side_effect_mode_ok with bad operands");
2413 }
2414
2415 /* The function reg_overlap_mentioned_p in CVS (still as of 2001-05-16)
2416    does not handle the case where the IN operand is strict_low_part; it
2417    does handle it for X.  Test-case in Axis-20010516.  This function takes
2418    care of that for THIS port.  FIXME: strict_low_part is going away
2419    anyway.  */
2420
2421 static int
2422 cris_reg_overlap_mentioned_p (x, in)
2423      rtx x, in;
2424 {
2425   /* The function reg_overlap_mentioned now handles when X is
2426      strict_low_part, but not when IN is a STRICT_LOW_PART.  */
2427   if (GET_CODE (in) == STRICT_LOW_PART)
2428     in = XEXP (in, 0);
2429
2430   return reg_overlap_mentioned_p (x, in);
2431 }
2432
2433 /* The TARGET_ASM_NAMED_SECTION worker.
2434    We just dispatch to the functions for ELF and a.out.  */
2435
2436 void
2437 cris_target_asm_named_section (name, flags)
2438      const char *name;
2439      unsigned int flags;
2440 {
2441   if (! TARGET_ELF)
2442     default_no_named_section (name, flags);
2443   else
2444     default_elf_asm_named_section (name, flags);
2445 }
2446
2447 /* The LEGITIMATE_PIC_OPERAND_P worker.  */
2448
2449 int
2450 cris_legitimate_pic_operand (x)
2451      rtx x;
2452 {
2453   /* The PIC representation of a symbol with a GOT entry will be (for
2454      example; relocations differ):
2455       sym => [rPIC+sym:GOT]
2456      and for a GOT-less symbol it will be (for example, relocation differ):
2457       sym => rPIC+sym:GOTOFF
2458      so only a symbol with a GOT is by itself a valid operand, and it
2459      can't be a sum of a symbol and an offset.  */
2460   return ! cris_symbol (x) || cris_got_symbol (x);
2461 }
2462
2463 /* Return nonzero if there's a SYMBOL_REF or LABEL_REF hiding inside this
2464    CONSTANT_P.  */
2465
2466 int
2467 cris_symbol (x)
2468      rtx x;
2469 {
2470   switch (GET_CODE (x))
2471     {
2472     case SYMBOL_REF:
2473     case LABEL_REF:
2474       return 1;
2475
2476     case UNSPEC:
2477       /* A PLT reference.  */
2478       ASSERT_PLT_UNSPEC (x);
2479       return 1;
2480
2481     case CONST:
2482       return cris_symbol (XEXP (x, 0));
2483
2484     case PLUS:
2485     case MINUS:
2486       return cris_symbol (XEXP (x, 0)) || cris_symbol (XEXP (x, 1));
2487
2488     case CONST_INT:
2489     case CONST_DOUBLE:
2490     case CONSTANT_P_RTX:
2491       return 0;
2492
2493     default:
2494       fatal_insn ("unrecognized supposed constant", x);
2495     }
2496
2497   return 1;
2498 }
2499
2500 /* Return nonzero if there's a SYMBOL_REF or LABEL_REF hiding inside this
2501    CONSTANT_P, and the symbol does not need a GOT entry.  Also set
2502    current_function_uses_pic_offset_table if we're generating PIC and ever
2503    see something that would need one.  */
2504
2505 int
2506 cris_gotless_symbol (x)
2507      rtx x;
2508 {
2509 #ifdef ENABLE_CHECKING
2510   if (!flag_pic)
2511     abort ();
2512 #endif
2513
2514   switch (GET_CODE (x))
2515     {
2516     case UNSPEC:
2517       ASSERT_PLT_UNSPEC (x);
2518       return 1;
2519
2520     case SYMBOL_REF:
2521       if (cfun != NULL)
2522         current_function_uses_pic_offset_table = 1;
2523       return SYMBOL_REF_LOCAL_P (x);
2524
2525     case LABEL_REF:
2526       /* We don't set current_function_uses_pic_offset_table for
2527          LABEL_REF:s in here, since they are almost always originating
2528          from some branch.  The only time it does not come from a label is
2529          when GCC does something like __builtin_setjmp.  Then we get the
2530          LABEL_REF from the movsi expander, so we mark it there as a
2531          special case.  */
2532       return 1;
2533
2534     case CONST:
2535       return cris_gotless_symbol (XEXP (x, 0));
2536
2537     case PLUS:
2538     case MINUS:
2539       {
2540         int x0 = cris_gotless_symbol (XEXP (x, 0)) != 0;
2541         int x1 = cris_gotless_symbol (XEXP (x, 1)) != 0;
2542
2543         /* One and only one of them must be a local symbol.  Neither must
2544            be some other, more general kind of symbol.  */
2545         return
2546           (x0 ^ x1)
2547           && ! (x0 == 0 && cris_symbol (XEXP (x, 0)))
2548           && ! (x1 == 0 && cris_symbol (XEXP (x, 1)));
2549       }
2550
2551     case CONST_INT:
2552     case CONST_DOUBLE:
2553     case CONSTANT_P_RTX:
2554       return 0;
2555
2556     default:
2557       fatal_insn ("unrecognized supposed constant", x);
2558     }
2559
2560   return 1;
2561 }
2562
2563 /* Return nonzero if there's a SYMBOL_REF or LABEL_REF hiding inside this
2564    CONSTANT_P, and the symbol needs a GOT entry.  */
2565
2566 int
2567 cris_got_symbol (x)
2568      rtx x;
2569 {
2570 #ifdef ENABLE_CHECKING
2571   if (!flag_pic)
2572     abort ();
2573 #endif
2574
2575   switch (GET_CODE (x))
2576     {
2577     case UNSPEC:
2578       ASSERT_PLT_UNSPEC (x);
2579       return 0;
2580
2581     case SYMBOL_REF:
2582       if (cfun != NULL)
2583         current_function_uses_pic_offset_table = 1;
2584       return ! SYMBOL_REF_LOCAL_P (x);
2585
2586     case CONST:
2587       return cris_got_symbol (XEXP (x, 0));
2588
2589     case LABEL_REF:
2590       /* A LABEL_REF is never visible as a symbol outside the local
2591          function.  */
2592     case PLUS:
2593     case MINUS:
2594       /* Nope, can't access the GOT for "symbol + offset".  */
2595       return 0;
2596
2597     case CONST_INT:
2598     case CONST_DOUBLE:
2599     case CONSTANT_P_RTX:
2600       return 0;
2601
2602     default:
2603       fatal_insn ("unrecognized supposed constant in cris_global_pic_symbol",
2604                   x);
2605     }
2606
2607   return 1;
2608 }
2609
2610 /* The OVERRIDE_OPTIONS worker.
2611    As is the norm, this also parses -mfoo=bar type parameters.  */
2612
2613 void
2614 cris_override_options ()
2615 {
2616   if (cris_max_stackframe_str)
2617     {
2618       cris_max_stackframe = atoi (cris_max_stackframe_str);
2619
2620       /* Do some sanity checking.  */
2621       if (cris_max_stackframe < 0 || cris_max_stackframe > 0x20000000)
2622         internal_error ("-max-stackframe=%d is not usable, not between 0 and %d",
2623                         cris_max_stackframe, 0x20000000);
2624     }
2625
2626   /* Let "-metrax4" and "-metrax100" change the cpu version.  */
2627   if (TARGET_SVINTO && cris_cpu_version < CRIS_CPU_SVINTO)
2628     cris_cpu_version = CRIS_CPU_SVINTO;
2629   else if (TARGET_ETRAX4_ADD && cris_cpu_version < CRIS_CPU_ETRAX4)
2630     cris_cpu_version = CRIS_CPU_ETRAX4;
2631
2632   /* Parse -march=... and its synonym, the deprecated -mcpu=...  */
2633   if (cris_cpu_str)
2634     {
2635       cris_cpu_version
2636         = (*cris_cpu_str == 'v' ? atoi (cris_cpu_str + 1) : -1);
2637
2638       if (strcmp ("etrax4", cris_cpu_str) == 0)
2639         cris_cpu_version = 3;
2640
2641       if (strcmp ("svinto", cris_cpu_str) == 0
2642           || strcmp ("etrax100", cris_cpu_str) == 0)
2643         cris_cpu_version = 8;
2644
2645       if (strcmp ("ng", cris_cpu_str) == 0
2646           || strcmp ("etrax100lx", cris_cpu_str) == 0)
2647         cris_cpu_version = 10;
2648
2649       if (cris_cpu_version < 0 || cris_cpu_version > 10)
2650         error ("unknown CRIS version specification in -march= or -mcpu= : %s",
2651                cris_cpu_str);
2652
2653       /* Set the target flags.  */
2654       if (cris_cpu_version >= CRIS_CPU_ETRAX4)
2655         target_flags |= TARGET_MASK_ETRAX4_ADD;
2656
2657       /* If this is Svinto or higher, align for 32 bit accesses.  */
2658       if (cris_cpu_version >= CRIS_CPU_SVINTO)
2659         target_flags
2660           |= (TARGET_MASK_SVINTO | TARGET_MASK_ALIGN_BY_32
2661               | TARGET_MASK_STACK_ALIGN | TARGET_MASK_CONST_ALIGN
2662               | TARGET_MASK_DATA_ALIGN);
2663
2664       /* Note that we do not add new flags when it can be completely
2665          described with a macro that uses -mcpu=X.  So
2666          TARGET_HAS_MUL_INSNS is (cris_cpu_version >= CRIS_CPU_NG).  */
2667     }
2668
2669   if (cris_tune_str)
2670     {
2671       int cris_tune
2672         = (*cris_tune_str == 'v' ? atoi (cris_tune_str + 1) : -1);
2673
2674       if (strcmp ("etrax4", cris_tune_str) == 0)
2675         cris_tune = 3;
2676
2677       if (strcmp ("svinto", cris_tune_str) == 0
2678           || strcmp ("etrax100", cris_tune_str) == 0)
2679         cris_tune = 8;
2680
2681       if (strcmp ("ng", cris_tune_str) == 0
2682           || strcmp ("etrax100lx", cris_tune_str) == 0)
2683         cris_tune = 10;
2684
2685       if (cris_tune < 0 || cris_tune > 10)
2686         error ("unknown CRIS cpu version specification in -mtune= : %s",
2687                cris_tune_str);
2688
2689       if (cris_tune >= CRIS_CPU_SVINTO)
2690         /* We have currently nothing more to tune than alignment for
2691            memory accesses.  */
2692         target_flags
2693           |= (TARGET_MASK_STACK_ALIGN | TARGET_MASK_CONST_ALIGN
2694               | TARGET_MASK_DATA_ALIGN | TARGET_MASK_ALIGN_BY_32);
2695     }
2696
2697   if (flag_pic)
2698     {
2699       /* Use error rather than warning, so invalid use is easily
2700          detectable.  Still change to the values we expect, to avoid
2701          further errors.  */
2702       if (! TARGET_LINUX)
2703         {
2704           error ("-fPIC and -fpic are not supported in this configuration");
2705           flag_pic = 0;
2706         }
2707
2708       /* Turn off function CSE.  We need to have the addresses reach the
2709          call expanders to get PLT-marked, as they could otherwise be
2710          compared against zero directly or indirectly.  After visiting the
2711          call expanders they will then be cse:ed, as the call expanders
2712          force_reg the addresses, effectively forcing flag_no_function_cse
2713          to 0.  */
2714       flag_no_function_cse = 1;
2715     }
2716
2717   if ((write_symbols == DWARF_DEBUG
2718        || write_symbols == DWARF2_DEBUG) && ! TARGET_ELF)
2719     {
2720       warning ("that particular -g option is invalid with -maout and -melinux");
2721       write_symbols = DBX_DEBUG;
2722     }
2723
2724   /* Set the per-function-data initializer.  */
2725   init_machine_status = cris_init_machine_status;
2726 }
2727
2728 /* The TARGET_ASM_OUTPUT_MI_THUNK worker.  */
2729
2730 static void
2731 cris_asm_output_mi_thunk (stream, thunkdecl, delta, vcall_offset, funcdecl)
2732      FILE *stream;
2733      tree thunkdecl ATTRIBUTE_UNUSED;
2734      HOST_WIDE_INT delta;
2735      HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED;
2736      tree funcdecl;
2737 {
2738   if (delta > 0)
2739     {
2740       fprintf (stream, "\tadd%s ", ADDITIVE_SIZE_MODIFIER (delta));
2741       fprintf (stream, HOST_WIDE_INT_PRINT_DEC, delta);
2742       fprintf (stream, ",$%s\n", reg_names[CRIS_FIRST_ARG_REG]);
2743     }
2744   else if (delta < 0)
2745     {
2746       fprintf (stream, "\tsub%s ", ADDITIVE_SIZE_MODIFIER (-delta));
2747       fprintf (stream, HOST_WIDE_INT_PRINT_DEC, -delta);
2748       fprintf (stream, ",$%s\n", reg_names[CRIS_FIRST_ARG_REG]);
2749     }
2750
2751   if (flag_pic)
2752     {
2753       const char *name = XSTR (XEXP (DECL_RTL (funcdecl), 0), 0);
2754
2755       name = (* targetm.strip_name_encoding) (name);
2756       fprintf (stream, "add.d ");
2757       assemble_name (stream, name);
2758       fprintf (stream, "%s,$pc\n", CRIS_PLT_PCOFFSET_SUFFIX);
2759     }
2760   else
2761     {
2762       fprintf (stream, "jump ");
2763       assemble_name (stream, XSTR (XEXP (DECL_RTL (funcdecl), 0), 0));
2764       fprintf (stream, "\n");
2765     }
2766 }
2767
2768 /* The EXPAND_BUILTIN_VA_ARG worker.  This is modified from the
2769    "standard" implementation of va_arg: read the value from the current
2770    address and increment by the size of one or two registers.  The
2771    important difference for CRIS is that if the type is
2772    pass-by-reference, then perform an indirection.  */
2773
2774 rtx
2775 cris_expand_builtin_va_arg (valist, type)
2776      tree valist;
2777      tree type;
2778 {
2779   tree addr_tree, t;
2780   rtx addr;
2781   tree passed_size = size_zero_node;
2782   tree type_size = NULL;
2783   tree size3 = size_int (3);
2784   tree size4 = size_int (4);
2785   tree size8 = size_int (8);
2786   tree rounded_size;
2787
2788   /* Get AP.  */
2789   addr_tree = valist;
2790
2791   if (type == error_mark_node
2792       || (type_size = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (type))) == NULL
2793       || TREE_OVERFLOW (type_size))
2794     /* Presumably an error; the size isn't computable.  A message has
2795        supposedly been emitted elsewhere.  */
2796     rounded_size = size_zero_node;
2797   else
2798     rounded_size
2799       = fold (build (MULT_EXPR, sizetype,
2800                      fold (build (TRUNC_DIV_EXPR, sizetype,
2801                                   fold (build (PLUS_EXPR, sizetype,
2802                                                type_size, size3)),
2803                                   size4)),
2804                      size4));
2805
2806   if (!integer_zerop (rounded_size))
2807     {
2808       /* Check if the type is passed by value or by reference.  Values up
2809          to 8 bytes are passed by-value, padded to register-size (4
2810          bytes).  Larger values and varying-size types are passed
2811          by reference.  */
2812       passed_size
2813         = (!really_constant_p (type_size)
2814            ? size4
2815            : fold (build (COND_EXPR, sizetype,
2816                           fold (build (GT_EXPR, sizetype,
2817                                        rounded_size,
2818                                        size8)),
2819                           size4,
2820                           rounded_size)));
2821
2822       addr_tree
2823         = (!really_constant_p (type_size)
2824            ? build1 (INDIRECT_REF, build_pointer_type (type), addr_tree)
2825            : fold (build (COND_EXPR, TREE_TYPE (addr_tree),
2826                           fold (build (GT_EXPR, sizetype,
2827                                        rounded_size,
2828                                        size8)),
2829                           build1 (INDIRECT_REF, build_pointer_type (type),
2830                                   addr_tree),
2831                           addr_tree)));
2832     }
2833
2834   addr = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
2835   addr = copy_to_reg (addr);
2836
2837   if (!integer_zerop (rounded_size))
2838     {
2839       /* Compute new value for AP.  */
2840       t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
2841                  build (PLUS_EXPR, TREE_TYPE (valist), valist,
2842                         passed_size));
2843       TREE_SIDE_EFFECTS (t) = 1;
2844       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2845     }
2846
2847   return addr;
2848 }
2849
2850 /* The INIT_EXPANDERS worker sets the per-function-data initializer and
2851    mark functions.  */
2852
2853 void
2854 cris_init_expanders ()
2855 {
2856   /* Nothing here at the moment.  */
2857 }
2858
2859 /* Zero initialization is OK for all current fields.  */
2860
2861 static struct machine_function *
2862 cris_init_machine_status ()
2863 {
2864   return ggc_alloc_cleared (sizeof (struct machine_function));
2865 }
2866
2867 /* Split a 2 word move (DI or presumably DF) into component parts.
2868    Originally a copy of gen_split_move_double in m32r.c.  */
2869
2870 rtx
2871 cris_split_movdx (operands)
2872      rtx *operands;
2873 {
2874   enum machine_mode mode = GET_MODE (operands[0]);
2875   rtx dest = operands[0];
2876   rtx src  = operands[1];
2877   rtx val;
2878
2879   /* We used to have to handle (SUBREG (MEM)) here, but that should no
2880      longer happen; after reload there are no SUBREGs any more, and we're
2881      only called after reload.  */
2882   if (GET_CODE (dest) == SUBREG || GET_CODE (src) == SUBREG)
2883     abort ();
2884
2885   start_sequence ();
2886   if (GET_CODE (dest) == REG)
2887     {
2888       int dregno = REGNO (dest);
2889
2890       /* Reg-to-reg copy.  */
2891       if (GET_CODE (src) == REG)
2892         {
2893           int sregno = REGNO (src);
2894
2895           int reverse = (dregno == sregno + 1);
2896
2897           /* We normally copy the low-numbered register first.  However, if
2898              the first register operand 0 is the same as the second register of
2899              operand 1, we must copy in the opposite order.  */
2900           emit_insn (gen_rtx_SET (VOIDmode,
2901                                   operand_subword (dest, reverse, TRUE, mode),
2902                                   operand_subword (src, reverse, TRUE, mode)));
2903
2904           emit_insn (gen_rtx_SET (VOIDmode,
2905                                   operand_subword (dest, !reverse, TRUE, mode),
2906                                   operand_subword (src, !reverse, TRUE, mode)));
2907         }
2908       /* Constant-to-reg copy.  */
2909       else if (GET_CODE (src) == CONST_INT || GET_CODE (src) == CONST_DOUBLE)
2910         {
2911           rtx words[2];
2912           split_double (src, &words[0], &words[1]);
2913           emit_insn (gen_rtx_SET (VOIDmode,
2914                                   operand_subword (dest, 0, TRUE, mode),
2915                                   words[0]));
2916
2917           emit_insn (gen_rtx_SET (VOIDmode,
2918                                   operand_subword (dest, 1, TRUE, mode),
2919                                   words[1]));
2920         }
2921       /* Mem-to-reg copy.  */
2922       else if (GET_CODE (src) == MEM)
2923         {
2924           /* If the high-address word is used in the address, we must load it
2925              last.  Otherwise, load it first.  */
2926           rtx addr = XEXP (src, 0);
2927           int reverse
2928             = (refers_to_regno_p (dregno, dregno + 1, addr, NULL) != 0);
2929
2930           /* The original code imples that we can't do
2931              move.x [rN+],rM  move.x [rN],rM+1
2932              when rN is dead, because of REG_NOTES damage.  That is
2933              consistent with what I've seen, so don't try it.
2934
2935              We have two different cases here; if the addr is POST_INC,
2936              just pass it through, otherwise add constants.  */
2937
2938           if (GET_CODE (addr) == POST_INC)
2939             {
2940               emit_insn (gen_rtx_SET (VOIDmode,
2941                                       operand_subword (dest, 0, TRUE, mode),
2942                                       change_address (src, SImode, addr)));
2943               emit_insn (gen_rtx_SET (VOIDmode,
2944                                       operand_subword (dest, 1, TRUE, mode),
2945                                       change_address (src, SImode, addr)));
2946             }
2947           else
2948             {
2949               /* Make sure we don't get any other addresses with
2950                  embedded postincrements.  They should be stopped in
2951                  GO_IF_LEGITIMATE_ADDRESS, but we're here for your
2952                  safety.  */
2953               if (side_effects_p (addr))
2954                 fatal_insn ("unexpected side-effects in address", addr);
2955
2956               emit_insn (gen_rtx_SET
2957                          (VOIDmode,
2958                           operand_subword (dest, reverse, TRUE, mode),
2959                           change_address
2960                           (src, SImode,
2961                            plus_constant (addr,
2962                                           reverse * UNITS_PER_WORD))));
2963               emit_insn (gen_rtx_SET
2964                          (VOIDmode,
2965                           operand_subword (dest, ! reverse, TRUE, mode),
2966                           change_address
2967                           (src, SImode,
2968                            plus_constant (addr,
2969                                           (! reverse) *
2970                                           UNITS_PER_WORD))));
2971             }
2972         }
2973       else
2974         abort ();
2975     }
2976   /* Reg-to-mem copy or clear mem.  */
2977   else if (GET_CODE (dest) == MEM
2978            && (GET_CODE (src) == REG
2979                || src == const0_rtx
2980                || src == CONST0_RTX (DFmode)))
2981     {
2982       rtx addr = XEXP (dest, 0);
2983
2984       if (GET_CODE (addr) == POST_INC)
2985         {
2986           emit_insn (gen_rtx_SET (VOIDmode,
2987                                   change_address (dest, SImode, addr),
2988                                   operand_subword (src, 0, TRUE, mode)));
2989           emit_insn (gen_rtx_SET (VOIDmode,
2990                                   change_address (dest, SImode, addr),
2991                                   operand_subword (src, 1, TRUE, mode)));
2992         }
2993       else
2994         {
2995           /* Make sure we don't get any other addresses with embedded
2996              postincrements.  They should be stopped in
2997              GO_IF_LEGITIMATE_ADDRESS, but we're here for your safety.  */
2998           if (side_effects_p (addr))
2999             fatal_insn ("unexpected side-effects in address", addr);
3000
3001           emit_insn (gen_rtx_SET
3002                      (VOIDmode,
3003                       change_address (dest, SImode, addr),
3004                       operand_subword (src, 0, TRUE, mode)));
3005
3006           emit_insn (gen_rtx_SET
3007                      (VOIDmode,
3008                       change_address (dest, SImode,
3009                                       plus_constant (addr,
3010                                                      UNITS_PER_WORD)),
3011                       operand_subword (src, 1, TRUE, mode)));
3012         }
3013     }
3014
3015   else
3016     abort ();
3017
3018   val = get_insns ();
3019   end_sequence ();
3020   return val;
3021 }
3022
3023 /* This is in essence a copy of output_addr_const altered to output
3024    symbolic operands as PIC.
3025
3026    FIXME: Add hooks similar to ASM_OUTPUT_SYMBOL_REF to get this effect in
3027    the "real" output_addr_const.  All we need is one for LABEL_REF (and
3028    one for CODE_LABEL?).  */
3029
3030 void
3031 cris_output_addr_const (file, x)
3032      FILE *file;
3033      rtx x;
3034 {
3035   int is_plt = 0;
3036
3037 restart:
3038   switch (GET_CODE (x))
3039     {
3040     case UNSPEC:
3041       ASSERT_PLT_UNSPEC (x);
3042       x = XVECEXP (x, 0, 0);
3043       is_plt = 1;
3044
3045       /* Fall through.  */
3046     case SYMBOL_REF:
3047       if (flag_pic)
3048         {
3049           const char *origstr = XSTR (x, 0);
3050           const char *str;
3051
3052           str = (* targetm.strip_name_encoding) (origstr);
3053
3054           if (is_plt)
3055             {
3056               if (cris_pic_sympart_only)
3057                 {
3058                   assemble_name (file, str);
3059                   fprintf (file, ":PLTG");
3060                 }
3061               else
3062                 {
3063                   if (TARGET_AVOID_GOTPLT)
3064                     /* We shouldn't get here.  */
3065                     abort ();
3066
3067                   fprintf (file, "[$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
3068                   assemble_name (file, XSTR (x, 0));
3069
3070                   if (flag_pic == 1)
3071                     fprintf (file, ":GOTPLT16]");
3072                   else
3073                     fprintf (file, ":GOTPLT]");
3074                 }
3075             }
3076           else if (cris_gotless_symbol (x))
3077             {
3078               if (! cris_pic_sympart_only)
3079                 fprintf (file, "$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
3080               assemble_name (file, str);
3081               fprintf (file, ":GOTOFF");
3082             }
3083           else if (cris_got_symbol (x))
3084             {
3085               if (cris_pic_sympart_only)
3086                 abort ();
3087               fprintf (file, "[$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
3088               assemble_name (file, XSTR (x, 0));
3089
3090               if (flag_pic == 1)
3091                 fprintf (file, ":GOT16]");
3092               else
3093                 fprintf (file, ":GOT]");
3094             }
3095           else
3096             LOSE_AND_RETURN ("unexpected PIC symbol", x);
3097
3098           /* Sanity check.  */
3099           if (! current_function_uses_pic_offset_table)
3100             output_operand_lossage ("PIC register isn't set up");
3101         }
3102       else
3103         assemble_name (file, XSTR (x, 0));
3104       break;
3105
3106     case LABEL_REF:
3107       /* If we get one of those here, it should be dressed as PIC.  Branch
3108          labels are normally output with the 'l' specifier, which means it
3109          will go directly to output_asm_label and not end up here.  */
3110       if (GET_CODE (XEXP (x, 0)) != CODE_LABEL
3111           && (GET_CODE (XEXP (x, 0)) != NOTE
3112               || NOTE_LINE_NUMBER (XEXP (x, 0)) != NOTE_INSN_DELETED_LABEL))
3113         fatal_insn ("unexpected address expression", x);
3114
3115       if (flag_pic)
3116         {
3117           if (cris_gotless_symbol (x))
3118             {
3119               if (! cris_pic_sympart_only)
3120                 fprintf (file, "$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
3121               cris_output_addr_const (file, XEXP (x, 0));
3122
3123               fprintf (file, ":GOTOFF");
3124             }
3125           else
3126             /* Labels are never marked as global symbols.  */
3127             fatal_insn ("unexpected PIC symbol", x);
3128
3129           /* Sanity check.  */
3130           if (! current_function_uses_pic_offset_table)
3131             internal_error ("emitting PIC operand, but PIC register isn't set up");
3132           break;
3133         }
3134
3135       output_addr_const (file, x);
3136       break;
3137
3138     case NOTE:
3139       if (NOTE_LINE_NUMBER (x) != NOTE_INSN_DELETED_LABEL)
3140         fatal_insn ("unexpected NOTE as addr_const:", x);
3141     case CODE_LABEL:
3142     case CONST_INT:
3143     case CONST_DOUBLE:
3144     case ZERO_EXTEND:
3145     case SIGN_EXTEND:
3146       output_addr_const (file, x);
3147       break;
3148
3149     case CONST:
3150       /* This used to output parentheses around the expression,
3151          but that does not work on the 386 (either ATT or BSD assembler).  */
3152       cris_output_addr_const (file, XEXP (x, 0));
3153       break;
3154
3155     case PLUS:
3156       /* Some assemblers need integer constants to appear last (eg masm).  */
3157       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
3158         {
3159           cris_output_addr_const (file, XEXP (x, 1));
3160           if (INTVAL (XEXP (x, 0)) >= 0)
3161             fprintf (file, "+");
3162           output_addr_const (file, XEXP (x, 0));
3163         }
3164       else
3165         {
3166           cris_output_addr_const (file, XEXP (x, 0));
3167           if (GET_CODE (XEXP (x, 1)) != CONST_INT
3168               || INTVAL (XEXP (x, 1)) >= 0)
3169             fprintf (file, "+");
3170           cris_output_addr_const (file, XEXP (x, 1));
3171         }
3172       break;
3173
3174     case MINUS:
3175       /* Avoid outputting things like x-x or x+5-x,
3176          since some assemblers can't handle that.  */
3177       x = simplify_subtraction (x);
3178       if (GET_CODE (x) != MINUS)
3179         goto restart;
3180
3181       cris_output_addr_const (file, XEXP (x, 0));
3182       fprintf (file, "-");
3183       if ((GET_CODE (XEXP (x, 1)) == CONST_INT
3184            && INTVAL (XEXP (x, 1)) < 0)
3185           || GET_CODE (XEXP (x, 1)) != CONST_INT)
3186         {
3187           fprintf (file, "%s", targetm.asm_out.open_paren);
3188           cris_output_addr_const (file, XEXP (x, 1));
3189           fprintf (file, "%s", targetm.asm_out.close_paren);
3190         }
3191       else
3192         output_addr_const (file, XEXP (x, 1));
3193       break;
3194
3195     default:
3196       LOSE_AND_RETURN ("unexpected address expression", x);
3197     }
3198 }
3199
3200 #if 0
3201 /* Various small functions to replace macros.  Only called from a
3202    debugger.  They might collide with gcc functions or system functions,
3203    so only emit them when '#if 1' above.  */
3204
3205 enum rtx_code Get_code PARAMS ((rtx));
3206
3207 enum rtx_code
3208 Get_code (x)
3209      rtx x;
3210 {
3211   return GET_CODE (x);
3212 }
3213
3214 const char *Get_mode PARAMS ((rtx));
3215
3216 const char *
3217 Get_mode (x)
3218      rtx x;
3219 {
3220   return GET_MODE_NAME (GET_MODE (x));
3221 }
3222
3223 rtx Xexp PARAMS ((rtx, int));
3224
3225 rtx
3226 Xexp (x, n)
3227      rtx x;
3228      int n;
3229 {
3230   return XEXP (x, n);
3231 }
3232
3233 rtx Xvecexp PARAMS ((rtx, int, int));
3234
3235 rtx
3236 Xvecexp (x, n, m)
3237      rtx x;
3238      int n;
3239 {
3240   return XVECEXP (x, n, m);
3241 }
3242
3243 int Get_rtx_len PARAMS ((rtx));
3244
3245 int
3246 Get_rtx_len (x)
3247      rtx x;
3248 {
3249   return GET_RTX_LENGTH (GET_CODE (x));
3250 }
3251
3252 /* Use upper-case to distinguish from local variables that are sometimes
3253    called next_insn and prev_insn.  */
3254
3255 rtx Next_insn PARAMS ((rtx));
3256
3257 rtx
3258 Next_insn (insn)
3259      rtx insn;
3260 {
3261   return NEXT_INSN (insn);
3262 }
3263
3264 rtx Prev_insn PARAMS ((rtx));
3265
3266 rtx
3267 Prev_insn (insn)
3268      rtx insn;
3269 {
3270   return PREV_INSN (insn);
3271 }
3272 #endif
3273
3274 #include "gt-cris.h"
3275
3276 /*
3277  * Local variables:
3278  * eval: (c-set-style "gnu")
3279  * indent-tabs-mode: t
3280  * End:
3281  */