* tree-ssa-phiopt.c, config/arm/arm.c, config/fr30/fr30.md,
[official-gcc.git] / gcc / config / m32r / m32r.c
blobee3f0039cf450a53fc3fadf3f0b8a51ff17cb598
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.
5 This file is part of GCC.
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.
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.
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. */
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"
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;
50 /* Array of valid operand punctuation characters. */
51 char m32r_punct_chars[256];
53 /* Selected code model. */
54 enum m32r_model m32r_model = M32R_MODEL_DEFAULT;
56 /* Selected SDA support. */
57 enum m32r_sdata m32r_sdata = M32R_SDATA_DEFAULT;
59 /* Machine-specific symbol_ref flags. */
60 #define SYMBOL_FLAG_MODEL_SHIFT SYMBOL_FLAG_MACH_DEP_SHIFT
61 #define SYMBOL_REF_MODEL(X) \
62 ((enum m32r_model) ((SYMBOL_REF_FLAGS (X) >> SYMBOL_FLAG_MODEL_SHIFT) & 3))
64 /* For string literals, etc. */
65 #define LIT_NAME_P(NAME) ((NAME)[0] == '*' && (NAME)[1] == '.')
67 /* Cache-flush support. Cache-flush is used at trampoline.
68 Default cache-flush is "trap 12".
69 default cache-flush function is "_flush_cache" (CACHE_FLUSH_FUNC)
70 default cache-flush trap-interrupt number is 12 (CACHE_FLUSH_TRAP)
71 You can change how to generate code of cache-flush with following options.
72 -mflush-func=FLUSH-FUNC-NAME
73 -mno-flush-func (sets m32r_cache_flush_func to NULL)
74 -mfluch-trap=TRAP-NUMBER
75 -mno-flush-trap. (sets m32r_cache_flush_trap to -1). */
76 const char *m32r_cache_flush_func = CACHE_FLUSH_FUNC;
77 int m32r_cache_flush_trap = CACHE_FLUSH_TRAP;
79 /* Forward declaration. */
80 static bool m32r_handle_option (size_t, const char *, int);
81 static void init_reg_tables (void);
82 static void block_move_call (rtx, rtx, rtx);
83 static int m32r_is_insn (rtx);
84 const struct attribute_spec m32r_attribute_table[];
85 static tree m32r_handle_model_attribute (tree *, tree, tree, int, bool *);
86 static void m32r_output_function_prologue (FILE *, HOST_WIDE_INT);
87 static void m32r_output_function_epilogue (FILE *, HOST_WIDE_INT);
89 static void m32r_file_start (void);
91 static int m32r_adjust_priority (rtx, int);
92 static int m32r_issue_rate (void);
94 static void m32r_encode_section_info (tree, rtx, int);
95 static bool m32r_in_small_data_p (tree);
96 static bool m32r_return_in_memory (tree, tree);
97 static void m32r_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
98 tree, int *, int);
99 static void init_idents (void);
100 static bool m32r_rtx_costs (rtx, int, int, int *);
101 static bool m32r_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
102 tree, bool);
103 static int m32r_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
104 tree, bool);
106 /* Initialize the GCC target structure. */
107 #undef TARGET_ATTRIBUTE_TABLE
108 #define TARGET_ATTRIBUTE_TABLE m32r_attribute_table
110 #undef TARGET_ASM_ALIGNED_HI_OP
111 #define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
112 #undef TARGET_ASM_ALIGNED_SI_OP
113 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
115 #undef TARGET_ASM_FUNCTION_PROLOGUE
116 #define TARGET_ASM_FUNCTION_PROLOGUE m32r_output_function_prologue
117 #undef TARGET_ASM_FUNCTION_EPILOGUE
118 #define TARGET_ASM_FUNCTION_EPILOGUE m32r_output_function_epilogue
120 #undef TARGET_ASM_FILE_START
121 #define TARGET_ASM_FILE_START m32r_file_start
123 #undef TARGET_SCHED_ADJUST_PRIORITY
124 #define TARGET_SCHED_ADJUST_PRIORITY m32r_adjust_priority
125 #undef TARGET_SCHED_ISSUE_RATE
126 #define TARGET_SCHED_ISSUE_RATE m32r_issue_rate
128 #undef TARGET_DEFAULT_TARGET_FLAGS
129 #define TARGET_DEFAULT_TARGET_FLAGS TARGET_CPU_DEFAULT
130 #undef TARGET_HANDLE_OPTION
131 #define TARGET_HANDLE_OPTION m32r_handle_option
133 #undef TARGET_ENCODE_SECTION_INFO
134 #define TARGET_ENCODE_SECTION_INFO m32r_encode_section_info
135 #undef TARGET_IN_SMALL_DATA_P
136 #define TARGET_IN_SMALL_DATA_P m32r_in_small_data_p
138 #undef TARGET_RTX_COSTS
139 #define TARGET_RTX_COSTS m32r_rtx_costs
140 #undef TARGET_ADDRESS_COST
141 #define TARGET_ADDRESS_COST hook_int_rtx_0
143 #undef TARGET_PROMOTE_PROTOTYPES
144 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
145 #undef TARGET_RETURN_IN_MEMORY
146 #define TARGET_RETURN_IN_MEMORY m32r_return_in_memory
147 #undef TARGET_SETUP_INCOMING_VARARGS
148 #define TARGET_SETUP_INCOMING_VARARGS m32r_setup_incoming_varargs
149 #undef TARGET_MUST_PASS_IN_STACK
150 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
151 #undef TARGET_PASS_BY_REFERENCE
152 #define TARGET_PASS_BY_REFERENCE m32r_pass_by_reference
153 #undef TARGET_ARG_PARTIAL_BYTES
154 #define TARGET_ARG_PARTIAL_BYTES m32r_arg_partial_bytes
156 struct gcc_target targetm = TARGET_INITIALIZER;
158 /* Implement TARGET_HANDLE_OPTION. */
160 static bool
161 m32r_handle_option (size_t code, const char *arg, int value)
163 switch (code)
165 case OPT_m32r:
166 target_flags &= ~(MASK_M32R2 | MASK_M32RX);
167 return true;
169 case OPT_mmodel_:
170 if (strcmp (arg, "small") == 0)
171 m32r_model = M32R_MODEL_SMALL;
172 else if (strcmp (arg, "medium") == 0)
173 m32r_model = M32R_MODEL_MEDIUM;
174 else if (strcmp (arg, "large") == 0)
175 m32r_model = M32R_MODEL_LARGE;
176 else
177 return false;
178 return true;
180 case OPT_msdata_:
181 if (strcmp (arg, "none") == 0)
182 m32r_sdata = M32R_SDATA_NONE;
183 else if (strcmp (arg, "sdata") == 0)
184 m32r_sdata = M32R_SDATA_SDATA;
185 else if (strcmp (arg, "use") == 0)
186 m32r_sdata = M32R_SDATA_USE;
187 else
188 return false;
189 return true;
191 case OPT_mflush_func_:
192 m32r_cache_flush_func = arg;
193 return true;
195 case OPT_mno_flush_func:
196 m32r_cache_flush_func = NULL;
197 return true;
199 case OPT_mflush_trap_:
200 m32r_cache_flush_trap = value;
201 return m32r_cache_flush_trap <= 15;
203 case OPT_mno_flush_trap:
204 m32r_cache_flush_trap = -1;
205 return true;
207 default:
208 return true;
212 /* Called by OVERRIDE_OPTIONS to initialize various things. */
214 void
215 m32r_init (void)
217 init_reg_tables ();
219 /* Initialize array for PRINT_OPERAND_PUNCT_VALID_P. */
220 memset (m32r_punct_chars, 0, sizeof (m32r_punct_chars));
221 m32r_punct_chars['#'] = 1;
222 m32r_punct_chars['@'] = 1; /* ??? no longer used */
224 /* Provide default value if not specified. */
225 if (!g_switch_set)
226 g_switch_value = SDATA_DEFAULT_SIZE;
229 /* Vectors to keep interesting information about registers where it can easily
230 be got. We use to use the actual mode value as the bit number, but there
231 is (or may be) more than 32 modes now. Instead we use two tables: one
232 indexed by hard register number, and one indexed by mode. */
234 /* The purpose of m32r_mode_class is to shrink the range of modes so that
235 they all fit (as bit numbers) in a 32 bit word (again). Each real mode is
236 mapped into one m32r_mode_class mode. */
238 enum m32r_mode_class
240 C_MODE,
241 S_MODE, D_MODE, T_MODE, O_MODE,
242 SF_MODE, DF_MODE, TF_MODE, OF_MODE, A_MODE
245 /* Modes for condition codes. */
246 #define C_MODES (1 << (int) C_MODE)
248 /* Modes for single-word and smaller quantities. */
249 #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
251 /* Modes for double-word and smaller quantities. */
252 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
254 /* Modes for quad-word and smaller quantities. */
255 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
257 /* Modes for accumulators. */
258 #define A_MODES (1 << (int) A_MODE)
260 /* Value is 1 if register/mode pair is acceptable on arc. */
262 const unsigned int m32r_hard_regno_mode_ok[FIRST_PSEUDO_REGISTER] =
264 T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES,
265 T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, S_MODES, S_MODES, S_MODES,
266 S_MODES, C_MODES, A_MODES, A_MODES
269 unsigned int m32r_mode_class [NUM_MACHINE_MODES];
271 enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER];
273 static void
274 init_reg_tables (void)
276 int i;
278 for (i = 0; i < NUM_MACHINE_MODES; i++)
280 switch (GET_MODE_CLASS (i))
282 case MODE_INT:
283 case MODE_PARTIAL_INT:
284 case MODE_COMPLEX_INT:
285 if (GET_MODE_SIZE (i) <= 4)
286 m32r_mode_class[i] = 1 << (int) S_MODE;
287 else if (GET_MODE_SIZE (i) == 8)
288 m32r_mode_class[i] = 1 << (int) D_MODE;
289 else if (GET_MODE_SIZE (i) == 16)
290 m32r_mode_class[i] = 1 << (int) T_MODE;
291 else if (GET_MODE_SIZE (i) == 32)
292 m32r_mode_class[i] = 1 << (int) O_MODE;
293 else
294 m32r_mode_class[i] = 0;
295 break;
296 case MODE_FLOAT:
297 case MODE_COMPLEX_FLOAT:
298 if (GET_MODE_SIZE (i) <= 4)
299 m32r_mode_class[i] = 1 << (int) SF_MODE;
300 else if (GET_MODE_SIZE (i) == 8)
301 m32r_mode_class[i] = 1 << (int) DF_MODE;
302 else if (GET_MODE_SIZE (i) == 16)
303 m32r_mode_class[i] = 1 << (int) TF_MODE;
304 else if (GET_MODE_SIZE (i) == 32)
305 m32r_mode_class[i] = 1 << (int) OF_MODE;
306 else
307 m32r_mode_class[i] = 0;
308 break;
309 case MODE_CC:
310 m32r_mode_class[i] = 1 << (int) C_MODE;
311 break;
312 default:
313 m32r_mode_class[i] = 0;
314 break;
318 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
320 if (GPR_P (i))
321 m32r_regno_reg_class[i] = GENERAL_REGS;
322 else if (i == ARG_POINTER_REGNUM)
323 m32r_regno_reg_class[i] = GENERAL_REGS;
324 else
325 m32r_regno_reg_class[i] = NO_REGS;
329 /* M32R specific attribute support.
331 interrupt - for interrupt functions
333 model - select code model used to access object
335 small: addresses use 24 bits, use bl to make calls
336 medium: addresses use 32 bits, use bl to make calls
337 large: addresses use 32 bits, use seth/add3/jl to make calls
339 Grep for MODEL in m32r.h for more info. */
341 static tree small_ident1;
342 static tree small_ident2;
343 static tree medium_ident1;
344 static tree medium_ident2;
345 static tree large_ident1;
346 static tree large_ident2;
348 static void
349 init_idents (void)
351 if (small_ident1 == 0)
353 small_ident1 = get_identifier ("small");
354 small_ident2 = get_identifier ("__small__");
355 medium_ident1 = get_identifier ("medium");
356 medium_ident2 = get_identifier ("__medium__");
357 large_ident1 = get_identifier ("large");
358 large_ident2 = get_identifier ("__large__");
362 const struct attribute_spec m32r_attribute_table[] =
364 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
365 { "interrupt", 0, 0, true, false, false, NULL },
366 { "model", 1, 1, true, false, false, m32r_handle_model_attribute },
367 { NULL, 0, 0, false, false, false, NULL }
371 /* Handle an "model" attribute; arguments as in
372 struct attribute_spec.handler. */
373 static tree
374 m32r_handle_model_attribute (tree *node ATTRIBUTE_UNUSED, tree name,
375 tree args, int flags ATTRIBUTE_UNUSED,
376 bool *no_add_attrs)
378 tree arg;
380 init_idents ();
381 arg = TREE_VALUE (args);
383 if (arg != small_ident1
384 && arg != small_ident2
385 && arg != medium_ident1
386 && arg != medium_ident2
387 && arg != large_ident1
388 && arg != large_ident2)
390 warning ("invalid argument of %qs attribute",
391 IDENTIFIER_POINTER (name));
392 *no_add_attrs = true;
395 return NULL_TREE;
398 /* Encode section information of DECL, which is either a VAR_DECL,
399 FUNCTION_DECL, STRING_CST, CONSTRUCTOR, or ???.
401 For the M32R we want to record:
403 - whether the object lives in .sdata/.sbss.
404 - what code model should be used to access the object
407 static void
408 m32r_encode_section_info (tree decl, rtx rtl, int first)
410 int extra_flags = 0;
411 tree model_attr;
412 enum m32r_model model;
414 default_encode_section_info (decl, rtl, first);
416 if (!DECL_P (decl))
417 return;
419 model_attr = lookup_attribute ("model", DECL_ATTRIBUTES (decl));
420 if (model_attr)
422 tree id;
424 init_idents ();
426 id = TREE_VALUE (TREE_VALUE (model_attr));
428 if (id == small_ident1 || id == small_ident2)
429 model = M32R_MODEL_SMALL;
430 else if (id == medium_ident1 || id == medium_ident2)
431 model = M32R_MODEL_MEDIUM;
432 else if (id == large_ident1 || id == large_ident2)
433 model = M32R_MODEL_LARGE;
434 else
435 abort (); /* shouldn't happen */
437 else
439 if (TARGET_MODEL_SMALL)
440 model = M32R_MODEL_SMALL;
441 else if (TARGET_MODEL_MEDIUM)
442 model = M32R_MODEL_MEDIUM;
443 else if (TARGET_MODEL_LARGE)
444 model = M32R_MODEL_LARGE;
445 else
446 abort (); /* shouldn't happen */
448 extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
450 if (extra_flags)
451 SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;
454 /* Only mark the object as being small data area addressable if
455 it hasn't been explicitly marked with a code model.
457 The user can explicitly put an object in the small data area with the
458 section attribute. If the object is in sdata/sbss and marked with a
459 code model do both [put the object in .sdata and mark it as being
460 addressed with a specific code model - don't mark it as being addressed
461 with an SDA reloc though]. This is ok and might be useful at times. If
462 the object doesn't fit the linker will give an error. */
464 static bool
465 m32r_in_small_data_p (tree decl)
467 tree section;
469 if (TREE_CODE (decl) != VAR_DECL)
470 return false;
472 if (lookup_attribute ("model", DECL_ATTRIBUTES (decl)))
473 return false;
475 section = DECL_SECTION_NAME (decl);
476 if (section)
478 char *name = (char *) TREE_STRING_POINTER (section);
479 if (strcmp (name, ".sdata") == 0 || strcmp (name, ".sbss") == 0)
480 return true;
482 else
484 if (! TREE_READONLY (decl) && ! TARGET_SDATA_NONE)
486 int size = int_size_in_bytes (TREE_TYPE (decl));
488 if (size > 0 && (unsigned HOST_WIDE_INT) size <= g_switch_value)
489 return true;
493 return false;
496 /* Do anything needed before RTL is emitted for each function. */
498 void
499 m32r_init_expanders (void)
501 /* ??? At one point there was code here. The function is left in
502 to make it easy to experiment. */
506 call_operand (rtx op, enum machine_mode mode)
508 if (GET_CODE (op) != MEM)
509 return 0;
510 op = XEXP (op, 0);
511 return call_address_operand (op, mode);
514 /* Return 1 if OP is a reference to an object in .sdata/.sbss. */
517 small_data_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
519 if (! TARGET_SDATA_USE)
520 return 0;
522 if (GET_CODE (op) == SYMBOL_REF)
523 return SYMBOL_REF_SMALL_P (op);
525 if (GET_CODE (op) == CONST
526 && GET_CODE (XEXP (op, 0)) == PLUS
527 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
528 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
529 && INT16_P (INTVAL (XEXP (XEXP (op, 0), 1))))
530 return SYMBOL_REF_SMALL_P (XEXP (XEXP (op, 0), 0));
532 return 0;
535 /* Return 1 if OP is a symbol that can use 24 bit addressing. */
538 addr24_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
540 rtx sym;
542 if (flag_pic)
543 return 0;
545 if (GET_CODE (op) == LABEL_REF)
546 return TARGET_ADDR24;
548 if (GET_CODE (op) == SYMBOL_REF)
549 sym = op;
550 else if (GET_CODE (op) == CONST
551 && GET_CODE (XEXP (op, 0)) == PLUS
552 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
553 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
554 && UINT24_P (INTVAL (XEXP (XEXP (op, 0), 1))))
555 sym = XEXP (XEXP (op, 0), 0);
556 else
557 return 0;
559 if (SYMBOL_REF_MODEL (sym) == M32R_MODEL_SMALL)
560 return 1;
562 if (TARGET_ADDR24
563 && (CONSTANT_POOL_ADDRESS_P (sym)
564 || LIT_NAME_P (XSTR (sym, 0))))
565 return 1;
567 return 0;
570 /* Return 1 if OP is a symbol that needs 32 bit addressing. */
573 addr32_operand (rtx op, enum machine_mode mode)
575 rtx sym;
577 if (GET_CODE (op) == LABEL_REF)
578 return TARGET_ADDR32;
580 if (GET_CODE (op) == SYMBOL_REF)
581 sym = op;
582 else if (GET_CODE (op) == CONST
583 && GET_CODE (XEXP (op, 0)) == PLUS
584 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
585 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
586 && ! flag_pic)
587 sym = XEXP (XEXP (op, 0), 0);
588 else
589 return 0;
591 return (! addr24_operand (sym, mode)
592 && ! small_data_operand (sym, mode));
595 /* Return 1 if OP is a function that can be called with the `bl' insn. */
598 call26_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
600 if (flag_pic)
601 return 1;
603 if (GET_CODE (op) == SYMBOL_REF)
604 return SYMBOL_REF_MODEL (op) != M32R_MODEL_LARGE;
606 return TARGET_CALL26;
609 /* Return 1 if OP is a DImode const we want to handle inline.
610 This must match the code in the movdi pattern.
611 It is used by the 'G' CONST_DOUBLE_OK_FOR_LETTER. */
614 easy_di_const (rtx op)
616 rtx high_rtx, low_rtx;
617 HOST_WIDE_INT high, low;
619 split_double (op, &high_rtx, &low_rtx);
620 high = INTVAL (high_rtx);
621 low = INTVAL (low_rtx);
622 /* Pick constants loadable with 2 16 bit `ldi' insns. */
623 if (high >= -128 && high <= 127
624 && low >= -128 && low <= 127)
625 return 1;
626 return 0;
629 /* Return 1 if OP is a DFmode const we want to handle inline.
630 This must match the code in the movdf pattern.
631 It is used by the 'H' CONST_DOUBLE_OK_FOR_LETTER. */
634 easy_df_const (rtx op)
636 REAL_VALUE_TYPE r;
637 long l[2];
639 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
640 REAL_VALUE_TO_TARGET_DOUBLE (r, l);
641 if (l[0] == 0 && l[1] == 0)
642 return 1;
643 if ((l[0] & 0xffff) == 0 && l[1] == 0)
644 return 1;
645 return 0;
648 /* Return 1 if OP is (mem (reg ...)).
649 This is used in insn length calcs. */
652 memreg_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
654 return GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == REG;
657 /* Return nonzero if TYPE must be passed by indirect reference. */
659 static bool
660 m32r_pass_by_reference (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
661 enum machine_mode mode, tree type,
662 bool named ATTRIBUTE_UNUSED)
664 int size;
666 if (type)
667 size = int_size_in_bytes (type);
668 else
669 size = GET_MODE_SIZE (mode);
671 return (size < 0 || size > 8);
674 /* Comparisons. */
676 /* X and Y are two things to compare using CODE. Emit the compare insn and
677 return the rtx for compare [arg0 of the if_then_else].
678 If need_compare is true then the comparison insn must be generated, rather
679 than being subsumed into the following branch instruction. */
682 gen_compare (enum rtx_code code, rtx x, rtx y, int need_compare)
684 enum rtx_code compare_code;
685 enum rtx_code branch_code;
686 rtx cc_reg = gen_rtx_REG (CCmode, CARRY_REGNUM);
687 int must_swap = 0;
689 switch (code)
691 case EQ: compare_code = EQ; branch_code = NE; break;
692 case NE: compare_code = EQ; branch_code = EQ; break;
693 case LT: compare_code = LT; branch_code = NE; break;
694 case LE: compare_code = LT; branch_code = EQ; must_swap = 1; break;
695 case GT: compare_code = LT; branch_code = NE; must_swap = 1; break;
696 case GE: compare_code = LT; branch_code = EQ; break;
697 case LTU: compare_code = LTU; branch_code = NE; break;
698 case LEU: compare_code = LTU; branch_code = EQ; must_swap = 1; break;
699 case GTU: compare_code = LTU; branch_code = NE; must_swap = 1; break;
700 case GEU: compare_code = LTU; branch_code = EQ; break;
702 default:
703 abort ();
706 if (need_compare)
708 switch (compare_code)
710 case EQ:
711 if (GET_CODE (y) == CONST_INT
712 && CMP_INT16_P (INTVAL (y)) /* Reg equal to small const. */
713 && y != const0_rtx)
715 rtx tmp = gen_reg_rtx (SImode);
717 emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
718 x = tmp;
719 y = const0_rtx;
721 else if (CONSTANT_P (y)) /* Reg equal to const. */
723 rtx tmp = force_reg (GET_MODE (x), y);
724 y = tmp;
727 if (register_operand (y, SImode) /* Reg equal to reg. */
728 || y == const0_rtx) /* Reg equal to zero. */
730 emit_insn (gen_cmp_eqsi_insn (x, y));
732 return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
734 break;
736 case LT:
737 if (register_operand (y, SImode)
738 || (GET_CODE (y) == CONST_INT && CMP_INT16_P (INTVAL (y))))
740 rtx tmp = gen_reg_rtx (SImode); /* Reg compared to reg. */
742 switch (code)
744 case LT:
745 emit_insn (gen_cmp_ltsi_insn (x, y));
746 code = EQ;
747 break;
748 case LE:
749 if (y == const0_rtx)
750 tmp = const1_rtx;
751 else
752 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
753 emit_insn (gen_cmp_ltsi_insn (x, tmp));
754 code = EQ;
755 break;
756 case GT:
757 if (GET_CODE (y) == CONST_INT)
758 tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
759 else
760 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
761 emit_insn (gen_cmp_ltsi_insn (x, tmp));
762 code = NE;
763 break;
764 case GE:
765 emit_insn (gen_cmp_ltsi_insn (x, y));
766 code = NE;
767 break;
768 default:
769 abort ();
772 return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
774 break;
776 case LTU:
777 if (register_operand (y, SImode)
778 || (GET_CODE (y) == CONST_INT && CMP_INT16_P (INTVAL (y))))
780 rtx tmp = gen_reg_rtx (SImode); /* Reg (unsigned) compared to reg. */
782 switch (code)
784 case LTU:
785 emit_insn (gen_cmp_ltusi_insn (x, y));
786 code = EQ;
787 break;
788 case LEU:
789 if (y == const0_rtx)
790 tmp = const1_rtx;
791 else
792 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
793 emit_insn (gen_cmp_ltusi_insn (x, tmp));
794 code = EQ;
795 break;
796 case GTU:
797 if (GET_CODE (y) == CONST_INT)
798 tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
799 else
800 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
801 emit_insn (gen_cmp_ltusi_insn (x, tmp));
802 code = NE;
803 break;
804 case GEU:
805 emit_insn (gen_cmp_ltusi_insn (x, y));
806 code = NE;
807 break;
808 default:
809 abort();
812 return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
814 break;
816 default:
817 abort();
820 else
822 /* Reg/reg equal comparison. */
823 if (compare_code == EQ
824 && register_operand (y, SImode))
825 return gen_rtx_fmt_ee (code, CCmode, x, y);
827 /* Reg/zero signed comparison. */
828 if ((compare_code == EQ || compare_code == LT)
829 && y == const0_rtx)
830 return gen_rtx_fmt_ee (code, CCmode, x, y);
832 /* Reg/smallconst equal comparison. */
833 if (compare_code == EQ
834 && GET_CODE (y) == CONST_INT
835 && CMP_INT16_P (INTVAL (y)))
837 rtx tmp = gen_reg_rtx (SImode);
839 emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
840 return gen_rtx_fmt_ee (code, CCmode, tmp, const0_rtx);
843 /* Reg/const equal comparison. */
844 if (compare_code == EQ
845 && CONSTANT_P (y))
847 rtx tmp = force_reg (GET_MODE (x), y);
849 return gen_rtx_fmt_ee (code, CCmode, x, tmp);
853 if (CONSTANT_P (y))
855 if (must_swap)
856 y = force_reg (GET_MODE (x), y);
857 else
859 int ok_const = reg_or_int16_operand (y, GET_MODE (y));
861 if (! ok_const)
862 y = force_reg (GET_MODE (x), y);
866 switch (compare_code)
868 case EQ :
869 emit_insn (gen_cmp_eqsi_insn (must_swap ? y : x, must_swap ? x : y));
870 break;
871 case LT :
872 emit_insn (gen_cmp_ltsi_insn (must_swap ? y : x, must_swap ? x : y));
873 break;
874 case LTU :
875 emit_insn (gen_cmp_ltusi_insn (must_swap ? y : x, must_swap ? x : y));
876 break;
878 default:
879 abort ();
882 return gen_rtx_fmt_ee (branch_code, VOIDmode, cc_reg, CONST0_RTX (CCmode));
885 /* Split a 2 word move (DI or DF) into component parts. */
888 gen_split_move_double (rtx operands[])
890 enum machine_mode mode = GET_MODE (operands[0]);
891 rtx dest = operands[0];
892 rtx src = operands[1];
893 rtx val;
895 /* We might have (SUBREG (MEM)) here, so just get rid of the
896 subregs to make this code simpler. It is safe to call
897 alter_subreg any time after reload. */
898 if (GET_CODE (dest) == SUBREG)
899 alter_subreg (&dest);
900 if (GET_CODE (src) == SUBREG)
901 alter_subreg (&src);
903 start_sequence ();
904 if (GET_CODE (dest) == REG)
906 int dregno = REGNO (dest);
908 /* Reg = reg. */
909 if (GET_CODE (src) == REG)
911 int sregno = REGNO (src);
913 int reverse = (dregno == sregno + 1);
915 /* We normally copy the low-numbered register first. However, if
916 the first register operand 0 is the same as the second register of
917 operand 1, we must copy in the opposite order. */
918 emit_insn (gen_rtx_SET (VOIDmode,
919 operand_subword (dest, reverse, TRUE, mode),
920 operand_subword (src, reverse, TRUE, mode)));
922 emit_insn (gen_rtx_SET (VOIDmode,
923 operand_subword (dest, !reverse, TRUE, mode),
924 operand_subword (src, !reverse, TRUE, mode)));
927 /* Reg = constant. */
928 else if (GET_CODE (src) == CONST_INT || GET_CODE (src) == CONST_DOUBLE)
930 rtx words[2];
931 split_double (src, &words[0], &words[1]);
932 emit_insn (gen_rtx_SET (VOIDmode,
933 operand_subword (dest, 0, TRUE, mode),
934 words[0]));
936 emit_insn (gen_rtx_SET (VOIDmode,
937 operand_subword (dest, 1, TRUE, mode),
938 words[1]));
941 /* Reg = mem. */
942 else if (GET_CODE (src) == MEM)
944 /* If the high-address word is used in the address, we must load it
945 last. Otherwise, load it first. */
946 int reverse
947 = (refers_to_regno_p (dregno, dregno + 1, XEXP (src, 0), 0) != 0);
949 /* We used to optimize loads from single registers as
951 ld r1,r3+; ld r2,r3
953 if r3 were not used subsequently. However, the REG_NOTES aren't
954 propagated correctly by the reload phase, and it can cause bad
955 code to be generated. We could still try:
957 ld r1,r3+; ld r2,r3; addi r3,-4
959 which saves 2 bytes and doesn't force longword alignment. */
960 emit_insn (gen_rtx_SET (VOIDmode,
961 operand_subword (dest, reverse, TRUE, mode),
962 adjust_address (src, SImode,
963 reverse * UNITS_PER_WORD)));
965 emit_insn (gen_rtx_SET (VOIDmode,
966 operand_subword (dest, !reverse, TRUE, mode),
967 adjust_address (src, SImode,
968 !reverse * UNITS_PER_WORD)));
970 else
971 abort ();
974 /* Mem = reg. */
975 /* We used to optimize loads from single registers as
977 st r1,r3; st r2,+r3
979 if r3 were not used subsequently. However, the REG_NOTES aren't
980 propagated correctly by the reload phase, and it can cause bad
981 code to be generated. We could still try:
983 st r1,r3; st r2,+r3; addi r3,-4
985 which saves 2 bytes and doesn't force longword alignment. */
986 else if (GET_CODE (dest) == MEM && GET_CODE (src) == REG)
988 emit_insn (gen_rtx_SET (VOIDmode,
989 adjust_address (dest, SImode, 0),
990 operand_subword (src, 0, TRUE, mode)));
992 emit_insn (gen_rtx_SET (VOIDmode,
993 adjust_address (dest, SImode, UNITS_PER_WORD),
994 operand_subword (src, 1, TRUE, mode)));
997 else
998 abort ();
1000 val = get_insns ();
1001 end_sequence ();
1002 return val;
1006 static int
1007 m32r_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
1008 tree type, bool named ATTRIBUTE_UNUSED)
1010 int words;
1011 unsigned int size =
1012 (((mode == BLKmode && type)
1013 ? (unsigned int) int_size_in_bytes (type)
1014 : GET_MODE_SIZE (mode)) + UNITS_PER_WORD - 1)
1015 / UNITS_PER_WORD;
1017 if (*cum >= M32R_MAX_PARM_REGS)
1018 words = 0;
1019 else if (*cum + size > M32R_MAX_PARM_REGS)
1020 words = (*cum + size) - M32R_MAX_PARM_REGS;
1021 else
1022 words = 0;
1024 return words * UNITS_PER_WORD;
1027 /* Worker function for TARGET_RETURN_IN_MEMORY. */
1029 static bool
1030 m32r_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
1032 return m32r_pass_by_reference (NULL, TYPE_MODE (type), type, false);
1035 /* Do any needed setup for a variadic function. For the M32R, we must
1036 create a register parameter block, and then copy any anonymous arguments
1037 in registers to memory.
1039 CUM has not been updated for the last named argument which has type TYPE
1040 and mode MODE, and we rely on this fact. */
1042 static void
1043 m32r_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
1044 tree type, int *pretend_size, int no_rtl)
1046 int first_anon_arg;
1048 if (no_rtl)
1049 return;
1051 /* All BLKmode values are passed by reference. */
1052 if (mode == BLKmode)
1053 abort ();
1055 first_anon_arg = (ROUND_ADVANCE_CUM (*cum, mode, type)
1056 + ROUND_ADVANCE_ARG (mode, type));
1058 if (first_anon_arg < M32R_MAX_PARM_REGS)
1060 /* Note that first_reg_offset < M32R_MAX_PARM_REGS. */
1061 int first_reg_offset = first_anon_arg;
1062 /* Size in words to "pretend" allocate. */
1063 int size = M32R_MAX_PARM_REGS - first_reg_offset;
1064 rtx regblock;
1066 regblock = gen_rtx_MEM (BLKmode,
1067 plus_constant (arg_pointer_rtx,
1068 FIRST_PARM_OFFSET (0)));
1069 set_mem_alias_set (regblock, get_varargs_alias_set ());
1070 move_block_from_reg (first_reg_offset, regblock, size);
1072 *pretend_size = (size * UNITS_PER_WORD);
1077 /* Return true if INSN is real instruction bearing insn. */
1079 static int
1080 m32r_is_insn (rtx insn)
1082 return (INSN_P (insn)
1083 && GET_CODE (PATTERN (insn)) != USE
1084 && GET_CODE (PATTERN (insn)) != CLOBBER
1085 && GET_CODE (PATTERN (insn)) != ADDR_VEC);
1088 /* Increase the priority of long instructions so that the
1089 short instructions are scheduled ahead of the long ones. */
1091 static int
1092 m32r_adjust_priority (rtx insn, int priority)
1094 if (m32r_is_insn (insn)
1095 && get_attr_insn_size (insn) != INSN_SIZE_SHORT)
1096 priority <<= 3;
1098 return priority;
1102 /* Indicate how many instructions can be issued at the same time.
1103 This is sort of a lie. The m32r can issue only 1 long insn at
1104 once, but it can issue 2 short insns. The default therefore is
1105 set at 2, but this can be overridden by the command line option
1106 -missue-rate=1. */
1108 static int
1109 m32r_issue_rate (void)
1111 return ((TARGET_LOW_ISSUE_RATE) ? 1 : 2);
1114 /* Cost functions. */
1116 static bool
1117 m32r_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, int *total)
1119 switch (code)
1121 /* Small integers are as cheap as registers. 4 byte values can be
1122 fetched as immediate constants - let's give that the cost of an
1123 extra insn. */
1124 case CONST_INT:
1125 if (INT16_P (INTVAL (x)))
1127 *total = 0;
1128 return true;
1130 /* FALLTHRU */
1132 case CONST:
1133 case LABEL_REF:
1134 case SYMBOL_REF:
1135 *total = COSTS_N_INSNS (1);
1136 return true;
1138 case CONST_DOUBLE:
1140 rtx high, low;
1142 split_double (x, &high, &low);
1143 *total = COSTS_N_INSNS (!INT16_P (INTVAL (high))
1144 + !INT16_P (INTVAL (low)));
1145 return true;
1148 case MULT:
1149 *total = COSTS_N_INSNS (3);
1150 return true;
1152 case DIV:
1153 case UDIV:
1154 case MOD:
1155 case UMOD:
1156 *total = COSTS_N_INSNS (10);
1157 return true;
1159 default:
1160 return false;
1164 /* Type of function DECL.
1166 The result is cached. To reset the cache at the end of a function,
1167 call with DECL = NULL_TREE. */
1169 enum m32r_function_type
1170 m32r_compute_function_type (tree decl)
1172 /* Cached value. */
1173 static enum m32r_function_type fn_type = M32R_FUNCTION_UNKNOWN;
1174 /* Last function we were called for. */
1175 static tree last_fn = NULL_TREE;
1177 /* Resetting the cached value? */
1178 if (decl == NULL_TREE)
1180 fn_type = M32R_FUNCTION_UNKNOWN;
1181 last_fn = NULL_TREE;
1182 return fn_type;
1185 if (decl == last_fn && fn_type != M32R_FUNCTION_UNKNOWN)
1186 return fn_type;
1188 /* Compute function type. */
1189 fn_type = (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl)) != NULL_TREE
1190 ? M32R_FUNCTION_INTERRUPT
1191 : M32R_FUNCTION_NORMAL);
1193 last_fn = decl;
1194 return fn_type;
1196 \f/* Function prologue/epilogue handlers. */
1198 /* M32R stack frames look like:
1200 Before call After call
1201 +-----------------------+ +-----------------------+
1202 | | | |
1203 high | local variables, | | local variables, |
1204 mem | reg save area, etc. | | reg save area, etc. |
1205 | | | |
1206 +-----------------------+ +-----------------------+
1207 | | | |
1208 | arguments on stack. | | arguments on stack. |
1209 | | | |
1210 SP+0->+-----------------------+ +-----------------------+
1211 | reg parm save area, |
1212 | only created for |
1213 | variable argument |
1214 | functions |
1215 +-----------------------+
1216 | previous frame ptr |
1217 +-----------------------+
1218 | |
1219 | register save area |
1220 | |
1221 +-----------------------+
1222 | return address |
1223 +-----------------------+
1224 | |
1225 | local variables |
1226 | |
1227 +-----------------------+
1228 | |
1229 | alloca allocations |
1230 | |
1231 +-----------------------+
1232 | |
1233 low | arguments on stack |
1234 memory | |
1235 SP+0->+-----------------------+
1237 Notes:
1238 1) The "reg parm save area" does not exist for non variable argument fns.
1239 2) The "reg parm save area" can be eliminated completely if we saved regs
1240 containing anonymous args separately but that complicates things too
1241 much (so it's not done).
1242 3) The return address is saved after the register save area so as to have as
1243 many insns as possible between the restoration of `lr' and the `jmp lr'. */
1245 /* Structure to be filled in by m32r_compute_frame_size with register
1246 save masks, and offsets for the current function. */
1247 struct m32r_frame_info
1249 unsigned int total_size; /* # bytes that the entire frame takes up. */
1250 unsigned int extra_size; /* # bytes of extra stuff. */
1251 unsigned int pretend_size; /* # bytes we push and pretend caller did. */
1252 unsigned int args_size; /* # bytes that outgoing arguments take up. */
1253 unsigned int reg_size; /* # bytes needed to store regs. */
1254 unsigned int var_size; /* # bytes that variables take up. */
1255 unsigned int gmask; /* Mask of saved gp registers. */
1256 unsigned int save_fp; /* Nonzero if fp must be saved. */
1257 unsigned int save_lr; /* Nonzero if lr (return addr) must be saved. */
1258 int initialized; /* Nonzero if frame size already calculated. */
1261 /* Current frame information calculated by m32r_compute_frame_size. */
1262 static struct m32r_frame_info current_frame_info;
1264 /* Zero structure to initialize current_frame_info. */
1265 static struct m32r_frame_info zero_frame_info;
1267 #define FRAME_POINTER_MASK (1 << (FRAME_POINTER_REGNUM))
1268 #define RETURN_ADDR_MASK (1 << (RETURN_ADDR_REGNUM))
1270 /* Tell prologue and epilogue if register REGNO should be saved / restored.
1271 The return address and frame pointer are treated separately.
1272 Don't consider them here. */
1273 #define MUST_SAVE_REGISTER(regno, interrupt_p) \
1274 ((regno) != RETURN_ADDR_REGNUM && (regno) != FRAME_POINTER_REGNUM \
1275 && (regs_ever_live[regno] && (!call_really_used_regs[regno] || interrupt_p)))
1277 #define MUST_SAVE_FRAME_POINTER (regs_ever_live[FRAME_POINTER_REGNUM])
1278 #define MUST_SAVE_RETURN_ADDR (regs_ever_live[RETURN_ADDR_REGNUM] || current_function_profile)
1280 #define SHORT_INSN_SIZE 2 /* Size of small instructions. */
1281 #define LONG_INSN_SIZE 4 /* Size of long instructions. */
1283 /* Return the bytes needed to compute the frame pointer from the current
1284 stack pointer.
1286 SIZE is the size needed for local variables. */
1288 unsigned int
1289 m32r_compute_frame_size (int size) /* # of var. bytes allocated. */
1291 int regno;
1292 unsigned int total_size, var_size, args_size, pretend_size, extra_size;
1293 unsigned int reg_size, frame_size;
1294 unsigned int gmask;
1295 enum m32r_function_type fn_type;
1296 int interrupt_p;
1297 int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table);
1299 var_size = M32R_STACK_ALIGN (size);
1300 args_size = M32R_STACK_ALIGN (current_function_outgoing_args_size);
1301 pretend_size = current_function_pretend_args_size;
1302 extra_size = FIRST_PARM_OFFSET (0);
1303 total_size = extra_size + pretend_size + args_size + var_size;
1304 reg_size = 0;
1305 gmask = 0;
1307 /* See if this is an interrupt handler. Call used registers must be saved
1308 for them too. */
1309 fn_type = m32r_compute_function_type (current_function_decl);
1310 interrupt_p = M32R_INTERRUPT_P (fn_type);
1312 /* Calculate space needed for registers. */
1313 for (regno = 0; regno < M32R_MAX_INT_REGS; regno++)
1315 if (MUST_SAVE_REGISTER (regno, interrupt_p)
1316 || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
1318 reg_size += UNITS_PER_WORD;
1319 gmask |= 1 << regno;
1323 current_frame_info.save_fp = MUST_SAVE_FRAME_POINTER;
1324 current_frame_info.save_lr = MUST_SAVE_RETURN_ADDR || pic_reg_used;
1326 reg_size += ((current_frame_info.save_fp + current_frame_info.save_lr)
1327 * UNITS_PER_WORD);
1328 total_size += reg_size;
1330 /* ??? Not sure this is necessary, and I don't think the epilogue
1331 handler will do the right thing if this changes total_size. */
1332 total_size = M32R_STACK_ALIGN (total_size);
1334 frame_size = total_size - (pretend_size + reg_size);
1336 /* Save computed information. */
1337 current_frame_info.total_size = total_size;
1338 current_frame_info.extra_size = extra_size;
1339 current_frame_info.pretend_size = pretend_size;
1340 current_frame_info.var_size = var_size;
1341 current_frame_info.args_size = args_size;
1342 current_frame_info.reg_size = reg_size;
1343 current_frame_info.gmask = gmask;
1344 current_frame_info.initialized = reload_completed;
1346 /* Ok, we're done. */
1347 return total_size;
1350 /* The table we use to reference PIC data. */
1351 static rtx global_offset_table;
1353 static void
1354 m32r_reload_lr (rtx sp, int size)
1356 rtx lr = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
1358 if (size == 0)
1359 emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode, sp)));
1360 else if (size <= 32768)
1361 emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode,
1362 gen_rtx_PLUS (Pmode, sp,
1363 GEN_INT (size)))));
1364 else
1366 rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1368 emit_insn (gen_movsi (tmp, GEN_INT (size)));
1369 emit_insn (gen_addsi3 (tmp, tmp, sp));
1370 emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode, tmp)));
1373 emit_insn (gen_rtx_USE (VOIDmode, lr));
1376 void
1377 m32r_load_pic_register (void)
1379 global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
1380 emit_insn (gen_get_pc (pic_offset_table_rtx, global_offset_table,
1381 GEN_INT (TARGET_MODEL_SMALL)));
1383 /* Need to emit this whether or not we obey regdecls,
1384 since setjmp/longjmp can cause life info to screw up. */
1385 emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
1388 /* Expand the m32r prologue as a series of insns. */
1390 void
1391 m32r_expand_prologue (void)
1393 int regno;
1394 int frame_size;
1395 unsigned int gmask;
1396 int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table);
1398 if (! current_frame_info.initialized)
1399 m32r_compute_frame_size (get_frame_size ());
1401 gmask = current_frame_info.gmask;
1403 /* These cases shouldn't happen. Catch them now. */
1404 if (current_frame_info.total_size == 0 && gmask)
1405 abort ();
1407 /* Allocate space for register arguments if this is a variadic function. */
1408 if (current_frame_info.pretend_size != 0)
1410 /* Use a HOST_WIDE_INT temporary, since negating an unsigned int gives
1411 the wrong result on a 64-bit host. */
1412 HOST_WIDE_INT pretend_size = current_frame_info.pretend_size;
1413 emit_insn (gen_addsi3 (stack_pointer_rtx,
1414 stack_pointer_rtx,
1415 GEN_INT (-pretend_size)));
1418 /* Save any registers we need to and set up fp. */
1419 if (current_frame_info.save_fp)
1420 emit_insn (gen_movsi_push (stack_pointer_rtx, frame_pointer_rtx));
1422 gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
1424 /* Save any needed call-saved regs (and call-used if this is an
1425 interrupt handler). */
1426 for (regno = 0; regno <= M32R_MAX_INT_REGS; ++regno)
1428 if ((gmask & (1 << regno)) != 0)
1429 emit_insn (gen_movsi_push (stack_pointer_rtx,
1430 gen_rtx_REG (Pmode, regno)));
1433 if (current_frame_info.save_lr)
1434 emit_insn (gen_movsi_push (stack_pointer_rtx,
1435 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
1437 /* Allocate the stack frame. */
1438 frame_size = (current_frame_info.total_size
1439 - (current_frame_info.pretend_size
1440 + current_frame_info.reg_size));
1442 if (frame_size == 0)
1443 ; /* Nothing to do. */
1444 else if (frame_size <= 32768)
1445 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1446 GEN_INT (-frame_size)));
1447 else
1449 rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1451 emit_insn (gen_movsi (tmp, GEN_INT (frame_size)));
1452 emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, tmp));
1455 if (frame_pointer_needed)
1456 emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx));
1458 if (current_function_profile)
1459 /* Push lr for mcount (form_pc, x). */
1460 emit_insn (gen_movsi_push (stack_pointer_rtx,
1461 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
1463 if (pic_reg_used)
1465 m32r_load_pic_register ();
1466 m32r_reload_lr (stack_pointer_rtx,
1467 (current_function_profile ? 0 : frame_size));
1470 if (current_function_profile && !pic_reg_used)
1471 emit_insn (gen_blockage ());
1475 /* Set up the stack and frame pointer (if desired) for the function.
1476 Note, if this is changed, you need to mirror the changes in
1477 m32r_compute_frame_size which calculates the prolog size. */
1479 static void
1480 m32r_output_function_prologue (FILE * file, HOST_WIDE_INT size)
1482 enum m32r_function_type fn_type = m32r_compute_function_type (current_function_decl);
1484 /* If this is an interrupt handler, mark it as such. */
1485 if (M32R_INTERRUPT_P (fn_type))
1486 fprintf (file, "\t%s interrupt handler\n", ASM_COMMENT_START);
1488 if (! current_frame_info.initialized)
1489 m32r_compute_frame_size (size);
1491 /* This is only for the human reader. */
1492 fprintf (file,
1493 "\t%s PROLOGUE, vars= %d, regs= %d, args= %d, extra= %d\n",
1494 ASM_COMMENT_START,
1495 current_frame_info.var_size,
1496 current_frame_info.reg_size / 4,
1497 current_frame_info.args_size,
1498 current_frame_info.extra_size);
1501 /* Do any necessary cleanup after a function to restore stack, frame,
1502 and regs. */
1504 static void
1505 m32r_output_function_epilogue (FILE * file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1507 int regno;
1508 int noepilogue = FALSE;
1509 int total_size;
1510 enum m32r_function_type fn_type = m32r_compute_function_type (current_function_decl);
1512 /* This is only for the human reader. */
1513 fprintf (file, "\t%s EPILOGUE\n", ASM_COMMENT_START);
1515 if (!current_frame_info.initialized)
1516 abort ();
1517 total_size = current_frame_info.total_size;
1519 if (total_size == 0)
1521 rtx insn = get_last_insn ();
1523 /* If the last insn was a BARRIER, we don't have to write any code
1524 because a jump (aka return) was put there. */
1525 if (GET_CODE (insn) == NOTE)
1526 insn = prev_nonnote_insn (insn);
1527 if (insn && GET_CODE (insn) == BARRIER)
1528 noepilogue = TRUE;
1531 if (!noepilogue)
1533 unsigned int var_size = current_frame_info.var_size;
1534 unsigned int args_size = current_frame_info.args_size;
1535 unsigned int gmask = current_frame_info.gmask;
1536 int can_trust_sp_p = !current_function_calls_alloca;
1537 const char * sp_str = reg_names[STACK_POINTER_REGNUM];
1538 const char * fp_str = reg_names[FRAME_POINTER_REGNUM];
1540 /* The first thing to do is point the sp at the bottom of the register
1541 save area. */
1542 if (can_trust_sp_p)
1544 unsigned int reg_offset = var_size + args_size;
1545 if (reg_offset == 0)
1546 ; /* Nothing to do. */
1547 else if (reg_offset < 128)
1548 fprintf (file, "\taddi %s,%s%d\n",
1549 sp_str, IMMEDIATE_PREFIX, reg_offset);
1550 else if (reg_offset < 32768)
1551 fprintf (file, "\tadd3 %s,%s,%s%d\n",
1552 sp_str, sp_str, IMMEDIATE_PREFIX, reg_offset);
1553 else
1554 fprintf (file, "\tld24 %s,%s%d\n\tadd %s,%s\n",
1555 reg_names[PROLOGUE_TMP_REGNUM],
1556 IMMEDIATE_PREFIX, reg_offset,
1557 sp_str, reg_names[PROLOGUE_TMP_REGNUM]);
1559 else if (frame_pointer_needed)
1561 unsigned int reg_offset = var_size + args_size;
1563 if (reg_offset == 0)
1564 fprintf (file, "\tmv %s,%s\n", sp_str, fp_str);
1565 else if (reg_offset < 32768)
1566 fprintf (file, "\tadd3 %s,%s,%s%d\n",
1567 sp_str, fp_str, IMMEDIATE_PREFIX, reg_offset);
1568 else
1569 fprintf (file, "\tld24 %s,%s%d\n\tadd %s,%s\n",
1570 reg_names[PROLOGUE_TMP_REGNUM],
1571 IMMEDIATE_PREFIX, reg_offset,
1572 sp_str, reg_names[PROLOGUE_TMP_REGNUM]);
1574 else
1575 abort ();
1577 if (current_frame_info.save_lr)
1578 fprintf (file, "\tpop %s\n", reg_names[RETURN_ADDR_REGNUM]);
1580 /* Restore any saved registers, in reverse order of course. */
1581 gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
1582 for (regno = M32R_MAX_INT_REGS - 1; regno >= 0; --regno)
1584 if ((gmask & (1L << regno)) != 0)
1585 fprintf (file, "\tpop %s\n", reg_names[regno]);
1588 if (current_frame_info.save_fp)
1589 fprintf (file, "\tpop %s\n", fp_str);
1591 /* Remove varargs area if present. */
1592 if (current_frame_info.pretend_size != 0)
1593 fprintf (file, "\taddi %s,%s%d\n",
1594 sp_str, IMMEDIATE_PREFIX, current_frame_info.pretend_size);
1596 /* Emit the return instruction. */
1597 if (M32R_INTERRUPT_P (fn_type))
1598 fprintf (file, "\trte\n");
1599 else
1600 fprintf (file, "\tjmp %s\n", reg_names[RETURN_ADDR_REGNUM]);
1603 /* Reset state info for each function. */
1604 current_frame_info = zero_frame_info;
1605 m32r_compute_function_type (NULL_TREE);
1608 /* Return nonzero if this function is known to have a null or 1 instruction
1609 epilogue. */
1612 direct_return (void)
1614 if (!reload_completed)
1615 return FALSE;
1617 if (! current_frame_info.initialized)
1618 m32r_compute_frame_size (get_frame_size ());
1620 return current_frame_info.total_size == 0;
1624 /* PIC. */
1627 m32r_legitimate_pic_operand_p (rtx x)
1629 if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1630 return 0;
1632 if (GET_CODE (x) == CONST
1633 && GET_CODE (XEXP (x, 0)) == PLUS
1634 && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
1635 || GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF)
1636 && (GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT))
1637 return 0;
1639 return 1;
1643 m32r_legitimize_pic_address (rtx orig, rtx reg)
1645 #ifdef DEBUG_PIC
1646 printf("m32r_legitimize_pic_address()\n");
1647 #endif
1649 if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
1651 rtx pic_ref, address;
1652 rtx insn;
1653 int subregs = 0;
1655 if (reg == 0)
1657 if (reload_in_progress || reload_completed)
1658 abort ();
1659 else
1660 reg = gen_reg_rtx (Pmode);
1662 subregs = 1;
1665 if (subregs)
1666 address = gen_reg_rtx (Pmode);
1667 else
1668 address = reg;
1670 current_function_uses_pic_offset_table = 1;
1672 if (GET_CODE (orig) == LABEL_REF
1673 || (GET_CODE (orig) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (orig)))
1675 emit_insn (gen_gotoff_load_addr (reg, orig));
1676 emit_insn (gen_addsi3 (reg, reg, pic_offset_table_rtx));
1677 return reg;
1680 emit_insn (gen_pic_load_addr (address, orig));
1682 emit_insn (gen_addsi3 (address, address, pic_offset_table_rtx));
1683 pic_ref = gen_const_mem (Pmode, address);
1684 insn = emit_move_insn (reg, pic_ref);
1685 #if 0
1686 /* Put a REG_EQUAL note on this insn, so that it can be optimized
1687 by loop. */
1688 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, orig,
1689 REG_NOTES (insn));
1690 #endif
1691 return reg;
1693 else if (GET_CODE (orig) == CONST)
1695 rtx base, offset;
1697 if (GET_CODE (XEXP (orig, 0)) == PLUS
1698 && XEXP (XEXP (orig, 0), 1) == pic_offset_table_rtx)
1699 return orig;
1701 if (reg == 0)
1703 if (reload_in_progress || reload_completed)
1704 abort ();
1705 else
1706 reg = gen_reg_rtx (Pmode);
1709 if (GET_CODE (XEXP (orig, 0)) == PLUS)
1711 base = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
1712 if (base == reg)
1713 offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), NULL_RTX);
1714 else
1715 offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), reg);
1717 else
1718 return orig;
1720 if (GET_CODE (offset) == CONST_INT)
1722 if (INT16_P (INTVAL (offset)))
1723 return plus_constant (base, INTVAL (offset));
1724 else if (! reload_in_progress && ! reload_completed)
1725 offset = force_reg (Pmode, offset);
1726 else
1727 /* If we reach here, then something is seriously wrong. */
1728 abort ();
1731 return gen_rtx_PLUS (Pmode, base, offset);
1734 return orig;
1737 /* Emit special PIC prologues and epilogues. */
1739 void
1740 m32r_finalize_pic (void)
1742 current_function_uses_pic_offset_table |= current_function_profile;
1745 /* Nested function support. */
1747 /* Emit RTL insns to initialize the variable parts of a trampoline.
1748 FNADDR is an RTX for the address of the function's pure code.
1749 CXT is an RTX for the static chain value for the function. */
1751 void
1752 m32r_initialize_trampoline (rtx tramp ATTRIBUTE_UNUSED,
1753 rtx fnaddr ATTRIBUTE_UNUSED,
1754 rtx cxt ATTRIBUTE_UNUSED)
1758 static void
1759 m32r_file_start (void)
1761 default_file_start ();
1763 if (flag_verbose_asm)
1764 fprintf (asm_out_file,
1765 "%s M32R/D special options: -G " HOST_WIDE_INT_PRINT_UNSIGNED "\n",
1766 ASM_COMMENT_START, g_switch_value);
1768 if (TARGET_LITTLE_ENDIAN)
1769 fprintf (asm_out_file, "\t.little\n");
1772 /* Print operand X (an rtx) in assembler syntax to file FILE.
1773 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
1774 For `%' followed by punctuation, CODE is the punctuation and X is null. */
1776 void
1777 m32r_print_operand (FILE * file, rtx x, int code)
1779 rtx addr;
1781 switch (code)
1783 /* The 's' and 'p' codes are used by output_block_move() to
1784 indicate post-increment 's'tores and 'p're-increment loads. */
1785 case 's':
1786 if (GET_CODE (x) == REG)
1787 fprintf (file, "@+%s", reg_names [REGNO (x)]);
1788 else
1789 output_operand_lossage ("invalid operand to %%s code");
1790 return;
1792 case 'p':
1793 if (GET_CODE (x) == REG)
1794 fprintf (file, "@%s+", reg_names [REGNO (x)]);
1795 else
1796 output_operand_lossage ("invalid operand to %%p code");
1797 return;
1799 case 'R' :
1800 /* Write second word of DImode or DFmode reference,
1801 register or memory. */
1802 if (GET_CODE (x) == REG)
1803 fputs (reg_names[REGNO (x)+1], file);
1804 else if (GET_CODE (x) == MEM)
1806 fprintf (file, "@(");
1807 /* Handle possible auto-increment. Since it is pre-increment and
1808 we have already done it, we can just use an offset of four. */
1809 /* ??? This is taken from rs6000.c I think. I don't think it is
1810 currently necessary, but keep it around. */
1811 if (GET_CODE (XEXP (x, 0)) == PRE_INC
1812 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
1813 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 4));
1814 else
1815 output_address (plus_constant (XEXP (x, 0), 4));
1816 fputc (')', file);
1818 else
1819 output_operand_lossage ("invalid operand to %%R code");
1820 return;
1822 case 'H' : /* High word. */
1823 case 'L' : /* Low word. */
1824 if (GET_CODE (x) == REG)
1826 /* L = least significant word, H = most significant word. */
1827 if ((WORDS_BIG_ENDIAN != 0) ^ (code == 'L'))
1828 fputs (reg_names[REGNO (x)], file);
1829 else
1830 fputs (reg_names[REGNO (x)+1], file);
1832 else if (GET_CODE (x) == CONST_INT
1833 || GET_CODE (x) == CONST_DOUBLE)
1835 rtx first, second;
1837 split_double (x, &first, &second);
1838 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
1839 code == 'L' ? INTVAL (first) : INTVAL (second));
1841 else
1842 output_operand_lossage ("invalid operand to %%H/%%L code");
1843 return;
1845 case 'A' :
1847 char str[30];
1849 if (GET_CODE (x) != CONST_DOUBLE
1850 || GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT)
1851 fatal_insn ("bad insn for 'A'", x);
1853 real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (x), sizeof (str), 0, 1);
1854 fprintf (file, "%s", str);
1855 return;
1858 case 'B' : /* Bottom half. */
1859 case 'T' : /* Top half. */
1860 /* Output the argument to a `seth' insn (sets the Top half-word).
1861 For constants output arguments to a seth/or3 pair to set Top and
1862 Bottom halves. For symbols output arguments to a seth/add3 pair to
1863 set Top and Bottom halves. The difference exists because for
1864 constants seth/or3 is more readable but for symbols we need to use
1865 the same scheme as `ld' and `st' insns (16 bit addend is signed). */
1866 switch (GET_CODE (x))
1868 case CONST_INT :
1869 case CONST_DOUBLE :
1871 rtx first, second;
1873 split_double (x, &first, &second);
1874 x = WORDS_BIG_ENDIAN ? second : first;
1875 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
1876 (code == 'B'
1877 ? INTVAL (x) & 0xffff
1878 : (INTVAL (x) >> 16) & 0xffff));
1880 return;
1881 case CONST :
1882 case SYMBOL_REF :
1883 if (code == 'B'
1884 && small_data_operand (x, VOIDmode))
1886 fputs ("sda(", file);
1887 output_addr_const (file, x);
1888 fputc (')', file);
1889 return;
1891 /* fall through */
1892 case LABEL_REF :
1893 fputs (code == 'T' ? "shigh(" : "low(", file);
1894 output_addr_const (file, x);
1895 fputc (')', file);
1896 return;
1897 default :
1898 output_operand_lossage ("invalid operand to %%T/%%B code");
1899 return;
1901 break;
1903 case 'U' :
1904 /* ??? wip */
1905 /* Output a load/store with update indicator if appropriate. */
1906 if (GET_CODE (x) == MEM)
1908 if (GET_CODE (XEXP (x, 0)) == PRE_INC
1909 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
1910 fputs (".a", file);
1912 else
1913 output_operand_lossage ("invalid operand to %%U code");
1914 return;
1916 case 'N' :
1917 /* Print a constant value negated. */
1918 if (GET_CODE (x) == CONST_INT)
1919 output_addr_const (file, GEN_INT (- INTVAL (x)));
1920 else
1921 output_operand_lossage ("invalid operand to %%N code");
1922 return;
1924 case 'X' :
1925 /* Print a const_int in hex. Used in comments. */
1926 if (GET_CODE (x) == CONST_INT)
1927 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
1928 return;
1930 case '#' :
1931 fputs (IMMEDIATE_PREFIX, file);
1932 return;
1934 case 0 :
1935 /* Do nothing special. */
1936 break;
1938 default :
1939 /* Unknown flag. */
1940 output_operand_lossage ("invalid operand output code");
1943 switch (GET_CODE (x))
1945 case REG :
1946 fputs (reg_names[REGNO (x)], file);
1947 break;
1949 case MEM :
1950 addr = XEXP (x, 0);
1951 if (GET_CODE (addr) == PRE_INC)
1953 if (GET_CODE (XEXP (addr, 0)) != REG)
1954 fatal_insn ("pre-increment address is not a register", x);
1956 fprintf (file, "@+%s", reg_names[REGNO (XEXP (addr, 0))]);
1958 else if (GET_CODE (addr) == PRE_DEC)
1960 if (GET_CODE (XEXP (addr, 0)) != REG)
1961 fatal_insn ("pre-decrement address is not a register", x);
1963 fprintf (file, "@-%s", reg_names[REGNO (XEXP (addr, 0))]);
1965 else if (GET_CODE (addr) == POST_INC)
1967 if (GET_CODE (XEXP (addr, 0)) != REG)
1968 fatal_insn ("post-increment address is not a register", x);
1970 fprintf (file, "@%s+", reg_names[REGNO (XEXP (addr, 0))]);
1972 else
1974 fputs ("@(", file);
1975 output_address (XEXP (x, 0));
1976 fputc (')', file);
1978 break;
1980 case CONST_DOUBLE :
1981 /* We handle SFmode constants here as output_addr_const doesn't. */
1982 if (GET_MODE (x) == SFmode)
1984 REAL_VALUE_TYPE d;
1985 long l;
1987 REAL_VALUE_FROM_CONST_DOUBLE (d, x);
1988 REAL_VALUE_TO_TARGET_SINGLE (d, l);
1989 fprintf (file, "0x%08lx", l);
1990 break;
1993 /* Fall through. Let output_addr_const deal with it. */
1995 default :
1996 output_addr_const (file, x);
1997 break;
2001 /* Print a memory address as an operand to reference that memory location. */
2003 void
2004 m32r_print_operand_address (FILE * file, rtx addr)
2006 rtx base;
2007 rtx index = 0;
2008 int offset = 0;
2010 switch (GET_CODE (addr))
2012 case REG :
2013 fputs (reg_names[REGNO (addr)], file);
2014 break;
2016 case PLUS :
2017 if (GET_CODE (XEXP (addr, 0)) == CONST_INT)
2018 offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
2019 else if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
2020 offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
2021 else
2022 base = XEXP (addr, 0), index = XEXP (addr, 1);
2023 if (GET_CODE (base) == REG)
2025 /* Print the offset first (if present) to conform to the manual. */
2026 if (index == 0)
2028 if (offset != 0)
2029 fprintf (file, "%d,", offset);
2030 fputs (reg_names[REGNO (base)], file);
2032 /* The chip doesn't support this, but left in for generality. */
2033 else if (GET_CODE (index) == REG)
2034 fprintf (file, "%s,%s",
2035 reg_names[REGNO (base)], reg_names[REGNO (index)]);
2036 /* Not sure this can happen, but leave in for now. */
2037 else if (GET_CODE (index) == SYMBOL_REF)
2039 output_addr_const (file, index);
2040 fputc (',', file);
2041 fputs (reg_names[REGNO (base)], file);
2043 else
2044 fatal_insn ("bad address", addr);
2046 else if (GET_CODE (base) == LO_SUM)
2048 if (index != 0
2049 || GET_CODE (XEXP (base, 0)) != REG)
2050 abort ();
2051 if (small_data_operand (XEXP (base, 1), VOIDmode))
2052 fputs ("sda(", file);
2053 else
2054 fputs ("low(", file);
2055 output_addr_const (file, plus_constant (XEXP (base, 1), offset));
2056 fputs ("),", file);
2057 fputs (reg_names[REGNO (XEXP (base, 0))], file);
2059 else
2060 fatal_insn ("bad address", addr);
2061 break;
2063 case LO_SUM :
2064 if (GET_CODE (XEXP (addr, 0)) != REG)
2065 fatal_insn ("lo_sum not of register", addr);
2066 if (small_data_operand (XEXP (addr, 1), VOIDmode))
2067 fputs ("sda(", file);
2068 else
2069 fputs ("low(", file);
2070 output_addr_const (file, XEXP (addr, 1));
2071 fputs ("),", file);
2072 fputs (reg_names[REGNO (XEXP (addr, 0))], file);
2073 break;
2075 case PRE_INC : /* Assume SImode. */
2076 fprintf (file, "+%s", reg_names[REGNO (XEXP (addr, 0))]);
2077 break;
2079 case PRE_DEC : /* Assume SImode. */
2080 fprintf (file, "-%s", reg_names[REGNO (XEXP (addr, 0))]);
2081 break;
2083 case POST_INC : /* Assume SImode. */
2084 fprintf (file, "%s+", reg_names[REGNO (XEXP (addr, 0))]);
2085 break;
2087 default :
2088 output_addr_const (file, addr);
2089 break;
2093 /* Return true if the operands are the constants 0 and 1. */
2096 zero_and_one (rtx operand1, rtx operand2)
2098 return
2099 GET_CODE (operand1) == CONST_INT
2100 && GET_CODE (operand2) == CONST_INT
2101 && ( ((INTVAL (operand1) == 0) && (INTVAL (operand2) == 1))
2102 ||((INTVAL (operand1) == 1) && (INTVAL (operand2) == 0)));
2105 /* Generate the correct assembler code to handle the conditional loading of a
2106 value into a register. It is known that the operands satisfy the
2107 conditional_move_operand() function above. The destination is operand[0].
2108 The condition is operand [1]. The 'true' value is operand [2] and the
2109 'false' value is operand [3]. */
2111 char *
2112 emit_cond_move (rtx * operands, rtx insn ATTRIBUTE_UNUSED)
2114 static char buffer [100];
2115 const char * dest = reg_names [REGNO (operands [0])];
2117 buffer [0] = 0;
2119 /* Destination must be a register. */
2120 if (GET_CODE (operands [0]) != REG)
2121 abort();
2122 if (! conditional_move_operand (operands [2], SImode))
2123 abort();
2124 if (! conditional_move_operand (operands [3], SImode))
2125 abort();
2127 /* Check to see if the test is reversed. */
2128 if (GET_CODE (operands [1]) == NE)
2130 rtx tmp = operands [2];
2131 operands [2] = operands [3];
2132 operands [3] = tmp;
2135 sprintf (buffer, "mvfc %s, cbr", dest);
2137 /* If the true value was '0' then we need to invert the results of the move. */
2138 if (INTVAL (operands [2]) == 0)
2139 sprintf (buffer + strlen (buffer), "\n\txor3 %s, %s, #1",
2140 dest, dest);
2142 return buffer;
2145 /* Returns true if the registers contained in the two
2146 rtl expressions are different. */
2149 m32r_not_same_reg (rtx a, rtx b)
2151 int reg_a = -1;
2152 int reg_b = -2;
2154 while (GET_CODE (a) == SUBREG)
2155 a = SUBREG_REG (a);
2157 if (GET_CODE (a) == REG)
2158 reg_a = REGNO (a);
2160 while (GET_CODE (b) == SUBREG)
2161 b = SUBREG_REG (b);
2163 if (GET_CODE (b) == REG)
2164 reg_b = REGNO (b);
2166 return reg_a != reg_b;
2171 m32r_function_symbol (const char *name)
2173 int extra_flags = 0;
2174 enum m32r_model model;
2175 rtx sym = gen_rtx_SYMBOL_REF (Pmode, name);
2177 if (TARGET_MODEL_SMALL)
2178 model = M32R_MODEL_SMALL;
2179 else if (TARGET_MODEL_MEDIUM)
2180 model = M32R_MODEL_MEDIUM;
2181 else if (TARGET_MODEL_LARGE)
2182 model = M32R_MODEL_LARGE;
2183 else
2184 abort (); /* Shouldn't happen. */
2185 extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
2187 if (extra_flags)
2188 SYMBOL_REF_FLAGS (sym) |= extra_flags;
2190 return sym;
2193 /* Use a library function to move some bytes. */
2195 static void
2196 block_move_call (rtx dest_reg, rtx src_reg, rtx bytes_rtx)
2198 /* We want to pass the size as Pmode, which will normally be SImode
2199 but will be DImode if we are using 64 bit longs and pointers. */
2200 if (GET_MODE (bytes_rtx) != VOIDmode
2201 && GET_MODE (bytes_rtx) != Pmode)
2202 bytes_rtx = convert_to_mode (Pmode, bytes_rtx, 1);
2204 emit_library_call (m32r_function_symbol ("memcpy"), 0,
2205 VOIDmode, 3, dest_reg, Pmode, src_reg, Pmode,
2206 convert_to_mode (TYPE_MODE (sizetype), bytes_rtx,
2207 TYPE_UNSIGNED (sizetype)),
2208 TYPE_MODE (sizetype));
2211 /* Expand string/block move operations.
2213 operands[0] is the pointer to the destination.
2214 operands[1] is the pointer to the source.
2215 operands[2] is the number of bytes to move.
2216 operands[3] is the alignment. */
2218 void
2219 m32r_expand_block_move (rtx operands[])
2221 rtx orig_dst = operands[0];
2222 rtx orig_src = operands[1];
2223 rtx bytes_rtx = operands[2];
2224 rtx align_rtx = operands[3];
2225 int constp = GET_CODE (bytes_rtx) == CONST_INT;
2226 HOST_WIDE_INT bytes = constp ? INTVAL (bytes_rtx) : 0;
2227 int align = INTVAL (align_rtx);
2228 int leftover;
2229 rtx src_reg;
2230 rtx dst_reg;
2232 if (constp && bytes <= 0)
2233 return;
2235 /* Move the address into scratch registers. */
2236 dst_reg = copy_addr_to_reg (XEXP (orig_dst, 0));
2237 src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
2239 if (align > UNITS_PER_WORD)
2240 align = UNITS_PER_WORD;
2242 /* If we prefer size over speed, always use a function call.
2243 If we do not know the size, use a function call.
2244 If the blocks are not word aligned, use a function call. */
2245 if (optimize_size || ! constp || align != UNITS_PER_WORD)
2247 block_move_call (dst_reg, src_reg, bytes_rtx);
2248 return;
2251 leftover = bytes % MAX_MOVE_BYTES;
2252 bytes -= leftover;
2254 /* If necessary, generate a loop to handle the bulk of the copy. */
2255 if (bytes)
2257 rtx label = NULL_RTX;
2258 rtx final_src = NULL_RTX;
2259 rtx at_a_time = GEN_INT (MAX_MOVE_BYTES);
2260 rtx rounded_total = GEN_INT (bytes);
2261 rtx new_dst_reg = gen_reg_rtx (SImode);
2262 rtx new_src_reg = gen_reg_rtx (SImode);
2264 /* If we are going to have to perform this loop more than
2265 once, then generate a label and compute the address the
2266 source register will contain upon completion of the final
2267 iteration. */
2268 if (bytes > MAX_MOVE_BYTES)
2270 final_src = gen_reg_rtx (Pmode);
2272 if (INT16_P(bytes))
2273 emit_insn (gen_addsi3 (final_src, src_reg, rounded_total));
2274 else
2276 emit_insn (gen_movsi (final_src, rounded_total));
2277 emit_insn (gen_addsi3 (final_src, final_src, src_reg));
2280 label = gen_label_rtx ();
2281 emit_label (label);
2284 /* It is known that output_block_move() will update src_reg to point
2285 to the word after the end of the source block, and dst_reg to point
2286 to the last word of the destination block, provided that the block
2287 is MAX_MOVE_BYTES long. */
2288 emit_insn (gen_movmemsi_internal (dst_reg, src_reg, at_a_time,
2289 new_dst_reg, new_src_reg));
2290 emit_move_insn (dst_reg, new_dst_reg);
2291 emit_move_insn (src_reg, new_src_reg);
2292 emit_insn (gen_addsi3 (dst_reg, dst_reg, GEN_INT (4)));
2294 if (bytes > MAX_MOVE_BYTES)
2296 emit_insn (gen_cmpsi (src_reg, final_src));
2297 emit_jump_insn (gen_bne (label));
2301 if (leftover)
2302 emit_insn (gen_movmemsi_internal (dst_reg, src_reg, GEN_INT (leftover),
2303 gen_reg_rtx (SImode),
2304 gen_reg_rtx (SImode)));
2308 /* Emit load/stores for a small constant word aligned block_move.
2310 operands[0] is the memory address of the destination.
2311 operands[1] is the memory address of the source.
2312 operands[2] is the number of bytes to move.
2313 operands[3] is a temp register.
2314 operands[4] is a temp register. */
2316 void
2317 m32r_output_block_move (rtx insn ATTRIBUTE_UNUSED, rtx operands[])
2319 HOST_WIDE_INT bytes = INTVAL (operands[2]);
2320 int first_time;
2321 int got_extra = 0;
2323 if (bytes < 1 || bytes > MAX_MOVE_BYTES)
2324 abort ();
2326 /* We do not have a post-increment store available, so the first set of
2327 stores are done without any increment, then the remaining ones can use
2328 the pre-increment addressing mode.
2330 Note: expand_block_move() also relies upon this behavior when building
2331 loops to copy large blocks. */
2332 first_time = 1;
2334 while (bytes > 0)
2336 if (bytes >= 8)
2338 if (first_time)
2340 output_asm_insn ("ld\t%5, %p1", operands);
2341 output_asm_insn ("ld\t%6, %p1", operands);
2342 output_asm_insn ("st\t%5, @%0", operands);
2343 output_asm_insn ("st\t%6, %s0", operands);
2345 else
2347 output_asm_insn ("ld\t%5, %p1", operands);
2348 output_asm_insn ("ld\t%6, %p1", operands);
2349 output_asm_insn ("st\t%5, %s0", operands);
2350 output_asm_insn ("st\t%6, %s0", operands);
2353 bytes -= 8;
2355 else if (bytes >= 4)
2357 if (bytes > 4)
2358 got_extra = 1;
2360 output_asm_insn ("ld\t%5, %p1", operands);
2362 if (got_extra)
2363 output_asm_insn ("ld\t%6, %p1", operands);
2365 if (first_time)
2366 output_asm_insn ("st\t%5, @%0", operands);
2367 else
2368 output_asm_insn ("st\t%5, %s0", operands);
2370 bytes -= 4;
2372 else
2374 /* Get the entire next word, even though we do not want all of it.
2375 The saves us from doing several smaller loads, and we assume that
2376 we cannot cause a page fault when at least part of the word is in
2377 valid memory [since we don't get called if things aren't properly
2378 aligned]. */
2379 int dst_offset = first_time ? 0 : 4;
2380 /* The amount of increment we have to make to the
2381 destination pointer. */
2382 int dst_inc_amount = dst_offset + bytes - 4;
2383 /* The same for the source pointer. */
2384 int src_inc_amount = bytes;
2385 int last_shift;
2386 rtx my_operands[3];
2388 /* If got_extra is true then we have already loaded
2389 the next word as part of loading and storing the previous word. */
2390 if (! got_extra)
2391 output_asm_insn ("ld\t%6, @%1", operands);
2393 if (bytes >= 2)
2395 bytes -= 2;
2397 output_asm_insn ("sra3\t%5, %6, #16", operands);
2398 my_operands[0] = operands[5];
2399 my_operands[1] = GEN_INT (dst_offset);
2400 my_operands[2] = operands[0];
2401 output_asm_insn ("sth\t%0, @(%1,%2)", my_operands);
2403 /* If there is a byte left to store then increment the
2404 destination address and shift the contents of the source
2405 register down by 8 bits. We could not do the address
2406 increment in the store half word instruction, because it does
2407 not have an auto increment mode. */
2408 if (bytes > 0) /* assert (bytes == 1) */
2410 dst_offset += 2;
2411 last_shift = 8;
2414 else
2415 last_shift = 24;
2417 if (bytes > 0)
2419 my_operands[0] = operands[6];
2420 my_operands[1] = GEN_INT (last_shift);
2421 output_asm_insn ("srai\t%0, #%1", my_operands);
2422 my_operands[0] = operands[6];
2423 my_operands[1] = GEN_INT (dst_offset);
2424 my_operands[2] = operands[0];
2425 output_asm_insn ("stb\t%0, @(%1,%2)", my_operands);
2428 /* Update the destination pointer if needed. We have to do
2429 this so that the patterns matches what we output in this
2430 function. */
2431 if (dst_inc_amount
2432 && !find_reg_note (insn, REG_UNUSED, operands[0]))
2434 my_operands[0] = operands[0];
2435 my_operands[1] = GEN_INT (dst_inc_amount);
2436 output_asm_insn ("addi\t%0, #%1", my_operands);
2439 /* Update the source pointer if needed. We have to do this
2440 so that the patterns matches what we output in this
2441 function. */
2442 if (src_inc_amount
2443 && !find_reg_note (insn, REG_UNUSED, operands[1]))
2445 my_operands[0] = operands[1];
2446 my_operands[1] = GEN_INT (src_inc_amount);
2447 output_asm_insn ("addi\t%0, #%1", my_operands);
2450 bytes = 0;
2453 first_time = 0;
2457 /* Return true if using NEW_REG in place of OLD_REG is ok. */
2460 m32r_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
2461 unsigned int new_reg)
2463 /* Interrupt routines can't clobber any register that isn't already used. */
2464 if (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl))
2465 && !regs_ever_live[new_reg])
2466 return 0;
2468 /* We currently emit epilogues as text, not rtl, so the liveness
2469 of the return address register isn't visible. */
2470 if (current_function_is_leaf && new_reg == RETURN_ADDR_REGNUM)
2471 return 0;
2473 return 1;
2477 m32r_return_addr (int count)
2479 if (count != 0)
2480 return const0_rtx;
2482 return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);