OSDN Git Service

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