OSDN Git Service

config/m32r/m32r-protos.h: Remove the prototypes for
[pf3gnuchains/gcc-fork.git] / gcc / config / m32r / m32r.c
1 /* Subroutines used for code generation on the Renesas M32R cpu.
2    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3    2005 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 2, 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 COPYING.  If not, write to
19    the Free Software Foundation, 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "rtl.h"
28 #include "regs.h"
29 #include "hard-reg-set.h"
30 #include "real.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "output.h"
34 #include "insn-attr.h"
35 #include "flags.h"
36 #include "expr.h"
37 #include "function.h"
38 #include "recog.h"
39 #include "toplev.h"
40 #include "ggc.h"
41 #include "integrate.h"
42 #include "tm_p.h"
43 #include "target.h"
44 #include "target-def.h"
45
46 /* Save the operands last given to a compare for use when we
47    generate a scc or bcc insn.  */
48 rtx m32r_compare_op0, m32r_compare_op1;
49
50 /* Array of valid operand punctuation characters.  */
51 char m32r_punct_chars[256];
52
53 /* Selected code model.  */
54 const char * m32r_model_string = M32R_MODEL_DEFAULT;
55 enum m32r_model m32r_model;
56
57 /* Selected SDA support.  */
58 const char * m32r_sdata_string = M32R_SDATA_DEFAULT;
59 enum m32r_sdata m32r_sdata;
60
61 /* Machine-specific symbol_ref flags.  */
62 #define SYMBOL_FLAG_MODEL_SHIFT         SYMBOL_FLAG_MACH_DEP_SHIFT
63 #define SYMBOL_REF_MODEL(X) \
64   ((enum m32r_model) ((SYMBOL_REF_FLAGS (X) >> SYMBOL_FLAG_MODEL_SHIFT) & 3))
65
66 /* For string literals, etc.  */
67 #define LIT_NAME_P(NAME) ((NAME)[0] == '*' && (NAME)[1] == '.')
68
69 /* Cache-flush support. Cache-flush is used at trampoline.
70    Default cache-flush is "trap 12".
71     default cache-flush function is "_flush_cache"  (CACHE_FLUSH_FUNC)
72     default cache-flush trap-interrupt number is "12". (CACHE_FLUSH_TRAP)
73    You can change how to generate code of cache-flush with following options.
74    -flush-func=FLUSH-FUNC-NAME
75    -no-flush-func
76    -fluch-trap=TRAP-NUMBER
77    -no-flush-trap.  */
78 const char *m32r_cache_flush_func = CACHE_FLUSH_FUNC;
79 const char *m32r_cache_flush_trap_string = CACHE_FLUSH_TRAP;
80 int m32r_cache_flush_trap = 12;
81
82 /* Forward declaration.  */
83 static void  init_reg_tables (void);
84 static void  block_move_call (rtx, rtx, rtx);
85 static int   m32r_is_insn (rtx);
86 const struct attribute_spec m32r_attribute_table[];
87 static tree  m32r_handle_model_attribute (tree *, tree, tree, int, bool *);
88 static void  m32r_output_function_prologue (FILE *, HOST_WIDE_INT);
89 static void  m32r_output_function_epilogue (FILE *, HOST_WIDE_INT);
90
91 static void  m32r_file_start (void);
92
93 static int    m32r_adjust_priority (rtx, int);
94 static int    m32r_issue_rate (void);
95
96 static void m32r_encode_section_info (tree, rtx, int);
97 static bool m32r_in_small_data_p (tree);
98 static bool m32r_return_in_memory (tree, tree);
99 static void m32r_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
100                                          tree, int *, int);
101 static void init_idents (void);
102 static bool m32r_rtx_costs (rtx, int, int, int *);
103 static bool m32r_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
104                                     tree, bool);
105 static int m32r_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
106                                    tree, bool);
107 \f
108 /* Initialize the GCC target structure.  */
109 #undef  TARGET_ATTRIBUTE_TABLE
110 #define TARGET_ATTRIBUTE_TABLE m32r_attribute_table
111
112 #undef  TARGET_ASM_ALIGNED_HI_OP
113 #define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
114 #undef  TARGET_ASM_ALIGNED_SI_OP
115 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
116
117 #undef  TARGET_ASM_FUNCTION_PROLOGUE
118 #define TARGET_ASM_FUNCTION_PROLOGUE m32r_output_function_prologue
119 #undef  TARGET_ASM_FUNCTION_EPILOGUE
120 #define TARGET_ASM_FUNCTION_EPILOGUE m32r_output_function_epilogue
121
122 #undef  TARGET_ASM_FILE_START
123 #define TARGET_ASM_FILE_START m32r_file_start
124
125 #undef  TARGET_SCHED_ADJUST_PRIORITY
126 #define TARGET_SCHED_ADJUST_PRIORITY m32r_adjust_priority
127 #undef  TARGET_SCHED_ISSUE_RATE
128 #define TARGET_SCHED_ISSUE_RATE m32r_issue_rate
129
130 #undef  TARGET_ENCODE_SECTION_INFO
131 #define TARGET_ENCODE_SECTION_INFO m32r_encode_section_info
132 #undef  TARGET_IN_SMALL_DATA_P
133 #define TARGET_IN_SMALL_DATA_P m32r_in_small_data_p
134
135 #undef  TARGET_RTX_COSTS
136 #define TARGET_RTX_COSTS m32r_rtx_costs
137 #undef  TARGET_ADDRESS_COST
138 #define TARGET_ADDRESS_COST hook_int_rtx_0
139
140 #undef  TARGET_PROMOTE_PROTOTYPES
141 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
142 #undef  TARGET_RETURN_IN_MEMORY
143 #define TARGET_RETURN_IN_MEMORY m32r_return_in_memory
144 #undef  TARGET_SETUP_INCOMING_VARARGS
145 #define TARGET_SETUP_INCOMING_VARARGS m32r_setup_incoming_varargs
146 #undef  TARGET_MUST_PASS_IN_STACK
147 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
148 #undef  TARGET_PASS_BY_REFERENCE
149 #define TARGET_PASS_BY_REFERENCE m32r_pass_by_reference
150 #undef  TARGET_ARG_PARTIAL_BYTES
151 #define TARGET_ARG_PARTIAL_BYTES m32r_arg_partial_bytes
152
153 struct gcc_target targetm = TARGET_INITIALIZER;
154 \f
155 /* Called by OVERRIDE_OPTIONS to initialize various things.  */
156
157 void
158 m32r_init (void)
159 {
160   init_reg_tables ();
161
162   /* Initialize array for PRINT_OPERAND_PUNCT_VALID_P.  */
163   memset (m32r_punct_chars, 0, sizeof (m32r_punct_chars));
164   m32r_punct_chars['#'] = 1;
165   m32r_punct_chars['@'] = 1; /* ??? no longer used */
166
167   /* Provide default value if not specified.  */
168   if (!g_switch_set)
169     g_switch_value = SDATA_DEFAULT_SIZE;
170
171   if (strcmp (m32r_model_string, "small") == 0)
172     m32r_model = M32R_MODEL_SMALL;
173   else if (strcmp (m32r_model_string, "medium") == 0)
174     m32r_model = M32R_MODEL_MEDIUM;
175   else if (strcmp (m32r_model_string, "large") == 0)
176     m32r_model = M32R_MODEL_LARGE;
177   else
178     error ("bad value (%s) for -mmodel switch", m32r_model_string);
179
180   if (strcmp (m32r_sdata_string, "none") == 0)
181     m32r_sdata = M32R_SDATA_NONE;
182   else if (strcmp (m32r_sdata_string, "sdata") == 0)
183     m32r_sdata = M32R_SDATA_SDATA;
184   else if (strcmp (m32r_sdata_string, "use") == 0)
185     m32r_sdata = M32R_SDATA_USE;
186   else
187     error ("bad value (%s) for -msdata switch", m32r_sdata_string);
188
189   if (m32r_cache_flush_trap_string)
190     {
191       /* Change trap-number (12) for cache-flush to the others (0 - 15).  */
192       m32r_cache_flush_trap = atoi (m32r_cache_flush_trap_string);
193       if (m32r_cache_flush_trap < 0 || m32r_cache_flush_trap > 15)
194         error ("bad value (%s) for -flush-trap=n (0=<n<=15)",
195                m32r_cache_flush_trap_string);
196     }
197 }
198
199 /* Vectors to keep interesting information about registers where it can easily
200    be got.  We use to use the actual mode value as the bit number, but there
201    is (or may be) more than 32 modes now.  Instead we use two tables: one
202    indexed by hard register number, and one indexed by mode.  */
203
204 /* The purpose of m32r_mode_class is to shrink the range of modes so that
205    they all fit (as bit numbers) in a 32 bit word (again).  Each real mode is
206    mapped into one m32r_mode_class mode.  */
207
208 enum m32r_mode_class
209 {
210   C_MODE,
211   S_MODE, D_MODE, T_MODE, O_MODE,
212   SF_MODE, DF_MODE, TF_MODE, OF_MODE, A_MODE
213 };
214
215 /* Modes for condition codes.  */
216 #define C_MODES (1 << (int) C_MODE)
217
218 /* Modes for single-word and smaller quantities.  */
219 #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
220
221 /* Modes for double-word and smaller quantities.  */
222 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
223
224 /* Modes for quad-word and smaller quantities.  */
225 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
226
227 /* Modes for accumulators.  */
228 #define A_MODES (1 << (int) A_MODE)
229
230 /* Value is 1 if register/mode pair is acceptable on arc.  */
231
232 const unsigned int m32r_hard_regno_mode_ok[FIRST_PSEUDO_REGISTER] =
233 {
234   T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES,
235   T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, S_MODES, S_MODES, S_MODES,
236   S_MODES, C_MODES, A_MODES, A_MODES
237 };
238
239 unsigned int m32r_mode_class [NUM_MACHINE_MODES];
240
241 enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER];
242
243 static void
244 init_reg_tables (void)
245 {
246   int i;
247
248   for (i = 0; i < NUM_MACHINE_MODES; i++)
249     {
250       switch (GET_MODE_CLASS (i))
251         {
252         case MODE_INT:
253         case MODE_PARTIAL_INT:
254         case MODE_COMPLEX_INT:
255           if (GET_MODE_SIZE (i) <= 4)
256             m32r_mode_class[i] = 1 << (int) S_MODE;
257           else if (GET_MODE_SIZE (i) == 8)
258             m32r_mode_class[i] = 1 << (int) D_MODE;
259           else if (GET_MODE_SIZE (i) == 16)
260             m32r_mode_class[i] = 1 << (int) T_MODE;
261           else if (GET_MODE_SIZE (i) == 32)
262             m32r_mode_class[i] = 1 << (int) O_MODE;
263           else 
264             m32r_mode_class[i] = 0;
265           break;
266         case MODE_FLOAT:
267         case MODE_COMPLEX_FLOAT:
268           if (GET_MODE_SIZE (i) <= 4)
269             m32r_mode_class[i] = 1 << (int) SF_MODE;
270           else if (GET_MODE_SIZE (i) == 8)
271             m32r_mode_class[i] = 1 << (int) DF_MODE;
272           else if (GET_MODE_SIZE (i) == 16)
273             m32r_mode_class[i] = 1 << (int) TF_MODE;
274           else if (GET_MODE_SIZE (i) == 32)
275             m32r_mode_class[i] = 1 << (int) OF_MODE;
276           else 
277             m32r_mode_class[i] = 0;
278           break;
279         case MODE_CC:
280           m32r_mode_class[i] = 1 << (int) C_MODE;
281           break;
282         default:
283           m32r_mode_class[i] = 0;
284           break;
285         }
286     }
287
288   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
289     {
290       if (GPR_P (i))
291         m32r_regno_reg_class[i] = GENERAL_REGS;
292       else if (i == ARG_POINTER_REGNUM)
293         m32r_regno_reg_class[i] = GENERAL_REGS;
294       else
295         m32r_regno_reg_class[i] = NO_REGS;
296     }
297 }
298 \f
299 /* M32R specific attribute support.
300
301    interrupt - for interrupt functions
302
303    model - select code model used to access object
304
305         small: addresses use 24 bits, use bl to make calls
306         medium: addresses use 32 bits, use bl to make calls
307         large: addresses use 32 bits, use seth/add3/jl to make calls
308
309         Grep for MODEL in m32r.h for more info.  */
310
311 static tree small_ident1;
312 static tree small_ident2;
313 static tree medium_ident1;
314 static tree medium_ident2;
315 static tree large_ident1;
316 static tree large_ident2;
317
318 static void
319 init_idents (void)
320 {
321   if (small_ident1 == 0)
322     {
323       small_ident1 = get_identifier ("small");
324       small_ident2 = get_identifier ("__small__");
325       medium_ident1 = get_identifier ("medium");
326       medium_ident2 = get_identifier ("__medium__");
327       large_ident1 = get_identifier ("large");
328       large_ident2 = get_identifier ("__large__");
329     }
330 }
331
332 const struct attribute_spec m32r_attribute_table[] =
333 {
334   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
335   { "interrupt", 0, 0, true,  false, false, NULL },
336   { "model",     1, 1, true,  false, false, m32r_handle_model_attribute },
337   { NULL,        0, 0, false, false, false, NULL }
338 };
339
340
341 /* Handle an "model" attribute; arguments as in
342    struct attribute_spec.handler.  */
343 static tree
344 m32r_handle_model_attribute (tree *node ATTRIBUTE_UNUSED, tree name,
345                              tree args, int flags ATTRIBUTE_UNUSED,
346                              bool *no_add_attrs)
347 {
348   tree arg;
349
350   init_idents ();
351   arg = TREE_VALUE (args);
352
353   if (arg != small_ident1
354       && arg != small_ident2
355       && arg != medium_ident1
356       && arg != medium_ident2
357       && arg != large_ident1
358       && arg != large_ident2)
359     {
360       warning ("invalid argument of %qs attribute",
361                IDENTIFIER_POINTER (name));
362       *no_add_attrs = true;
363     }
364
365   return NULL_TREE;
366 }
367 \f
368 /* Encode section information of DECL, which is either a VAR_DECL,
369    FUNCTION_DECL, STRING_CST, CONSTRUCTOR, or ???.
370
371    For the M32R we want to record:
372
373    - whether the object lives in .sdata/.sbss.
374    - what code model should be used to access the object
375 */
376
377 static void
378 m32r_encode_section_info (tree decl, rtx rtl, int first)
379 {
380   int extra_flags = 0;
381   tree model_attr;
382   enum m32r_model model;
383
384   default_encode_section_info (decl, rtl, first);
385
386   if (!DECL_P (decl))
387     return;
388
389   model_attr = lookup_attribute ("model", DECL_ATTRIBUTES (decl));
390   if (model_attr)
391     {
392       tree id;
393
394       init_idents ();
395
396       id = TREE_VALUE (TREE_VALUE (model_attr));
397
398       if (id == small_ident1 || id == small_ident2)
399         model = M32R_MODEL_SMALL;
400       else if (id == medium_ident1 || id == medium_ident2)
401         model = M32R_MODEL_MEDIUM;
402       else if (id == large_ident1 || id == large_ident2)
403         model = M32R_MODEL_LARGE;
404       else
405         abort (); /* shouldn't happen */
406     }
407   else
408     {
409       if (TARGET_MODEL_SMALL)
410         model = M32R_MODEL_SMALL;
411       else if (TARGET_MODEL_MEDIUM)
412         model = M32R_MODEL_MEDIUM;
413       else if (TARGET_MODEL_LARGE)
414         model = M32R_MODEL_LARGE;
415       else
416         abort (); /* shouldn't happen */
417     }
418   extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
419
420   if (extra_flags)
421     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;
422 }
423
424 /* Only mark the object as being small data area addressable if
425    it hasn't been explicitly marked with a code model.
426
427    The user can explicitly put an object in the small data area with the
428    section attribute.  If the object is in sdata/sbss and marked with a
429    code model do both [put the object in .sdata and mark it as being
430    addressed with a specific code model - don't mark it as being addressed
431    with an SDA reloc though].  This is ok and might be useful at times.  If
432    the object doesn't fit the linker will give an error.  */
433
434 static bool
435 m32r_in_small_data_p (tree decl)
436 {
437   tree section;
438
439   if (TREE_CODE (decl) != VAR_DECL)
440     return false;
441
442   if (lookup_attribute ("model", DECL_ATTRIBUTES (decl)))
443     return false;
444
445   section = DECL_SECTION_NAME (decl);
446   if (section)
447     {
448       char *name = (char *) TREE_STRING_POINTER (section);
449       if (strcmp (name, ".sdata") == 0 || strcmp (name, ".sbss") == 0)
450         return true;
451     }
452   else
453     {
454       if (! TREE_READONLY (decl) && ! TARGET_SDATA_NONE)
455         {
456           int size = int_size_in_bytes (TREE_TYPE (decl));
457
458           if (size > 0 && (unsigned HOST_WIDE_INT) size <= g_switch_value)
459             return true;
460         }
461     }
462
463   return false;
464 }
465
466 /* Do anything needed before RTL is emitted for each function.  */
467
468 void
469 m32r_init_expanders (void)
470 {
471   /* ??? At one point there was code here.  The function is left in
472      to make it easy to experiment.  */
473 }
474 \f
475 int
476 call_operand (rtx op, enum machine_mode mode)
477 {
478   if (GET_CODE (op) != MEM)
479     return 0;
480   op = XEXP (op, 0);
481   return call_address_operand (op, mode);
482 }
483
484 /* Return 1 if OP is a reference to an object in .sdata/.sbss.  */
485
486 int
487 small_data_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
488 {
489   if (! TARGET_SDATA_USE)
490     return 0;
491
492   if (GET_CODE (op) == SYMBOL_REF)
493     return SYMBOL_REF_SMALL_P (op);
494
495   if (GET_CODE (op) == CONST
496       && GET_CODE (XEXP (op, 0)) == PLUS
497       && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
498       && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
499       && INT16_P (INTVAL (XEXP (XEXP (op, 0), 1))))
500     return SYMBOL_REF_SMALL_P (XEXP (XEXP (op, 0), 0));
501
502   return 0;
503 }
504
505 /* Return 1 if OP is a symbol that can use 24 bit addressing.  */
506
507 int
508 addr24_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
509 {
510   rtx sym;
511
512   if (flag_pic)
513     return 0;
514
515   if (GET_CODE (op) == LABEL_REF)
516     return TARGET_ADDR24;
517
518   if (GET_CODE (op) == SYMBOL_REF)
519     sym = op;
520   else if (GET_CODE (op) == CONST
521            && GET_CODE (XEXP (op, 0)) == PLUS
522            && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
523            && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
524            && UINT24_P (INTVAL (XEXP (XEXP (op, 0), 1))))
525     sym = XEXP (XEXP (op, 0), 0);
526   else
527     return 0;
528
529   if (SYMBOL_REF_MODEL (sym) == M32R_MODEL_SMALL)
530     return 1;
531
532   if (TARGET_ADDR24
533       && (CONSTANT_POOL_ADDRESS_P (sym)
534           || LIT_NAME_P (XSTR (sym, 0))))
535     return 1;
536
537   return 0;
538 }
539
540 /* Return 1 if OP is a symbol that needs 32 bit addressing.  */
541
542 int
543 addr32_operand (rtx op, enum machine_mode mode)
544 {
545   rtx sym;
546
547   if (GET_CODE (op) == LABEL_REF)
548     return TARGET_ADDR32;
549
550   if (GET_CODE (op) == SYMBOL_REF)
551     sym = op;
552   else if (GET_CODE (op) == CONST
553            && GET_CODE (XEXP (op, 0)) == PLUS
554            && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
555            && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
556            && ! flag_pic)
557     sym = XEXP (XEXP (op, 0), 0);
558   else
559     return 0;
560
561   return (! addr24_operand (sym, mode)
562           && ! small_data_operand (sym, mode));
563 }
564
565 /* Return 1 if OP is a function that can be called with the `bl' insn.  */
566
567 int
568 call26_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
569 {
570   if (flag_pic)
571     return 1;
572
573   if (GET_CODE (op) == SYMBOL_REF)
574     return SYMBOL_REF_MODEL (op) != M32R_MODEL_LARGE;
575
576   return TARGET_CALL26;
577 }
578
579 /* Return 1 if OP is a DImode const we want to handle inline.
580    This must match the code in the movdi pattern.
581    It is used by the 'G' CONST_DOUBLE_OK_FOR_LETTER.  */
582
583 int
584 easy_di_const (rtx op)
585 {
586   rtx high_rtx, low_rtx;
587   HOST_WIDE_INT high, low;
588
589   split_double (op, &high_rtx, &low_rtx);
590   high = INTVAL (high_rtx);
591   low = INTVAL (low_rtx);
592   /* Pick constants loadable with 2 16 bit `ldi' insns.  */
593   if (high >= -128 && high <= 127
594       && low >= -128 && low <= 127)
595     return 1;
596   return 0;
597 }
598
599 /* Return 1 if OP is a DFmode const we want to handle inline.
600    This must match the code in the movdf pattern.
601    It is used by the 'H' CONST_DOUBLE_OK_FOR_LETTER.  */
602
603 int
604 easy_df_const (rtx op)
605 {
606   REAL_VALUE_TYPE r;
607   long l[2];
608
609   REAL_VALUE_FROM_CONST_DOUBLE (r, op);
610   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
611   if (l[0] == 0 && l[1] == 0)
612     return 1;
613   if ((l[0] & 0xffff) == 0 && l[1] == 0)
614     return 1;
615   return 0;
616 }
617
618 /* Return 1 if OP is (mem (reg ...)).
619    This is used in insn length calcs.  */
620
621 int
622 memreg_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
623 {
624   return GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == REG;
625 }
626
627 /* Return nonzero if TYPE must be passed by indirect reference.  */
628
629 static bool
630 m32r_pass_by_reference (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
631                         enum machine_mode mode, tree type,
632                         bool named ATTRIBUTE_UNUSED)
633 {
634   int size;
635
636   if (type)
637     size = int_size_in_bytes (type);
638   else
639     size = GET_MODE_SIZE (mode);
640
641   return (size < 0 || size > 8);
642 }
643 \f
644 /* Comparisons.  */
645
646 /* X and Y are two things to compare using CODE.  Emit the compare insn and
647    return the rtx for compare [arg0 of the if_then_else].
648    If need_compare is true then the comparison insn must be generated, rather
649    than being subsumed into the following branch instruction.  */
650
651 rtx
652 gen_compare (enum rtx_code code, rtx x, rtx y, int need_compare)
653 {
654   enum rtx_code compare_code;
655   enum rtx_code branch_code;
656   rtx cc_reg = gen_rtx_REG (CCmode, CARRY_REGNUM);
657   int must_swap = 0;
658
659   switch (code)
660     {
661     case EQ:  compare_code = EQ;  branch_code = NE; break;
662     case NE:  compare_code = EQ;  branch_code = EQ; break;
663     case LT:  compare_code = LT;  branch_code = NE; break;
664     case LE:  compare_code = LT;  branch_code = EQ; must_swap = 1; break;
665     case GT:  compare_code = LT;  branch_code = NE; must_swap = 1; break;
666     case GE:  compare_code = LT;  branch_code = EQ; break;
667     case LTU: compare_code = LTU; branch_code = NE; break;
668     case LEU: compare_code = LTU; branch_code = EQ; must_swap = 1; break;
669     case GTU: compare_code = LTU; branch_code = NE; must_swap = 1; break;
670     case GEU: compare_code = LTU; branch_code = EQ; break;
671
672     default:
673       abort ();
674     }
675
676   if (need_compare)
677     {
678       switch (compare_code)
679         {
680         case EQ:
681           if (GET_CODE (y) == CONST_INT
682               && CMP_INT16_P (INTVAL (y))               /* Reg equal to small const.  */
683               && y != const0_rtx)
684             {
685               rtx tmp = gen_reg_rtx (SImode);           
686               
687               emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
688               x = tmp;
689               y = const0_rtx;
690             }
691           else if (CONSTANT_P (y))                      /* Reg equal to const.  */
692             {
693               rtx tmp = force_reg (GET_MODE (x), y);
694               y = tmp;
695             }
696
697           if (register_operand (y, SImode)              /* Reg equal to reg.  */
698               || y == const0_rtx)                       /* Reg equal to zero.  */
699             {
700               emit_insn (gen_cmp_eqsi_insn (x, y));
701                 
702               return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
703             }
704           break;
705       
706         case LT:
707           if (register_operand (y, SImode)
708               || (GET_CODE (y) == CONST_INT && CMP_INT16_P (INTVAL (y))))
709             {
710               rtx tmp = gen_reg_rtx (SImode);         /* Reg compared to reg.  */
711               
712               switch (code)
713                 {
714                 case LT:
715                   emit_insn (gen_cmp_ltsi_insn (x, y));
716                   code = EQ;
717                   break;
718                 case LE:
719                   if (y == const0_rtx)
720                     tmp = const1_rtx;
721                   else
722                     emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
723                   emit_insn (gen_cmp_ltsi_insn (x, tmp));
724                   code = EQ;
725                   break;
726                 case GT:
727                   if (GET_CODE (y) == CONST_INT)
728                     tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
729                   else
730                     emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
731                   emit_insn (gen_cmp_ltsi_insn (x, tmp));
732                   code = NE;
733                   break;
734                 case GE:
735                   emit_insn (gen_cmp_ltsi_insn (x, y));
736                   code = NE;
737                   break;
738                 default:
739                   abort ();
740                 }
741               
742               return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
743             }
744           break;
745           
746         case LTU:
747           if (register_operand (y, SImode)
748               || (GET_CODE (y) == CONST_INT && CMP_INT16_P (INTVAL (y))))
749             {
750               rtx tmp = gen_reg_rtx (SImode);         /* Reg (unsigned) compared to reg.  */
751               
752               switch (code)
753                 {
754                 case LTU:
755                   emit_insn (gen_cmp_ltusi_insn (x, y));
756                   code = EQ;
757                   break;
758                 case LEU:
759                   if (y == const0_rtx)
760                     tmp = const1_rtx;
761                   else
762                     emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
763                   emit_insn (gen_cmp_ltusi_insn (x, tmp));
764                   code = EQ;
765                   break;
766                 case GTU:
767                   if (GET_CODE (y) == CONST_INT)
768                     tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
769                   else
770                     emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
771                   emit_insn (gen_cmp_ltusi_insn (x, tmp));
772                   code = NE;
773                   break;
774                 case GEU:
775                   emit_insn (gen_cmp_ltusi_insn (x, y));
776                   code = NE;
777                   break;
778                 default:
779                   abort();
780                 }
781               
782               return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
783             }
784           break;
785
786         default:
787           abort();
788         }
789     }
790   else
791     {
792       /* Reg/reg equal comparison.  */
793       if (compare_code == EQ
794           && register_operand (y, SImode))
795         return gen_rtx_fmt_ee (code, CCmode, x, y);
796       
797       /* Reg/zero signed comparison.  */
798       if ((compare_code == EQ || compare_code == LT)
799           && y == const0_rtx)
800         return gen_rtx_fmt_ee (code, CCmode, x, y);
801       
802       /* Reg/smallconst equal comparison.  */
803       if (compare_code == EQ
804           && GET_CODE (y) == CONST_INT
805           && CMP_INT16_P (INTVAL (y)))
806         {
807           rtx tmp = gen_reg_rtx (SImode);
808
809           emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
810           return gen_rtx_fmt_ee (code, CCmode, tmp, const0_rtx);
811         }
812       
813       /* Reg/const equal comparison.  */
814       if (compare_code == EQ
815           && CONSTANT_P (y))
816         {
817           rtx tmp = force_reg (GET_MODE (x), y);
818
819           return gen_rtx_fmt_ee (code, CCmode, x, tmp);
820         }
821     }
822
823   if (CONSTANT_P (y))
824     {
825       if (must_swap)
826         y = force_reg (GET_MODE (x), y);
827       else
828         {
829           int ok_const = reg_or_int16_operand (y, GET_MODE (y));
830
831           if (! ok_const)
832             y = force_reg (GET_MODE (x), y);
833         }
834     }
835
836   switch (compare_code)
837     {
838     case EQ :
839       emit_insn (gen_cmp_eqsi_insn (must_swap ? y : x, must_swap ? x : y));
840       break;
841     case LT :
842       emit_insn (gen_cmp_ltsi_insn (must_swap ? y : x, must_swap ? x : y));
843       break;
844     case LTU :
845       emit_insn (gen_cmp_ltusi_insn (must_swap ? y : x, must_swap ? x : y));
846       break;
847
848     default:
849       abort ();
850     }
851
852   return gen_rtx_fmt_ee (branch_code, VOIDmode, cc_reg, CONST0_RTX (CCmode));
853 }
854 \f
855 /* Split a 2 word move (DI or DF) into component parts.  */
856
857 rtx
858 gen_split_move_double (rtx operands[])
859 {
860   enum machine_mode mode = GET_MODE (operands[0]);
861   rtx dest = operands[0];
862   rtx src  = operands[1];
863   rtx val;
864
865   /* We might have (SUBREG (MEM)) here, so just get rid of the
866      subregs to make this code simpler.  It is safe to call
867      alter_subreg any time after reload.  */
868   if (GET_CODE (dest) == SUBREG)
869     alter_subreg (&dest);
870   if (GET_CODE (src) == SUBREG)
871     alter_subreg (&src);
872
873   start_sequence ();
874   if (GET_CODE (dest) == REG)
875     {
876       int dregno = REGNO (dest);
877
878       /* Reg = reg.  */
879       if (GET_CODE (src) == REG)
880         {
881           int sregno = REGNO (src);
882
883           int reverse = (dregno == sregno + 1);
884
885           /* We normally copy the low-numbered register first.  However, if
886              the first register operand 0 is the same as the second register of
887              operand 1, we must copy in the opposite order.  */
888           emit_insn (gen_rtx_SET (VOIDmode,
889                                   operand_subword (dest, reverse, TRUE, mode),
890                                   operand_subword (src,  reverse, TRUE, mode)));
891
892           emit_insn (gen_rtx_SET (VOIDmode,
893                                   operand_subword (dest, !reverse, TRUE, mode),
894                                   operand_subword (src,  !reverse, TRUE, mode)));
895         }
896
897       /* Reg = constant.  */
898       else if (GET_CODE (src) == CONST_INT || GET_CODE (src) == CONST_DOUBLE)
899         {
900           rtx words[2];
901           split_double (src, &words[0], &words[1]);
902           emit_insn (gen_rtx_SET (VOIDmode,
903                                   operand_subword (dest, 0, TRUE, mode),
904                                   words[0]));
905
906           emit_insn (gen_rtx_SET (VOIDmode,
907                                   operand_subword (dest, 1, TRUE, mode),
908                                   words[1]));
909         }
910
911       /* Reg = mem.  */
912       else if (GET_CODE (src) == MEM)
913         {
914           /* If the high-address word is used in the address, we must load it
915              last.  Otherwise, load it first.  */
916           int reverse
917             = (refers_to_regno_p (dregno, dregno + 1, XEXP (src, 0), 0) != 0);
918
919           /* We used to optimize loads from single registers as
920
921                 ld r1,r3+; ld r2,r3
922
923              if r3 were not used subsequently.  However, the REG_NOTES aren't
924              propagated correctly by the reload phase, and it can cause bad
925              code to be generated.  We could still try:
926
927                 ld r1,r3+; ld r2,r3; addi r3,-4
928
929              which saves 2 bytes and doesn't force longword alignment.  */
930           emit_insn (gen_rtx_SET (VOIDmode,
931                                   operand_subword (dest, reverse, TRUE, mode),
932                                   adjust_address (src, SImode,
933                                                   reverse * UNITS_PER_WORD)));
934
935           emit_insn (gen_rtx_SET (VOIDmode,
936                                   operand_subword (dest, !reverse, TRUE, mode),
937                                   adjust_address (src, SImode,
938                                                   !reverse * UNITS_PER_WORD)));
939         }
940       else
941         abort ();
942     }
943
944   /* Mem = reg.  */
945   /* We used to optimize loads from single registers as
946
947         st r1,r3; st r2,+r3
948
949      if r3 were not used subsequently.  However, the REG_NOTES aren't
950      propagated correctly by the reload phase, and it can cause bad
951      code to be generated.  We could still try:
952
953         st r1,r3; st r2,+r3; addi r3,-4
954
955      which saves 2 bytes and doesn't force longword alignment.  */
956   else if (GET_CODE (dest) == MEM && GET_CODE (src) == REG)
957     {
958       emit_insn (gen_rtx_SET (VOIDmode,
959                               adjust_address (dest, SImode, 0),
960                               operand_subword (src, 0, TRUE, mode)));
961
962       emit_insn (gen_rtx_SET (VOIDmode,
963                               adjust_address (dest, SImode, UNITS_PER_WORD),
964                               operand_subword (src, 1, TRUE, mode)));
965     }
966
967   else
968     abort ();
969
970   val = get_insns ();
971   end_sequence ();
972   return val;
973 }
974
975 \f
976 static int
977 m32r_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
978                         tree type, bool named ATTRIBUTE_UNUSED)
979 {
980   int words;
981   unsigned int size =
982     (((mode == BLKmode && type)
983       ? (unsigned int) int_size_in_bytes (type)
984       : GET_MODE_SIZE (mode)) + UNITS_PER_WORD - 1)
985     / UNITS_PER_WORD;
986
987   if (*cum >= M32R_MAX_PARM_REGS)
988     words = 0;
989   else if (*cum + size > M32R_MAX_PARM_REGS)
990     words = (*cum + size) - M32R_MAX_PARM_REGS;
991   else
992     words = 0;
993
994   return words * UNITS_PER_WORD;
995 }
996
997 /* Worker function for TARGET_RETURN_IN_MEMORY.  */
998
999 static bool
1000 m32r_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
1001 {
1002   return m32r_pass_by_reference (NULL, TYPE_MODE (type), type, false);
1003 }
1004
1005 /* Do any needed setup for a variadic function.  For the M32R, we must
1006    create a register parameter block, and then copy any anonymous arguments
1007    in registers to memory.
1008
1009    CUM has not been updated for the last named argument which has type TYPE
1010    and mode MODE, and we rely on this fact.  */
1011
1012 static void
1013 m32r_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
1014                              tree type, int *pretend_size, int no_rtl)
1015 {
1016   int first_anon_arg;
1017
1018   if (no_rtl)
1019     return;
1020
1021   /* All BLKmode values are passed by reference.  */
1022   if (mode == BLKmode)
1023     abort ();
1024
1025   first_anon_arg = (ROUND_ADVANCE_CUM (*cum, mode, type)
1026                     + ROUND_ADVANCE_ARG (mode, type));
1027
1028   if (first_anon_arg < M32R_MAX_PARM_REGS)
1029     {
1030       /* Note that first_reg_offset < M32R_MAX_PARM_REGS.  */
1031       int first_reg_offset = first_anon_arg;
1032       /* Size in words to "pretend" allocate.  */
1033       int size = M32R_MAX_PARM_REGS - first_reg_offset;
1034       rtx regblock;
1035
1036       regblock = gen_rtx_MEM (BLKmode,
1037                               plus_constant (arg_pointer_rtx,
1038                                              FIRST_PARM_OFFSET (0)));
1039       set_mem_alias_set (regblock, get_varargs_alias_set ());
1040       move_block_from_reg (first_reg_offset, regblock, size);
1041
1042       *pretend_size = (size * UNITS_PER_WORD);
1043     }
1044 }
1045
1046 \f
1047 /* Return true if INSN is real instruction bearing insn.  */
1048
1049 static int
1050 m32r_is_insn (rtx insn)
1051 {
1052   return (INSN_P (insn)
1053           && GET_CODE (PATTERN (insn)) != USE
1054           && GET_CODE (PATTERN (insn)) != CLOBBER
1055           && GET_CODE (PATTERN (insn)) != ADDR_VEC);
1056 }
1057
1058 /* Increase the priority of long instructions so that the
1059    short instructions are scheduled ahead of the long ones.  */
1060
1061 static int
1062 m32r_adjust_priority (rtx insn, int priority)
1063 {
1064   if (m32r_is_insn (insn)
1065       && get_attr_insn_size (insn) != INSN_SIZE_SHORT)
1066     priority <<= 3;
1067
1068   return priority;
1069 }
1070
1071 \f
1072 /* Indicate how many instructions can be issued at the same time.
1073    This is sort of a lie.  The m32r can issue only 1 long insn at
1074    once, but it can issue 2 short insns.  The default therefore is
1075    set at 2, but this can be overridden by the command line option
1076    -missue-rate=1.  */
1077
1078 static int
1079 m32r_issue_rate (void)
1080 {
1081   return ((TARGET_LOW_ISSUE_RATE) ? 1 : 2);
1082 }
1083 \f
1084 /* Cost functions.  */
1085
1086 static bool
1087 m32r_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, int *total)
1088 {
1089   switch (code)
1090     {
1091       /* Small integers are as cheap as registers.  4 byte values can be
1092          fetched as immediate constants - let's give that the cost of an
1093          extra insn.  */
1094     case CONST_INT:
1095       if (INT16_P (INTVAL (x)))
1096         {
1097           *total = 0;
1098           return true;
1099         }
1100       /* FALLTHRU */
1101
1102     case CONST:
1103     case LABEL_REF:
1104     case SYMBOL_REF:
1105       *total = COSTS_N_INSNS (1);
1106       return true;
1107
1108     case CONST_DOUBLE:
1109       {
1110         rtx high, low;
1111
1112         split_double (x, &high, &low);
1113         *total = COSTS_N_INSNS (!INT16_P (INTVAL (high))
1114                                 + !INT16_P (INTVAL (low)));
1115         return true;
1116       }
1117
1118     case MULT:
1119       *total = COSTS_N_INSNS (3);
1120       return true;
1121
1122     case DIV:
1123     case UDIV:
1124     case MOD:
1125     case UMOD:
1126       *total = COSTS_N_INSNS (10);
1127       return true;
1128
1129     default:
1130       return false;
1131     }
1132 }
1133 \f
1134 /* Type of function DECL.
1135
1136    The result is cached.  To reset the cache at the end of a function,
1137    call with DECL = NULL_TREE.  */
1138
1139 enum m32r_function_type
1140 m32r_compute_function_type (tree decl)
1141 {
1142   /* Cached value.  */
1143   static enum m32r_function_type fn_type = M32R_FUNCTION_UNKNOWN;
1144   /* Last function we were called for.  */
1145   static tree last_fn = NULL_TREE;
1146
1147   /* Resetting the cached value?  */
1148   if (decl == NULL_TREE)
1149     {
1150       fn_type = M32R_FUNCTION_UNKNOWN;
1151       last_fn = NULL_TREE;
1152       return fn_type;
1153     }
1154
1155   if (decl == last_fn && fn_type != M32R_FUNCTION_UNKNOWN)
1156     return fn_type;
1157
1158   /* Compute function type.  */
1159   fn_type = (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl)) != NULL_TREE
1160              ? M32R_FUNCTION_INTERRUPT
1161              : M32R_FUNCTION_NORMAL);
1162
1163   last_fn = decl;
1164   return fn_type;
1165 }
1166 \f/* Function prologue/epilogue handlers.  */
1167
1168 /* M32R stack frames look like:
1169
1170              Before call                       After call
1171         +-----------------------+       +-----------------------+
1172         |                       |       |                       |
1173    high |  local variables,     |       |  local variables,     |
1174    mem  |  reg save area, etc.  |       |  reg save area, etc.  |
1175         |                       |       |                       |
1176         +-----------------------+       +-----------------------+
1177         |                       |       |                       |
1178         |  arguments on stack.  |       |  arguments on stack.  |
1179         |                       |       |                       |
1180   SP+0->+-----------------------+       +-----------------------+
1181                                         |  reg parm save area,  |
1182                                         |  only created for     |    
1183                                         |  variable argument    |    
1184                                         |  functions            |    
1185                                         +-----------------------+
1186                                         |   previous frame ptr  |
1187                                         +-----------------------+    
1188                                         |                       |    
1189                                         |  register save area   |    
1190                                         |                       |    
1191                                         +-----------------------+
1192                                         |    return address     |    
1193                                         +-----------------------+    
1194                                         |                       |    
1195                                         |  local variables      |    
1196                                         |                       |    
1197                                         +-----------------------+    
1198                                         |                       |    
1199                                         |  alloca allocations   |    
1200                                         |                       |    
1201                                         +-----------------------+    
1202                                         |                       |    
1203    low                                  |  arguments on stack   |    
1204    memory                               |                       |    
1205                                   SP+0->+-----------------------+    
1206
1207 Notes:
1208 1) The "reg parm save area" does not exist for non variable argument fns.
1209 2) The "reg parm save area" can be eliminated completely if we saved regs
1210    containing anonymous args separately but that complicates things too
1211    much (so it's not done).
1212 3) The return address is saved after the register save area so as to have as
1213    many insns as possible between the restoration of `lr' and the `jmp lr'.  */
1214
1215 /* Structure to be filled in by m32r_compute_frame_size with register
1216    save masks, and offsets for the current function.  */
1217 struct m32r_frame_info
1218 {
1219   unsigned int total_size;      /* # bytes that the entire frame takes up.  */
1220   unsigned int extra_size;      /* # bytes of extra stuff.  */
1221   unsigned int pretend_size;    /* # bytes we push and pretend caller did.  */
1222   unsigned int args_size;       /* # bytes that outgoing arguments take up.  */
1223   unsigned int reg_size;        /* # bytes needed to store regs.  */
1224   unsigned int var_size;        /* # bytes that variables take up.  */
1225   unsigned int gmask;           /* Mask of saved gp registers.  */
1226   unsigned int save_fp;         /* Nonzero if fp must be saved.  */
1227   unsigned int save_lr;         /* Nonzero if lr (return addr) must be saved.  */
1228   int          initialized;     /* Nonzero if frame size already calculated.  */
1229 };
1230
1231 /* Current frame information calculated by m32r_compute_frame_size.  */
1232 static struct m32r_frame_info current_frame_info;
1233
1234 /* Zero structure to initialize current_frame_info.  */
1235 static struct m32r_frame_info zero_frame_info;
1236
1237 #define FRAME_POINTER_MASK (1 << (FRAME_POINTER_REGNUM))
1238 #define RETURN_ADDR_MASK   (1 << (RETURN_ADDR_REGNUM))
1239
1240 /* Tell prologue and epilogue if register REGNO should be saved / restored.
1241    The return address and frame pointer are treated separately.
1242    Don't consider them here.  */
1243 #define MUST_SAVE_REGISTER(regno, interrupt_p) \
1244   ((regno) != RETURN_ADDR_REGNUM && (regno) != FRAME_POINTER_REGNUM \
1245   && (regs_ever_live[regno] && (!call_really_used_regs[regno] || interrupt_p)))
1246
1247 #define MUST_SAVE_FRAME_POINTER (regs_ever_live[FRAME_POINTER_REGNUM])
1248 #define MUST_SAVE_RETURN_ADDR   (regs_ever_live[RETURN_ADDR_REGNUM] || current_function_profile)
1249
1250 #define SHORT_INSN_SIZE 2       /* Size of small instructions.  */
1251 #define LONG_INSN_SIZE 4        /* Size of long instructions.  */
1252
1253 /* Return the bytes needed to compute the frame pointer from the current
1254    stack pointer.
1255
1256    SIZE is the size needed for local variables.  */
1257
1258 unsigned int
1259 m32r_compute_frame_size (int size)      /* # of var. bytes allocated.  */
1260 {
1261   int regno;
1262   unsigned int total_size, var_size, args_size, pretend_size, extra_size;
1263   unsigned int reg_size, frame_size;
1264   unsigned int gmask;
1265   enum m32r_function_type fn_type;
1266   int interrupt_p;
1267   int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table);
1268
1269   var_size      = M32R_STACK_ALIGN (size);
1270   args_size     = M32R_STACK_ALIGN (current_function_outgoing_args_size);
1271   pretend_size  = current_function_pretend_args_size;
1272   extra_size    = FIRST_PARM_OFFSET (0);
1273   total_size    = extra_size + pretend_size + args_size + var_size;
1274   reg_size      = 0;
1275   gmask         = 0;
1276
1277   /* See if this is an interrupt handler.  Call used registers must be saved
1278      for them too.  */
1279   fn_type = m32r_compute_function_type (current_function_decl);
1280   interrupt_p = M32R_INTERRUPT_P (fn_type);
1281
1282   /* Calculate space needed for registers.  */
1283   for (regno = 0; regno < M32R_MAX_INT_REGS; regno++)
1284     {
1285       if (MUST_SAVE_REGISTER (regno, interrupt_p)
1286           || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
1287         {
1288           reg_size += UNITS_PER_WORD;
1289           gmask |= 1 << regno;
1290         }
1291     }
1292
1293   current_frame_info.save_fp = MUST_SAVE_FRAME_POINTER;
1294   current_frame_info.save_lr = MUST_SAVE_RETURN_ADDR || pic_reg_used;
1295
1296   reg_size += ((current_frame_info.save_fp + current_frame_info.save_lr)
1297                * UNITS_PER_WORD);
1298   total_size += reg_size;
1299
1300   /* ??? Not sure this is necessary, and I don't think the epilogue
1301      handler will do the right thing if this changes total_size.  */
1302   total_size = M32R_STACK_ALIGN (total_size);
1303
1304   frame_size = total_size - (pretend_size + reg_size);
1305
1306   /* Save computed information.  */
1307   current_frame_info.total_size   = total_size;
1308   current_frame_info.extra_size   = extra_size;
1309   current_frame_info.pretend_size = pretend_size;
1310   current_frame_info.var_size     = var_size;
1311   current_frame_info.args_size    = args_size;
1312   current_frame_info.reg_size     = reg_size;
1313   current_frame_info.gmask        = gmask;
1314   current_frame_info.initialized  = reload_completed;
1315
1316   /* Ok, we're done.  */
1317   return total_size;
1318 }
1319 \f
1320 /* The table we use to reference PIC data.  */
1321 static rtx global_offset_table;
1322                                                                                 
1323 static void
1324 m32r_reload_lr (rtx sp, int size)
1325 {
1326   rtx lr = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
1327
1328   if (size == 0)
1329     emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode, sp)));
1330   else if (size <= 32768)
1331     emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode,
1332                                            gen_rtx_PLUS (Pmode, sp,
1333                                                          GEN_INT (size)))));
1334   else
1335     {   
1336       rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1337
1338       emit_insn (gen_movsi (tmp, GEN_INT (size)));
1339       emit_insn (gen_addsi3 (tmp, tmp, sp));
1340       emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode, tmp)));
1341     }
1342
1343   emit_insn (gen_rtx_USE (VOIDmode, lr));
1344 }
1345
1346 void
1347 m32r_load_pic_register (void)
1348 {
1349   global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
1350   emit_insn (gen_get_pc (pic_offset_table_rtx, global_offset_table,
1351                          GEN_INT (TARGET_MODEL_SMALL)));
1352                                                                                 
1353   /* Need to emit this whether or not we obey regdecls,
1354      since setjmp/longjmp can cause life info to screw up.  */
1355   emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
1356 }
1357
1358 /* Expand the m32r prologue as a series of insns.  */
1359
1360 void
1361 m32r_expand_prologue (void)
1362 {
1363   int regno;
1364   int frame_size;
1365   unsigned int gmask;
1366   int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table);
1367
1368   if (! current_frame_info.initialized)
1369     m32r_compute_frame_size (get_frame_size ());
1370
1371   gmask = current_frame_info.gmask;
1372
1373   /* These cases shouldn't happen.  Catch them now.  */
1374   if (current_frame_info.total_size == 0 && gmask)
1375     abort ();
1376
1377   /* Allocate space for register arguments if this is a variadic function.  */
1378   if (current_frame_info.pretend_size != 0)
1379     {
1380       /* Use a HOST_WIDE_INT temporary, since negating an unsigned int gives
1381          the wrong result on a 64-bit host.  */
1382       HOST_WIDE_INT pretend_size = current_frame_info.pretend_size;
1383       emit_insn (gen_addsi3 (stack_pointer_rtx,
1384                              stack_pointer_rtx,
1385                              GEN_INT (-pretend_size)));
1386     }
1387
1388   /* Save any registers we need to and set up fp.  */
1389   if (current_frame_info.save_fp)
1390     emit_insn (gen_movsi_push (stack_pointer_rtx, frame_pointer_rtx));
1391
1392   gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
1393
1394   /* Save any needed call-saved regs (and call-used if this is an
1395      interrupt handler).  */
1396   for (regno = 0; regno <= M32R_MAX_INT_REGS; ++regno)
1397     {
1398       if ((gmask & (1 << regno)) != 0)
1399         emit_insn (gen_movsi_push (stack_pointer_rtx,
1400                                    gen_rtx_REG (Pmode, regno)));
1401     }
1402
1403   if (current_frame_info.save_lr)
1404     emit_insn (gen_movsi_push (stack_pointer_rtx,
1405                                gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
1406
1407   /* Allocate the stack frame.  */
1408   frame_size = (current_frame_info.total_size
1409                 - (current_frame_info.pretend_size
1410                    + current_frame_info.reg_size));
1411
1412   if (frame_size == 0)
1413     ; /* Nothing to do.  */
1414   else if (frame_size <= 32768)
1415     emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1416                            GEN_INT (-frame_size)));
1417   else
1418     {
1419       rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1420
1421       emit_insn (gen_movsi (tmp, GEN_INT (frame_size)));
1422       emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, tmp));
1423     }
1424
1425   if (frame_pointer_needed)
1426     emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx));
1427
1428   if (current_function_profile)
1429     /* Push lr for mcount (form_pc, x).  */
1430     emit_insn (gen_movsi_push (stack_pointer_rtx,
1431                                gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
1432                                                                                 
1433   if (pic_reg_used)
1434     {
1435       m32r_load_pic_register ();
1436       m32r_reload_lr (stack_pointer_rtx,
1437                       (current_function_profile ? 0 : frame_size));
1438     }
1439
1440   if (current_function_profile && !pic_reg_used)
1441     emit_insn (gen_blockage ());
1442 }
1443
1444 \f
1445 /* Set up the stack and frame pointer (if desired) for the function.
1446    Note, if this is changed, you need to mirror the changes in
1447    m32r_compute_frame_size which calculates the prolog size.  */
1448
1449 static void
1450 m32r_output_function_prologue (FILE * file, HOST_WIDE_INT size)
1451 {
1452   enum m32r_function_type fn_type = m32r_compute_function_type (current_function_decl);
1453
1454   /* If this is an interrupt handler, mark it as such.  */
1455   if (M32R_INTERRUPT_P (fn_type))
1456     fprintf (file, "\t%s interrupt handler\n", ASM_COMMENT_START);
1457
1458   if (! current_frame_info.initialized)
1459     m32r_compute_frame_size (size);
1460
1461   /* This is only for the human reader.  */
1462   fprintf (file,
1463            "\t%s PROLOGUE, vars= %d, regs= %d, args= %d, extra= %d\n",
1464            ASM_COMMENT_START,
1465            current_frame_info.var_size,
1466            current_frame_info.reg_size / 4,
1467            current_frame_info.args_size,
1468            current_frame_info.extra_size);
1469 }
1470 \f
1471 /* Do any necessary cleanup after a function to restore stack, frame,
1472    and regs.  */
1473
1474 static void
1475 m32r_output_function_epilogue (FILE * file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1476 {
1477   int regno;
1478   int noepilogue = FALSE;
1479   int total_size;
1480   enum m32r_function_type fn_type = m32r_compute_function_type (current_function_decl);
1481
1482   /* This is only for the human reader.  */
1483   fprintf (file, "\t%s EPILOGUE\n", ASM_COMMENT_START);
1484
1485   if (!current_frame_info.initialized)
1486     abort ();
1487   total_size = current_frame_info.total_size;
1488
1489   if (total_size == 0)
1490     {
1491       rtx insn = get_last_insn ();
1492
1493       /* If the last insn was a BARRIER, we don't have to write any code
1494          because a jump (aka return) was put there.  */
1495       if (GET_CODE (insn) == NOTE)
1496         insn = prev_nonnote_insn (insn);
1497       if (insn && GET_CODE (insn) == BARRIER)
1498         noepilogue = TRUE;
1499     }
1500
1501   if (!noepilogue)
1502     {
1503       unsigned int var_size = current_frame_info.var_size;
1504       unsigned int args_size = current_frame_info.args_size;
1505       unsigned int gmask = current_frame_info.gmask;
1506       int can_trust_sp_p = !current_function_calls_alloca;
1507       const char * sp_str = reg_names[STACK_POINTER_REGNUM];
1508       const char * fp_str = reg_names[FRAME_POINTER_REGNUM];
1509
1510       /* The first thing to do is point the sp at the bottom of the register
1511          save area.  */
1512       if (can_trust_sp_p)
1513         {
1514           unsigned int reg_offset = var_size + args_size;
1515           if (reg_offset == 0)
1516             ; /* Nothing to do.  */
1517           else if (reg_offset < 128)
1518             fprintf (file, "\taddi %s,%s%d\n",
1519                      sp_str, IMMEDIATE_PREFIX, reg_offset);
1520           else if (reg_offset < 32768)
1521             fprintf (file, "\tadd3 %s,%s,%s%d\n",
1522                      sp_str, sp_str, IMMEDIATE_PREFIX, reg_offset);
1523           else
1524             fprintf (file, "\tld24 %s,%s%d\n\tadd %s,%s\n",
1525                      reg_names[PROLOGUE_TMP_REGNUM],
1526                      IMMEDIATE_PREFIX, reg_offset,
1527                      sp_str, reg_names[PROLOGUE_TMP_REGNUM]);
1528         }
1529       else if (frame_pointer_needed)
1530         {
1531           unsigned int reg_offset = var_size + args_size;
1532
1533           if (reg_offset == 0)
1534             fprintf (file, "\tmv %s,%s\n", sp_str, fp_str);
1535           else if (reg_offset < 32768)
1536             fprintf (file, "\tadd3 %s,%s,%s%d\n",
1537                      sp_str, fp_str, IMMEDIATE_PREFIX, reg_offset);
1538           else
1539             fprintf (file, "\tld24 %s,%s%d\n\tadd %s,%s\n",
1540                      reg_names[PROLOGUE_TMP_REGNUM],
1541                      IMMEDIATE_PREFIX, reg_offset,
1542                      sp_str, reg_names[PROLOGUE_TMP_REGNUM]);
1543         }
1544       else
1545         abort ();
1546
1547       if (current_frame_info.save_lr)
1548         fprintf (file, "\tpop %s\n", reg_names[RETURN_ADDR_REGNUM]);
1549
1550       /* Restore any saved registers, in reverse order of course.  */
1551       gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
1552       for (regno = M32R_MAX_INT_REGS - 1; regno >= 0; --regno)
1553         {
1554           if ((gmask & (1L << regno)) != 0)
1555             fprintf (file, "\tpop %s\n", reg_names[regno]);
1556         }
1557
1558       if (current_frame_info.save_fp)
1559         fprintf (file, "\tpop %s\n", fp_str);
1560
1561       /* Remove varargs area if present.  */
1562       if (current_frame_info.pretend_size != 0)
1563         fprintf (file, "\taddi %s,%s%d\n",
1564                  sp_str, IMMEDIATE_PREFIX, current_frame_info.pretend_size);
1565         
1566       /* Emit the return instruction.  */
1567       if (M32R_INTERRUPT_P (fn_type))
1568         fprintf (file, "\trte\n");
1569       else
1570         fprintf (file, "\tjmp %s\n", reg_names[RETURN_ADDR_REGNUM]);
1571     }
1572
1573   /* Reset state info for each function.  */
1574   current_frame_info = zero_frame_info;
1575   m32r_compute_function_type (NULL_TREE);
1576 }
1577 \f
1578 /* Return nonzero if this function is known to have a null or 1 instruction
1579    epilogue.  */
1580
1581 int
1582 direct_return (void)
1583 {
1584   if (!reload_completed)
1585     return FALSE;
1586
1587   if (! current_frame_info.initialized)
1588     m32r_compute_frame_size (get_frame_size ());
1589
1590    return current_frame_info.total_size == 0;
1591 }
1592
1593 \f
1594 /* PIC.  */
1595
1596 int
1597 m32r_legitimate_pic_operand_p (rtx x)
1598 {
1599   if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1600     return 0;
1601                                                                                 
1602   if (GET_CODE (x) == CONST
1603       && GET_CODE (XEXP (x, 0)) == PLUS
1604       && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
1605           || GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF)
1606       && (GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT))
1607     return 0;
1608                                                                                 
1609   return 1;
1610 }
1611
1612 rtx
1613 m32r_legitimize_pic_address (rtx orig, rtx reg)
1614 {
1615 #ifdef DEBUG_PIC
1616   printf("m32r_legitimize_pic_address()\n");
1617 #endif
1618
1619   if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
1620     {
1621       rtx pic_ref, address;
1622       rtx insn;
1623       int subregs = 0;
1624
1625       if (reg == 0)
1626         {
1627           if (reload_in_progress || reload_completed)
1628             abort ();
1629           else
1630             reg = gen_reg_rtx (Pmode);
1631
1632           subregs = 1;
1633         }
1634
1635       if (subregs)
1636         address = gen_reg_rtx (Pmode);
1637       else
1638         address = reg;
1639
1640       current_function_uses_pic_offset_table = 1;
1641
1642       if (GET_CODE (orig) == LABEL_REF
1643           || (GET_CODE (orig) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (orig)))
1644         {
1645           emit_insn (gen_gotoff_load_addr (reg, orig));
1646           emit_insn (gen_addsi3 (reg, reg, pic_offset_table_rtx));
1647           return reg;
1648         }
1649
1650       emit_insn (gen_pic_load_addr (address, orig));
1651
1652       emit_insn (gen_addsi3 (address, address, pic_offset_table_rtx));
1653       pic_ref = gen_const_mem (Pmode, address);
1654       insn = emit_move_insn (reg, pic_ref);
1655 #if 0
1656       /* Put a REG_EQUAL note on this insn, so that it can be optimized
1657          by loop.  */
1658       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, orig,
1659                   REG_NOTES (insn));
1660 #endif
1661       return reg;
1662     }
1663   else if (GET_CODE (orig) == CONST)
1664     {
1665       rtx base, offset;
1666
1667       if (GET_CODE (XEXP (orig, 0)) == PLUS
1668           && XEXP (XEXP (orig, 0), 1) == pic_offset_table_rtx)
1669         return orig;
1670
1671       if (reg == 0)
1672         {
1673           if (reload_in_progress || reload_completed)
1674             abort ();
1675           else
1676             reg = gen_reg_rtx (Pmode);
1677         }
1678
1679       if (GET_CODE (XEXP (orig, 0)) == PLUS)
1680         {
1681           base = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
1682           if (base == reg)
1683             offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), NULL_RTX);
1684           else
1685             offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), reg);
1686         }
1687       else
1688         return orig;
1689
1690       if (GET_CODE (offset) == CONST_INT)
1691         {
1692           if (INT16_P (INTVAL (offset)))
1693             return plus_constant (base, INTVAL (offset));
1694           else if (! reload_in_progress && ! reload_completed)
1695             offset = force_reg (Pmode, offset);
1696           else
1697             /* If we reach here, then something is seriously wrong.  */
1698             abort ();
1699         }
1700
1701       return gen_rtx_PLUS (Pmode, base, offset);
1702     }
1703
1704   return orig;
1705 }
1706
1707 /* Emit special PIC prologues and epilogues.  */
1708
1709 void
1710 m32r_finalize_pic (void)
1711 {
1712   current_function_uses_pic_offset_table |= current_function_profile;
1713 }
1714 \f
1715 /* Nested function support.  */
1716
1717 /* Emit RTL insns to initialize the variable parts of a trampoline.
1718    FNADDR is an RTX for the address of the function's pure code.
1719    CXT is an RTX for the static chain value for the function.  */
1720
1721 void
1722 m32r_initialize_trampoline (rtx tramp ATTRIBUTE_UNUSED,
1723                             rtx fnaddr ATTRIBUTE_UNUSED,
1724                             rtx cxt ATTRIBUTE_UNUSED)
1725 {
1726 }
1727 \f
1728 static void
1729 m32r_file_start (void)
1730 {
1731   default_file_start ();
1732
1733   if (flag_verbose_asm)
1734     fprintf (asm_out_file,
1735              "%s M32R/D special options: -G " HOST_WIDE_INT_PRINT_UNSIGNED "\n",
1736              ASM_COMMENT_START, g_switch_value);
1737
1738   if (TARGET_LITTLE_ENDIAN)
1739     fprintf (asm_out_file, "\t.little\n");
1740 }
1741 \f
1742 /* Print operand X (an rtx) in assembler syntax to file FILE.
1743    CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
1744    For `%' followed by punctuation, CODE is the punctuation and X is null.  */
1745
1746 void
1747 m32r_print_operand (FILE * file, rtx x, int code)
1748 {
1749   rtx addr;
1750
1751   switch (code)
1752     {
1753       /* The 's' and 'p' codes are used by output_block_move() to
1754          indicate post-increment 's'tores and 'p're-increment loads.  */
1755     case 's':
1756       if (GET_CODE (x) == REG)
1757         fprintf (file, "@+%s", reg_names [REGNO (x)]);
1758       else
1759         output_operand_lossage ("invalid operand to %%s code");
1760       return;
1761       
1762     case 'p':
1763       if (GET_CODE (x) == REG)
1764         fprintf (file, "@%s+", reg_names [REGNO (x)]);
1765       else
1766         output_operand_lossage ("invalid operand to %%p code");
1767       return;
1768
1769     case 'R' :
1770       /* Write second word of DImode or DFmode reference,
1771          register or memory.  */
1772       if (GET_CODE (x) == REG)
1773         fputs (reg_names[REGNO (x)+1], file);
1774       else if (GET_CODE (x) == MEM)
1775         {
1776           fprintf (file, "@(");
1777           /* Handle possible auto-increment.  Since it is pre-increment and
1778              we have already done it, we can just use an offset of four.  */
1779           /* ??? This is taken from rs6000.c I think.  I don't think it is
1780              currently necessary, but keep it around.  */
1781           if (GET_CODE (XEXP (x, 0)) == PRE_INC
1782               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
1783             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 4));
1784           else
1785             output_address (plus_constant (XEXP (x, 0), 4));
1786           fputc (')', file);
1787         }
1788       else
1789         output_operand_lossage ("invalid operand to %%R code");
1790       return;
1791
1792     case 'H' : /* High word.  */
1793     case 'L' : /* Low word.  */
1794       if (GET_CODE (x) == REG)
1795         {
1796           /* L = least significant word, H = most significant word.  */
1797           if ((WORDS_BIG_ENDIAN != 0) ^ (code == 'L'))
1798             fputs (reg_names[REGNO (x)], file);
1799           else
1800             fputs (reg_names[REGNO (x)+1], file);
1801         }
1802       else if (GET_CODE (x) == CONST_INT
1803                || GET_CODE (x) == CONST_DOUBLE)
1804         {
1805           rtx first, second;
1806
1807           split_double (x, &first, &second);
1808           fprintf (file, HOST_WIDE_INT_PRINT_HEX,
1809                    code == 'L' ? INTVAL (first) : INTVAL (second));
1810         }
1811       else
1812         output_operand_lossage ("invalid operand to %%H/%%L code");
1813       return;
1814
1815     case 'A' :
1816       {
1817         char str[30];
1818
1819         if (GET_CODE (x) != CONST_DOUBLE
1820             || GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT)
1821           fatal_insn ("bad insn for 'A'", x);
1822
1823         real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (x), sizeof (str), 0, 1);
1824         fprintf (file, "%s", str);
1825         return;
1826       }
1827
1828     case 'B' : /* Bottom half.  */
1829     case 'T' : /* Top half.  */
1830       /* Output the argument to a `seth' insn (sets the Top half-word).
1831          For constants output arguments to a seth/or3 pair to set Top and
1832          Bottom halves.  For symbols output arguments to a seth/add3 pair to
1833          set Top and Bottom halves.  The difference exists because for
1834          constants seth/or3 is more readable but for symbols we need to use
1835          the same scheme as `ld' and `st' insns (16 bit addend is signed).  */
1836       switch (GET_CODE (x))
1837         {
1838         case CONST_INT :
1839         case CONST_DOUBLE :
1840           {
1841             rtx first, second;
1842
1843             split_double (x, &first, &second);
1844             x = WORDS_BIG_ENDIAN ? second : first;
1845             fprintf (file, HOST_WIDE_INT_PRINT_HEX,
1846                      (code == 'B'
1847                       ? INTVAL (x) & 0xffff
1848                       : (INTVAL (x) >> 16) & 0xffff));
1849           }
1850           return;
1851         case CONST :
1852         case SYMBOL_REF :
1853           if (code == 'B'
1854               && small_data_operand (x, VOIDmode))
1855             {
1856               fputs ("sda(", file);
1857               output_addr_const (file, x);
1858               fputc (')', file);
1859               return;
1860             }
1861           /* fall through */
1862         case LABEL_REF :
1863           fputs (code == 'T' ? "shigh(" : "low(", file);
1864           output_addr_const (file, x);
1865           fputc (')', file);
1866           return;
1867         default :
1868           output_operand_lossage ("invalid operand to %%T/%%B code");
1869           return;
1870         }
1871       break;
1872
1873     case 'U' :
1874       /* ??? wip */
1875       /* Output a load/store with update indicator if appropriate.  */
1876       if (GET_CODE (x) == MEM)
1877         {
1878           if (GET_CODE (XEXP (x, 0)) == PRE_INC
1879               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
1880             fputs (".a", file);
1881         }
1882       else
1883         output_operand_lossage ("invalid operand to %%U code");
1884       return;
1885
1886     case 'N' :
1887       /* Print a constant value negated.  */
1888       if (GET_CODE (x) == CONST_INT)
1889         output_addr_const (file, GEN_INT (- INTVAL (x)));
1890       else
1891         output_operand_lossage ("invalid operand to %%N code");
1892       return;
1893
1894     case 'X' :
1895       /* Print a const_int in hex.  Used in comments.  */
1896       if (GET_CODE (x) == CONST_INT)
1897         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
1898       return;
1899
1900     case '#' :
1901       fputs (IMMEDIATE_PREFIX, file);
1902       return;
1903
1904     case 0 :
1905       /* Do nothing special.  */
1906       break;
1907
1908     default :
1909       /* Unknown flag.  */
1910       output_operand_lossage ("invalid operand output code");
1911     }
1912
1913   switch (GET_CODE (x))
1914     {
1915     case REG :
1916       fputs (reg_names[REGNO (x)], file);
1917       break;
1918
1919     case MEM :
1920       addr = XEXP (x, 0);
1921       if (GET_CODE (addr) == PRE_INC)
1922         {
1923           if (GET_CODE (XEXP (addr, 0)) != REG)
1924             fatal_insn ("pre-increment address is not a register", x);
1925
1926           fprintf (file, "@+%s", reg_names[REGNO (XEXP (addr, 0))]);
1927         }
1928       else if (GET_CODE (addr) == PRE_DEC)
1929         {
1930           if (GET_CODE (XEXP (addr, 0)) != REG)
1931             fatal_insn ("pre-decrement address is not a register", x);
1932
1933           fprintf (file, "@-%s", reg_names[REGNO (XEXP (addr, 0))]);
1934         }
1935       else if (GET_CODE (addr) == POST_INC)
1936         {
1937           if (GET_CODE (XEXP (addr, 0)) != REG)
1938             fatal_insn ("post-increment address is not a register", x);
1939
1940           fprintf (file, "@%s+", reg_names[REGNO (XEXP (addr, 0))]);
1941         }
1942       else
1943         {
1944           fputs ("@(", file);
1945           output_address (XEXP (x, 0));
1946           fputc (')', file);
1947         }
1948       break;
1949
1950     case CONST_DOUBLE :
1951       /* We handle SFmode constants here as output_addr_const doesn't.  */
1952       if (GET_MODE (x) == SFmode)
1953         {
1954           REAL_VALUE_TYPE d;
1955           long l;
1956
1957           REAL_VALUE_FROM_CONST_DOUBLE (d, x);
1958           REAL_VALUE_TO_TARGET_SINGLE (d, l);
1959           fprintf (file, "0x%08lx", l);
1960           break;
1961         }
1962
1963       /* Fall through.  Let output_addr_const deal with it.  */
1964
1965     default :
1966       output_addr_const (file, x);
1967       break;
1968     }
1969 }
1970
1971 /* Print a memory address as an operand to reference that memory location.  */
1972
1973 void
1974 m32r_print_operand_address (FILE * file, rtx addr)
1975 {
1976   rtx base;
1977   rtx index = 0;
1978   int offset = 0;
1979
1980   switch (GET_CODE (addr))
1981     {
1982     case REG :
1983       fputs (reg_names[REGNO (addr)], file);
1984       break;
1985
1986     case PLUS :
1987       if (GET_CODE (XEXP (addr, 0)) == CONST_INT)
1988         offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
1989       else if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
1990         offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
1991       else
1992         base = XEXP (addr, 0), index = XEXP (addr, 1);
1993       if (GET_CODE (base) == REG)
1994         {
1995           /* Print the offset first (if present) to conform to the manual.  */
1996           if (index == 0)
1997             {
1998               if (offset != 0)
1999                 fprintf (file, "%d,", offset);
2000               fputs (reg_names[REGNO (base)], file);
2001             }
2002           /* The chip doesn't support this, but left in for generality.  */
2003           else if (GET_CODE (index) == REG)
2004             fprintf (file, "%s,%s",
2005                      reg_names[REGNO (base)], reg_names[REGNO (index)]);
2006           /* Not sure this can happen, but leave in for now.  */
2007           else if (GET_CODE (index) == SYMBOL_REF)
2008             {
2009               output_addr_const (file, index);
2010               fputc (',', file);
2011               fputs (reg_names[REGNO (base)], file);
2012             }
2013           else
2014             fatal_insn ("bad address", addr);
2015         }
2016       else if (GET_CODE (base) == LO_SUM)
2017         {
2018           if (index != 0
2019               || GET_CODE (XEXP (base, 0)) != REG)
2020             abort ();
2021           if (small_data_operand (XEXP (base, 1), VOIDmode))
2022             fputs ("sda(", file);
2023           else
2024             fputs ("low(", file);
2025           output_addr_const (file, plus_constant (XEXP (base, 1), offset));
2026           fputs ("),", file);
2027           fputs (reg_names[REGNO (XEXP (base, 0))], file);
2028         }
2029       else
2030         fatal_insn ("bad address", addr);
2031       break;
2032
2033     case LO_SUM :
2034       if (GET_CODE (XEXP (addr, 0)) != REG)
2035         fatal_insn ("lo_sum not of register", addr);
2036       if (small_data_operand (XEXP (addr, 1), VOIDmode))
2037         fputs ("sda(", file);
2038       else
2039         fputs ("low(", file);
2040       output_addr_const (file, XEXP (addr, 1));
2041       fputs ("),", file);
2042       fputs (reg_names[REGNO (XEXP (addr, 0))], file);
2043       break;
2044
2045     case PRE_INC :      /* Assume SImode.  */
2046       fprintf (file, "+%s", reg_names[REGNO (XEXP (addr, 0))]);
2047       break;
2048
2049     case PRE_DEC :      /* Assume SImode.  */
2050       fprintf (file, "-%s", reg_names[REGNO (XEXP (addr, 0))]);
2051       break;
2052
2053     case POST_INC :     /* Assume SImode.  */
2054       fprintf (file, "%s+", reg_names[REGNO (XEXP (addr, 0))]);
2055       break;
2056
2057     default :
2058       output_addr_const (file, addr);
2059       break;
2060     }
2061 }
2062
2063 /* Return true if the operands are the constants 0 and 1.  */
2064
2065 int
2066 zero_and_one (rtx operand1, rtx operand2)
2067 {
2068   return
2069        GET_CODE (operand1) == CONST_INT
2070     && GET_CODE (operand2) == CONST_INT
2071     && (  ((INTVAL (operand1) == 0) && (INTVAL (operand2) == 1))
2072         ||((INTVAL (operand1) == 1) && (INTVAL (operand2) == 0)));
2073 }
2074
2075 /* Generate the correct assembler code to handle the conditional loading of a
2076    value into a register.  It is known that the operands satisfy the
2077    conditional_move_operand() function above.  The destination is operand[0].
2078    The condition is operand [1].  The 'true' value is operand [2] and the
2079    'false' value is operand [3].  */
2080
2081 char *
2082 emit_cond_move (rtx * operands, rtx insn ATTRIBUTE_UNUSED)
2083 {
2084   static char buffer [100];
2085   const char * dest = reg_names [REGNO (operands [0])];
2086   
2087   buffer [0] = 0;
2088   
2089   /* Destination must be a register.  */
2090   if (GET_CODE (operands [0]) != REG)
2091     abort();
2092   if (! conditional_move_operand (operands [2], SImode))
2093     abort();
2094   if (! conditional_move_operand (operands [3], SImode))
2095     abort();
2096       
2097   /* Check to see if the test is reversed.  */
2098   if (GET_CODE (operands [1]) == NE)
2099     {
2100       rtx tmp = operands [2];
2101       operands [2] = operands [3];
2102       operands [3] = tmp;
2103     }
2104
2105   sprintf (buffer, "mvfc %s, cbr", dest);
2106
2107   /* If the true value was '0' then we need to invert the results of the move.  */
2108   if (INTVAL (operands [2]) == 0)
2109     sprintf (buffer + strlen (buffer), "\n\txor3 %s, %s, #1",
2110              dest, dest);
2111
2112   return buffer;
2113 }
2114
2115 /* Returns true if the registers contained in the two
2116    rtl expressions are different.  */
2117
2118 int
2119 m32r_not_same_reg (rtx a, rtx b)
2120 {
2121   int reg_a = -1;
2122   int reg_b = -2;
2123   
2124   while (GET_CODE (a) == SUBREG)
2125     a = SUBREG_REG (a);
2126   
2127   if (GET_CODE (a) == REG)
2128     reg_a = REGNO (a);
2129   
2130   while (GET_CODE (b) == SUBREG)
2131     b = SUBREG_REG (b);
2132   
2133   if (GET_CODE (b) == REG)
2134     reg_b = REGNO (b);
2135   
2136   return reg_a != reg_b;
2137 }
2138
2139 \f
2140 rtx
2141 m32r_function_symbol (const char *name)
2142 {
2143   int extra_flags = 0;
2144   enum m32r_model model;
2145   rtx sym = gen_rtx_SYMBOL_REF (Pmode, name);
2146
2147   if (TARGET_MODEL_SMALL)
2148     model = M32R_MODEL_SMALL;
2149   else if (TARGET_MODEL_MEDIUM)
2150     model = M32R_MODEL_MEDIUM;
2151   else if (TARGET_MODEL_LARGE)
2152     model = M32R_MODEL_LARGE;
2153   else
2154     abort (); /* Shouldn't happen.  */
2155   extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
2156                                                                                 
2157   if (extra_flags)
2158     SYMBOL_REF_FLAGS (sym) |= extra_flags;
2159
2160   return sym;
2161 }
2162
2163 /* Use a library function to move some bytes.  */
2164
2165 static void
2166 block_move_call (rtx dest_reg, rtx src_reg, rtx bytes_rtx)
2167 {
2168   /* We want to pass the size as Pmode, which will normally be SImode
2169      but will be DImode if we are using 64 bit longs and pointers.  */
2170   if (GET_MODE (bytes_rtx) != VOIDmode
2171       && GET_MODE (bytes_rtx) != Pmode)
2172     bytes_rtx = convert_to_mode (Pmode, bytes_rtx, 1);
2173
2174   emit_library_call (m32r_function_symbol ("memcpy"), 0,
2175                      VOIDmode, 3, dest_reg, Pmode, src_reg, Pmode,
2176                      convert_to_mode (TYPE_MODE (sizetype), bytes_rtx,
2177                                       TYPE_UNSIGNED (sizetype)),
2178                      TYPE_MODE (sizetype));
2179 }
2180
2181 /* Expand string/block move operations.
2182
2183    operands[0] is the pointer to the destination.
2184    operands[1] is the pointer to the source.
2185    operands[2] is the number of bytes to move.
2186    operands[3] is the alignment.  */
2187
2188 void
2189 m32r_expand_block_move (rtx operands[])
2190 {
2191   rtx           orig_dst  = operands[0];
2192   rtx           orig_src  = operands[1];
2193   rtx           bytes_rtx = operands[2];
2194   rtx           align_rtx = operands[3];
2195   int           constp    = GET_CODE (bytes_rtx) == CONST_INT;
2196   HOST_WIDE_INT bytes     = constp ? INTVAL (bytes_rtx) : 0;
2197   int           align     = INTVAL (align_rtx);
2198   int           leftover;
2199   rtx           src_reg;
2200   rtx           dst_reg;
2201
2202   if (constp && bytes <= 0)
2203     return;
2204
2205   /* Move the address into scratch registers.  */
2206   dst_reg = copy_addr_to_reg (XEXP (orig_dst, 0));
2207   src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
2208
2209   if (align > UNITS_PER_WORD)
2210     align = UNITS_PER_WORD;
2211
2212   /* If we prefer size over speed, always use a function call.
2213      If we do not know the size, use a function call.
2214      If the blocks are not word aligned, use a function call.  */
2215   if (optimize_size || ! constp || align != UNITS_PER_WORD)
2216     {
2217       block_move_call (dst_reg, src_reg, bytes_rtx);
2218       return;
2219     }
2220
2221   leftover = bytes % MAX_MOVE_BYTES;
2222   bytes   -= leftover;
2223   
2224   /* If necessary, generate a loop to handle the bulk of the copy.  */
2225   if (bytes)
2226     {
2227       rtx label = NULL_RTX;
2228       rtx final_src = NULL_RTX;
2229       rtx at_a_time = GEN_INT (MAX_MOVE_BYTES);
2230       rtx rounded_total = GEN_INT (bytes);
2231       rtx new_dst_reg = gen_reg_rtx (SImode);
2232       rtx new_src_reg = gen_reg_rtx (SImode);
2233
2234       /* If we are going to have to perform this loop more than
2235          once, then generate a label and compute the address the
2236          source register will contain upon completion of the final
2237          iteration.  */
2238       if (bytes > MAX_MOVE_BYTES)
2239         {
2240           final_src = gen_reg_rtx (Pmode);
2241
2242           if (INT16_P(bytes))
2243             emit_insn (gen_addsi3 (final_src, src_reg, rounded_total));
2244           else
2245             {
2246               emit_insn (gen_movsi (final_src, rounded_total));
2247               emit_insn (gen_addsi3 (final_src, final_src, src_reg));
2248             }
2249
2250           label = gen_label_rtx ();
2251           emit_label (label);
2252         }
2253
2254       /* It is known that output_block_move() will update src_reg to point
2255          to the word after the end of the source block, and dst_reg to point
2256          to the last word of the destination block, provided that the block
2257          is MAX_MOVE_BYTES long.  */
2258       emit_insn (gen_movmemsi_internal (dst_reg, src_reg, at_a_time,
2259                                         new_dst_reg, new_src_reg));
2260       emit_move_insn (dst_reg, new_dst_reg);
2261       emit_move_insn (src_reg, new_src_reg);
2262       emit_insn (gen_addsi3 (dst_reg, dst_reg, GEN_INT (4)));
2263       
2264       if (bytes > MAX_MOVE_BYTES)
2265         {
2266           emit_insn (gen_cmpsi (src_reg, final_src));
2267           emit_jump_insn (gen_bne (label));
2268         }
2269     }
2270
2271   if (leftover)
2272     emit_insn (gen_movmemsi_internal (dst_reg, src_reg, GEN_INT (leftover),
2273                                       gen_reg_rtx (SImode),
2274                                       gen_reg_rtx (SImode)));
2275 }
2276
2277 \f
2278 /* Emit load/stores for a small constant word aligned block_move. 
2279
2280    operands[0] is the memory address of the destination.
2281    operands[1] is the memory address of the source.
2282    operands[2] is the number of bytes to move.
2283    operands[3] is a temp register.
2284    operands[4] is a temp register.  */
2285
2286 void
2287 m32r_output_block_move (rtx insn ATTRIBUTE_UNUSED, rtx operands[])
2288 {
2289   HOST_WIDE_INT bytes = INTVAL (operands[2]);
2290   int           first_time;
2291   int           got_extra = 0;
2292   
2293   if (bytes < 1 || bytes > MAX_MOVE_BYTES)
2294     abort ();
2295   
2296   /* We do not have a post-increment store available, so the first set of
2297      stores are done without any increment, then the remaining ones can use
2298      the pre-increment addressing mode.
2299      
2300      Note: expand_block_move() also relies upon this behavior when building
2301      loops to copy large blocks.  */
2302   first_time = 1;
2303   
2304   while (bytes > 0)
2305     {
2306       if (bytes >= 8)
2307         {
2308           if (first_time)
2309             {
2310               output_asm_insn ("ld\t%5, %p1", operands);
2311               output_asm_insn ("ld\t%6, %p1", operands);
2312               output_asm_insn ("st\t%5, @%0", operands);
2313               output_asm_insn ("st\t%6, %s0", operands);
2314             }
2315           else
2316             {
2317               output_asm_insn ("ld\t%5, %p1", operands);
2318               output_asm_insn ("ld\t%6, %p1", operands);
2319               output_asm_insn ("st\t%5, %s0", operands);
2320               output_asm_insn ("st\t%6, %s0", operands);
2321             }
2322
2323           bytes -= 8;
2324         }
2325       else if (bytes >= 4)
2326         {
2327           if (bytes > 4)
2328             got_extra = 1;
2329           
2330           output_asm_insn ("ld\t%5, %p1", operands);
2331           
2332           if (got_extra)
2333             output_asm_insn ("ld\t%6, %p1", operands);
2334                 
2335           if (first_time)
2336             output_asm_insn ("st\t%5, @%0", operands);
2337           else
2338             output_asm_insn ("st\t%5, %s0", operands);
2339
2340           bytes -= 4;
2341         }
2342       else 
2343         {
2344           /* Get the entire next word, even though we do not want all of it.
2345              The saves us from doing several smaller loads, and we assume that
2346              we cannot cause a page fault when at least part of the word is in
2347              valid memory [since we don't get called if things aren't properly
2348              aligned].  */
2349           int dst_offset = first_time ? 0 : 4;
2350           /* The amount of increment we have to make to the
2351              destination pointer.  */
2352           int dst_inc_amount = dst_offset + bytes - 4;
2353           /* The same for the source pointer.  */
2354           int src_inc_amount = bytes;
2355           int last_shift;
2356           rtx my_operands[3];
2357
2358           /* If got_extra is true then we have already loaded
2359              the next word as part of loading and storing the previous word.  */
2360           if (! got_extra)
2361             output_asm_insn ("ld\t%6, @%1", operands);
2362
2363           if (bytes >= 2)
2364             {
2365               bytes -= 2;
2366
2367               output_asm_insn ("sra3\t%5, %6, #16", operands);
2368               my_operands[0] = operands[5];
2369               my_operands[1] = GEN_INT (dst_offset);
2370               my_operands[2] = operands[0];
2371               output_asm_insn ("sth\t%0, @(%1,%2)", my_operands);
2372               
2373               /* If there is a byte left to store then increment the
2374                  destination address and shift the contents of the source
2375                  register down by 8 bits.  We could not do the address
2376                  increment in the store half word instruction, because it does
2377                  not have an auto increment mode.  */
2378               if (bytes > 0)  /* assert (bytes == 1) */
2379                 {
2380                   dst_offset += 2;
2381                   last_shift = 8;
2382                 }
2383             }
2384           else
2385             last_shift = 24;
2386
2387           if (bytes > 0)
2388             {
2389               my_operands[0] = operands[6];
2390               my_operands[1] = GEN_INT (last_shift);
2391               output_asm_insn ("srai\t%0, #%1", my_operands);
2392               my_operands[0] = operands[6];
2393               my_operands[1] = GEN_INT (dst_offset);
2394               my_operands[2] = operands[0];
2395               output_asm_insn ("stb\t%0, @(%1,%2)", my_operands);
2396             }
2397
2398           /* Update the destination pointer if needed.  We have to do
2399              this so that the patterns matches what we output in this
2400              function.  */
2401           if (dst_inc_amount
2402               && !find_reg_note (insn, REG_UNUSED, operands[0]))
2403             {
2404               my_operands[0] = operands[0];
2405               my_operands[1] = GEN_INT (dst_inc_amount);
2406               output_asm_insn ("addi\t%0, #%1", my_operands);
2407             }
2408           
2409           /* Update the source pointer if needed.  We have to do this
2410              so that the patterns matches what we output in this
2411              function.  */
2412           if (src_inc_amount
2413               && !find_reg_note (insn, REG_UNUSED, operands[1]))
2414             {
2415               my_operands[0] = operands[1];
2416               my_operands[1] = GEN_INT (src_inc_amount);
2417               output_asm_insn ("addi\t%0, #%1", my_operands);
2418             }
2419           
2420           bytes = 0;
2421         }
2422
2423       first_time = 0;
2424     }
2425 }
2426
2427 /* Return true if using NEW_REG in place of OLD_REG is ok.  */
2428
2429 int
2430 m32r_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
2431                            unsigned int new_reg)
2432 {
2433   /* Interrupt routines can't clobber any register that isn't already used.  */
2434   if (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl))
2435       && !regs_ever_live[new_reg])
2436     return 0;
2437
2438   /* We currently emit epilogues as text, not rtl, so the liveness
2439      of the return address register isn't visible.  */
2440   if (current_function_is_leaf && new_reg == RETURN_ADDR_REGNUM)
2441     return 0;
2442
2443   return 1;
2444 }
2445
2446 rtx
2447 m32r_return_addr (int count)
2448 {
2449   if (count != 0)
2450     return const0_rtx;
2451   
2452   return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
2453 }