1 /* Subroutines used for code generation on the Renesas M32R cpu.
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
3 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. */
24 #include "coretypes.h"
29 #include "hard-reg-set.h"
31 #include "insn-config.h"
32 #include "conditions.h"
34 #include "insn-attr.h"
41 #include "integrate.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 const char * m32r_model_string = M32R_MODEL_DEFAULT;
55 enum m32r_model m32r_model;
57 /* Selected SDA support. */
58 const char * m32r_sdata_string = M32R_SDATA_DEFAULT;
59 enum m32r_sdata m32r_sdata;
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))
66 /* For string literals, etc. */
67 #define LIT_NAME_P(NAME) ((NAME)[0] == '*' && (NAME)[1] == '.')
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
76 -fluch-trap=TRAP-NUMBER
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;
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);
91 static void m32r_file_start (void);
93 static int m32r_adjust_priority (rtx, int);
94 static int m32r_issue_rate (void);
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,
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,
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_ENCODE_SECTION_INFO
129 #define TARGET_ENCODE_SECTION_INFO m32r_encode_section_info
130 #undef TARGET_IN_SMALL_DATA_P
131 #define TARGET_IN_SMALL_DATA_P m32r_in_small_data_p
133 #undef TARGET_RTX_COSTS
134 #define TARGET_RTX_COSTS m32r_rtx_costs
135 #undef TARGET_ADDRESS_COST
136 #define TARGET_ADDRESS_COST hook_int_rtx_0
138 #undef TARGET_PROMOTE_PROTOTYPES
139 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
140 #undef TARGET_RETURN_IN_MEMORY
141 #define TARGET_RETURN_IN_MEMORY m32r_return_in_memory
142 #undef TARGET_SETUP_INCOMING_VARARGS
143 #define TARGET_SETUP_INCOMING_VARARGS m32r_setup_incoming_varargs
144 #undef TARGET_MUST_PASS_IN_STACK
145 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
146 #undef TARGET_PASS_BY_REFERENCE
147 #define TARGET_PASS_BY_REFERENCE m32r_pass_by_reference
149 struct gcc_target targetm = TARGET_INITIALIZER;
151 /* Called by OVERRIDE_OPTIONS to initialize various things. */
158 /* Initialize array for PRINT_OPERAND_PUNCT_VALID_P. */
159 memset (m32r_punct_chars, 0, sizeof (m32r_punct_chars));
160 m32r_punct_chars['#'] = 1;
161 m32r_punct_chars['@'] = 1; /* ??? no longer used */
163 /* Provide default value if not specified. */
165 g_switch_value = SDATA_DEFAULT_SIZE;
167 if (strcmp (m32r_model_string, "small") == 0)
168 m32r_model = M32R_MODEL_SMALL;
169 else if (strcmp (m32r_model_string, "medium") == 0)
170 m32r_model = M32R_MODEL_MEDIUM;
171 else if (strcmp (m32r_model_string, "large") == 0)
172 m32r_model = M32R_MODEL_LARGE;
174 error ("bad value (%s) for -mmodel switch", m32r_model_string);
176 if (strcmp (m32r_sdata_string, "none") == 0)
177 m32r_sdata = M32R_SDATA_NONE;
178 else if (strcmp (m32r_sdata_string, "sdata") == 0)
179 m32r_sdata = M32R_SDATA_SDATA;
180 else if (strcmp (m32r_sdata_string, "use") == 0)
181 m32r_sdata = M32R_SDATA_USE;
183 error ("bad value (%s) for -msdata switch", m32r_sdata_string);
185 if (m32r_cache_flush_trap_string)
187 /* Change trap-number (12) for cache-flush to the others (0 - 15). */
188 m32r_cache_flush_trap = atoi (m32r_cache_flush_trap_string);
189 if (m32r_cache_flush_trap < 0 || m32r_cache_flush_trap > 15)
190 error ("bad value (%s) for -flush-trap=n (0=<n<=15)",
191 m32r_cache_flush_trap_string);
195 /* Vectors to keep interesting information about registers where it can easily
196 be got. We use to use the actual mode value as the bit number, but there
197 is (or may be) more than 32 modes now. Instead we use two tables: one
198 indexed by hard register number, and one indexed by mode. */
200 /* The purpose of m32r_mode_class is to shrink the range of modes so that
201 they all fit (as bit numbers) in a 32 bit word (again). Each real mode is
202 mapped into one m32r_mode_class mode. */
207 S_MODE, D_MODE, T_MODE, O_MODE,
208 SF_MODE, DF_MODE, TF_MODE, OF_MODE, A_MODE
211 /* Modes for condition codes. */
212 #define C_MODES (1 << (int) C_MODE)
214 /* Modes for single-word and smaller quantities. */
215 #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
217 /* Modes for double-word and smaller quantities. */
218 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
220 /* Modes for quad-word and smaller quantities. */
221 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
223 /* Modes for accumulators. */
224 #define A_MODES (1 << (int) A_MODE)
226 /* Value is 1 if register/mode pair is acceptable on arc. */
228 const unsigned int m32r_hard_regno_mode_ok[FIRST_PSEUDO_REGISTER] =
230 T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES,
231 T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, S_MODES, S_MODES, S_MODES,
232 S_MODES, C_MODES, A_MODES, A_MODES
235 unsigned int m32r_mode_class [NUM_MACHINE_MODES];
237 enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER];
240 init_reg_tables (void)
244 for (i = 0; i < NUM_MACHINE_MODES; i++)
246 switch (GET_MODE_CLASS (i))
249 case MODE_PARTIAL_INT:
250 case MODE_COMPLEX_INT:
251 if (GET_MODE_SIZE (i) <= 4)
252 m32r_mode_class[i] = 1 << (int) S_MODE;
253 else if (GET_MODE_SIZE (i) == 8)
254 m32r_mode_class[i] = 1 << (int) D_MODE;
255 else if (GET_MODE_SIZE (i) == 16)
256 m32r_mode_class[i] = 1 << (int) T_MODE;
257 else if (GET_MODE_SIZE (i) == 32)
258 m32r_mode_class[i] = 1 << (int) O_MODE;
260 m32r_mode_class[i] = 0;
263 case MODE_COMPLEX_FLOAT:
264 if (GET_MODE_SIZE (i) <= 4)
265 m32r_mode_class[i] = 1 << (int) SF_MODE;
266 else if (GET_MODE_SIZE (i) == 8)
267 m32r_mode_class[i] = 1 << (int) DF_MODE;
268 else if (GET_MODE_SIZE (i) == 16)
269 m32r_mode_class[i] = 1 << (int) TF_MODE;
270 else if (GET_MODE_SIZE (i) == 32)
271 m32r_mode_class[i] = 1 << (int) OF_MODE;
273 m32r_mode_class[i] = 0;
276 m32r_mode_class[i] = 1 << (int) C_MODE;
279 m32r_mode_class[i] = 0;
284 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
287 m32r_regno_reg_class[i] = GENERAL_REGS;
288 else if (i == ARG_POINTER_REGNUM)
289 m32r_regno_reg_class[i] = GENERAL_REGS;
291 m32r_regno_reg_class[i] = NO_REGS;
295 /* M32R specific attribute support.
297 interrupt - for interrupt functions
299 model - select code model used to access object
301 small: addresses use 24 bits, use bl to make calls
302 medium: addresses use 32 bits, use bl to make calls
303 large: addresses use 32 bits, use seth/add3/jl to make calls
305 Grep for MODEL in m32r.h for more info. */
307 static tree small_ident1;
308 static tree small_ident2;
309 static tree medium_ident1;
310 static tree medium_ident2;
311 static tree large_ident1;
312 static tree large_ident2;
317 if (small_ident1 == 0)
319 small_ident1 = get_identifier ("small");
320 small_ident2 = get_identifier ("__small__");
321 medium_ident1 = get_identifier ("medium");
322 medium_ident2 = get_identifier ("__medium__");
323 large_ident1 = get_identifier ("large");
324 large_ident2 = get_identifier ("__large__");
328 const struct attribute_spec m32r_attribute_table[] =
330 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
331 { "interrupt", 0, 0, true, false, false, NULL },
332 { "model", 1, 1, true, false, false, m32r_handle_model_attribute },
333 { NULL, 0, 0, false, false, false, NULL }
337 /* Handle an "model" attribute; arguments as in
338 struct attribute_spec.handler. */
340 m32r_handle_model_attribute (tree *node ATTRIBUTE_UNUSED, tree name,
341 tree args, int flags ATTRIBUTE_UNUSED,
347 arg = TREE_VALUE (args);
349 if (arg != small_ident1
350 && arg != small_ident2
351 && arg != medium_ident1
352 && arg != medium_ident2
353 && arg != large_ident1
354 && arg != large_ident2)
356 warning ("invalid argument of %qs attribute",
357 IDENTIFIER_POINTER (name));
358 *no_add_attrs = true;
364 /* Encode section information of DECL, which is either a VAR_DECL,
365 FUNCTION_DECL, STRING_CST, CONSTRUCTOR, or ???.
367 For the M32R we want to record:
369 - whether the object lives in .sdata/.sbss.
370 - what code model should be used to access the object
374 m32r_encode_section_info (tree decl, rtx rtl, int first)
378 enum m32r_model model;
380 default_encode_section_info (decl, rtl, first);
385 model_attr = lookup_attribute ("model", DECL_ATTRIBUTES (decl));
392 id = TREE_VALUE (TREE_VALUE (model_attr));
394 if (id == small_ident1 || id == small_ident2)
395 model = M32R_MODEL_SMALL;
396 else if (id == medium_ident1 || id == medium_ident2)
397 model = M32R_MODEL_MEDIUM;
398 else if (id == large_ident1 || id == large_ident2)
399 model = M32R_MODEL_LARGE;
401 abort (); /* shouldn't happen */
405 if (TARGET_MODEL_SMALL)
406 model = M32R_MODEL_SMALL;
407 else if (TARGET_MODEL_MEDIUM)
408 model = M32R_MODEL_MEDIUM;
409 else if (TARGET_MODEL_LARGE)
410 model = M32R_MODEL_LARGE;
412 abort (); /* shouldn't happen */
414 extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
417 SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;
420 /* Only mark the object as being small data area addressable if
421 it hasn't been explicitly marked with a code model.
423 The user can explicitly put an object in the small data area with the
424 section attribute. If the object is in sdata/sbss and marked with a
425 code model do both [put the object in .sdata and mark it as being
426 addressed with a specific code model - don't mark it as being addressed
427 with an SDA reloc though]. This is ok and might be useful at times. If
428 the object doesn't fit the linker will give an error. */
431 m32r_in_small_data_p (tree decl)
435 if (TREE_CODE (decl) != VAR_DECL)
438 if (lookup_attribute ("model", DECL_ATTRIBUTES (decl)))
441 section = DECL_SECTION_NAME (decl);
444 char *name = (char *) TREE_STRING_POINTER (section);
445 if (strcmp (name, ".sdata") == 0 || strcmp (name, ".sbss") == 0)
450 if (! TREE_READONLY (decl) && ! TARGET_SDATA_NONE)
452 int size = int_size_in_bytes (TREE_TYPE (decl));
454 if (size > 0 && (unsigned HOST_WIDE_INT) size <= g_switch_value)
462 /* Do anything needed before RTL is emitted for each function. */
465 m32r_init_expanders (void)
467 /* ??? At one point there was code here. The function is left in
468 to make it easy to experiment. */
471 /* Acceptable arguments to the call insn. */
474 call_address_operand (rtx op, enum machine_mode mode)
476 return symbolic_operand (op, mode);
478 /* Constants and values in registers are not OK, because
479 the m32r BL instruction can only support PC relative branching. */
483 call_operand (rtx op, enum machine_mode mode)
485 if (GET_CODE (op) != MEM)
488 return call_address_operand (op, mode);
491 /* Returns 1 if OP is a symbol reference. */
494 symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
496 switch (GET_CODE (op))
508 /* Return 1 if OP is a reference to an object in .sdata/.sbss. */
511 small_data_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
513 if (! TARGET_SDATA_USE)
516 if (GET_CODE (op) == SYMBOL_REF)
517 return SYMBOL_REF_SMALL_P (op);
519 if (GET_CODE (op) == CONST
520 && GET_CODE (XEXP (op, 0)) == PLUS
521 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
522 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
523 && INT16_P (INTVAL (XEXP (XEXP (op, 0), 1))))
524 return SYMBOL_REF_SMALL_P (XEXP (XEXP (op, 0), 0));
529 /* Return 1 if OP is a symbol that can use 24 bit addressing. */
532 addr24_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
539 if (GET_CODE (op) == LABEL_REF)
540 return TARGET_ADDR24;
542 if (GET_CODE (op) == SYMBOL_REF)
544 else if (GET_CODE (op) == CONST
545 && GET_CODE (XEXP (op, 0)) == PLUS
546 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
547 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
548 && UINT24_P (INTVAL (XEXP (XEXP (op, 0), 1))))
549 sym = XEXP (XEXP (op, 0), 0);
553 if (SYMBOL_REF_MODEL (sym) == M32R_MODEL_SMALL)
557 && (CONSTANT_POOL_ADDRESS_P (sym)
558 || LIT_NAME_P (XSTR (sym, 0))))
564 /* Return 1 if OP is a symbol that needs 32 bit addressing. */
567 addr32_operand (rtx op, enum machine_mode mode)
571 if (GET_CODE (op) == LABEL_REF)
572 return TARGET_ADDR32;
574 if (GET_CODE (op) == SYMBOL_REF)
576 else if (GET_CODE (op) == CONST
577 && GET_CODE (XEXP (op, 0)) == PLUS
578 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
579 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
581 sym = XEXP (XEXP (op, 0), 0);
585 return (! addr24_operand (sym, mode)
586 && ! small_data_operand (sym, mode));
589 /* Return 1 if OP is a function that can be called with the `bl' insn. */
592 call26_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
597 if (GET_CODE (op) == SYMBOL_REF)
598 return SYMBOL_REF_MODEL (op) != M32R_MODEL_LARGE;
600 return TARGET_CALL26;
603 /* Returns 1 if OP is an acceptable operand for seth/add3. */
606 seth_add3_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
611 if (GET_CODE (op) == SYMBOL_REF
612 || GET_CODE (op) == LABEL_REF)
615 if (GET_CODE (op) == CONST
616 && GET_CODE (XEXP (op, 0)) == PLUS
617 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
618 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
619 && INT16_P (INTVAL (XEXP (XEXP (op, 0), 1))))
625 /* Return true if OP is a signed 8 bit immediate value. */
628 int8_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
630 if (GET_CODE (op) != CONST_INT)
632 return INT8_P (INTVAL (op));
635 /* Return true if OP is a signed 16 bit immediate value
636 useful in comparisons. */
639 cmp_int16_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
641 if (GET_CODE (op) != CONST_INT)
643 return CMP_INT16_P (INTVAL (op));
646 /* Return true if OP is an unsigned 16 bit immediate value. */
649 uint16_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
651 if (GET_CODE (op) != CONST_INT)
653 return UINT16_P (INTVAL (op));
656 /* Return true if OP is a register or signed 16 bit value. */
659 reg_or_int16_operand (rtx op, enum machine_mode mode)
661 if (GET_CODE (op) == REG || GET_CODE (op) == SUBREG)
662 return register_operand (op, mode);
663 if (GET_CODE (op) != CONST_INT)
665 return INT16_P (INTVAL (op));
668 /* Return true if OP is a register or an unsigned 16 bit value. */
671 reg_or_uint16_operand (rtx op, enum machine_mode mode)
673 if (GET_CODE (op) == REG || GET_CODE (op) == SUBREG)
674 return register_operand (op, mode);
675 if (GET_CODE (op) != CONST_INT)
677 return UINT16_P (INTVAL (op));
680 /* Return true if OP is a register or an integer value that can be
681 used is SEQ/SNE. We can use either XOR of the value or ADD of
682 the negative of the value for the constant. Don't allow 0,
683 because that is special cased. */
686 reg_or_eq_int16_operand (rtx op, enum machine_mode mode)
690 if (GET_CODE (op) == REG || GET_CODE (op) == SUBREG)
691 return register_operand (op, mode);
693 if (GET_CODE (op) != CONST_INT)
697 return (value != 0) && (UINT16_P (value) || CMP_INT16_P (-value));
700 /* Return true if OP is a register or signed 16 bit value for compares. */
703 reg_or_cmp_int16_operand (rtx op, enum machine_mode mode)
705 if (GET_CODE (op) == REG || GET_CODE (op) == SUBREG)
706 return register_operand (op, mode);
707 if (GET_CODE (op) != CONST_INT)
709 return CMP_INT16_P (INTVAL (op));
712 /* Return true if OP is a register or the constant 0. */
715 reg_or_zero_operand (rtx op, enum machine_mode mode)
717 if (GET_CODE (op) == REG || GET_CODE (op) == SUBREG)
718 return register_operand (op, mode);
720 if (GET_CODE (op) != CONST_INT)
723 return INTVAL (op) == 0;
726 /* Return true if OP is a const_int requiring two instructions to load. */
729 two_insn_const_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
731 if (GET_CODE (op) != CONST_INT)
733 if (INT16_P (INTVAL (op))
734 || UINT24_P (INTVAL (op))
735 || UPPER16_P (INTVAL (op)))
740 /* Return true if OP is an acceptable argument for a single word
744 move_src_operand (rtx op, enum machine_mode mode)
746 switch (GET_CODE (op))
751 return addr24_operand (op, mode);
753 /* ??? We allow more cse opportunities if we only allow constants
754 loadable with one insn, and split the rest into two. The instances
755 where this would help should be rare and the current way is
757 if (HOST_BITS_PER_WIDE_INT > 32)
759 HOST_WIDE_INT rest = INTVAL (op) >> 31;
760 return (rest == 0 || rest == -1);
767 else if (mode == SImode)
769 /* Large unsigned constants are represented as const_double's. */
770 unsigned HOST_WIDE_INT low, high;
772 low = CONST_DOUBLE_LOW (op);
773 high = CONST_DOUBLE_HIGH (op);
774 return high == 0 && low <= (unsigned) 0xffffffff;
779 return register_operand (op, mode);
781 /* (subreg (mem ...) ...) can occur here if the inner part was once a
782 pseudo-reg and is now a stack slot. */
783 if (GET_CODE (SUBREG_REG (op)) == MEM)
784 return address_operand (XEXP (SUBREG_REG (op), 0), mode);
786 return register_operand (op, mode);
788 if (GET_CODE (XEXP (op, 0)) == PRE_INC
789 || GET_CODE (XEXP (op, 0)) == PRE_DEC)
790 return 0; /* loads can't do pre-{inc,dec} */
791 return address_operand (XEXP (op, 0), mode);
797 /* Return true if OP is an acceptable argument for a double word
801 move_double_src_operand (rtx op, enum machine_mode mode)
803 switch (GET_CODE (op))
809 return register_operand (op, mode);
811 /* (subreg (mem ...) ...) can occur here if the inner part was once a
812 pseudo-reg and is now a stack slot. */
813 if (GET_CODE (SUBREG_REG (op)) == MEM)
814 return move_double_src_operand (SUBREG_REG (op), mode);
816 return register_operand (op, mode);
818 /* Disallow auto inc/dec for now. */
819 if (GET_CODE (XEXP (op, 0)) == PRE_DEC
820 || GET_CODE (XEXP (op, 0)) == PRE_INC)
822 return address_operand (XEXP (op, 0), mode);
828 /* Return true if OP is an acceptable argument for a move destination. */
831 move_dest_operand (rtx op, enum machine_mode mode)
833 switch (GET_CODE (op))
836 return register_operand (op, mode);
838 /* (subreg (mem ...) ...) can occur here if the inner part was once a
839 pseudo-reg and is now a stack slot. */
840 if (GET_CODE (SUBREG_REG (op)) == MEM)
841 return address_operand (XEXP (SUBREG_REG (op), 0), mode);
843 return register_operand (op, mode);
845 if (GET_CODE (XEXP (op, 0)) == POST_INC)
846 return 0; /* stores can't do post inc */
847 return address_operand (XEXP (op, 0), mode);
853 /* Return 1 if OP is a DImode const we want to handle inline.
854 This must match the code in the movdi pattern.
855 It is used by the 'G' CONST_DOUBLE_OK_FOR_LETTER. */
858 easy_di_const (rtx op)
860 rtx high_rtx, low_rtx;
861 HOST_WIDE_INT high, low;
863 split_double (op, &high_rtx, &low_rtx);
864 high = INTVAL (high_rtx);
865 low = INTVAL (low_rtx);
866 /* Pick constants loadable with 2 16 bit `ldi' insns. */
867 if (high >= -128 && high <= 127
868 && low >= -128 && low <= 127)
873 /* Return 1 if OP is a DFmode const we want to handle inline.
874 This must match the code in the movdf pattern.
875 It is used by the 'H' CONST_DOUBLE_OK_FOR_LETTER. */
878 easy_df_const (rtx op)
883 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
884 REAL_VALUE_TO_TARGET_DOUBLE (r, l);
885 if (l[0] == 0 && l[1] == 0)
887 if ((l[0] & 0xffff) == 0 && l[1] == 0)
892 /* Return 1 if OP is an EQ or NE comparison operator. */
895 eqne_comparison_operator (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
897 enum rtx_code code = GET_CODE (op);
899 return (code == EQ || code == NE);
902 /* Return 1 if OP is a signed comparison operator. */
905 signed_comparison_operator (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
907 enum rtx_code code = GET_CODE (op);
909 return (COMPARISON_P (op)
910 && (code == EQ || code == NE
911 || code == LT || code == LE || code == GT || code == GE));
914 /* Return 1 if OP is (mem (reg ...)).
915 This is used in insn length calcs. */
918 memreg_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
920 return GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == REG;
923 /* Return true if OP is an acceptable input argument for a zero/sign extend
927 extend_operand (rtx op, enum machine_mode mode)
931 switch (GET_CODE (op))
935 return register_operand (op, mode);
939 if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
940 return 0; /* loads can't do pre inc/pre dec */
942 return address_operand (addr, mode);
949 /* Return nonzero if the operand is an insn that is a small insn.
950 Allow const_int 0 as well, which is a placeholder for NOP slots. */
953 small_insn_p (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
955 if (GET_CODE (op) == CONST_INT && INTVAL (op) == 0)
961 return get_attr_length (op) == 2;
964 /* Return nonzero if the operand is an insn that is a large insn. */
967 large_insn_p (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
972 return get_attr_length (op) != 2;
975 /* Return nonzero if TYPE must be passed by indirect reference. */
978 m32r_pass_by_reference (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
979 enum machine_mode mode, tree type,
980 bool named ATTRIBUTE_UNUSED)
985 size = int_size_in_bytes (type);
987 size = GET_MODE_SIZE (mode);
989 return (size < 0 || size > 8);
994 /* X and Y are two things to compare using CODE. Emit the compare insn and
995 return the rtx for compare [arg0 of the if_then_else].
996 If need_compare is true then the comparison insn must be generated, rather
997 than being subsumed into the following branch instruction. */
1000 gen_compare (enum rtx_code code, rtx x, rtx y, int need_compare)
1002 enum rtx_code compare_code;
1003 enum rtx_code branch_code;
1004 rtx cc_reg = gen_rtx_REG (CCmode, CARRY_REGNUM);
1009 case EQ: compare_code = EQ; branch_code = NE; break;
1010 case NE: compare_code = EQ; branch_code = EQ; break;
1011 case LT: compare_code = LT; branch_code = NE; break;
1012 case LE: compare_code = LT; branch_code = EQ; must_swap = 1; break;
1013 case GT: compare_code = LT; branch_code = NE; must_swap = 1; break;
1014 case GE: compare_code = LT; branch_code = EQ; break;
1015 case LTU: compare_code = LTU; branch_code = NE; break;
1016 case LEU: compare_code = LTU; branch_code = EQ; must_swap = 1; break;
1017 case GTU: compare_code = LTU; branch_code = NE; must_swap = 1; break;
1018 case GEU: compare_code = LTU; branch_code = EQ; break;
1026 switch (compare_code)
1029 if (GET_CODE (y) == CONST_INT
1030 && CMP_INT16_P (INTVAL (y)) /* Reg equal to small const. */
1033 rtx tmp = gen_reg_rtx (SImode);
1035 emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
1039 else if (CONSTANT_P (y)) /* Reg equal to const. */
1041 rtx tmp = force_reg (GET_MODE (x), y);
1045 if (register_operand (y, SImode) /* Reg equal to reg. */
1046 || y == const0_rtx) /* Reg equal to zero. */
1048 emit_insn (gen_cmp_eqsi_insn (x, y));
1050 return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
1055 if (register_operand (y, SImode)
1056 || (GET_CODE (y) == CONST_INT && CMP_INT16_P (INTVAL (y))))
1058 rtx tmp = gen_reg_rtx (SImode); /* Reg compared to reg. */
1063 emit_insn (gen_cmp_ltsi_insn (x, y));
1067 if (y == const0_rtx)
1070 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
1071 emit_insn (gen_cmp_ltsi_insn (x, tmp));
1075 if (GET_CODE (y) == CONST_INT)
1076 tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
1078 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
1079 emit_insn (gen_cmp_ltsi_insn (x, tmp));
1083 emit_insn (gen_cmp_ltsi_insn (x, y));
1090 return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
1095 if (register_operand (y, SImode)
1096 || (GET_CODE (y) == CONST_INT && CMP_INT16_P (INTVAL (y))))
1098 rtx tmp = gen_reg_rtx (SImode); /* Reg (unsigned) compared to reg. */
1103 emit_insn (gen_cmp_ltusi_insn (x, y));
1107 if (y == const0_rtx)
1110 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
1111 emit_insn (gen_cmp_ltusi_insn (x, tmp));
1115 if (GET_CODE (y) == CONST_INT)
1116 tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
1118 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
1119 emit_insn (gen_cmp_ltusi_insn (x, tmp));
1123 emit_insn (gen_cmp_ltusi_insn (x, y));
1130 return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
1140 /* Reg/reg equal comparison. */
1141 if (compare_code == EQ
1142 && register_operand (y, SImode))
1143 return gen_rtx_fmt_ee (code, CCmode, x, y);
1145 /* Reg/zero signed comparison. */
1146 if ((compare_code == EQ || compare_code == LT)
1148 return gen_rtx_fmt_ee (code, CCmode, x, y);
1150 /* Reg/smallconst equal comparison. */
1151 if (compare_code == EQ
1152 && GET_CODE (y) == CONST_INT
1153 && CMP_INT16_P (INTVAL (y)))
1155 rtx tmp = gen_reg_rtx (SImode);
1157 emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
1158 return gen_rtx_fmt_ee (code, CCmode, tmp, const0_rtx);
1161 /* Reg/const equal comparison. */
1162 if (compare_code == EQ
1165 rtx tmp = force_reg (GET_MODE (x), y);
1167 return gen_rtx_fmt_ee (code, CCmode, x, tmp);
1174 y = force_reg (GET_MODE (x), y);
1177 int ok_const = reg_or_int16_operand (y, GET_MODE (y));
1180 y = force_reg (GET_MODE (x), y);
1184 switch (compare_code)
1187 emit_insn (gen_cmp_eqsi_insn (must_swap ? y : x, must_swap ? x : y));
1190 emit_insn (gen_cmp_ltsi_insn (must_swap ? y : x, must_swap ? x : y));
1193 emit_insn (gen_cmp_ltusi_insn (must_swap ? y : x, must_swap ? x : y));
1200 return gen_rtx_fmt_ee (branch_code, VOIDmode, cc_reg, CONST0_RTX (CCmode));
1203 /* Split a 2 word move (DI or DF) into component parts. */
1206 gen_split_move_double (rtx operands[])
1208 enum machine_mode mode = GET_MODE (operands[0]);
1209 rtx dest = operands[0];
1210 rtx src = operands[1];
1213 /* We might have (SUBREG (MEM)) here, so just get rid of the
1214 subregs to make this code simpler. It is safe to call
1215 alter_subreg any time after reload. */
1216 if (GET_CODE (dest) == SUBREG)
1217 alter_subreg (&dest);
1218 if (GET_CODE (src) == SUBREG)
1219 alter_subreg (&src);
1222 if (GET_CODE (dest) == REG)
1224 int dregno = REGNO (dest);
1227 if (GET_CODE (src) == REG)
1229 int sregno = REGNO (src);
1231 int reverse = (dregno == sregno + 1);
1233 /* We normally copy the low-numbered register first. However, if
1234 the first register operand 0 is the same as the second register of
1235 operand 1, we must copy in the opposite order. */
1236 emit_insn (gen_rtx_SET (VOIDmode,
1237 operand_subword (dest, reverse, TRUE, mode),
1238 operand_subword (src, reverse, TRUE, mode)));
1240 emit_insn (gen_rtx_SET (VOIDmode,
1241 operand_subword (dest, !reverse, TRUE, mode),
1242 operand_subword (src, !reverse, TRUE, mode)));
1245 /* Reg = constant. */
1246 else if (GET_CODE (src) == CONST_INT || GET_CODE (src) == CONST_DOUBLE)
1249 split_double (src, &words[0], &words[1]);
1250 emit_insn (gen_rtx_SET (VOIDmode,
1251 operand_subword (dest, 0, TRUE, mode),
1254 emit_insn (gen_rtx_SET (VOIDmode,
1255 operand_subword (dest, 1, TRUE, mode),
1260 else if (GET_CODE (src) == MEM)
1262 /* If the high-address word is used in the address, we must load it
1263 last. Otherwise, load it first. */
1265 = (refers_to_regno_p (dregno, dregno + 1, XEXP (src, 0), 0) != 0);
1267 /* We used to optimize loads from single registers as
1271 if r3 were not used subsequently. However, the REG_NOTES aren't
1272 propagated correctly by the reload phase, and it can cause bad
1273 code to be generated. We could still try:
1275 ld r1,r3+; ld r2,r3; addi r3,-4
1277 which saves 2 bytes and doesn't force longword alignment. */
1278 emit_insn (gen_rtx_SET (VOIDmode,
1279 operand_subword (dest, reverse, TRUE, mode),
1280 adjust_address (src, SImode,
1281 reverse * UNITS_PER_WORD)));
1283 emit_insn (gen_rtx_SET (VOIDmode,
1284 operand_subword (dest, !reverse, TRUE, mode),
1285 adjust_address (src, SImode,
1286 !reverse * UNITS_PER_WORD)));
1293 /* We used to optimize loads from single registers as
1297 if r3 were not used subsequently. However, the REG_NOTES aren't
1298 propagated correctly by the reload phase, and it can cause bad
1299 code to be generated. We could still try:
1301 st r1,r3; st r2,+r3; addi r3,-4
1303 which saves 2 bytes and doesn't force longword alignment. */
1304 else if (GET_CODE (dest) == MEM && GET_CODE (src) == REG)
1306 emit_insn (gen_rtx_SET (VOIDmode,
1307 adjust_address (dest, SImode, 0),
1308 operand_subword (src, 0, TRUE, mode)));
1310 emit_insn (gen_rtx_SET (VOIDmode,
1311 adjust_address (dest, SImode, UNITS_PER_WORD),
1312 operand_subword (src, 1, TRUE, mode)));
1324 /* Implements the FUNCTION_ARG_PARTIAL_NREGS macro. */
1327 function_arg_partial_nregs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
1328 tree type, int named ATTRIBUTE_UNUSED)
1332 (((mode == BLKmode && type)
1333 ? (unsigned int) int_size_in_bytes (type)
1334 : GET_MODE_SIZE (mode)) + UNITS_PER_WORD - 1)
1337 if (*cum >= M32R_MAX_PARM_REGS)
1339 else if (*cum + size > M32R_MAX_PARM_REGS)
1340 ret = (*cum + size) - M32R_MAX_PARM_REGS;
1347 /* Worker function for TARGET_RETURN_IN_MEMORY. */
1350 m32r_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
1352 return m32r_pass_by_reference (NULL, TYPE_MODE (type), type, false);
1355 /* Do any needed setup for a variadic function. For the M32R, we must
1356 create a register parameter block, and then copy any anonymous arguments
1357 in registers to memory.
1359 CUM has not been updated for the last named argument which has type TYPE
1360 and mode MODE, and we rely on this fact. */
1363 m32r_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
1364 tree type, int *pretend_size, int no_rtl)
1371 /* All BLKmode values are passed by reference. */
1372 if (mode == BLKmode)
1375 first_anon_arg = (ROUND_ADVANCE_CUM (*cum, mode, type)
1376 + ROUND_ADVANCE_ARG (mode, type));
1378 if (first_anon_arg < M32R_MAX_PARM_REGS)
1380 /* Note that first_reg_offset < M32R_MAX_PARM_REGS. */
1381 int first_reg_offset = first_anon_arg;
1382 /* Size in words to "pretend" allocate. */
1383 int size = M32R_MAX_PARM_REGS - first_reg_offset;
1386 regblock = gen_rtx_MEM (BLKmode,
1387 plus_constant (arg_pointer_rtx,
1388 FIRST_PARM_OFFSET (0)));
1389 set_mem_alias_set (regblock, get_varargs_alias_set ());
1390 move_block_from_reg (first_reg_offset, regblock, size);
1392 *pretend_size = (size * UNITS_PER_WORD);
1397 /* Return true if INSN is real instruction bearing insn. */
1400 m32r_is_insn (rtx insn)
1402 return (INSN_P (insn)
1403 && GET_CODE (PATTERN (insn)) != USE
1404 && GET_CODE (PATTERN (insn)) != CLOBBER
1405 && GET_CODE (PATTERN (insn)) != ADDR_VEC);
1408 /* Increase the priority of long instructions so that the
1409 short instructions are scheduled ahead of the long ones. */
1412 m32r_adjust_priority (rtx insn, int priority)
1414 if (m32r_is_insn (insn)
1415 && get_attr_insn_size (insn) != INSN_SIZE_SHORT)
1422 /* Indicate how many instructions can be issued at the same time.
1423 This is sort of a lie. The m32r can issue only 1 long insn at
1424 once, but it can issue 2 short insns. The default therefore is
1425 set at 2, but this can be overridden by the command line option
1429 m32r_issue_rate (void)
1431 return ((TARGET_LOW_ISSUE_RATE) ? 1 : 2);
1434 /* Cost functions. */
1437 m32r_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, int *total)
1441 /* Small integers are as cheap as registers. 4 byte values can be
1442 fetched as immediate constants - let's give that the cost of an
1445 if (INT16_P (INTVAL (x)))
1455 *total = COSTS_N_INSNS (1);
1462 split_double (x, &high, &low);
1463 *total = COSTS_N_INSNS (!INT16_P (INTVAL (high))
1464 + !INT16_P (INTVAL (low)));
1469 *total = COSTS_N_INSNS (3);
1476 *total = COSTS_N_INSNS (10);
1484 /* Type of function DECL.
1486 The result is cached. To reset the cache at the end of a function,
1487 call with DECL = NULL_TREE. */
1489 enum m32r_function_type
1490 m32r_compute_function_type (tree decl)
1493 static enum m32r_function_type fn_type = M32R_FUNCTION_UNKNOWN;
1494 /* Last function we were called for. */
1495 static tree last_fn = NULL_TREE;
1497 /* Resetting the cached value? */
1498 if (decl == NULL_TREE)
1500 fn_type = M32R_FUNCTION_UNKNOWN;
1501 last_fn = NULL_TREE;
1505 if (decl == last_fn && fn_type != M32R_FUNCTION_UNKNOWN)
1508 /* Compute function type. */
1509 fn_type = (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl)) != NULL_TREE
1510 ? M32R_FUNCTION_INTERRUPT
1511 : M32R_FUNCTION_NORMAL);
1516 \f/* Function prologue/epilogue handlers. */
1518 /* M32R stack frames look like:
1520 Before call After call
1521 +-----------------------+ +-----------------------+
1523 high | local variables, | | local variables, |
1524 mem | reg save area, etc. | | reg save area, etc. |
1526 +-----------------------+ +-----------------------+
1528 | arguments on stack. | | arguments on stack. |
1530 SP+0->+-----------------------+ +-----------------------+
1531 | reg parm save area, |
1532 | only created for |
1533 | variable argument |
1535 +-----------------------+
1536 | previous frame ptr |
1537 +-----------------------+
1539 | register save area |
1541 +-----------------------+
1543 +-----------------------+
1547 +-----------------------+
1549 | alloca allocations |
1551 +-----------------------+
1553 low | arguments on stack |
1555 SP+0->+-----------------------+
1558 1) The "reg parm save area" does not exist for non variable argument fns.
1559 2) The "reg parm save area" can be eliminated completely if we saved regs
1560 containing anonymous args separately but that complicates things too
1561 much (so it's not done).
1562 3) The return address is saved after the register save area so as to have as
1563 many insns as possible between the restoration of `lr' and the `jmp lr'. */
1565 /* Structure to be filled in by m32r_compute_frame_size with register
1566 save masks, and offsets for the current function. */
1567 struct m32r_frame_info
1569 unsigned int total_size; /* # bytes that the entire frame takes up. */
1570 unsigned int extra_size; /* # bytes of extra stuff. */
1571 unsigned int pretend_size; /* # bytes we push and pretend caller did. */
1572 unsigned int args_size; /* # bytes that outgoing arguments take up. */
1573 unsigned int reg_size; /* # bytes needed to store regs. */
1574 unsigned int var_size; /* # bytes that variables take up. */
1575 unsigned int gmask; /* Mask of saved gp registers. */
1576 unsigned int save_fp; /* Nonzero if fp must be saved. */
1577 unsigned int save_lr; /* Nonzero if lr (return addr) must be saved. */
1578 int initialized; /* Nonzero if frame size already calculated. */
1581 /* Current frame information calculated by m32r_compute_frame_size. */
1582 static struct m32r_frame_info current_frame_info;
1584 /* Zero structure to initialize current_frame_info. */
1585 static struct m32r_frame_info zero_frame_info;
1587 #define FRAME_POINTER_MASK (1 << (FRAME_POINTER_REGNUM))
1588 #define RETURN_ADDR_MASK (1 << (RETURN_ADDR_REGNUM))
1590 /* Tell prologue and epilogue if register REGNO should be saved / restored.
1591 The return address and frame pointer are treated separately.
1592 Don't consider them here. */
1593 #define MUST_SAVE_REGISTER(regno, interrupt_p) \
1594 ((regno) != RETURN_ADDR_REGNUM && (regno) != FRAME_POINTER_REGNUM \
1595 && (regs_ever_live[regno] && (!call_really_used_regs[regno] || interrupt_p)))
1597 #define MUST_SAVE_FRAME_POINTER (regs_ever_live[FRAME_POINTER_REGNUM])
1598 #define MUST_SAVE_RETURN_ADDR (regs_ever_live[RETURN_ADDR_REGNUM] || current_function_profile)
1600 #define SHORT_INSN_SIZE 2 /* Size of small instructions. */
1601 #define LONG_INSN_SIZE 4 /* Size of long instructions. */
1603 /* Return the bytes needed to compute the frame pointer from the current
1606 SIZE is the size needed for local variables. */
1609 m32r_compute_frame_size (int size) /* # of var. bytes allocated. */
1612 unsigned int total_size, var_size, args_size, pretend_size, extra_size;
1613 unsigned int reg_size, frame_size;
1615 enum m32r_function_type fn_type;
1617 int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table);
1619 var_size = M32R_STACK_ALIGN (size);
1620 args_size = M32R_STACK_ALIGN (current_function_outgoing_args_size);
1621 pretend_size = current_function_pretend_args_size;
1622 extra_size = FIRST_PARM_OFFSET (0);
1623 total_size = extra_size + pretend_size + args_size + var_size;
1627 /* See if this is an interrupt handler. Call used registers must be saved
1629 fn_type = m32r_compute_function_type (current_function_decl);
1630 interrupt_p = M32R_INTERRUPT_P (fn_type);
1632 /* Calculate space needed for registers. */
1633 for (regno = 0; regno < M32R_MAX_INT_REGS; regno++)
1635 if (MUST_SAVE_REGISTER (regno, interrupt_p)
1636 || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
1638 reg_size += UNITS_PER_WORD;
1639 gmask |= 1 << regno;
1643 current_frame_info.save_fp = MUST_SAVE_FRAME_POINTER;
1644 current_frame_info.save_lr = MUST_SAVE_RETURN_ADDR || pic_reg_used;
1646 reg_size += ((current_frame_info.save_fp + current_frame_info.save_lr)
1648 total_size += reg_size;
1650 /* ??? Not sure this is necessary, and I don't think the epilogue
1651 handler will do the right thing if this changes total_size. */
1652 total_size = M32R_STACK_ALIGN (total_size);
1654 frame_size = total_size - (pretend_size + reg_size);
1656 /* Save computed information. */
1657 current_frame_info.total_size = total_size;
1658 current_frame_info.extra_size = extra_size;
1659 current_frame_info.pretend_size = pretend_size;
1660 current_frame_info.var_size = var_size;
1661 current_frame_info.args_size = args_size;
1662 current_frame_info.reg_size = reg_size;
1663 current_frame_info.gmask = gmask;
1664 current_frame_info.initialized = reload_completed;
1666 /* Ok, we're done. */
1670 /* The table we use to reference PIC data. */
1671 static rtx global_offset_table;
1674 m32r_reload_lr (rtx sp, int size)
1676 rtx lr = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
1679 emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode, sp)));
1680 else if (size <= 32768)
1681 emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode,
1682 gen_rtx_PLUS (Pmode, sp,
1686 rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1688 emit_insn (gen_movsi (tmp, GEN_INT (size)));
1689 emit_insn (gen_addsi3 (tmp, tmp, sp));
1690 emit_insn (gen_movsi (lr, gen_rtx_MEM (Pmode, tmp)));
1693 emit_insn (gen_rtx_USE (VOIDmode, lr));
1697 m32r_load_pic_register (void)
1699 global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
1700 emit_insn (gen_get_pc (pic_offset_table_rtx, global_offset_table,
1701 GEN_INT (TARGET_MODEL_SMALL)));
1703 /* Need to emit this whether or not we obey regdecls,
1704 since setjmp/longjmp can cause life info to screw up. */
1705 emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
1708 /* Expand the m32r prologue as a series of insns. */
1711 m32r_expand_prologue (void)
1716 int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table);
1718 if (! current_frame_info.initialized)
1719 m32r_compute_frame_size (get_frame_size ());
1721 gmask = current_frame_info.gmask;
1723 /* These cases shouldn't happen. Catch them now. */
1724 if (current_frame_info.total_size == 0 && gmask)
1727 /* Allocate space for register arguments if this is a variadic function. */
1728 if (current_frame_info.pretend_size != 0)
1730 /* Use a HOST_WIDE_INT temporary, since negating an unsigned int gives
1731 the wrong result on a 64-bit host. */
1732 HOST_WIDE_INT pretend_size = current_frame_info.pretend_size;
1733 emit_insn (gen_addsi3 (stack_pointer_rtx,
1735 GEN_INT (-pretend_size)));
1738 /* Save any registers we need to and set up fp. */
1739 if (current_frame_info.save_fp)
1740 emit_insn (gen_movsi_push (stack_pointer_rtx, frame_pointer_rtx));
1742 gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
1744 /* Save any needed call-saved regs (and call-used if this is an
1745 interrupt handler). */
1746 for (regno = 0; regno <= M32R_MAX_INT_REGS; ++regno)
1748 if ((gmask & (1 << regno)) != 0)
1749 emit_insn (gen_movsi_push (stack_pointer_rtx,
1750 gen_rtx_REG (Pmode, regno)));
1753 if (current_frame_info.save_lr)
1754 emit_insn (gen_movsi_push (stack_pointer_rtx,
1755 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
1757 /* Allocate the stack frame. */
1758 frame_size = (current_frame_info.total_size
1759 - (current_frame_info.pretend_size
1760 + current_frame_info.reg_size));
1762 if (frame_size == 0)
1763 ; /* Nothing to do. */
1764 else if (frame_size <= 32768)
1765 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1766 GEN_INT (-frame_size)));
1769 rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1771 emit_insn (gen_movsi (tmp, GEN_INT (frame_size)));
1772 emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, tmp));
1775 if (frame_pointer_needed)
1776 emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx));
1778 if (current_function_profile)
1779 /* Push lr for mcount (form_pc, x). */
1780 emit_insn (gen_movsi_push (stack_pointer_rtx,
1781 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
1785 m32r_load_pic_register ();
1786 m32r_reload_lr (stack_pointer_rtx,
1787 (current_function_profile ? 0 : frame_size));
1790 if (current_function_profile && !pic_reg_used)
1791 emit_insn (gen_blockage ());
1795 /* Set up the stack and frame pointer (if desired) for the function.
1796 Note, if this is changed, you need to mirror the changes in
1797 m32r_compute_frame_size which calculates the prolog size. */
1800 m32r_output_function_prologue (FILE * file, HOST_WIDE_INT size)
1802 enum m32r_function_type fn_type = m32r_compute_function_type (current_function_decl);
1804 /* If this is an interrupt handler, mark it as such. */
1805 if (M32R_INTERRUPT_P (fn_type))
1806 fprintf (file, "\t%s interrupt handler\n", ASM_COMMENT_START);
1808 if (! current_frame_info.initialized)
1809 m32r_compute_frame_size (size);
1811 /* This is only for the human reader. */
1813 "\t%s PROLOGUE, vars= %d, regs= %d, args= %d, extra= %d\n",
1815 current_frame_info.var_size,
1816 current_frame_info.reg_size / 4,
1817 current_frame_info.args_size,
1818 current_frame_info.extra_size);
1821 /* Do any necessary cleanup after a function to restore stack, frame,
1825 m32r_output_function_epilogue (FILE * file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1828 int noepilogue = FALSE;
1830 enum m32r_function_type fn_type = m32r_compute_function_type (current_function_decl);
1832 /* This is only for the human reader. */
1833 fprintf (file, "\t%s EPILOGUE\n", ASM_COMMENT_START);
1835 if (!current_frame_info.initialized)
1837 total_size = current_frame_info.total_size;
1839 if (total_size == 0)
1841 rtx insn = get_last_insn ();
1843 /* If the last insn was a BARRIER, we don't have to write any code
1844 because a jump (aka return) was put there. */
1845 if (GET_CODE (insn) == NOTE)
1846 insn = prev_nonnote_insn (insn);
1847 if (insn && GET_CODE (insn) == BARRIER)
1853 unsigned int var_size = current_frame_info.var_size;
1854 unsigned int args_size = current_frame_info.args_size;
1855 unsigned int gmask = current_frame_info.gmask;
1856 int can_trust_sp_p = !current_function_calls_alloca;
1857 const char * sp_str = reg_names[STACK_POINTER_REGNUM];
1858 const char * fp_str = reg_names[FRAME_POINTER_REGNUM];
1860 /* The first thing to do is point the sp at the bottom of the register
1864 unsigned int reg_offset = var_size + args_size;
1865 if (reg_offset == 0)
1866 ; /* Nothing to do. */
1867 else if (reg_offset < 128)
1868 fprintf (file, "\taddi %s,%s%d\n",
1869 sp_str, IMMEDIATE_PREFIX, reg_offset);
1870 else if (reg_offset < 32768)
1871 fprintf (file, "\tadd3 %s,%s,%s%d\n",
1872 sp_str, sp_str, IMMEDIATE_PREFIX, reg_offset);
1874 fprintf (file, "\tld24 %s,%s%d\n\tadd %s,%s\n",
1875 reg_names[PROLOGUE_TMP_REGNUM],
1876 IMMEDIATE_PREFIX, reg_offset,
1877 sp_str, reg_names[PROLOGUE_TMP_REGNUM]);
1879 else if (frame_pointer_needed)
1881 unsigned int reg_offset = var_size + args_size;
1883 if (reg_offset == 0)
1884 fprintf (file, "\tmv %s,%s\n", sp_str, fp_str);
1885 else if (reg_offset < 32768)
1886 fprintf (file, "\tadd3 %s,%s,%s%d\n",
1887 sp_str, fp_str, IMMEDIATE_PREFIX, reg_offset);
1889 fprintf (file, "\tld24 %s,%s%d\n\tadd %s,%s\n",
1890 reg_names[PROLOGUE_TMP_REGNUM],
1891 IMMEDIATE_PREFIX, reg_offset,
1892 sp_str, reg_names[PROLOGUE_TMP_REGNUM]);
1897 if (current_frame_info.save_lr)
1898 fprintf (file, "\tpop %s\n", reg_names[RETURN_ADDR_REGNUM]);
1900 /* Restore any saved registers, in reverse order of course. */
1901 gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
1902 for (regno = M32R_MAX_INT_REGS - 1; regno >= 0; --regno)
1904 if ((gmask & (1L << regno)) != 0)
1905 fprintf (file, "\tpop %s\n", reg_names[regno]);
1908 if (current_frame_info.save_fp)
1909 fprintf (file, "\tpop %s\n", fp_str);
1911 /* Remove varargs area if present. */
1912 if (current_frame_info.pretend_size != 0)
1913 fprintf (file, "\taddi %s,%s%d\n",
1914 sp_str, IMMEDIATE_PREFIX, current_frame_info.pretend_size);
1916 /* Emit the return instruction. */
1917 if (M32R_INTERRUPT_P (fn_type))
1918 fprintf (file, "\trte\n");
1920 fprintf (file, "\tjmp %s\n", reg_names[RETURN_ADDR_REGNUM]);
1923 /* Reset state info for each function. */
1924 current_frame_info = zero_frame_info;
1925 m32r_compute_function_type (NULL_TREE);
1928 /* Return nonzero if this function is known to have a null or 1 instruction
1932 direct_return (void)
1934 if (!reload_completed)
1937 if (! current_frame_info.initialized)
1938 m32r_compute_frame_size (get_frame_size ());
1940 return current_frame_info.total_size == 0;
1947 m32r_legitimate_pic_operand_p (rtx x)
1949 if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1952 if (GET_CODE (x) == CONST
1953 && GET_CODE (XEXP (x, 0)) == PLUS
1954 && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
1955 || GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF)
1956 && (GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT))
1963 m32r_legitimize_pic_address (rtx orig, rtx reg)
1966 printf("m32r_legitimize_pic_address()\n");
1969 if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
1971 rtx pic_ref, address;
1977 if (reload_in_progress || reload_completed)
1980 reg = gen_reg_rtx (Pmode);
1986 address = gen_reg_rtx (Pmode);
1990 current_function_uses_pic_offset_table = 1;
1992 if (GET_CODE (orig) == LABEL_REF
1993 || (GET_CODE (orig) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (orig)))
1995 emit_insn (gen_gotoff_load_addr (reg, orig));
1996 emit_insn (gen_addsi3 (reg, reg, pic_offset_table_rtx));
2000 emit_insn (gen_pic_load_addr (address, orig));
2002 emit_insn (gen_addsi3 (address, address, pic_offset_table_rtx));
2003 pic_ref = gen_const_mem (Pmode, address);
2004 insn = emit_move_insn (reg, pic_ref);
2006 /* Put a REG_EQUAL note on this insn, so that it can be optimized
2008 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, orig,
2013 else if (GET_CODE (orig) == CONST)
2017 if (GET_CODE (XEXP (orig, 0)) == PLUS
2018 && XEXP (XEXP (orig, 0), 1) == pic_offset_table_rtx)
2023 if (reload_in_progress || reload_completed)
2026 reg = gen_reg_rtx (Pmode);
2029 if (GET_CODE (XEXP (orig, 0)) == PLUS)
2031 base = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
2033 offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), NULL_RTX);
2035 offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), reg);
2040 if (GET_CODE (offset) == CONST_INT)
2042 if (INT16_P (INTVAL (offset)))
2043 return plus_constant (base, INTVAL (offset));
2044 else if (! reload_in_progress && ! reload_completed)
2045 offset = force_reg (Pmode, offset);
2047 /* If we reach here, then something is seriously wrong. */
2051 return gen_rtx_PLUS (Pmode, base, offset);
2057 /* Emit special PIC prologues and epilogues. */
2060 m32r_finalize_pic (void)
2062 current_function_uses_pic_offset_table |= current_function_profile;
2065 /* Nested function support. */
2067 /* Emit RTL insns to initialize the variable parts of a trampoline.
2068 FNADDR is an RTX for the address of the function's pure code.
2069 CXT is an RTX for the static chain value for the function. */
2072 m32r_initialize_trampoline (rtx tramp ATTRIBUTE_UNUSED,
2073 rtx fnaddr ATTRIBUTE_UNUSED,
2074 rtx cxt ATTRIBUTE_UNUSED)
2079 m32r_file_start (void)
2081 default_file_start ();
2083 if (flag_verbose_asm)
2084 fprintf (asm_out_file,
2085 "%s M32R/D special options: -G " HOST_WIDE_INT_PRINT_UNSIGNED "\n",
2086 ASM_COMMENT_START, g_switch_value);
2088 if (TARGET_LITTLE_ENDIAN)
2089 fprintf (asm_out_file, "\t.little\n");
2092 /* Print operand X (an rtx) in assembler syntax to file FILE.
2093 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
2094 For `%' followed by punctuation, CODE is the punctuation and X is null. */
2097 m32r_print_operand (FILE * file, rtx x, int code)
2103 /* The 's' and 'p' codes are used by output_block_move() to
2104 indicate post-increment 's'tores and 'p're-increment loads. */
2106 if (GET_CODE (x) == REG)
2107 fprintf (file, "@+%s", reg_names [REGNO (x)]);
2109 output_operand_lossage ("invalid operand to %%s code");
2113 if (GET_CODE (x) == REG)
2114 fprintf (file, "@%s+", reg_names [REGNO (x)]);
2116 output_operand_lossage ("invalid operand to %%p code");
2120 /* Write second word of DImode or DFmode reference,
2121 register or memory. */
2122 if (GET_CODE (x) == REG)
2123 fputs (reg_names[REGNO (x)+1], file);
2124 else if (GET_CODE (x) == MEM)
2126 fprintf (file, "@(");
2127 /* Handle possible auto-increment. Since it is pre-increment and
2128 we have already done it, we can just use an offset of four. */
2129 /* ??? This is taken from rs6000.c I think. I don't think it is
2130 currently necessary, but keep it around. */
2131 if (GET_CODE (XEXP (x, 0)) == PRE_INC
2132 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
2133 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 4));
2135 output_address (plus_constant (XEXP (x, 0), 4));
2139 output_operand_lossage ("invalid operand to %%R code");
2142 case 'H' : /* High word. */
2143 case 'L' : /* Low word. */
2144 if (GET_CODE (x) == REG)
2146 /* L = least significant word, H = most significant word. */
2147 if ((WORDS_BIG_ENDIAN != 0) ^ (code == 'L'))
2148 fputs (reg_names[REGNO (x)], file);
2150 fputs (reg_names[REGNO (x)+1], file);
2152 else if (GET_CODE (x) == CONST_INT
2153 || GET_CODE (x) == CONST_DOUBLE)
2157 split_double (x, &first, &second);
2158 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
2159 code == 'L' ? INTVAL (first) : INTVAL (second));
2162 output_operand_lossage ("invalid operand to %%H/%%L code");
2169 if (GET_CODE (x) != CONST_DOUBLE
2170 || GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT)
2171 fatal_insn ("bad insn for 'A'", x);
2173 real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (x), sizeof (str), 0, 1);
2174 fprintf (file, "%s", str);
2178 case 'B' : /* Bottom half. */
2179 case 'T' : /* Top half. */
2180 /* Output the argument to a `seth' insn (sets the Top half-word).
2181 For constants output arguments to a seth/or3 pair to set Top and
2182 Bottom halves. For symbols output arguments to a seth/add3 pair to
2183 set Top and Bottom halves. The difference exists because for
2184 constants seth/or3 is more readable but for symbols we need to use
2185 the same scheme as `ld' and `st' insns (16 bit addend is signed). */
2186 switch (GET_CODE (x))
2193 split_double (x, &first, &second);
2194 x = WORDS_BIG_ENDIAN ? second : first;
2195 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
2197 ? INTVAL (x) & 0xffff
2198 : (INTVAL (x) >> 16) & 0xffff));
2204 && small_data_operand (x, VOIDmode))
2206 fputs ("sda(", file);
2207 output_addr_const (file, x);
2213 fputs (code == 'T' ? "shigh(" : "low(", file);
2214 output_addr_const (file, x);
2218 output_operand_lossage ("invalid operand to %%T/%%B code");
2225 /* Output a load/store with update indicator if appropriate. */
2226 if (GET_CODE (x) == MEM)
2228 if (GET_CODE (XEXP (x, 0)) == PRE_INC
2229 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
2233 output_operand_lossage ("invalid operand to %%U code");
2237 /* Print a constant value negated. */
2238 if (GET_CODE (x) == CONST_INT)
2239 output_addr_const (file, GEN_INT (- INTVAL (x)));
2241 output_operand_lossage ("invalid operand to %%N code");
2245 /* Print a const_int in hex. Used in comments. */
2246 if (GET_CODE (x) == CONST_INT)
2247 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
2251 fputs (IMMEDIATE_PREFIX, file);
2255 /* Do nothing special. */
2260 output_operand_lossage ("invalid operand output code");
2263 switch (GET_CODE (x))
2266 fputs (reg_names[REGNO (x)], file);
2271 if (GET_CODE (addr) == PRE_INC)
2273 if (GET_CODE (XEXP (addr, 0)) != REG)
2274 fatal_insn ("pre-increment address is not a register", x);
2276 fprintf (file, "@+%s", reg_names[REGNO (XEXP (addr, 0))]);
2278 else if (GET_CODE (addr) == PRE_DEC)
2280 if (GET_CODE (XEXP (addr, 0)) != REG)
2281 fatal_insn ("pre-decrement address is not a register", x);
2283 fprintf (file, "@-%s", reg_names[REGNO (XEXP (addr, 0))]);
2285 else if (GET_CODE (addr) == POST_INC)
2287 if (GET_CODE (XEXP (addr, 0)) != REG)
2288 fatal_insn ("post-increment address is not a register", x);
2290 fprintf (file, "@%s+", reg_names[REGNO (XEXP (addr, 0))]);
2295 output_address (XEXP (x, 0));
2301 /* We handle SFmode constants here as output_addr_const doesn't. */
2302 if (GET_MODE (x) == SFmode)
2307 REAL_VALUE_FROM_CONST_DOUBLE (d, x);
2308 REAL_VALUE_TO_TARGET_SINGLE (d, l);
2309 fprintf (file, "0x%08lx", l);
2313 /* Fall through. Let output_addr_const deal with it. */
2316 output_addr_const (file, x);
2321 /* Print a memory address as an operand to reference that memory location. */
2324 m32r_print_operand_address (FILE * file, rtx addr)
2330 switch (GET_CODE (addr))
2333 fputs (reg_names[REGNO (addr)], file);
2337 if (GET_CODE (XEXP (addr, 0)) == CONST_INT)
2338 offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
2339 else if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
2340 offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
2342 base = XEXP (addr, 0), index = XEXP (addr, 1);
2343 if (GET_CODE (base) == REG)
2345 /* Print the offset first (if present) to conform to the manual. */
2349 fprintf (file, "%d,", offset);
2350 fputs (reg_names[REGNO (base)], file);
2352 /* The chip doesn't support this, but left in for generality. */
2353 else if (GET_CODE (index) == REG)
2354 fprintf (file, "%s,%s",
2355 reg_names[REGNO (base)], reg_names[REGNO (index)]);
2356 /* Not sure this can happen, but leave in for now. */
2357 else if (GET_CODE (index) == SYMBOL_REF)
2359 output_addr_const (file, index);
2361 fputs (reg_names[REGNO (base)], file);
2364 fatal_insn ("bad address", addr);
2366 else if (GET_CODE (base) == LO_SUM)
2369 || GET_CODE (XEXP (base, 0)) != REG)
2371 if (small_data_operand (XEXP (base, 1), VOIDmode))
2372 fputs ("sda(", file);
2374 fputs ("low(", file);
2375 output_addr_const (file, plus_constant (XEXP (base, 1), offset));
2377 fputs (reg_names[REGNO (XEXP (base, 0))], file);
2380 fatal_insn ("bad address", addr);
2384 if (GET_CODE (XEXP (addr, 0)) != REG)
2385 fatal_insn ("lo_sum not of register", addr);
2386 if (small_data_operand (XEXP (addr, 1), VOIDmode))
2387 fputs ("sda(", file);
2389 fputs ("low(", file);
2390 output_addr_const (file, XEXP (addr, 1));
2392 fputs (reg_names[REGNO (XEXP (addr, 0))], file);
2395 case PRE_INC : /* Assume SImode. */
2396 fprintf (file, "+%s", reg_names[REGNO (XEXP (addr, 0))]);
2399 case PRE_DEC : /* Assume SImode. */
2400 fprintf (file, "-%s", reg_names[REGNO (XEXP (addr, 0))]);
2403 case POST_INC : /* Assume SImode. */
2404 fprintf (file, "%s+", reg_names[REGNO (XEXP (addr, 0))]);
2408 output_addr_const (file, addr);
2413 /* Return true if the operands are the constants 0 and 1. */
2416 zero_and_one (rtx operand1, rtx operand2)
2419 GET_CODE (operand1) == CONST_INT
2420 && GET_CODE (operand2) == CONST_INT
2421 && ( ((INTVAL (operand1) == 0) && (INTVAL (operand2) == 1))
2422 ||((INTVAL (operand1) == 1) && (INTVAL (operand2) == 0)));
2425 /* Return nonzero if the operand is suitable for use in a conditional move sequence. */
2428 conditional_move_operand (rtx operand, enum machine_mode mode)
2430 /* Only defined for simple integers so far... */
2431 if (mode != SImode && mode != HImode && mode != QImode)
2434 /* At the moment we can handle moving registers and loading constants. */
2435 /* To be added: Addition/subtraction/bitops/multiplication of registers. */
2437 switch (GET_CODE (operand))
2443 return INT8_P (INTVAL (operand));
2447 fprintf (stderr, "Test for cond move op of type: %s\n",
2448 GET_RTX_NAME (GET_CODE (operand)));
2454 /* Return true if the code is a test of the carry bit. */
2457 carry_compare_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2461 if (GET_MODE (op) != CCmode && GET_MODE (op) != VOIDmode)
2464 if (GET_CODE (op) != NE && GET_CODE (op) != EQ)
2468 if (GET_CODE (x) != REG || REGNO (x) != CARRY_REGNUM)
2472 if (GET_CODE (x) != CONST_INT || INTVAL (x) != 0)
2478 /* Generate the correct assembler code to handle the conditional loading of a
2479 value into a register. It is known that the operands satisfy the
2480 conditional_move_operand() function above. The destination is operand[0].
2481 The condition is operand [1]. The 'true' value is operand [2] and the
2482 'false' value is operand [3]. */
2485 emit_cond_move (rtx * operands, rtx insn ATTRIBUTE_UNUSED)
2487 static char buffer [100];
2488 const char * dest = reg_names [REGNO (operands [0])];
2492 /* Destination must be a register. */
2493 if (GET_CODE (operands [0]) != REG)
2495 if (! conditional_move_operand (operands [2], SImode))
2497 if (! conditional_move_operand (operands [3], SImode))
2500 /* Check to see if the test is reversed. */
2501 if (GET_CODE (operands [1]) == NE)
2503 rtx tmp = operands [2];
2504 operands [2] = operands [3];
2508 sprintf (buffer, "mvfc %s, cbr", dest);
2510 /* If the true value was '0' then we need to invert the results of the move. */
2511 if (INTVAL (operands [2]) == 0)
2512 sprintf (buffer + strlen (buffer), "\n\txor3 %s, %s, #1",
2518 /* Returns true if the registers contained in the two
2519 rtl expressions are different. */
2522 m32r_not_same_reg (rtx a, rtx b)
2527 while (GET_CODE (a) == SUBREG)
2530 if (GET_CODE (a) == REG)
2533 while (GET_CODE (b) == SUBREG)
2536 if (GET_CODE (b) == REG)
2539 return reg_a != reg_b;
2544 m32r_function_symbol (const char *name)
2546 int extra_flags = 0;
2547 enum m32r_model model;
2548 rtx sym = gen_rtx_SYMBOL_REF (Pmode, name);
2550 if (TARGET_MODEL_SMALL)
2551 model = M32R_MODEL_SMALL;
2552 else if (TARGET_MODEL_MEDIUM)
2553 model = M32R_MODEL_MEDIUM;
2554 else if (TARGET_MODEL_LARGE)
2555 model = M32R_MODEL_LARGE;
2557 abort (); /* Shouldn't happen. */
2558 extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
2561 SYMBOL_REF_FLAGS (sym) |= extra_flags;
2566 /* Use a library function to move some bytes. */
2569 block_move_call (rtx dest_reg, rtx src_reg, rtx bytes_rtx)
2571 /* We want to pass the size as Pmode, which will normally be SImode
2572 but will be DImode if we are using 64 bit longs and pointers. */
2573 if (GET_MODE (bytes_rtx) != VOIDmode
2574 && GET_MODE (bytes_rtx) != Pmode)
2575 bytes_rtx = convert_to_mode (Pmode, bytes_rtx, 1);
2577 emit_library_call (m32r_function_symbol ("memcpy"), 0,
2578 VOIDmode, 3, dest_reg, Pmode, src_reg, Pmode,
2579 convert_to_mode (TYPE_MODE (sizetype), bytes_rtx,
2580 TYPE_UNSIGNED (sizetype)),
2581 TYPE_MODE (sizetype));
2584 /* The maximum number of bytes to copy using pairs of load/store instructions.
2585 If a block is larger than this then a loop will be generated to copy
2586 MAX_MOVE_BYTES chunks at a time. The value of 32 is a semi-arbitrary choice.
2587 A customer uses Dhrystome as their benchmark, and Dhrystone has a 31 byte
2588 string copy in it. */
2589 #define MAX_MOVE_BYTES 32
2591 /* Expand string/block move operations.
2593 operands[0] is the pointer to the destination.
2594 operands[1] is the pointer to the source.
2595 operands[2] is the number of bytes to move.
2596 operands[3] is the alignment. */
2599 m32r_expand_block_move (rtx operands[])
2601 rtx orig_dst = operands[0];
2602 rtx orig_src = operands[1];
2603 rtx bytes_rtx = operands[2];
2604 rtx align_rtx = operands[3];
2605 int constp = GET_CODE (bytes_rtx) == CONST_INT;
2606 HOST_WIDE_INT bytes = constp ? INTVAL (bytes_rtx) : 0;
2607 int align = INTVAL (align_rtx);
2612 if (constp && bytes <= 0)
2615 /* Move the address into scratch registers. */
2616 dst_reg = copy_addr_to_reg (XEXP (orig_dst, 0));
2617 src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
2619 if (align > UNITS_PER_WORD)
2620 align = UNITS_PER_WORD;
2622 /* If we prefer size over speed, always use a function call.
2623 If we do not know the size, use a function call.
2624 If the blocks are not word aligned, use a function call. */
2625 if (optimize_size || ! constp || align != UNITS_PER_WORD)
2627 block_move_call (dst_reg, src_reg, bytes_rtx);
2631 leftover = bytes % MAX_MOVE_BYTES;
2634 /* If necessary, generate a loop to handle the bulk of the copy. */
2637 rtx label = NULL_RTX;
2638 rtx final_src = NULL_RTX;
2639 rtx at_a_time = GEN_INT (MAX_MOVE_BYTES);
2640 rtx rounded_total = GEN_INT (bytes);
2641 rtx new_dst_reg = gen_reg_rtx (SImode);
2642 rtx new_src_reg = gen_reg_rtx (SImode);
2644 /* If we are going to have to perform this loop more than
2645 once, then generate a label and compute the address the
2646 source register will contain upon completion of the final
2648 if (bytes > MAX_MOVE_BYTES)
2650 final_src = gen_reg_rtx (Pmode);
2653 emit_insn (gen_addsi3 (final_src, src_reg, rounded_total));
2656 emit_insn (gen_movsi (final_src, rounded_total));
2657 emit_insn (gen_addsi3 (final_src, final_src, src_reg));
2660 label = gen_label_rtx ();
2664 /* It is known that output_block_move() will update src_reg to point
2665 to the word after the end of the source block, and dst_reg to point
2666 to the last word of the destination block, provided that the block
2667 is MAX_MOVE_BYTES long. */
2668 emit_insn (gen_movmemsi_internal (dst_reg, src_reg, at_a_time,
2669 new_dst_reg, new_src_reg));
2670 emit_move_insn (dst_reg, new_dst_reg);
2671 emit_move_insn (src_reg, new_src_reg);
2672 emit_insn (gen_addsi3 (dst_reg, dst_reg, GEN_INT (4)));
2674 if (bytes > MAX_MOVE_BYTES)
2676 emit_insn (gen_cmpsi (src_reg, final_src));
2677 emit_jump_insn (gen_bne (label));
2682 emit_insn (gen_movmemsi_internal (dst_reg, src_reg, GEN_INT (leftover),
2683 gen_reg_rtx (SImode),
2684 gen_reg_rtx (SImode)));
2688 /* Emit load/stores for a small constant word aligned block_move.
2690 operands[0] is the memory address of the destination.
2691 operands[1] is the memory address of the source.
2692 operands[2] is the number of bytes to move.
2693 operands[3] is a temp register.
2694 operands[4] is a temp register. */
2697 m32r_output_block_move (rtx insn ATTRIBUTE_UNUSED, rtx operands[])
2699 HOST_WIDE_INT bytes = INTVAL (operands[2]);
2703 if (bytes < 1 || bytes > MAX_MOVE_BYTES)
2706 /* We do not have a post-increment store available, so the first set of
2707 stores are done without any increment, then the remaining ones can use
2708 the pre-increment addressing mode.
2710 Note: expand_block_move() also relies upon this behavior when building
2711 loops to copy large blocks. */
2720 output_asm_insn ("ld\t%5, %p1", operands);
2721 output_asm_insn ("ld\t%6, %p1", operands);
2722 output_asm_insn ("st\t%5, @%0", operands);
2723 output_asm_insn ("st\t%6, %s0", operands);
2727 output_asm_insn ("ld\t%5, %p1", operands);
2728 output_asm_insn ("ld\t%6, %p1", operands);
2729 output_asm_insn ("st\t%5, %s0", operands);
2730 output_asm_insn ("st\t%6, %s0", operands);
2735 else if (bytes >= 4)
2740 output_asm_insn ("ld\t%5, %p1", operands);
2743 output_asm_insn ("ld\t%6, %p1", operands);
2746 output_asm_insn ("st\t%5, @%0", operands);
2748 output_asm_insn ("st\t%5, %s0", operands);
2754 /* Get the entire next word, even though we do not want all of it.
2755 The saves us from doing several smaller loads, and we assume that
2756 we cannot cause a page fault when at least part of the word is in
2757 valid memory [since we don't get called if things aren't properly
2759 int dst_offset = first_time ? 0 : 4;
2760 /* The amount of increment we have to make to the
2761 destination pointer. */
2762 int dst_inc_amount = dst_offset + bytes - 4;
2763 /* The same for the source pointer. */
2764 int src_inc_amount = bytes;
2768 /* If got_extra is true then we have already loaded
2769 the next word as part of loading and storing the previous word. */
2771 output_asm_insn ("ld\t%6, @%1", operands);
2777 output_asm_insn ("sra3\t%5, %6, #16", operands);
2778 my_operands[0] = operands[5];
2779 my_operands[1] = GEN_INT (dst_offset);
2780 my_operands[2] = operands[0];
2781 output_asm_insn ("sth\t%0, @(%1,%2)", my_operands);
2783 /* If there is a byte left to store then increment the
2784 destination address and shift the contents of the source
2785 register down by 8 bits. We could not do the address
2786 increment in the store half word instruction, because it does
2787 not have an auto increment mode. */
2788 if (bytes > 0) /* assert (bytes == 1) */
2799 my_operands[0] = operands[6];
2800 my_operands[1] = GEN_INT (last_shift);
2801 output_asm_insn ("srai\t%0, #%1", my_operands);
2802 my_operands[0] = operands[6];
2803 my_operands[1] = GEN_INT (dst_offset);
2804 my_operands[2] = operands[0];
2805 output_asm_insn ("stb\t%0, @(%1,%2)", my_operands);
2808 /* Update the destination pointer if needed. We have to do
2809 this so that the patterns matches what we output in this
2812 && !find_reg_note (insn, REG_UNUSED, operands[0]))
2814 my_operands[0] = operands[0];
2815 my_operands[1] = GEN_INT (dst_inc_amount);
2816 output_asm_insn ("addi\t%0, #%1", my_operands);
2819 /* Update the source pointer if needed. We have to do this
2820 so that the patterns matches what we output in this
2823 && !find_reg_note (insn, REG_UNUSED, operands[1]))
2825 my_operands[0] = operands[1];
2826 my_operands[1] = GEN_INT (src_inc_amount);
2827 output_asm_insn ("addi\t%0, #%1", my_operands);
2837 /* Return true if op is an integer constant, less than or equal to
2841 m32r_block_immediate_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2843 if (GET_CODE (op) != CONST_INT
2844 || INTVAL (op) > MAX_MOVE_BYTES
2845 || INTVAL (op) <= 0)
2851 /* Return true if using NEW_REG in place of OLD_REG is ok. */
2854 m32r_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
2855 unsigned int new_reg)
2857 /* Interrupt routines can't clobber any register that isn't already used. */
2858 if (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl))
2859 && !regs_ever_live[new_reg])
2862 /* We currently emit epilogues as text, not rtl, so the liveness
2863 of the return address register isn't visible. */
2864 if (current_function_is_leaf && new_reg == RETURN_ADDR_REGNUM)
2871 m32r_return_addr (int count)
2876 return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);