hooks.c (hook_int_rtx_mode_as_bool_0): New function.
[platform/upstream/gcc.git] / gcc / config / mcore / mcore.c
1 /* Output routines for Motorola MCore processor
2    Copyright (C) 1993, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
3    2009, 2010, 2011 Free Software Foundation, Inc.
4
5    This file is part of GCC.
6
7    GCC is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published
9    by the Free Software Foundation; either version 3, or (at your
10    option) any later version.
11
12    GCC is distributed in the hope that it will be useful, but WITHOUT
13    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15    License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GCC; see the file COPYING3.  If not see
19    <http://www.gnu.org/licenses/>.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "tm_p.h"
28 #include "mcore.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "output.h"
34 #include "insn-attr.h"
35 #include "flags.h"
36 #include "obstack.h"
37 #include "expr.h"
38 #include "reload.h"
39 #include "recog.h"
40 #include "function.h"
41 #include "ggc.h"
42 #include "diagnostic-core.h"
43 #include "target.h"
44 #include "target-def.h"
45 #include "df.h"
46
47 /* For dumping information about frame sizes.  */
48 char * mcore_current_function_name = 0;
49 long   mcore_current_compilation_timestamp = 0;
50
51 /* Global variables for machine-dependent things.  */
52
53 /* Provides the class number of the smallest class containing
54    reg number.  */
55 const enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER] =
56 {
57   GENERAL_REGS, ONLYR1_REGS,  LRW_REGS,     LRW_REGS,
58   LRW_REGS,     LRW_REGS,     LRW_REGS,     LRW_REGS,
59   LRW_REGS,     LRW_REGS,     LRW_REGS,     LRW_REGS,
60   LRW_REGS,     LRW_REGS,     LRW_REGS,     GENERAL_REGS,
61   GENERAL_REGS, C_REGS,       NO_REGS,      NO_REGS,
62 };
63
64 struct mcore_frame
65 {
66   int arg_size;                 /* Stdarg spills (bytes).  */
67   int reg_size;                 /* Non-volatile reg saves (bytes).  */
68   int reg_mask;                 /* Non-volatile reg saves.  */
69   int local_size;               /* Locals.  */
70   int outbound_size;            /* Arg overflow on calls out.  */
71   int pad_outbound;
72   int pad_local;
73   int pad_reg;
74   /* Describe the steps we'll use to grow it.  */
75 #define MAX_STACK_GROWS 4       /* Gives us some spare space.  */
76   int growth[MAX_STACK_GROWS];
77   int arg_offset;
78   int reg_offset;
79   int reg_growth;
80   int local_growth;
81 };
82
83 typedef enum
84 {
85   COND_NO,
86   COND_MOV_INSN,
87   COND_CLR_INSN,
88   COND_INC_INSN,
89   COND_DEC_INSN,
90   COND_BRANCH_INSN
91 }
92 cond_type;
93
94 static void       output_stack_adjust           (int, int);
95 static int        calc_live_regs                (int *);
96 static int        try_constant_tricks           (long, HOST_WIDE_INT *, HOST_WIDE_INT *);
97 static const char *     output_inline_const     (enum machine_mode, rtx *);
98 static void       layout_mcore_frame            (struct mcore_frame *);
99 static void       mcore_setup_incoming_varargs  (cumulative_args_t, enum machine_mode, tree, int *, int);
100 static cond_type  is_cond_candidate             (rtx);
101 static rtx        emit_new_cond_insn            (rtx, int);
102 static rtx        conditionalize_block          (rtx);
103 static void       conditionalize_optimization   (void);
104 static void       mcore_reorg                   (void);
105 static rtx        handle_structs_in_regs        (enum machine_mode, const_tree, int);
106 static void       mcore_mark_dllexport          (tree);
107 static void       mcore_mark_dllimport          (tree);
108 static int        mcore_dllexport_p             (tree);
109 static int        mcore_dllimport_p             (tree);
110 static tree       mcore_handle_naked_attribute  (tree *, tree, tree, int, bool *);
111 #ifdef OBJECT_FORMAT_ELF
112 static void       mcore_asm_named_section       (const char *,
113                                                  unsigned int, tree);
114 #endif
115 static void       mcore_print_operand           (FILE *, rtx, int);
116 static void       mcore_print_operand_address   (FILE *, rtx);
117 static bool       mcore_print_operand_punct_valid_p (unsigned char code);
118 static void       mcore_unique_section          (tree, int);
119 static void mcore_encode_section_info           (tree, rtx, int);
120 static const char *mcore_strip_name_encoding    (const char *);
121 static int        mcore_const_costs             (rtx, RTX_CODE);
122 static int        mcore_and_cost                (rtx);
123 static int        mcore_ior_cost                (rtx);
124 static bool       mcore_rtx_costs               (rtx, int, int, int,
125                                                  int *, bool);
126 static void       mcore_external_libcall        (rtx);
127 static bool       mcore_return_in_memory        (const_tree, const_tree);
128 static int        mcore_arg_partial_bytes       (cumulative_args_t,
129                                                  enum machine_mode,
130                                                  tree, bool);
131 static rtx        mcore_function_arg            (cumulative_args_t,
132                                                  enum machine_mode,
133                                                  const_tree, bool);
134 static void       mcore_function_arg_advance    (cumulative_args_t,
135                                                  enum machine_mode,
136                                                  const_tree, bool);
137 static unsigned int mcore_function_arg_boundary (enum machine_mode,
138                                                  const_tree);
139 static void       mcore_asm_trampoline_template (FILE *);
140 static void       mcore_trampoline_init         (rtx, tree, rtx);
141 static bool       mcore_warn_func_return        (tree);
142 static void       mcore_option_override         (void);
143 static bool       mcore_legitimate_constant_p   (enum machine_mode, rtx);
144 \f
145 /* MCore specific attributes.  */
146
147 static const struct attribute_spec mcore_attribute_table[] =
148 {
149   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
150        affects_type_identity } */
151   { "dllexport", 0, 0, true,  false, false, NULL, false },
152   { "dllimport", 0, 0, true,  false, false, NULL, false },
153   { "naked",     0, 0, true,  false, false, mcore_handle_naked_attribute,
154     false },
155   { NULL,        0, 0, false, false, false, NULL, false }
156 };
157 \f
158 /* Initialize the GCC target structure.  */
159 #undef  TARGET_ASM_EXTERNAL_LIBCALL
160 #define TARGET_ASM_EXTERNAL_LIBCALL     mcore_external_libcall
161
162 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
163 #undef  TARGET_MERGE_DECL_ATTRIBUTES
164 #define TARGET_MERGE_DECL_ATTRIBUTES    merge_dllimport_decl_attributes
165 #endif
166
167 #ifdef OBJECT_FORMAT_ELF
168 #undef  TARGET_ASM_UNALIGNED_HI_OP
169 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
170 #undef  TARGET_ASM_UNALIGNED_SI_OP
171 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
172 #endif
173
174 #undef  TARGET_PRINT_OPERAND
175 #define TARGET_PRINT_OPERAND            mcore_print_operand
176 #undef  TARGET_PRINT_OPERAND_ADDRESS
177 #define TARGET_PRINT_OPERAND_ADDRESS    mcore_print_operand_address
178 #undef  TARGET_PRINT_OPERAND_PUNCT_VALID_P
179 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P mcore_print_operand_punct_valid_p
180
181 #undef  TARGET_ATTRIBUTE_TABLE
182 #define TARGET_ATTRIBUTE_TABLE          mcore_attribute_table
183 #undef  TARGET_ASM_UNIQUE_SECTION
184 #define TARGET_ASM_UNIQUE_SECTION       mcore_unique_section
185 #undef  TARGET_ASM_FUNCTION_RODATA_SECTION
186 #define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
187 #undef  TARGET_ENCODE_SECTION_INFO
188 #define TARGET_ENCODE_SECTION_INFO      mcore_encode_section_info
189 #undef  TARGET_STRIP_NAME_ENCODING
190 #define TARGET_STRIP_NAME_ENCODING      mcore_strip_name_encoding
191 #undef  TARGET_RTX_COSTS
192 #define TARGET_RTX_COSTS                mcore_rtx_costs
193 #undef  TARGET_ADDRESS_COST
194 #define TARGET_ADDRESS_COST             hook_int_rtx_mode_as_bool_0
195 #undef  TARGET_MACHINE_DEPENDENT_REORG
196 #define TARGET_MACHINE_DEPENDENT_REORG  mcore_reorg
197
198 #undef  TARGET_PROMOTE_FUNCTION_MODE
199 #define TARGET_PROMOTE_FUNCTION_MODE    default_promote_function_mode_always_promote
200 #undef  TARGET_PROMOTE_PROTOTYPES
201 #define TARGET_PROMOTE_PROTOTYPES       hook_bool_const_tree_true
202
203 #undef  TARGET_RETURN_IN_MEMORY
204 #define TARGET_RETURN_IN_MEMORY         mcore_return_in_memory
205 #undef  TARGET_MUST_PASS_IN_STACK
206 #define TARGET_MUST_PASS_IN_STACK       must_pass_in_stack_var_size
207 #undef  TARGET_PASS_BY_REFERENCE
208 #define TARGET_PASS_BY_REFERENCE  hook_pass_by_reference_must_pass_in_stack
209 #undef  TARGET_ARG_PARTIAL_BYTES
210 #define TARGET_ARG_PARTIAL_BYTES        mcore_arg_partial_bytes
211 #undef  TARGET_FUNCTION_ARG
212 #define TARGET_FUNCTION_ARG             mcore_function_arg
213 #undef  TARGET_FUNCTION_ARG_ADVANCE
214 #define TARGET_FUNCTION_ARG_ADVANCE     mcore_function_arg_advance
215 #undef  TARGET_FUNCTION_ARG_BOUNDARY
216 #define TARGET_FUNCTION_ARG_BOUNDARY    mcore_function_arg_boundary
217
218 #undef  TARGET_SETUP_INCOMING_VARARGS
219 #define TARGET_SETUP_INCOMING_VARARGS   mcore_setup_incoming_varargs
220
221 #undef  TARGET_ASM_TRAMPOLINE_TEMPLATE
222 #define TARGET_ASM_TRAMPOLINE_TEMPLATE  mcore_asm_trampoline_template
223 #undef  TARGET_TRAMPOLINE_INIT
224 #define TARGET_TRAMPOLINE_INIT          mcore_trampoline_init
225
226 #undef TARGET_OPTION_OVERRIDE
227 #define TARGET_OPTION_OVERRIDE mcore_option_override
228
229 #undef TARGET_LEGITIMATE_CONSTANT_P
230 #define TARGET_LEGITIMATE_CONSTANT_P mcore_legitimate_constant_p
231
232 #undef TARGET_WARN_FUNC_RETURN
233 #define TARGET_WARN_FUNC_RETURN mcore_warn_func_return
234
235 struct gcc_target targetm = TARGET_INITIALIZER;
236 \f
237 /* Adjust the stack and return the number of bytes taken to do it.  */
238 static void
239 output_stack_adjust (int direction, int size)
240 {
241   /* If extending stack a lot, we do it incrementally.  */
242   if (direction < 0 && size > mcore_stack_increment && mcore_stack_increment > 0)
243     {
244       rtx tmp = gen_rtx_REG (SImode, 1);
245       rtx memref;
246
247       emit_insn (gen_movsi (tmp, GEN_INT (mcore_stack_increment)));
248       do
249         {
250           emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, tmp));
251           memref = gen_rtx_MEM (SImode, stack_pointer_rtx);
252           MEM_VOLATILE_P (memref) = 1;
253           emit_insn (gen_movsi (memref, stack_pointer_rtx));
254           size -= mcore_stack_increment;
255         }
256       while (size > mcore_stack_increment);
257
258       /* SIZE is now the residual for the last adjustment,
259          which doesn't require a probe.  */
260     }
261
262   if (size)
263     {
264       rtx insn;
265       rtx val = GEN_INT (size);
266
267       if (size > 32)
268         {
269           rtx nval = gen_rtx_REG (SImode, 1);
270           emit_insn (gen_movsi (nval, val));
271           val = nval;
272         }
273       
274       if (direction > 0)
275         insn = gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, val);
276       else
277         insn = gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, val);
278       
279       emit_insn (insn);
280     }
281 }
282
283 /* Work out the registers which need to be saved,
284    both as a mask and a count.  */
285
286 static int
287 calc_live_regs (int * count)
288 {
289   int reg;
290   int live_regs_mask = 0;
291   
292   * count = 0;
293
294   for (reg = 0; reg < FIRST_PSEUDO_REGISTER; reg++)
295     {
296       if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
297         {
298           (*count)++;
299           live_regs_mask |= (1 << reg);
300         }
301     }
302
303   return live_regs_mask;
304 }
305
306 /* Print the operand address in x to the stream.  */
307
308 static void
309 mcore_print_operand_address (FILE * stream, rtx x)
310 {
311   switch (GET_CODE (x))
312     {
313     case REG:
314       fprintf (stream, "(%s)", reg_names[REGNO (x)]);
315       break;
316       
317     case PLUS:
318       {
319         rtx base = XEXP (x, 0);
320         rtx index = XEXP (x, 1);
321
322         if (GET_CODE (base) != REG)
323           {
324             /* Ensure that BASE is a register (one of them must be).  */
325             rtx temp = base;
326             base = index;
327             index = temp;
328           }
329
330         switch (GET_CODE (index))
331           {
332           case CONST_INT:
333             fprintf (stream, "(%s," HOST_WIDE_INT_PRINT_DEC ")",
334                      reg_names[REGNO(base)], INTVAL (index));
335             break;
336
337           default:
338             gcc_unreachable ();
339           }
340       }
341
342       break;
343
344     default:
345       output_addr_const (stream, x);
346       break;
347     }
348 }
349
350 static bool
351 mcore_print_operand_punct_valid_p (unsigned char code)
352 {
353   return (code == '.' || code == '#' || code == '*' || code == '^'
354           || code == '!');
355 }
356
357 /* Print operand x (an rtx) in assembler syntax to file stream
358    according to modifier code.
359
360    'R'  print the next register or memory location along, i.e. the lsw in
361         a double word value
362    'O'  print a constant without the #
363    'M'  print a constant as its negative
364    'P'  print log2 of a power of two
365    'Q'  print log2 of an inverse of a power of two
366    'U'  print register for ldm/stm instruction
367    'X'  print byte number for xtrbN instruction.  */
368
369 static void
370 mcore_print_operand (FILE * stream, rtx x, int code)
371 {
372   switch (code)
373     {
374     case 'N':
375       if (INTVAL(x) == -1)
376         fprintf (asm_out_file, "32");
377       else
378         fprintf (asm_out_file, "%d", exact_log2 (INTVAL (x) + 1));
379       break;
380     case 'P':
381       fprintf (asm_out_file, "%d", exact_log2 (INTVAL (x) & 0xffffffff));
382       break;
383     case 'Q':
384       fprintf (asm_out_file, "%d", exact_log2 (~INTVAL (x)));
385       break;
386     case 'O':
387       fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
388       break;
389     case 'M':
390       fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, - INTVAL (x));
391       break;
392     case 'R':
393       /* Next location along in memory or register.  */
394       switch (GET_CODE (x))
395         {
396         case REG:
397           fputs (reg_names[REGNO (x) + 1], (stream));
398           break;
399         case MEM:
400           mcore_print_operand_address
401             (stream, XEXP (adjust_address (x, SImode, 4), 0));
402           break;
403         default:
404           gcc_unreachable ();
405         }
406       break;
407     case 'U':
408       fprintf (asm_out_file, "%s-%s", reg_names[REGNO (x)],
409                reg_names[REGNO (x) + 3]);
410       break;
411     case 'x':
412       fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
413       break;
414     case 'X':
415       fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, 3 - INTVAL (x) / 8);
416       break;
417
418     default:
419       switch (GET_CODE (x))
420         {
421         case REG:
422           fputs (reg_names[REGNO (x)], (stream));
423           break;
424         case MEM:
425           output_address (XEXP (x, 0));
426           break;
427         default:
428           output_addr_const (stream, x);
429           break;
430         }
431       break;
432     }
433 }
434
435 /* What does a constant cost ?  */
436
437 static int
438 mcore_const_costs (rtx exp, enum rtx_code code)
439 {
440   HOST_WIDE_INT val = INTVAL (exp);
441
442   /* Easy constants.  */
443   if (   CONST_OK_FOR_I (val)   
444       || CONST_OK_FOR_M (val)   
445       || CONST_OK_FOR_N (val)   
446       || (code == PLUS && CONST_OK_FOR_L (val)))
447     return 1;                                   
448   else if (code == AND
449            && (   CONST_OK_FOR_M (~val)
450                || CONST_OK_FOR_N (~val)))
451     return 2;
452   else if (code == PLUS                 
453            && (   CONST_OK_FOR_I (-val) 
454                || CONST_OK_FOR_M (-val) 
455                || CONST_OK_FOR_N (-val)))       
456     return 2;                                           
457
458   return 5;                                     
459 }
460
461 /* What does an and instruction cost - we do this b/c immediates may 
462    have been relaxed.   We want to ensure that cse will cse relaxed immeds
463    out.  Otherwise we'll get bad code (multiple reloads of the same const).  */
464
465 static int
466 mcore_and_cost (rtx x)
467 {
468   HOST_WIDE_INT val;
469
470   if (GET_CODE (XEXP (x, 1)) != CONST_INT)
471     return 2;
472
473   val = INTVAL (XEXP (x, 1));
474    
475   /* Do it directly.  */
476   if (CONST_OK_FOR_K (val) || CONST_OK_FOR_M (~val))
477     return 2;
478   /* Takes one instruction to load.  */
479   else if (const_ok_for_mcore (val))
480     return 3;
481   /* Takes two instructions to load.  */
482   else if (TARGET_HARDLIT && mcore_const_ok_for_inline (val))
483     return 4;
484
485   /* Takes a lrw to load.  */
486   return 5;
487 }
488
489 /* What does an or cost - see and_cost().  */
490
491 static int
492 mcore_ior_cost (rtx x)
493 {
494   HOST_WIDE_INT val;
495
496   if (GET_CODE (XEXP (x, 1)) != CONST_INT)
497     return 2;
498
499   val = INTVAL (XEXP (x, 1));
500
501   /* Do it directly with bclri.  */
502   if (CONST_OK_FOR_M (val))
503     return 2;
504   /* Takes one instruction to load.  */
505   else if (const_ok_for_mcore (val))
506     return 3;
507   /* Takes two instructions to load.  */
508   else if (TARGET_HARDLIT && mcore_const_ok_for_inline (val))
509     return 4;
510   
511   /* Takes a lrw to load.  */
512   return 5;
513 }
514
515 static bool
516 mcore_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
517                  int * total, bool speed ATTRIBUTE_UNUSED)
518 {
519   switch (code)
520     {
521     case CONST_INT:
522       *total = mcore_const_costs (x, (enum rtx_code) outer_code);
523       return true;
524     case CONST:
525     case LABEL_REF:
526     case SYMBOL_REF:
527       *total = 5;
528       return true;
529     case CONST_DOUBLE:
530       *total = 10;
531       return true;
532
533     case AND:
534       *total = COSTS_N_INSNS (mcore_and_cost (x));
535       return true;
536
537     case IOR:
538       *total = COSTS_N_INSNS (mcore_ior_cost (x));
539       return true;
540
541     case DIV:
542     case UDIV:
543     case MOD:
544     case UMOD:
545     case FLOAT:
546     case FIX:
547       *total = COSTS_N_INSNS (100);
548       return true;
549   
550     default:
551       return false;
552     }
553 }
554
555 /* Prepare the operands for a comparison.  Return whether the branch/setcc
556    should reverse the operands.  */
557
558 bool
559 mcore_gen_compare (enum rtx_code code, rtx op0, rtx op1)
560 {
561   rtx cc_reg = gen_rtx_REG (CCmode, CC_REG);
562   bool invert;
563
564   if (GET_CODE (op1) == CONST_INT)
565     {
566       HOST_WIDE_INT val = INTVAL (op1);
567       
568       switch (code)
569         {
570         case GTU:
571           /* Unsigned > 0 is the same as != 0; everything else is converted
572              below to LEU (reversed cmphs).  */
573           if (val == 0)
574             code = NE;
575           break;
576
577         /* Check whether (LE A imm) can become (LT A imm + 1),
578            or (GT A imm) can become (GE A imm + 1).  */
579         case GT:
580         case LE:
581           if (CONST_OK_FOR_J (val + 1))
582             {
583               op1 = GEN_INT (val + 1);
584               code = code == LE ? LT : GE;
585             }
586           break;
587           
588         default:
589           break;
590         }
591     }
592  
593   if (CONSTANT_P (op1) && GET_CODE (op1) != CONST_INT)
594     op1 = force_reg (SImode, op1);
595
596   /* cmpnei: 0-31 (K immediate)
597      cmplti: 1-32 (J immediate, 0 using btsti x,31).  */
598   invert = false;
599   switch (code)
600     {
601     case EQ:    /* Use inverted condition, cmpne.  */
602       code = NE;
603       invert = true;
604       /* Drop through.  */
605       
606     case NE:    /* Use normal condition, cmpne.  */
607       if (GET_CODE (op1) == CONST_INT && ! CONST_OK_FOR_K (INTVAL (op1)))
608         op1 = force_reg (SImode, op1);
609       break;
610
611     case LE:    /* Use inverted condition, reversed cmplt.  */
612       code = GT;
613       invert = true;
614       /* Drop through.  */
615       
616     case GT:    /* Use normal condition, reversed cmplt.  */
617       if (GET_CODE (op1) == CONST_INT)
618         op1 = force_reg (SImode, op1);
619       break;
620
621     case GE:    /* Use inverted condition, cmplt.  */
622       code = LT;
623       invert = true;
624       /* Drop through.  */
625       
626     case LT:    /* Use normal condition, cmplt.  */
627       if (GET_CODE (op1) == CONST_INT && 
628           /* covered by btsti x,31.  */
629           INTVAL (op1) != 0 &&
630           ! CONST_OK_FOR_J (INTVAL (op1)))
631         op1 = force_reg (SImode, op1);
632       break;
633
634     case GTU:   /* Use inverted condition, cmple.  */
635       /* We coped with unsigned > 0 above.  */
636       gcc_assert (GET_CODE (op1) != CONST_INT || INTVAL (op1) != 0);
637       code = LEU;
638       invert = true;
639       /* Drop through.  */
640       
641     case LEU:   /* Use normal condition, reversed cmphs.  */
642       if (GET_CODE (op1) == CONST_INT && INTVAL (op1) != 0)
643         op1 = force_reg (SImode, op1);
644       break;
645
646     case LTU:   /* Use inverted condition, cmphs.  */
647       code = GEU;
648       invert = true;
649       /* Drop through.  */
650       
651     case GEU:   /* Use normal condition, cmphs.  */
652       if (GET_CODE (op1) == CONST_INT && INTVAL (op1) != 0)
653         op1 = force_reg (SImode, op1);
654       break;
655
656     default:
657       break;
658     }
659
660   emit_insn (gen_rtx_SET (VOIDmode,
661                           cc_reg,
662                           gen_rtx_fmt_ee (code, CCmode, op0, op1)));
663   return invert;
664 }
665
666 int
667 mcore_symbolic_address_p (rtx x)
668 {
669   switch (GET_CODE (x))
670     {
671     case SYMBOL_REF:
672     case LABEL_REF:
673       return 1;
674     case CONST:
675       x = XEXP (x, 0);
676       return (   (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
677                || GET_CODE (XEXP (x, 0)) == LABEL_REF)
678               && GET_CODE (XEXP (x, 1)) == CONST_INT);
679     default:
680       return 0;
681     }
682 }
683
684 /* Functions to output assembly code for a function call.  */
685
686 char *
687 mcore_output_call (rtx operands[], int index)
688 {
689   static char buffer[20];
690   rtx addr = operands [index];
691   
692   if (REG_P (addr))
693     {
694       if (TARGET_CG_DATA)
695         {
696           gcc_assert (mcore_current_function_name);
697           
698           ASM_OUTPUT_CG_EDGE (asm_out_file, mcore_current_function_name,
699                               "unknown", 1);
700         }
701
702       sprintf (buffer, "jsr\t%%%d", index);
703     }
704   else
705     {
706       if (TARGET_CG_DATA)
707         {
708           gcc_assert (mcore_current_function_name);
709           gcc_assert (GET_CODE (addr) == SYMBOL_REF);
710           
711           ASM_OUTPUT_CG_EDGE (asm_out_file, mcore_current_function_name,
712                               XSTR (addr, 0), 0);
713         }
714       
715       sprintf (buffer, "jbsr\t%%%d", index);
716     }
717
718   return buffer;
719 }
720
721 /* Can we load a constant with a single instruction ?  */
722
723 int
724 const_ok_for_mcore (HOST_WIDE_INT value)
725 {
726   if (value >= 0 && value <= 127)
727     return 1;
728   
729   /* Try exact power of two.  */
730   if (CONST_OK_FOR_M (value))
731     return 1;
732   
733   /* Try exact power of two - 1.  */
734   if (CONST_OK_FOR_N (value) && value != -1)
735     return 1;
736   
737   return 0;
738 }
739
740 /* Can we load a constant inline with up to 2 instructions ?  */
741
742 int
743 mcore_const_ok_for_inline (HOST_WIDE_INT value)
744 {
745   HOST_WIDE_INT x, y;
746    
747   return try_constant_tricks (value, & x, & y) > 0;
748 }
749
750 /* Are we loading the constant using a not ?  */
751
752 int
753 mcore_const_trick_uses_not (HOST_WIDE_INT value)
754 {
755   HOST_WIDE_INT x, y;
756
757   return try_constant_tricks (value, & x, & y) == 2; 
758 }       
759
760 /* Try tricks to load a constant inline and return the trick number if
761    success (0 is non-inlinable).
762   
763    0: not inlinable
764    1: single instruction (do the usual thing)
765    2: single insn followed by a 'not'
766    3: single insn followed by a subi
767    4: single insn followed by an addi
768    5: single insn followed by rsubi
769    6: single insn followed by bseti
770    7: single insn followed by bclri
771    8: single insn followed by rotli
772    9: single insn followed by lsli
773    10: single insn followed by ixh
774    11: single insn followed by ixw.  */
775
776 static int
777 try_constant_tricks (HOST_WIDE_INT value, HOST_WIDE_INT * x, HOST_WIDE_INT * y)
778 {
779   HOST_WIDE_INT i;
780   unsigned HOST_WIDE_INT bit, shf, rot;
781
782   if (const_ok_for_mcore (value))
783     return 1;   /* Do the usual thing.  */
784   
785   if (! TARGET_HARDLIT) 
786     return 0;
787
788   if (const_ok_for_mcore (~value))
789     {
790       *x = ~value;
791       return 2;
792     }
793
794   for (i = 1; i <= 32; i++)
795     {
796       if (const_ok_for_mcore (value - i))
797         {
798           *x = value - i;
799           *y = i;
800
801           return 3;
802         }
803
804       if (const_ok_for_mcore (value + i))
805         {
806           *x = value + i;
807           *y = i;
808
809           return 4;
810         }
811     }
812
813   bit = 0x80000000ULL;
814
815   for (i = 0; i <= 31; i++)
816     {
817       if (const_ok_for_mcore (i - value))
818         {
819           *x = i - value;
820           *y = i;
821
822           return 5;
823         }
824
825       if (const_ok_for_mcore (value & ~bit))
826         {
827           *y = bit;
828           *x = value & ~bit;
829           return 6;
830         }
831
832       if (const_ok_for_mcore (value | bit))
833         {
834           *y = ~bit;
835           *x = value | bit;
836
837           return 7;
838         }
839
840       bit >>= 1;
841     }
842
843   shf = value;
844   rot = value;
845
846   for (i = 1; i < 31; i++)
847     {
848       int c;
849
850       /* MCore has rotate left.  */
851       c = rot << 31;
852       rot >>= 1;
853       rot &= 0x7FFFFFFF;
854       rot |= c;   /* Simulate rotate.  */
855
856       if (const_ok_for_mcore (rot))
857         {
858           *y = i;
859           *x = rot;
860
861           return 8;
862         }
863
864       if (shf & 1)
865         shf = 0;        /* Can't use logical shift, low order bit is one.  */
866
867       shf >>= 1;
868
869       if (shf != 0 && const_ok_for_mcore (shf))
870         {
871           *y = i;
872           *x = shf;
873
874           return 9;
875         }
876     }
877
878   if ((value % 3) == 0 && const_ok_for_mcore (value / 3))
879     {
880       *x = value / 3;
881
882       return 10;
883     }
884
885   if ((value % 5) == 0 && const_ok_for_mcore (value / 5))
886     {
887       *x = value / 5;
888
889       return 11;
890     }
891   
892   return 0;
893 }
894
895 /* Check whether reg is dead at first.  This is done by searching ahead
896    for either the next use (i.e., reg is live), a death note, or a set of
897    reg.  Don't just use dead_or_set_p() since reload does not always mark 
898    deaths (especially if PRESERVE_DEATH_NOTES_REGNO_P is not defined). We
899    can ignore subregs by extracting the actual register.  BRC  */
900
901 int
902 mcore_is_dead (rtx first, rtx reg)
903 {
904   rtx insn;
905
906   /* For mcore, subregs can't live independently of their parent regs.  */
907   if (GET_CODE (reg) == SUBREG)
908     reg = SUBREG_REG (reg);
909
910   /* Dies immediately.  */
911   if (dead_or_set_p (first, reg))
912     return 1;
913
914   /* Look for conclusive evidence of live/death, otherwise we have
915      to assume that it is live.  */
916   for (insn = NEXT_INSN (first); insn; insn = NEXT_INSN (insn))
917     {
918       if (GET_CODE (insn) == JUMP_INSN)
919         return 0;       /* We lose track, assume it is alive.  */
920
921       else if (GET_CODE(insn) == CALL_INSN)
922         {
923           /* Call's might use it for target or register parms.  */
924           if (reg_referenced_p (reg, PATTERN (insn))
925               || find_reg_fusage (insn, USE, reg))
926             return 0;
927           else if (dead_or_set_p (insn, reg))
928             return 1;
929         }
930       else if (GET_CODE (insn) == INSN)
931         {
932           if (reg_referenced_p (reg, PATTERN (insn)))
933             return 0;
934           else if (dead_or_set_p (insn, reg))
935             return 1;
936         }
937     }
938
939   /* No conclusive evidence either way, we cannot take the chance
940      that control flow hid the use from us -- "I'm not dead yet".  */
941   return 0;
942 }
943
944 /* Count the number of ones in mask.  */
945
946 int
947 mcore_num_ones (HOST_WIDE_INT mask)
948 {
949   /* A trick to count set bits recently posted on comp.compilers.  */
950   mask =  (mask >> 1  & 0x55555555) + (mask & 0x55555555);
951   mask = ((mask >> 2) & 0x33333333) + (mask & 0x33333333);
952   mask = ((mask >> 4) + mask) & 0x0f0f0f0f;
953   mask = ((mask >> 8) + mask);
954
955   return (mask + (mask >> 16)) & 0xff;
956 }
957
958 /* Count the number of zeros in mask.  */
959
960 int
961 mcore_num_zeros (HOST_WIDE_INT mask)
962 {
963   return 32 - mcore_num_ones (mask);
964 }
965
966 /* Determine byte being masked.  */
967
968 int
969 mcore_byte_offset (unsigned int mask)
970 {
971   if (mask == 0x00ffffffL)
972     return 0;
973   else if (mask == 0xff00ffffL)
974     return 1;
975   else if (mask == 0xffff00ffL)
976     return 2;
977   else if (mask == 0xffffff00L)
978     return 3;
979
980   return -1;
981 }
982
983 /* Determine halfword being masked.  */
984
985 int
986 mcore_halfword_offset (unsigned int mask)
987 {
988   if (mask == 0x0000ffffL)
989     return 0;
990   else if (mask == 0xffff0000L)
991     return 1;
992
993   return -1;
994 }
995
996 /* Output a series of bseti's corresponding to mask.  */
997
998 const char *
999 mcore_output_bseti (rtx dst, int mask)
1000 {
1001   rtx out_operands[2];
1002   int bit;
1003
1004   out_operands[0] = dst;
1005
1006   for (bit = 0; bit < 32; bit++)
1007     {
1008       if ((mask & 0x1) == 0x1)
1009         {
1010           out_operands[1] = GEN_INT (bit);
1011           
1012           output_asm_insn ("bseti\t%0,%1", out_operands);
1013         }
1014       mask >>= 1;
1015     }  
1016
1017   return "";
1018 }
1019
1020 /* Output a series of bclri's corresponding to mask.  */
1021
1022 const char *
1023 mcore_output_bclri (rtx dst, int mask)
1024 {
1025   rtx out_operands[2];
1026   int bit;
1027
1028   out_operands[0] = dst;
1029
1030   for (bit = 0; bit < 32; bit++)
1031     {
1032       if ((mask & 0x1) == 0x0)
1033         {
1034           out_operands[1] = GEN_INT (bit);
1035           
1036           output_asm_insn ("bclri\t%0,%1", out_operands);
1037         }
1038       
1039       mask >>= 1;
1040     }  
1041
1042   return "";
1043 }
1044
1045 /* Output a conditional move of two constants that are +/- 1 within each
1046    other.  See the "movtK" patterns in mcore.md.   I'm not sure this is
1047    really worth the effort.  */
1048
1049 const char *
1050 mcore_output_cmov (rtx operands[], int cmp_t, const char * test)
1051 {
1052   HOST_WIDE_INT load_value;
1053   HOST_WIDE_INT adjust_value;
1054   rtx out_operands[4];
1055
1056   out_operands[0] = operands[0];
1057
1058   /* Check to see which constant is loadable.  */
1059   if (const_ok_for_mcore (INTVAL (operands[1])))
1060     {
1061       out_operands[1] = operands[1];
1062       out_operands[2] = operands[2];
1063     }
1064   else if (const_ok_for_mcore (INTVAL (operands[2])))
1065     {
1066       out_operands[1] = operands[2];
1067       out_operands[2] = operands[1];
1068
1069       /* Complement test since constants are swapped.  */
1070       cmp_t = (cmp_t == 0);
1071     }
1072   load_value   = INTVAL (out_operands[1]);
1073   adjust_value = INTVAL (out_operands[2]);
1074
1075   /* First output the test if folded into the pattern.  */
1076
1077   if (test) 
1078     output_asm_insn (test, operands);
1079
1080   /* Load the constant - for now, only support constants that can be
1081      generated with a single instruction.  maybe add general inlinable
1082      constants later (this will increase the # of patterns since the
1083      instruction sequence has a different length attribute).  */
1084   if (load_value >= 0 && load_value <= 127)
1085     output_asm_insn ("movi\t%0,%1", out_operands);
1086   else if (CONST_OK_FOR_M (load_value))
1087     output_asm_insn ("bgeni\t%0,%P1", out_operands);
1088   else if (CONST_OK_FOR_N (load_value))
1089     output_asm_insn ("bmaski\t%0,%N1", out_operands);
1090    
1091   /* Output the constant adjustment.  */
1092   if (load_value > adjust_value)
1093     {
1094       if (cmp_t)
1095         output_asm_insn ("decf\t%0", out_operands);
1096       else
1097         output_asm_insn ("dect\t%0", out_operands);
1098     }
1099   else
1100     {
1101       if (cmp_t)
1102         output_asm_insn ("incf\t%0", out_operands);
1103       else
1104         output_asm_insn ("inct\t%0", out_operands);
1105     }
1106
1107   return "";
1108 }
1109
1110 /* Outputs the peephole for moving a constant that gets not'ed followed 
1111    by an and (i.e. combine the not and the and into andn). BRC  */
1112
1113 const char *
1114 mcore_output_andn (rtx insn ATTRIBUTE_UNUSED, rtx operands[])
1115 {
1116   HOST_WIDE_INT x, y;
1117   rtx out_operands[3];
1118   const char * load_op;
1119   char buf[256];
1120   int trick_no;
1121
1122   trick_no = try_constant_tricks (INTVAL (operands[1]), &x, &y);
1123   gcc_assert (trick_no == 2);
1124
1125   out_operands[0] = operands[0];
1126   out_operands[1] = GEN_INT (x);
1127   out_operands[2] = operands[2];
1128
1129   if (x >= 0 && x <= 127)
1130     load_op = "movi\t%0,%1";
1131   
1132   /* Try exact power of two.  */
1133   else if (CONST_OK_FOR_M (x))
1134     load_op = "bgeni\t%0,%P1";
1135   
1136   /* Try exact power of two - 1.  */
1137   else if (CONST_OK_FOR_N (x))
1138     load_op = "bmaski\t%0,%N1";
1139   
1140   else
1141     {
1142       load_op = "BADMOVI-andn\t%0, %1";
1143       gcc_unreachable ();
1144     }
1145
1146   sprintf (buf, "%s\n\tandn\t%%2,%%0", load_op);
1147   output_asm_insn (buf, out_operands);
1148
1149   return "";
1150 }
1151
1152 /* Output an inline constant.  */
1153
1154 static const char *
1155 output_inline_const (enum machine_mode mode, rtx operands[])
1156 {
1157   HOST_WIDE_INT x = 0, y = 0;
1158   int trick_no;
1159   rtx out_operands[3];
1160   char buf[256];
1161   char load_op[256];
1162   const char *dst_fmt;
1163   HOST_WIDE_INT value;
1164
1165   value = INTVAL (operands[1]);
1166
1167   trick_no = try_constant_tricks (value, &x, &y);
1168   /* lrw's are handled separately: Large inlinable constants never get
1169      turned into lrw's.  Our caller uses try_constant_tricks to back
1170      off to an lrw rather than calling this routine.  */
1171   gcc_assert (trick_no != 0);
1172   
1173   if (trick_no == 1)
1174     x = value;
1175
1176   /* operands: 0 = dst, 1 = load immed., 2 = immed. adjustment.  */
1177   out_operands[0] = operands[0];
1178   out_operands[1] = GEN_INT (x);
1179   
1180   if (trick_no > 2)
1181     out_operands[2] = GEN_INT (y);
1182
1183   /* Select dst format based on mode.  */
1184   if (mode == DImode && (! TARGET_LITTLE_END))
1185     dst_fmt = "%R0";
1186   else
1187     dst_fmt = "%0";
1188
1189   if (x >= 0 && x <= 127)
1190     sprintf (load_op, "movi\t%s,%%1", dst_fmt);
1191   
1192   /* Try exact power of two.  */
1193   else if (CONST_OK_FOR_M (x))
1194     sprintf (load_op, "bgeni\t%s,%%P1", dst_fmt);
1195   
1196   /* Try exact power of two - 1.  */
1197   else if (CONST_OK_FOR_N (x))
1198     sprintf (load_op, "bmaski\t%s,%%N1", dst_fmt);
1199   
1200   else
1201     {
1202       sprintf (load_op, "BADMOVI-inline_const %s, %%1", dst_fmt);
1203       gcc_unreachable ();
1204     }      
1205
1206   switch (trick_no)
1207     {
1208     case 1:
1209       strcpy (buf, load_op);
1210       break;
1211     case 2:   /* not */
1212       sprintf (buf, "%s\n\tnot\t%s\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1213       break;
1214     case 3:   /* add */
1215       sprintf (buf, "%s\n\taddi\t%s,%%2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1216       break;
1217     case 4:   /* sub */
1218       sprintf (buf, "%s\n\tsubi\t%s,%%2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1219       break;
1220     case 5:   /* rsub */
1221       /* Never happens unless -mrsubi, see try_constant_tricks().  */
1222       sprintf (buf, "%s\n\trsubi\t%s,%%2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1223       break;
1224     case 6:   /* bseti */
1225       sprintf (buf, "%s\n\tbseti\t%s,%%P2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1226       break;
1227     case 7:   /* bclr */
1228       sprintf (buf, "%s\n\tbclri\t%s,%%Q2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1229       break;
1230     case 8:   /* rotl */
1231       sprintf (buf, "%s\n\trotli\t%s,%%2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1232       break;
1233     case 9:   /* lsl */
1234       sprintf (buf, "%s\n\tlsli\t%s,%%2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1235       break;
1236     case 10:  /* ixh */
1237       sprintf (buf, "%s\n\tixh\t%s,%s\t// %ld 0x%lx", load_op, dst_fmt, dst_fmt, value, value);
1238       break;
1239     case 11:  /* ixw */
1240       sprintf (buf, "%s\n\tixw\t%s,%s\t// %ld 0x%lx", load_op, dst_fmt, dst_fmt, value, value);
1241       break;
1242     default:
1243       return "";
1244     }
1245   
1246   output_asm_insn (buf, out_operands);
1247
1248   return "";
1249 }
1250
1251 /* Output a move of a word or less value.  */
1252
1253 const char *
1254 mcore_output_move (rtx insn ATTRIBUTE_UNUSED, rtx operands[],
1255                    enum machine_mode mode ATTRIBUTE_UNUSED)
1256 {
1257   rtx dst = operands[0];
1258   rtx src = operands[1];
1259
1260   if (GET_CODE (dst) == REG)
1261     {
1262       if (GET_CODE (src) == REG)
1263         {               
1264           if (REGNO (src) == CC_REG)            /* r-c */
1265             return "mvc\t%0"; 
1266           else 
1267             return "mov\t%0,%1";                /* r-r*/
1268         }
1269       else if (GET_CODE (src) == MEM)
1270         {
1271           if (GET_CODE (XEXP (src, 0)) == LABEL_REF) 
1272             return "lrw\t%0,[%1]";              /* a-R */
1273           else
1274             switch (GET_MODE (src))             /* r-m */
1275               {
1276               case SImode:
1277                 return "ldw\t%0,%1";
1278               case HImode:
1279                 return "ld.h\t%0,%1";
1280               case QImode:
1281                 return "ld.b\t%0,%1";
1282               default:
1283                 gcc_unreachable ();
1284               }
1285         }
1286       else if (GET_CODE (src) == CONST_INT)
1287         {
1288           HOST_WIDE_INT x, y;
1289           
1290           if (CONST_OK_FOR_I (INTVAL (src)))       /* r-I */
1291             return "movi\t%0,%1";
1292           else if (CONST_OK_FOR_M (INTVAL (src)))  /* r-M */
1293             return "bgeni\t%0,%P1\t// %1 %x1";
1294           else if (CONST_OK_FOR_N (INTVAL (src)))  /* r-N */
1295             return "bmaski\t%0,%N1\t// %1 %x1";
1296           else if (try_constant_tricks (INTVAL (src), &x, &y))     /* R-P */
1297             return output_inline_const (SImode, operands);  /* 1-2 insns */
1298           else 
1299             return "lrw\t%0,%x1\t// %1";        /* Get it from literal pool.  */
1300         }
1301       else
1302         return "lrw\t%0, %1";                /* Into the literal pool.  */
1303     }
1304   else if (GET_CODE (dst) == MEM)               /* m-r */
1305     switch (GET_MODE (dst))
1306       {
1307       case SImode:
1308         return "stw\t%1,%0";
1309       case HImode:
1310         return "st.h\t%1,%0";
1311       case QImode:
1312         return "st.b\t%1,%0";
1313       default:
1314         gcc_unreachable ();
1315       }
1316
1317   gcc_unreachable ();
1318 }
1319
1320 /* Return a sequence of instructions to perform DI or DF move.
1321    Since the MCORE cannot move a DI or DF in one instruction, we have
1322    to take care when we see overlapping source and dest registers.  */
1323
1324 const char *
1325 mcore_output_movedouble (rtx operands[], enum machine_mode mode ATTRIBUTE_UNUSED)
1326 {
1327   rtx dst = operands[0];
1328   rtx src = operands[1];
1329
1330   if (GET_CODE (dst) == REG)
1331     {
1332       if (GET_CODE (src) == REG)
1333         {
1334           int dstreg = REGNO (dst);
1335           int srcreg = REGNO (src);
1336           
1337           /* Ensure the second source not overwritten.  */
1338           if (srcreg + 1 == dstreg)
1339             return "mov %R0,%R1\n\tmov  %0,%1";
1340           else
1341             return "mov %0,%1\n\tmov    %R0,%R1";
1342         }
1343       else if (GET_CODE (src) == MEM)
1344         {
1345           rtx memexp = memexp = XEXP (src, 0);
1346           int dstreg = REGNO (dst);
1347           int basereg = -1;
1348           
1349           if (GET_CODE (memexp) == LABEL_REF)
1350             return "lrw\t%0,[%1]\n\tlrw\t%R0,[%R1]";
1351           else if (GET_CODE (memexp) == REG) 
1352             basereg = REGNO (memexp);
1353           else if (GET_CODE (memexp) == PLUS)
1354             {
1355               if (GET_CODE (XEXP (memexp, 0)) == REG)
1356                 basereg = REGNO (XEXP (memexp, 0));
1357               else if (GET_CODE (XEXP (memexp, 1)) == REG)
1358                 basereg = REGNO (XEXP (memexp, 1));
1359               else
1360                 gcc_unreachable ();
1361             }
1362           else
1363             gcc_unreachable ();
1364
1365           /* ??? length attribute is wrong here.  */
1366           if (dstreg == basereg)
1367             {
1368               /* Just load them in reverse order.  */
1369               return "ldw\t%R0,%R1\n\tldw\t%0,%1";
1370               
1371               /* XXX: alternative: move basereg to basereg+1
1372                  and then fall through.  */
1373             }
1374           else
1375             return "ldw\t%0,%1\n\tldw\t%R0,%R1";
1376         }
1377       else if (GET_CODE (src) == CONST_INT)
1378         {
1379           if (TARGET_LITTLE_END)
1380             {
1381               if (CONST_OK_FOR_I (INTVAL (src)))
1382                 output_asm_insn ("movi  %0,%1", operands);
1383               else if (CONST_OK_FOR_M (INTVAL (src)))
1384                 output_asm_insn ("bgeni %0,%P1", operands);
1385               else if (CONST_OK_FOR_N (INTVAL (src)))
1386                 output_asm_insn ("bmaski        %0,%N1", operands);
1387               else
1388                 gcc_unreachable ();
1389
1390               if (INTVAL (src) < 0)
1391                 return "bmaski  %R0,32";
1392               else
1393                 return "movi    %R0,0";
1394             }
1395           else
1396             {
1397               if (CONST_OK_FOR_I (INTVAL (src)))
1398                 output_asm_insn ("movi  %R0,%1", operands);
1399               else if (CONST_OK_FOR_M (INTVAL (src)))
1400                 output_asm_insn ("bgeni %R0,%P1", operands);
1401               else if (CONST_OK_FOR_N (INTVAL (src)))
1402                 output_asm_insn ("bmaski        %R0,%N1", operands);
1403               else
1404                 gcc_unreachable ();
1405
1406               if (INTVAL (src) < 0)
1407                 return "bmaski  %0,32";
1408               else
1409                 return "movi    %0,0";
1410             }
1411         }
1412       else
1413         gcc_unreachable ();
1414     }
1415   else if (GET_CODE (dst) == MEM && GET_CODE (src) == REG)
1416     return "stw\t%1,%0\n\tstw\t%R1,%R0";
1417   else
1418     gcc_unreachable ();
1419 }
1420
1421 /* Predicates used by the templates.  */
1422
1423 int
1424 mcore_arith_S_operand (rtx op)
1425 {
1426   if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_M (~INTVAL (op)))
1427     return 1;
1428   
1429   return 0;
1430 }
1431
1432 /* Expand insert bit field.  BRC  */
1433
1434 int
1435 mcore_expand_insv (rtx operands[])
1436 {
1437   int width = INTVAL (operands[1]);
1438   int posn = INTVAL (operands[2]);
1439   int mask;
1440   rtx mreg, sreg, ereg;
1441
1442   /* To get width 1 insv, the test in store_bit_field() (expmed.c, line 191)
1443      for width==1 must be removed.  Look around line 368.  This is something
1444      we really want the md part to do.  */
1445   if (width == 1 && GET_CODE (operands[3]) == CONST_INT)
1446     {
1447       /* Do directly with bseti or bclri.  */
1448       /* RBE: 2/97 consider only low bit of constant.  */
1449       if ((INTVAL (operands[3]) & 1) == 0)
1450         {
1451           mask = ~(1 << posn);
1452           emit_insn (gen_rtx_SET (SImode, operands[0],
1453                               gen_rtx_AND (SImode, operands[0], GEN_INT (mask))));
1454         }
1455       else
1456         {
1457           mask = 1 << posn;
1458           emit_insn (gen_rtx_SET (SImode, operands[0],
1459                             gen_rtx_IOR (SImode, operands[0], GEN_INT (mask))));
1460         }
1461       
1462       return 1;
1463     }
1464
1465   /* Look at some bit-field placements that we aren't interested
1466      in handling ourselves, unless specifically directed to do so.  */
1467   if (! TARGET_W_FIELD)
1468     return 0;           /* Generally, give up about now.  */
1469
1470   if (width == 8 && posn % 8 == 0)
1471     /* Byte sized and aligned; let caller break it up.  */
1472     return 0;
1473   
1474   if (width == 16 && posn % 16 == 0)
1475     /* Short sized and aligned; let caller break it up.  */
1476     return 0;
1477
1478   /* The general case - we can do this a little bit better than what the
1479      machine independent part tries.  This will get rid of all the subregs
1480      that mess up constant folding in combine when working with relaxed
1481      immediates.  */
1482
1483   /* If setting the entire field, do it directly.  */
1484   if (GET_CODE (operands[3]) == CONST_INT
1485       && INTVAL (operands[3]) == ((1 << width) - 1))
1486     {
1487       mreg = force_reg (SImode, GEN_INT (INTVAL (operands[3]) << posn));
1488       emit_insn (gen_rtx_SET (SImode, operands[0],
1489                          gen_rtx_IOR (SImode, operands[0], mreg)));
1490       return 1;
1491     }
1492
1493   /* Generate the clear mask.  */
1494   mreg = force_reg (SImode, GEN_INT (~(((1 << width) - 1) << posn)));
1495
1496   /* Clear the field, to overlay it later with the source.  */
1497   emit_insn (gen_rtx_SET (SImode, operands[0], 
1498                       gen_rtx_AND (SImode, operands[0], mreg)));
1499
1500   /* If the source is constant 0, we've nothing to add back.  */
1501   if (GET_CODE (operands[3]) == CONST_INT && INTVAL (operands[3]) == 0)
1502     return 1;
1503
1504   /* XXX: Should we worry about more games with constant values?
1505      We've covered the high profile: set/clear single-bit and many-bit
1506      fields. How often do we see "arbitrary bit pattern" constants?  */
1507   sreg = copy_to_mode_reg (SImode, operands[3]);
1508
1509   /* Extract src as same width as dst (needed for signed values).  We
1510      always have to do this since we widen everything to SImode.
1511      We don't have to mask if we're shifting this up against the
1512      MSB of the register (e.g., the shift will push out any hi-order
1513      bits.  */
1514   if (width + posn != (int) GET_MODE_SIZE (SImode))
1515     {
1516       ereg = force_reg (SImode, GEN_INT ((1 << width) - 1));      
1517       emit_insn (gen_rtx_SET (SImode, sreg,
1518                           gen_rtx_AND (SImode, sreg, ereg)));
1519     }
1520
1521   /* Insert source value in dest.  */
1522   if (posn != 0)
1523     emit_insn (gen_rtx_SET (SImode, sreg,
1524                         gen_rtx_ASHIFT (SImode, sreg, GEN_INT (posn))));
1525   
1526   emit_insn (gen_rtx_SET (SImode, operands[0],
1527                       gen_rtx_IOR (SImode, operands[0], sreg)));
1528
1529   return 1;
1530 }
1531 \f
1532 /* ??? Block move stuff stolen from m88k.  This code has not been
1533    verified for correctness.  */
1534
1535 /* Emit code to perform a block move.  Choose the best method.
1536
1537    OPERANDS[0] is the destination.
1538    OPERANDS[1] is the source.
1539    OPERANDS[2] is the size.
1540    OPERANDS[3] is the alignment safe to use.  */
1541
1542 /* Emit code to perform a block move with an offset sequence of ldw/st
1543    instructions (..., ldw 0, stw 1, ldw 1, stw 0, ...).  SIZE and ALIGN are
1544    known constants.  DEST and SRC are registers.  OFFSET is the known
1545    starting point for the output pattern.  */
1546
1547 static const enum machine_mode mode_from_align[] =
1548 {
1549   VOIDmode, QImode, HImode, VOIDmode, SImode,
1550 };
1551
1552 static void
1553 block_move_sequence (rtx dst_mem, rtx src_mem, int size, int align)
1554 {
1555   rtx temp[2];
1556   enum machine_mode mode[2];
1557   int amount[2];
1558   bool active[2];
1559   int phase = 0;
1560   int next;
1561   int offset_ld = 0;
1562   int offset_st = 0;
1563   rtx x;
1564
1565   x = XEXP (dst_mem, 0);
1566   if (!REG_P (x))
1567     {
1568       x = force_reg (Pmode, x);
1569       dst_mem = replace_equiv_address (dst_mem, x);
1570     }
1571
1572   x = XEXP (src_mem, 0);
1573   if (!REG_P (x))
1574     {
1575       x = force_reg (Pmode, x);
1576       src_mem = replace_equiv_address (src_mem, x);
1577     }
1578
1579   active[0] = active[1] = false;
1580
1581   do
1582     {
1583       next = phase;
1584       phase ^= 1;
1585
1586       if (size > 0)
1587         {
1588           int next_amount;
1589
1590           next_amount = (size >= 4 ? 4 : (size >= 2 ? 2 : 1));
1591           next_amount = MIN (next_amount, align);
1592
1593           amount[next] = next_amount;
1594           mode[next] = mode_from_align[next_amount];
1595           temp[next] = gen_reg_rtx (mode[next]);
1596
1597           x = adjust_address (src_mem, mode[next], offset_ld);
1598           emit_insn (gen_rtx_SET (VOIDmode, temp[next], x));
1599
1600           offset_ld += next_amount;
1601           size -= next_amount;
1602           active[next] = true;
1603         }
1604
1605       if (active[phase])
1606         {
1607           active[phase] = false;
1608           
1609           x = adjust_address (dst_mem, mode[phase], offset_st);
1610           emit_insn (gen_rtx_SET (VOIDmode, x, temp[phase]));
1611
1612           offset_st += amount[phase];
1613         }
1614     }
1615   while (active[next]);
1616 }
1617
1618 bool
1619 mcore_expand_block_move (rtx *operands)
1620 {
1621   HOST_WIDE_INT align, bytes, max;
1622
1623   if (GET_CODE (operands[2]) != CONST_INT)
1624     return false;
1625
1626   bytes = INTVAL (operands[2]);
1627   align = INTVAL (operands[3]);
1628
1629   if (bytes <= 0)
1630     return false;
1631   if (align > 4)
1632     align = 4;
1633
1634   switch (align)
1635     {
1636     case 4:
1637       if (bytes & 1)
1638         max = 4*4;
1639       else if (bytes & 3)
1640         max = 8*4;
1641       else
1642         max = 16*4;
1643       break;
1644     case 2:
1645       max = 4*2;
1646       break;
1647     case 1:
1648       max = 4*1;
1649       break;
1650     default:
1651       gcc_unreachable ();
1652     }
1653
1654   if (bytes <= max)
1655     {
1656       block_move_sequence (operands[0], operands[1], bytes, align);
1657       return true;
1658     }
1659
1660   return false;
1661 }
1662 \f
1663
1664 /* Code to generate prologue and epilogue sequences.  */
1665 static int number_of_regs_before_varargs;
1666
1667 /* Set by TARGET_SETUP_INCOMING_VARARGS to indicate to prolog that this is
1668    for a varargs function.  */
1669 static int current_function_anonymous_args;
1670
1671 #define STACK_BYTES (STACK_BOUNDARY/BITS_PER_UNIT)
1672 #define STORE_REACH (64)        /* Maximum displace of word store + 4.  */
1673 #define ADDI_REACH (32)         /* Maximum addi operand.  */
1674
1675 static void
1676 layout_mcore_frame (struct mcore_frame * infp)
1677 {
1678   int n;
1679   unsigned int i;
1680   int nbytes;
1681   int regarg;
1682   int localregarg;
1683   int outbounds;
1684   unsigned int growths;
1685   int step;
1686
1687   /* Might have to spill bytes to re-assemble a big argument that
1688      was passed partially in registers and partially on the stack.  */
1689   nbytes = crtl->args.pretend_args_size;
1690   
1691   /* Determine how much space for spilled anonymous args (e.g., stdarg).  */
1692   if (current_function_anonymous_args)
1693     nbytes += (NPARM_REGS - number_of_regs_before_varargs) * UNITS_PER_WORD;
1694   
1695   infp->arg_size = nbytes;
1696
1697   /* How much space to save non-volatile registers we stomp.  */
1698   infp->reg_mask = calc_live_regs (& n);
1699   infp->reg_size = n * 4;
1700
1701   /* And the rest of it... locals and space for overflowed outbounds.  */
1702   infp->local_size = get_frame_size ();
1703   infp->outbound_size = crtl->outgoing_args_size;
1704
1705   /* Make sure we have a whole number of words for the locals.  */
1706   if (infp->local_size % STACK_BYTES)
1707     infp->local_size = (infp->local_size + STACK_BYTES - 1) & ~ (STACK_BYTES -1);
1708   
1709   /* Only thing we know we have to pad is the outbound space, since
1710      we've aligned our locals assuming that base of locals is aligned.  */
1711   infp->pad_local = 0;
1712   infp->pad_reg = 0;
1713   infp->pad_outbound = 0;
1714   if (infp->outbound_size % STACK_BYTES)
1715     infp->pad_outbound = STACK_BYTES - (infp->outbound_size % STACK_BYTES);
1716
1717   /* Now we see how we want to stage the prologue so that it does
1718      the most appropriate stack growth and register saves to either:
1719      (1) run fast,
1720      (2) reduce instruction space, or
1721      (3) reduce stack space.  */
1722   for (i = 0; i < ARRAY_SIZE (infp->growth); i++)
1723     infp->growth[i] = 0;
1724
1725   regarg      = infp->reg_size + infp->arg_size;
1726   localregarg = infp->local_size + regarg;
1727   outbounds   = infp->outbound_size + infp->pad_outbound;
1728   growths     = 0;
1729
1730   /* XXX: Consider one where we consider localregarg + outbound too! */
1731
1732   /* Frame of <= 32 bytes and using stm would get <= 2 registers.
1733      use stw's with offsets and buy the frame in one shot.  */
1734   if (localregarg <= ADDI_REACH
1735       && (infp->reg_size <= 8 || (infp->reg_mask & 0xc000) != 0xc000))
1736     {
1737       /* Make sure we'll be aligned.  */
1738       if (localregarg % STACK_BYTES)
1739         infp->pad_reg = STACK_BYTES - (localregarg % STACK_BYTES);
1740
1741       step = localregarg + infp->pad_reg;
1742       infp->reg_offset = infp->local_size;
1743       
1744       if (outbounds + step <= ADDI_REACH && !frame_pointer_needed)
1745         {
1746           step += outbounds;
1747           infp->reg_offset += outbounds;
1748           outbounds = 0;
1749         }
1750       
1751       infp->arg_offset = step - 4;
1752       infp->growth[growths++] = step;
1753       infp->reg_growth = growths;
1754       infp->local_growth = growths;
1755       
1756       /* If we haven't already folded it in.  */
1757       if (outbounds)
1758         infp->growth[growths++] = outbounds;
1759       
1760       goto finish;
1761     }
1762
1763   /* Frame can't be done with a single subi, but can be done with 2
1764      insns.  If the 'stm' is getting <= 2 registers, we use stw's and
1765      shift some of the stack purchase into the first subi, so both are
1766      single instructions.  */
1767   if (localregarg <= STORE_REACH
1768       && (infp->local_size > ADDI_REACH)
1769       && (infp->reg_size <= 8 || (infp->reg_mask & 0xc000) != 0xc000))
1770     {
1771       int all;
1772
1773       /* Make sure we'll be aligned; use either pad_reg or pad_local.  */
1774       if (localregarg % STACK_BYTES)
1775         infp->pad_reg = STACK_BYTES - (localregarg % STACK_BYTES);
1776
1777       all = localregarg + infp->pad_reg + infp->pad_local;
1778       step = ADDI_REACH;        /* As much up front as we can.  */
1779       if (step > all)
1780         step = all;
1781       
1782       /* XXX: Consider whether step will still be aligned; we believe so.  */
1783       infp->arg_offset = step - 4;
1784       infp->growth[growths++] = step;
1785       infp->reg_growth = growths;
1786       infp->reg_offset = step - infp->pad_reg - infp->reg_size;
1787       all -= step;
1788
1789       /* Can we fold in any space required for outbounds?  */
1790       if (outbounds + all <= ADDI_REACH && !frame_pointer_needed)
1791         {
1792           all += outbounds;
1793           outbounds = 0;
1794         }
1795
1796       /* Get the rest of the locals in place.  */
1797       step = all;
1798       infp->growth[growths++] = step;
1799       infp->local_growth = growths;
1800       all -= step;
1801
1802       gcc_assert (all == 0);
1803
1804       /* Finish off if we need to do so.  */
1805       if (outbounds)
1806         infp->growth[growths++] = outbounds;
1807       
1808       goto finish;
1809     }
1810
1811   /* Registers + args is nicely aligned, so we'll buy that in one shot.
1812      Then we buy the rest of the frame in 1 or 2 steps depending on
1813      whether we need a frame pointer.  */
1814   if ((regarg % STACK_BYTES) == 0)
1815     {
1816       infp->growth[growths++] = regarg;
1817       infp->reg_growth = growths;
1818       infp->arg_offset = regarg - 4;
1819       infp->reg_offset = 0;
1820
1821       if (infp->local_size % STACK_BYTES)
1822         infp->pad_local = STACK_BYTES - (infp->local_size % STACK_BYTES);
1823       
1824       step = infp->local_size + infp->pad_local;
1825       
1826       if (!frame_pointer_needed)
1827         {
1828           step += outbounds;
1829           outbounds = 0;
1830         }
1831       
1832       infp->growth[growths++] = step;
1833       infp->local_growth = growths;
1834
1835       /* If there's any left to be done.  */
1836       if (outbounds)
1837         infp->growth[growths++] = outbounds;
1838       
1839       goto finish;
1840     }
1841
1842   /* XXX: optimizations that we'll want to play with....
1843      -- regarg is not aligned, but it's a small number of registers;
1844         use some of localsize so that regarg is aligned and then 
1845         save the registers.  */
1846
1847   /* Simple encoding; plods down the stack buying the pieces as it goes.
1848      -- does not optimize space consumption.
1849      -- does not attempt to optimize instruction counts.
1850      -- but it is safe for all alignments.  */
1851   if (regarg % STACK_BYTES != 0)
1852     infp->pad_reg = STACK_BYTES - (regarg % STACK_BYTES);
1853   
1854   infp->growth[growths++] = infp->arg_size + infp->reg_size + infp->pad_reg;
1855   infp->reg_growth = growths;
1856   infp->arg_offset = infp->growth[0] - 4;
1857   infp->reg_offset = 0;
1858   
1859   if (frame_pointer_needed)
1860     {
1861       if (infp->local_size % STACK_BYTES != 0)
1862         infp->pad_local = STACK_BYTES - (infp->local_size % STACK_BYTES);
1863       
1864       infp->growth[growths++] = infp->local_size + infp->pad_local;
1865       infp->local_growth = growths;
1866       
1867       infp->growth[growths++] = outbounds;
1868     }
1869   else
1870     {
1871       if ((infp->local_size + outbounds) % STACK_BYTES != 0)
1872         infp->pad_local = STACK_BYTES - ((infp->local_size + outbounds) % STACK_BYTES);
1873       
1874       infp->growth[growths++] = infp->local_size + infp->pad_local + outbounds;
1875       infp->local_growth = growths;
1876     }
1877
1878   /* Anything else that we've forgotten?, plus a few consistency checks.  */
1879  finish:
1880   gcc_assert (infp->reg_offset >= 0);
1881   gcc_assert (growths <= MAX_STACK_GROWS);
1882   
1883   for (i = 0; i < growths; i++)
1884     gcc_assert (!(infp->growth[i] % STACK_BYTES));
1885 }
1886
1887 /* Define the offset between two registers, one to be eliminated, and
1888    the other its replacement, at the start of a routine.  */
1889
1890 int
1891 mcore_initial_elimination_offset (int from, int to)
1892 {
1893   int above_frame;
1894   int below_frame;
1895   struct mcore_frame fi;
1896
1897   layout_mcore_frame (& fi);
1898
1899   /* fp to ap */
1900   above_frame = fi.local_size + fi.pad_local + fi.reg_size + fi.pad_reg;
1901   /* sp to fp */
1902   below_frame = fi.outbound_size + fi.pad_outbound;
1903
1904   if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
1905     return above_frame;
1906
1907   if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
1908     return above_frame + below_frame;
1909
1910   if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
1911     return below_frame;
1912
1913   gcc_unreachable ();
1914 }
1915
1916 /* Keep track of some information about varargs for the prolog.  */
1917
1918 static void
1919 mcore_setup_incoming_varargs (cumulative_args_t args_so_far_v,
1920                               enum machine_mode mode, tree type,
1921                               int * ptr_pretend_size ATTRIBUTE_UNUSED,
1922                               int second_time ATTRIBUTE_UNUSED)
1923 {
1924   CUMULATIVE_ARGS *args_so_far = get_cumulative_args (args_so_far_v);
1925
1926   current_function_anonymous_args = 1;
1927
1928   /* We need to know how many argument registers are used before
1929      the varargs start, so that we can push the remaining argument
1930      registers during the prologue.  */
1931   number_of_regs_before_varargs = *args_so_far + mcore_num_arg_regs (mode, type);
1932   
1933   /* There is a bug somewhere in the arg handling code.
1934      Until I can find it this workaround always pushes the
1935      last named argument onto the stack.  */
1936   number_of_regs_before_varargs = *args_so_far;
1937   
1938   /* The last named argument may be split between argument registers
1939      and the stack.  Allow for this here.  */
1940   if (number_of_regs_before_varargs > NPARM_REGS)
1941     number_of_regs_before_varargs = NPARM_REGS;
1942 }
1943
1944 void
1945 mcore_expand_prolog (void)
1946 {
1947   struct mcore_frame fi;
1948   int space_allocated = 0;
1949   int growth = 0;
1950
1951   /* Find out what we're doing.  */
1952   layout_mcore_frame (&fi);
1953   
1954   space_allocated = fi.arg_size + fi.reg_size + fi.local_size +
1955     fi.outbound_size + fi.pad_outbound + fi.pad_local + fi.pad_reg;
1956
1957   if (TARGET_CG_DATA)
1958     {
1959       /* Emit a symbol for this routine's frame size.  */
1960       rtx x;
1961
1962       x = DECL_RTL (current_function_decl);
1963       
1964       gcc_assert (GET_CODE (x) == MEM);
1965       
1966       x = XEXP (x, 0);
1967       
1968       gcc_assert (GET_CODE (x) == SYMBOL_REF);
1969       
1970       free (mcore_current_function_name);
1971       
1972       mcore_current_function_name = xstrdup (XSTR (x, 0));
1973       
1974       ASM_OUTPUT_CG_NODE (asm_out_file, mcore_current_function_name, space_allocated);
1975
1976       if (cfun->calls_alloca)
1977         ASM_OUTPUT_CG_EDGE (asm_out_file, mcore_current_function_name, "alloca", 1);
1978
1979       /* 970425: RBE:
1980          We're looking at how the 8byte alignment affects stack layout
1981          and where we had to pad things. This emits information we can
1982          extract which tells us about frame sizes and the like.  */
1983       fprintf (asm_out_file,
1984                "\t.equ\t__$frame$info$_%s_$_%d_%d_x%x_%d_%d_%d,0\n",
1985                mcore_current_function_name,
1986                fi.arg_size, fi.reg_size, fi.reg_mask,
1987                fi.local_size, fi.outbound_size,
1988                frame_pointer_needed);
1989     }
1990
1991   if (mcore_naked_function_p ())
1992     return;
1993   
1994   /* Handle stdarg+regsaves in one shot: can't be more than 64 bytes.  */
1995   output_stack_adjust (-1, fi.growth[growth++]);        /* Grows it.  */
1996
1997   /* If we have a parameter passed partially in regs and partially in memory,
1998      the registers will have been stored to memory already in function.c.  So
1999      we only need to do something here for varargs functions.  */
2000   if (fi.arg_size != 0 && crtl->args.pretend_args_size == 0)
2001     {
2002       int offset;
2003       int rn = FIRST_PARM_REG + NPARM_REGS - 1;
2004       int remaining = fi.arg_size;
2005
2006       for (offset = fi.arg_offset; remaining >= 4; offset -= 4, rn--, remaining -= 4)
2007         {
2008           emit_insn (gen_movsi
2009                      (gen_rtx_MEM (SImode,
2010                                    plus_constant (Pmode, stack_pointer_rtx,
2011                                                   offset)),
2012                       gen_rtx_REG (SImode, rn)));
2013         }
2014     }
2015
2016   /* Do we need another stack adjustment before we do the register saves?  */
2017   if (growth < fi.reg_growth)
2018     output_stack_adjust (-1, fi.growth[growth++]);              /* Grows it.  */
2019
2020   if (fi.reg_size != 0)
2021     {
2022       int i;
2023       int offs = fi.reg_offset;
2024       
2025       for (i = 15; i >= 0; i--)
2026         {
2027           if (offs == 0 && i == 15 && ((fi.reg_mask & 0xc000) == 0xc000))
2028             {
2029               int first_reg = 15;
2030
2031               while (fi.reg_mask & (1 << first_reg))
2032                 first_reg--;
2033               first_reg++;
2034
2035               emit_insn (gen_store_multiple (gen_rtx_MEM (SImode, stack_pointer_rtx),
2036                                              gen_rtx_REG (SImode, first_reg),
2037                                              GEN_INT (16 - first_reg)));
2038
2039               i -= (15 - first_reg);
2040               offs += (16 - first_reg) * 4;
2041             }
2042           else if (fi.reg_mask & (1 << i))
2043             {
2044               emit_insn (gen_movsi
2045                          (gen_rtx_MEM (SImode,
2046                                        plus_constant (Pmode, stack_pointer_rtx,
2047                                                       offs)),
2048                           gen_rtx_REG (SImode, i)));
2049               offs += 4;
2050             }
2051         }
2052     }
2053
2054   /* Figure the locals + outbounds.  */
2055   if (frame_pointer_needed)
2056     {
2057       /* If we haven't already purchased to 'fp'.  */
2058       if (growth < fi.local_growth)
2059         output_stack_adjust (-1, fi.growth[growth++]);          /* Grows it.  */
2060       
2061       emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx));
2062
2063       /* ... and then go any remaining distance for outbounds, etc.  */
2064       if (fi.growth[growth])
2065         output_stack_adjust (-1, fi.growth[growth++]);
2066     }
2067   else
2068     {
2069       if (growth < fi.local_growth)
2070         output_stack_adjust (-1, fi.growth[growth++]);          /* Grows it.  */
2071       if (fi.growth[growth])
2072         output_stack_adjust (-1, fi.growth[growth++]);
2073     }
2074 }
2075
2076 void
2077 mcore_expand_epilog (void)
2078 {
2079   struct mcore_frame fi;
2080   int i;
2081   int offs;
2082   int growth = MAX_STACK_GROWS - 1 ;
2083
2084     
2085   /* Find out what we're doing.  */
2086   layout_mcore_frame(&fi);
2087
2088   if (mcore_naked_function_p ())
2089     return;
2090
2091   /* If we had a frame pointer, restore the sp from that.  */
2092   if (frame_pointer_needed)
2093     {
2094       emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
2095       growth = fi.local_growth - 1;
2096     }
2097   else
2098     {
2099       /* XXX: while loop should accumulate and do a single sell.  */
2100       while (growth >= fi.local_growth)
2101         {
2102           if (fi.growth[growth] != 0)
2103             output_stack_adjust (1, fi.growth[growth]);
2104           growth--;
2105         }
2106     }
2107
2108   /* Make sure we've shrunk stack back to the point where the registers
2109      were laid down. This is typically 0/1 iterations.  Then pull the
2110      register save information back off the stack.  */
2111   while (growth >= fi.reg_growth)
2112     output_stack_adjust ( 1, fi.growth[growth--]);
2113   
2114   offs = fi.reg_offset;
2115   
2116   for (i = 15; i >= 0; i--)
2117     {
2118       if (offs == 0 && i == 15 && ((fi.reg_mask & 0xc000) == 0xc000))
2119         {
2120           int first_reg;
2121
2122           /* Find the starting register.  */
2123           first_reg = 15;
2124           
2125           while (fi.reg_mask & (1 << first_reg))
2126             first_reg--;
2127           
2128           first_reg++;
2129
2130           emit_insn (gen_load_multiple (gen_rtx_REG (SImode, first_reg),
2131                                         gen_rtx_MEM (SImode, stack_pointer_rtx),
2132                                         GEN_INT (16 - first_reg)));
2133
2134           i -= (15 - first_reg);
2135           offs += (16 - first_reg) * 4;
2136         }
2137       else if (fi.reg_mask & (1 << i))
2138         {
2139           emit_insn (gen_movsi
2140                      (gen_rtx_REG (SImode, i),
2141                       gen_rtx_MEM (SImode,
2142                                    plus_constant (Pmode, stack_pointer_rtx,
2143                                                   offs))));
2144           offs += 4;
2145         }
2146     }
2147
2148   /* Give back anything else.  */
2149   /* XXX: Should accumulate total and then give it back.  */
2150   while (growth >= 0)
2151     output_stack_adjust ( 1, fi.growth[growth--]);
2152 }
2153 \f
2154 /* This code is borrowed from the SH port.  */
2155
2156 /* The MCORE cannot load a large constant into a register, constants have to
2157    come from a pc relative load.  The reference of a pc relative load
2158    instruction must be less than 1k in front of the instruction.  This
2159    means that we often have to dump a constant inside a function, and
2160    generate code to branch around it.
2161
2162    It is important to minimize this, since the branches will slow things
2163    down and make things bigger.
2164
2165    Worst case code looks like:
2166
2167    lrw   L1,r0
2168    br    L2
2169    align
2170    L1:   .long value
2171    L2:
2172    ..
2173
2174    lrw   L3,r0
2175    br    L4
2176    align
2177    L3:   .long value
2178    L4:
2179    ..
2180
2181    We fix this by performing a scan before scheduling, which notices which
2182    instructions need to have their operands fetched from the constant table
2183    and builds the table.
2184
2185    The algorithm is:
2186
2187    scan, find an instruction which needs a pcrel move.  Look forward, find the
2188    last barrier which is within MAX_COUNT bytes of the requirement.
2189    If there isn't one, make one.  Process all the instructions between
2190    the find and the barrier.
2191
2192    In the above example, we can tell that L3 is within 1k of L1, so
2193    the first move can be shrunk from the 2 insn+constant sequence into
2194    just 1 insn, and the constant moved to L3 to make:
2195
2196    lrw          L1,r0
2197    ..
2198    lrw          L3,r0
2199    bra          L4
2200    align
2201    L3:.long value
2202    L4:.long value
2203
2204    Then the second move becomes the target for the shortening process.  */
2205
2206 typedef struct
2207 {
2208   rtx value;                    /* Value in table.  */
2209   rtx label;                    /* Label of value.  */
2210 } pool_node;
2211
2212 /* The maximum number of constants that can fit into one pool, since
2213    the pc relative range is 0...1020 bytes and constants are at least 4
2214    bytes long.  We subtract 4 from the range to allow for the case where
2215    we need to add a branch/align before the constant pool.  */
2216
2217 #define MAX_COUNT 1016
2218 #define MAX_POOL_SIZE (MAX_COUNT/4)
2219 static pool_node pool_vector[MAX_POOL_SIZE];
2220 static int pool_size;
2221
2222 /* Dump out any constants accumulated in the final pass.  These
2223    will only be labels.  */
2224
2225 const char *
2226 mcore_output_jump_label_table (void)
2227 {
2228   int i;
2229
2230   if (pool_size)
2231     {
2232       fprintf (asm_out_file, "\t.align 2\n");
2233       
2234       for (i = 0; i < pool_size; i++)
2235         {
2236           pool_node * p = pool_vector + i;
2237
2238           (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (p->label));
2239           
2240           output_asm_insn (".long       %0", &p->value);
2241         }
2242       
2243       pool_size = 0;
2244     }
2245
2246   return "";
2247 }
2248
2249 /* Check whether insn is a candidate for a conditional.  */
2250
2251 static cond_type
2252 is_cond_candidate (rtx insn)
2253 {
2254   /* The only things we conditionalize are those that can be directly
2255      changed into a conditional.  Only bother with SImode items.  If 
2256      we wanted to be a little more aggressive, we could also do other
2257      modes such as DImode with reg-reg move or load 0.  */
2258   if (GET_CODE (insn) == INSN)
2259     {
2260       rtx pat = PATTERN (insn);
2261       rtx src, dst;
2262
2263       if (GET_CODE (pat) != SET)
2264         return COND_NO;
2265
2266       dst = XEXP (pat, 0);
2267
2268       if ((GET_CODE (dst) != REG &&
2269            GET_CODE (dst) != SUBREG) ||
2270           GET_MODE (dst) != SImode)
2271         return COND_NO;
2272   
2273       src = XEXP (pat, 1);
2274
2275       if ((GET_CODE (src) == REG ||
2276            (GET_CODE (src) == SUBREG &&
2277             GET_CODE (SUBREG_REG (src)) == REG)) &&
2278           GET_MODE (src) == SImode)
2279         return COND_MOV_INSN;
2280       else if (GET_CODE (src) == CONST_INT && 
2281                INTVAL (src) == 0)
2282         return COND_CLR_INSN;
2283       else if (GET_CODE (src) == PLUS &&
2284                (GET_CODE (XEXP (src, 0)) == REG ||
2285                 (GET_CODE (XEXP (src, 0)) == SUBREG &&
2286                  GET_CODE (SUBREG_REG (XEXP (src, 0))) == REG)) &&
2287                GET_MODE (XEXP (src, 0)) == SImode &&
2288                GET_CODE (XEXP (src, 1)) == CONST_INT &&
2289                INTVAL (XEXP (src, 1)) == 1)
2290         return COND_INC_INSN;
2291       else if (((GET_CODE (src) == MINUS &&
2292                  GET_CODE (XEXP (src, 1)) == CONST_INT &&
2293                  INTVAL( XEXP (src, 1)) == 1) ||
2294                 (GET_CODE (src) == PLUS &&
2295                  GET_CODE (XEXP (src, 1)) == CONST_INT &&
2296                  INTVAL (XEXP (src, 1)) == -1)) &&
2297                (GET_CODE (XEXP (src, 0)) == REG ||
2298                 (GET_CODE (XEXP (src, 0)) == SUBREG &&
2299                  GET_CODE (SUBREG_REG (XEXP (src, 0))) == REG)) &&
2300                GET_MODE (XEXP (src, 0)) == SImode)
2301         return COND_DEC_INSN;
2302
2303       /* Some insns that we don't bother with:
2304          (set (rx:DI) (ry:DI))
2305          (set (rx:DI) (const_int 0))
2306       */            
2307
2308     }
2309   else if (GET_CODE (insn) == JUMP_INSN &&
2310            GET_CODE (PATTERN (insn)) == SET &&
2311            GET_CODE (XEXP (PATTERN (insn), 1)) == LABEL_REF)
2312     return COND_BRANCH_INSN;
2313
2314   return COND_NO;
2315 }
2316
2317 /* Emit a conditional version of insn and replace the old insn with the
2318    new one.  Return the new insn if emitted.  */
2319
2320 static rtx
2321 emit_new_cond_insn (rtx insn, int cond)
2322 {
2323   rtx c_insn = 0;
2324   rtx pat, dst, src;
2325   cond_type num;
2326
2327   if ((num = is_cond_candidate (insn)) == COND_NO)
2328     return NULL;
2329
2330   pat = PATTERN (insn);
2331
2332   if (GET_CODE (insn) == INSN)
2333     {
2334       dst = SET_DEST (pat);
2335       src = SET_SRC (pat);
2336     }
2337   else
2338     {
2339       dst = JUMP_LABEL (insn);
2340       src = NULL_RTX;
2341     }
2342
2343   switch (num)
2344     {
2345     case COND_MOV_INSN: 
2346     case COND_CLR_INSN:
2347       if (cond)
2348         c_insn = gen_movt0 (dst, src, dst);
2349       else
2350         c_insn = gen_movt0 (dst, dst, src);
2351       break;
2352
2353     case COND_INC_INSN:
2354       if (cond)
2355         c_insn = gen_incscc (dst, dst);
2356       else
2357         c_insn = gen_incscc_false (dst, dst);
2358       break;
2359   
2360     case COND_DEC_INSN:
2361       if (cond)
2362         c_insn = gen_decscc (dst, dst);
2363       else
2364         c_insn = gen_decscc_false (dst, dst);
2365       break;
2366
2367     case COND_BRANCH_INSN:
2368       if (cond)
2369         c_insn = gen_branch_true (dst);
2370       else
2371         c_insn = gen_branch_false (dst);
2372       break;
2373
2374     default:
2375       return NULL;
2376     }
2377
2378   /* Only copy the notes if they exist.  */
2379   if (rtx_length [GET_CODE (c_insn)] >= 7 && rtx_length [GET_CODE (insn)] >= 7)
2380     {
2381       /* We really don't need to bother with the notes and links at this
2382          point, but go ahead and save the notes.  This will help is_dead()
2383          when applying peepholes (links don't matter since they are not
2384          used any more beyond this point for the mcore).  */
2385       REG_NOTES (c_insn) = REG_NOTES (insn);
2386     }
2387   
2388   if (num == COND_BRANCH_INSN)
2389     {
2390       /* For jumps, we need to be a little bit careful and emit the new jump
2391          before the old one and to update the use count for the target label.
2392          This way, the barrier following the old (uncond) jump will get
2393          deleted, but the label won't.  */
2394       c_insn = emit_jump_insn_before (c_insn, insn);
2395       
2396       ++ LABEL_NUSES (dst);
2397       
2398       JUMP_LABEL (c_insn) = dst;
2399     }
2400   else
2401     c_insn = emit_insn_after (c_insn, insn);
2402
2403   delete_insn (insn);
2404   
2405   return c_insn;
2406 }
2407
2408 /* Attempt to change a basic block into a series of conditional insns.  This
2409    works by taking the branch at the end of the 1st block and scanning for the 
2410    end of the 2nd block.  If all instructions in the 2nd block have cond.
2411    versions and the label at the start of block 3 is the same as the target
2412    from the branch at block 1, then conditionalize all insn in block 2 using
2413    the inverse condition of the branch at block 1.  (Note I'm bending the
2414    definition of basic block here.)
2415
2416    e.g., change:   
2417
2418                 bt      L2             <-- end of block 1 (delete)
2419                 mov     r7,r8          
2420                 addu    r7,1           
2421                 br      L3             <-- end of block 2
2422
2423         L2:     ...                    <-- start of block 3 (NUSES==1)
2424         L3:     ...
2425
2426    to:
2427
2428                 movf    r7,r8
2429                 incf    r7
2430                 bf      L3
2431
2432         L3:     ...
2433
2434    we can delete the L2 label if NUSES==1 and re-apply the optimization
2435    starting at the last instruction of block 2.  This may allow an entire
2436    if-then-else statement to be conditionalized.  BRC  */
2437 static rtx
2438 conditionalize_block (rtx first)
2439 {
2440   rtx insn;
2441   rtx br_pat;
2442   rtx end_blk_1_br = 0;
2443   rtx end_blk_2_insn = 0;
2444   rtx start_blk_3_lab = 0;
2445   int cond;
2446   int br_lab_num;
2447   int blk_size = 0;
2448
2449     
2450   /* Check that the first insn is a candidate conditional jump.  This is
2451      the one that we'll eliminate.  If not, advance to the next insn to
2452      try.  */
2453   if (GET_CODE (first) != JUMP_INSN ||
2454       GET_CODE (PATTERN (first)) != SET ||
2455       GET_CODE (XEXP (PATTERN (first), 1)) != IF_THEN_ELSE)
2456     return NEXT_INSN (first);
2457
2458   /* Extract some information we need.  */
2459   end_blk_1_br = first;
2460   br_pat = PATTERN (end_blk_1_br);
2461
2462   /* Complement the condition since we use the reverse cond. for the insns.  */
2463   cond = (GET_CODE (XEXP (XEXP (br_pat, 1), 0)) == EQ);
2464
2465   /* Determine what kind of branch we have.  */
2466   if (GET_CODE (XEXP (XEXP (br_pat, 1), 1)) == LABEL_REF)
2467     {
2468       /* A normal branch, so extract label out of first arm.  */
2469       br_lab_num = CODE_LABEL_NUMBER (XEXP (XEXP (XEXP (br_pat, 1), 1), 0));
2470     }
2471   else
2472     {
2473       /* An inverse branch, so extract the label out of the 2nd arm
2474          and complement the condition.  */
2475       cond = (cond == 0);
2476       br_lab_num = CODE_LABEL_NUMBER (XEXP (XEXP (XEXP (br_pat, 1), 2), 0));
2477     }
2478
2479   /* Scan forward for the start of block 2: it must start with a
2480      label and that label must be the same as the branch target
2481      label from block 1.  We don't care about whether block 2 actually
2482      ends with a branch or a label (an uncond. branch is 
2483      conditionalizable).  */
2484   for (insn = NEXT_INSN (first); insn; insn = NEXT_INSN (insn))
2485     {
2486       enum rtx_code code;
2487       
2488       code = GET_CODE (insn);
2489
2490       /* Look for the label at the start of block 3.  */
2491       if (code == CODE_LABEL && CODE_LABEL_NUMBER (insn) == br_lab_num)
2492         break;
2493
2494       /* Skip barriers, notes, and conditionalizable insns.  If the
2495          insn is not conditionalizable or makes this optimization fail,
2496          just return the next insn so we can start over from that point.  */
2497       if (code != BARRIER && code != NOTE && !is_cond_candidate (insn))
2498         return NEXT_INSN (insn);
2499      
2500       /* Remember the last real insn before the label (i.e. end of block 2).  */
2501       if (code == JUMP_INSN || code == INSN)
2502         {
2503           blk_size ++;
2504           end_blk_2_insn = insn;
2505         }
2506     }
2507
2508   if (!insn)
2509     return insn;
2510  
2511   /* It is possible for this optimization to slow performance if the blocks 
2512      are long.  This really depends upon whether the branch is likely taken 
2513      or not.  If the branch is taken, we slow performance in many cases.  But,
2514      if the branch is not taken, we always help performance (for a single 
2515      block, but for a double block (i.e. when the optimization is re-applied) 
2516      this is not true since the 'right thing' depends on the overall length of
2517      the collapsed block).  As a compromise, don't apply this optimization on 
2518      blocks larger than size 2 (unlikely for the mcore) when speed is important.
2519      the best threshold depends on the latencies of the instructions (i.e., 
2520      the branch penalty).  */
2521   if (optimize > 1 && blk_size > 2)
2522     return insn;
2523
2524   /* At this point, we've found the start of block 3 and we know that
2525      it is the destination of the branch from block 1.   Also, all
2526      instructions in the block 2 are conditionalizable.  So, apply the
2527      conditionalization and delete the branch.  */
2528   start_blk_3_lab = insn;   
2529    
2530   for (insn = NEXT_INSN (end_blk_1_br); insn != start_blk_3_lab; 
2531        insn = NEXT_INSN (insn))
2532     {
2533       rtx newinsn;
2534
2535       if (INSN_DELETED_P (insn))
2536         continue;
2537       
2538       /* Try to form a conditional variant of the instruction and emit it.  */
2539       if ((newinsn = emit_new_cond_insn (insn, cond)))
2540         {
2541           if (end_blk_2_insn == insn)
2542             end_blk_2_insn = newinsn;
2543
2544           insn = newinsn;
2545         }
2546     }
2547
2548   /* Note whether we will delete the label starting blk 3 when the jump
2549      gets deleted.  If so, we want to re-apply this optimization at the 
2550      last real instruction right before the label.  */
2551   if (LABEL_NUSES (start_blk_3_lab) == 1)
2552     {
2553       start_blk_3_lab = 0;
2554     }
2555
2556   /* ??? we probably should redistribute the death notes for this insn, esp.
2557      the death of cc, but it doesn't really matter this late in the game.
2558      The peepholes all use is_dead() which will find the correct death
2559      regardless of whether there is a note.  */
2560   delete_insn (end_blk_1_br);
2561
2562   if (! start_blk_3_lab)
2563     return end_blk_2_insn;
2564   
2565   /* Return the insn right after the label at the start of block 3.  */
2566   return NEXT_INSN (start_blk_3_lab);
2567 }
2568
2569 /* Apply the conditionalization of blocks optimization.  This is the
2570    outer loop that traverses through the insns scanning for a branch
2571    that signifies an opportunity to apply the optimization.  Note that
2572    this optimization is applied late.  If we could apply it earlier,
2573    say before cse 2, it may expose more optimization opportunities.  
2574    but, the pay back probably isn't really worth the effort (we'd have 
2575    to update all reg/flow/notes/links/etc to make it work - and stick it
2576    in before cse 2).  */
2577
2578 static void
2579 conditionalize_optimization (void)
2580 {
2581   rtx insn;
2582
2583   for (insn = get_insns (); insn; insn = conditionalize_block (insn))
2584     continue;
2585 }
2586
2587 /* This is to handle loads from the constant pool.  */
2588
2589 static void
2590 mcore_reorg (void)
2591 {
2592   /* Reset this variable.  */
2593   current_function_anonymous_args = 0;
2594   
2595   if (optimize == 0)
2596     return;
2597   
2598   /* Conditionalize blocks where we can.  */
2599   conditionalize_optimization ();
2600
2601   /* Literal pool generation is now pushed off until the assembler.  */
2602 }
2603
2604 \f
2605 /* Return true if X is something that can be moved directly into r15.  */
2606
2607 bool
2608 mcore_r15_operand_p (rtx x)
2609 {
2610   switch (GET_CODE (x))
2611     {
2612     case CONST_INT:
2613       return mcore_const_ok_for_inline (INTVAL (x));
2614
2615     case REG:
2616     case SUBREG:
2617     case MEM:
2618       return 1;
2619
2620     default:
2621       return 0;
2622     }
2623 }
2624
2625 /* Implement SECONDARY_RELOAD_CLASS.  If RCLASS contains r15, and we can't
2626    directly move X into it, use r1-r14 as a temporary.  */
2627
2628 enum reg_class
2629 mcore_secondary_reload_class (enum reg_class rclass,
2630                               enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
2631 {
2632   if (TEST_HARD_REG_BIT (reg_class_contents[rclass], 15)
2633       && !mcore_r15_operand_p (x))
2634     return LRW_REGS;
2635   return NO_REGS;
2636 }
2637
2638 /* Return the reg_class to use when reloading the rtx X into the class
2639    RCLASS.  If X is too complex to move directly into r15, prefer to
2640    use LRW_REGS instead.  */
2641
2642 enum reg_class
2643 mcore_reload_class (rtx x, enum reg_class rclass)
2644 {
2645   if (reg_class_subset_p (LRW_REGS, rclass) && !mcore_r15_operand_p (x))
2646     return LRW_REGS;
2647
2648   return rclass;
2649 }
2650
2651 /* Tell me if a pair of reg/subreg rtx's actually refer to the same
2652    register.  Note that the current version doesn't worry about whether
2653    they are the same mode or note (e.g., a QImode in r2 matches an HImode
2654    in r2 matches an SImode in r2. Might think in the future about whether
2655    we want to be able to say something about modes.  */
2656
2657 int
2658 mcore_is_same_reg (rtx x, rtx y)
2659 {
2660   /* Strip any and all of the subreg wrappers.  */
2661   while (GET_CODE (x) == SUBREG)
2662     x = SUBREG_REG (x);
2663   
2664   while (GET_CODE (y) == SUBREG)
2665     y = SUBREG_REG (y);
2666
2667   if (GET_CODE(x) == REG && GET_CODE(y) == REG && REGNO(x) == REGNO(y))
2668     return 1;
2669
2670   return 0;
2671 }
2672
2673 static void
2674 mcore_option_override (void)
2675 {
2676   /* Only the m340 supports little endian code.  */
2677   if (TARGET_LITTLE_END && ! TARGET_M340)
2678     target_flags |= MASK_M340;
2679 }
2680
2681 \f
2682 /* Compute the number of word sized registers needed to 
2683    hold a function argument of mode MODE and type TYPE.  */
2684
2685 int
2686 mcore_num_arg_regs (enum machine_mode mode, const_tree type)
2687 {
2688   int size;
2689
2690   if (targetm.calls.must_pass_in_stack (mode, type))
2691     return 0;
2692
2693   if (type && mode == BLKmode)
2694     size = int_size_in_bytes (type);
2695   else
2696     size = GET_MODE_SIZE (mode);
2697
2698   return ROUND_ADVANCE (size);
2699 }
2700
2701 static rtx
2702 handle_structs_in_regs (enum machine_mode mode, const_tree type, int reg)
2703 {
2704   int size;
2705
2706   /* The MCore ABI defines that a structure whose size is not a whole multiple
2707      of bytes is passed packed into registers (or spilled onto the stack if
2708      not enough registers are available) with the last few bytes of the
2709      structure being packed, left-justified, into the last register/stack slot.
2710      GCC handles this correctly if the last word is in a stack slot, but we
2711      have to generate a special, PARALLEL RTX if the last word is in an
2712      argument register.  */
2713   if (type
2714       && TYPE_MODE (type) == BLKmode
2715       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
2716       && (size = int_size_in_bytes (type)) > UNITS_PER_WORD
2717       && (size % UNITS_PER_WORD != 0)
2718       && (reg + mcore_num_arg_regs (mode, type) <= (FIRST_PARM_REG + NPARM_REGS)))
2719     {
2720       rtx    arg_regs [NPARM_REGS]; 
2721       int    nregs;
2722       rtx    result;
2723       rtvec  rtvec;
2724                      
2725       for (nregs = 0; size > 0; size -= UNITS_PER_WORD)
2726         {
2727           arg_regs [nregs] =
2728             gen_rtx_EXPR_LIST (SImode, gen_rtx_REG (SImode, reg ++),
2729                                GEN_INT (nregs * UNITS_PER_WORD));
2730           nregs ++;
2731         }
2732
2733       /* We assume here that NPARM_REGS == 6.  The assert checks this.  */
2734       gcc_assert (ARRAY_SIZE (arg_regs) == 6);
2735       rtvec = gen_rtvec (nregs, arg_regs[0], arg_regs[1], arg_regs[2],
2736                           arg_regs[3], arg_regs[4], arg_regs[5]);
2737       
2738       result = gen_rtx_PARALLEL (mode, rtvec);
2739       return result;
2740     }
2741   
2742   return gen_rtx_REG (mode, reg);
2743 }
2744
2745 rtx
2746 mcore_function_value (const_tree valtype, const_tree func)
2747 {
2748   enum machine_mode mode;
2749   int unsigned_p;
2750   
2751   mode = TYPE_MODE (valtype);
2752
2753   /* Since we promote return types, we must promote the mode here too.  */
2754   mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1);
2755   
2756   return handle_structs_in_regs (mode, valtype, FIRST_RET_REG);
2757 }
2758
2759 /* Define where to put the arguments to a function.
2760    Value is zero to push the argument on the stack,
2761    or a hard register in which to store the argument.
2762
2763    MODE is the argument's machine mode.
2764    TYPE is the data type of the argument (as a tree).
2765     This is null for libcalls where that information may
2766     not be available.
2767    CUM is a variable of type CUMULATIVE_ARGS which gives info about
2768     the preceding args and about the function being called.
2769    NAMED is nonzero if this argument is a named parameter
2770     (otherwise it is an extra parameter matching an ellipsis).
2771
2772    On MCore the first args are normally in registers
2773    and the rest are pushed.  Any arg that starts within the first
2774    NPARM_REGS words is at least partially passed in a register unless
2775    its data type forbids.  */
2776
2777 static rtx
2778 mcore_function_arg (cumulative_args_t cum, enum machine_mode mode,
2779                     const_tree type, bool named)
2780 {
2781   int arg_reg;
2782   
2783   if (! named || mode == VOIDmode)
2784     return 0;
2785
2786   if (targetm.calls.must_pass_in_stack (mode, type))
2787     return 0;
2788
2789   arg_reg = ROUND_REG (*get_cumulative_args (cum), mode);
2790   
2791   if (arg_reg < NPARM_REGS)
2792     return handle_structs_in_regs (mode, type, FIRST_PARM_REG + arg_reg);
2793
2794   return 0;
2795 }
2796
2797 static void
2798 mcore_function_arg_advance (cumulative_args_t cum_v, enum machine_mode mode,
2799                             const_tree type, bool named ATTRIBUTE_UNUSED)
2800 {
2801   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
2802
2803   *cum = (ROUND_REG (*cum, mode)
2804           + (int)named * mcore_num_arg_regs (mode, type));
2805 }
2806
2807 static unsigned int
2808 mcore_function_arg_boundary (enum machine_mode mode,
2809                              const_tree type ATTRIBUTE_UNUSED)
2810 {
2811   /* Doubles must be aligned to an 8 byte boundary.  */
2812   return (mode != BLKmode && GET_MODE_SIZE (mode) == 8
2813           ? BIGGEST_ALIGNMENT
2814           : PARM_BOUNDARY);
2815 }
2816
2817 /* Returns the number of bytes of argument registers required to hold *part*
2818    of a parameter of machine mode MODE and type TYPE (which may be NULL if
2819    the type is not known).  If the argument fits entirely in the argument
2820    registers, or entirely on the stack, then 0 is returned.  CUM is the
2821    number of argument registers already used by earlier parameters to
2822    the function.  */
2823
2824 static int
2825 mcore_arg_partial_bytes (cumulative_args_t cum, enum machine_mode mode,
2826                          tree type, bool named)
2827 {
2828   int reg = ROUND_REG (*get_cumulative_args (cum), mode);
2829
2830   if (named == 0)
2831     return 0;
2832
2833   if (targetm.calls.must_pass_in_stack (mode, type))
2834     return 0;
2835       
2836   /* REG is not the *hardware* register number of the register that holds
2837      the argument, it is the *argument* register number.  So for example,
2838      the first argument to a function goes in argument register 0, which
2839      translates (for the MCore) into hardware register 2.  The second
2840      argument goes into argument register 1, which translates into hardware
2841      register 3, and so on.  NPARM_REGS is the number of argument registers
2842      supported by the target, not the maximum hardware register number of
2843      the target.  */
2844   if (reg >= NPARM_REGS)
2845     return 0;
2846
2847   /* If the argument fits entirely in registers, return 0.  */
2848   if (reg + mcore_num_arg_regs (mode, type) <= NPARM_REGS)
2849     return 0;
2850
2851   /* The argument overflows the number of available argument registers.
2852      Compute how many argument registers have not yet been assigned to
2853      hold an argument.  */
2854   reg = NPARM_REGS - reg;
2855
2856   /* Return partially in registers and partially on the stack.  */
2857   return reg * UNITS_PER_WORD;
2858 }
2859 \f
2860 /* Return nonzero if SYMBOL is marked as being dllexport'd.  */
2861
2862 int
2863 mcore_dllexport_name_p (const char * symbol)
2864 {
2865   return symbol[0] == '@' && symbol[1] == 'e' && symbol[2] == '.';
2866 }
2867
2868 /* Return nonzero if SYMBOL is marked as being dllimport'd.  */
2869
2870 int
2871 mcore_dllimport_name_p (const char * symbol)
2872 {
2873   return symbol[0] == '@' && symbol[1] == 'i' && symbol[2] == '.';
2874 }
2875
2876 /* Mark a DECL as being dllexport'd.  */
2877
2878 static void
2879 mcore_mark_dllexport (tree decl)
2880 {
2881   const char * oldname;
2882   char * newname;
2883   rtx    rtlname;
2884   tree   idp;
2885
2886   rtlname = XEXP (DECL_RTL (decl), 0);
2887   
2888   if (GET_CODE (rtlname) == MEM)
2889     rtlname = XEXP (rtlname, 0);
2890   gcc_assert (GET_CODE (rtlname) == SYMBOL_REF);
2891   oldname = XSTR (rtlname, 0);
2892   
2893   if (mcore_dllexport_name_p (oldname))
2894     return;  /* Already done.  */
2895
2896   newname = XALLOCAVEC (char, strlen (oldname) + 4);
2897   sprintf (newname, "@e.%s", oldname);
2898
2899   /* We pass newname through get_identifier to ensure it has a unique
2900      address.  RTL processing can sometimes peek inside the symbol ref
2901      and compare the string's addresses to see if two symbols are
2902      identical.  */
2903   /* ??? At least I think that's why we do this.  */
2904   idp = get_identifier (newname);
2905
2906   XEXP (DECL_RTL (decl), 0) =
2907     gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
2908 }
2909
2910 /* Mark a DECL as being dllimport'd.  */
2911
2912 static void
2913 mcore_mark_dllimport (tree decl)
2914 {
2915   const char * oldname;
2916   char * newname;
2917   tree   idp;
2918   rtx    rtlname;
2919   rtx    newrtl;
2920
2921   rtlname = XEXP (DECL_RTL (decl), 0);
2922   
2923   if (GET_CODE (rtlname) == MEM)
2924     rtlname = XEXP (rtlname, 0);
2925   gcc_assert (GET_CODE (rtlname) == SYMBOL_REF);
2926   oldname = XSTR (rtlname, 0);
2927   
2928   gcc_assert (!mcore_dllexport_name_p (oldname));
2929   if (mcore_dllimport_name_p (oldname))
2930     return; /* Already done.  */
2931
2932   /* ??? One can well ask why we're making these checks here,
2933      and that would be a good question.  */
2934
2935   /* Imported variables can't be initialized.  */
2936   if (TREE_CODE (decl) == VAR_DECL
2937       && !DECL_VIRTUAL_P (decl)
2938       && DECL_INITIAL (decl))
2939     {
2940       error ("initialized variable %q+D is marked dllimport", decl);
2941       return;
2942     }
2943   
2944   /* `extern' needn't be specified with dllimport.
2945      Specify `extern' now and hope for the best.  Sigh.  */
2946   if (TREE_CODE (decl) == VAR_DECL
2947       /* ??? Is this test for vtables needed?  */
2948       && !DECL_VIRTUAL_P (decl))
2949     {
2950       DECL_EXTERNAL (decl) = 1;
2951       TREE_PUBLIC (decl) = 1;
2952     }
2953
2954   newname = XALLOCAVEC (char, strlen (oldname) + 11);
2955   sprintf (newname, "@i.__imp_%s", oldname);
2956
2957   /* We pass newname through get_identifier to ensure it has a unique
2958      address.  RTL processing can sometimes peek inside the symbol ref
2959      and compare the string's addresses to see if two symbols are
2960      identical.  */
2961   /* ??? At least I think that's why we do this.  */
2962   idp = get_identifier (newname);
2963
2964   newrtl = gen_rtx_MEM (Pmode,
2965                     gen_rtx_SYMBOL_REF (Pmode,
2966                              IDENTIFIER_POINTER (idp)));
2967   XEXP (DECL_RTL (decl), 0) = newrtl;
2968 }
2969
2970 static int
2971 mcore_dllexport_p (tree decl)
2972 {
2973   if (   TREE_CODE (decl) != VAR_DECL
2974       && TREE_CODE (decl) != FUNCTION_DECL)
2975     return 0;
2976
2977   return lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)) != 0;
2978 }
2979
2980 static int
2981 mcore_dllimport_p (tree decl)
2982 {
2983   if (   TREE_CODE (decl) != VAR_DECL
2984       && TREE_CODE (decl) != FUNCTION_DECL)
2985     return 0;
2986
2987   return lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl)) != 0;
2988 }
2989
2990 /* We must mark dll symbols specially.  Definitions of dllexport'd objects
2991    install some info in the .drective (PE) or .exports (ELF) sections.  */
2992
2993 static void
2994 mcore_encode_section_info (tree decl, rtx rtl ATTRIBUTE_UNUSED, int first ATTRIBUTE_UNUSED)
2995 {
2996   /* Mark the decl so we can tell from the rtl whether the object is
2997      dllexport'd or dllimport'd.  */
2998   if (mcore_dllexport_p (decl))
2999     mcore_mark_dllexport (decl);
3000   else if (mcore_dllimport_p (decl))
3001     mcore_mark_dllimport (decl);
3002   
3003   /* It might be that DECL has already been marked as dllimport, but
3004      a subsequent definition nullified that.  The attribute is gone
3005      but DECL_RTL still has @i.__imp_foo.  We need to remove that.  */
3006   else if ((TREE_CODE (decl) == FUNCTION_DECL
3007             || TREE_CODE (decl) == VAR_DECL)
3008            && DECL_RTL (decl) != NULL_RTX
3009            && GET_CODE (DECL_RTL (decl)) == MEM
3010            && GET_CODE (XEXP (DECL_RTL (decl), 0)) == MEM
3011            && GET_CODE (XEXP (XEXP (DECL_RTL (decl), 0), 0)) == SYMBOL_REF
3012            && mcore_dllimport_name_p (XSTR (XEXP (XEXP (DECL_RTL (decl), 0), 0), 0)))
3013     {
3014       const char * oldname = XSTR (XEXP (XEXP (DECL_RTL (decl), 0), 0), 0);
3015       tree idp = get_identifier (oldname + 9);
3016       rtx newrtl = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
3017
3018       XEXP (DECL_RTL (decl), 0) = newrtl;
3019
3020       /* We previously set TREE_PUBLIC and DECL_EXTERNAL.
3021          ??? We leave these alone for now.  */
3022     }
3023 }
3024
3025 /* Undo the effects of the above.  */
3026
3027 static const char *
3028 mcore_strip_name_encoding (const char * str)
3029 {
3030   return str + (str[0] == '@' ? 3 : 0);
3031 }
3032
3033 /* MCore specific attribute support.
3034    dllexport - for exporting a function/variable that will live in a dll
3035    dllimport - for importing a function/variable from a dll
3036    naked     - do not create a function prologue/epilogue.  */
3037
3038 /* Handle a "naked" attribute; arguments as in
3039    struct attribute_spec.handler.  */
3040
3041 static tree
3042 mcore_handle_naked_attribute (tree * node, tree name, tree args ATTRIBUTE_UNUSED,
3043                               int flags ATTRIBUTE_UNUSED, bool * no_add_attrs)
3044 {
3045   if (TREE_CODE (*node) != FUNCTION_DECL)
3046     {
3047       warning (OPT_Wattributes, "%qE attribute only applies to functions",
3048                name);
3049       *no_add_attrs = true;
3050     }
3051
3052   return NULL_TREE;
3053 }
3054
3055 /* ??? It looks like this is PE specific?  Oh well, this is what the
3056    old code did as well.  */
3057
3058 static void
3059 mcore_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
3060 {
3061   int len;
3062   const char * name;
3063   char * string;
3064   const char * prefix;
3065
3066   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
3067   
3068   /* Strip off any encoding in name.  */
3069   name = (* targetm.strip_name_encoding) (name);
3070
3071   /* The object is put in, for example, section .text$foo.
3072      The linker will then ultimately place them in .text
3073      (everything from the $ on is stripped).  */
3074   if (TREE_CODE (decl) == FUNCTION_DECL)
3075     prefix = ".text$";
3076   /* For compatibility with EPOC, we ignore the fact that the
3077      section might have relocs against it.  */
3078   else if (decl_readonly_section (decl, 0))
3079     prefix = ".rdata$";
3080   else
3081     prefix = ".data$";
3082   
3083   len = strlen (name) + strlen (prefix);
3084   string = XALLOCAVEC (char, len + 1);
3085   
3086   sprintf (string, "%s%s", prefix, name);
3087
3088   DECL_SECTION_NAME (decl) = build_string (len, string);
3089 }
3090
3091 int
3092 mcore_naked_function_p (void)
3093 {
3094   return lookup_attribute ("naked", DECL_ATTRIBUTES (current_function_decl)) != NULL_TREE;
3095 }
3096
3097 static bool
3098 mcore_warn_func_return (tree decl)
3099 {
3100   /* Naked functions are implemented entirely in assembly, including the
3101      return sequence, so suppress warnings about this.  */
3102   return lookup_attribute ("naked", DECL_ATTRIBUTES (decl)) == NULL_TREE;
3103 }
3104
3105 #ifdef OBJECT_FORMAT_ELF
3106 static void
3107 mcore_asm_named_section (const char *name, 
3108                          unsigned int flags ATTRIBUTE_UNUSED,
3109                          tree decl ATTRIBUTE_UNUSED)
3110 {
3111   fprintf (asm_out_file, "\t.section %s\n", name);
3112 }
3113 #endif /* OBJECT_FORMAT_ELF */
3114
3115 /* Worker function for TARGET_ASM_EXTERNAL_LIBCALL.  */
3116
3117 static void
3118 mcore_external_libcall (rtx fun)
3119 {
3120   fprintf (asm_out_file, "\t.import\t");
3121   assemble_name (asm_out_file, XSTR (fun, 0));
3122   fprintf (asm_out_file, "\n");
3123 }
3124
3125 /* Worker function for TARGET_RETURN_IN_MEMORY.  */
3126
3127 static bool
3128 mcore_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
3129 {
3130   const HOST_WIDE_INT size = int_size_in_bytes (type);
3131   return (size == -1 || size > 2 * UNITS_PER_WORD);
3132 }
3133
3134 /* Worker function for TARGET_ASM_TRAMPOLINE_TEMPLATE.
3135    Output assembler code for a block containing the constant parts
3136    of a trampoline, leaving space for the variable parts.
3137
3138    On the MCore, the trampoline looks like:
3139         lrw     r1,  function
3140         lrw     r13, area
3141         jmp     r13
3142         or      r0, r0
3143     .literals                                                */
3144
3145 static void
3146 mcore_asm_trampoline_template (FILE *f)
3147 {
3148   fprintf (f, "\t.short 0x7102\n");
3149   fprintf (f, "\t.short 0x7d02\n");
3150   fprintf (f, "\t.short 0x00cd\n");
3151   fprintf (f, "\t.short 0x1e00\n");
3152   fprintf (f, "\t.long  0\n");
3153   fprintf (f, "\t.long  0\n");
3154 }
3155
3156 /* Worker function for TARGET_TRAMPOLINE_INIT.  */
3157
3158 static void
3159 mcore_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
3160 {
3161   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
3162   rtx mem;
3163
3164   emit_block_move (m_tramp, assemble_trampoline_template (),
3165                    GEN_INT (2*UNITS_PER_WORD), BLOCK_OP_NORMAL);
3166
3167   mem = adjust_address (m_tramp, SImode, 8);
3168   emit_move_insn (mem, chain_value);
3169   mem = adjust_address (m_tramp, SImode, 12);
3170   emit_move_insn (mem, fnaddr);
3171 }
3172
3173 /* Implement TARGET_LEGITIMATE_CONSTANT_P
3174
3175    On the MCore, allow anything but a double.  */
3176
3177 static bool
3178 mcore_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
3179 {
3180   return GET_CODE (x) != CONST_DOUBLE;
3181 }