Home | History | Annotate | Line # | Download | only in m32r
      1  1.1  mrg /* Subroutines used for code generation on the Renesas M32R cpu.
      2  1.1  mrg    Copyright (C) 1996-2022 Free Software Foundation, Inc.
      3  1.1  mrg 
      4  1.1  mrg    This file is part of GCC.
      5  1.1  mrg 
      6  1.1  mrg    GCC is free software; you can redistribute it and/or modify it
      7  1.1  mrg    under the terms of the GNU General Public License as published
      8  1.1  mrg    by the Free Software Foundation; either version 3, or (at your
      9  1.1  mrg    option) any later version.
     10  1.1  mrg 
     11  1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT
     12  1.1  mrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     13  1.1  mrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     14  1.1  mrg    License for more details.
     15  1.1  mrg 
     16  1.1  mrg    You should have received a copy of the GNU General Public License
     17  1.1  mrg    along with GCC; see the file COPYING3.  If not see
     18  1.1  mrg    <http://www.gnu.org/licenses/>.  */
     19  1.1  mrg 
     20  1.1  mrg #define IN_TARGET_CODE 1
     21  1.1  mrg 
     22  1.1  mrg #include "config.h"
     23  1.1  mrg #include "system.h"
     24  1.1  mrg #include "coretypes.h"
     25  1.1  mrg #include "backend.h"
     26  1.1  mrg #include "target.h"
     27  1.1  mrg #include "rtl.h"
     28  1.1  mrg #include "tree.h"
     29  1.1  mrg #include "df.h"
     30  1.1  mrg #include "memmodel.h"
     31  1.1  mrg #include "tm_p.h"
     32  1.1  mrg #include "stringpool.h"
     33  1.1  mrg #include "attribs.h"
     34  1.1  mrg #include "insn-config.h"
     35  1.1  mrg #include "emit-rtl.h"
     36  1.1  mrg #include "recog.h"
     37  1.1  mrg #include "diagnostic-core.h"
     38  1.1  mrg #include "alias.h"
     39  1.1  mrg #include "stor-layout.h"
     40  1.1  mrg #include "varasm.h"
     41  1.1  mrg #include "calls.h"
     42  1.1  mrg #include "output.h"
     43  1.1  mrg #include "insn-attr.h"
     44  1.1  mrg #include "explow.h"
     45  1.1  mrg #include "expr.h"
     46  1.1  mrg #include "tm-constrs.h"
     47  1.1  mrg #include "builtins.h"
     48  1.1  mrg #include "opts.h"
     49  1.1  mrg 
     50  1.1  mrg /* This file should be included last.  */
     51  1.1  mrg #include "target-def.h"
     52  1.1  mrg 
     53  1.1  mrg /* Array of valid operand punctuation characters.  */
     54  1.1  mrg static char m32r_punct_chars[256];
     55  1.1  mrg 
     56  1.1  mrg /* Machine-specific symbol_ref flags.  */
     57  1.1  mrg #define SYMBOL_FLAG_MODEL_SHIFT		SYMBOL_FLAG_MACH_DEP_SHIFT
     58  1.1  mrg #define SYMBOL_REF_MODEL(X) \
     59  1.1  mrg   ((enum m32r_model) ((SYMBOL_REF_FLAGS (X) >> SYMBOL_FLAG_MODEL_SHIFT) & 3))
     60  1.1  mrg 
     61  1.1  mrg /* For string literals, etc.  */
     62  1.1  mrg #define LIT_NAME_P(NAME) ((NAME)[0] == '*' && (NAME)[1] == '.')
     63  1.1  mrg 
     64  1.1  mrg /* Forward declaration.  */
     65  1.1  mrg static void  m32r_option_override (void);
     66  1.1  mrg static void  init_reg_tables (void);
     67  1.1  mrg static void  block_move_call (rtx, rtx, rtx);
     68  1.1  mrg static int   m32r_is_insn (rtx);
     69  1.1  mrg static bool  m32r_legitimate_address_p (machine_mode, rtx, bool);
     70  1.1  mrg static rtx   m32r_legitimize_address (rtx, rtx, machine_mode);
     71  1.1  mrg static bool  m32r_mode_dependent_address_p (const_rtx, addr_space_t);
     72  1.1  mrg static tree  m32r_handle_model_attribute (tree *, tree, tree, int, bool *);
     73  1.1  mrg static void  m32r_print_operand (FILE *, rtx, int);
     74  1.1  mrg static void  m32r_print_operand_address (FILE *, machine_mode, rtx);
     75  1.1  mrg static bool  m32r_print_operand_punct_valid_p (unsigned char code);
     76  1.1  mrg static void  m32r_output_function_prologue (FILE *);
     77  1.1  mrg static void  m32r_output_function_epilogue (FILE *);
     78  1.1  mrg 
     79  1.1  mrg static void  m32r_file_start (void);
     80  1.1  mrg 
     81  1.1  mrg static int    m32r_adjust_priority (rtx_insn *, int);
     82  1.1  mrg static int    m32r_issue_rate (void);
     83  1.1  mrg 
     84  1.1  mrg static void m32r_encode_section_info (tree, rtx, int);
     85  1.1  mrg static bool m32r_in_small_data_p (const_tree);
     86  1.1  mrg static bool m32r_return_in_memory (const_tree, const_tree);
     87  1.1  mrg static rtx m32r_function_value (const_tree, const_tree, bool);
     88  1.1  mrg static rtx m32r_libcall_value (machine_mode, const_rtx);
     89  1.1  mrg static bool m32r_function_value_regno_p (const unsigned int);
     90  1.1  mrg static void m32r_setup_incoming_varargs (cumulative_args_t,
     91  1.1  mrg 					 const function_arg_info &,
     92  1.1  mrg 					 int *, int);
     93  1.1  mrg static void init_idents (void);
     94  1.1  mrg static bool m32r_rtx_costs (rtx, machine_mode, int, int, int *, bool speed);
     95  1.1  mrg static int m32r_memory_move_cost (machine_mode, reg_class_t, bool);
     96  1.1  mrg static bool m32r_pass_by_reference (cumulative_args_t,
     97  1.1  mrg 				    const function_arg_info &arg);
     98  1.1  mrg static int m32r_arg_partial_bytes (cumulative_args_t,
     99  1.1  mrg 				   const function_arg_info &);
    100  1.1  mrg static rtx m32r_function_arg (cumulative_args_t, const function_arg_info &);
    101  1.1  mrg static void m32r_function_arg_advance (cumulative_args_t,
    102  1.1  mrg 				       const function_arg_info &);
    103  1.1  mrg static bool m32r_can_eliminate (const int, const int);
    104  1.1  mrg static void m32r_conditional_register_usage (void);
    105  1.1  mrg static void m32r_trampoline_init (rtx, tree, rtx);
    106  1.1  mrg static bool m32r_legitimate_constant_p (machine_mode, rtx);
    107  1.1  mrg static bool m32r_attribute_identifier (const_tree);
    108  1.1  mrg static bool m32r_hard_regno_mode_ok (unsigned int, machine_mode);
    109  1.1  mrg static bool m32r_modes_tieable_p (machine_mode, machine_mode);
    110  1.1  mrg static HOST_WIDE_INT m32r_starting_frame_offset (void);
    111  1.1  mrg 
    112  1.1  mrg /* M32R specific attributes.  */
    114  1.1  mrg 
    115  1.1  mrg static const struct attribute_spec m32r_attribute_table[] =
    116  1.1  mrg {
    117  1.1  mrg   /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
    118  1.1  mrg        affects_type_identity, handler, exclude } */
    119  1.1  mrg   { "interrupt", 0, 0, true,  false, false, false, NULL, NULL },
    120  1.1  mrg   { "model",     1, 1, true,  false, false, false, m32r_handle_model_attribute,
    121  1.1  mrg     NULL },
    122  1.1  mrg   { NULL,        0, 0, false, false, false, false, NULL, NULL }
    123  1.1  mrg };
    124  1.1  mrg 
    125  1.1  mrg /* Initialize the GCC target structure.  */
    127  1.1  mrg #undef  TARGET_ATTRIBUTE_TABLE
    128  1.1  mrg #define TARGET_ATTRIBUTE_TABLE m32r_attribute_table
    129  1.1  mrg #undef  TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
    130  1.1  mrg #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P m32r_attribute_identifier
    131  1.1  mrg 
    132  1.1  mrg #undef TARGET_LRA_P
    133  1.1  mrg #define TARGET_LRA_P hook_bool_void_false
    134  1.1  mrg 
    135  1.1  mrg #undef TARGET_LEGITIMATE_ADDRESS_P
    136  1.1  mrg #define TARGET_LEGITIMATE_ADDRESS_P m32r_legitimate_address_p
    137  1.1  mrg #undef TARGET_LEGITIMIZE_ADDRESS
    138  1.1  mrg #define TARGET_LEGITIMIZE_ADDRESS m32r_legitimize_address
    139  1.1  mrg #undef TARGET_MODE_DEPENDENT_ADDRESS_P
    140  1.1  mrg #define TARGET_MODE_DEPENDENT_ADDRESS_P m32r_mode_dependent_address_p
    141  1.1  mrg 
    142  1.1  mrg #undef  TARGET_ASM_ALIGNED_HI_OP
    143  1.1  mrg #define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
    144  1.1  mrg #undef  TARGET_ASM_ALIGNED_SI_OP
    145  1.1  mrg #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
    146  1.1  mrg 
    147  1.1  mrg #undef  TARGET_PRINT_OPERAND
    148  1.1  mrg #define TARGET_PRINT_OPERAND m32r_print_operand
    149  1.1  mrg #undef  TARGET_PRINT_OPERAND_ADDRESS
    150  1.1  mrg #define TARGET_PRINT_OPERAND_ADDRESS m32r_print_operand_address
    151  1.1  mrg #undef  TARGET_PRINT_OPERAND_PUNCT_VALID_P
    152  1.1  mrg #define TARGET_PRINT_OPERAND_PUNCT_VALID_P m32r_print_operand_punct_valid_p
    153  1.1  mrg 
    154  1.1  mrg #undef  TARGET_ASM_FUNCTION_PROLOGUE
    155  1.1  mrg #define TARGET_ASM_FUNCTION_PROLOGUE m32r_output_function_prologue
    156  1.1  mrg #undef  TARGET_ASM_FUNCTION_EPILOGUE
    157  1.1  mrg #define TARGET_ASM_FUNCTION_EPILOGUE m32r_output_function_epilogue
    158  1.1  mrg 
    159  1.1  mrg #undef  TARGET_ASM_FILE_START
    160  1.1  mrg #define TARGET_ASM_FILE_START m32r_file_start
    161  1.1  mrg 
    162  1.1  mrg #undef  TARGET_SCHED_ADJUST_PRIORITY
    163  1.1  mrg #define TARGET_SCHED_ADJUST_PRIORITY m32r_adjust_priority
    164  1.1  mrg #undef  TARGET_SCHED_ISSUE_RATE
    165  1.1  mrg #define TARGET_SCHED_ISSUE_RATE m32r_issue_rate
    166  1.1  mrg 
    167  1.1  mrg #undef  TARGET_OPTION_OVERRIDE
    168  1.1  mrg #define TARGET_OPTION_OVERRIDE m32r_option_override
    169  1.1  mrg 
    170  1.1  mrg #undef  TARGET_ENCODE_SECTION_INFO
    171  1.1  mrg #define TARGET_ENCODE_SECTION_INFO m32r_encode_section_info
    172  1.1  mrg #undef  TARGET_IN_SMALL_DATA_P
    173  1.1  mrg #define TARGET_IN_SMALL_DATA_P m32r_in_small_data_p
    174  1.1  mrg 
    175  1.1  mrg 
    176  1.1  mrg #undef  TARGET_MEMORY_MOVE_COST
    177  1.1  mrg #define TARGET_MEMORY_MOVE_COST m32r_memory_move_cost
    178  1.1  mrg #undef  TARGET_RTX_COSTS
    179  1.1  mrg #define TARGET_RTX_COSTS m32r_rtx_costs
    180  1.1  mrg #undef  TARGET_ADDRESS_COST
    181  1.1  mrg #define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
    182  1.1  mrg 
    183  1.1  mrg #undef  TARGET_PROMOTE_PROTOTYPES
    184  1.1  mrg #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
    185  1.1  mrg #undef  TARGET_RETURN_IN_MEMORY
    186  1.1  mrg #define TARGET_RETURN_IN_MEMORY m32r_return_in_memory
    187  1.1  mrg 
    188  1.1  mrg #undef TARGET_FUNCTION_VALUE
    189  1.1  mrg #define TARGET_FUNCTION_VALUE m32r_function_value
    190  1.1  mrg #undef TARGET_LIBCALL_VALUE
    191  1.1  mrg #define TARGET_LIBCALL_VALUE m32r_libcall_value
    192  1.1  mrg #undef TARGET_FUNCTION_VALUE_REGNO_P
    193  1.1  mrg #define TARGET_FUNCTION_VALUE_REGNO_P m32r_function_value_regno_p
    194  1.1  mrg 
    195  1.1  mrg #undef  TARGET_SETUP_INCOMING_VARARGS
    196  1.1  mrg #define TARGET_SETUP_INCOMING_VARARGS m32r_setup_incoming_varargs
    197  1.1  mrg #undef  TARGET_MUST_PASS_IN_STACK
    198  1.1  mrg #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
    199  1.1  mrg #undef  TARGET_PASS_BY_REFERENCE
    200  1.1  mrg #define TARGET_PASS_BY_REFERENCE m32r_pass_by_reference
    201  1.1  mrg #undef  TARGET_ARG_PARTIAL_BYTES
    202  1.1  mrg #define TARGET_ARG_PARTIAL_BYTES m32r_arg_partial_bytes
    203  1.1  mrg #undef  TARGET_FUNCTION_ARG
    204  1.1  mrg #define TARGET_FUNCTION_ARG m32r_function_arg
    205  1.1  mrg #undef  TARGET_FUNCTION_ARG_ADVANCE
    206  1.1  mrg #define TARGET_FUNCTION_ARG_ADVANCE m32r_function_arg_advance
    207  1.1  mrg 
    208  1.1  mrg #undef TARGET_CAN_ELIMINATE
    209  1.1  mrg #define TARGET_CAN_ELIMINATE m32r_can_eliminate
    210  1.1  mrg 
    211  1.1  mrg #undef TARGET_CONDITIONAL_REGISTER_USAGE
    212  1.1  mrg #define TARGET_CONDITIONAL_REGISTER_USAGE m32r_conditional_register_usage
    213  1.1  mrg 
    214  1.1  mrg #undef TARGET_TRAMPOLINE_INIT
    215  1.1  mrg #define TARGET_TRAMPOLINE_INIT m32r_trampoline_init
    216  1.1  mrg 
    217  1.1  mrg #undef TARGET_LEGITIMATE_CONSTANT_P
    218  1.1  mrg #define TARGET_LEGITIMATE_CONSTANT_P m32r_legitimate_constant_p
    219  1.1  mrg 
    220  1.1  mrg #undef TARGET_HARD_REGNO_MODE_OK
    221  1.1  mrg #define TARGET_HARD_REGNO_MODE_OK m32r_hard_regno_mode_ok
    222  1.1  mrg 
    223  1.1  mrg #undef TARGET_MODES_TIEABLE_P
    224  1.1  mrg #define TARGET_MODES_TIEABLE_P m32r_modes_tieable_p
    225  1.1  mrg 
    226  1.1  mrg #undef TARGET_CONSTANT_ALIGNMENT
    227  1.1  mrg #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
    228  1.1  mrg 
    229  1.1  mrg #undef TARGET_STARTING_FRAME_OFFSET
    230  1.1  mrg #define TARGET_STARTING_FRAME_OFFSET m32r_starting_frame_offset
    231  1.1  mrg 
    232  1.1  mrg #undef  TARGET_HAVE_SPECULATION_SAFE_VALUE
    233  1.1  mrg #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
    234  1.1  mrg 
    235  1.1  mrg struct gcc_target targetm = TARGET_INITIALIZER;
    236  1.1  mrg 
    237  1.1  mrg /* Called by m32r_option_override to initialize various things.  */
    239  1.1  mrg 
    240  1.1  mrg void
    241  1.1  mrg m32r_init (void)
    242  1.1  mrg {
    243  1.1  mrg   init_reg_tables ();
    244  1.1  mrg 
    245  1.1  mrg   /* Initialize array for TARGET_PRINT_OPERAND_PUNCT_VALID_P.  */
    246  1.1  mrg   memset (m32r_punct_chars, 0, sizeof (m32r_punct_chars));
    247  1.1  mrg   m32r_punct_chars['#'] = 1;
    248  1.1  mrg   m32r_punct_chars['@'] = 1; /* ??? no longer used */
    249  1.1  mrg 
    250  1.1  mrg   /* Provide default value if not specified.  */
    251  1.1  mrg   if (!OPTION_SET_P (g_switch_value))
    252  1.1  mrg     g_switch_value = SDATA_DEFAULT_SIZE;
    253  1.1  mrg }
    254  1.1  mrg 
    255  1.1  mrg static void
    256  1.1  mrg m32r_option_override (void)
    257  1.1  mrg {
    258  1.1  mrg   /* These need to be done at start up.
    259  1.1  mrg      It's convenient to do them here.  */
    260  1.1  mrg   m32r_init ();
    261  1.1  mrg   SUBTARGET_OVERRIDE_OPTIONS;
    262  1.1  mrg }
    263  1.1  mrg 
    264  1.1  mrg /* Vectors to keep interesting information about registers where it can easily
    265  1.1  mrg    be got.  We use to use the actual mode value as the bit number, but there
    266  1.1  mrg    is (or may be) more than 32 modes now.  Instead we use two tables: one
    267  1.1  mrg    indexed by hard register number, and one indexed by mode.  */
    268  1.1  mrg 
    269  1.1  mrg /* The purpose of m32r_mode_class is to shrink the range of modes so that
    270  1.1  mrg    they all fit (as bit numbers) in a 32-bit word (again).  Each real mode is
    271  1.1  mrg    mapped into one m32r_mode_class mode.  */
    272  1.1  mrg 
    273  1.1  mrg enum m32r_mode_class
    274  1.1  mrg {
    275  1.1  mrg   C_MODE,
    276  1.1  mrg   S_MODE, D_MODE, T_MODE, O_MODE,
    277  1.1  mrg   SF_MODE, DF_MODE, TF_MODE, OF_MODE, A_MODE
    278  1.1  mrg };
    279  1.1  mrg 
    280  1.1  mrg /* Modes for condition codes.  */
    281  1.1  mrg #define C_MODES (1 << (int) C_MODE)
    282  1.1  mrg 
    283  1.1  mrg /* Modes for single-word and smaller quantities.  */
    284  1.1  mrg #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
    285  1.1  mrg 
    286  1.1  mrg /* Modes for double-word and smaller quantities.  */
    287  1.1  mrg #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
    288  1.1  mrg 
    289  1.1  mrg /* Modes for quad-word and smaller quantities.  */
    290  1.1  mrg #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
    291  1.1  mrg 
    292  1.1  mrg /* Modes for accumulators.  */
    293  1.1  mrg #define A_MODES (1 << (int) A_MODE)
    294  1.1  mrg 
    295  1.1  mrg /* Value is 1 if register/mode pair is acceptable on arc.  */
    296  1.1  mrg 
    297  1.1  mrg static const unsigned int m32r_hard_regno_modes[FIRST_PSEUDO_REGISTER] =
    298  1.1  mrg {
    299  1.1  mrg   T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES,
    300  1.1  mrg   T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, S_MODES, S_MODES, S_MODES,
    301  1.1  mrg   S_MODES, C_MODES, A_MODES, A_MODES
    302  1.1  mrg };
    303  1.1  mrg 
    304  1.1  mrg static unsigned int m32r_mode_class [NUM_MACHINE_MODES];
    305  1.1  mrg 
    306  1.1  mrg enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER];
    307  1.1  mrg 
    308  1.1  mrg static void
    309  1.1  mrg init_reg_tables (void)
    310  1.1  mrg {
    311  1.1  mrg   int i;
    312  1.1  mrg 
    313  1.1  mrg   for (i = 0; i < NUM_MACHINE_MODES; i++)
    314  1.1  mrg     {
    315  1.1  mrg       machine_mode m = (machine_mode) i;
    316  1.1  mrg 
    317  1.1  mrg       switch (GET_MODE_CLASS (m))
    318  1.1  mrg 	{
    319  1.1  mrg 	case MODE_INT:
    320  1.1  mrg 	case MODE_PARTIAL_INT:
    321  1.1  mrg 	case MODE_COMPLEX_INT:
    322  1.1  mrg 	  if (GET_MODE_SIZE (m) <= 4)
    323  1.1  mrg 	    m32r_mode_class[i] = 1 << (int) S_MODE;
    324  1.1  mrg 	  else if (GET_MODE_SIZE (m) == 8)
    325  1.1  mrg 	    m32r_mode_class[i] = 1 << (int) D_MODE;
    326  1.1  mrg 	  else if (GET_MODE_SIZE (m) == 16)
    327  1.1  mrg 	    m32r_mode_class[i] = 1 << (int) T_MODE;
    328  1.1  mrg 	  else if (GET_MODE_SIZE (m) == 32)
    329  1.1  mrg 	    m32r_mode_class[i] = 1 << (int) O_MODE;
    330  1.1  mrg 	  else
    331  1.1  mrg 	    m32r_mode_class[i] = 0;
    332  1.1  mrg 	  break;
    333  1.1  mrg 	case MODE_FLOAT:
    334  1.1  mrg 	case MODE_COMPLEX_FLOAT:
    335  1.1  mrg 	  if (GET_MODE_SIZE (m) <= 4)
    336  1.1  mrg 	    m32r_mode_class[i] = 1 << (int) SF_MODE;
    337  1.1  mrg 	  else if (GET_MODE_SIZE (m) == 8)
    338  1.1  mrg 	    m32r_mode_class[i] = 1 << (int) DF_MODE;
    339  1.1  mrg 	  else if (GET_MODE_SIZE (m) == 16)
    340  1.1  mrg 	    m32r_mode_class[i] = 1 << (int) TF_MODE;
    341  1.1  mrg 	  else if (GET_MODE_SIZE (m) == 32)
    342  1.1  mrg 	    m32r_mode_class[i] = 1 << (int) OF_MODE;
    343  1.1  mrg 	  else
    344  1.1  mrg 	    m32r_mode_class[i] = 0;
    345  1.1  mrg 	  break;
    346  1.1  mrg 	case MODE_CC:
    347  1.1  mrg 	  m32r_mode_class[i] = 1 << (int) C_MODE;
    348  1.1  mrg 	  break;
    349  1.1  mrg 	default:
    350  1.1  mrg 	  m32r_mode_class[i] = 0;
    351  1.1  mrg 	  break;
    352  1.1  mrg 	}
    353  1.1  mrg     }
    354  1.1  mrg 
    355  1.1  mrg   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    356  1.1  mrg     {
    357  1.1  mrg       if (GPR_P (i))
    358  1.1  mrg 	m32r_regno_reg_class[i] = GENERAL_REGS;
    359  1.1  mrg       else if (i == ARG_POINTER_REGNUM)
    360  1.1  mrg 	m32r_regno_reg_class[i] = GENERAL_REGS;
    361  1.1  mrg       else
    362  1.1  mrg 	m32r_regno_reg_class[i] = NO_REGS;
    363  1.1  mrg     }
    364  1.1  mrg }
    365  1.1  mrg 
    366  1.1  mrg /* M32R specific attribute support.
    368  1.1  mrg 
    369  1.1  mrg    interrupt - for interrupt functions
    370  1.1  mrg 
    371  1.1  mrg    model - select code model used to access object
    372  1.1  mrg 
    373  1.1  mrg 	small: addresses use 24 bits, use bl to make calls
    374  1.1  mrg 	medium: addresses use 32 bits, use bl to make calls
    375  1.1  mrg 	large: addresses use 32 bits, use seth/add3/jl to make calls
    376  1.1  mrg 
    377  1.1  mrg 	Grep for MODEL in m32r.h for more info.  */
    378  1.1  mrg 
    379  1.1  mrg static tree small_ident1;
    380  1.1  mrg static tree small_ident2;
    381  1.1  mrg static tree medium_ident1;
    382  1.1  mrg static tree medium_ident2;
    383  1.1  mrg static tree large_ident1;
    384  1.1  mrg static tree large_ident2;
    385  1.1  mrg 
    386  1.1  mrg static void
    387  1.1  mrg init_idents (void)
    388  1.1  mrg {
    389  1.1  mrg   if (small_ident1 == 0)
    390  1.1  mrg     {
    391  1.1  mrg       small_ident1 = get_identifier ("small");
    392  1.1  mrg       small_ident2 = get_identifier ("__small__");
    393  1.1  mrg       medium_ident1 = get_identifier ("medium");
    394  1.1  mrg       medium_ident2 = get_identifier ("__medium__");
    395  1.1  mrg       large_ident1 = get_identifier ("large");
    396  1.1  mrg       large_ident2 = get_identifier ("__large__");
    397  1.1  mrg     }
    398  1.1  mrg }
    399  1.1  mrg 
    400  1.1  mrg /* Handle an "model" attribute; arguments as in
    401  1.1  mrg    struct attribute_spec.handler.  */
    402  1.1  mrg static tree
    403  1.1  mrg m32r_handle_model_attribute (tree *node ATTRIBUTE_UNUSED, tree name,
    404  1.1  mrg 			     tree args, int flags ATTRIBUTE_UNUSED,
    405  1.1  mrg 			     bool *no_add_attrs)
    406  1.1  mrg {
    407  1.1  mrg   tree arg;
    408  1.1  mrg 
    409  1.1  mrg   init_idents ();
    410  1.1  mrg   arg = TREE_VALUE (args);
    411  1.1  mrg 
    412  1.1  mrg   if (arg != small_ident1
    413  1.1  mrg       && arg != small_ident2
    414  1.1  mrg       && arg != medium_ident1
    415  1.1  mrg       && arg != medium_ident2
    416  1.1  mrg       && arg != large_ident1
    417  1.1  mrg       && arg != large_ident2)
    418  1.1  mrg     {
    419  1.1  mrg       warning (OPT_Wattributes, "invalid argument of %qs attribute",
    420  1.1  mrg 	       IDENTIFIER_POINTER (name));
    421  1.1  mrg       *no_add_attrs = true;
    422  1.1  mrg     }
    423  1.1  mrg 
    424  1.1  mrg   return NULL_TREE;
    425  1.1  mrg }
    426  1.1  mrg 
    427  1.1  mrg static bool
    428  1.1  mrg m32r_attribute_identifier (const_tree name)
    429  1.1  mrg {
    430  1.1  mrg   return strcmp (IDENTIFIER_POINTER (name), "model") == 0
    431  1.1  mrg     ||   strcmp (IDENTIFIER_POINTER (name), "__model__") == 0;
    432  1.1  mrg }
    433  1.1  mrg 
    434  1.1  mrg /* Encode section information of DECL, which is either a VAR_DECL,
    436  1.1  mrg    FUNCTION_DECL, STRING_CST, CONSTRUCTOR, or ???.
    437  1.1  mrg 
    438  1.1  mrg    For the M32R we want to record:
    439  1.1  mrg 
    440  1.1  mrg    - whether the object lives in .sdata/.sbss.
    441  1.1  mrg    - what code model should be used to access the object
    442  1.1  mrg */
    443  1.1  mrg 
    444  1.1  mrg static void
    445  1.1  mrg m32r_encode_section_info (tree decl, rtx rtl, int first)
    446  1.1  mrg {
    447  1.1  mrg   int extra_flags = 0;
    448  1.1  mrg   tree model_attr;
    449  1.1  mrg   enum m32r_model model;
    450  1.1  mrg 
    451  1.1  mrg   default_encode_section_info (decl, rtl, first);
    452  1.1  mrg 
    453  1.1  mrg   if (!DECL_P (decl))
    454  1.1  mrg     return;
    455  1.1  mrg 
    456  1.1  mrg   model_attr = lookup_attribute ("model", DECL_ATTRIBUTES (decl));
    457  1.1  mrg   if (model_attr)
    458  1.1  mrg     {
    459  1.1  mrg       tree id;
    460  1.1  mrg 
    461  1.1  mrg       init_idents ();
    462  1.1  mrg 
    463  1.1  mrg       id = TREE_VALUE (TREE_VALUE (model_attr));
    464  1.1  mrg 
    465  1.1  mrg       if (id == small_ident1 || id == small_ident2)
    466  1.1  mrg 	model = M32R_MODEL_SMALL;
    467  1.1  mrg       else if (id == medium_ident1 || id == medium_ident2)
    468  1.1  mrg 	model = M32R_MODEL_MEDIUM;
    469  1.1  mrg       else if (id == large_ident1 || id == large_ident2)
    470  1.1  mrg 	model = M32R_MODEL_LARGE;
    471  1.1  mrg       else
    472  1.1  mrg 	gcc_unreachable (); /* shouldn't happen */
    473  1.1  mrg     }
    474  1.1  mrg   else
    475  1.1  mrg     {
    476  1.1  mrg       if (TARGET_MODEL_SMALL)
    477  1.1  mrg 	model = M32R_MODEL_SMALL;
    478  1.1  mrg       else if (TARGET_MODEL_MEDIUM)
    479  1.1  mrg 	model = M32R_MODEL_MEDIUM;
    480  1.1  mrg       else if (TARGET_MODEL_LARGE)
    481  1.1  mrg 	model = M32R_MODEL_LARGE;
    482  1.1  mrg       else
    483  1.1  mrg 	gcc_unreachable (); /* shouldn't happen */
    484  1.1  mrg     }
    485  1.1  mrg   extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
    486  1.1  mrg 
    487  1.1  mrg   if (extra_flags)
    488  1.1  mrg     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;
    489  1.1  mrg }
    490  1.1  mrg 
    491  1.1  mrg /* Only mark the object as being small data area addressable if
    492  1.1  mrg    it hasn't been explicitly marked with a code model.
    493  1.1  mrg 
    494  1.1  mrg    The user can explicitly put an object in the small data area with the
    495  1.1  mrg    section attribute.  If the object is in sdata/sbss and marked with a
    496  1.1  mrg    code model do both [put the object in .sdata and mark it as being
    497  1.1  mrg    addressed with a specific code model - don't mark it as being addressed
    498  1.1  mrg    with an SDA reloc though].  This is ok and might be useful at times.  If
    499  1.1  mrg    the object doesn't fit the linker will give an error.  */
    500  1.1  mrg 
    501  1.1  mrg static bool
    502  1.1  mrg m32r_in_small_data_p (const_tree decl)
    503  1.1  mrg {
    504  1.1  mrg   const char *section;
    505  1.1  mrg 
    506  1.1  mrg   if (TREE_CODE (decl) != VAR_DECL)
    507  1.1  mrg     return false;
    508  1.1  mrg 
    509  1.1  mrg   if (lookup_attribute ("model", DECL_ATTRIBUTES (decl)))
    510  1.1  mrg     return false;
    511  1.1  mrg 
    512  1.1  mrg   section = DECL_SECTION_NAME (decl);
    513  1.1  mrg   if (section)
    514  1.1  mrg     {
    515  1.1  mrg       if (strcmp (section, ".sdata") == 0 || strcmp (section, ".sbss") == 0)
    516  1.1  mrg 	return true;
    517  1.1  mrg     }
    518  1.1  mrg   else
    519  1.1  mrg     {
    520  1.1  mrg       if (! TREE_READONLY (decl) && ! TARGET_SDATA_NONE)
    521  1.1  mrg 	{
    522  1.1  mrg 	  int size = int_size_in_bytes (TREE_TYPE (decl));
    523  1.1  mrg 
    524  1.1  mrg 	  if (size > 0 && size <= g_switch_value)
    525  1.1  mrg 	    return true;
    526  1.1  mrg 	}
    527  1.1  mrg     }
    528  1.1  mrg 
    529  1.1  mrg   return false;
    530  1.1  mrg }
    531  1.1  mrg 
    532  1.1  mrg /* Do anything needed before RTL is emitted for each function.  */
    533  1.1  mrg 
    534  1.1  mrg void
    535  1.1  mrg m32r_init_expanders (void)
    536  1.1  mrg {
    537  1.1  mrg   /* ??? At one point there was code here.  The function is left in
    538  1.1  mrg      to make it easy to experiment.  */
    539  1.1  mrg }
    540  1.1  mrg 
    541  1.1  mrg bool
    543  1.1  mrg call_operand (rtx op, machine_mode mode)
    544  1.1  mrg {
    545  1.1  mrg   if (!MEM_P (op))
    546  1.1  mrg     return 0;
    547  1.1  mrg   op = XEXP (op, 0);
    548  1.1  mrg   return call_address_operand (op, mode);
    549  1.1  mrg }
    550  1.1  mrg 
    551  1.1  mrg /* Return 1 if OP is a reference to an object in .sdata/.sbss.  */
    552  1.1  mrg 
    553  1.1  mrg bool
    554  1.1  mrg small_data_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
    555  1.1  mrg {
    556  1.1  mrg   if (! TARGET_SDATA_USE)
    557  1.1  mrg     return 0;
    558  1.1  mrg 
    559  1.1  mrg   if (GET_CODE (op) == SYMBOL_REF)
    560  1.1  mrg     return SYMBOL_REF_SMALL_P (op);
    561  1.1  mrg 
    562  1.1  mrg   if (GET_CODE (op) == CONST
    563  1.1  mrg       && GET_CODE (XEXP (op, 0)) == PLUS
    564  1.1  mrg       && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
    565  1.1  mrg       && satisfies_constraint_J (XEXP (XEXP (op, 0), 1)))
    566  1.1  mrg     return SYMBOL_REF_SMALL_P (XEXP (XEXP (op, 0), 0));
    567  1.1  mrg 
    568  1.1  mrg   return 0;
    569  1.1  mrg }
    570  1.1  mrg 
    571  1.1  mrg /* Return 1 if OP is a symbol that can use 24-bit addressing.  */
    572  1.1  mrg 
    573  1.1  mrg int
    574  1.1  mrg addr24_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
    575  1.1  mrg {
    576  1.1  mrg   rtx sym;
    577  1.1  mrg 
    578  1.1  mrg   if (flag_pic)
    579  1.1  mrg     return 0;
    580  1.1  mrg 
    581  1.1  mrg   if (GET_CODE (op) == LABEL_REF)
    582  1.1  mrg     return TARGET_ADDR24;
    583  1.1  mrg 
    584  1.1  mrg   if (GET_CODE (op) == SYMBOL_REF)
    585  1.1  mrg     sym = op;
    586  1.1  mrg   else if (GET_CODE (op) == CONST
    587  1.1  mrg 	   && GET_CODE (XEXP (op, 0)) == PLUS
    588  1.1  mrg 	   && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
    589  1.1  mrg 	   && satisfies_constraint_M (XEXP (XEXP (op, 0), 1)))
    590  1.1  mrg     sym = XEXP (XEXP (op, 0), 0);
    591  1.1  mrg   else
    592  1.1  mrg     return 0;
    593  1.1  mrg 
    594  1.1  mrg   if (SYMBOL_REF_MODEL (sym) == M32R_MODEL_SMALL)
    595  1.1  mrg     return 1;
    596  1.1  mrg 
    597  1.1  mrg   if (TARGET_ADDR24
    598  1.1  mrg       && (CONSTANT_POOL_ADDRESS_P (sym)
    599  1.1  mrg 	  || LIT_NAME_P (XSTR (sym, 0))))
    600  1.1  mrg     return 1;
    601  1.1  mrg 
    602  1.1  mrg   return 0;
    603  1.1  mrg }
    604  1.1  mrg 
    605  1.1  mrg /* Return 1 if OP is a symbol that needs 32-bit addressing.  */
    606  1.1  mrg 
    607  1.1  mrg int
    608  1.1  mrg addr32_operand (rtx op, machine_mode mode)
    609  1.1  mrg {
    610  1.1  mrg   rtx sym;
    611  1.1  mrg 
    612  1.1  mrg   if (GET_CODE (op) == LABEL_REF)
    613  1.1  mrg     return TARGET_ADDR32;
    614  1.1  mrg 
    615  1.1  mrg   if (GET_CODE (op) == SYMBOL_REF)
    616  1.1  mrg     sym = op;
    617  1.1  mrg   else if (GET_CODE (op) == CONST
    618  1.1  mrg 	   && GET_CODE (XEXP (op, 0)) == PLUS
    619  1.1  mrg 	   && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
    620  1.1  mrg 	   && CONST_INT_P (XEXP (XEXP (op, 0), 1))
    621  1.1  mrg 	   && ! flag_pic)
    622  1.1  mrg     sym = XEXP (XEXP (op, 0), 0);
    623  1.1  mrg   else
    624  1.1  mrg     return 0;
    625  1.1  mrg 
    626  1.1  mrg   return (! addr24_operand (sym, mode)
    627  1.1  mrg 	  && ! small_data_operand (sym, mode));
    628  1.1  mrg }
    629  1.1  mrg 
    630  1.1  mrg /* Return 1 if OP is a function that can be called with the `bl' insn.  */
    631  1.1  mrg 
    632  1.1  mrg int
    633  1.1  mrg call26_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
    634  1.1  mrg {
    635  1.1  mrg   if (flag_pic)
    636  1.1  mrg     return 1;
    637  1.1  mrg 
    638  1.1  mrg   if (GET_CODE (op) == SYMBOL_REF)
    639  1.1  mrg     return SYMBOL_REF_MODEL (op) != M32R_MODEL_LARGE;
    640  1.1  mrg 
    641  1.1  mrg   return TARGET_CALL26;
    642  1.1  mrg }
    643  1.1  mrg 
    644  1.1  mrg /* Return 1 if OP is a DImode const we want to handle inline.
    645  1.1  mrg    This must match the code in the movdi pattern.
    646  1.1  mrg    It is used by the 'G' constraint.  */
    647  1.1  mrg 
    648  1.1  mrg int
    649  1.1  mrg easy_di_const (rtx op)
    650  1.1  mrg {
    651  1.1  mrg   rtx high_rtx, low_rtx;
    652  1.1  mrg   HOST_WIDE_INT high, low;
    653  1.1  mrg 
    654  1.1  mrg   split_double (op, &high_rtx, &low_rtx);
    655  1.1  mrg   high = INTVAL (high_rtx);
    656  1.1  mrg   low = INTVAL (low_rtx);
    657  1.1  mrg   /* Pick constants loadable with 2 16-bit `ldi' insns.  */
    658  1.1  mrg   if (high >= -128 && high <= 127
    659  1.1  mrg       && low >= -128 && low <= 127)
    660  1.1  mrg     return 1;
    661  1.1  mrg   return 0;
    662  1.1  mrg }
    663  1.1  mrg 
    664  1.1  mrg /* Return 1 if OP is a DFmode const we want to handle inline.
    665  1.1  mrg    This must match the code in the movdf pattern.
    666  1.1  mrg    It is used by the 'H' constraint.  */
    667  1.1  mrg 
    668  1.1  mrg int
    669  1.1  mrg easy_df_const (rtx op)
    670  1.1  mrg {
    671  1.1  mrg   long l[2];
    672  1.1  mrg 
    673  1.1  mrg   REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (op), l);
    674  1.1  mrg   if (l[0] == 0 && l[1] == 0)
    675  1.1  mrg     return 1;
    676  1.1  mrg   if ((l[0] & 0xffff) == 0 && l[1] == 0)
    677  1.1  mrg     return 1;
    678  1.1  mrg   return 0;
    679  1.1  mrg }
    680  1.1  mrg 
    681  1.1  mrg /* Return 1 if OP is (mem (reg ...)).
    682  1.1  mrg    This is used in insn length calcs.  */
    683  1.1  mrg 
    684  1.1  mrg bool
    685  1.1  mrg memreg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
    686  1.1  mrg {
    687  1.1  mrg   return MEM_P (op) && REG_P (XEXP (op, 0));
    688  1.1  mrg }
    689  1.1  mrg 
    690  1.1  mrg /* Return nonzero if ARG must be passed by indirect reference.  */
    691  1.1  mrg 
    692  1.1  mrg static bool
    693  1.1  mrg m32r_pass_by_reference (cumulative_args_t, const function_arg_info &arg)
    694  1.1  mrg {
    695  1.1  mrg   int size = arg.type_size_in_bytes ();
    696  1.1  mrg   return (size < 0 || size > 8);
    697  1.1  mrg }
    698  1.1  mrg 
    699  1.1  mrg /* Comparisons.  */
    701  1.1  mrg 
    702  1.1  mrg /* X and Y are two things to compare using CODE.  Emit the compare insn and
    703  1.1  mrg    return the rtx for compare [arg0 of the if_then_else].
    704  1.1  mrg    If need_compare is true then the comparison insn must be generated, rather
    705  1.1  mrg    than being subsumed into the following branch instruction.  */
    706  1.1  mrg 
    707  1.1  mrg rtx
    708  1.1  mrg gen_compare (enum rtx_code code, rtx x, rtx y, int need_compare)
    709  1.1  mrg {
    710  1.1  mrg   enum rtx_code compare_code;
    711  1.1  mrg   enum rtx_code branch_code;
    712  1.1  mrg   rtx cc_reg = gen_rtx_REG (CCmode, CARRY_REGNUM);
    713  1.1  mrg   int must_swap = 0;
    714  1.1  mrg 
    715  1.1  mrg   switch (code)
    716  1.1  mrg     {
    717  1.1  mrg     case EQ:  compare_code = EQ;  branch_code = NE; break;
    718  1.1  mrg     case NE:  compare_code = EQ;  branch_code = EQ; break;
    719  1.1  mrg     case LT:  compare_code = LT;  branch_code = NE; break;
    720  1.1  mrg     case LE:  compare_code = LT;  branch_code = EQ; must_swap = 1; break;
    721  1.1  mrg     case GT:  compare_code = LT;  branch_code = NE; must_swap = 1; break;
    722  1.1  mrg     case GE:  compare_code = LT;  branch_code = EQ; break;
    723  1.1  mrg     case LTU: compare_code = LTU; branch_code = NE; break;
    724  1.1  mrg     case LEU: compare_code = LTU; branch_code = EQ; must_swap = 1; break;
    725  1.1  mrg     case GTU: compare_code = LTU; branch_code = NE; must_swap = 1; break;
    726  1.1  mrg     case GEU: compare_code = LTU; branch_code = EQ; break;
    727  1.1  mrg 
    728  1.1  mrg     default:
    729  1.1  mrg       gcc_unreachable ();
    730  1.1  mrg     }
    731  1.1  mrg 
    732  1.1  mrg   if (need_compare)
    733  1.1  mrg     {
    734  1.1  mrg       switch (compare_code)
    735  1.1  mrg 	{
    736  1.1  mrg 	case EQ:
    737  1.1  mrg 	  if (satisfies_constraint_P (y)		/* Reg equal to small const.  */
    738  1.1  mrg 	      && y != const0_rtx)
    739  1.1  mrg 	    {
    740  1.1  mrg 	      rtx tmp = gen_reg_rtx (SImode);
    741  1.1  mrg 
    742  1.1  mrg 	      emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
    743  1.1  mrg 	      x = tmp;
    744  1.1  mrg 	      y = const0_rtx;
    745  1.1  mrg 	    }
    746  1.1  mrg 	  else if (CONSTANT_P (y))			/* Reg equal to const.  */
    747  1.1  mrg 	    {
    748  1.1  mrg 	      rtx tmp = force_reg (GET_MODE (x), y);
    749  1.1  mrg 	      y = tmp;
    750  1.1  mrg 	    }
    751  1.1  mrg 
    752  1.1  mrg 	  if (register_operand (y, SImode) 		/* Reg equal to reg.  */
    753  1.1  mrg 	      || y == const0_rtx) 	   		/* Reg equal to zero.  */
    754  1.1  mrg 	    {
    755  1.1  mrg 	      emit_insn (gen_cmp_eqsi_insn (x, y));
    756  1.1  mrg 
    757  1.1  mrg 	      return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
    758  1.1  mrg 	    }
    759  1.1  mrg 	  break;
    760  1.1  mrg 
    761  1.1  mrg 	case LT:
    762  1.1  mrg 	  if (register_operand (y, SImode)
    763  1.1  mrg 	      || satisfies_constraint_P (y))
    764  1.1  mrg 	    {
    765  1.1  mrg 	      rtx tmp = gen_reg_rtx (SImode);	      /* Reg compared to reg.  */
    766  1.1  mrg 
    767  1.1  mrg 	      switch (code)
    768  1.1  mrg 		{
    769  1.1  mrg 		case LT:
    770  1.1  mrg 		  emit_insn (gen_cmp_ltsi_insn (x, y));
    771  1.1  mrg 		  code = EQ;
    772  1.1  mrg 		  break;
    773  1.1  mrg 		case LE:
    774  1.1  mrg 		  if (y == const0_rtx)
    775  1.1  mrg 		    tmp = const1_rtx;
    776  1.1  mrg 		  else
    777  1.1  mrg 		    emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
    778  1.1  mrg 		  emit_insn (gen_cmp_ltsi_insn (x, tmp));
    779  1.1  mrg 		  code = EQ;
    780  1.1  mrg 		  break;
    781  1.1  mrg 		case GT:
    782  1.1  mrg 		  if (CONST_INT_P (y))
    783  1.1  mrg 		    tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
    784  1.1  mrg 		  else
    785  1.1  mrg 		    emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
    786  1.1  mrg 		  emit_insn (gen_cmp_ltsi_insn (x, tmp));
    787  1.1  mrg 		  code = NE;
    788  1.1  mrg 		  break;
    789  1.1  mrg 		case GE:
    790  1.1  mrg 		  emit_insn (gen_cmp_ltsi_insn (x, y));
    791  1.1  mrg 		  code = NE;
    792  1.1  mrg 		  break;
    793  1.1  mrg 		default:
    794  1.1  mrg 		  gcc_unreachable ();
    795  1.1  mrg 		}
    796  1.1  mrg 
    797  1.1  mrg 	      return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
    798  1.1  mrg 	    }
    799  1.1  mrg 	  break;
    800  1.1  mrg 
    801  1.1  mrg 	case LTU:
    802  1.1  mrg 	  if (register_operand (y, SImode)
    803  1.1  mrg 	      || satisfies_constraint_P (y))
    804  1.1  mrg 	    {
    805  1.1  mrg 	      rtx tmp = gen_reg_rtx (SImode);	      /* Reg (unsigned) compared to reg.  */
    806  1.1  mrg 
    807  1.1  mrg 	      switch (code)
    808  1.1  mrg 		{
    809  1.1  mrg 		case LTU:
    810  1.1  mrg 		  emit_insn (gen_cmp_ltusi_insn (x, y));
    811  1.1  mrg 		  code = EQ;
    812  1.1  mrg 		  break;
    813  1.1  mrg 		case LEU:
    814  1.1  mrg 		  if (y == const0_rtx)
    815  1.1  mrg 		    tmp = const1_rtx;
    816  1.1  mrg 		  else
    817  1.1  mrg 		    emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
    818  1.1  mrg 		  emit_insn (gen_cmp_ltusi_insn (x, tmp));
    819  1.1  mrg 		  code = EQ;
    820  1.1  mrg 		  break;
    821  1.1  mrg 		case GTU:
    822  1.1  mrg 		  if (CONST_INT_P (y))
    823  1.1  mrg 		    tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
    824  1.1  mrg 		  else
    825  1.1  mrg 		    emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
    826  1.1  mrg 		  emit_insn (gen_cmp_ltusi_insn (x, tmp));
    827  1.1  mrg 		  code = NE;
    828  1.1  mrg 		  break;
    829  1.1  mrg 		case GEU:
    830  1.1  mrg 		  emit_insn (gen_cmp_ltusi_insn (x, y));
    831  1.1  mrg 		  code = NE;
    832  1.1  mrg 		  break;
    833  1.1  mrg 		default:
    834  1.1  mrg 		  gcc_unreachable ();
    835  1.1  mrg 		}
    836  1.1  mrg 
    837  1.1  mrg 	      return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
    838  1.1  mrg 	    }
    839  1.1  mrg 	  break;
    840  1.1  mrg 
    841  1.1  mrg 	default:
    842  1.1  mrg 	  gcc_unreachable ();
    843  1.1  mrg 	}
    844  1.1  mrg     }
    845  1.1  mrg   else
    846  1.1  mrg     {
    847  1.1  mrg       /* Reg/reg equal comparison.  */
    848  1.1  mrg       if (compare_code == EQ
    849  1.1  mrg 	  && register_operand (y, SImode))
    850  1.1  mrg 	return gen_rtx_fmt_ee (code, CCmode, x, y);
    851  1.1  mrg 
    852  1.1  mrg       /* Reg/zero signed comparison.  */
    853  1.1  mrg       if ((compare_code == EQ || compare_code == LT)
    854  1.1  mrg 	  && y == const0_rtx)
    855  1.1  mrg 	return gen_rtx_fmt_ee (code, CCmode, x, y);
    856  1.1  mrg 
    857  1.1  mrg       /* Reg/smallconst equal comparison.  */
    858  1.1  mrg       if (compare_code == EQ
    859  1.1  mrg 	  && satisfies_constraint_P (y))
    860  1.1  mrg 	{
    861  1.1  mrg 	  rtx tmp = gen_reg_rtx (SImode);
    862  1.1  mrg 
    863  1.1  mrg 	  emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
    864  1.1  mrg 	  return gen_rtx_fmt_ee (code, CCmode, tmp, const0_rtx);
    865  1.1  mrg 	}
    866  1.1  mrg 
    867  1.1  mrg       /* Reg/const equal comparison.  */
    868  1.1  mrg       if (compare_code == EQ
    869  1.1  mrg 	  && CONSTANT_P (y))
    870  1.1  mrg 	{
    871  1.1  mrg 	  rtx tmp = force_reg (GET_MODE (x), y);
    872  1.1  mrg 
    873  1.1  mrg 	  return gen_rtx_fmt_ee (code, CCmode, x, tmp);
    874  1.1  mrg 	}
    875  1.1  mrg     }
    876  1.1  mrg 
    877  1.1  mrg   if (CONSTANT_P (y))
    878  1.1  mrg     {
    879  1.1  mrg       if (must_swap)
    880  1.1  mrg 	y = force_reg (GET_MODE (x), y);
    881  1.1  mrg       else
    882  1.1  mrg 	{
    883  1.1  mrg 	  int ok_const = reg_or_int16_operand (y, GET_MODE (y));
    884  1.1  mrg 
    885  1.1  mrg 	  if (! ok_const)
    886  1.1  mrg 	    y = force_reg (GET_MODE (x), y);
    887  1.1  mrg 	}
    888  1.1  mrg     }
    889  1.1  mrg 
    890  1.1  mrg   switch (compare_code)
    891  1.1  mrg     {
    892  1.1  mrg     case EQ :
    893  1.1  mrg       emit_insn (gen_cmp_eqsi_insn (must_swap ? y : x, must_swap ? x : y));
    894  1.1  mrg       break;
    895  1.1  mrg     case LT :
    896  1.1  mrg       emit_insn (gen_cmp_ltsi_insn (must_swap ? y : x, must_swap ? x : y));
    897  1.1  mrg       break;
    898  1.1  mrg     case LTU :
    899  1.1  mrg       emit_insn (gen_cmp_ltusi_insn (must_swap ? y : x, must_swap ? x : y));
    900  1.1  mrg       break;
    901  1.1  mrg 
    902  1.1  mrg     default:
    903  1.1  mrg       gcc_unreachable ();
    904  1.1  mrg     }
    905  1.1  mrg 
    906  1.1  mrg   return gen_rtx_fmt_ee (branch_code, VOIDmode, cc_reg, CONST0_RTX (CCmode));
    907  1.1  mrg }
    908  1.1  mrg 
    909  1.1  mrg bool
    910  1.1  mrg gen_cond_store (enum rtx_code code, rtx op0, rtx op1, rtx op2)
    911  1.1  mrg {
    912  1.1  mrg   machine_mode mode = GET_MODE (op0);
    913  1.1  mrg 
    914  1.1  mrg   gcc_assert (mode == SImode);
    915  1.1  mrg   switch (code)
    916  1.1  mrg     {
    917  1.1  mrg     case EQ:
    918  1.1  mrg       if (!register_operand (op1, mode))
    919  1.1  mrg 	op1 = force_reg (mode, op1);
    920  1.1  mrg 
    921  1.1  mrg       if (TARGET_M32RX || TARGET_M32R2)
    922  1.1  mrg 	{
    923  1.1  mrg 	  if (!reg_or_zero_operand (op2, mode))
    924  1.1  mrg 	    op2 = force_reg (mode, op2);
    925  1.1  mrg 
    926  1.1  mrg 	  emit_insn (gen_seq_insn_m32rx (op0, op1, op2));
    927  1.1  mrg 	  return true;
    928  1.1  mrg 	}
    929  1.1  mrg       if (CONST_INT_P (op2) && INTVAL (op2) == 0)
    930  1.1  mrg 	{
    931  1.1  mrg 	  emit_insn (gen_seq_zero_insn (op0, op1));
    932  1.1  mrg 	  return true;
    933  1.1  mrg 	}
    934  1.1  mrg 
    935  1.1  mrg       if (!reg_or_eq_int16_operand (op2, mode))
    936  1.1  mrg 	op2 = force_reg (mode, op2);
    937  1.1  mrg 
    938  1.1  mrg       emit_insn (gen_seq_insn (op0, op1, op2));
    939  1.1  mrg       return true;
    940  1.1  mrg 
    941  1.1  mrg     case NE:
    942  1.1  mrg       if (!CONST_INT_P (op2)
    943  1.1  mrg 	  || (INTVAL (op2) != 0 && satisfies_constraint_K (op2)))
    944  1.1  mrg 	{
    945  1.1  mrg 	  rtx reg;
    946  1.1  mrg 
    947  1.1  mrg 	  if (reload_completed || reload_in_progress)
    948  1.1  mrg 	    return false;
    949  1.1  mrg 
    950  1.1  mrg 	  reg = gen_reg_rtx (SImode);
    951  1.1  mrg 	  emit_insn (gen_xorsi3 (reg, op1, op2));
    952  1.1  mrg 	  op1 = reg;
    953  1.1  mrg 
    954  1.1  mrg 	  if (!register_operand (op1, mode))
    955  1.1  mrg 	    op1 = force_reg (mode, op1);
    956  1.1  mrg 
    957  1.1  mrg 	  emit_insn (gen_sne_zero_insn (op0, op1));
    958  1.1  mrg 	  return true;
    959  1.1  mrg 	}
    960  1.1  mrg       return false;
    961  1.1  mrg 
    962  1.1  mrg     case LT:
    963  1.1  mrg     case GT:
    964  1.1  mrg       if (code == GT)
    965  1.1  mrg 	{
    966  1.1  mrg 	  rtx tmp = op2;
    967  1.1  mrg 	  op2 = op1;
    968  1.1  mrg 	  op1 = tmp;
    969  1.1  mrg 	  code = LT;
    970  1.1  mrg 	}
    971  1.1  mrg 
    972  1.1  mrg       if (!register_operand (op1, mode))
    973  1.1  mrg 	op1 = force_reg (mode, op1);
    974  1.1  mrg 
    975  1.1  mrg       if (!reg_or_int16_operand (op2, mode))
    976  1.1  mrg 	op2 = force_reg (mode, op2);
    977  1.1  mrg 
    978  1.1  mrg       emit_insn (gen_slt_insn (op0, op1, op2));
    979  1.1  mrg       return true;
    980  1.1  mrg 
    981  1.1  mrg     case LTU:
    982  1.1  mrg     case GTU:
    983  1.1  mrg       if (code == GTU)
    984  1.1  mrg 	{
    985  1.1  mrg 	  rtx tmp = op2;
    986  1.1  mrg 	  op2 = op1;
    987  1.1  mrg 	  op1 = tmp;
    988  1.1  mrg 	  code = LTU;
    989  1.1  mrg 	}
    990  1.1  mrg 
    991  1.1  mrg       if (!register_operand (op1, mode))
    992  1.1  mrg 	op1 = force_reg (mode, op1);
    993  1.1  mrg 
    994  1.1  mrg       if (!reg_or_int16_operand (op2, mode))
    995  1.1  mrg 	op2 = force_reg (mode, op2);
    996  1.1  mrg 
    997  1.1  mrg       emit_insn (gen_sltu_insn (op0, op1, op2));
    998  1.1  mrg       return true;
    999  1.1  mrg 
   1000  1.1  mrg     case GE:
   1001  1.1  mrg     case GEU:
   1002  1.1  mrg       if (!register_operand (op1, mode))
   1003  1.1  mrg 	op1 = force_reg (mode, op1);
   1004  1.1  mrg 
   1005  1.1  mrg       if (!reg_or_int16_operand (op2, mode))
   1006  1.1  mrg 	op2 = force_reg (mode, op2);
   1007  1.1  mrg 
   1008  1.1  mrg       if (code == GE)
   1009  1.1  mrg 	emit_insn (gen_sge_insn (op0, op1, op2));
   1010  1.1  mrg       else
   1011  1.1  mrg 	emit_insn (gen_sgeu_insn (op0, op1, op2));
   1012  1.1  mrg       return true;
   1013  1.1  mrg 
   1014  1.1  mrg     case LE:
   1015  1.1  mrg     case LEU:
   1016  1.1  mrg       if (!register_operand (op1, mode))
   1017  1.1  mrg 	op1 = force_reg (mode, op1);
   1018  1.1  mrg 
   1019  1.1  mrg       if (CONST_INT_P (op2))
   1020  1.1  mrg 	{
   1021  1.1  mrg 	  HOST_WIDE_INT value = INTVAL (op2);
   1022  1.1  mrg 	  if (value >= 2147483647)
   1023  1.1  mrg 	    {
   1024  1.1  mrg 	      emit_move_insn (op0, const1_rtx);
   1025  1.1  mrg 	      return true;
   1026  1.1  mrg 	    }
   1027  1.1  mrg 
   1028  1.1  mrg 	  op2 = GEN_INT (value + 1);
   1029  1.1  mrg 	  if (value < -32768 || value >= 32767)
   1030  1.1  mrg 	    op2 = force_reg (mode, op2);
   1031  1.1  mrg 
   1032  1.1  mrg           if (code == LEU)
   1033  1.1  mrg 	    emit_insn (gen_sltu_insn (op0, op1, op2));
   1034  1.1  mrg 	  else
   1035  1.1  mrg 	    emit_insn (gen_slt_insn (op0, op1, op2));
   1036  1.1  mrg 	  return true;
   1037  1.1  mrg 	}
   1038  1.1  mrg 
   1039  1.1  mrg       if (!register_operand (op2, mode))
   1040  1.1  mrg 	op2 = force_reg (mode, op2);
   1041  1.1  mrg 
   1042  1.1  mrg       if (code == LEU)
   1043  1.1  mrg         emit_insn (gen_sleu_insn (op0, op1, op2));
   1044  1.1  mrg       else
   1045  1.1  mrg         emit_insn (gen_sle_insn (op0, op1, op2));
   1046  1.1  mrg       return true;
   1047  1.1  mrg 
   1048  1.1  mrg     default:
   1049  1.1  mrg       gcc_unreachable ();
   1050  1.1  mrg     }
   1051  1.1  mrg }
   1052  1.1  mrg 
   1053  1.1  mrg 
   1054  1.1  mrg /* Split a 2 word move (DI or DF) into component parts.  */
   1056  1.1  mrg 
   1057  1.1  mrg rtx
   1058  1.1  mrg gen_split_move_double (rtx operands[])
   1059  1.1  mrg {
   1060  1.1  mrg   machine_mode mode = GET_MODE (operands[0]);
   1061  1.1  mrg   rtx dest = operands[0];
   1062  1.1  mrg   rtx src  = operands[1];
   1063  1.1  mrg   rtx val;
   1064  1.1  mrg 
   1065  1.1  mrg   /* We might have (SUBREG (MEM)) here, so just get rid of the
   1066  1.1  mrg      subregs to make this code simpler.  It is safe to call
   1067  1.1  mrg      alter_subreg any time after reload.  */
   1068  1.1  mrg   if (GET_CODE (dest) == SUBREG)
   1069  1.1  mrg     alter_subreg (&dest, true);
   1070  1.1  mrg   if (GET_CODE (src) == SUBREG)
   1071  1.1  mrg     alter_subreg (&src, true);
   1072  1.1  mrg 
   1073  1.1  mrg   start_sequence ();
   1074  1.1  mrg   if (REG_P (dest))
   1075  1.1  mrg     {
   1076  1.1  mrg       int dregno = REGNO (dest);
   1077  1.1  mrg 
   1078  1.1  mrg       /* Reg = reg.  */
   1079  1.1  mrg       if (REG_P (src))
   1080  1.1  mrg 	{
   1081  1.1  mrg 	  int sregno = REGNO (src);
   1082  1.1  mrg 
   1083  1.1  mrg 	  int reverse = (dregno == sregno + 1);
   1084  1.1  mrg 
   1085  1.1  mrg 	  /* We normally copy the low-numbered register first.  However, if
   1086  1.1  mrg 	     the first register operand 0 is the same as the second register of
   1087  1.1  mrg 	     operand 1, we must copy in the opposite order.  */
   1088  1.1  mrg 	  emit_insn (gen_rtx_SET (operand_subword (dest, reverse, TRUE, mode),
   1089  1.1  mrg 				  operand_subword (src,  reverse, TRUE, mode)));
   1090  1.1  mrg 
   1091  1.1  mrg 	  emit_insn (gen_rtx_SET (operand_subword (dest, !reverse, TRUE, mode),
   1092  1.1  mrg 				  operand_subword (src,  !reverse, TRUE, mode)));
   1093  1.1  mrg 	}
   1094  1.1  mrg 
   1095  1.1  mrg       /* Reg = constant.  */
   1096  1.1  mrg       else if (CONST_INT_P (src) || GET_CODE (src) == CONST_DOUBLE)
   1097  1.1  mrg 	{
   1098  1.1  mrg 	  rtx words[2];
   1099  1.1  mrg 	  split_double (src, &words[0], &words[1]);
   1100  1.1  mrg 	  emit_insn (gen_rtx_SET (operand_subword (dest, 0, TRUE, mode),
   1101  1.1  mrg 				  words[0]));
   1102  1.1  mrg 
   1103  1.1  mrg 	  emit_insn (gen_rtx_SET (operand_subword (dest, 1, TRUE, mode),
   1104  1.1  mrg 				  words[1]));
   1105  1.1  mrg 	}
   1106  1.1  mrg 
   1107  1.1  mrg       /* Reg = mem.  */
   1108  1.1  mrg       else if (MEM_P (src))
   1109  1.1  mrg 	{
   1110  1.1  mrg 	  /* If the high-address word is used in the address, we must load it
   1111  1.1  mrg 	     last.  Otherwise, load it first.  */
   1112  1.1  mrg 	  int reverse = refers_to_regno_p (dregno, XEXP (src, 0));
   1113  1.1  mrg 
   1114  1.1  mrg 	  /* We used to optimize loads from single registers as
   1115  1.1  mrg 
   1116  1.1  mrg 		ld r1,r3+; ld r2,r3
   1117  1.1  mrg 
   1118  1.1  mrg 	     if r3 were not used subsequently.  However, the REG_NOTES aren't
   1119  1.1  mrg 	     propagated correctly by the reload phase, and it can cause bad
   1120  1.1  mrg 	     code to be generated.  We could still try:
   1121  1.1  mrg 
   1122  1.1  mrg 		ld r1,r3+; ld r2,r3; addi r3,-4
   1123  1.1  mrg 
   1124  1.1  mrg 	     which saves 2 bytes and doesn't force longword alignment.  */
   1125  1.1  mrg 	  emit_insn (gen_rtx_SET (operand_subword (dest, reverse, TRUE, mode),
   1126  1.1  mrg 				  adjust_address (src, SImode,
   1127  1.1  mrg 						  reverse * UNITS_PER_WORD)));
   1128  1.1  mrg 
   1129  1.1  mrg 	  emit_insn (gen_rtx_SET (operand_subword (dest, !reverse, TRUE, mode),
   1130  1.1  mrg 				  adjust_address (src, SImode,
   1131  1.1  mrg 						  !reverse * UNITS_PER_WORD)));
   1132  1.1  mrg 	}
   1133  1.1  mrg       else
   1134  1.1  mrg 	gcc_unreachable ();
   1135  1.1  mrg     }
   1136  1.1  mrg 
   1137  1.1  mrg   /* Mem = reg.  */
   1138  1.1  mrg   /* We used to optimize loads from single registers as
   1139  1.1  mrg 
   1140  1.1  mrg 	st r1,r3; st r2,+r3
   1141  1.1  mrg 
   1142  1.1  mrg      if r3 were not used subsequently.  However, the REG_NOTES aren't
   1143  1.1  mrg      propagated correctly by the reload phase, and it can cause bad
   1144  1.1  mrg      code to be generated.  We could still try:
   1145  1.1  mrg 
   1146  1.1  mrg 	st r1,r3; st r2,+r3; addi r3,-4
   1147  1.1  mrg 
   1148  1.1  mrg      which saves 2 bytes and doesn't force longword alignment.  */
   1149  1.1  mrg   else if (MEM_P (dest) && REG_P (src))
   1150  1.1  mrg     {
   1151  1.1  mrg       emit_insn (gen_rtx_SET (adjust_address (dest, SImode, 0),
   1152  1.1  mrg 			      operand_subword (src, 0, TRUE, mode)));
   1153  1.1  mrg 
   1154  1.1  mrg       emit_insn (gen_rtx_SET (adjust_address (dest, SImode, UNITS_PER_WORD),
   1155  1.1  mrg 			      operand_subword (src, 1, TRUE, mode)));
   1156  1.1  mrg     }
   1157  1.1  mrg 
   1158  1.1  mrg   else
   1159  1.1  mrg     gcc_unreachable ();
   1160  1.1  mrg 
   1161  1.1  mrg   val = get_insns ();
   1162  1.1  mrg   end_sequence ();
   1163  1.1  mrg   return val;
   1164  1.1  mrg }
   1165  1.1  mrg 
   1166  1.1  mrg 
   1167  1.1  mrg static int
   1169  1.1  mrg m32r_arg_partial_bytes (cumulative_args_t cum_v, const function_arg_info &arg)
   1170  1.1  mrg {
   1171  1.1  mrg   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   1172  1.1  mrg 
   1173  1.1  mrg   int words;
   1174  1.1  mrg   unsigned int size =
   1175  1.1  mrg     (arg.promoted_size_in_bytes () + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
   1176  1.1  mrg 
   1177  1.1  mrg   if (*cum >= M32R_MAX_PARM_REGS)
   1178  1.1  mrg     words = 0;
   1179  1.1  mrg   else if (*cum + size > M32R_MAX_PARM_REGS)
   1180  1.1  mrg     words = (*cum + size) - M32R_MAX_PARM_REGS;
   1181  1.1  mrg   else
   1182  1.1  mrg     words = 0;
   1183  1.1  mrg 
   1184  1.1  mrg   return words * UNITS_PER_WORD;
   1185  1.1  mrg }
   1186  1.1  mrg 
   1187  1.1  mrg /* The ROUND_ADVANCE* macros are local to this file.  */
   1188  1.1  mrg /* Round SIZE up to a word boundary.  */
   1189  1.1  mrg #define ROUND_ADVANCE(SIZE) \
   1190  1.1  mrg   (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
   1191  1.1  mrg 
   1192  1.1  mrg /* Round arg MODE/TYPE up to the next word boundary.  */
   1193  1.1  mrg #define ROUND_ADVANCE_ARG(MODE, TYPE) \
   1194  1.1  mrg   ((MODE) == BLKmode				\
   1195  1.1  mrg    ? ROUND_ADVANCE ((unsigned int) int_size_in_bytes (TYPE))	\
   1196  1.1  mrg    : ROUND_ADVANCE ((unsigned int) GET_MODE_SIZE (MODE)))
   1197  1.1  mrg 
   1198  1.1  mrg /* Round CUM up to the necessary point for argument MODE/TYPE.  */
   1199  1.1  mrg #define ROUND_ADVANCE_CUM(CUM, MODE, TYPE) (CUM)
   1200  1.1  mrg 
   1201  1.1  mrg /* Return boolean indicating arg of type TYPE and mode MODE will be passed in
   1202  1.1  mrg    a reg.  This includes arguments that have to be passed by reference as the
   1203  1.1  mrg    pointer to them is passed in a reg if one is available (and that is what
   1204  1.1  mrg    we're given).
   1205  1.1  mrg    This macro is only used in this file.  */
   1206  1.1  mrg #define PASS_IN_REG_P(CUM, MODE, TYPE) \
   1207  1.1  mrg   (ROUND_ADVANCE_CUM ((CUM), (MODE), (TYPE)) < M32R_MAX_PARM_REGS)
   1208  1.1  mrg 
   1209  1.1  mrg /* Determine where to put an argument to a function.
   1210  1.1  mrg    Value is zero to push the argument on the stack,
   1211  1.1  mrg    or a hard register in which to store the argument.
   1212  1.1  mrg 
   1213  1.1  mrg    CUM is a variable of type CUMULATIVE_ARGS which gives info about
   1214  1.1  mrg     the preceding args and about the function being called.
   1215  1.1  mrg    ARG is a description of the argument.  */
   1216  1.1  mrg /* On the M32R the first M32R_MAX_PARM_REGS args are normally in registers
   1217  1.1  mrg    and the rest are pushed.  */
   1218  1.1  mrg 
   1219  1.1  mrg static rtx
   1220  1.1  mrg m32r_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
   1221  1.1  mrg {
   1222  1.1  mrg   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   1223  1.1  mrg 
   1224  1.1  mrg   return (PASS_IN_REG_P (*cum, arg.mode, arg.type)
   1225  1.1  mrg 	  ? gen_rtx_REG (arg.mode,
   1226  1.1  mrg 			 ROUND_ADVANCE_CUM (*cum, arg.mode, arg.type))
   1227  1.1  mrg 	  : NULL_RTX);
   1228  1.1  mrg }
   1229  1.1  mrg 
   1230  1.1  mrg /* Update the data in CUM to advance over argument ARG.  */
   1231  1.1  mrg 
   1232  1.1  mrg static void
   1233  1.1  mrg m32r_function_arg_advance (cumulative_args_t cum_v,
   1234  1.1  mrg 			   const function_arg_info &arg)
   1235  1.1  mrg {
   1236  1.1  mrg   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   1237  1.1  mrg 
   1238  1.1  mrg   *cum = (ROUND_ADVANCE_CUM (*cum, arg.mode, arg.type)
   1239  1.1  mrg 	  + ROUND_ADVANCE_ARG (arg.mode, arg.type));
   1240  1.1  mrg }
   1241  1.1  mrg 
   1242  1.1  mrg /* Worker function for TARGET_RETURN_IN_MEMORY.  */
   1243  1.1  mrg 
   1244  1.1  mrg static bool
   1245  1.1  mrg m32r_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
   1246  1.1  mrg {
   1247  1.1  mrg   cumulative_args_t dummy = pack_cumulative_args (NULL);
   1248  1.1  mrg   function_arg_info arg (const_cast<tree> (type), /*named=*/false);
   1249  1.1  mrg   return m32r_pass_by_reference (dummy, arg);
   1250  1.1  mrg }
   1251  1.1  mrg 
   1252  1.1  mrg /* Worker function for TARGET_FUNCTION_VALUE.  */
   1253  1.1  mrg 
   1254  1.1  mrg static rtx
   1255  1.1  mrg m32r_function_value (const_tree valtype,
   1256  1.1  mrg 		const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
   1257  1.1  mrg 		bool outgoing ATTRIBUTE_UNUSED)
   1258  1.1  mrg {
   1259  1.1  mrg   return gen_rtx_REG (TYPE_MODE (valtype), 0);
   1260  1.1  mrg }
   1261  1.1  mrg 
   1262  1.1  mrg /* Worker function for TARGET_LIBCALL_VALUE.  */
   1263  1.1  mrg 
   1264  1.1  mrg static rtx
   1265  1.1  mrg m32r_libcall_value (machine_mode mode,
   1266  1.1  mrg 		const_rtx fun ATTRIBUTE_UNUSED)
   1267  1.1  mrg {
   1268  1.1  mrg   return gen_rtx_REG (mode, 0);
   1269  1.1  mrg }
   1270  1.1  mrg 
   1271  1.1  mrg /* Worker function for TARGET_FUNCTION_VALUE_REGNO_P.
   1272  1.1  mrg 
   1273  1.1  mrg   ??? What about r1 in DI/DF values.  */
   1274  1.1  mrg 
   1275  1.1  mrg static bool
   1276  1.1  mrg m32r_function_value_regno_p (const unsigned int regno)
   1277  1.1  mrg {
   1278  1.1  mrg   return (regno == 0);
   1279  1.1  mrg }
   1280  1.1  mrg 
   1281  1.1  mrg /* Do any needed setup for a variadic function.  For the M32R, we must
   1282  1.1  mrg    create a register parameter block, and then copy any anonymous arguments
   1283  1.1  mrg    in registers to memory.
   1284  1.1  mrg 
   1285  1.1  mrg    CUM has not been updated for the last named argument (which is given
   1286  1.1  mrg    by ARG), and we rely on this fact.  */
   1287  1.1  mrg 
   1288  1.1  mrg static void
   1289  1.1  mrg m32r_setup_incoming_varargs (cumulative_args_t cum,
   1290  1.1  mrg 			     const function_arg_info &arg,
   1291  1.1  mrg 			     int *pretend_size, int no_rtl)
   1292  1.1  mrg {
   1293  1.1  mrg   int first_anon_arg;
   1294  1.1  mrg 
   1295  1.1  mrg   if (no_rtl)
   1296  1.1  mrg     return;
   1297  1.1  mrg 
   1298  1.1  mrg   /* All BLKmode values are passed by reference.  */
   1299  1.1  mrg   gcc_assert (arg.mode != BLKmode);
   1300  1.1  mrg 
   1301  1.1  mrg   first_anon_arg = (ROUND_ADVANCE_CUM (*get_cumulative_args (cum),
   1302  1.1  mrg 				       arg.mode, arg.type)
   1303  1.1  mrg 		    + ROUND_ADVANCE_ARG (arg.mode, arg.type));
   1304  1.1  mrg 
   1305  1.1  mrg   if (first_anon_arg < M32R_MAX_PARM_REGS)
   1306  1.1  mrg     {
   1307  1.1  mrg       /* Note that first_reg_offset < M32R_MAX_PARM_REGS.  */
   1308  1.1  mrg       int first_reg_offset = first_anon_arg;
   1309  1.1  mrg       /* Size in words to "pretend" allocate.  */
   1310  1.1  mrg       int size = M32R_MAX_PARM_REGS - first_reg_offset;
   1311  1.1  mrg       rtx regblock;
   1312  1.1  mrg 
   1313  1.1  mrg       regblock = gen_frame_mem (BLKmode,
   1314  1.1  mrg 				plus_constant (Pmode, arg_pointer_rtx,
   1315  1.1  mrg 					       FIRST_PARM_OFFSET (0)));
   1316  1.1  mrg       set_mem_alias_set (regblock, get_varargs_alias_set ());
   1317  1.1  mrg       move_block_from_reg (first_reg_offset, regblock, size);
   1318  1.1  mrg 
   1319  1.1  mrg       *pretend_size = (size * UNITS_PER_WORD);
   1320  1.1  mrg     }
   1321  1.1  mrg }
   1322  1.1  mrg 
   1323  1.1  mrg 
   1324  1.1  mrg /* Return true if INSN is real instruction bearing insn.  */
   1326  1.1  mrg 
   1327  1.1  mrg static int
   1328  1.1  mrg m32r_is_insn (rtx insn)
   1329  1.1  mrg {
   1330  1.1  mrg   return (NONDEBUG_INSN_P (insn)
   1331  1.1  mrg 	  && GET_CODE (PATTERN (insn)) != USE
   1332  1.1  mrg 	  && GET_CODE (PATTERN (insn)) != CLOBBER);
   1333  1.1  mrg }
   1334  1.1  mrg 
   1335  1.1  mrg /* Increase the priority of long instructions so that the
   1336  1.1  mrg    short instructions are scheduled ahead of the long ones.  */
   1337  1.1  mrg 
   1338  1.1  mrg static int
   1339  1.1  mrg m32r_adjust_priority (rtx_insn *insn, int priority)
   1340  1.1  mrg {
   1341  1.1  mrg   if (m32r_is_insn (insn)
   1342  1.1  mrg       && get_attr_insn_size (insn) != INSN_SIZE_SHORT)
   1343  1.1  mrg     priority <<= 3;
   1344  1.1  mrg 
   1345  1.1  mrg   return priority;
   1346  1.1  mrg }
   1347  1.1  mrg 
   1348  1.1  mrg 
   1349  1.1  mrg /* Indicate how many instructions can be issued at the same time.
   1351  1.1  mrg    This is sort of a lie.  The m32r can issue only 1 long insn at
   1352  1.1  mrg    once, but it can issue 2 short insns.  The default therefore is
   1353  1.1  mrg    set at 2, but this can be overridden by the command line option
   1354  1.1  mrg    -missue-rate=1.  */
   1355  1.1  mrg 
   1356  1.1  mrg static int
   1357  1.1  mrg m32r_issue_rate (void)
   1358  1.1  mrg {
   1359  1.1  mrg   return ((TARGET_LOW_ISSUE_RATE) ? 1 : 2);
   1360  1.1  mrg }
   1361  1.1  mrg 
   1362  1.1  mrg /* Cost functions.  */
   1364  1.1  mrg /* Memory is 3 times as expensive as registers.
   1365  1.1  mrg    ??? Is that the right way to look at it?  */
   1366  1.1  mrg 
   1367  1.1  mrg static int
   1368  1.1  mrg m32r_memory_move_cost (machine_mode mode,
   1369  1.1  mrg 		       reg_class_t rclass ATTRIBUTE_UNUSED,
   1370  1.1  mrg 		       bool in ATTRIBUTE_UNUSED)
   1371  1.1  mrg {
   1372  1.1  mrg   if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
   1373  1.1  mrg     return 6;
   1374  1.1  mrg   else
   1375  1.1  mrg     return 12;
   1376  1.1  mrg }
   1377  1.1  mrg 
   1378  1.1  mrg static bool
   1379  1.1  mrg m32r_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED,
   1380  1.1  mrg 		int outer_code ATTRIBUTE_UNUSED,
   1381  1.1  mrg 		int opno ATTRIBUTE_UNUSED, int *total,
   1382  1.1  mrg 		bool speed ATTRIBUTE_UNUSED)
   1383  1.1  mrg {
   1384  1.1  mrg   int code = GET_CODE (x);
   1385  1.1  mrg 
   1386  1.1  mrg   switch (code)
   1387  1.1  mrg     {
   1388  1.1  mrg       /* Small integers are as cheap as registers.  4 byte values can be
   1389  1.1  mrg          fetched as immediate constants - let's give that the cost of an
   1390  1.1  mrg          extra insn.  */
   1391  1.1  mrg     case CONST_INT:
   1392  1.1  mrg       if (INT16_P (INTVAL (x)))
   1393  1.1  mrg 	{
   1394  1.1  mrg 	  *total = 0;
   1395  1.1  mrg 	  return true;
   1396  1.1  mrg 	}
   1397  1.1  mrg       /* FALLTHRU */
   1398  1.1  mrg 
   1399  1.1  mrg     case CONST:
   1400  1.1  mrg     case LABEL_REF:
   1401  1.1  mrg     case SYMBOL_REF:
   1402  1.1  mrg       *total = COSTS_N_INSNS (1);
   1403  1.1  mrg       return true;
   1404  1.1  mrg 
   1405  1.1  mrg     case CONST_DOUBLE:
   1406  1.1  mrg       {
   1407  1.1  mrg 	rtx high, low;
   1408  1.1  mrg 
   1409  1.1  mrg 	split_double (x, &high, &low);
   1410  1.1  mrg 	*total = COSTS_N_INSNS (!INT16_P (INTVAL (high))
   1411  1.1  mrg 			        + !INT16_P (INTVAL (low)));
   1412  1.1  mrg 	return true;
   1413  1.1  mrg       }
   1414  1.1  mrg 
   1415  1.1  mrg     case MULT:
   1416  1.1  mrg       *total = COSTS_N_INSNS (3);
   1417  1.1  mrg       return true;
   1418  1.1  mrg 
   1419  1.1  mrg     case DIV:
   1420  1.1  mrg     case UDIV:
   1421  1.1  mrg     case MOD:
   1422  1.1  mrg     case UMOD:
   1423  1.1  mrg       *total = COSTS_N_INSNS (10);
   1424  1.1  mrg       return true;
   1425  1.1  mrg 
   1426  1.1  mrg     default:
   1427  1.1  mrg       return false;
   1428  1.1  mrg     }
   1429  1.1  mrg }
   1430  1.1  mrg 
   1431  1.1  mrg /* Type of function DECL.
   1433  1.1  mrg 
   1434  1.1  mrg    The result is cached.  To reset the cache at the end of a function,
   1435  1.1  mrg    call with DECL = NULL_TREE.  */
   1436  1.1  mrg 
   1437  1.1  mrg enum m32r_function_type
   1438  1.1  mrg m32r_compute_function_type (tree decl)
   1439  1.1  mrg {
   1440  1.1  mrg   /* Cached value.  */
   1441  1.1  mrg   static enum m32r_function_type fn_type = M32R_FUNCTION_UNKNOWN;
   1442  1.1  mrg   /* Last function we were called for.  */
   1443  1.1  mrg   static tree last_fn = NULL_TREE;
   1444  1.1  mrg 
   1445  1.1  mrg   /* Resetting the cached value?  */
   1446  1.1  mrg   if (decl == NULL_TREE)
   1447  1.1  mrg     {
   1448  1.1  mrg       fn_type = M32R_FUNCTION_UNKNOWN;
   1449  1.1  mrg       last_fn = NULL_TREE;
   1450  1.1  mrg       return fn_type;
   1451  1.1  mrg     }
   1452  1.1  mrg 
   1453  1.1  mrg   if (decl == last_fn && fn_type != M32R_FUNCTION_UNKNOWN)
   1454  1.1  mrg     return fn_type;
   1455  1.1  mrg 
   1456  1.1  mrg   /* Compute function type.  */
   1457  1.1  mrg   fn_type = (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl)) != NULL_TREE
   1458  1.1  mrg 	     ? M32R_FUNCTION_INTERRUPT
   1459  1.1  mrg 	     : M32R_FUNCTION_NORMAL);
   1460  1.1  mrg 
   1461  1.1  mrg   last_fn = decl;
   1462  1.1  mrg   return fn_type;
   1463  1.1  mrg }
   1464  1.1  mrg /* Function prologue/epilogue handlers.  */
   1466  1.1  mrg 
   1467  1.1  mrg /* M32R stack frames look like:
   1468  1.1  mrg 
   1469  1.1  mrg              Before call                       After call
   1470  1.1  mrg         +-----------------------+       +-----------------------+
   1471  1.1  mrg         |                       |       |                       |
   1472  1.1  mrg    high |  local variables,     |       |  local variables,     |
   1473  1.1  mrg    mem  |  reg save area, etc.  |       |  reg save area, etc.  |
   1474  1.1  mrg         |                       |       |                       |
   1475  1.1  mrg         +-----------------------+       +-----------------------+
   1476  1.1  mrg         |                       |       |                       |
   1477  1.1  mrg         |  arguments on stack.  |       |  arguments on stack.  |
   1478  1.1  mrg         |                       |       |                       |
   1479  1.1  mrg   SP+0->+-----------------------+       +-----------------------+
   1480  1.1  mrg                                         |  reg parm save area,  |
   1481  1.1  mrg                                         |  only created for     |
   1482  1.1  mrg                                         |  variable argument    |
   1483  1.1  mrg                                         |  functions            |
   1484  1.1  mrg 					+-----------------------+
   1485  1.1  mrg                                         |   previous frame ptr  |
   1486  1.1  mrg                                         +-----------------------+
   1487  1.1  mrg                                         |                       |
   1488  1.1  mrg                                         |  register save area   |
   1489  1.1  mrg                                         |                       |
   1490  1.1  mrg 					+-----------------------+
   1491  1.1  mrg                                         |    return address     |
   1492  1.1  mrg                                         +-----------------------+
   1493  1.1  mrg                                         |                       |
   1494  1.1  mrg                                         |  local variables      |
   1495  1.1  mrg                                         |                       |
   1496  1.1  mrg                                         +-----------------------+
   1497  1.1  mrg                                         |                       |
   1498  1.1  mrg                                         |  alloca allocations   |
   1499  1.1  mrg                                         |                       |
   1500  1.1  mrg                                         +-----------------------+
   1501  1.1  mrg                                         |                       |
   1502  1.1  mrg    low                                  |  arguments on stack   |
   1503  1.1  mrg    memory                               |                       |
   1504  1.1  mrg                                   SP+0->+-----------------------+
   1505  1.1  mrg 
   1506  1.1  mrg Notes:
   1507  1.1  mrg 1) The "reg parm save area" does not exist for non variable argument fns.
   1508  1.1  mrg 2) The "reg parm save area" can be eliminated completely if we saved regs
   1509  1.1  mrg    containing anonymous args separately but that complicates things too
   1510  1.1  mrg    much (so it's not done).
   1511  1.1  mrg 3) The return address is saved after the register save area so as to have as
   1512  1.1  mrg    many insns as possible between the restoration of `lr' and the `jmp lr'.  */
   1513  1.1  mrg 
   1514  1.1  mrg /* Structure to be filled in by m32r_compute_frame_size with register
   1515  1.1  mrg    save masks, and offsets for the current function.  */
   1516  1.1  mrg struct m32r_frame_info
   1517  1.1  mrg {
   1518  1.1  mrg   unsigned int total_size;	/* # bytes that the entire frame takes up.  */
   1519  1.1  mrg   unsigned int extra_size;	/* # bytes of extra stuff.  */
   1520  1.1  mrg   unsigned int pretend_size;	/* # bytes we push and pretend caller did.  */
   1521  1.1  mrg   unsigned int args_size;	/* # bytes that outgoing arguments take up.  */
   1522  1.1  mrg   unsigned int reg_size;	/* # bytes needed to store regs.  */
   1523  1.1  mrg   unsigned int var_size;	/* # bytes that variables take up.  */
   1524  1.1  mrg   unsigned int gmask;		/* Mask of saved gp registers.  */
   1525  1.1  mrg   unsigned int save_fp;		/* Nonzero if fp must be saved.  */
   1526  1.1  mrg   unsigned int save_lr;		/* Nonzero if lr (return addr) must be saved.  */
   1527  1.1  mrg   int          initialized;	/* Nonzero if frame size already calculated.  */
   1528  1.1  mrg };
   1529  1.1  mrg 
   1530  1.1  mrg /* Current frame information calculated by m32r_compute_frame_size.  */
   1531  1.1  mrg static struct m32r_frame_info current_frame_info;
   1532  1.1  mrg 
   1533  1.1  mrg /* Zero structure to initialize current_frame_info.  */
   1534  1.1  mrg static struct m32r_frame_info zero_frame_info;
   1535  1.1  mrg 
   1536  1.1  mrg #define FRAME_POINTER_MASK (1 << (FRAME_POINTER_REGNUM))
   1537  1.1  mrg #define RETURN_ADDR_MASK   (1 << (RETURN_ADDR_REGNUM))
   1538  1.1  mrg 
   1539  1.1  mrg /* Tell prologue and epilogue if register REGNO should be saved / restored.
   1540  1.1  mrg    The return address and frame pointer are treated separately.
   1541  1.1  mrg    Don't consider them here.  */
   1542  1.1  mrg #define MUST_SAVE_REGISTER(regno, interrupt_p) \
   1543  1.1  mrg   ((regno) != RETURN_ADDR_REGNUM && (regno) != FRAME_POINTER_REGNUM \
   1544  1.1  mrg    && (df_regs_ever_live_p (regno) && (!call_used_regs[regno] || interrupt_p)))
   1545  1.1  mrg 
   1546  1.1  mrg #define MUST_SAVE_FRAME_POINTER (df_regs_ever_live_p (FRAME_POINTER_REGNUM))
   1547  1.1  mrg #define MUST_SAVE_RETURN_ADDR   (df_regs_ever_live_p (RETURN_ADDR_REGNUM) || crtl->profile)
   1548  1.1  mrg 
   1549  1.1  mrg #define SHORT_INSN_SIZE 2	/* Size of small instructions.  */
   1550  1.1  mrg #define LONG_INSN_SIZE 4	/* Size of long instructions.  */
   1551  1.1  mrg 
   1552  1.1  mrg /* Return the bytes needed to compute the frame pointer from the current
   1553  1.1  mrg    stack pointer.
   1554  1.1  mrg 
   1555  1.1  mrg    SIZE is the size needed for local variables.  */
   1556  1.1  mrg 
   1557  1.1  mrg unsigned int
   1558  1.1  mrg m32r_compute_frame_size (poly_int64 size)   /* # of var. bytes allocated.  */
   1559  1.1  mrg {
   1560  1.1  mrg   unsigned int regno;
   1561  1.1  mrg   unsigned int total_size, var_size, args_size, pretend_size, extra_size;
   1562  1.1  mrg   unsigned int reg_size;
   1563  1.1  mrg   unsigned int gmask;
   1564  1.1  mrg   enum m32r_function_type fn_type;
   1565  1.1  mrg   int interrupt_p;
   1566  1.1  mrg   int pic_reg_used = flag_pic && (crtl->uses_pic_offset_table
   1567  1.1  mrg                                   | crtl->profile);
   1568  1.1  mrg 
   1569  1.1  mrg   var_size	= M32R_STACK_ALIGN (size);
   1570  1.1  mrg   args_size	= M32R_STACK_ALIGN (crtl->outgoing_args_size);
   1571  1.1  mrg   pretend_size	= crtl->args.pretend_args_size;
   1572  1.1  mrg   extra_size	= FIRST_PARM_OFFSET (0);
   1573  1.1  mrg   total_size	= extra_size + pretend_size + args_size + var_size;
   1574  1.1  mrg   reg_size	= 0;
   1575  1.1  mrg   gmask		= 0;
   1576  1.1  mrg 
   1577  1.1  mrg   /* See if this is an interrupt handler.  Call used registers must be saved
   1578  1.1  mrg      for them too.  */
   1579  1.1  mrg   fn_type = m32r_compute_function_type (current_function_decl);
   1580  1.1  mrg   interrupt_p = M32R_INTERRUPT_P (fn_type);
   1581  1.1  mrg 
   1582  1.1  mrg   /* Calculate space needed for registers.  */
   1583  1.1  mrg   for (regno = 0; regno < M32R_MAX_INT_REGS; regno++)
   1584  1.1  mrg     {
   1585  1.1  mrg       if (MUST_SAVE_REGISTER (regno, interrupt_p)
   1586  1.1  mrg           || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
   1587  1.1  mrg 	{
   1588  1.1  mrg 	  reg_size += UNITS_PER_WORD;
   1589  1.1  mrg 	  gmask |= 1 << regno;
   1590  1.1  mrg 	}
   1591  1.1  mrg     }
   1592  1.1  mrg 
   1593  1.1  mrg   current_frame_info.save_fp = MUST_SAVE_FRAME_POINTER;
   1594  1.1  mrg   current_frame_info.save_lr = MUST_SAVE_RETURN_ADDR || pic_reg_used;
   1595  1.1  mrg 
   1596  1.1  mrg   reg_size += ((current_frame_info.save_fp + current_frame_info.save_lr)
   1597  1.1  mrg 	       * UNITS_PER_WORD);
   1598  1.1  mrg   total_size += reg_size;
   1599  1.1  mrg 
   1600  1.1  mrg   /* ??? Not sure this is necessary, and I don't think the epilogue
   1601  1.1  mrg      handler will do the right thing if this changes total_size.  */
   1602  1.1  mrg   total_size = M32R_STACK_ALIGN (total_size);
   1603  1.1  mrg 
   1604  1.1  mrg   /* frame_size = total_size - (pretend_size + reg_size); */
   1605  1.1  mrg 
   1606  1.1  mrg   /* Save computed information.  */
   1607  1.1  mrg   current_frame_info.total_size   = total_size;
   1608  1.1  mrg   current_frame_info.extra_size   = extra_size;
   1609  1.1  mrg   current_frame_info.pretend_size = pretend_size;
   1610  1.1  mrg   current_frame_info.var_size     = var_size;
   1611  1.1  mrg   current_frame_info.args_size    = args_size;
   1612  1.1  mrg   current_frame_info.reg_size	  = reg_size;
   1613  1.1  mrg   current_frame_info.gmask	  = gmask;
   1614  1.1  mrg   current_frame_info.initialized  = reload_completed;
   1615  1.1  mrg 
   1616  1.1  mrg   /* Ok, we're done.  */
   1617  1.1  mrg   return total_size;
   1618  1.1  mrg }
   1619  1.1  mrg 
   1620  1.1  mrg /* Worker function for TARGET_CAN_ELIMINATE.  */
   1621  1.1  mrg 
   1622  1.1  mrg bool
   1623  1.1  mrg m32r_can_eliminate (const int from, const int to)
   1624  1.1  mrg {
   1625  1.1  mrg   return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
   1626  1.1  mrg           ? ! frame_pointer_needed
   1627  1.1  mrg           : true);
   1628  1.1  mrg }
   1629  1.1  mrg 
   1630  1.1  mrg 
   1631  1.1  mrg /* The table we use to reference PIC data.  */
   1633  1.1  mrg static rtx global_offset_table;
   1634  1.1  mrg 
   1635  1.1  mrg static void
   1636  1.1  mrg m32r_reload_lr (rtx sp, int size)
   1637  1.1  mrg {
   1638  1.1  mrg   rtx lr = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
   1639  1.1  mrg 
   1640  1.1  mrg   if (size == 0)
   1641  1.1  mrg     emit_insn (gen_movsi (lr, gen_frame_mem (Pmode, sp)));
   1642  1.1  mrg   else if (size < 32768)
   1643  1.1  mrg     emit_insn (gen_movsi (lr, gen_frame_mem (Pmode,
   1644  1.1  mrg 					     gen_rtx_PLUS (Pmode, sp,
   1645  1.1  mrg 							   GEN_INT (size)))));
   1646  1.1  mrg   else
   1647  1.1  mrg     {
   1648  1.1  mrg       rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
   1649  1.1  mrg 
   1650  1.1  mrg       emit_insn (gen_movsi (tmp, GEN_INT (size)));
   1651  1.1  mrg       emit_insn (gen_addsi3 (tmp, tmp, sp));
   1652  1.1  mrg       emit_insn (gen_movsi (lr, gen_frame_mem (Pmode, tmp)));
   1653  1.1  mrg     }
   1654  1.1  mrg 
   1655  1.1  mrg   emit_use (lr);
   1656  1.1  mrg }
   1657  1.1  mrg 
   1658  1.1  mrg void
   1659  1.1  mrg m32r_load_pic_register (void)
   1660  1.1  mrg {
   1661  1.1  mrg   global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
   1662  1.1  mrg   emit_insn (gen_get_pc (pic_offset_table_rtx, global_offset_table,
   1663  1.1  mrg                          GEN_INT (TARGET_MODEL_SMALL)));
   1664  1.1  mrg 
   1665  1.1  mrg   /* Need to emit this whether or not we obey regdecls,
   1666  1.1  mrg      since setjmp/longjmp can cause life info to screw up.  */
   1667  1.1  mrg   emit_use (pic_offset_table_rtx);
   1668  1.1  mrg }
   1669  1.1  mrg 
   1670  1.1  mrg /* Expand the m32r prologue as a series of insns.  */
   1671  1.1  mrg 
   1672  1.1  mrg void
   1673  1.1  mrg m32r_expand_prologue (void)
   1674  1.1  mrg {
   1675  1.1  mrg   int regno;
   1676  1.1  mrg   int frame_size;
   1677  1.1  mrg   unsigned int gmask;
   1678  1.1  mrg   int pic_reg_used = flag_pic && (crtl->uses_pic_offset_table
   1679  1.1  mrg                                   | crtl->profile);
   1680  1.1  mrg 
   1681  1.1  mrg   if (! current_frame_info.initialized)
   1682  1.1  mrg     m32r_compute_frame_size (get_frame_size ());
   1683  1.1  mrg 
   1684  1.1  mrg   if (flag_stack_usage_info)
   1685  1.1  mrg     current_function_static_stack_size = current_frame_info.total_size;
   1686  1.1  mrg 
   1687  1.1  mrg   gmask = current_frame_info.gmask;
   1688  1.1  mrg 
   1689  1.1  mrg   /* These cases shouldn't happen.  Catch them now.  */
   1690  1.1  mrg   gcc_assert (current_frame_info.total_size || !gmask);
   1691  1.1  mrg 
   1692  1.1  mrg   /* Allocate space for register arguments if this is a variadic function.  */
   1693  1.1  mrg   if (current_frame_info.pretend_size != 0)
   1694  1.1  mrg     {
   1695  1.1  mrg       /* Use a HOST_WIDE_INT temporary, since negating an unsigned int gives
   1696  1.1  mrg 	 the wrong result on a 64-bit host.  */
   1697  1.1  mrg       HOST_WIDE_INT pretend_size = current_frame_info.pretend_size;
   1698  1.1  mrg       emit_insn (gen_addsi3 (stack_pointer_rtx,
   1699  1.1  mrg 			     stack_pointer_rtx,
   1700  1.1  mrg 			     GEN_INT (-pretend_size)));
   1701  1.1  mrg     }
   1702  1.1  mrg 
   1703  1.1  mrg   /* Save any registers we need to and set up fp.  */
   1704  1.1  mrg   if (current_frame_info.save_fp)
   1705  1.1  mrg     emit_insn (gen_movsi_push (stack_pointer_rtx, frame_pointer_rtx));
   1706  1.1  mrg 
   1707  1.1  mrg   gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
   1708  1.1  mrg 
   1709  1.1  mrg   /* Save any needed call-saved regs (and call-used if this is an
   1710  1.1  mrg      interrupt handler).  */
   1711  1.1  mrg   for (regno = 0; regno <= M32R_MAX_INT_REGS; ++regno)
   1712  1.1  mrg     {
   1713  1.1  mrg       if ((gmask & (1 << regno)) != 0)
   1714  1.1  mrg 	emit_insn (gen_movsi_push (stack_pointer_rtx,
   1715  1.1  mrg 				   gen_rtx_REG (Pmode, regno)));
   1716  1.1  mrg     }
   1717  1.1  mrg 
   1718  1.1  mrg   if (current_frame_info.save_lr)
   1719  1.1  mrg     emit_insn (gen_movsi_push (stack_pointer_rtx,
   1720  1.1  mrg 			       gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
   1721  1.1  mrg 
   1722  1.1  mrg   /* Allocate the stack frame.  */
   1723  1.1  mrg   frame_size = (current_frame_info.total_size
   1724  1.1  mrg 		- (current_frame_info.pretend_size
   1725  1.1  mrg 		   + current_frame_info.reg_size));
   1726  1.1  mrg 
   1727  1.1  mrg   if (frame_size == 0)
   1728  1.1  mrg     ; /* Nothing to do.  */
   1729  1.1  mrg   else if (frame_size <= 32768)
   1730  1.1  mrg     emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
   1731  1.1  mrg 			   GEN_INT (-frame_size)));
   1732  1.1  mrg   else
   1733  1.1  mrg     {
   1734  1.1  mrg       rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
   1735  1.1  mrg 
   1736  1.1  mrg       emit_insn (gen_movsi (tmp, GEN_INT (frame_size)));
   1737  1.1  mrg       emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, tmp));
   1738  1.1  mrg     }
   1739  1.1  mrg 
   1740  1.1  mrg   if (frame_pointer_needed)
   1741  1.1  mrg     emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx));
   1742  1.1  mrg 
   1743  1.1  mrg   if (crtl->profile)
   1744  1.1  mrg     /* Push lr for mcount (form_pc, x).  */
   1745  1.1  mrg     emit_insn (gen_movsi_push (stack_pointer_rtx,
   1746  1.1  mrg                                gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
   1747  1.1  mrg 
   1748  1.1  mrg   if (pic_reg_used)
   1749  1.1  mrg     {
   1750  1.1  mrg       m32r_load_pic_register ();
   1751  1.1  mrg       m32r_reload_lr (stack_pointer_rtx,
   1752  1.1  mrg                       (crtl->profile ? 0 : frame_size));
   1753  1.1  mrg     }
   1754  1.1  mrg 
   1755  1.1  mrg   if (crtl->profile && !pic_reg_used)
   1756  1.1  mrg     emit_insn (gen_blockage ());
   1757  1.1  mrg }
   1758  1.1  mrg 
   1759  1.1  mrg 
   1760  1.1  mrg /* Set up the stack and frame pointer (if desired) for the function.
   1762  1.1  mrg    Note, if this is changed, you need to mirror the changes in
   1763  1.1  mrg    m32r_compute_frame_size which calculates the prolog size.  */
   1764  1.1  mrg 
   1765  1.1  mrg static void
   1766  1.1  mrg m32r_output_function_prologue (FILE * file)
   1767  1.1  mrg {
   1768  1.1  mrg   enum m32r_function_type fn_type = m32r_compute_function_type (current_function_decl);
   1769  1.1  mrg 
   1770  1.1  mrg   /* If this is an interrupt handler, mark it as such.  */
   1771  1.1  mrg   if (M32R_INTERRUPT_P (fn_type))
   1772  1.1  mrg     fprintf (file, "\t%s interrupt handler\n", ASM_COMMENT_START);
   1773  1.1  mrg 
   1774  1.1  mrg   if (! current_frame_info.initialized)
   1775  1.1  mrg     m32r_compute_frame_size (get_frame_size ());
   1776  1.1  mrg 
   1777  1.1  mrg   /* This is only for the human reader.  */
   1778  1.1  mrg   fprintf (file,
   1779  1.1  mrg 	   "\t%s PROLOGUE, vars= %d, regs= %d, args= %d, extra= %d\n",
   1780  1.1  mrg 	   ASM_COMMENT_START,
   1781  1.1  mrg 	   current_frame_info.var_size,
   1782  1.1  mrg 	   current_frame_info.reg_size / 4,
   1783  1.1  mrg 	   current_frame_info.args_size,
   1784  1.1  mrg 	   current_frame_info.extra_size);
   1785  1.1  mrg }
   1786  1.1  mrg 
   1787  1.1  mrg /* Output RTL to pop register REGNO from the stack.  */
   1789  1.1  mrg 
   1790  1.1  mrg static void
   1791  1.1  mrg pop (int regno)
   1792  1.1  mrg {
   1793  1.1  mrg   rtx x;
   1794  1.1  mrg 
   1795  1.1  mrg   x = emit_insn (gen_movsi_pop (gen_rtx_REG (Pmode, regno),
   1796  1.1  mrg 				stack_pointer_rtx));
   1797  1.1  mrg   add_reg_note (x, REG_INC, stack_pointer_rtx);
   1798  1.1  mrg }
   1799  1.1  mrg 
   1800  1.1  mrg /* Expand the m32r epilogue as a series of insns.  */
   1801  1.1  mrg 
   1802  1.1  mrg void
   1803  1.1  mrg m32r_expand_epilogue (void)
   1804  1.1  mrg {
   1805  1.1  mrg   int regno;
   1806  1.1  mrg   int noepilogue = FALSE;
   1807  1.1  mrg   int total_size;
   1808  1.1  mrg 
   1809  1.1  mrg   gcc_assert (current_frame_info.initialized);
   1810  1.1  mrg   total_size = current_frame_info.total_size;
   1811  1.1  mrg 
   1812  1.1  mrg   if (total_size == 0)
   1813  1.1  mrg     {
   1814  1.1  mrg       rtx_insn *insn = get_last_insn ();
   1815  1.1  mrg 
   1816  1.1  mrg       /* If the last insn was a BARRIER, we don't have to write any code
   1817  1.1  mrg 	 because a jump (aka return) was put there.  */
   1818  1.1  mrg       if (insn && NOTE_P (insn))
   1819  1.1  mrg 	insn = prev_nonnote_insn (insn);
   1820  1.1  mrg       if (insn && BARRIER_P (insn))
   1821  1.1  mrg 	noepilogue = TRUE;
   1822  1.1  mrg     }
   1823  1.1  mrg 
   1824  1.1  mrg   if (!noepilogue)
   1825  1.1  mrg     {
   1826  1.1  mrg       unsigned int var_size = current_frame_info.var_size;
   1827  1.1  mrg       unsigned int args_size = current_frame_info.args_size;
   1828  1.1  mrg       unsigned int gmask = current_frame_info.gmask;
   1829  1.1  mrg       int can_trust_sp_p = !cfun->calls_alloca;
   1830  1.1  mrg 
   1831  1.1  mrg       if (flag_exceptions)
   1832  1.1  mrg         emit_insn (gen_blockage ());
   1833  1.1  mrg 
   1834  1.1  mrg       /* The first thing to do is point the sp at the bottom of the register
   1835  1.1  mrg 	 save area.  */
   1836  1.1  mrg       if (can_trust_sp_p)
   1837  1.1  mrg 	{
   1838  1.1  mrg 	  unsigned int reg_offset = var_size + args_size;
   1839  1.1  mrg 
   1840  1.1  mrg 	  if (reg_offset == 0)
   1841  1.1  mrg 	    ; /* Nothing to do.  */
   1842  1.1  mrg 	  else if (reg_offset < 32768)
   1843  1.1  mrg 	    emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
   1844  1.1  mrg 			   GEN_INT (reg_offset)));
   1845  1.1  mrg 	  else
   1846  1.1  mrg 	    {
   1847  1.1  mrg 	      rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
   1848  1.1  mrg 
   1849  1.1  mrg 	      emit_insn (gen_movsi (tmp, GEN_INT (reg_offset)));
   1850  1.1  mrg 	      emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
   1851  1.1  mrg 				     tmp));
   1852  1.1  mrg 	    }
   1853  1.1  mrg 	}
   1854  1.1  mrg       else if (frame_pointer_needed)
   1855  1.1  mrg 	{
   1856  1.1  mrg 	  unsigned int reg_offset = var_size + args_size;
   1857  1.1  mrg 
   1858  1.1  mrg 	  if (reg_offset == 0)
   1859  1.1  mrg 	    emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
   1860  1.1  mrg 	  else if (reg_offset < 32768)
   1861  1.1  mrg 	    emit_insn (gen_addsi3 (stack_pointer_rtx, frame_pointer_rtx,
   1862  1.1  mrg 			   GEN_INT (reg_offset)));
   1863  1.1  mrg 	  else
   1864  1.1  mrg 	    {
   1865  1.1  mrg 	      rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
   1866  1.1  mrg 
   1867  1.1  mrg 	      emit_insn (gen_movsi (tmp, GEN_INT (reg_offset)));
   1868  1.1  mrg 	      emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
   1869  1.1  mrg 	      emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
   1870  1.1  mrg 				     tmp));
   1871  1.1  mrg 	    }
   1872  1.1  mrg 	}
   1873  1.1  mrg       else
   1874  1.1  mrg 	gcc_unreachable ();
   1875  1.1  mrg 
   1876  1.1  mrg       if (current_frame_info.save_lr)
   1877  1.1  mrg 	pop (RETURN_ADDR_REGNUM);
   1878  1.1  mrg 
   1879  1.1  mrg       /* Restore any saved registers, in reverse order of course.  */
   1880  1.1  mrg       gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
   1881  1.1  mrg       for (regno = M32R_MAX_INT_REGS - 1; regno >= 0; --regno)
   1882  1.1  mrg 	{
   1883  1.1  mrg 	  if ((gmask & (1L << regno)) != 0)
   1884  1.1  mrg 	    pop (regno);
   1885  1.1  mrg 	}
   1886  1.1  mrg 
   1887  1.1  mrg       if (current_frame_info.save_fp)
   1888  1.1  mrg 	pop (FRAME_POINTER_REGNUM);
   1889  1.1  mrg 
   1890  1.1  mrg       /* Remove varargs area if present.  */
   1891  1.1  mrg       if (current_frame_info.pretend_size != 0)
   1892  1.1  mrg 	emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
   1893  1.1  mrg 			       GEN_INT (current_frame_info.pretend_size)));
   1894  1.1  mrg 
   1895  1.1  mrg       emit_insn (gen_blockage ());
   1896  1.1  mrg     }
   1897  1.1  mrg }
   1898  1.1  mrg 
   1899  1.1  mrg /* Do any necessary cleanup after a function to restore stack, frame,
   1900  1.1  mrg    and regs.  */
   1901  1.1  mrg 
   1902  1.1  mrg static void
   1903  1.1  mrg m32r_output_function_epilogue (FILE *)
   1904  1.1  mrg {
   1905  1.1  mrg   /* Reset state info for each function.  */
   1906  1.1  mrg   current_frame_info = zero_frame_info;
   1907  1.1  mrg   m32r_compute_function_type (NULL_TREE);
   1908  1.1  mrg }
   1909  1.1  mrg 
   1910  1.1  mrg /* Return nonzero if this function is known to have a null or 1 instruction
   1912  1.1  mrg    epilogue.  */
   1913  1.1  mrg 
   1914  1.1  mrg int
   1915  1.1  mrg direct_return (void)
   1916  1.1  mrg {
   1917  1.1  mrg   if (!reload_completed)
   1918  1.1  mrg     return FALSE;
   1919  1.1  mrg 
   1920  1.1  mrg   if (M32R_INTERRUPT_P (m32r_compute_function_type (current_function_decl)))
   1921  1.1  mrg     return FALSE;
   1922  1.1  mrg 
   1923  1.1  mrg   if (! current_frame_info.initialized)
   1924  1.1  mrg     m32r_compute_frame_size (get_frame_size ());
   1925  1.1  mrg 
   1926  1.1  mrg   return current_frame_info.total_size == 0;
   1927  1.1  mrg }
   1928  1.1  mrg 
   1929  1.1  mrg 
   1930  1.1  mrg /* PIC.  */
   1932  1.1  mrg 
   1933  1.1  mrg int
   1934  1.1  mrg m32r_legitimate_pic_operand_p (rtx x)
   1935  1.1  mrg {
   1936  1.1  mrg   if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
   1937  1.1  mrg     return 0;
   1938  1.1  mrg 
   1939  1.1  mrg   if (GET_CODE (x) == CONST
   1940  1.1  mrg       && GET_CODE (XEXP (x, 0)) == PLUS
   1941  1.1  mrg       && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
   1942  1.1  mrg           || GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF)
   1943  1.1  mrg       && (CONST_INT_P (XEXP (XEXP (x, 0), 1))))
   1944  1.1  mrg     return 0;
   1945  1.1  mrg 
   1946  1.1  mrg   return 1;
   1947  1.1  mrg }
   1948  1.1  mrg 
   1949  1.1  mrg rtx
   1950  1.1  mrg m32r_legitimize_pic_address (rtx orig, rtx reg)
   1951  1.1  mrg {
   1952  1.1  mrg #ifdef DEBUG_PIC
   1953  1.1  mrg   printf("m32r_legitimize_pic_address()\n");
   1954  1.1  mrg #endif
   1955  1.1  mrg 
   1956  1.1  mrg   if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
   1957  1.1  mrg     {
   1958  1.1  mrg       rtx pic_ref, address;
   1959  1.1  mrg       int subregs = 0;
   1960  1.1  mrg 
   1961  1.1  mrg       if (reg == 0)
   1962  1.1  mrg         {
   1963  1.1  mrg           gcc_assert (!reload_in_progress && !reload_completed);
   1964  1.1  mrg 	  reg = gen_reg_rtx (Pmode);
   1965  1.1  mrg 
   1966  1.1  mrg           subregs = 1;
   1967  1.1  mrg         }
   1968  1.1  mrg 
   1969  1.1  mrg       if (subregs)
   1970  1.1  mrg         address = gen_reg_rtx (Pmode);
   1971  1.1  mrg       else
   1972  1.1  mrg         address = reg;
   1973  1.1  mrg 
   1974  1.1  mrg       crtl->uses_pic_offset_table = 1;
   1975  1.1  mrg 
   1976  1.1  mrg       if (GET_CODE (orig) == LABEL_REF
   1977  1.1  mrg           || (GET_CODE (orig) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (orig)))
   1978  1.1  mrg         {
   1979  1.1  mrg           emit_insn (gen_gotoff_load_addr (reg, orig));
   1980  1.1  mrg           emit_insn (gen_addsi3 (reg, reg, pic_offset_table_rtx));
   1981  1.1  mrg           return reg;
   1982  1.1  mrg         }
   1983  1.1  mrg 
   1984  1.1  mrg       emit_insn (gen_pic_load_addr (address, orig));
   1985  1.1  mrg 
   1986  1.1  mrg       emit_insn (gen_addsi3 (address, address, pic_offset_table_rtx));
   1987  1.1  mrg       pic_ref = gen_const_mem (Pmode, address);
   1988  1.1  mrg       emit_move_insn (reg, pic_ref);
   1989  1.1  mrg       return reg;
   1990  1.1  mrg     }
   1991  1.1  mrg   else if (GET_CODE (orig) == CONST)
   1992  1.1  mrg     {
   1993  1.1  mrg       rtx base, offset;
   1994  1.1  mrg 
   1995  1.1  mrg       if (GET_CODE (XEXP (orig, 0)) == PLUS
   1996  1.1  mrg           && XEXP (XEXP (orig, 0), 1) == pic_offset_table_rtx)
   1997  1.1  mrg         return orig;
   1998  1.1  mrg 
   1999  1.1  mrg       if (reg == 0)
   2000  1.1  mrg         {
   2001  1.1  mrg           gcc_assert (!reload_in_progress && !reload_completed);
   2002  1.1  mrg 	  reg = gen_reg_rtx (Pmode);
   2003  1.1  mrg         }
   2004  1.1  mrg 
   2005  1.1  mrg       if (GET_CODE (XEXP (orig, 0)) == PLUS)
   2006  1.1  mrg         {
   2007  1.1  mrg           base = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
   2008  1.1  mrg           if (base == reg)
   2009  1.1  mrg             offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), NULL_RTX);
   2010  1.1  mrg           else
   2011  1.1  mrg             offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), reg);
   2012  1.1  mrg         }
   2013  1.1  mrg       else
   2014  1.1  mrg         return orig;
   2015  1.1  mrg 
   2016  1.1  mrg       if (CONST_INT_P (offset))
   2017  1.1  mrg         {
   2018  1.1  mrg           if (INT16_P (INTVAL (offset)))
   2019  1.1  mrg             return plus_constant (Pmode, base, INTVAL (offset));
   2020  1.1  mrg           else
   2021  1.1  mrg 	    {
   2022  1.1  mrg 	      gcc_assert (! reload_in_progress && ! reload_completed);
   2023  1.1  mrg 	      offset = force_reg (Pmode, offset);
   2024  1.1  mrg 	    }
   2025  1.1  mrg         }
   2026  1.1  mrg 
   2027  1.1  mrg       return gen_rtx_PLUS (Pmode, base, offset);
   2028  1.1  mrg     }
   2029  1.1  mrg 
   2030  1.1  mrg   return orig;
   2031  1.1  mrg }
   2032  1.1  mrg 
   2033  1.1  mrg static rtx
   2034  1.1  mrg m32r_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED,
   2035  1.1  mrg 			 machine_mode mode ATTRIBUTE_UNUSED)
   2036  1.1  mrg {
   2037  1.1  mrg   if (flag_pic)
   2038  1.1  mrg     return m32r_legitimize_pic_address (x, NULL_RTX);
   2039  1.1  mrg   else
   2040  1.1  mrg     return x;
   2041  1.1  mrg }
   2042  1.1  mrg 
   2043  1.1  mrg /* Worker function for TARGET_MODE_DEPENDENT_ADDRESS_P.  */
   2044  1.1  mrg 
   2045  1.1  mrg static bool
   2046  1.1  mrg m32r_mode_dependent_address_p (const_rtx addr, addr_space_t as ATTRIBUTE_UNUSED)
   2047  1.1  mrg {
   2048  1.1  mrg   if (GET_CODE (addr) == LO_SUM)
   2049  1.1  mrg     return true;
   2050  1.1  mrg 
   2051  1.1  mrg   return false;
   2052  1.1  mrg }
   2053  1.1  mrg 
   2054  1.1  mrg /* Nested function support.  */
   2056  1.1  mrg 
   2057  1.1  mrg /* Emit RTL insns to initialize the variable parts of a trampoline.
   2058  1.1  mrg    FNADDR is an RTX for the address of the function's pure code.
   2059  1.1  mrg    CXT is an RTX for the static chain value for the function.  */
   2060  1.1  mrg 
   2061  1.1  mrg void
   2062  1.1  mrg m32r_initialize_trampoline (rtx tramp ATTRIBUTE_UNUSED,
   2063  1.1  mrg 			    rtx fnaddr ATTRIBUTE_UNUSED,
   2064  1.1  mrg 			    rtx cxt ATTRIBUTE_UNUSED)
   2065  1.1  mrg {
   2066  1.1  mrg }
   2067  1.1  mrg 
   2068  1.1  mrg static void
   2070  1.1  mrg m32r_file_start (void)
   2071  1.1  mrg {
   2072  1.1  mrg   default_file_start ();
   2073  1.1  mrg 
   2074  1.1  mrg   if (flag_verbose_asm)
   2075  1.1  mrg     fprintf (asm_out_file,
   2076  1.1  mrg 	     "%s M32R/D special options: -G %d\n",
   2077  1.1  mrg 	     ASM_COMMENT_START, g_switch_value);
   2078  1.1  mrg 
   2079  1.1  mrg   if (TARGET_LITTLE_ENDIAN)
   2080  1.1  mrg     fprintf (asm_out_file, "\t.little\n");
   2081  1.1  mrg }
   2082  1.1  mrg 
   2083  1.1  mrg /* Print operand X (an rtx) in assembler syntax to file FILE.
   2085  1.1  mrg    CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
   2086  1.1  mrg    For `%' followed by punctuation, CODE is the punctuation and X is null.  */
   2087  1.1  mrg 
   2088  1.1  mrg static void
   2089  1.1  mrg m32r_print_operand (FILE * file, rtx x, int code)
   2090  1.1  mrg {
   2091  1.1  mrg   rtx addr;
   2092  1.1  mrg 
   2093  1.1  mrg   switch (code)
   2094  1.1  mrg     {
   2095  1.1  mrg       /* The 's' and 'p' codes are used by output_block_move() to
   2096  1.1  mrg 	 indicate post-increment 's'tores and 'p're-increment loads.  */
   2097  1.1  mrg     case 's':
   2098  1.1  mrg       if (REG_P (x))
   2099  1.1  mrg 	fprintf (file, "@+%s", reg_names [REGNO (x)]);
   2100  1.1  mrg       else
   2101  1.1  mrg 	output_operand_lossage ("invalid operand to %%s code");
   2102  1.1  mrg       return;
   2103  1.1  mrg 
   2104  1.1  mrg     case 'p':
   2105  1.1  mrg       if (REG_P (x))
   2106  1.1  mrg 	fprintf (file, "@%s+", reg_names [REGNO (x)]);
   2107  1.1  mrg       else
   2108  1.1  mrg 	output_operand_lossage ("invalid operand to %%p code");
   2109  1.1  mrg       return;
   2110  1.1  mrg 
   2111  1.1  mrg     case 'R' :
   2112  1.1  mrg       /* Write second word of DImode or DFmode reference,
   2113  1.1  mrg 	 register or memory.  */
   2114  1.1  mrg       if (REG_P (x))
   2115  1.1  mrg 	fputs (reg_names[REGNO (x)+1], file);
   2116  1.1  mrg       else if (MEM_P (x))
   2117  1.1  mrg 	{
   2118  1.1  mrg 	  machine_mode mode = GET_MODE (x);
   2119  1.1  mrg 
   2120  1.1  mrg 	  fprintf (file, "@(");
   2121  1.1  mrg 	  /* Handle possible auto-increment.  Since it is pre-increment and
   2122  1.1  mrg 	     we have already done it, we can just use an offset of four.  */
   2123  1.1  mrg 	  /* ??? This is taken from rs6000.cc I think.  I don't think it is
   2124  1.1  mrg 	     currently necessary, but keep it around.  */
   2125  1.1  mrg 	  if (GET_CODE (XEXP (x, 0)) == PRE_INC
   2126  1.1  mrg 	      || GET_CODE (XEXP (x, 0)) == PRE_DEC)
   2127  1.1  mrg 	    output_address (mode, plus_constant (Pmode,
   2128  1.1  mrg 						 XEXP (XEXP (x, 0), 0), 4));
   2129  1.1  mrg 	  else
   2130  1.1  mrg 	    output_address (mode, plus_constant (Pmode, XEXP (x, 0), 4));
   2131  1.1  mrg 	  fputc (')', file);
   2132  1.1  mrg 	}
   2133  1.1  mrg       else
   2134  1.1  mrg 	output_operand_lossage ("invalid operand to %%R code");
   2135  1.1  mrg       return;
   2136  1.1  mrg 
   2137  1.1  mrg     case 'H' : /* High word.  */
   2138  1.1  mrg     case 'L' : /* Low word.  */
   2139  1.1  mrg       if (REG_P (x))
   2140  1.1  mrg 	{
   2141  1.1  mrg 	  /* L = least significant word, H = most significant word.  */
   2142  1.1  mrg 	  if ((WORDS_BIG_ENDIAN != 0) ^ (code == 'L'))
   2143  1.1  mrg 	    fputs (reg_names[REGNO (x)], file);
   2144  1.1  mrg 	  else
   2145  1.1  mrg 	    fputs (reg_names[REGNO (x)+1], file);
   2146  1.1  mrg 	}
   2147  1.1  mrg       else if (CONST_INT_P (x)
   2148  1.1  mrg 	       || GET_CODE (x) == CONST_DOUBLE)
   2149  1.1  mrg 	{
   2150  1.1  mrg 	  rtx first, second;
   2151  1.1  mrg 
   2152  1.1  mrg 	  split_double (x, &first, &second);
   2153  1.1  mrg 	  fprintf (file, HOST_WIDE_INT_PRINT_HEX,
   2154  1.1  mrg 		   code == 'L' ? INTVAL (first) : INTVAL (second));
   2155  1.1  mrg 	}
   2156  1.1  mrg       else
   2157  1.1  mrg 	output_operand_lossage ("invalid operand to %%H/%%L code");
   2158  1.1  mrg       return;
   2159  1.1  mrg 
   2160  1.1  mrg     case 'A' :
   2161  1.1  mrg       {
   2162  1.1  mrg 	char str[30];
   2163  1.1  mrg 
   2164  1.1  mrg 	if (GET_CODE (x) != CONST_DOUBLE
   2165  1.1  mrg 	    || GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT)
   2166  1.1  mrg 	  fatal_insn ("bad insn for 'A'", x);
   2167  1.1  mrg 
   2168  1.1  mrg 	real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (x), sizeof (str), 0, 1);
   2169  1.1  mrg 	fprintf (file, "%s", str);
   2170  1.1  mrg 	return;
   2171  1.1  mrg       }
   2172  1.1  mrg 
   2173  1.1  mrg     case 'B' : /* Bottom half.  */
   2174  1.1  mrg     case 'T' : /* Top half.  */
   2175  1.1  mrg       /* Output the argument to a `seth' insn (sets the Top half-word).
   2176  1.1  mrg 	 For constants output arguments to a seth/or3 pair to set Top and
   2177  1.1  mrg 	 Bottom halves.  For symbols output arguments to a seth/add3 pair to
   2178  1.1  mrg 	 set Top and Bottom halves.  The difference exists because for
   2179  1.1  mrg 	 constants seth/or3 is more readable but for symbols we need to use
   2180  1.1  mrg 	 the same scheme as `ld' and `st' insns (16-bit addend is signed).  */
   2181  1.1  mrg       switch (GET_CODE (x))
   2182  1.1  mrg 	{
   2183  1.1  mrg 	case CONST_INT :
   2184  1.1  mrg 	case CONST_DOUBLE :
   2185  1.1  mrg 	  {
   2186  1.1  mrg 	    rtx first, second;
   2187  1.1  mrg 
   2188  1.1  mrg 	    split_double (x, &first, &second);
   2189  1.1  mrg 	    x = WORDS_BIG_ENDIAN ? second : first;
   2190  1.1  mrg 	    fprintf (file, HOST_WIDE_INT_PRINT_HEX,
   2191  1.1  mrg 		     (code == 'B'
   2192  1.1  mrg 		      ? INTVAL (x) & 0xffff
   2193  1.1  mrg 		      : (INTVAL (x) >> 16) & 0xffff));
   2194  1.1  mrg 	  }
   2195  1.1  mrg 	  return;
   2196  1.1  mrg 	case CONST :
   2197  1.1  mrg 	case SYMBOL_REF :
   2198  1.1  mrg 	  if (code == 'B'
   2199  1.1  mrg 	      && small_data_operand (x, VOIDmode))
   2200  1.1  mrg 	    {
   2201  1.1  mrg 	      fputs ("sda(", file);
   2202  1.1  mrg 	      output_addr_const (file, x);
   2203  1.1  mrg 	      fputc (')', file);
   2204  1.1  mrg 	      return;
   2205  1.1  mrg 	    }
   2206  1.1  mrg 	  /* fall through */
   2207  1.1  mrg 	case LABEL_REF :
   2208  1.1  mrg 	  fputs (code == 'T' ? "shigh(" : "low(", file);
   2209  1.1  mrg 	  output_addr_const (file, x);
   2210  1.1  mrg 	  fputc (')', file);
   2211  1.1  mrg 	  return;
   2212  1.1  mrg 	default :
   2213  1.1  mrg 	  output_operand_lossage ("invalid operand to %%T/%%B code");
   2214  1.1  mrg 	  return;
   2215  1.1  mrg 	}
   2216  1.1  mrg       break;
   2217  1.1  mrg 
   2218  1.1  mrg     case 'U' :
   2219  1.1  mrg       /* ??? wip */
   2220  1.1  mrg       /* Output a load/store with update indicator if appropriate.  */
   2221  1.1  mrg       if (MEM_P (x))
   2222  1.1  mrg 	{
   2223  1.1  mrg 	  if (GET_CODE (XEXP (x, 0)) == PRE_INC
   2224  1.1  mrg 	      || GET_CODE (XEXP (x, 0)) == PRE_DEC)
   2225  1.1  mrg 	    fputs (".a", file);
   2226  1.1  mrg 	}
   2227  1.1  mrg       else
   2228  1.1  mrg 	output_operand_lossage ("invalid operand to %%U code");
   2229  1.1  mrg       return;
   2230  1.1  mrg 
   2231  1.1  mrg     case 'N' :
   2232  1.1  mrg       /* Print a constant value negated.  */
   2233  1.1  mrg       if (CONST_INT_P (x))
   2234  1.1  mrg 	output_addr_const (file, GEN_INT (- INTVAL (x)));
   2235  1.1  mrg       else
   2236  1.1  mrg 	output_operand_lossage ("invalid operand to %%N code");
   2237  1.1  mrg       return;
   2238  1.1  mrg 
   2239  1.1  mrg     case 'X' :
   2240  1.1  mrg       /* Print a const_int in hex.  Used in comments.  */
   2241  1.1  mrg       if (CONST_INT_P (x))
   2242  1.1  mrg 	fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
   2243  1.1  mrg       return;
   2244  1.1  mrg 
   2245  1.1  mrg     case '#' :
   2246  1.1  mrg       fputs (IMMEDIATE_PREFIX, file);
   2247  1.1  mrg       return;
   2248  1.1  mrg 
   2249  1.1  mrg     case 0 :
   2250  1.1  mrg       /* Do nothing special.  */
   2251  1.1  mrg       break;
   2252  1.1  mrg 
   2253  1.1  mrg     default :
   2254  1.1  mrg       /* Unknown flag.  */
   2255  1.1  mrg       output_operand_lossage ("invalid operand output code");
   2256  1.1  mrg     }
   2257  1.1  mrg 
   2258  1.1  mrg   switch (GET_CODE (x))
   2259  1.1  mrg     {
   2260  1.1  mrg     case REG :
   2261  1.1  mrg       fputs (reg_names[REGNO (x)], file);
   2262  1.1  mrg       break;
   2263  1.1  mrg 
   2264  1.1  mrg     case MEM :
   2265  1.1  mrg       addr = XEXP (x, 0);
   2266  1.1  mrg       if (GET_CODE (addr) == PRE_INC)
   2267  1.1  mrg 	{
   2268  1.1  mrg 	  if (!REG_P (XEXP (addr, 0)))
   2269  1.1  mrg 	    fatal_insn ("pre-increment address is not a register", x);
   2270  1.1  mrg 
   2271  1.1  mrg 	  fprintf (file, "@+%s", reg_names[REGNO (XEXP (addr, 0))]);
   2272  1.1  mrg 	}
   2273  1.1  mrg       else if (GET_CODE (addr) == PRE_DEC)
   2274  1.1  mrg 	{
   2275  1.1  mrg 	  if (!REG_P (XEXP (addr, 0)))
   2276  1.1  mrg 	    fatal_insn ("pre-decrement address is not a register", x);
   2277  1.1  mrg 
   2278  1.1  mrg 	  fprintf (file, "@-%s", reg_names[REGNO (XEXP (addr, 0))]);
   2279  1.1  mrg 	}
   2280  1.1  mrg       else if (GET_CODE (addr) == POST_INC)
   2281  1.1  mrg 	{
   2282  1.1  mrg 	  if (!REG_P (XEXP (addr, 0)))
   2283  1.1  mrg 	    fatal_insn ("post-increment address is not a register", x);
   2284  1.1  mrg 
   2285  1.1  mrg 	  fprintf (file, "@%s+", reg_names[REGNO (XEXP (addr, 0))]);
   2286  1.1  mrg 	}
   2287  1.1  mrg       else
   2288  1.1  mrg 	{
   2289  1.1  mrg 	  fputs ("@(", file);
   2290  1.1  mrg 	  output_address (GET_MODE (x), addr);
   2291  1.1  mrg 	  fputc (')', file);
   2292  1.1  mrg 	}
   2293  1.1  mrg       break;
   2294  1.1  mrg 
   2295  1.1  mrg     case CONST_DOUBLE :
   2296  1.1  mrg       /* We handle SFmode constants here as output_addr_const doesn't.  */
   2297  1.1  mrg       if (GET_MODE (x) == SFmode)
   2298  1.1  mrg 	{
   2299  1.1  mrg 	  long l;
   2300  1.1  mrg 
   2301  1.1  mrg 	  REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), l);
   2302  1.1  mrg 	  fprintf (file, "0x%08lx", l);
   2303  1.1  mrg 	  break;
   2304  1.1  mrg 	}
   2305  1.1  mrg 
   2306  1.1  mrg       /* FALLTHRU */
   2307  1.1  mrg       /* Let output_addr_const deal with it.  */
   2308  1.1  mrg 
   2309  1.1  mrg     default :
   2310  1.1  mrg       output_addr_const (file, x);
   2311  1.1  mrg       break;
   2312  1.1  mrg     }
   2313  1.1  mrg }
   2314  1.1  mrg 
   2315  1.1  mrg /* Print a memory address as an operand to reference that memory location.  */
   2316  1.1  mrg 
   2317  1.1  mrg static void
   2318  1.1  mrg m32r_print_operand_address (FILE * file, machine_mode /*mode*/, rtx addr)
   2319  1.1  mrg {
   2320  1.1  mrg   rtx base;
   2321  1.1  mrg   rtx index = 0;
   2322  1.1  mrg   int offset = 0;
   2323  1.1  mrg 
   2324  1.1  mrg   switch (GET_CODE (addr))
   2325  1.1  mrg     {
   2326  1.1  mrg     case REG :
   2327  1.1  mrg       fputs (reg_names[REGNO (addr)], file);
   2328  1.1  mrg       break;
   2329  1.1  mrg 
   2330  1.1  mrg     case PLUS :
   2331  1.1  mrg       if (CONST_INT_P (XEXP (addr, 0)))
   2332  1.1  mrg 	offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
   2333  1.1  mrg       else if (CONST_INT_P (XEXP (addr, 1)))
   2334  1.1  mrg 	offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
   2335  1.1  mrg       else
   2336  1.1  mrg 	base = XEXP (addr, 0), index = XEXP (addr, 1);
   2337  1.1  mrg       if (REG_P (base))
   2338  1.1  mrg 	{
   2339  1.1  mrg 	  /* Print the offset first (if present) to conform to the manual.  */
   2340  1.1  mrg 	  if (index == 0)
   2341  1.1  mrg 	    {
   2342  1.1  mrg 	      if (offset != 0)
   2343  1.1  mrg 		fprintf (file, "%d,", offset);
   2344  1.1  mrg 	      fputs (reg_names[REGNO (base)], file);
   2345  1.1  mrg 	    }
   2346  1.1  mrg 	  /* The chip doesn't support this, but left in for generality.  */
   2347  1.1  mrg 	  else if (REG_P (index))
   2348  1.1  mrg 	    fprintf (file, "%s,%s",
   2349  1.1  mrg 		     reg_names[REGNO (base)], reg_names[REGNO (index)]);
   2350  1.1  mrg 	  /* Not sure this can happen, but leave in for now.  */
   2351  1.1  mrg 	  else if (GET_CODE (index) == SYMBOL_REF)
   2352  1.1  mrg 	    {
   2353  1.1  mrg 	      output_addr_const (file, index);
   2354  1.1  mrg 	      fputc (',', file);
   2355  1.1  mrg 	      fputs (reg_names[REGNO (base)], file);
   2356  1.1  mrg 	    }
   2357  1.1  mrg 	  else
   2358  1.1  mrg 	    fatal_insn ("bad address", addr);
   2359  1.1  mrg 	}
   2360  1.1  mrg       else if (GET_CODE (base) == LO_SUM)
   2361  1.1  mrg 	{
   2362  1.1  mrg 	  gcc_assert (!index && REG_P (XEXP (base, 0)));
   2363  1.1  mrg 	  if (small_data_operand (XEXP (base, 1), VOIDmode))
   2364  1.1  mrg 	    fputs ("sda(", file);
   2365  1.1  mrg 	  else
   2366  1.1  mrg 	    fputs ("low(", file);
   2367  1.1  mrg 	  output_addr_const (file, plus_constant (Pmode, XEXP (base, 1),
   2368  1.1  mrg 						  offset));
   2369  1.1  mrg 	  fputs ("),", file);
   2370  1.1  mrg 	  fputs (reg_names[REGNO (XEXP (base, 0))], file);
   2371  1.1  mrg 	}
   2372  1.1  mrg       else
   2373  1.1  mrg 	fatal_insn ("bad address", addr);
   2374  1.1  mrg       break;
   2375  1.1  mrg 
   2376  1.1  mrg     case LO_SUM :
   2377  1.1  mrg       if (!REG_P (XEXP (addr, 0)))
   2378  1.1  mrg 	fatal_insn ("lo_sum not of register", addr);
   2379  1.1  mrg       if (small_data_operand (XEXP (addr, 1), VOIDmode))
   2380  1.1  mrg 	fputs ("sda(", file);
   2381  1.1  mrg       else
   2382  1.1  mrg 	fputs ("low(", file);
   2383  1.1  mrg       output_addr_const (file, XEXP (addr, 1));
   2384  1.1  mrg       fputs ("),", file);
   2385  1.1  mrg       fputs (reg_names[REGNO (XEXP (addr, 0))], file);
   2386  1.1  mrg       break;
   2387  1.1  mrg 
   2388  1.1  mrg     case PRE_INC :	/* Assume SImode.  */
   2389  1.1  mrg       fprintf (file, "+%s", reg_names[REGNO (XEXP (addr, 0))]);
   2390  1.1  mrg       break;
   2391  1.1  mrg 
   2392  1.1  mrg     case PRE_DEC :	/* Assume SImode.  */
   2393  1.1  mrg       fprintf (file, "-%s", reg_names[REGNO (XEXP (addr, 0))]);
   2394  1.1  mrg       break;
   2395  1.1  mrg 
   2396  1.1  mrg     case POST_INC :	/* Assume SImode.  */
   2397  1.1  mrg       fprintf (file, "%s+", reg_names[REGNO (XEXP (addr, 0))]);
   2398  1.1  mrg       break;
   2399  1.1  mrg 
   2400  1.1  mrg     default :
   2401  1.1  mrg       output_addr_const (file, addr);
   2402  1.1  mrg       break;
   2403  1.1  mrg     }
   2404  1.1  mrg }
   2405  1.1  mrg 
   2406  1.1  mrg static bool
   2407  1.1  mrg m32r_print_operand_punct_valid_p (unsigned char code)
   2408  1.1  mrg {
   2409  1.1  mrg   return m32r_punct_chars[code];
   2410  1.1  mrg }
   2411  1.1  mrg 
   2412  1.1  mrg /* Return true if the operands are the constants 0 and 1.  */
   2413  1.1  mrg 
   2414  1.1  mrg int
   2415  1.1  mrg zero_and_one (rtx operand1, rtx operand2)
   2416  1.1  mrg {
   2417  1.1  mrg   return
   2418  1.1  mrg        CONST_INT_P (operand1)
   2419  1.1  mrg     && CONST_INT_P (operand2)
   2420  1.1  mrg     && (  ((INTVAL (operand1) == 0) && (INTVAL (operand2) == 1))
   2421  1.1  mrg 	||((INTVAL (operand1) == 1) && (INTVAL (operand2) == 0)));
   2422  1.1  mrg }
   2423  1.1  mrg 
   2424  1.1  mrg /* Generate the correct assembler code to handle the conditional loading of a
   2425  1.1  mrg    value into a register.  It is known that the operands satisfy the
   2426  1.1  mrg    conditional_move_operand() function above.  The destination is operand[0].
   2427  1.1  mrg    The condition is operand [1].  The 'true' value is operand [2] and the
   2428  1.1  mrg    'false' value is operand [3].  */
   2429  1.1  mrg 
   2430  1.1  mrg char *
   2431  1.1  mrg emit_cond_move (rtx * operands, rtx insn ATTRIBUTE_UNUSED)
   2432  1.1  mrg {
   2433  1.1  mrg   static char buffer [100];
   2434  1.1  mrg   const char * dest = reg_names [REGNO (operands [0])];
   2435  1.1  mrg 
   2436  1.1  mrg   buffer [0] = 0;
   2437  1.1  mrg 
   2438  1.1  mrg   /* Destination must be a register.  */
   2439  1.1  mrg   gcc_assert (REG_P (operands [0]));
   2440  1.1  mrg   gcc_assert (conditional_move_operand (operands [2], SImode));
   2441  1.1  mrg   gcc_assert (conditional_move_operand (operands [3], SImode));
   2442  1.1  mrg 
   2443  1.1  mrg   /* Check to see if the test is reversed.  */
   2444  1.1  mrg   if (GET_CODE (operands [1]) == NE)
   2445  1.1  mrg     {
   2446  1.1  mrg       rtx tmp = operands [2];
   2447  1.1  mrg       operands [2] = operands [3];
   2448  1.1  mrg       operands [3] = tmp;
   2449  1.1  mrg     }
   2450  1.1  mrg 
   2451  1.1  mrg   sprintf (buffer, "mvfc %s, cbr", dest);
   2452  1.1  mrg 
   2453  1.1  mrg   /* If the true value was '0' then we need to invert the results of the move.  */
   2454  1.1  mrg   if (INTVAL (operands [2]) == 0)
   2455  1.1  mrg     sprintf (buffer + strlen (buffer), "\n\txor3 %s, %s, #1",
   2456  1.1  mrg 	     dest, dest);
   2457  1.1  mrg 
   2458  1.1  mrg   return buffer;
   2459  1.1  mrg }
   2460  1.1  mrg 
   2461  1.1  mrg /* Returns true if the registers contained in the two
   2462  1.1  mrg    rtl expressions are different.  */
   2463  1.1  mrg 
   2464  1.1  mrg int
   2465  1.1  mrg m32r_not_same_reg (rtx a, rtx b)
   2466  1.1  mrg {
   2467  1.1  mrg   int reg_a = -1;
   2468  1.1  mrg   int reg_b = -2;
   2469  1.1  mrg 
   2470  1.1  mrg   while (GET_CODE (a) == SUBREG)
   2471  1.1  mrg     a = SUBREG_REG (a);
   2472  1.1  mrg 
   2473  1.1  mrg   if (REG_P (a))
   2474  1.1  mrg     reg_a = REGNO (a);
   2475  1.1  mrg 
   2476  1.1  mrg   while (GET_CODE (b) == SUBREG)
   2477  1.1  mrg     b = SUBREG_REG (b);
   2478  1.1  mrg 
   2479  1.1  mrg   if (REG_P (b))
   2480  1.1  mrg     reg_b = REGNO (b);
   2481  1.1  mrg 
   2482  1.1  mrg   return reg_a != reg_b;
   2483  1.1  mrg }
   2484  1.1  mrg 
   2485  1.1  mrg 
   2486  1.1  mrg rtx
   2488  1.1  mrg m32r_function_symbol (const char *name)
   2489  1.1  mrg {
   2490  1.1  mrg   int extra_flags = 0;
   2491  1.1  mrg   enum m32r_model model;
   2492  1.1  mrg   rtx sym = gen_rtx_SYMBOL_REF (Pmode, name);
   2493  1.1  mrg 
   2494  1.1  mrg   if (TARGET_MODEL_SMALL)
   2495  1.1  mrg     model = M32R_MODEL_SMALL;
   2496  1.1  mrg   else if (TARGET_MODEL_MEDIUM)
   2497  1.1  mrg     model = M32R_MODEL_MEDIUM;
   2498  1.1  mrg   else if (TARGET_MODEL_LARGE)
   2499  1.1  mrg     model = M32R_MODEL_LARGE;
   2500  1.1  mrg   else
   2501  1.1  mrg     gcc_unreachable (); /* Shouldn't happen.  */
   2502  1.1  mrg   extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
   2503  1.1  mrg 
   2504  1.1  mrg   if (extra_flags)
   2505  1.1  mrg     SYMBOL_REF_FLAGS (sym) |= extra_flags;
   2506  1.1  mrg 
   2507  1.1  mrg   return sym;
   2508  1.1  mrg }
   2509  1.1  mrg 
   2510  1.1  mrg /* Use a library function to move some bytes.  */
   2511  1.1  mrg 
   2512  1.1  mrg static void
   2513  1.1  mrg block_move_call (rtx dest_reg, rtx src_reg, rtx bytes_rtx)
   2514  1.1  mrg {
   2515  1.1  mrg   /* We want to pass the size as Pmode, which will normally be SImode
   2516  1.1  mrg      but will be DImode if we are using 64-bit longs and pointers.  */
   2517  1.1  mrg   if (GET_MODE (bytes_rtx) != VOIDmode
   2518  1.1  mrg       && GET_MODE (bytes_rtx) != Pmode)
   2519  1.1  mrg     bytes_rtx = convert_to_mode (Pmode, bytes_rtx, 1);
   2520  1.1  mrg 
   2521  1.1  mrg   emit_library_call (m32r_function_symbol ("memcpy"), LCT_NORMAL,
   2522  1.1  mrg 		     VOIDmode, dest_reg, Pmode, src_reg, Pmode,
   2523  1.1  mrg 		     convert_to_mode (TYPE_MODE (sizetype), bytes_rtx,
   2524  1.1  mrg 				      TYPE_UNSIGNED (sizetype)),
   2525  1.1  mrg 		     TYPE_MODE (sizetype));
   2526  1.1  mrg }
   2527  1.1  mrg 
   2528  1.1  mrg /* Expand string/block move operations.
   2529  1.1  mrg 
   2530  1.1  mrg    operands[0] is the pointer to the destination.
   2531  1.1  mrg    operands[1] is the pointer to the source.
   2532  1.1  mrg    operands[2] is the number of bytes to move.
   2533  1.1  mrg    operands[3] is the alignment.
   2534  1.1  mrg 
   2535  1.1  mrg    Returns 1 upon success, 0 otherwise.  */
   2536  1.1  mrg 
   2537  1.1  mrg int
   2538  1.1  mrg m32r_expand_block_move (rtx operands[])
   2539  1.1  mrg {
   2540  1.1  mrg   rtx           orig_dst  = operands[0];
   2541  1.1  mrg   rtx           orig_src  = operands[1];
   2542  1.1  mrg   rtx           bytes_rtx = operands[2];
   2543  1.1  mrg   rtx           align_rtx = operands[3];
   2544  1.1  mrg   int           constp    = CONST_INT_P (bytes_rtx);
   2545  1.1  mrg   HOST_WIDE_INT bytes     = constp ? INTVAL (bytes_rtx) : 0;
   2546  1.1  mrg   int           align     = INTVAL (align_rtx);
   2547  1.1  mrg   int           leftover;
   2548  1.1  mrg   rtx           src_reg;
   2549  1.1  mrg   rtx           dst_reg;
   2550  1.1  mrg 
   2551  1.1  mrg   if (constp && bytes <= 0)
   2552  1.1  mrg     return 1;
   2553  1.1  mrg 
   2554  1.1  mrg   /* Move the address into scratch registers.  */
   2555  1.1  mrg   dst_reg = copy_addr_to_reg (XEXP (orig_dst, 0));
   2556  1.1  mrg   src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
   2557  1.1  mrg 
   2558  1.1  mrg   if (align > UNITS_PER_WORD)
   2559  1.1  mrg     align = UNITS_PER_WORD;
   2560  1.1  mrg 
   2561  1.1  mrg   /* If we prefer size over speed, always use a function call.
   2562  1.1  mrg      If we do not know the size, use a function call.
   2563  1.1  mrg      If the blocks are not word aligned, use a function call.  */
   2564  1.1  mrg   if (optimize_size || ! constp || align != UNITS_PER_WORD)
   2565  1.1  mrg     {
   2566  1.1  mrg       block_move_call (dst_reg, src_reg, bytes_rtx);
   2567  1.1  mrg       return 0;
   2568  1.1  mrg     }
   2569  1.1  mrg 
   2570  1.1  mrg   leftover = bytes % MAX_MOVE_BYTES;
   2571  1.1  mrg   bytes   -= leftover;
   2572  1.1  mrg 
   2573  1.1  mrg   /* If necessary, generate a loop to handle the bulk of the copy.  */
   2574  1.1  mrg   if (bytes)
   2575  1.1  mrg     {
   2576  1.1  mrg       rtx_code_label *label = NULL;
   2577  1.1  mrg       rtx final_src = NULL_RTX;
   2578  1.1  mrg       rtx at_a_time = GEN_INT (MAX_MOVE_BYTES);
   2579  1.1  mrg       rtx rounded_total = GEN_INT (bytes);
   2580  1.1  mrg       rtx new_dst_reg = gen_reg_rtx (SImode);
   2581  1.1  mrg       rtx new_src_reg = gen_reg_rtx (SImode);
   2582  1.1  mrg 
   2583  1.1  mrg       /* If we are going to have to perform this loop more than
   2584  1.1  mrg 	 once, then generate a label and compute the address the
   2585  1.1  mrg 	 source register will contain upon completion of the final
   2586  1.1  mrg 	 iteration.  */
   2587  1.1  mrg       if (bytes > MAX_MOVE_BYTES)
   2588  1.1  mrg 	{
   2589  1.1  mrg 	  final_src = gen_reg_rtx (Pmode);
   2590  1.1  mrg 
   2591  1.1  mrg 	  if (INT16_P(bytes))
   2592  1.1  mrg 	    emit_insn (gen_addsi3 (final_src, src_reg, rounded_total));
   2593  1.1  mrg 	  else
   2594  1.1  mrg 	    {
   2595  1.1  mrg 	      emit_insn (gen_movsi (final_src, rounded_total));
   2596  1.1  mrg 	      emit_insn (gen_addsi3 (final_src, final_src, src_reg));
   2597  1.1  mrg 	    }
   2598  1.1  mrg 
   2599  1.1  mrg 	  label = gen_label_rtx ();
   2600  1.1  mrg 	  emit_label (label);
   2601  1.1  mrg 	}
   2602  1.1  mrg 
   2603  1.1  mrg       /* It is known that output_block_move() will update src_reg to point
   2604  1.1  mrg 	 to the word after the end of the source block, and dst_reg to point
   2605  1.1  mrg 	 to the last word of the destination block, provided that the block
   2606  1.1  mrg 	 is MAX_MOVE_BYTES long.  */
   2607  1.1  mrg       emit_insn (gen_cpymemsi_internal (dst_reg, src_reg, at_a_time,
   2608  1.1  mrg 					new_dst_reg, new_src_reg));
   2609  1.1  mrg       emit_move_insn (dst_reg, new_dst_reg);
   2610  1.1  mrg       emit_move_insn (src_reg, new_src_reg);
   2611  1.1  mrg       emit_insn (gen_addsi3 (dst_reg, dst_reg, GEN_INT (4)));
   2612  1.1  mrg 
   2613  1.1  mrg       if (bytes > MAX_MOVE_BYTES)
   2614  1.1  mrg 	{
   2615  1.1  mrg 	  rtx test = gen_rtx_NE (VOIDmode, src_reg, final_src);
   2616  1.1  mrg 	  emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
   2617  1.1  mrg 	}
   2618  1.1  mrg     }
   2619  1.1  mrg 
   2620  1.1  mrg   if (leftover)
   2621  1.1  mrg     emit_insn (gen_cpymemsi_internal (dst_reg, src_reg, GEN_INT (leftover),
   2622  1.1  mrg 				      gen_reg_rtx (SImode),
   2623  1.1  mrg 				      gen_reg_rtx (SImode)));
   2624  1.1  mrg   return 1;
   2625  1.1  mrg }
   2626  1.1  mrg 
   2627  1.1  mrg 
   2628  1.1  mrg /* Emit load/stores for a small constant word aligned block_move.
   2630  1.1  mrg 
   2631  1.1  mrg    operands[0] is the memory address of the destination.
   2632  1.1  mrg    operands[1] is the memory address of the source.
   2633  1.1  mrg    operands[2] is the number of bytes to move.
   2634  1.1  mrg    operands[3] is a temp register.
   2635  1.1  mrg    operands[4] is a temp register.  */
   2636  1.1  mrg 
   2637  1.1  mrg void
   2638  1.1  mrg m32r_output_block_move (rtx insn ATTRIBUTE_UNUSED, rtx operands[])
   2639  1.1  mrg {
   2640  1.1  mrg   HOST_WIDE_INT bytes = INTVAL (operands[2]);
   2641  1.1  mrg   int		first_time;
   2642  1.1  mrg   int		got_extra = 0;
   2643  1.1  mrg 
   2644  1.1  mrg   gcc_assert (bytes >= 1 && bytes <= MAX_MOVE_BYTES);
   2645  1.1  mrg 
   2646  1.1  mrg   /* We do not have a post-increment store available, so the first set of
   2647  1.1  mrg      stores are done without any increment, then the remaining ones can use
   2648  1.1  mrg      the pre-increment addressing mode.
   2649  1.1  mrg 
   2650  1.1  mrg      Note: expand_block_move() also relies upon this behavior when building
   2651  1.1  mrg      loops to copy large blocks.  */
   2652  1.1  mrg   first_time = 1;
   2653  1.1  mrg 
   2654  1.1  mrg   while (bytes > 0)
   2655  1.1  mrg     {
   2656  1.1  mrg       if (bytes >= 8)
   2657  1.1  mrg 	{
   2658  1.1  mrg 	  if (first_time)
   2659  1.1  mrg 	    {
   2660  1.1  mrg 	      output_asm_insn ("ld\t%5, %p1", operands);
   2661  1.1  mrg 	      output_asm_insn ("ld\t%6, %p1", operands);
   2662  1.1  mrg 	      output_asm_insn ("st\t%5, @%0", operands);
   2663  1.1  mrg 	      output_asm_insn ("st\t%6, %s0", operands);
   2664  1.1  mrg 	    }
   2665  1.1  mrg 	  else
   2666  1.1  mrg 	    {
   2667  1.1  mrg 	      output_asm_insn ("ld\t%5, %p1", operands);
   2668  1.1  mrg 	      output_asm_insn ("ld\t%6, %p1", operands);
   2669  1.1  mrg 	      output_asm_insn ("st\t%5, %s0", operands);
   2670  1.1  mrg 	      output_asm_insn ("st\t%6, %s0", operands);
   2671  1.1  mrg 	    }
   2672  1.1  mrg 
   2673  1.1  mrg 	  bytes -= 8;
   2674  1.1  mrg 	}
   2675  1.1  mrg       else if (bytes >= 4)
   2676  1.1  mrg 	{
   2677  1.1  mrg 	  if (bytes > 4)
   2678  1.1  mrg 	    got_extra = 1;
   2679  1.1  mrg 
   2680  1.1  mrg 	  output_asm_insn ("ld\t%5, %p1", operands);
   2681  1.1  mrg 
   2682  1.1  mrg 	  if (got_extra)
   2683  1.1  mrg 	    output_asm_insn ("ld\t%6, %p1", operands);
   2684  1.1  mrg 
   2685  1.1  mrg 	  if (first_time)
   2686  1.1  mrg 	    output_asm_insn ("st\t%5, @%0", operands);
   2687  1.1  mrg 	  else
   2688  1.1  mrg 	    output_asm_insn ("st\t%5, %s0", operands);
   2689  1.1  mrg 
   2690  1.1  mrg 	  bytes -= 4;
   2691  1.1  mrg 	}
   2692  1.1  mrg       else
   2693  1.1  mrg 	{
   2694  1.1  mrg 	  /* Get the entire next word, even though we do not want all of it.
   2695  1.1  mrg 	     The saves us from doing several smaller loads, and we assume that
   2696  1.1  mrg 	     we cannot cause a page fault when at least part of the word is in
   2697  1.1  mrg 	     valid memory [since we don't get called if things aren't properly
   2698  1.1  mrg 	     aligned].  */
   2699  1.1  mrg 	  int dst_offset = first_time ? 0 : 4;
   2700  1.1  mrg 	  /* The amount of increment we have to make to the
   2701  1.1  mrg 	     destination pointer.  */
   2702  1.1  mrg 	  int dst_inc_amount = dst_offset + bytes - 4;
   2703  1.1  mrg 	  /* The same for the source pointer.  */
   2704  1.1  mrg 	  int src_inc_amount = bytes - (got_extra ? 4 : 0);
   2705  1.1  mrg 	  int last_shift;
   2706  1.1  mrg 	  rtx my_operands[3];
   2707  1.1  mrg 
   2708  1.1  mrg 	  /* If got_extra is true then we have already loaded
   2709  1.1  mrg 	     the next word as part of loading and storing the previous word.  */
   2710  1.1  mrg 	  if (! got_extra)
   2711  1.1  mrg 	    output_asm_insn ("ld\t%6, @%1", operands);
   2712  1.1  mrg 
   2713  1.1  mrg 	  if (bytes >= 2)
   2714  1.1  mrg 	    {
   2715  1.1  mrg 	      bytes -= 2;
   2716  1.1  mrg 
   2717  1.1  mrg 	      output_asm_insn ("sra3\t%5, %6, #16", operands);
   2718  1.1  mrg 	      my_operands[0] = operands[5];
   2719  1.1  mrg 	      my_operands[1] = GEN_INT (dst_offset);
   2720  1.1  mrg 	      my_operands[2] = operands[0];
   2721  1.1  mrg 	      output_asm_insn ("sth\t%0, @(%1,%2)", my_operands);
   2722  1.1  mrg 
   2723  1.1  mrg 	      /* If there is a byte left to store then increment the
   2724  1.1  mrg 		 destination address and shift the contents of the source
   2725  1.1  mrg 		 register down by 8 bits.  We could not do the address
   2726  1.1  mrg 		 increment in the store half word instruction, because it does
   2727  1.1  mrg 		 not have an auto increment mode.  */
   2728  1.1  mrg 	      if (bytes > 0)  /* assert (bytes == 1) */
   2729  1.1  mrg 		{
   2730  1.1  mrg 		  dst_offset += 2;
   2731  1.1  mrg 		  last_shift = 8;
   2732  1.1  mrg 		}
   2733  1.1  mrg 	    }
   2734  1.1  mrg 	  else
   2735  1.1  mrg 	    last_shift = 24;
   2736  1.1  mrg 
   2737  1.1  mrg 	  if (bytes > 0)
   2738  1.1  mrg 	    {
   2739  1.1  mrg 	      my_operands[0] = operands[6];
   2740  1.1  mrg 	      my_operands[1] = GEN_INT (last_shift);
   2741  1.1  mrg 	      output_asm_insn ("srai\t%0, #%1", my_operands);
   2742  1.1  mrg 	      my_operands[0] = operands[6];
   2743  1.1  mrg 	      my_operands[1] = GEN_INT (dst_offset);
   2744  1.1  mrg 	      my_operands[2] = operands[0];
   2745  1.1  mrg 	      output_asm_insn ("stb\t%0, @(%1,%2)", my_operands);
   2746  1.1  mrg 	    }
   2747  1.1  mrg 
   2748  1.1  mrg 	  /* Update the destination pointer if needed.  We have to do
   2749  1.1  mrg 	     this so that the patterns matches what we output in this
   2750  1.1  mrg 	     function.  */
   2751  1.1  mrg 	  if (dst_inc_amount
   2752  1.1  mrg 	      && !find_reg_note (insn, REG_UNUSED, operands[0]))
   2753  1.1  mrg 	    {
   2754  1.1  mrg 	      my_operands[0] = operands[0];
   2755  1.1  mrg 	      my_operands[1] = GEN_INT (dst_inc_amount);
   2756  1.1  mrg 	      output_asm_insn ("addi\t%0, #%1", my_operands);
   2757  1.1  mrg 	    }
   2758  1.1  mrg 
   2759  1.1  mrg 	  /* Update the source pointer if needed.  We have to do this
   2760  1.1  mrg 	     so that the patterns matches what we output in this
   2761  1.1  mrg 	     function.  */
   2762  1.1  mrg 	  if (src_inc_amount
   2763  1.1  mrg 	      && !find_reg_note (insn, REG_UNUSED, operands[1]))
   2764  1.1  mrg 	    {
   2765  1.1  mrg 	      my_operands[0] = operands[1];
   2766  1.1  mrg 	      my_operands[1] = GEN_INT (src_inc_amount);
   2767  1.1  mrg 	      output_asm_insn ("addi\t%0, #%1", my_operands);
   2768  1.1  mrg 	    }
   2769  1.1  mrg 
   2770  1.1  mrg 	  bytes = 0;
   2771  1.1  mrg 	}
   2772  1.1  mrg 
   2773  1.1  mrg       first_time = 0;
   2774  1.1  mrg     }
   2775  1.1  mrg }
   2776  1.1  mrg 
   2777  1.1  mrg /* Implement TARGET_HARD_REGNO_MODE_OK.  */
   2778  1.1  mrg 
   2779  1.1  mrg static bool
   2780  1.1  mrg m32r_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
   2781  1.1  mrg {
   2782  1.1  mrg   return (m32r_hard_regno_modes[regno] & m32r_mode_class[mode]) != 0;
   2783  1.1  mrg }
   2784  1.1  mrg 
   2785  1.1  mrg /* Implement TARGET_MODES_TIEABLE_P.  Tie QI/HI/SI modes together.  */
   2786  1.1  mrg 
   2787  1.1  mrg static bool
   2788  1.1  mrg m32r_modes_tieable_p (machine_mode mode1, machine_mode mode2)
   2789  1.1  mrg {
   2790  1.1  mrg   return (GET_MODE_CLASS (mode1) == MODE_INT
   2791  1.1  mrg 	  && GET_MODE_CLASS (mode2) == MODE_INT
   2792  1.1  mrg 	  && GET_MODE_SIZE (mode1) <= UNITS_PER_WORD
   2793  1.1  mrg 	  && GET_MODE_SIZE (mode2) <= UNITS_PER_WORD);
   2794  1.1  mrg }
   2795  1.1  mrg 
   2796  1.1  mrg /* Return true if using NEW_REG in place of OLD_REG is ok.  */
   2797  1.1  mrg 
   2798  1.1  mrg int
   2799  1.1  mrg m32r_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
   2800  1.1  mrg 			   unsigned int new_reg)
   2801  1.1  mrg {
   2802  1.1  mrg   /* Interrupt routines can't clobber any register that isn't already used.  */
   2803  1.1  mrg   if (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl))
   2804  1.1  mrg       && !df_regs_ever_live_p (new_reg))
   2805  1.1  mrg     return 0;
   2806  1.1  mrg 
   2807  1.1  mrg   return 1;
   2808  1.1  mrg }
   2809  1.1  mrg 
   2810  1.1  mrg rtx
   2811  1.1  mrg m32r_return_addr (int count)
   2812  1.1  mrg {
   2813  1.1  mrg   if (count != 0)
   2814  1.1  mrg     return const0_rtx;
   2815  1.1  mrg 
   2816  1.1  mrg   return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
   2817  1.1  mrg }
   2818  1.1  mrg 
   2819  1.1  mrg static void
   2820  1.1  mrg m32r_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
   2821  1.1  mrg {
   2822  1.1  mrg   emit_move_insn (adjust_address (m_tramp, SImode, 0),
   2823  1.1  mrg 		  gen_int_mode (TARGET_LITTLE_ENDIAN ?
   2824  1.1  mrg 				0x017e8e17 : 0x178e7e01, SImode));
   2825  1.1  mrg   emit_move_insn (adjust_address (m_tramp, SImode, 4),
   2826  1.1  mrg 		  gen_int_mode (TARGET_LITTLE_ENDIAN ?
   2827  1.1  mrg 				0x0c00ae86 : 0x86ae000c, SImode));
   2828  1.1  mrg   emit_move_insn (adjust_address (m_tramp, SImode, 8),
   2829  1.1  mrg 		  gen_int_mode (TARGET_LITTLE_ENDIAN ?
   2830  1.1  mrg 				0xe627871e : 0x1e8727e6, SImode));
   2831  1.1  mrg   emit_move_insn (adjust_address (m_tramp, SImode, 12),
   2832  1.1  mrg 		  gen_int_mode (TARGET_LITTLE_ENDIAN ?
   2833  1.1  mrg 				0xc616c626 : 0x26c61fc6, SImode));
   2834  1.1  mrg   emit_move_insn (adjust_address (m_tramp, SImode, 16),
   2835  1.1  mrg 		  chain_value);
   2836  1.1  mrg   emit_move_insn (adjust_address (m_tramp, SImode, 20),
   2837  1.1  mrg 		  XEXP (DECL_RTL (fndecl), 0));
   2838  1.1  mrg 
   2839  1.1  mrg   if (m32r_cache_flush_trap >= 0)
   2840  1.1  mrg     emit_insn (gen_flush_icache
   2841  1.1  mrg 	       (validize_mem (adjust_address (m_tramp, SImode, 0)),
   2842  1.1  mrg 		gen_int_mode (m32r_cache_flush_trap, SImode)));
   2843  1.1  mrg   else if (m32r_cache_flush_func && m32r_cache_flush_func[0])
   2844  1.1  mrg     emit_library_call (m32r_function_symbol (m32r_cache_flush_func),
   2845  1.1  mrg 		       LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode,
   2846  1.1  mrg 		       gen_int_mode (TRAMPOLINE_SIZE, SImode), SImode,
   2847  1.1  mrg 		       GEN_INT (3), SImode);
   2848  1.1  mrg }
   2849  1.1  mrg 
   2850  1.1  mrg /* True if X is a reg that can be used as a base reg.  */
   2851  1.1  mrg 
   2852  1.1  mrg static bool
   2853  1.1  mrg m32r_rtx_ok_for_base_p (const_rtx x, bool strict)
   2854  1.1  mrg {
   2855  1.1  mrg   if (! REG_P (x))
   2856  1.1  mrg     return false;
   2857  1.1  mrg 
   2858  1.1  mrg   if (strict)
   2859  1.1  mrg     {
   2860  1.1  mrg       if (GPR_P (REGNO (x)))
   2861  1.1  mrg 	return true;
   2862  1.1  mrg     }
   2863  1.1  mrg   else
   2864  1.1  mrg     {
   2865  1.1  mrg       if (GPR_P (REGNO (x))
   2866  1.1  mrg 	  || REGNO (x) == ARG_POINTER_REGNUM
   2867  1.1  mrg 	  || ! HARD_REGISTER_P (x))
   2868  1.1  mrg 	return true;
   2869  1.1  mrg     }
   2870  1.1  mrg 
   2871  1.1  mrg   return false;
   2872  1.1  mrg }
   2873  1.1  mrg 
   2874  1.1  mrg static inline bool
   2875  1.1  mrg m32r_rtx_ok_for_offset_p (const_rtx x)
   2876  1.1  mrg {
   2877  1.1  mrg   return (CONST_INT_P (x) && INT16_P (INTVAL (x)));
   2878  1.1  mrg }
   2879  1.1  mrg 
   2880  1.1  mrg static inline bool
   2881  1.1  mrg m32r_legitimate_offset_addres_p (machine_mode mode ATTRIBUTE_UNUSED,
   2882  1.1  mrg 				 const_rtx x, bool strict)
   2883  1.1  mrg {
   2884  1.1  mrg   if (GET_CODE (x) == PLUS
   2885  1.1  mrg       && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict)
   2886  1.1  mrg       && m32r_rtx_ok_for_offset_p (XEXP (x, 1)))
   2887  1.1  mrg     return true;
   2888  1.1  mrg 
   2889  1.1  mrg   return false;
   2890  1.1  mrg }
   2891  1.1  mrg 
   2892  1.1  mrg /* For LO_SUM addresses, do not allow them if the MODE is > 1 word,
   2893  1.1  mrg    since more than one instruction will be required.  */
   2894  1.1  mrg 
   2895  1.1  mrg static inline bool
   2896  1.1  mrg m32r_legitimate_lo_sum_addres_p (machine_mode mode, const_rtx x,
   2897  1.1  mrg 				 bool strict)
   2898  1.1  mrg {
   2899  1.1  mrg   if (GET_CODE (x) == LO_SUM
   2900  1.1  mrg       && (mode != BLKmode && GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
   2901  1.1  mrg       && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict)
   2902  1.1  mrg       && CONSTANT_P (XEXP (x, 1)))
   2903  1.1  mrg     return true;
   2904  1.1  mrg 
   2905  1.1  mrg   return false;
   2906  1.1  mrg }
   2907  1.1  mrg 
   2908  1.1  mrg /* Is this a load and increment operation.  */
   2909  1.1  mrg 
   2910  1.1  mrg static inline bool
   2911  1.1  mrg m32r_load_postinc_p (machine_mode mode, const_rtx x, bool strict)
   2912  1.1  mrg {
   2913  1.1  mrg   if ((mode == SImode || mode == SFmode)
   2914  1.1  mrg       && GET_CODE (x) == POST_INC
   2915  1.1  mrg       && REG_P (XEXP (x, 0))
   2916  1.1  mrg       && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict))
   2917  1.1  mrg     return true;
   2918  1.1  mrg 
   2919  1.1  mrg   return false;
   2920  1.1  mrg }
   2921  1.1  mrg 
   2922  1.1  mrg /* Is this an increment/decrement and store operation.  */
   2923  1.1  mrg 
   2924  1.1  mrg static inline bool
   2925  1.1  mrg m32r_store_preinc_predec_p (machine_mode mode, const_rtx x, bool strict)
   2926  1.1  mrg {
   2927  1.1  mrg   if ((mode == SImode || mode == SFmode)
   2928  1.1  mrg       && (GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
   2929  1.1  mrg       && REG_P (XEXP (x, 0))                           \
   2930  1.1  mrg       && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict))
   2931  1.1  mrg     return true;
   2932  1.1  mrg 
   2933  1.1  mrg   return false;
   2934  1.1  mrg }
   2935  1.1  mrg 
   2936  1.1  mrg /* Implement  TARGET_LEGITIMATE_ADDRESS_P.  */
   2937  1.1  mrg 
   2938  1.1  mrg static bool
   2939  1.1  mrg m32r_legitimate_address_p (machine_mode mode, rtx x, bool strict)
   2940  1.1  mrg {
   2941  1.1  mrg   if (m32r_rtx_ok_for_base_p (x, strict)
   2942  1.1  mrg       || m32r_legitimate_offset_addres_p (mode, x, strict)
   2943  1.1  mrg       || m32r_legitimate_lo_sum_addres_p (mode, x, strict)
   2944  1.1  mrg       || m32r_load_postinc_p (mode, x, strict)
   2945  1.1  mrg       || m32r_store_preinc_predec_p (mode, x, strict))
   2946  1.1  mrg     return true;
   2947  1.1  mrg 
   2948  1.1  mrg   return false;
   2949  1.1  mrg }
   2950  1.1  mrg 
   2951  1.1  mrg static void
   2952  1.1  mrg m32r_conditional_register_usage (void)
   2953  1.1  mrg {
   2954  1.1  mrg   if (flag_pic)
   2955  1.1  mrg     fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
   2956  1.1  mrg }
   2957  1.1  mrg 
   2958  1.1  mrg /* Implement TARGET_LEGITIMATE_CONSTANT_P
   2959  1.1  mrg 
   2960              We don't allow (plus symbol large-constant) as the relocations can't
   2961              describe it.  INTVAL > 32767 handles both 16-bit and 24-bit relocations.
   2962              We allow all CONST_DOUBLE's as the md file patterns will force the
   2963              constant to memory if they can't handle them.  */
   2964           
   2965           static bool
   2966           m32r_legitimate_constant_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
   2967           {
   2968             return !(GET_CODE (x) == CONST
   2969           	   && GET_CODE (XEXP (x, 0)) == PLUS
   2970           	   && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
   2971           	       || GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF)
   2972           	   && CONST_INT_P (XEXP (XEXP (x, 0), 1))
   2973           	   && UINTVAL (XEXP (XEXP (x, 0), 1)) > 32767);
   2974           }
   2975           
   2976           /* Implement TARGET_STARTING_FRAME_OFFSET.  The frame pointer points at
   2977              the same place as the stack pointer, except if alloca has been called.  */
   2978           
   2979           static HOST_WIDE_INT
   2980           m32r_starting_frame_offset (void)
   2981           {
   2982             return M32R_STACK_ALIGN (crtl->outgoing_args_size);
   2983           }
   2984