Home | History | Annotate | Line # | Download | only in msp430
      1  1.1  mrg /* Subroutines used for code generation on TI MSP430 processors.
      2  1.1  mrg    Copyright (C) 2012-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Red Hat.
      4  1.1  mrg 
      5  1.1  mrg    This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg    GCC is free software; you can redistribute it and/or modify
      8  1.1  mrg    it under the terms of the GNU General Public License as published by
      9  1.1  mrg    the Free Software Foundation; either version 3, or (at your option)
     10  1.1  mrg    any later version.
     11  1.1  mrg 
     12  1.1  mrg    GCC is distributed in the hope that it will be useful,
     13  1.1  mrg    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  mrg    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1  mrg    GNU General Public License for more details.
     16  1.1  mrg 
     17  1.1  mrg    You should have received a copy of the GNU General Public License
     18  1.1  mrg    along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg    <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg #define IN_TARGET_CODE 1
     22  1.1  mrg 
     23  1.1  mrg #include "config.h"
     24  1.1  mrg #include "system.h"
     25  1.1  mrg #include "coretypes.h"
     26  1.1  mrg #include "backend.h"
     27  1.1  mrg #include "target.h"
     28  1.1  mrg #include "rtl.h"
     29  1.1  mrg #include "tree.h"
     30  1.1  mrg #include "stringpool.h"
     31  1.1  mrg #include "attribs.h"
     32  1.1  mrg #include "gimple-expr.h"
     33  1.1  mrg #include "df.h"
     34  1.1  mrg #include "memmodel.h"
     35  1.1  mrg #include "tm_p.h"
     36  1.1  mrg #include "regs.h"
     37  1.1  mrg #include "emit-rtl.h"
     38  1.1  mrg #include "varasm.h"
     39  1.1  mrg #include "diagnostic-core.h"
     40  1.1  mrg #include "fold-const.h"
     41  1.1  mrg #include "stor-layout.h"
     42  1.1  mrg #include "calls.h"
     43  1.1  mrg #include "output.h"
     44  1.1  mrg #include "explow.h"
     45  1.1  mrg #include "expr.h"
     46  1.1  mrg #include "langhooks.h"
     47  1.1  mrg #include "builtins.h"
     48  1.1  mrg #include "intl.h"
     49  1.1  mrg #include "msp430-devices.h"
     50  1.1  mrg #include "incpath.h"
     51  1.1  mrg #include "prefix.h"
     52  1.1  mrg #include "insn-config.h"
     53  1.1  mrg #include "insn-attr.h"
     54  1.1  mrg #include "recog.h"
     55  1.1  mrg 
     56  1.1  mrg /* This file should be included last.  */
     57  1.1  mrg #include "target-def.h"
     58  1.1  mrg 
     59  1.1  mrg 
     61  1.1  mrg static void msp430_compute_frame_info (void);
     62  1.1  mrg static bool msp430_use_16bit_hwmult (void);
     63  1.1  mrg static bool msp430_use_32bit_hwmult (void);
     64  1.1  mrg static bool use_helper_for_const_shift (machine_mode mode, HOST_WIDE_INT amt);
     65  1.1  mrg 
     66  1.1  mrg 
     67  1.1  mrg 
     69  1.1  mrg /* Run-time Target Specification.  */
     70  1.1  mrg 
     71  1.1  mrg bool msp430x = true;
     72  1.1  mrg 
     73  1.1  mrg struct GTY(()) machine_function
     74  1.1  mrg {
     75  1.1  mrg   /* If set, the rest of the fields have been computed.  */
     76  1.1  mrg   int computed;
     77  1.1  mrg   /* Which registers need to be saved in the pro/epilogue.  */
     78  1.1  mrg   int need_to_save[FIRST_PSEUDO_REGISTER];
     79  1.1  mrg 
     80  1.1  mrg   /* These fields describe the frame layout...  */
     81  1.1  mrg   /* arg pointer */
     82  1.1  mrg   /* 2/4 bytes for saved PC */
     83  1.1  mrg   int framesize_regs;
     84  1.1  mrg   /* frame pointer */
     85  1.1  mrg   int framesize_locals;
     86  1.1  mrg   int framesize_outgoing;
     87  1.1  mrg   /* stack pointer */
     88  1.1  mrg   int framesize;
     89  1.1  mrg 
     90  1.1  mrg   /* How much we adjust the stack when returning from an exception
     91  1.1  mrg      handler.  */
     92  1.1  mrg   rtx eh_stack_adjust;
     93  1.1  mrg };
     94  1.1  mrg 
     95  1.1  mrg /* This is our init_machine_status, as set in
     96  1.1  mrg    msp430_option_override.  */
     97  1.1  mrg static struct machine_function *
     98  1.1  mrg msp430_init_machine_status (void)
     99  1.1  mrg {
    100  1.1  mrg   struct machine_function *m;
    101  1.1  mrg 
    102  1.1  mrg   m = ggc_cleared_alloc<machine_function> ();
    103  1.1  mrg 
    104  1.1  mrg   return m;
    105  1.1  mrg }
    106  1.1  mrg 
    107  1.1  mrg #undef  TARGET_OPTION_OVERRIDE
    108  1.1  mrg #define TARGET_OPTION_OVERRIDE		msp430_option_override
    109  1.1  mrg 
    110  1.1  mrg /* Generate a C preprocessor symbol based upon the MCU selected by the user.
    111  1.1  mrg    If a specific MCU has not been selected then return a generic symbol
    112  1.1  mrg    instead.  */
    113  1.1  mrg 
    114  1.1  mrg const char *
    115  1.1  mrg msp430_mcu_name (void)
    116  1.1  mrg {
    117  1.1  mrg   if (target_mcu)
    118  1.1  mrg     {
    119  1.1  mrg       msp430_extract_mcu_data (target_mcu);
    120  1.1  mrg       unsigned int i;
    121  1.1  mrg       unsigned int start_upper;
    122  1.1  mrg       unsigned int end_upper;
    123  1.1  mrg       static char mcu_name[64];
    124  1.1  mrg 
    125  1.1  mrg       /* The 'i' in the device name symbol for msp430i* devices must be lower
    126  1.1  mrg 	 case, to match the expected symbol in msp430.h.  */
    127  1.1  mrg       if (startswith (target_mcu, "msp430i"))
    128  1.1  mrg 	{
    129  1.1  mrg 	  snprintf (mcu_name, sizeof (mcu_name) - 1, "__MSP430i%s__",
    130  1.1  mrg 		    target_mcu + 7);
    131  1.1  mrg 	  start_upper = 9;
    132  1.1  mrg 	}
    133  1.1  mrg       else
    134  1.1  mrg 	{
    135  1.1  mrg 	  snprintf (mcu_name, sizeof (mcu_name) - 1, "__%s__", target_mcu);
    136  1.1  mrg 	  start_upper = 2;
    137  1.1  mrg 	}
    138  1.1  mrg       end_upper = strlen (mcu_name) - 2;
    139  1.1  mrg       for (i = start_upper; i < end_upper; i++)
    140  1.1  mrg 	mcu_name[i] = TOUPPER (mcu_name[i]);
    141  1.1  mrg       return mcu_name;
    142  1.1  mrg     }
    143  1.1  mrg 
    144  1.1  mrg   return msp430x ? "__MSP430XGENERIC__" : "__MSP430GENERIC__";
    145  1.1  mrg }
    146  1.1  mrg 
    147  1.1  mrg static const char *
    148  1.1  mrg hwmult_name (unsigned int val)
    149  1.1  mrg {
    150  1.1  mrg   switch (val)
    151  1.1  mrg     {
    152  1.1  mrg     case 0: return "none";
    153  1.1  mrg     case 1: return "16-bit";
    154  1.1  mrg     case 2: return "16-bit";
    155  1.1  mrg     case 4: return "32-bit";
    156  1.1  mrg     case 8: return "32-bit (5xx)";
    157  1.1  mrg     default: gcc_unreachable ();
    158  1.1  mrg     }
    159  1.1  mrg }
    160  1.1  mrg 
    161  1.1  mrg static void
    162  1.1  mrg msp430_option_override (void)
    163  1.1  mrg {
    164  1.1  mrg   /* The MSP430 architecture can safely dereference a NULL pointer.  In fact,
    165  1.1  mrg      there are memory mapped registers there.  */
    166  1.1  mrg   flag_delete_null_pointer_checks = 0;
    167  1.1  mrg 
    168  1.1  mrg   init_machine_status = msp430_init_machine_status;
    169  1.1  mrg 
    170  1.1  mrg   msp430x = target_cpu >= MSP430_CPU_MSP430X_DEFAULT;
    171  1.1  mrg 
    172  1.1  mrg   if (target_mcu)
    173  1.1  mrg     {
    174  1.1  mrg       msp430_extract_mcu_data (target_mcu);
    175  1.1  mrg 
    176  1.1  mrg       if (extracted_mcu_data.name != NULL)
    177  1.1  mrg 	{
    178  1.1  mrg 	  bool xisa = extracted_mcu_data.revision >= 1;
    179  1.1  mrg 
    180  1.1  mrg 	  if (msp430_warn_mcu)
    181  1.1  mrg 	    {
    182  1.1  mrg 	      if (target_cpu != MSP430_CPU_MSP430X_DEFAULT && msp430x != xisa)
    183  1.1  mrg 		warning (0, "MCU %qs supports %s ISA but %<-mcpu%> option "
    184  1.1  mrg 			 "is set to %s",
    185  1.1  mrg 			 target_mcu, xisa ? "430X" : "430",
    186  1.1  mrg 			 msp430x ? "430X" : "430");
    187  1.1  mrg 
    188  1.1  mrg 	      if (extracted_mcu_data.hwmpy == 0
    189  1.1  mrg 		  && msp430_hwmult_type != MSP430_HWMULT_AUTO
    190  1.1  mrg 		  && msp430_hwmult_type != MSP430_HWMULT_NONE)
    191  1.1  mrg 		warning (0, "MCU %qs does not have hardware multiply "
    192  1.1  mrg 			 "support, but %<-mhwmult%> is set to %s",
    193  1.1  mrg 			 target_mcu,
    194  1.1  mrg 			 msp430_hwmult_type == MSP430_HWMULT_SMALL ? "16-bit"
    195  1.1  mrg 			 : msp430_hwmult_type == MSP430_HWMULT_LARGE
    196  1.1  mrg 			 ? "32-bit" : "f5series");
    197  1.1  mrg 	      else if (msp430_hwmult_type == MSP430_HWMULT_SMALL
    198  1.1  mrg 		       && extracted_mcu_data.hwmpy != 1
    199  1.1  mrg 		       && extracted_mcu_data.hwmpy != 2)
    200  1.1  mrg 		warning (0, "MCU %qs supports %s hardware multiply, "
    201  1.1  mrg 			 "but %<-mhwmult%> is set to 16-bit",
    202  1.1  mrg 			 target_mcu, hwmult_name (extracted_mcu_data.hwmpy));
    203  1.1  mrg 	      else if (msp430_hwmult_type == MSP430_HWMULT_LARGE
    204  1.1  mrg 		       && extracted_mcu_data.hwmpy != 4)
    205  1.1  mrg 		warning (0, "MCU %qs supports %s hardware multiply, "
    206  1.1  mrg 			 "but %<-mhwmult%> is set to 32-bit",
    207  1.1  mrg 			 target_mcu, hwmult_name (extracted_mcu_data.hwmpy));
    208  1.1  mrg 	      else if (msp430_hwmult_type == MSP430_HWMULT_F5SERIES
    209  1.1  mrg 		       && extracted_mcu_data.hwmpy != 8)
    210  1.1  mrg 		warning (0, "MCU %qs supports %s hardware multiply, "
    211  1.1  mrg 			 "but %<-mhwmult%> is set to f5series",
    212  1.1  mrg 			 target_mcu, hwmult_name (extracted_mcu_data.hwmpy));
    213  1.1  mrg 	    }
    214  1.1  mrg 	  /* Only override the default setting with the extracted ISA value if
    215  1.1  mrg 	     the user has not passed -mcpu=.  */
    216  1.1  mrg 	  if (target_cpu == MSP430_CPU_MSP430X_DEFAULT)
    217  1.1  mrg 	    msp430x = xisa;
    218  1.1  mrg 	}
    219  1.1  mrg       else
    220  1.1  mrg 	{
    221  1.1  mrg 	  if (msp430_hwmult_type == MSP430_HWMULT_AUTO)
    222  1.1  mrg 	    {
    223  1.1  mrg 	      if (msp430_warn_mcu)
    224  1.1  mrg 		{
    225  1.1  mrg 		  if (target_cpu == MSP430_CPU_MSP430X_DEFAULT)
    226  1.1  mrg 		    warning (0,
    227  1.1  mrg 			     "unrecognized MCU name %qs, assuming that it is "
    228  1.1  mrg 			     "just a MSP430X with no hardware multiply; "
    229  1.1  mrg 			     "use the %<-mcpu%> and %<-mhwmult%> options to "
    230  1.1  mrg 			     "set these explicitly",
    231  1.1  mrg 			     target_mcu);
    232  1.1  mrg 		  else
    233  1.1  mrg 		    warning (0,
    234  1.1  mrg 			     "unrecognized MCU name %qs, assuming that it "
    235  1.1  mrg 			     "has no hardware multiply; use the %<-mhwmult%> "
    236  1.1  mrg 			     "option to set this explicitly",
    237  1.1  mrg 			     target_mcu);
    238  1.1  mrg 		}
    239  1.1  mrg 
    240  1.1  mrg 	      msp430_hwmult_type = MSP430_HWMULT_NONE;
    241  1.1  mrg 	    }
    242  1.1  mrg 	  else if (target_cpu == MSP430_CPU_MSP430X_DEFAULT)
    243  1.1  mrg 	    {
    244  1.1  mrg 	      if (msp430_warn_mcu)
    245  1.1  mrg 		warning (0,
    246  1.1  mrg 			 "unrecognized MCU name %qs, assuming that it just "
    247  1.1  mrg 			 "supports the MSP430X ISA; use the %<-mcpu%> option "
    248  1.1  mrg 			 "to set the ISA explicitly",
    249  1.1  mrg 			 target_mcu);
    250  1.1  mrg 	    }
    251  1.1  mrg 	  else if (msp430_warn_mcu)
    252  1.1  mrg 	    warning (0, "Unrecognized MCU name %qs.", target_mcu);
    253  1.1  mrg 	}
    254  1.1  mrg     }
    255  1.1  mrg 
    256  1.1  mrg   if (TARGET_LARGE && !msp430x)
    257  1.1  mrg     error ("%<-mlarge%> requires a 430X-compatible %<-mmcu=%>");
    258  1.1  mrg 
    259  1.1  mrg   if (!TARGET_LARGE && msp430_code_region == MSP430_REGION_EITHER)
    260  1.1  mrg     error ("%<-mcode-region=either%> requires the large memory model "
    261  1.1  mrg 	   "(%<-mlarge%>)");
    262  1.1  mrg   else if (!TARGET_LARGE && msp430_code_region == MSP430_REGION_UPPER)
    263  1.1  mrg     error ("%<-mcode-region=upper%> requires the large memory model "
    264  1.1  mrg 	   "(%<-mlarge%>)");
    265  1.1  mrg 
    266  1.1  mrg   if (!TARGET_LARGE && msp430_data_region == MSP430_REGION_EITHER)
    267  1.1  mrg     error ("%<-mdata-region=either%> requires the large memory model "
    268  1.1  mrg 	   "(%<-mlarge%>)");
    269  1.1  mrg   else if (!TARGET_LARGE && msp430_data_region == MSP430_REGION_UPPER)
    270  1.1  mrg     error ("%<-mdata-region=upper%> requires the large memory model "
    271  1.1  mrg 	   "(%<-mlarge%>)");
    272  1.1  mrg 
    273  1.1  mrg   if (flag_exceptions || flag_non_call_exceptions
    274  1.1  mrg       || flag_unwind_tables || flag_asynchronous_unwind_tables)
    275  1.1  mrg     flag_omit_frame_pointer = false;
    276  1.1  mrg   else
    277  1.1  mrg     flag_omit_frame_pointer = true;
    278  1.1  mrg 
    279  1.1  mrg   /* This is a hack to work around a problem with the newlib build
    280  1.1  mrg      mechanism.  Newlib always appends CFLAGS to the end of the GCC
    281  1.1  mrg      command line and always sets -O2 in CFLAGS.  Thus it is not
    282  1.1  mrg      possible to build newlib with -Os enabled.  Until now...  */
    283  1.1  mrg   if (TARGET_OPT_SPACE && optimize < 3)
    284  1.1  mrg     optimize_size = 1;
    285  1.1  mrg 
    286  1.1  mrg #if !DEFAULT_USE_CXA_ATEXIT
    287  1.1  mrg   /* For some configurations, we use atexit () instead of __cxa_atexit () by
    288  1.1  mrg      default to save on code size and remove the declaration of __dso_handle
    289  1.1  mrg      from the CRT library.
    290  1.1  mrg      Configuring GCC with --enable-__cxa-atexit re-enables it by defining
    291  1.1  mrg      DEFAULT_USE_CXA_ATEXIT to 1.  */
    292  1.1  mrg   if (flag_use_cxa_atexit)
    293  1.1  mrg     error ("%<-fuse-cxa-atexit%> is not supported for msp430-elf");
    294  1.1  mrg #endif
    295  1.1  mrg 
    296  1.1  mrg #ifndef HAVE_NEWLIB_NANO_FORMATTED_IO
    297  1.1  mrg   if (TARGET_TINY_PRINTF)
    298  1.1  mrg     error ("GCC must be configured with %<--enable-newlib-nano-formatted-io%> "
    299  1.1  mrg 	   "to use %<-mtiny-printf%>");
    300  1.1  mrg #endif
    301  1.1  mrg }
    302  1.1  mrg 
    303  1.1  mrg #undef  TARGET_SCALAR_MODE_SUPPORTED_P
    304  1.1  mrg #define TARGET_SCALAR_MODE_SUPPORTED_P msp430_scalar_mode_supported_p
    305  1.1  mrg 
    306  1.1  mrg static bool
    307  1.1  mrg msp430_scalar_mode_supported_p (scalar_mode m)
    308  1.1  mrg {
    309  1.1  mrg   if (m == PSImode && msp430x)
    310  1.1  mrg     return true;
    311  1.1  mrg #if 0
    312  1.1  mrg   if (m == TImode)
    313  1.1  mrg     return true;
    314  1.1  mrg #endif
    315  1.1  mrg   return default_scalar_mode_supported_p (m);
    316  1.1  mrg }
    317  1.1  mrg 
    318  1.1  mrg 
    319  1.1  mrg 
    321  1.1  mrg /* Storage Layout */
    322  1.1  mrg 
    323  1.1  mrg #undef  TARGET_MS_BITFIELD_LAYOUT_P
    324  1.1  mrg #define TARGET_MS_BITFIELD_LAYOUT_P msp430_ms_bitfield_layout_p
    325  1.1  mrg 
    326  1.1  mrg bool
    327  1.1  mrg msp430_ms_bitfield_layout_p (const_tree record_type ATTRIBUTE_UNUSED)
    328  1.1  mrg {
    329  1.1  mrg   return false;
    330  1.1  mrg }
    331  1.1  mrg 
    332  1.1  mrg 
    333  1.1  mrg 
    335  1.1  mrg /* Register Usage */
    336  1.1  mrg 
    337  1.1  mrg #undef TARGET_HARD_REGNO_NREGS
    338  1.1  mrg #define TARGET_HARD_REGNO_NREGS msp430_hard_regno_nregs
    339  1.1  mrg 
    340  1.1  mrg static unsigned int
    341  1.1  mrg msp430_hard_regno_nregs (unsigned int, machine_mode mode)
    342  1.1  mrg {
    343  1.1  mrg   if (mode == PSImode && msp430x)
    344  1.1  mrg     return 1;
    345  1.1  mrg   if (mode == CPSImode && msp430x)
    346  1.1  mrg     return 2;
    347  1.1  mrg   return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1)
    348  1.1  mrg 	  / UNITS_PER_WORD);
    349  1.1  mrg }
    350  1.1  mrg 
    351  1.1  mrg /* subreg_get_info correctly handles PSImode registers, so defining
    352  1.1  mrg    HARD_REGNO_NREGS_HAS_PADDING and HARD_REGNO_NREGS_WITH_PADDING
    353  1.1  mrg    has no effect.  */
    354  1.1  mrg 
    355  1.1  mrg #undef TARGET_HARD_REGNO_MODE_OK
    356  1.1  mrg #define TARGET_HARD_REGNO_MODE_OK msp430_hard_regno_mode_ok
    357  1.1  mrg 
    358  1.1  mrg static bool
    359  1.1  mrg msp430_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
    360  1.1  mrg {
    361  1.1  mrg   return regno <= (ARG_POINTER_REGNUM
    362  1.1  mrg 		   - (unsigned int) msp430_hard_regno_nregs (regno, mode));
    363  1.1  mrg }
    364  1.1  mrg 
    365  1.1  mrg #undef TARGET_MODES_TIEABLE_P
    366  1.1  mrg #define TARGET_MODES_TIEABLE_P msp430_modes_tieable_p
    367  1.1  mrg 
    368  1.1  mrg static bool
    369  1.1  mrg msp430_modes_tieable_p (machine_mode mode1, machine_mode mode2)
    370  1.1  mrg {
    371  1.1  mrg   if ((mode1 == PSImode || mode2 == SImode)
    372  1.1  mrg       || (mode1 == SImode || mode2 == PSImode))
    373  1.1  mrg     return false;
    374  1.1  mrg 
    375  1.1  mrg   return ((GET_MODE_CLASS (mode1) == MODE_FLOAT
    376  1.1  mrg 	   || GET_MODE_CLASS (mode1) == MODE_COMPLEX_FLOAT)
    377  1.1  mrg 	  == (GET_MODE_CLASS (mode2) == MODE_FLOAT
    378  1.1  mrg 	      || GET_MODE_CLASS (mode2) == MODE_COMPLEX_FLOAT));
    379  1.1  mrg }
    380  1.1  mrg 
    381  1.1  mrg #undef  TARGET_FRAME_POINTER_REQUIRED
    382  1.1  mrg #define TARGET_FRAME_POINTER_REQUIRED msp430_frame_pointer_required
    383  1.1  mrg 
    384  1.1  mrg static bool
    385  1.1  mrg msp430_frame_pointer_required (void)
    386  1.1  mrg {
    387  1.1  mrg   return false;
    388  1.1  mrg }
    389  1.1  mrg 
    390  1.1  mrg #undef  TARGET_CAN_ELIMINATE
    391  1.1  mrg #define TARGET_CAN_ELIMINATE		msp430_can_eliminate
    392  1.1  mrg 
    393  1.1  mrg static bool
    394  1.1  mrg msp430_can_eliminate (const int from_reg ATTRIBUTE_UNUSED,
    395  1.1  mrg 		      const int to_reg ATTRIBUTE_UNUSED)
    396  1.1  mrg {
    397  1.1  mrg   return true;
    398  1.1  mrg }
    399  1.1  mrg 
    400  1.1  mrg /* Implements INITIAL_ELIMINATION_OFFSET.  */
    401  1.1  mrg int
    402  1.1  mrg msp430_initial_elimination_offset (int from, int to)
    403  1.1  mrg {
    404  1.1  mrg   int rv = 0; /* As if arg to arg.  */
    405  1.1  mrg 
    406  1.1  mrg   msp430_compute_frame_info ();
    407  1.1  mrg 
    408  1.1  mrg   switch (to)
    409  1.1  mrg     {
    410  1.1  mrg     case STACK_POINTER_REGNUM:
    411  1.1  mrg       rv += cfun->machine->framesize_outgoing;
    412  1.1  mrg       rv += cfun->machine->framesize_locals;
    413  1.1  mrg       /* Fall through.  */
    414  1.1  mrg     case FRAME_POINTER_REGNUM:
    415  1.1  mrg       rv += cfun->machine->framesize_regs;
    416  1.1  mrg       /* Allow for the saved return address.  */
    417  1.1  mrg       rv += (TARGET_LARGE ? 4 : 2);
    418  1.1  mrg       /* NB/ No need to allow for crtl->args.pretend_args_size.
    419  1.1  mrg 	 GCC does that for us.  */
    420  1.1  mrg       break;
    421  1.1  mrg     default:
    422  1.1  mrg       gcc_unreachable ();
    423  1.1  mrg     }
    424  1.1  mrg 
    425  1.1  mrg   switch (from)
    426  1.1  mrg     {
    427  1.1  mrg     case FRAME_POINTER_REGNUM:
    428  1.1  mrg       /* Allow for the fall through above.  */
    429  1.1  mrg       rv -= (TARGET_LARGE ? 4 : 2);
    430  1.1  mrg       rv -= cfun->machine->framesize_regs;
    431  1.1  mrg     case ARG_POINTER_REGNUM:
    432  1.1  mrg       break;
    433  1.1  mrg     default:
    434  1.1  mrg       gcc_unreachable ();
    435  1.1  mrg     }
    436  1.1  mrg 
    437  1.1  mrg   return rv;
    438  1.1  mrg }
    439  1.1  mrg 
    440  1.1  mrg /* Named Address Space support */
    442  1.1  mrg 
    443  1.1  mrg 
    444  1.1  mrg /* Return the appropriate mode for a named address pointer.  */
    445  1.1  mrg #undef  TARGET_ADDR_SPACE_POINTER_MODE
    446  1.1  mrg #define TARGET_ADDR_SPACE_POINTER_MODE msp430_addr_space_pointer_mode
    447  1.1  mrg #undef  TARGET_ADDR_SPACE_ADDRESS_MODE
    448  1.1  mrg #define TARGET_ADDR_SPACE_ADDRESS_MODE msp430_addr_space_pointer_mode
    449  1.1  mrg 
    450  1.1  mrg static scalar_int_mode
    451  1.1  mrg msp430_addr_space_pointer_mode (addr_space_t addrspace)
    452  1.1  mrg {
    453  1.1  mrg   switch (addrspace)
    454  1.1  mrg     {
    455  1.1  mrg     default:
    456  1.1  mrg     case ADDR_SPACE_GENERIC:
    457  1.1  mrg       return Pmode;
    458  1.1  mrg     case ADDR_SPACE_NEAR:
    459  1.1  mrg       return HImode;
    460  1.1  mrg     case ADDR_SPACE_FAR:
    461  1.1  mrg       return PSImode;
    462  1.1  mrg     }
    463  1.1  mrg }
    464  1.1  mrg 
    465  1.1  mrg /* Function pointers are stored in unwind_word sized
    466  1.1  mrg    variables, so make sure that unwind_word is big enough.  */
    467  1.1  mrg #undef  TARGET_UNWIND_WORD_MODE
    468  1.1  mrg #define TARGET_UNWIND_WORD_MODE msp430_unwind_word_mode
    469  1.1  mrg 
    470  1.1  mrg static scalar_int_mode
    471  1.1  mrg msp430_unwind_word_mode (void)
    472  1.1  mrg {
    473  1.1  mrg   /* This needs to match msp430_init_dwarf_reg_sizes_extra (below).  */
    474  1.1  mrg   return msp430x ? PSImode : HImode;
    475  1.1  mrg }
    476  1.1  mrg 
    477  1.1  mrg /* Determine if one named address space is a subset of another.  */
    478  1.1  mrg #undef  TARGET_ADDR_SPACE_SUBSET_P
    479  1.1  mrg #define TARGET_ADDR_SPACE_SUBSET_P msp430_addr_space_subset_p
    480  1.1  mrg static bool
    481  1.1  mrg msp430_addr_space_subset_p (addr_space_t subset, addr_space_t superset)
    482  1.1  mrg {
    483  1.1  mrg   if (subset == superset)
    484  1.1  mrg     return true;
    485  1.1  mrg   else
    486  1.1  mrg     return (subset != ADDR_SPACE_FAR && superset == ADDR_SPACE_FAR);
    487  1.1  mrg }
    488  1.1  mrg 
    489  1.1  mrg #undef  TARGET_ADDR_SPACE_CONVERT
    490  1.1  mrg #define TARGET_ADDR_SPACE_CONVERT msp430_addr_space_convert
    491  1.1  mrg /* Convert from one address space to another.  */
    492  1.1  mrg static rtx
    493  1.1  mrg msp430_addr_space_convert (rtx op, tree from_type, tree to_type)
    494  1.1  mrg {
    495  1.1  mrg   addr_space_t from_as = TYPE_ADDR_SPACE (TREE_TYPE (from_type));
    496  1.1  mrg   addr_space_t to_as = TYPE_ADDR_SPACE (TREE_TYPE (to_type));
    497  1.1  mrg   rtx result;
    498  1.1  mrg 
    499  1.1  mrg   if (to_as != ADDR_SPACE_FAR && from_as == ADDR_SPACE_FAR)
    500  1.1  mrg     {
    501  1.1  mrg       /* This is unpredictable, as we're truncating off usable address
    502  1.1  mrg 	 bits.  */
    503  1.1  mrg 
    504  1.1  mrg       if (CONSTANT_P (op))
    505  1.1  mrg 	return gen_rtx_CONST (HImode, op);
    506  1.1  mrg 
    507  1.1  mrg       result = gen_reg_rtx (HImode);
    508  1.1  mrg       emit_insn (gen_truncpsihi2 (result, op));
    509  1.1  mrg       return result;
    510  1.1  mrg     }
    511  1.1  mrg   else if (to_as == ADDR_SPACE_FAR && from_as != ADDR_SPACE_FAR)
    512  1.1  mrg     {
    513  1.1  mrg       /* This always works.  */
    514  1.1  mrg 
    515  1.1  mrg       if (CONSTANT_P (op))
    516  1.1  mrg 	return gen_rtx_CONST (PSImode, op);
    517  1.1  mrg 
    518  1.1  mrg       result = gen_reg_rtx (PSImode);
    519  1.1  mrg       emit_insn (gen_zero_extendhipsi2 (result, op));
    520  1.1  mrg       return result;
    521  1.1  mrg     }
    522  1.1  mrg   else
    523  1.1  mrg     gcc_unreachable ();
    524  1.1  mrg }
    525  1.1  mrg 
    526  1.1  mrg /* Stack Layout and Calling Conventions.  */
    528  1.1  mrg 
    529  1.1  mrg /* For each function, we list the gcc version and the TI version on
    530  1.1  mrg    each line, where we're converting the function names.  */
    531  1.1  mrg static char const * const special_convention_function_names[] =
    532  1.1  mrg {
    533  1.1  mrg   "__muldi3", "__mspabi_mpyll",
    534  1.1  mrg   "__udivdi3", "__mspabi_divull",
    535  1.1  mrg   "__umoddi3", "__mspabi_remull",
    536  1.1  mrg   "__divdi3", "__mspabi_divlli",
    537  1.1  mrg   "__moddi3", "__mspabi_remlli",
    538  1.1  mrg   "__mspabi_srall",
    539  1.1  mrg   "__mspabi_srlll",
    540  1.1  mrg   "__mspabi_sllll",
    541  1.1  mrg   "__adddf3", "__mspabi_addd",
    542  1.1  mrg   "__subdf3", "__mspabi_subd",
    543  1.1  mrg   "__muldf3", "__mspabi_mpyd",
    544  1.1  mrg   "__divdf3", "__mspabi_divd",
    545  1.1  mrg   "__mspabi_cmpd",
    546  1.1  mrg   NULL
    547  1.1  mrg };
    548  1.1  mrg 
    549  1.1  mrg /* TRUE if the function passed is a "speical" function.  Special
    550  1.1  mrg    functions pass two DImode parameters in registers.  */
    551  1.1  mrg static bool
    552  1.1  mrg msp430_special_register_convention_p (const char *name)
    553  1.1  mrg {
    554  1.1  mrg   int i;
    555  1.1  mrg 
    556  1.1  mrg   for (i = 0; special_convention_function_names[i]; i++)
    557  1.1  mrg     if (!strcmp (name, special_convention_function_names[i]))
    558  1.1  mrg       return true;
    559  1.1  mrg 
    560  1.1  mrg   return false;
    561  1.1  mrg }
    562  1.1  mrg 
    563  1.1  mrg #undef  TARGET_FUNCTION_VALUE_REGNO_P
    564  1.1  mrg #define TARGET_FUNCTION_VALUE_REGNO_P msp430_function_value_regno_p
    565  1.1  mrg 
    566  1.1  mrg bool
    567  1.1  mrg msp430_function_value_regno_p (unsigned int regno)
    568  1.1  mrg {
    569  1.1  mrg   return regno == 12;
    570  1.1  mrg }
    571  1.1  mrg 
    572  1.1  mrg 
    573  1.1  mrg #undef  TARGET_FUNCTION_VALUE
    574  1.1  mrg #define TARGET_FUNCTION_VALUE msp430_function_value
    575  1.1  mrg 
    576  1.1  mrg rtx
    577  1.1  mrg msp430_function_value (const_tree ret_type,
    578  1.1  mrg 		       const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
    579  1.1  mrg 		       bool outgoing ATTRIBUTE_UNUSED)
    580  1.1  mrg {
    581  1.1  mrg   return gen_rtx_REG (TYPE_MODE (ret_type), 12);
    582  1.1  mrg }
    583  1.1  mrg 
    584  1.1  mrg #undef  TARGET_LIBCALL_VALUE
    585  1.1  mrg #define TARGET_LIBCALL_VALUE msp430_libcall_value
    586  1.1  mrg 
    587  1.1  mrg rtx
    588  1.1  mrg msp430_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
    589  1.1  mrg {
    590  1.1  mrg   return gen_rtx_REG (mode, 12);
    591  1.1  mrg }
    592  1.1  mrg 
    593  1.1  mrg /* Implements INIT_CUMULATIVE_ARGS.  */
    594  1.1  mrg void
    595  1.1  mrg msp430_init_cumulative_args (CUMULATIVE_ARGS *ca,
    596  1.1  mrg 			     tree fntype ATTRIBUTE_UNUSED,
    597  1.1  mrg 			     rtx libname ATTRIBUTE_UNUSED,
    598  1.1  mrg 			     tree fndecl ATTRIBUTE_UNUSED,
    599  1.1  mrg 			     int n_named_args ATTRIBUTE_UNUSED)
    600  1.1  mrg {
    601  1.1  mrg   const char *fname;
    602  1.1  mrg   memset (ca, 0, sizeof(*ca));
    603  1.1  mrg 
    604  1.1  mrg   ca->can_split = 1;
    605  1.1  mrg 
    606  1.1  mrg   if (fndecl)
    607  1.1  mrg     fname = IDENTIFIER_POINTER (DECL_NAME (fndecl));
    608  1.1  mrg   else if (libname)
    609  1.1  mrg     fname = XSTR (libname, 0);
    610  1.1  mrg   else
    611  1.1  mrg     fname = NULL;
    612  1.1  mrg 
    613  1.1  mrg   if (fname && msp430_special_register_convention_p (fname))
    614  1.1  mrg     ca->special_p = 1;
    615  1.1  mrg }
    616  1.1  mrg 
    617  1.1  mrg /* Helper function for argument passing; this function is the common
    618  1.1  mrg    code that determines where an argument will be passed.  */
    619  1.1  mrg static void
    620  1.1  mrg msp430_evaluate_arg (cumulative_args_t cap,
    621  1.1  mrg 		     machine_mode mode,
    622  1.1  mrg 		     const_tree type ATTRIBUTE_UNUSED,
    623  1.1  mrg 		     bool named)
    624  1.1  mrg {
    625  1.1  mrg   CUMULATIVE_ARGS *ca = get_cumulative_args (cap);
    626  1.1  mrg   int nregs = GET_MODE_SIZE (mode);
    627  1.1  mrg   int i;
    628  1.1  mrg 
    629  1.1  mrg   ca->reg_count = 0;
    630  1.1  mrg   ca->mem_count = 0;
    631  1.1  mrg 
    632  1.1  mrg   if (!named)
    633  1.1  mrg     return;
    634  1.1  mrg 
    635  1.1  mrg   if (mode == PSImode)
    636  1.1  mrg     nregs = 1;
    637  1.1  mrg   else
    638  1.1  mrg     nregs = (nregs + 1) / 2;
    639  1.1  mrg 
    640  1.1  mrg   if (ca->special_p)
    641  1.1  mrg     {
    642  1.1  mrg       /* Function is passed two DImode operands, in R8:R11 and
    643  1.1  mrg 	 R12:15.  */
    644  1.1  mrg       ca->start_reg = 8;
    645  1.1  mrg       ca->reg_count = 4;
    646  1.1  mrg       return;
    647  1.1  mrg     }
    648  1.1  mrg 
    649  1.1  mrg   switch (nregs)
    650  1.1  mrg     {
    651  1.1  mrg     case 1:
    652  1.1  mrg       for (i = 0; i < 4; i++)
    653  1.1  mrg 	if (!ca->reg_used[i])
    654  1.1  mrg 	  {
    655  1.1  mrg 	    ca->reg_count = 1;
    656  1.1  mrg 	    ca->start_reg = CA_FIRST_REG + i;
    657  1.1  mrg 	    return;
    658  1.1  mrg 	  }
    659  1.1  mrg       break;
    660  1.1  mrg     case 2:
    661  1.1  mrg       for (i = 0; i < 3; i++)
    662  1.1  mrg 	if (!ca->reg_used[i] && !ca->reg_used[i + 1])
    663  1.1  mrg 	  {
    664  1.1  mrg 	    ca->reg_count = 2;
    665  1.1  mrg 	    ca->start_reg = CA_FIRST_REG + i;
    666  1.1  mrg 	    return;
    667  1.1  mrg 	  }
    668  1.1  mrg       if (!ca->reg_used[3] && ca->can_split)
    669  1.1  mrg 	{
    670  1.1  mrg 	  ca->reg_count = 1;
    671  1.1  mrg 	  ca->mem_count = 2;
    672  1.1  mrg 	  ca->start_reg = CA_FIRST_REG + 3;
    673  1.1  mrg 	  return;
    674  1.1  mrg 	}
    675  1.1  mrg       break;
    676  1.1  mrg     case 3:
    677  1.1  mrg     case 4:
    678  1.1  mrg       ca->can_split = 0;
    679  1.1  mrg       if (!ca->reg_used[0]
    680  1.1  mrg 	  && !ca->reg_used[1]
    681  1.1  mrg 	  && !ca->reg_used[2]
    682  1.1  mrg 	  && !ca->reg_used[3])
    683  1.1  mrg 	{
    684  1.1  mrg 	  ca->reg_count = 4;
    685  1.1  mrg 	  ca->start_reg = CA_FIRST_REG;
    686  1.1  mrg 	  return;
    687  1.1  mrg 	}
    688  1.1  mrg       break;
    689  1.1  mrg     }
    690  1.1  mrg }
    691  1.1  mrg 
    692  1.1  mrg #undef  TARGET_PROMOTE_PROTOTYPES
    693  1.1  mrg #define TARGET_PROMOTE_PROTOTYPES msp430_promote_prototypes
    694  1.1  mrg 
    695  1.1  mrg bool
    696  1.1  mrg msp430_promote_prototypes (const_tree fntype ATTRIBUTE_UNUSED)
    697  1.1  mrg {
    698  1.1  mrg   return false;
    699  1.1  mrg }
    700  1.1  mrg 
    701  1.1  mrg #undef  TARGET_FUNCTION_ARG
    702  1.1  mrg #define TARGET_FUNCTION_ARG msp430_function_arg
    703  1.1  mrg 
    704  1.1  mrg rtx
    705  1.1  mrg msp430_function_arg (cumulative_args_t cap,
    706  1.1  mrg 		     const function_arg_info &arg)
    707  1.1  mrg {
    708  1.1  mrg   CUMULATIVE_ARGS *ca = get_cumulative_args (cap);
    709  1.1  mrg 
    710  1.1  mrg   msp430_evaluate_arg (cap, arg.mode, arg.type, arg.named);
    711  1.1  mrg 
    712  1.1  mrg   if (ca->reg_count)
    713  1.1  mrg     return gen_rtx_REG (arg.mode, ca->start_reg);
    714  1.1  mrg 
    715  1.1  mrg   return 0;
    716  1.1  mrg }
    717  1.1  mrg 
    718  1.1  mrg #undef  TARGET_ARG_PARTIAL_BYTES
    719  1.1  mrg #define TARGET_ARG_PARTIAL_BYTES msp430_arg_partial_bytes
    720  1.1  mrg 
    721  1.1  mrg int
    722  1.1  mrg msp430_arg_partial_bytes (cumulative_args_t cap, const function_arg_info &arg)
    723  1.1  mrg {
    724  1.1  mrg   CUMULATIVE_ARGS *ca = get_cumulative_args (cap);
    725  1.1  mrg 
    726  1.1  mrg   msp430_evaluate_arg (cap, arg.mode, arg.type, arg.named);
    727  1.1  mrg 
    728  1.1  mrg   if (ca->reg_count && ca->mem_count)
    729  1.1  mrg     return ca->reg_count * UNITS_PER_WORD;
    730  1.1  mrg 
    731  1.1  mrg   return 0;
    732  1.1  mrg }
    733  1.1  mrg 
    734  1.1  mrg #undef  TARGET_PASS_BY_REFERENCE
    735  1.1  mrg #define TARGET_PASS_BY_REFERENCE msp430_pass_by_reference
    736  1.1  mrg 
    737  1.1  mrg static bool
    738  1.1  mrg msp430_pass_by_reference (cumulative_args_t, const function_arg_info &arg)
    739  1.1  mrg {
    740  1.1  mrg   return (arg.mode == BLKmode
    741  1.1  mrg 	  || (arg.type && TREE_CODE (arg.type) == RECORD_TYPE)
    742  1.1  mrg 	  || (arg.type && TREE_CODE (arg.type) == UNION_TYPE));
    743  1.1  mrg }
    744  1.1  mrg 
    745  1.1  mrg #undef  TARGET_CALLEE_COPIES
    746  1.1  mrg #define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_arg_info_true
    747  1.1  mrg 
    748  1.1  mrg #undef  TARGET_FUNCTION_ARG_ADVANCE
    749  1.1  mrg #define TARGET_FUNCTION_ARG_ADVANCE msp430_function_arg_advance
    750  1.1  mrg 
    751  1.1  mrg void
    752  1.1  mrg msp430_function_arg_advance (cumulative_args_t cap,
    753  1.1  mrg 			     const function_arg_info &arg)
    754  1.1  mrg {
    755  1.1  mrg   CUMULATIVE_ARGS *ca = get_cumulative_args (cap);
    756  1.1  mrg   int i;
    757  1.1  mrg 
    758  1.1  mrg   msp430_evaluate_arg (cap, arg.mode, arg.type, arg.named);
    759  1.1  mrg 
    760  1.1  mrg   if (ca->start_reg >= CA_FIRST_REG)
    761  1.1  mrg     for (i = 0; i < ca->reg_count; i ++)
    762  1.1  mrg       ca->reg_used[i + ca->start_reg - CA_FIRST_REG] = 1;
    763  1.1  mrg 
    764  1.1  mrg   ca->special_p = 0;
    765  1.1  mrg }
    766  1.1  mrg 
    767  1.1  mrg #undef  TARGET_FUNCTION_ARG_BOUNDARY
    768  1.1  mrg #define TARGET_FUNCTION_ARG_BOUNDARY msp430_function_arg_boundary
    769  1.1  mrg 
    770  1.1  mrg static unsigned int
    771  1.1  mrg msp430_function_arg_boundary (machine_mode mode, const_tree type)
    772  1.1  mrg {
    773  1.1  mrg   if (mode == BLKmode
    774  1.1  mrg       && int_size_in_bytes (type) > 1)
    775  1.1  mrg     return 16;
    776  1.1  mrg   if (GET_MODE_BITSIZE (mode) > 8)
    777  1.1  mrg     return 16;
    778  1.1  mrg   return 8;
    779  1.1  mrg }
    780  1.1  mrg 
    781  1.1  mrg #undef  TARGET_RETURN_IN_MEMORY
    782  1.1  mrg #define TARGET_RETURN_IN_MEMORY msp430_return_in_memory
    783  1.1  mrg 
    784  1.1  mrg static bool
    785  1.1  mrg msp430_return_in_memory (const_tree ret_type,
    786  1.1  mrg 			 const_tree fntype ATTRIBUTE_UNUSED)
    787  1.1  mrg {
    788  1.1  mrg   machine_mode mode = TYPE_MODE (ret_type);
    789  1.1  mrg 
    790  1.1  mrg   if (mode == BLKmode
    791  1.1  mrg       || (fntype && TREE_CODE (TREE_TYPE (fntype)) == RECORD_TYPE)
    792  1.1  mrg       || (fntype && TREE_CODE (TREE_TYPE (fntype)) == UNION_TYPE))
    793  1.1  mrg     return true;
    794  1.1  mrg 
    795  1.1  mrg   if (GET_MODE_SIZE (mode) > 8)
    796  1.1  mrg     return true;
    797  1.1  mrg 
    798  1.1  mrg   return false;
    799  1.1  mrg }
    800  1.1  mrg 
    801  1.1  mrg #undef  TARGET_GET_RAW_ARG_MODE
    802  1.1  mrg #define TARGET_GET_RAW_ARG_MODE msp430_get_raw_arg_mode
    803  1.1  mrg 
    804  1.1  mrg static fixed_size_mode
    805  1.1  mrg msp430_get_raw_arg_mode (int regno)
    806  1.1  mrg {
    807  1.1  mrg   return as_a <fixed_size_mode> (regno == ARG_POINTER_REGNUM
    808  1.1  mrg 				 ? VOIDmode : Pmode);
    809  1.1  mrg }
    810  1.1  mrg 
    811  1.1  mrg #undef  TARGET_GET_RAW_RESULT_MODE
    812  1.1  mrg #define TARGET_GET_RAW_RESULT_MODE msp430_get_raw_result_mode
    813  1.1  mrg 
    814  1.1  mrg static fixed_size_mode
    815  1.1  mrg msp430_get_raw_result_mode (int regno ATTRIBUTE_UNUSED)
    816  1.1  mrg {
    817  1.1  mrg   return Pmode;
    818  1.1  mrg }
    819  1.1  mrg 
    820  1.1  mrg #undef  TARGET_GIMPLIFY_VA_ARG_EXPR
    821  1.1  mrg #define TARGET_GIMPLIFY_VA_ARG_EXPR msp430_gimplify_va_arg_expr
    822  1.1  mrg 
    823  1.1  mrg #include "gimplify.h"
    824  1.1  mrg 
    825  1.1  mrg static tree
    826  1.1  mrg msp430_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
    827  1.1  mrg 			     gimple_seq *post_p)
    828  1.1  mrg {
    829  1.1  mrg   tree addr, t, type_size, rounded_size, valist_tmp;
    830  1.1  mrg   unsigned HOST_WIDE_INT align, boundary;
    831  1.1  mrg   bool indirect;
    832  1.1  mrg 
    833  1.1  mrg   indirect = pass_va_arg_by_reference (type);
    834  1.1  mrg   if (indirect)
    835  1.1  mrg     type = build_pointer_type (type);
    836  1.1  mrg 
    837  1.1  mrg   align = PARM_BOUNDARY / BITS_PER_UNIT;
    838  1.1  mrg   boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
    839  1.1  mrg 
    840  1.1  mrg   /* When we align parameter on stack for caller, if the parameter
    841  1.1  mrg      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
    842  1.1  mrg      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
    843  1.1  mrg      here with caller.  */
    844  1.1  mrg   if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
    845  1.1  mrg     boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
    846  1.1  mrg 
    847  1.1  mrg   boundary /= BITS_PER_UNIT;
    848  1.1  mrg 
    849  1.1  mrg   /* Hoist the valist value into a temporary for the moment.  */
    850  1.1  mrg   valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
    851  1.1  mrg 
    852  1.1  mrg   /* va_list pointer is aligned to PARM_BOUNDARY.  If argument actually
    853  1.1  mrg      requires greater alignment, we must perform dynamic alignment.  */
    854  1.1  mrg   if (boundary > align
    855  1.1  mrg       && !integer_zerop (TYPE_SIZE (type)))
    856  1.1  mrg     {
    857  1.1  mrg       /* FIXME: This is where this function diverts from targhooks.cc:
    858  1.1  mrg 	 std_gimplify_va_arg_expr().  It works, but I do not know why...  */
    859  1.1  mrg       if (! POINTER_TYPE_P (type))
    860  1.1  mrg 	{
    861  1.1  mrg 	  t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
    862  1.1  mrg 		      fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
    863  1.1  mrg 	  gimplify_and_add (t, pre_p);
    864  1.1  mrg 
    865  1.1  mrg 	  t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
    866  1.1  mrg 		      fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist),
    867  1.1  mrg 				   valist_tmp,
    868  1.1  mrg 				   build_int_cst (TREE_TYPE (valist),
    869  1.1  mrg 						  -boundary)));
    870  1.1  mrg 	  gimplify_and_add (t, pre_p);
    871  1.1  mrg 	}
    872  1.1  mrg     }
    873  1.1  mrg   else
    874  1.1  mrg     boundary = align;
    875  1.1  mrg 
    876  1.1  mrg   /* If the actual alignment is less than the alignment of the type,
    877  1.1  mrg      adjust the type accordingly so that we don't assume strict alignment
    878  1.1  mrg      when dereferencing the pointer.  */
    879  1.1  mrg   boundary *= BITS_PER_UNIT;
    880  1.1  mrg   if (boundary < TYPE_ALIGN (type))
    881  1.1  mrg     {
    882  1.1  mrg       type = build_variant_type_copy (type);
    883  1.1  mrg       SET_TYPE_ALIGN (type, boundary);
    884  1.1  mrg     }
    885  1.1  mrg 
    886  1.1  mrg   /* Compute the rounded size of the type.  */
    887  1.1  mrg   type_size = size_in_bytes (type);
    888  1.1  mrg   rounded_size = round_up (type_size, align);
    889  1.1  mrg 
    890  1.1  mrg   /* Reduce rounded_size so it's sharable with the postqueue.  */
    891  1.1  mrg   gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
    892  1.1  mrg 
    893  1.1  mrg   /* Get AP.  */
    894  1.1  mrg   addr = valist_tmp;
    895  1.1  mrg 
    896  1.1  mrg   /* Compute new value for AP.  */
    897  1.1  mrg   t = fold_build_pointer_plus (valist_tmp, rounded_size);
    898  1.1  mrg   t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
    899  1.1  mrg   gimplify_and_add (t, pre_p);
    900  1.1  mrg 
    901  1.1  mrg   addr = fold_convert (build_pointer_type (type), addr);
    902  1.1  mrg 
    903  1.1  mrg   if (indirect)
    904  1.1  mrg     addr = build_va_arg_indirect_ref (addr);
    905  1.1  mrg 
    906  1.1  mrg   addr = build_va_arg_indirect_ref (addr);
    907  1.1  mrg 
    908  1.1  mrg   return addr;
    909  1.1  mrg }
    910  1.1  mrg 
    911  1.1  mrg #undef TARGET_LRA_P
    913  1.1  mrg #define TARGET_LRA_P hook_bool_void_false
    914  1.1  mrg 
    915  1.1  mrg /* Addressing Modes */
    916  1.1  mrg 
    917  1.1  mrg #undef  TARGET_LEGITIMATE_ADDRESS_P
    918  1.1  mrg #define TARGET_LEGITIMATE_ADDRESS_P msp430_legitimate_address_p
    919  1.1  mrg 
    920  1.1  mrg static bool
    921  1.1  mrg reg_ok_for_addr (rtx r, bool strict)
    922  1.1  mrg {
    923  1.1  mrg   int rn = REGNO (r);
    924  1.1  mrg 
    925  1.1  mrg   if (strict && rn >= FIRST_PSEUDO_REGISTER)
    926  1.1  mrg     rn = reg_renumber[rn];
    927  1.1  mrg   if (strict && 0 <= rn && rn < FIRST_PSEUDO_REGISTER)
    928  1.1  mrg     return true;
    929  1.1  mrg   if (!strict)
    930  1.1  mrg     return true;
    931  1.1  mrg   return false;
    932  1.1  mrg }
    933  1.1  mrg 
    934  1.1  mrg bool
    935  1.1  mrg msp430_legitimate_address_p (machine_mode mode ATTRIBUTE_UNUSED,
    936  1.1  mrg 			     rtx x ATTRIBUTE_UNUSED,
    937  1.1  mrg 			     bool strict ATTRIBUTE_UNUSED)
    938  1.1  mrg {
    939  1.1  mrg   switch (GET_CODE (x))
    940  1.1  mrg     {
    941  1.1  mrg     case MEM:
    942  1.1  mrg       return false;
    943  1.1  mrg 
    944  1.1  mrg     case PLUS:
    945  1.1  mrg     case POST_INC:
    946  1.1  mrg       if (REG_P (XEXP (x, 0)))
    947  1.1  mrg 	{
    948  1.1  mrg 	  if (GET_MODE (x) != GET_MODE (XEXP (x, 0)))
    949  1.1  mrg 	    return false;
    950  1.1  mrg 	  if (!reg_ok_for_addr (XEXP (x, 0), strict))
    951  1.1  mrg 	    return false;
    952  1.1  mrg 	  if (GET_CODE (x) == POST_INC)
    953  1.1  mrg 	    /* At this point, if the original rtx was a post_inc, we don't have
    954  1.1  mrg 	       anything further to check.  */
    955  1.1  mrg 	    return true;
    956  1.1  mrg 	  switch (GET_CODE (XEXP (x, 1)))
    957  1.1  mrg 	    {
    958  1.1  mrg 	    case CONST:
    959  1.1  mrg 	    case SYMBOL_REF:
    960  1.1  mrg 	    case CONST_INT:
    961  1.1  mrg 	      return true;
    962  1.1  mrg 	    default:
    963  1.1  mrg 	      return false;
    964  1.1  mrg 	    }
    965  1.1  mrg 	}
    966  1.1  mrg       return false;
    967  1.1  mrg 
    968  1.1  mrg     case REG:
    969  1.1  mrg       if (!reg_ok_for_addr (x, strict))
    970  1.1  mrg 	return false;
    971  1.1  mrg       /* FALLTHRU */
    972  1.1  mrg     case CONST:
    973  1.1  mrg     case SYMBOL_REF:
    974  1.1  mrg     case CONST_INT:
    975  1.1  mrg       return true;
    976  1.1  mrg 
    977  1.1  mrg     default:
    978  1.1  mrg       return false;
    979  1.1  mrg     }
    980  1.1  mrg }
    981  1.1  mrg 
    982  1.1  mrg #undef  TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P
    983  1.1  mrg #define TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P \
    984  1.1  mrg   msp430_addr_space_legitimate_address_p
    985  1.1  mrg 
    986  1.1  mrg bool
    987  1.1  mrg msp430_addr_space_legitimate_address_p (machine_mode mode,
    988  1.1  mrg 					rtx x,
    989  1.1  mrg 					bool strict,
    990  1.1  mrg 					addr_space_t as ATTRIBUTE_UNUSED)
    991  1.1  mrg {
    992  1.1  mrg   return msp430_legitimate_address_p (mode, x, strict);
    993  1.1  mrg }
    994  1.1  mrg 
    995  1.1  mrg #undef  TARGET_ASM_INTEGER
    996  1.1  mrg #define TARGET_ASM_INTEGER msp430_asm_integer
    997  1.1  mrg static bool
    998  1.1  mrg msp430_asm_integer (rtx x, unsigned int size, int aligned_p)
    999  1.1  mrg {
   1000  1.1  mrg   int c = GET_CODE (x);
   1001  1.1  mrg 
   1002  1.1  mrg   if (size == 3 && GET_MODE (x) == PSImode)
   1003  1.1  mrg     size = 4;
   1004  1.1  mrg 
   1005  1.1  mrg   switch (size)
   1006  1.1  mrg     {
   1007  1.1  mrg     case 4:
   1008  1.1  mrg       if (c == SYMBOL_REF || c == CONST || c == LABEL_REF || c == CONST_INT
   1009  1.1  mrg 	  || c == PLUS || c == MINUS)
   1010  1.1  mrg 	{
   1011  1.1  mrg 	  fprintf (asm_out_file, "\t.long\t");
   1012  1.1  mrg 	  output_addr_const (asm_out_file, x);
   1013  1.1  mrg 	  fputc ('\n', asm_out_file);
   1014  1.1  mrg 	  return true;
   1015  1.1  mrg 	}
   1016  1.1  mrg       break;
   1017  1.1  mrg     }
   1018  1.1  mrg   return default_assemble_integer (x, size, aligned_p);
   1019  1.1  mrg }
   1020  1.1  mrg 
   1021  1.1  mrg #undef  TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
   1022  1.1  mrg #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA msp430_asm_output_addr_const_extra
   1023  1.1  mrg static bool
   1024  1.1  mrg msp430_asm_output_addr_const_extra (FILE *file ATTRIBUTE_UNUSED, rtx x)
   1025  1.1  mrg {
   1026  1.1  mrg   debug_rtx (x);
   1027  1.1  mrg   return false;
   1028  1.1  mrg }
   1029  1.1  mrg 
   1030  1.1  mrg #undef  TARGET_LEGITIMATE_CONSTANT_P
   1031  1.1  mrg #define TARGET_LEGITIMATE_CONSTANT_P msp430_legitimate_constant
   1032  1.1  mrg 
   1033  1.1  mrg static bool
   1034  1.1  mrg msp430_legitimate_constant (machine_mode mode, rtx x)
   1035  1.1  mrg {
   1036  1.1  mrg   return ! CONST_INT_P (x)
   1037  1.1  mrg     || mode != PSImode
   1038  1.1  mrg     /* GCC does not know the width of the PSImode, so make
   1039  1.1  mrg        sure that it does not try to use a constant value that
   1040  1.1  mrg        is out of range.  */
   1041  1.1  mrg     || (INTVAL (x) < (1 << 20)
   1042  1.1  mrg 	&& INTVAL (x) >= (HOST_WIDE_INT)(HOST_WIDE_INT_M1U << 20));
   1043  1.1  mrg }
   1044  1.1  mrg 
   1045  1.1  mrg 
   1046  1.1  mrg /* Describing Relative Costs of Operations
   1048  1.1  mrg    To model the cost of an instruction, use the number of cycles when
   1049  1.1  mrg    optimizing for speed, and the number of words when optimizing for size.
   1050  1.1  mrg    The cheapest instruction will execute in one cycle and cost one word.
   1051  1.1  mrg    The cycle and size costs correspond to 430 ISA instructions, not 430X
   1052  1.1  mrg    instructions or 430X "address" instructions.  The relative costs of 430X
   1053  1.1  mrg    instructions is accurately modeled with the 430 costs.  The relative costs
   1054  1.1  mrg    of some "address" instructions can differ, but these are not yet handled.
   1055  1.1  mrg    Adding support for this could improve performance/code size.  */
   1056  1.1  mrg 
   1057  1.1  mrg struct single_op_cost
   1058  1.1  mrg {
   1059  1.1  mrg   const int reg;
   1060  1.1  mrg   /* Indirect register (@Rn) or indirect autoincrement (@Rn+).  */
   1061  1.1  mrg   const int ind;
   1062  1.1  mrg   const int mem;
   1063  1.1  mrg };
   1064  1.1  mrg 
   1065  1.1  mrg static const struct single_op_cost cycle_cost_single_op =
   1066  1.1  mrg {
   1067  1.1  mrg   1, 3, 4
   1068  1.1  mrg };
   1069  1.1  mrg 
   1070  1.1  mrg static const struct single_op_cost size_cost_single_op =
   1071  1.1  mrg {
   1072  1.1  mrg   1, 1, 2
   1073  1.1  mrg };
   1074  1.1  mrg 
   1075  1.1  mrg /* When the destination of an insn is memory, the cost is always the same
   1076  1.1  mrg    regardless of whether that memory is accessed using indirect register,
   1077  1.1  mrg    indexed or absolute addressing.
   1078  1.1  mrg    When the source operand is memory, indirect register and post-increment have
   1079  1.1  mrg    the same cost, which is lower than indexed and absolute, which also have
   1080  1.1  mrg    the same cost.  */
   1081  1.1  mrg struct double_op_cost
   1082  1.1  mrg {
   1083  1.1  mrg   /* Source operand is a register.  */
   1084  1.1  mrg   const int r2r;
   1085  1.1  mrg   const int r2pc;
   1086  1.1  mrg   const int r2m;
   1087  1.1  mrg 
   1088  1.1  mrg   /* Source operand is memory, using indirect register (@Rn) or indirect
   1089  1.1  mrg      autoincrement (@Rn+) addressing modes.  */
   1090  1.1  mrg   const int ind2r;
   1091  1.1  mrg   const int ind2pc;
   1092  1.1  mrg   const int ind2m;
   1093  1.1  mrg 
   1094  1.1  mrg   /* Source operand is an immediate.  */
   1095  1.1  mrg   const int imm2r;
   1096  1.1  mrg   const int imm2pc;
   1097  1.1  mrg   const int imm2m;
   1098  1.1  mrg 
   1099  1.1  mrg   /* Source operand is memory, using indexed (x(Rn)) or absolute (&ADDR)
   1100  1.1  mrg      addressing modes.  */
   1101  1.1  mrg   const int mem2r;
   1102  1.1  mrg   const int mem2pc;
   1103  1.1  mrg   const int mem2m;
   1104  1.1  mrg };
   1105  1.1  mrg 
   1106  1.1  mrg /* These structures describe the cost of MOV, BIT and CMP instructions, in terms
   1107  1.1  mrg    of clock cycles or words.  */
   1108  1.1  mrg static const struct double_op_cost cycle_cost_double_op_mov =
   1109  1.1  mrg {
   1110  1.1  mrg   1, 3, 3,
   1111  1.1  mrg   2, 4, 4,
   1112  1.1  mrg   2, 3, 4,
   1113  1.1  mrg   3, 5, 5
   1114  1.1  mrg };
   1115  1.1  mrg 
   1116  1.1  mrg /* Cycle count when memory is the destination operand is one larger than above
   1117  1.1  mrg    for instructions that aren't MOV, BIT or CMP.  */
   1118  1.1  mrg static const struct double_op_cost cycle_cost_double_op =
   1119  1.1  mrg {
   1120  1.1  mrg   1, 3, 4,
   1121  1.1  mrg   2, 4, 5,
   1122  1.1  mrg   2, 3, 5,
   1123  1.1  mrg   3, 5, 6
   1124  1.1  mrg };
   1125  1.1  mrg 
   1126  1.1  mrg static const struct double_op_cost size_cost_double_op =
   1127  1.1  mrg {
   1128  1.1  mrg   1, 1, 2,
   1129  1.1  mrg   1, 1, 2,
   1130  1.1  mrg   2, 2, 3,
   1131  1.1  mrg   2, 2, 3
   1132  1.1  mrg };
   1133  1.1  mrg 
   1134  1.1  mrg struct msp430_multlib_costs
   1135  1.1  mrg {
   1136  1.1  mrg   const int mulhi;
   1137  1.1  mrg   const int mulsi;
   1138  1.1  mrg   const int muldi;
   1139  1.1  mrg };
   1140  1.1  mrg 
   1141  1.1  mrg /* There is no precise size cost when using libcalls, instead it is disparaged
   1142  1.1  mrg    relative to other instructions.
   1143  1.1  mrg    The cycle costs are from the CALL to the RET, inclusive.
   1144  1.1  mrg    FIXME muldi cost is not accurate.  */
   1145  1.1  mrg static const struct msp430_multlib_costs cycle_cost_multlib_32bit =
   1146  1.1  mrg {
   1147  1.1  mrg   27, 33, 66
   1148  1.1  mrg };
   1149  1.1  mrg 
   1150  1.1  mrg /* 32bit multiply takes a few more instructions on 16bit hwmult.  */
   1151  1.1  mrg static const struct msp430_multlib_costs cycle_cost_multlib_16bit =
   1152  1.1  mrg {
   1153  1.1  mrg   27, 42, 66
   1154  1.1  mrg };
   1155  1.1  mrg 
   1156  1.1  mrg /* TARGET_REGISTER_MOVE_COST
   1157  1.1  mrg    There is only one class of general-purpose, non-fixed registers, and the
   1158  1.1  mrg    relative cost of moving data between them is always the same.
   1159  1.1  mrg    Therefore, the default of 2 is optimal.  */
   1160  1.1  mrg 
   1161  1.1  mrg #undef TARGET_MEMORY_MOVE_COST
   1162  1.1  mrg #define TARGET_MEMORY_MOVE_COST msp430_memory_move_cost
   1163  1.1  mrg 
   1164  1.1  mrg /* Return the cost of moving data between registers and memory.
   1165  1.1  mrg    The returned cost must be relative to the default TARGET_REGISTER_MOVE_COST
   1166  1.1  mrg    of 2.
   1167  1.1  mrg    IN is false if the value is to be written to memory.  */
   1168  1.1  mrg static int
   1169  1.1  mrg msp430_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
   1170  1.1  mrg 			 reg_class_t rclass ATTRIBUTE_UNUSED,
   1171  1.1  mrg 			 bool in)
   1172  1.1  mrg {
   1173  1.1  mrg   int cost;
   1174  1.1  mrg   const struct double_op_cost *cost_p;
   1175  1.1  mrg   /* Optimize with a code size focus by default, unless -O2 or above is
   1176  1.1  mrg      specified.  */
   1177  1.1  mrg   bool speed = (!optimize_size && optimize >= 2);
   1178  1.1  mrg 
   1179  1.1  mrg   cost_p = (speed ? &cycle_cost_double_op_mov : &size_cost_double_op);
   1180  1.1  mrg 
   1181  1.1  mrg   if (in)
   1182  1.1  mrg     /* Reading from memory using indirect addressing is assumed to be the more
   1183  1.1  mrg        common case.  */
   1184  1.1  mrg     cost = cost_p->ind2r;
   1185  1.1  mrg   else
   1186  1.1  mrg     cost = cost_p->r2m;
   1187  1.1  mrg 
   1188  1.1  mrg   /* All register to register moves cost 1 cycle or 1 word, so multiply by 2
   1189  1.1  mrg      to get the costs relative to TARGET_REGISTER_MOVE_COST of 2.  */
   1190  1.1  mrg   return 2 * cost;
   1191  1.1  mrg }
   1192  1.1  mrg 
   1193  1.1  mrg /* For X, which must be a MEM RTX, return TRUE if it is an indirect memory
   1194  1.1  mrg    reference, @Rn or @Rn+.  */
   1195  1.1  mrg static bool
   1196  1.1  mrg msp430_is_mem_indirect (rtx x)
   1197  1.1  mrg {
   1198  1.1  mrg   gcc_assert (GET_CODE (x) == MEM);
   1199  1.1  mrg   rtx op0 = XEXP (x, 0);
   1200  1.1  mrg   return (GET_CODE (op0) == REG || GET_CODE (op0) == POST_INC);
   1201  1.1  mrg }
   1202  1.1  mrg 
   1203  1.1  mrg /* Costs of MSP430 instructions are generally based on the addressing mode
   1204  1.1  mrg    combination of the source and destination operands.
   1205  1.1  mrg    Given source operand SRC (which may be NULL to indicate a single-operand
   1206  1.1  mrg    instruction) and destination operand DST return the cost of this
   1207  1.1  mrg    expression.  */
   1208  1.1  mrg static int
   1209  1.1  mrg msp430_costs (rtx src, rtx dst, bool speed, rtx outer_rtx)
   1210  1.1  mrg {
   1211  1.1  mrg   enum rtx_code src_code = GET_CODE (src);
   1212  1.1  mrg   enum rtx_code dst_code = GET_CODE (dst);
   1213  1.1  mrg   enum rtx_code outer_code = GET_CODE (outer_rtx);
   1214  1.1  mrg   machine_mode outer_mode = GET_MODE (outer_rtx);
   1215  1.1  mrg   const struct double_op_cost *cost_p;
   1216  1.1  mrg   cost_p = (speed ? &cycle_cost_double_op : &size_cost_double_op);
   1217  1.1  mrg 
   1218  1.1  mrg   if (outer_code == TRUNCATE
   1219  1.1  mrg       && (outer_mode == QImode
   1220  1.1  mrg 	  || outer_mode == HImode
   1221  1.1  mrg 	  || outer_mode == PSImode))
   1222  1.1  mrg     /* Truncation to these modes is normally free as a side effect of the
   1223  1.1  mrg        instructions themselves.  */
   1224  1.1  mrg     return 0;
   1225  1.1  mrg 
   1226  1.1  mrg   if (dst_code == SYMBOL_REF
   1227  1.1  mrg       || dst_code == LABEL_REF
   1228  1.1  mrg       || dst_code == CONST_INT)
   1229  1.1  mrg     /* Catch RTX like (minus (const_int 0) (reg)) but don't add any cost.  */
   1230  1.1  mrg     return 0;
   1231  1.1  mrg 
   1232  1.1  mrg   switch (src_code)
   1233  1.1  mrg     {
   1234  1.1  mrg     case REG:
   1235  1.1  mrg       return (dst_code == REG ? cost_p->r2r
   1236  1.1  mrg 	      : (dst_code == PC ? cost_p->r2pc : cost_p->r2m));
   1237  1.1  mrg 
   1238  1.1  mrg     case CONST_INT:
   1239  1.1  mrg     case SYMBOL_REF:
   1240  1.1  mrg     case LABEL_REF:
   1241  1.1  mrg     case CONST:
   1242  1.1  mrg       return (dst_code == REG ? cost_p->imm2r
   1243  1.1  mrg 	      : (dst_code == PC ? cost_p->imm2pc : cost_p->imm2m));
   1244  1.1  mrg 
   1245  1.1  mrg 
   1246  1.1  mrg     case MEM:
   1247  1.1  mrg       if (msp430_is_mem_indirect (src))
   1248  1.1  mrg 	return (dst_code == REG ? cost_p->ind2r : (dst_code == PC
   1249  1.1  mrg 						   ? cost_p->ind2pc
   1250  1.1  mrg 						   : cost_p->ind2m));
   1251  1.1  mrg       else
   1252  1.1  mrg 	return (dst_code == REG ? cost_p->mem2r	: (dst_code == PC
   1253  1.1  mrg 						   ? cost_p->mem2pc
   1254  1.1  mrg 						   : cost_p->mem2m));
   1255  1.1  mrg     default:
   1256  1.1  mrg       return cost_p->mem2m;
   1257  1.1  mrg     }
   1258  1.1  mrg }
   1259  1.1  mrg 
   1260  1.1  mrg /* Given source operand SRC and destination operand DST from the shift or
   1261  1.1  mrg    rotate RTX OUTER_RTX, return the cost of performing that shift, assuming
   1262  1.1  mrg    optimization for speed when SPEED is true.  */
   1263  1.1  mrg static int
   1264  1.1  mrg msp430_shift_costs (rtx src, rtx dst, bool speed, rtx outer_rtx)
   1265  1.1  mrg {
   1266  1.1  mrg   int amt;
   1267  1.1  mrg   enum rtx_code src_code = GET_CODE (src);
   1268  1.1  mrg   enum rtx_code dst_code = GET_CODE (dst);
   1269  1.1  mrg   const struct single_op_cost *cost_p;
   1270  1.1  mrg 
   1271  1.1  mrg   cost_p = (speed ? &cycle_cost_single_op : &size_cost_single_op);
   1272  1.1  mrg 
   1273  1.1  mrg   if (src_code != CONST_INT)
   1274  1.1  mrg     /* The size or speed cost when the shift amount is unknown cannot be
   1275  1.1  mrg        accurately calculated, so just disparage it slightly.  */
   1276  1.1  mrg     return 2 * msp430_costs (src, dst, speed, outer_rtx);
   1277  1.1  mrg 
   1278  1.1  mrg   if (use_helper_for_const_shift (GET_MODE (outer_rtx), amt = INTVAL (src)))
   1279  1.1  mrg     {
   1280  1.1  mrg       /* GCC sometimes tries to perform shifts in some very inventive ways,
   1281  1.1  mrg 	 resulting in much larger code size usage than necessary, if
   1282  1.1  mrg 	 they are disparaged too much here.  So in general, if
   1283  1.1  mrg 	 use_helper_for_const_shift thinks a helper should be used, obey
   1284  1.1  mrg 	 that and don't disparage the shift any more than a regular
   1285  1.1  mrg 	 instruction, even though the shift may actually cost more.
   1286  1.1  mrg 	 This ensures that the RTL generated at the initial expand pass has the
   1287  1.1  mrg 	 expected shift instructions, which can be mapped to the helper
   1288  1.1  mrg 	 functions.  */
   1289  1.1  mrg       return msp430_costs (src, dst, speed, outer_rtx);
   1290  1.1  mrg     }
   1291  1.1  mrg 
   1292  1.1  mrg   if (!msp430x)
   1293  1.1  mrg     {
   1294  1.1  mrg       /* Each shift by one place will be emitted individually.  */
   1295  1.1  mrg       switch (dst_code)
   1296  1.1  mrg 	{
   1297  1.1  mrg 	case REG:
   1298  1.1  mrg 	case CONST_INT:
   1299  1.1  mrg 	  return amt * cost_p->reg;
   1300  1.1  mrg 	case MEM:
   1301  1.1  mrg 	  if (msp430_is_mem_indirect (dst))
   1302  1.1  mrg 	    return amt * cost_p->ind;
   1303  1.1  mrg 	  else
   1304  1.1  mrg 	    return amt * cost_p->mem;
   1305  1.1  mrg 	default:
   1306  1.1  mrg 	  return amt * cost_p->mem;
   1307  1.1  mrg 	}
   1308  1.1  mrg     }
   1309  1.1  mrg 
   1310  1.1  mrg   /* RRAM, RRCM, RRUM, RLAM are used for shift counts <= 4, otherwise, the 'X'
   1311  1.1  mrg      versions are used.
   1312  1.1  mrg      Instructions which shift a MEM operand will never actually be output.  It
   1313  1.1  mrg      will always be copied into a register to allow for efficient shifting.  So
   1314  1.1  mrg      the cost just takes into account the cost of an additional copy in that
   1315  1.1  mrg      case.  */
   1316  1.1  mrg   return (amt <= 4 ? (speed ? amt : 1) : (speed ? amt + 1 : 2)
   1317  1.1  mrg 	  + (dst_code == REG ? 0
   1318  1.1  mrg 	     : msp430_costs (dst, gen_rtx_REG (HImode, 10), speed, outer_rtx)));
   1319  1.1  mrg }
   1320  1.1  mrg 
   1321  1.1  mrg /* Given source operand SRC and destination operand DST from the MULT/DIV/MOD
   1322  1.1  mrg    RTX OUTER_RTX, return the cost of performing that operation, assuming
   1323  1.1  mrg    optimization for speed when SPEED is true.  */
   1324  1.1  mrg static int
   1325  1.1  mrg msp430_muldiv_costs (rtx src, rtx dst, bool speed, rtx outer_rtx,
   1326  1.1  mrg 		     machine_mode outer_mode)
   1327  1.1  mrg {
   1328  1.1  mrg   enum rtx_code outer_code = GET_CODE (outer_rtx);
   1329  1.1  mrg   const struct msp430_multlib_costs *cost_p;
   1330  1.1  mrg   cost_p = (msp430_use_16bit_hwmult ()
   1331  1.1  mrg 	    ? &cycle_cost_multlib_32bit
   1332  1.1  mrg 	    : &cycle_cost_multlib_16bit);
   1333  1.1  mrg 
   1334  1.1  mrg   int factor = 1;
   1335  1.1  mrg   /* Only used in some calculations.  */
   1336  1.1  mrg   int mode_factor = 1;
   1337  1.1  mrg   if (outer_mode == SImode)
   1338  1.1  mrg     mode_factor = 2;
   1339  1.1  mrg   else if (outer_mode == PSImode)
   1340  1.1  mrg     /* PSImode multiplication is performed using SImode operands, so has extra
   1341  1.1  mrg        cost to factor in the conversions necessary before/after the
   1342  1.1  mrg        operation.  */
   1343  1.1  mrg     mode_factor = 3;
   1344  1.1  mrg   else if (outer_mode == DImode)
   1345  1.1  mrg     mode_factor = 4;
   1346  1.1  mrg 
   1347  1.1  mrg   if (!speed)
   1348  1.1  mrg     {
   1349  1.1  mrg       /* The codesize cost of using a helper function to perform the
   1350  1.1  mrg 	 multiplication or division cannot be accurately calculated, since the
   1351  1.1  mrg 	 cost depends on how many times the operation is performed in the
   1352  1.1  mrg 	 entire program.  */
   1353  1.1  mrg       if (outer_code != MULT)
   1354  1.1  mrg 	/* Division is always expensive.  */
   1355  1.1  mrg 	factor = 7;
   1356  1.1  mrg       else if (((msp430_use_16bit_hwmult () && outer_mode != DImode)
   1357  1.1  mrg 		|| msp430_use_32bit_hwmult ()
   1358  1.1  mrg 		|| msp430_use_f5_series_hwmult ()))
   1359  1.1  mrg 	/* When the hardware multiplier is available, only disparage
   1360  1.1  mrg 	   slightly.  */
   1361  1.1  mrg 	factor = 2;
   1362  1.1  mrg       else
   1363  1.1  mrg 	factor = 5;
   1364  1.1  mrg       return factor * mode_factor * msp430_costs (src, dst, speed, outer_rtx);
   1365  1.1  mrg     }
   1366  1.1  mrg 
   1367  1.1  mrg   /* When there is hardware multiply support, there is a relatively low, fixed
   1368  1.1  mrg      cycle cost to performing any multiplication, but when there is no hardware
   1369  1.1  mrg      multiply support it is very costly.  That precise cycle cost has not been
   1370  1.1  mrg      calculated here.
   1371  1.1  mrg      Division is extra slow since it always uses a software library.
   1372  1.1  mrg      The 16-bit hardware multiply library cannot be used to produce 64-bit
   1373  1.1  mrg      results.  */
   1374  1.1  mrg   if (outer_code != MULT || !msp430_has_hwmult ()
   1375  1.1  mrg       || (outer_mode == DImode && msp430_use_16bit_hwmult ()))
   1376  1.1  mrg     {
   1377  1.1  mrg       factor = (outer_code == MULT ? 50 : 70);
   1378  1.1  mrg       return factor * mode_factor * msp430_costs (src, dst, speed, outer_rtx);
   1379  1.1  mrg     }
   1380  1.1  mrg 
   1381  1.1  mrg   switch (outer_mode)
   1382  1.1  mrg     {
   1383  1.1  mrg     case E_QImode:
   1384  1.1  mrg     case E_HImode:
   1385  1.1  mrg       /* Include the cost of copying the operands into and out of the hardware
   1386  1.1  mrg 	 multiply routine.  */
   1387  1.1  mrg       return cost_p->mulhi + (3 * msp430_costs (src, dst, speed, outer_rtx));
   1388  1.1  mrg 
   1389  1.1  mrg     case E_PSImode:
   1390  1.1  mrg       /* Extra factor for the conversions necessary to do PSI->SI before the
   1391  1.1  mrg 	 operation.  */
   1392  1.1  mrg       factor = 2;
   1393  1.1  mrg       /* fallthru.  */
   1394  1.1  mrg     case E_SImode:
   1395  1.1  mrg       return factor * (cost_p->mulsi
   1396  1.1  mrg 		       + (6 * msp430_costs (src, dst, speed, outer_rtx)));
   1397  1.1  mrg 
   1398  1.1  mrg     case E_DImode:
   1399  1.1  mrg     default:
   1400  1.1  mrg       return cost_p->muldi + (12 * msp430_costs (src, dst, speed, outer_rtx));
   1401  1.1  mrg     }
   1402  1.1  mrg }
   1403  1.1  mrg 
   1404  1.1  mrg /* Recurse within X to find the actual destination operand of the expression.
   1405  1.1  mrg    For example:
   1406  1.1  mrg    (plus (ashift (minus (ashift (reg)
   1407  1.1  mrg    (const_int) ......
   1408  1.1  mrg    should return the reg RTX.  */
   1409  1.1  mrg static rtx
   1410  1.1  mrg msp430_get_inner_dest_code (rtx x)
   1411  1.1  mrg {
   1412  1.1  mrg   enum rtx_code code = GET_CODE (x);
   1413  1.1  mrg   rtx op0 = XEXP (x, 0);
   1414  1.1  mrg   switch (code)
   1415  1.1  mrg     {
   1416  1.1  mrg     case REG:
   1417  1.1  mrg     case SYMBOL_REF:
   1418  1.1  mrg     case CONST_INT:
   1419  1.1  mrg     case CONST:
   1420  1.1  mrg     case LABEL_REF:
   1421  1.1  mrg       return x;
   1422  1.1  mrg 
   1423  1.1  mrg     case MEM:
   1424  1.1  mrg       /* Return the MEM expr not the inner REG for these cases.  */
   1425  1.1  mrg       switch (GET_CODE (op0))
   1426  1.1  mrg 	{
   1427  1.1  mrg 	case REG:
   1428  1.1  mrg 	case SYMBOL_REF:
   1429  1.1  mrg 	case LABEL_REF:
   1430  1.1  mrg 	case CONST:
   1431  1.1  mrg 	case POST_INC:
   1432  1.1  mrg 	  return x;
   1433  1.1  mrg 
   1434  1.1  mrg 	case PLUS:
   1435  1.1  mrg 	  /* return MEM (PLUS (REG) (CONST)) */
   1436  1.1  mrg 	  if (GET_CODE (XEXP (op0, 0)) == REG)
   1437  1.1  mrg 	    {
   1438  1.1  mrg 	      if (GET_CODE (XEXP (op0, 1)) == CONST_INT
   1439  1.1  mrg 		  || GET_CODE (XEXP (op0, 1)) == CONST
   1440  1.1  mrg 		  || GET_CODE (XEXP (op0, 1)) == LABEL_REF
   1441  1.1  mrg 		  || GET_CODE (XEXP (op0, 1)) == SYMBOL_REF)
   1442  1.1  mrg 		return x;
   1443  1.1  mrg 	      else
   1444  1.1  mrg 		return msp430_get_inner_dest_code (op0);
   1445  1.1  mrg 	    }
   1446  1.1  mrg 	  return msp430_get_inner_dest_code (op0);
   1447  1.1  mrg 
   1448  1.1  mrg 	default:
   1449  1.1  mrg 	  if (GET_RTX_FORMAT (code)[0] != 'e')
   1450  1.1  mrg 	    return x;
   1451  1.1  mrg 	  return msp430_get_inner_dest_code (op0);
   1452  1.1  mrg 	}
   1453  1.1  mrg       break;
   1454  1.1  mrg 
   1455  1.1  mrg     default:
   1456  1.1  mrg       if (op0 == NULL_RTX)
   1457  1.1  mrg 	gcc_unreachable ();
   1458  1.1  mrg       else
   1459  1.1  mrg 	{
   1460  1.1  mrg 	  if (GET_RTX_FORMAT (code)[0] != 'e'
   1461  1.1  mrg 	      && code != ENTRY_VALUE)
   1462  1.1  mrg 	    return x;
   1463  1.1  mrg 	  return msp430_get_inner_dest_code (op0);
   1464  1.1  mrg 	}
   1465  1.1  mrg     }
   1466  1.1  mrg }
   1467  1.1  mrg 
   1468  1.1  mrg /* Calculate the cost of an MSP430 single-operand instruction, for operand DST
   1469  1.1  mrg    within the RTX OUTER_RTX, optimizing for speed if SPEED is true.  */
   1470  1.1  mrg static int
   1471  1.1  mrg msp430_single_op_cost (rtx dst, bool speed, rtx outer_rtx)
   1472  1.1  mrg {
   1473  1.1  mrg   enum rtx_code dst_code = GET_CODE (dst);
   1474  1.1  mrg   const struct single_op_cost *cost_p;
   1475  1.1  mrg   const struct double_op_cost *double_op_cost_p;
   1476  1.1  mrg 
   1477  1.1  mrg   cost_p = (speed ? &cycle_cost_single_op : &size_cost_single_op);
   1478  1.1  mrg   double_op_cost_p = (speed ? &cycle_cost_double_op : &size_cost_double_op);
   1479  1.1  mrg 
   1480  1.1  mrg   switch (dst_code)
   1481  1.1  mrg     {
   1482  1.1  mrg     case REG:
   1483  1.1  mrg       return cost_p->reg;
   1484  1.1  mrg     case MEM:
   1485  1.1  mrg       if (msp430_is_mem_indirect (dst))
   1486  1.1  mrg 	return cost_p->ind;
   1487  1.1  mrg       else
   1488  1.1  mrg 	return cost_p->mem;
   1489  1.1  mrg 
   1490  1.1  mrg     case CONST_INT:
   1491  1.1  mrg     case CONST_FIXED:
   1492  1.1  mrg     case CONST_DOUBLE:
   1493  1.1  mrg     case SYMBOL_REF:
   1494  1.1  mrg     case CONST:
   1495  1.1  mrg       /* A constant value would need to be copied into a register first.  */
   1496  1.1  mrg       return double_op_cost_p->imm2r + cost_p->reg;
   1497  1.1  mrg 
   1498  1.1  mrg     default:
   1499  1.1  mrg       return cost_p->mem;
   1500  1.1  mrg     }
   1501  1.1  mrg }
   1502  1.1  mrg 
   1503  1.1  mrg #undef  TARGET_RTX_COSTS
   1504  1.1  mrg #define TARGET_RTX_COSTS msp430_rtx_costs
   1505  1.1  mrg 
   1506  1.1  mrg /* This target hook describes the relative costs of RTL expressions.
   1507  1.1  mrg    The function recurses to just before the lowest level of the expression,
   1508  1.1  mrg    when both of the operands of the expression can be examined at the same time.
   1509  1.1  mrg    This is because the cost of the expression depends on the specific
   1510  1.1  mrg    addressing mode combination of the operands.
   1511  1.1  mrg    The hook returns true when all subexpressions of X have been processed, and
   1512  1.1  mrg    false when rtx_cost should recurse.  */
   1513  1.1  mrg static bool
   1514  1.1  mrg msp430_rtx_costs (rtx x,
   1515  1.1  mrg 		  machine_mode mode,
   1516  1.1  mrg 		  int	   outer_code ATTRIBUTE_UNUSED,
   1517  1.1  mrg 		  int	   opno ATTRIBUTE_UNUSED,
   1518  1.1  mrg 		  int *	   total,
   1519  1.1  mrg 		  bool	   speed)
   1520  1.1  mrg {
   1521  1.1  mrg   enum rtx_code code = GET_CODE (x);
   1522  1.1  mrg   rtx dst, src;
   1523  1.1  mrg   rtx dst_inner, src_inner;
   1524  1.1  mrg 
   1525  1.1  mrg   *total = 0;
   1526  1.1  mrg   dst = XEXP (x, 0);
   1527  1.1  mrg   if (GET_RTX_LENGTH (code) == 1)
   1528  1.1  mrg     /* Some RTX that are single-op in GCC are double-op when translated to
   1529  1.1  mrg        MSP430 instructions e.g NOT, NEG, ZERO_EXTEND.  */
   1530  1.1  mrg     src = dst;
   1531  1.1  mrg   else
   1532  1.1  mrg     src = XEXP (x, 1);
   1533  1.1  mrg 
   1534  1.1  mrg 
   1535  1.1  mrg   switch (code)
   1536  1.1  mrg     {
   1537  1.1  mrg     case SET:
   1538  1.1  mrg       /* Ignoring SET improves codesize.  */
   1539  1.1  mrg       if (!speed)
   1540  1.1  mrg 	return true;
   1541  1.1  mrg       /* fallthru.  */
   1542  1.1  mrg     case PLUS:
   1543  1.1  mrg       if (outer_code == MEM)
   1544  1.1  mrg 	/* Do not add any cost for the plus itself, but recurse in case there
   1545  1.1  mrg 	   are more complicated RTX inside.  */
   1546  1.1  mrg 	return false;
   1547  1.1  mrg       /* fallthru.  */
   1548  1.1  mrg     case MINUS:
   1549  1.1  mrg     case AND:
   1550  1.1  mrg     case IOR:
   1551  1.1  mrg     case XOR:
   1552  1.1  mrg     case NOT:
   1553  1.1  mrg     case ZERO_EXTEND:
   1554  1.1  mrg     case TRUNCATE:
   1555  1.1  mrg     case NEG:
   1556  1.1  mrg     case ZERO_EXTRACT:
   1557  1.1  mrg     case SIGN_EXTRACT:
   1558  1.1  mrg     case IF_THEN_ELSE:
   1559  1.1  mrg       dst_inner = msp430_get_inner_dest_code (dst);
   1560  1.1  mrg       src_inner = msp430_get_inner_dest_code (src);
   1561  1.1  mrg       *total = COSTS_N_INSNS (msp430_costs (src_inner, dst_inner, speed, x));
   1562  1.1  mrg       if (mode == SImode)
   1563  1.1  mrg 	*total *= 2;
   1564  1.1  mrg       if (mode == DImode)
   1565  1.1  mrg 	*total *= 4;
   1566  1.1  mrg       return false;
   1567  1.1  mrg 
   1568  1.1  mrg     case ROTATE:
   1569  1.1  mrg     case ASHIFT:
   1570  1.1  mrg     case ASHIFTRT:
   1571  1.1  mrg     case LSHIFTRT:
   1572  1.1  mrg       dst_inner = msp430_get_inner_dest_code (dst);
   1573  1.1  mrg       src_inner = msp430_get_inner_dest_code (src);
   1574  1.1  mrg       *total = COSTS_N_INSNS (msp430_shift_costs (src_inner, dst_inner,
   1575  1.1  mrg 						  speed, x));
   1576  1.1  mrg       if (mode == SImode)
   1577  1.1  mrg 	*total *= 2;
   1578  1.1  mrg       if (mode == DImode)
   1579  1.1  mrg 	*total *= 4;
   1580  1.1  mrg       return false;
   1581  1.1  mrg 
   1582  1.1  mrg     case MULT:
   1583  1.1  mrg     case DIV:
   1584  1.1  mrg     case MOD:
   1585  1.1  mrg     case UDIV:
   1586  1.1  mrg     case UMOD:
   1587  1.1  mrg       dst_inner = msp430_get_inner_dest_code (dst);
   1588  1.1  mrg       src_inner = msp430_get_inner_dest_code (src);
   1589  1.1  mrg       *total = COSTS_N_INSNS (msp430_muldiv_costs (src_inner, dst_inner, speed,
   1590  1.1  mrg 						   x, mode));
   1591  1.1  mrg       return false;
   1592  1.1  mrg 
   1593  1.1  mrg     case CALL:
   1594  1.1  mrg     case SIGN_EXTEND:
   1595  1.1  mrg       dst_inner = msp430_get_inner_dest_code (dst);
   1596  1.1  mrg       *total = COSTS_N_INSNS (msp430_single_op_cost (dst_inner, speed, x));
   1597  1.1  mrg       if (mode == SImode)
   1598  1.1  mrg 	*total *= 2;
   1599  1.1  mrg       if (mode == DImode)
   1600  1.1  mrg 	*total *= 4;
   1601  1.1  mrg       return false;
   1602  1.1  mrg 
   1603  1.1  mrg     case CONST_INT:
   1604  1.1  mrg     case CONST_FIXED:
   1605  1.1  mrg     case CONST_DOUBLE:
   1606  1.1  mrg     case SYMBOL_REF:
   1607  1.1  mrg     case CONST:
   1608  1.1  mrg     case LABEL_REF:
   1609  1.1  mrg     case REG:
   1610  1.1  mrg     case PC:
   1611  1.1  mrg     case POST_INC:
   1612  1.1  mrg       if (mode == SImode)
   1613  1.1  mrg 	*total = COSTS_N_INSNS (2);
   1614  1.1  mrg       else if (mode == DImode)
   1615  1.1  mrg 	*total = COSTS_N_INSNS (4);
   1616  1.1  mrg       return true;
   1617  1.1  mrg 
   1618  1.1  mrg     case MEM:
   1619  1.1  mrg       /* PSImode operands are expensive when in memory.  */
   1620  1.1  mrg       if (mode == PSImode)
   1621  1.1  mrg 	*total = COSTS_N_INSNS (1);
   1622  1.1  mrg       else if (mode == SImode)
   1623  1.1  mrg 	*total = COSTS_N_INSNS (2);
   1624  1.1  mrg       else if (mode == DImode)
   1625  1.1  mrg 	*total = COSTS_N_INSNS (4);
   1626  1.1  mrg       /* Recurse into the MEM.  */
   1627  1.1  mrg       return false;
   1628  1.1  mrg 
   1629  1.1  mrg     case EQ:
   1630  1.1  mrg     case NE:
   1631  1.1  mrg     case GT:
   1632  1.1  mrg     case GTU:
   1633  1.1  mrg     case GE:
   1634  1.1  mrg     case GEU:
   1635  1.1  mrg     case LT:
   1636  1.1  mrg     case LTU:
   1637  1.1  mrg     case LE:
   1638  1.1  mrg     case LEU:
   1639  1.1  mrg       /* Conditions are mostly equivalent, changing their relative
   1640  1.1  mrg 	 costs has no effect.  */
   1641  1.1  mrg       return false;
   1642  1.1  mrg 
   1643  1.1  mrg     case ASM_OPERANDS:
   1644  1.1  mrg     case ASM_INPUT:
   1645  1.1  mrg     case CLOBBER:
   1646  1.1  mrg     case COMPARE:
   1647  1.1  mrg     case CONCAT:
   1648  1.1  mrg     case ENTRY_VALUE:
   1649  1.1  mrg       /* Other unhandled expressions.  */
   1650  1.1  mrg       return false;
   1651  1.1  mrg 
   1652  1.1  mrg     default:
   1653  1.1  mrg       return false;
   1654  1.1  mrg     }
   1655  1.1  mrg }
   1656  1.1  mrg 
   1657  1.1  mrg #undef TARGET_INSN_COST
   1658  1.1  mrg #define TARGET_INSN_COST msp430_insn_cost
   1659  1.1  mrg 
   1660  1.1  mrg static int
   1661  1.1  mrg msp430_insn_cost (rtx_insn *insn, bool speed ATTRIBUTE_UNUSED)
   1662  1.1  mrg {
   1663  1.1  mrg   if (recog_memoized (insn) < 0)
   1664  1.1  mrg     return 0;
   1665  1.1  mrg 
   1666  1.1  mrg   /* The returned cost must be relative to COSTS_N_INSNS (1). An insn with a
   1667  1.1  mrg      length of 2 bytes is the smallest possible size and so must be equivalent
   1668  1.1  mrg      to COSTS_N_INSNS (1).  */
   1669  1.1  mrg   return COSTS_N_INSNS (get_attr_length (insn) / 2);
   1670  1.1  mrg 
   1671  1.1  mrg   /* FIXME Add more detailed costs when optimizing for speed.
   1672  1.1  mrg      For now the length of the instruction is a good approximiation and roughly
   1673  1.1  mrg      correlates with cycle cost.  */
   1674  1.1  mrg }
   1675  1.1  mrg 
   1676  1.1  mrg 
   1677  1.1  mrg /* Function Entry and Exit */
   1679  1.1  mrg 
   1680  1.1  mrg /* The MSP430 call frame looks like this:
   1681  1.1  mrg 
   1682  1.1  mrg    <higher addresses>
   1683  1.1  mrg    +--------------------+
   1684  1.1  mrg    |                    |
   1685  1.1  mrg    | Stack Arguments    |
   1686  1.1  mrg    |                    |
   1687  1.1  mrg    +--------------------+ <-- "arg pointer"
   1688  1.1  mrg    |                    |
   1689  1.1  mrg    | PC from call       |  (2 bytes for 430, 4 for TARGET_LARGE)
   1690  1.1  mrg    |                    |
   1691  1.1  mrg    +--------------------+
   1692  1.1  mrg    | SR if this func has|
   1693  1.1  mrg    | been called via an |
   1694  1.1  mrg    | interrupt.         |
   1695  1.1  mrg    +--------------------+  <-- SP before prologue, also AP
   1696  1.1  mrg    |                    |
   1697  1.1  mrg    | Saved Regs         |  (2 bytes per reg for 430, 4 per for TARGET_LARGE)
   1698  1.1  mrg    |                    |
   1699  1.1  mrg    +--------------------+  <-- "frame pointer"
   1700  1.1  mrg    |                    |
   1701  1.1  mrg    | Locals             |
   1702  1.1  mrg    |                    |
   1703  1.1  mrg    +--------------------+
   1704  1.1  mrg    |                    |
   1705  1.1  mrg    | Outgoing Args      |
   1706  1.1  mrg    |                    |
   1707  1.1  mrg    +--------------------+  <-- SP during function
   1708  1.1  mrg    <lower addresses>
   1709  1.1  mrg 
   1710  1.1  mrg */
   1711  1.1  mrg 
   1712  1.1  mrg /* We use this to wrap all emitted insns in the prologue, so they get
   1713  1.1  mrg    the "frame-related" (/f) flag set.  */
   1714  1.1  mrg static rtx
   1715  1.1  mrg F (rtx x)
   1716  1.1  mrg {
   1717  1.1  mrg   RTX_FRAME_RELATED_P (x) = 1;
   1718  1.1  mrg   return x;
   1719  1.1  mrg }
   1720  1.1  mrg 
   1721  1.1  mrg /* This is the one spot that decides if a register is to be saved and
   1722  1.1  mrg    restored in the prologue/epilogue.  */
   1723  1.1  mrg static bool
   1724  1.1  mrg msp430_preserve_reg_p (int regno)
   1725  1.1  mrg {
   1726  1.1  mrg   /* PC, SP, SR, and the constant generator.  */
   1727  1.1  mrg   if (regno <= 3)
   1728  1.1  mrg     return false;
   1729  1.1  mrg 
   1730  1.1  mrg   /* FIXME: add interrupt, EH, etc.  */
   1731  1.1  mrg   if (crtl->calls_eh_return)
   1732  1.1  mrg     return true;
   1733  1.1  mrg 
   1734  1.1  mrg   /* Shouldn't be more than the above, but just in case...  */
   1735  1.1  mrg   if (fixed_regs[regno])
   1736  1.1  mrg     return false;
   1737  1.1  mrg 
   1738  1.1  mrg   /* For interrupt functions we must save and restore the used regs that
   1739  1.1  mrg      would normally be caller-saved (R11->R15).  */
   1740  1.1  mrg   if (msp430_is_interrupt_func () && regno >= 11 && regno <= 15)
   1741  1.1  mrg     {
   1742  1.1  mrg       if (crtl->is_leaf && df_regs_ever_live_p (regno))
   1743  1.1  mrg 	/* If the interrupt func is a leaf then we only need to restore the
   1744  1.1  mrg 	   caller-saved regs that are used.  */
   1745  1.1  mrg 	return true;
   1746  1.1  mrg       else if (!crtl->is_leaf)
   1747  1.1  mrg 	/* If the interrupt function is not a leaf we must save all
   1748  1.1  mrg 	   caller-saved regs in case the callee modifies them.  */
   1749  1.1  mrg 	return true;
   1750  1.1  mrg     }
   1751  1.1  mrg 
   1752  1.1  mrg   if (!call_used_or_fixed_reg_p (regno)
   1753  1.1  mrg       && df_regs_ever_live_p (regno))
   1754  1.1  mrg     return true;
   1755  1.1  mrg 
   1756  1.1  mrg   return false;
   1757  1.1  mrg }
   1758  1.1  mrg 
   1759  1.1  mrg /* Compute all the frame-related fields in our machine_function
   1760  1.1  mrg    structure.  */
   1761  1.1  mrg static void
   1762  1.1  mrg msp430_compute_frame_info (void)
   1763  1.1  mrg {
   1764  1.1  mrg   int i;
   1765  1.1  mrg 
   1766  1.1  mrg   cfun->machine->computed = 1;
   1767  1.1  mrg   cfun->machine->framesize_regs = 0;
   1768  1.1  mrg   cfun->machine->framesize_locals = get_frame_size ();
   1769  1.1  mrg   cfun->machine->framesize_outgoing = crtl->outgoing_args_size;
   1770  1.1  mrg 
   1771  1.1  mrg   for (i = 0; i < ARG_POINTER_REGNUM; i ++)
   1772  1.1  mrg     if (msp430_preserve_reg_p (i))
   1773  1.1  mrg       {
   1774  1.1  mrg 	cfun->machine->need_to_save[i] = 1;
   1775  1.1  mrg 	cfun->machine->framesize_regs += (TARGET_LARGE ? 4 : 2);
   1776  1.1  mrg       }
   1777  1.1  mrg     else
   1778  1.1  mrg       cfun->machine->need_to_save[i] = 0;
   1779  1.1  mrg 
   1780  1.1  mrg   if ((cfun->machine->framesize_locals + cfun->machine->framesize_outgoing) & 1)
   1781  1.1  mrg     cfun->machine->framesize_locals ++;
   1782  1.1  mrg 
   1783  1.1  mrg   cfun->machine->framesize = (cfun->machine->framesize_regs
   1784  1.1  mrg 			      + cfun->machine->framesize_locals
   1785  1.1  mrg 			      + cfun->machine->framesize_outgoing);
   1786  1.1  mrg }
   1787  1.1  mrg 
   1788  1.1  mrg /* Attribute Handling.  */
   1789  1.1  mrg 
   1790  1.1  mrg const char * const  ATTR_INTR   = "interrupt";
   1791  1.1  mrg const char * const  ATTR_WAKEUP = "wakeup";
   1792  1.1  mrg const char * const  ATTR_NAKED  = "naked";
   1793  1.1  mrg const char * const  ATTR_REENT  = "reentrant";
   1794  1.1  mrg const char * const  ATTR_CRIT   = "critical";
   1795  1.1  mrg const char * const  ATTR_LOWER  = "lower";
   1796  1.1  mrg const char * const  ATTR_UPPER  = "upper";
   1797  1.1  mrg const char * const  ATTR_EITHER = "either";
   1798  1.1  mrg const char * const  ATTR_NOINIT = "noinit";
   1799  1.1  mrg const char * const  ATTR_PERSIST = "persistent";
   1800  1.1  mrg 
   1801  1.1  mrg static inline bool
   1802  1.1  mrg has_attr (const char * attr, tree decl)
   1803  1.1  mrg {
   1804  1.1  mrg   if (decl == NULL_TREE)
   1805  1.1  mrg     return false;
   1806  1.1  mrg   return lookup_attribute (attr, DECL_ATTRIBUTES (decl)) != NULL_TREE;
   1807  1.1  mrg }
   1808  1.1  mrg 
   1809  1.1  mrg static bool
   1810  1.1  mrg is_interrupt_func (tree decl = current_function_decl)
   1811  1.1  mrg {
   1812  1.1  mrg   return has_attr (ATTR_INTR, decl);
   1813  1.1  mrg }
   1814  1.1  mrg 
   1815  1.1  mrg /* Returns true if the current function has the "interrupt" attribute.  */
   1816  1.1  mrg 
   1817  1.1  mrg bool
   1818  1.1  mrg msp430_is_interrupt_func (void)
   1819  1.1  mrg {
   1820  1.1  mrg   return is_interrupt_func (current_function_decl);
   1821  1.1  mrg }
   1822  1.1  mrg 
   1823  1.1  mrg static bool
   1824  1.1  mrg is_wakeup_func (tree decl = current_function_decl)
   1825  1.1  mrg {
   1826  1.1  mrg   return is_interrupt_func (decl) && has_attr (ATTR_WAKEUP, decl);
   1827  1.1  mrg }
   1828  1.1  mrg 
   1829  1.1  mrg static inline bool
   1830  1.1  mrg is_naked_func (tree decl = current_function_decl)
   1831  1.1  mrg {
   1832  1.1  mrg   return has_attr (ATTR_NAKED, decl);
   1833  1.1  mrg }
   1834  1.1  mrg 
   1835  1.1  mrg static inline bool
   1836  1.1  mrg is_reentrant_func (tree decl = current_function_decl)
   1837  1.1  mrg {
   1838  1.1  mrg   return has_attr (ATTR_REENT, decl);
   1839  1.1  mrg }
   1840  1.1  mrg 
   1841  1.1  mrg static inline bool
   1842  1.1  mrg is_critical_func (tree decl = current_function_decl)
   1843  1.1  mrg {
   1844  1.1  mrg   return has_attr (ATTR_CRIT, decl);
   1845  1.1  mrg }
   1846  1.1  mrg 
   1847  1.1  mrg static bool
   1848  1.1  mrg has_section_name (const char * name, tree decl = current_function_decl)
   1849  1.1  mrg {
   1850  1.1  mrg   if (decl == NULL_TREE)
   1851  1.1  mrg     return false;
   1852  1.1  mrg   return (DECL_SECTION_NAME (decl)
   1853  1.1  mrg 	  && (strcmp (name, DECL_SECTION_NAME (decl)) == 0));
   1854  1.1  mrg }
   1855  1.1  mrg 
   1856  1.1  mrg #undef  TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS
   1857  1.1  mrg #define TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS \
   1858  1.1  mrg   msp430_allocate_stack_slots_for_args
   1859  1.1  mrg 
   1860  1.1  mrg static bool
   1861  1.1  mrg msp430_allocate_stack_slots_for_args (void)
   1862  1.1  mrg {
   1863  1.1  mrg   /* Naked functions should not allocate stack slots for arguments.  */
   1864  1.1  mrg   return ! is_naked_func ();
   1865  1.1  mrg }
   1866  1.1  mrg 
   1867  1.1  mrg #undef TARGET_WARN_FUNC_RETURN
   1868  1.1  mrg #define TARGET_WARN_FUNC_RETURN msp430_warn_func_return
   1869  1.1  mrg 
   1870  1.1  mrg static bool
   1871  1.1  mrg msp430_warn_func_return (tree decl)
   1872  1.1  mrg {
   1873  1.1  mrg   /* Naked functions are implemented entirely in assembly, including the
   1874  1.1  mrg      return sequence, so suppress warnings about this.  */
   1875  1.1  mrg   return !is_naked_func (decl);
   1876  1.1  mrg }
   1877  1.1  mrg 
   1878  1.1  mrg /* Verify MSP430 specific attributes.  */
   1879  1.1  mrg #define TREE_NAME_EQ(NAME, STR) (strcmp (IDENTIFIER_POINTER (NAME), (STR)) == 0)
   1880  1.1  mrg 
   1881  1.1  mrg static tree
   1882  1.1  mrg msp430_attr (tree * node,
   1883  1.1  mrg 	     tree   name,
   1884  1.1  mrg 	     tree   args,
   1885  1.1  mrg 	     int    flags ATTRIBUTE_UNUSED,
   1886  1.1  mrg 	     bool * no_add_attrs)
   1887  1.1  mrg {
   1888  1.1  mrg   gcc_assert (DECL_P (* node));
   1889  1.1  mrg 
   1890  1.1  mrg   /* Only the interrupt attribute takes an argument.  */
   1891  1.1  mrg   if (args != NULL)
   1892  1.1  mrg     {
   1893  1.1  mrg       tree value = TREE_VALUE (args);
   1894  1.1  mrg 
   1895  1.1  mrg       switch (TREE_CODE (value))
   1896  1.1  mrg 	{
   1897  1.1  mrg 	case STRING_CST:
   1898  1.1  mrg 	  if (   strcmp (TREE_STRING_POINTER (value), "reset")
   1899  1.1  mrg 	      && strcmp (TREE_STRING_POINTER (value), "nmi")
   1900  1.1  mrg 	      && strcmp (TREE_STRING_POINTER (value), "watchdog"))
   1901  1.1  mrg 	    /* Allow the attribute to be added - the linker script
   1902  1.1  mrg 	       being used may still recognise this name.  */
   1903  1.1  mrg 	    warning (OPT_Wattributes,
   1904  1.1  mrg 		     "unrecognized interrupt vector argument of %qE attribute",
   1905  1.1  mrg 		     name);
   1906  1.1  mrg 	  break;
   1907  1.1  mrg 
   1908  1.1  mrg 	case INTEGER_CST:
   1909  1.1  mrg 	  if (wi::gtu_p (wi::to_wide (value), 63))
   1910  1.1  mrg 	    /* Allow the attribute to be added - the linker script
   1911  1.1  mrg 	       being used may still recognise this value.  */
   1912  1.1  mrg 	    warning (OPT_Wattributes,
   1913  1.1  mrg 		     "numeric argument of %qE attribute must be in range [0-63]",
   1914  1.1  mrg 		     name);
   1915  1.1  mrg 	  break;
   1916  1.1  mrg 
   1917  1.1  mrg 	default:
   1918  1.1  mrg 	  warning (OPT_Wattributes,
   1919  1.1  mrg 		   "argument of %qE attribute is not a string constant "
   1920  1.1  mrg 		   "or number", name);
   1921  1.1  mrg 	  *no_add_attrs = true;
   1922  1.1  mrg 	  break;
   1923  1.1  mrg 	}
   1924  1.1  mrg     }
   1925  1.1  mrg 
   1926  1.1  mrg   const char * message = NULL;
   1927  1.1  mrg 
   1928  1.1  mrg   if (TREE_CODE (* node) != FUNCTION_DECL)
   1929  1.1  mrg     {
   1930  1.1  mrg       message = "%qE attribute only applies to functions";
   1931  1.1  mrg     }
   1932  1.1  mrg   else if (TREE_NAME_EQ (name, ATTR_INTR))
   1933  1.1  mrg     {
   1934  1.1  mrg       if (TREE_CODE (TREE_TYPE (* node)) == FUNCTION_TYPE
   1935  1.1  mrg 	  && ! VOID_TYPE_P (TREE_TYPE (TREE_TYPE (* node))))
   1936  1.1  mrg 	message = "interrupt handlers must be void";
   1937  1.1  mrg       else
   1938  1.1  mrg 	{
   1939  1.1  mrg 	  /* Ensure interrupt handlers never get optimised out.  */
   1940  1.1  mrg 	  TREE_USED (* node) = 1;
   1941  1.1  mrg 	  DECL_PRESERVE_P (* node) = 1;
   1942  1.1  mrg 	}
   1943  1.1  mrg       if (is_critical_func (* node))
   1944  1.1  mrg 	{
   1945  1.1  mrg 	  /* We always ignore the critical attribute when interrupt and
   1946  1.1  mrg 	     critical are used together.  */
   1947  1.1  mrg 	  warning (OPT_Wattributes,
   1948  1.1  mrg 		   "critical attribute has no effect on interrupt functions");
   1949  1.1  mrg 	  DECL_ATTRIBUTES (*node) = remove_attribute (ATTR_CRIT,
   1950  1.1  mrg 						      DECL_ATTRIBUTES (* node));
   1951  1.1  mrg 	}
   1952  1.1  mrg     }
   1953  1.1  mrg   else if (TREE_NAME_EQ (name, ATTR_CRIT))
   1954  1.1  mrg     {
   1955  1.1  mrg       if (is_interrupt_func ( *node))
   1956  1.1  mrg 	message = "critical attribute has no effect on interrupt functions";
   1957  1.1  mrg     }
   1958  1.1  mrg 
   1959  1.1  mrg   if (message)
   1960  1.1  mrg     {
   1961  1.1  mrg       warning (OPT_Wattributes, message, name);
   1962  1.1  mrg       * no_add_attrs = true;
   1963  1.1  mrg     }
   1964  1.1  mrg 
   1965  1.1  mrg   return NULL_TREE;
   1966  1.1  mrg }
   1967  1.1  mrg 
   1968  1.1  mrg static tree
   1969  1.1  mrg msp430_section_attr (tree * node,
   1970  1.1  mrg 		     tree   name,
   1971  1.1  mrg 		     tree   args,
   1972  1.1  mrg 		     int    flags ATTRIBUTE_UNUSED,
   1973  1.1  mrg 		     bool * no_add_attrs ATTRIBUTE_UNUSED)
   1974  1.1  mrg {
   1975  1.1  mrg   gcc_assert (DECL_P (* node));
   1976  1.1  mrg   gcc_assert (args == NULL);
   1977  1.1  mrg 
   1978  1.1  mrg   const char * message = NULL;
   1979  1.1  mrg 
   1980  1.1  mrg   /* The "noinit", "persistent", and "section" attributes are handled
   1981  1.1  mrg      generically, so we cannot set up additional target-specific attribute
   1982  1.1  mrg      exclusions using the existing mechanism.  */
   1983  1.1  mrg   if (has_attr (ATTR_NOINIT, *node) && !TREE_NAME_EQ (name, "lower"))
   1984  1.1  mrg     message = G_("ignoring attribute %qE because it conflicts with "
   1985  1.1  mrg 		 "attribute %<noinit%>");
   1986  1.1  mrg   else if (has_attr ("section", *node) && !TREE_NAME_EQ (name, "lower"))
   1987  1.1  mrg     message = G_("ignoring attribute %qE because it conflicts with "
   1988  1.1  mrg 		 "attribute %<section%>");
   1989  1.1  mrg   else if (has_attr (ATTR_PERSIST, *node) && !TREE_NAME_EQ (name, "lower"))
   1990  1.1  mrg     message = G_("ignoring attribute %qE because it conflicts with "
   1991  1.1  mrg 		 "attribute %<persistent%>");
   1992  1.1  mrg   /* It does not make sense to use upper/lower/either attributes without
   1993  1.1  mrg      -mlarge.
   1994  1.1  mrg      Without -mlarge, "lower" is the default and only region, so is redundant.
   1995  1.1  mrg      Without -mlarge, "upper" will (and "either" might) place code/data in the
   1996  1.1  mrg      upper region, which for data could result in relocation overflows, and for
   1997  1.1  mrg      code could result in stack mismanagement and incorrect call/return
   1998  1.1  mrg      instructions.  */
   1999  1.1  mrg   else if (!TARGET_LARGE)
   2000  1.1  mrg     message = G_("%qE attribute ignored.  Large memory model (%<-mlarge%>) "
   2001  1.1  mrg 		 "is required.");
   2002  1.1  mrg 
   2003  1.1  mrg   if (message)
   2004  1.1  mrg     {
   2005  1.1  mrg       warning (OPT_Wattributes, message, name);
   2006  1.1  mrg       * no_add_attrs = true;
   2007  1.1  mrg     }
   2008  1.1  mrg 
   2009  1.1  mrg   return NULL_TREE;
   2010  1.1  mrg }
   2011  1.1  mrg 
   2012  1.1  mrg /* Helper to define attribute exclusions.  */
   2013  1.1  mrg #define ATTR_EXCL(name, function, type, variable)	\
   2014  1.1  mrg   { name, function, type, variable }
   2015  1.1  mrg 
   2016  1.1  mrg /* "reentrant", "critical" and "naked" functions must conflict because
   2017  1.1  mrg    they all modify the prologue or epilogue of functions in mutually exclusive
   2018  1.1  mrg    ways.  */
   2019  1.1  mrg static const struct attribute_spec::exclusions attr_reent_exclusions[] =
   2020  1.1  mrg {
   2021  1.1  mrg   ATTR_EXCL (ATTR_NAKED, true, true, true),
   2022  1.1  mrg   ATTR_EXCL (ATTR_CRIT, true, true, true),
   2023  1.1  mrg   ATTR_EXCL (NULL, false, false, false)
   2024  1.1  mrg };
   2025  1.1  mrg 
   2026  1.1  mrg static const struct attribute_spec::exclusions attr_naked_exclusions[] =
   2027  1.1  mrg {
   2028  1.1  mrg   ATTR_EXCL (ATTR_REENT, true, true, true),
   2029  1.1  mrg   ATTR_EXCL (ATTR_CRIT, true, true, true),
   2030  1.1  mrg   ATTR_EXCL (NULL, false, false, false)
   2031  1.1  mrg };
   2032  1.1  mrg 
   2033  1.1  mrg static const struct attribute_spec::exclusions attr_crit_exclusions[] =
   2034  1.1  mrg {
   2035  1.1  mrg   ATTR_EXCL (ATTR_REENT, true, true, true),
   2036  1.1  mrg   ATTR_EXCL (ATTR_NAKED, true, true, true),
   2037  1.1  mrg   ATTR_EXCL (NULL, false, false, false)
   2038  1.1  mrg };
   2039  1.1  mrg 
   2040  1.1  mrg /* Attributes which put the given object in a specific section must conflict
   2041  1.1  mrg    with one another.  */
   2042  1.1  mrg static const struct attribute_spec::exclusions attr_lower_exclusions[] =
   2043  1.1  mrg {
   2044  1.1  mrg   ATTR_EXCL (ATTR_UPPER, true, true, true),
   2045  1.1  mrg   ATTR_EXCL (ATTR_EITHER, true, true, true),
   2046  1.1  mrg   ATTR_EXCL (NULL, false, false, false)
   2047  1.1  mrg };
   2048  1.1  mrg 
   2049  1.1  mrg static const struct attribute_spec::exclusions attr_upper_exclusions[] =
   2050  1.1  mrg {
   2051  1.1  mrg   ATTR_EXCL (ATTR_LOWER, true, true, true),
   2052  1.1  mrg   ATTR_EXCL (ATTR_EITHER, true, true, true),
   2053  1.1  mrg   ATTR_EXCL (NULL, false, false, false)
   2054  1.1  mrg };
   2055  1.1  mrg 
   2056  1.1  mrg static const struct attribute_spec::exclusions attr_either_exclusions[] =
   2057  1.1  mrg {
   2058  1.1  mrg   ATTR_EXCL (ATTR_LOWER, true, true, true),
   2059  1.1  mrg   ATTR_EXCL (ATTR_UPPER, true, true, true),
   2060  1.1  mrg   ATTR_EXCL (NULL, false, false, false)
   2061  1.1  mrg };
   2062  1.1  mrg 
   2063  1.1  mrg #undef  TARGET_ATTRIBUTE_TABLE
   2064  1.1  mrg #define TARGET_ATTRIBUTE_TABLE		msp430_attribute_table
   2065  1.1  mrg 
   2066  1.1  mrg /* Table of MSP430-specific attributes.  */
   2067  1.1  mrg const struct attribute_spec msp430_attribute_table[] =
   2068  1.1  mrg   {
   2069  1.1  mrg     /* { name, min_num_args, max_num_args, decl_req, type_req, fn_type_req,
   2070  1.1  mrg 	 affects_type_identity, handler, exclude } */
   2071  1.1  mrg     { ATTR_INTR,	0, 1, true,  false, false, false, msp430_attr, NULL },
   2072  1.1  mrg     { ATTR_NAKED,       0, 0, true,  false, false, false, msp430_attr,
   2073  1.1  mrg       attr_naked_exclusions },
   2074  1.1  mrg     { ATTR_REENT,       0, 0, true,  false, false, false, msp430_attr,
   2075  1.1  mrg       attr_reent_exclusions },
   2076  1.1  mrg     { ATTR_CRIT,	0, 0, true,  false, false, false, msp430_attr,
   2077  1.1  mrg       attr_crit_exclusions },
   2078  1.1  mrg     { ATTR_WAKEUP,      0, 0, true,  false, false, false, msp430_attr, NULL },
   2079  1.1  mrg 
   2080  1.1  mrg     { ATTR_LOWER,       0, 0, true,  false, false, false, msp430_section_attr,
   2081  1.1  mrg       attr_lower_exclusions },
   2082  1.1  mrg     { ATTR_UPPER,       0, 0, true,  false, false, false, msp430_section_attr,
   2083  1.1  mrg       attr_upper_exclusions },
   2084  1.1  mrg     { ATTR_EITHER,      0, 0, true,  false, false, false, msp430_section_attr,
   2085  1.1  mrg       attr_either_exclusions },
   2086  1.1  mrg 
   2087  1.1  mrg     { NULL,		0, 0, false, false, false, false, NULL,  NULL }
   2088  1.1  mrg   };
   2089  1.1  mrg 
   2090  1.1  mrg #undef TARGET_HANDLE_GENERIC_ATTRIBUTE
   2091  1.1  mrg #define TARGET_HANDLE_GENERIC_ATTRIBUTE msp430_handle_generic_attribute
   2092  1.1  mrg 
   2093  1.1  mrg tree
   2094  1.1  mrg msp430_handle_generic_attribute (tree *node,
   2095  1.1  mrg 				 tree   name,
   2096  1.1  mrg 				 tree   args ATTRIBUTE_UNUSED,
   2097  1.1  mrg 				 int    flags ATTRIBUTE_UNUSED,
   2098  1.1  mrg 				 bool *no_add_attrs)
   2099  1.1  mrg 
   2100  1.1  mrg {
   2101  1.1  mrg   const char *message = NULL;
   2102  1.1  mrg 
   2103  1.1  mrg   /* Permit the "lower" attribute to be set on variables with the "section",
   2104  1.1  mrg      "noinit" and "persistent" attributes.  This is used to indicate that the
   2105  1.1  mrg      corresponding output section will be in lower memory, so a 430X
   2106  1.1  mrg      instruction is not required to handle it.  */
   2107  1.1  mrg   if (has_attr (ATTR_LOWER, *node)
   2108  1.1  mrg       && !(TREE_NAME_EQ (name, "section") || TREE_NAME_EQ (name, ATTR_PERSIST)
   2109  1.1  mrg 	   || TREE_NAME_EQ (name, ATTR_NOINIT)))
   2110  1.1  mrg     message = G_("ignoring attribute %qE because it conflicts with "
   2111  1.1  mrg 		 "attribute %<lower%>");
   2112  1.1  mrg   else if (has_attr (ATTR_UPPER, *node))
   2113  1.1  mrg     message = G_("ignoring attribute %qE because it conflicts with "
   2114  1.1  mrg 		 "attribute %<upper%>");
   2115  1.1  mrg   else if (has_attr (ATTR_EITHER, *node))
   2116  1.1  mrg     message = G_("ignoring attribute %qE because it conflicts with "
   2117  1.1  mrg 		 "attribute %<either%>");
   2118  1.1  mrg 
   2119  1.1  mrg   if (message)
   2120  1.1  mrg     {
   2121  1.1  mrg       warning (OPT_Wattributes, message, name);
   2122  1.1  mrg       *no_add_attrs = true;
   2123  1.1  mrg     }
   2124  1.1  mrg 
   2125  1.1  mrg   return NULL_TREE;
   2126  1.1  mrg }
   2127  1.1  mrg 
   2128  1.1  mrg /* Given a non-automatic VAR_DECL which can possibly have a section, return
   2129  1.1  mrg    true if the variable will definitely be placed in the lower memory
   2130  1.1  mrg    region (below address 0x10000).  */
   2131  1.1  mrg static bool
   2132  1.1  mrg msp430_var_in_low_mem (tree decl)
   2133  1.1  mrg {
   2134  1.1  mrg   gcc_assert (VAR_P (decl));
   2135  1.1  mrg 
   2136  1.1  mrg   /* "noinit" variables are always placed in the lower memory region.  */
   2137  1.1  mrg   if (has_attr (ATTR_UPPER, decl)
   2138  1.1  mrg       || has_attr (ATTR_EITHER, decl)
   2139  1.1  mrg       || has_attr (ATTR_PERSIST, decl)
   2140  1.1  mrg       /* Unless the variable is marked with the lower or noinit attribute, we
   2141  1.1  mrg 	 cannot assume that it is in the lower region if it is marked with the
   2142  1.1  mrg 	 section attribute or -mdata-region={upper,either,none} have been
   2143  1.1  mrg 	 passed.
   2144  1.1  mrg 	 The noinit and section attributes conflict.  */
   2145  1.1  mrg       || (!has_attr (ATTR_LOWER, decl) && !has_attr (ATTR_NOINIT, decl)
   2146  1.1  mrg 	  && (has_attr ("section", decl)
   2147  1.1  mrg 	      || msp430_data_region == MSP430_REGION_UPPER
   2148  1.1  mrg 	      || msp430_data_region == MSP430_REGION_EITHER
   2149  1.1  mrg 	      || msp430_data_region == MSP430_REGION_ANY)))
   2150  1.1  mrg     return false;
   2151  1.1  mrg   return true;
   2152  1.1  mrg }
   2153  1.1  mrg 
   2154  1.1  mrg #undef TARGET_ENCODE_SECTION_INFO
   2155  1.1  mrg #define TARGET_ENCODE_SECTION_INFO msp430_encode_section_info
   2156  1.1  mrg 
   2157  1.1  mrg /* Encode whether a SYMBOL_REF is definitely in the lower memory region.  */
   2158  1.1  mrg static void
   2159  1.1  mrg msp430_encode_section_info (tree decl, rtx rtl, int first)
   2160  1.1  mrg {
   2161  1.1  mrg   rtx symbol;
   2162  1.1  mrg   default_encode_section_info (decl, rtl, first);
   2163  1.1  mrg 
   2164  1.1  mrg   /* Careful not to prod global register variables.  */
   2165  1.1  mrg   if (!MEM_P (rtl))
   2166  1.1  mrg     return;
   2167  1.1  mrg   symbol = XEXP (rtl, 0);
   2168  1.1  mrg   if (GET_CODE (symbol) != SYMBOL_REF)
   2169  1.1  mrg     return;
   2170  1.1  mrg 
   2171  1.1  mrg   if (VAR_P (decl)
   2172  1.1  mrg       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
   2173  1.1  mrg       && msp430_var_in_low_mem (decl))
   2174  1.1  mrg     SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOW_MEM;
   2175  1.1  mrg }
   2176  1.1  mrg 
   2177  1.1  mrg #undef  TARGET_ASM_FUNCTION_PROLOGUE
   2178  1.1  mrg #define TARGET_ASM_FUNCTION_PROLOGUE	msp430_start_function
   2179  1.1  mrg 
   2180  1.1  mrg static void
   2181  1.1  mrg msp430_start_function (FILE *outfile)
   2182  1.1  mrg {
   2183  1.1  mrg   int r, n;
   2184  1.1  mrg 
   2185  1.1  mrg   fprintf (outfile, "; start of function\n");
   2186  1.1  mrg 
   2187  1.1  mrg   if (DECL_ATTRIBUTES (current_function_decl) != NULL_TREE)
   2188  1.1  mrg     {
   2189  1.1  mrg       fprintf (outfile, "; attributes: ");
   2190  1.1  mrg       if (is_naked_func ())
   2191  1.1  mrg 	fprintf (outfile, "naked ");
   2192  1.1  mrg       if (msp430_is_interrupt_func ())
   2193  1.1  mrg 	fprintf (outfile, "interrupt ");
   2194  1.1  mrg       if (is_reentrant_func ())
   2195  1.1  mrg 	fprintf (outfile, "reentrant ");
   2196  1.1  mrg       if (is_critical_func ())
   2197  1.1  mrg 	fprintf (outfile, "critical ");
   2198  1.1  mrg       if (is_wakeup_func ())
   2199  1.1  mrg 	fprintf (outfile, "wakeup ");
   2200  1.1  mrg       fprintf (outfile, "\n");
   2201  1.1  mrg     }
   2202  1.1  mrg 
   2203  1.1  mrg   fprintf (outfile, "; framesize_regs:     %d\n",
   2204  1.1  mrg 	   cfun->machine->framesize_regs);
   2205  1.1  mrg   fprintf (outfile, "; framesize_locals:   %d\n",
   2206  1.1  mrg 	   cfun->machine->framesize_locals);
   2207  1.1  mrg   fprintf (outfile, "; framesize_outgoing: %d\n",
   2208  1.1  mrg 	   cfun->machine->framesize_outgoing);
   2209  1.1  mrg   fprintf (outfile, "; framesize:          %d\n", cfun->machine->framesize);
   2210  1.1  mrg   fprintf (outfile, "; elim ap -> fp       %d\n",
   2211  1.1  mrg 	   msp430_initial_elimination_offset (ARG_POINTER_REGNUM,
   2212  1.1  mrg 					      FRAME_POINTER_REGNUM));
   2213  1.1  mrg   fprintf (outfile, "; elim fp -> sp       %d\n",
   2214  1.1  mrg 	   msp430_initial_elimination_offset (FRAME_POINTER_REGNUM,
   2215  1.1  mrg 					      STACK_POINTER_REGNUM));
   2216  1.1  mrg 
   2217  1.1  mrg   n = 0;
   2218  1.1  mrg   fprintf (outfile, "; saved regs:");
   2219  1.1  mrg   for (r = 0; r < ARG_POINTER_REGNUM; r++)
   2220  1.1  mrg     if (cfun->machine->need_to_save[r])
   2221  1.1  mrg       {
   2222  1.1  mrg 	fprintf (outfile, " %s", reg_names[r]);
   2223  1.1  mrg 	n = 1;
   2224  1.1  mrg       }
   2225  1.1  mrg   if (n == 0)
   2226  1.1  mrg     fprintf (outfile, "(none)");
   2227  1.1  mrg   fprintf (outfile, "\n");
   2228  1.1  mrg }
   2229  1.1  mrg 
   2230  1.1  mrg /* Common code to change the stack pointer.  */
   2231  1.1  mrg static void
   2232  1.1  mrg increment_stack (HOST_WIDE_INT amount)
   2233  1.1  mrg {
   2234  1.1  mrg   rtx inc;
   2235  1.1  mrg   rtx sp =  stack_pointer_rtx;
   2236  1.1  mrg 
   2237  1.1  mrg   if (amount == 0)
   2238  1.1  mrg     return;
   2239  1.1  mrg 
   2240  1.1  mrg   if (amount < 0)
   2241  1.1  mrg     {
   2242  1.1  mrg       inc = GEN_INT (- amount);
   2243  1.1  mrg       if (TARGET_LARGE)
   2244  1.1  mrg 	F (emit_insn (gen_subpsi3 (sp, sp, inc)));
   2245  1.1  mrg       else
   2246  1.1  mrg 	F (emit_insn (gen_subhi3 (sp, sp, inc)));
   2247  1.1  mrg     }
   2248  1.1  mrg   else
   2249  1.1  mrg     {
   2250  1.1  mrg       inc = GEN_INT (amount);
   2251  1.1  mrg       if (TARGET_LARGE)
   2252  1.1  mrg 	F (emit_insn (gen_addpsi3 (sp, sp, inc)));
   2253  1.1  mrg       else
   2254  1.1  mrg 	F (emit_insn (gen_addhi3 (sp, sp, inc)));
   2255  1.1  mrg     }
   2256  1.1  mrg }
   2257  1.1  mrg 
   2258  1.1  mrg void
   2259  1.1  mrg msp430_start_function (FILE *file, const char *name, tree decl)
   2260  1.1  mrg {
   2261  1.1  mrg   tree int_attr;
   2262  1.1  mrg 
   2263  1.1  mrg   int_attr = lookup_attribute ("interrupt", DECL_ATTRIBUTES (decl));
   2264  1.1  mrg   if (int_attr != NULL_TREE)
   2265  1.1  mrg     {
   2266  1.1  mrg       tree intr_vector = TREE_VALUE (int_attr);
   2267  1.1  mrg 
   2268  1.1  mrg       if (intr_vector != NULL_TREE)
   2269  1.1  mrg 	{
   2270  1.1  mrg 	  char buf[101];
   2271  1.1  mrg 
   2272  1.1  mrg 	  /* Interrupt vector sections should be unique, but use of weak
   2273  1.1  mrg 	     functions implies multiple definitions.  */
   2274  1.1  mrg 	  if (DECL_WEAK (decl))
   2275  1.1  mrg 	    {
   2276  1.1  mrg 	      error ("argument to interrupt attribute is unsupported for weak "
   2277  1.1  mrg 		     "functions");
   2278  1.1  mrg 	    }
   2279  1.1  mrg 
   2280  1.1  mrg 	  intr_vector = TREE_VALUE (intr_vector);
   2281  1.1  mrg 
   2282  1.1  mrg 	  /* The interrupt attribute has a vector value.  Turn this into a
   2283  1.1  mrg 	     section name, switch to that section and put the address of
   2284  1.1  mrg 	     the current function into that vector slot.  Note msp430_attr()
   2285  1.1  mrg 	     has already verified the vector name for us.  */
   2286  1.1  mrg 	  if (TREE_CODE (intr_vector) == STRING_CST)
   2287  1.1  mrg 	    sprintf (buf, "__interrupt_vector_%.80s",
   2288  1.1  mrg 		     TREE_STRING_POINTER (intr_vector));
   2289  1.1  mrg 	  else /* TREE_CODE (intr_vector) == INTEGER_CST */
   2290  1.1  mrg 	    sprintf (buf, "__interrupt_vector_%u",
   2291  1.1  mrg 		     (unsigned int) TREE_INT_CST_LOW (intr_vector));
   2292  1.1  mrg 
   2293  1.1  mrg 	  switch_to_section (get_section (buf, SECTION_CODE, decl));
   2294  1.1  mrg 	  fputs ("\t.word\t", file);
   2295  1.1  mrg 	  assemble_name (file, name);
   2296  1.1  mrg 	  fputc ('\n', file);
   2297  1.1  mrg 	  fputc ('\t', file);
   2298  1.1  mrg 	}
   2299  1.1  mrg     }
   2300  1.1  mrg 
   2301  1.1  mrg   switch_to_section (function_section (decl));
   2302  1.1  mrg   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
   2303  1.1  mrg   ASM_OUTPUT_FUNCTION_LABEL (file, name, decl);
   2304  1.1  mrg }
   2305  1.1  mrg 
   2306  1.1  mrg static const char * const lower_prefix = ".lower";
   2307  1.1  mrg static const char * const upper_prefix = ".upper";
   2308  1.1  mrg static const char * const either_prefix = ".either";
   2309  1.1  mrg 
   2310  1.1  mrg /* Generate a prefix for a section name, based upon
   2311  1.1  mrg    the region into which the object should be placed.  */
   2312  1.1  mrg 
   2313  1.1  mrg static const char *
   2314  1.1  mrg gen_prefix (tree decl)
   2315  1.1  mrg {
   2316  1.1  mrg   if (DECL_ONE_ONLY (decl))
   2317  1.1  mrg     return NULL;
   2318  1.1  mrg 
   2319  1.1  mrg   /* If the user has specified a particular section then do not use any
   2320  1.1  mrg      prefix.  */
   2321  1.1  mrg   if (has_attr ("section", decl))
   2322  1.1  mrg     return NULL;
   2323  1.1  mrg 
   2324  1.1  mrg   /* If the function has been put in the .lowtext section (because it is an
   2325  1.1  mrg      interrupt handler, and the large memory model is used), then do not add
   2326  1.1  mrg      any prefixes.  */
   2327  1.1  mrg   if (has_section_name (".lowtext", decl))
   2328  1.1  mrg     return NULL;
   2329  1.1  mrg 
   2330  1.1  mrg   /* Memory regions require the large memory model.  */
   2331  1.1  mrg   if (!TARGET_LARGE)
   2332  1.1  mrg     return NULL;
   2333  1.1  mrg 
   2334  1.1  mrg   /* Note that we always apply the lower prefix when the attribute has been
   2335  1.1  mrg      used.  But we only apply the lower prefix when the lower region has been
   2336  1.1  mrg      specified by a command line option if -muse-lower-region-prefix has also
   2337  1.1  mrg      been passed.  */
   2338  1.1  mrg   if (has_attr (ATTR_LOWER, decl))
   2339  1.1  mrg     return lower_prefix;
   2340  1.1  mrg 
   2341  1.1  mrg   if (has_attr (ATTR_UPPER, decl))
   2342  1.1  mrg     return upper_prefix;
   2343  1.1  mrg 
   2344  1.1  mrg   if (has_attr (ATTR_EITHER, decl))
   2345  1.1  mrg     return either_prefix;
   2346  1.1  mrg 
   2347  1.1  mrg   if (TREE_CODE (decl) == FUNCTION_DECL)
   2348  1.1  mrg     {
   2349  1.1  mrg       if ((msp430_code_region == MSP430_REGION_LOWER)
   2350  1.1  mrg 	  && TARGET_USE_LOWER_REGION_PREFIX)
   2351  1.1  mrg 	return lower_prefix;
   2352  1.1  mrg 
   2353  1.1  mrg       if (msp430_code_region == MSP430_REGION_UPPER)
   2354  1.1  mrg 	return upper_prefix;
   2355  1.1  mrg 
   2356  1.1  mrg       if (msp430_code_region == MSP430_REGION_EITHER)
   2357  1.1  mrg 	return either_prefix;
   2358  1.1  mrg     }
   2359  1.1  mrg   else
   2360  1.1  mrg     {
   2361  1.1  mrg       if ((msp430_data_region == MSP430_REGION_LOWER)
   2362  1.1  mrg 	  && TARGET_USE_LOWER_REGION_PREFIX)
   2363  1.1  mrg 	return lower_prefix;
   2364  1.1  mrg 
   2365  1.1  mrg       if (msp430_data_region == MSP430_REGION_UPPER)
   2366  1.1  mrg 	return upper_prefix;
   2367  1.1  mrg 
   2368  1.1  mrg       if (msp430_data_region == MSP430_REGION_EITHER)
   2369  1.1  mrg 	return either_prefix;
   2370  1.1  mrg     }
   2371  1.1  mrg 
   2372  1.1  mrg   return NULL;
   2373  1.1  mrg }
   2374  1.1  mrg 
   2375  1.1  mrg #undef  TARGET_ASM_SELECT_SECTION
   2376  1.1  mrg #define TARGET_ASM_SELECT_SECTION msp430_select_section
   2377  1.1  mrg 
   2378  1.1  mrg static section *
   2379  1.1  mrg msp430_select_section (tree decl, int reloc, unsigned HOST_WIDE_INT align)
   2380  1.1  mrg {
   2381  1.1  mrg   const char *prefix;
   2382  1.1  mrg   const char *sec_name;
   2383  1.1  mrg   const char *base_sec_name;
   2384  1.1  mrg 
   2385  1.1  mrg   gcc_assert (decl != NULL_TREE);
   2386  1.1  mrg 
   2387  1.1  mrg   if (TREE_CODE (decl) == STRING_CST
   2388  1.1  mrg       || TREE_CODE (decl) == CONSTRUCTOR
   2389  1.1  mrg       || TREE_CODE (decl) == INTEGER_CST
   2390  1.1  mrg       || TREE_CODE (decl) == VECTOR_CST
   2391  1.1  mrg       || TREE_CODE (decl) == COMPLEX_CST)
   2392  1.1  mrg     return default_select_section (decl, reloc, align);
   2393  1.1  mrg 
   2394  1.1  mrg   /* In large mode we must make sure that interrupt handlers are put into
   2395  1.1  mrg      low memory as the vector table only accepts 16-bit addresses.  */
   2396  1.1  mrg   if (TARGET_LARGE && TREE_CODE (decl) == FUNCTION_DECL
   2397  1.1  mrg       && is_interrupt_func (decl))
   2398  1.1  mrg     return get_section (".lowtext", SECTION_CODE | SECTION_WRITE , decl);
   2399  1.1  mrg 
   2400  1.1  mrg   /* The "noinit" and "persistent" attributes are handled generically.  */
   2401  1.1  mrg   if (has_attr (ATTR_NOINIT, decl) || has_attr (ATTR_PERSIST, decl))
   2402  1.1  mrg     return default_elf_select_section (decl, reloc, align);
   2403  1.1  mrg 
   2404  1.1  mrg   prefix = gen_prefix (decl);
   2405  1.1  mrg 
   2406  1.1  mrg   switch (categorize_decl_for_section (decl, reloc))
   2407  1.1  mrg     {
   2408  1.1  mrg     case SECCAT_TEXT:
   2409  1.1  mrg       if (!prefix)
   2410  1.1  mrg 	return text_section;
   2411  1.1  mrg       base_sec_name = ".text";
   2412  1.1  mrg       break;
   2413  1.1  mrg     case SECCAT_DATA:
   2414  1.1  mrg       if (!prefix)
   2415  1.1  mrg 	return data_section;
   2416  1.1  mrg       base_sec_name = ".data";
   2417  1.1  mrg       break;
   2418  1.1  mrg     case SECCAT_BSS:
   2419  1.1  mrg       if (!prefix)
   2420  1.1  mrg 	return bss_section;
   2421  1.1  mrg       base_sec_name = ".bss";
   2422  1.1  mrg       break;
   2423  1.1  mrg     case SECCAT_RODATA:
   2424  1.1  mrg       if (!prefix)
   2425  1.1  mrg 	return readonly_data_section;
   2426  1.1  mrg       base_sec_name = ".rodata";
   2427  1.1  mrg       break;
   2428  1.1  mrg 
   2429  1.1  mrg     /* Enable merging of constant data by the GNU linker using
   2430  1.1  mrg        default_elf_select_section and therefore enabling creation of
   2431  1.1  mrg        sections with the SHF_MERGE flag.  */
   2432  1.1  mrg     case SECCAT_RODATA_MERGE_STR:
   2433  1.1  mrg     case SECCAT_RODATA_MERGE_STR_INIT:
   2434  1.1  mrg     case SECCAT_RODATA_MERGE_CONST:
   2435  1.1  mrg       return default_elf_select_section (decl, reloc, align);
   2436  1.1  mrg 
   2437  1.1  mrg     /* The sections listed below are not supported for MSP430.
   2438  1.1  mrg        They should not be generated, but in case they are, we use
   2439  1.1  mrg        default_select_section so they get placed in sections
   2440  1.1  mrg        the msp430 assembler and linker understand.  */
   2441  1.1  mrg     /* "small data" sections are not supported.  */
   2442  1.1  mrg     case SECCAT_SRODATA:
   2443  1.1  mrg     case SECCAT_SDATA:
   2444  1.1  mrg     case SECCAT_SBSS:
   2445  1.1  mrg     /* Thread-local storage (TLS) is not supported.  */
   2446  1.1  mrg     case SECCAT_TDATA:
   2447  1.1  mrg     case SECCAT_TBSS:
   2448  1.1  mrg     /* Sections used by a dynamic linker are not supported.  */
   2449  1.1  mrg     case SECCAT_DATA_REL:
   2450  1.1  mrg     case SECCAT_DATA_REL_LOCAL:
   2451  1.1  mrg     case SECCAT_DATA_REL_RO:
   2452  1.1  mrg     case SECCAT_DATA_REL_RO_LOCAL:
   2453  1.1  mrg       return default_select_section (decl, reloc, align);
   2454  1.1  mrg 
   2455  1.1  mrg     default:
   2456  1.1  mrg       gcc_unreachable ();
   2457  1.1  mrg     }
   2458  1.1  mrg 
   2459  1.1  mrg   sec_name = ACONCAT ((prefix, base_sec_name, DECL_SECTION_NAME (decl), NULL));
   2460  1.1  mrg 
   2461  1.1  mrg   return get_named_section (decl, sec_name, 0);
   2462  1.1  mrg }
   2463  1.1  mrg 
   2464  1.1  mrg #undef  TARGET_ASM_FUNCTION_SECTION
   2465  1.1  mrg #define TARGET_ASM_FUNCTION_SECTION msp430_function_section
   2466  1.1  mrg 
   2467  1.1  mrg static section *
   2468  1.1  mrg msp430_function_section (tree decl, enum node_frequency freq, bool startup,
   2469  1.1  mrg 			 bool exit)
   2470  1.1  mrg {
   2471  1.1  mrg   const char * name;
   2472  1.1  mrg 
   2473  1.1  mrg   gcc_assert (DECL_SECTION_NAME (decl) != NULL);
   2474  1.1  mrg   name = DECL_SECTION_NAME (decl);
   2475  1.1  mrg 
   2476  1.1  mrg   const char * prefix = gen_prefix (decl);
   2477  1.1  mrg   if (prefix == NULL
   2478  1.1  mrg       || startswith (name, prefix))
   2479  1.1  mrg     return default_function_section (decl, freq, startup, exit);
   2480  1.1  mrg 
   2481  1.1  mrg   name = ACONCAT ((prefix, name, NULL));
   2482  1.1  mrg   return get_named_section (decl, name, 0);
   2483  1.1  mrg }
   2484  1.1  mrg 
   2485  1.1  mrg #undef  TARGET_SECTION_TYPE_FLAGS
   2486  1.1  mrg #define TARGET_SECTION_TYPE_FLAGS msp430_section_type_flags
   2487  1.1  mrg 
   2488  1.1  mrg unsigned int
   2489  1.1  mrg msp430_section_type_flags (tree decl, const char * name, int reloc)
   2490  1.1  mrg {
   2491  1.1  mrg   if (startswith (name, lower_prefix))
   2492  1.1  mrg     name += strlen (lower_prefix);
   2493  1.1  mrg   else if (startswith (name, upper_prefix))
   2494  1.1  mrg     name += strlen (upper_prefix);
   2495  1.1  mrg   else if (startswith (name, either_prefix))
   2496  1.1  mrg     name += strlen (either_prefix);
   2497  1.1  mrg 
   2498  1.1  mrg   return default_section_type_flags (decl, name, reloc);
   2499  1.1  mrg }
   2500  1.1  mrg 
   2501  1.1  mrg #undef  TARGET_ASM_UNIQUE_SECTION
   2502  1.1  mrg #define TARGET_ASM_UNIQUE_SECTION msp430_unique_section
   2503  1.1  mrg 
   2504  1.1  mrg static void
   2505  1.1  mrg msp430_unique_section (tree decl, int reloc)
   2506  1.1  mrg {
   2507  1.1  mrg   gcc_assert (decl != NULL_TREE);
   2508  1.1  mrg 
   2509  1.1  mrg   /* In large mode we must make sure that interrupt handlers are put into
   2510  1.1  mrg      low memory as the vector table only accepts 16-bit addresses.  */
   2511  1.1  mrg   if (TARGET_LARGE && TREE_CODE (decl) == FUNCTION_DECL
   2512  1.1  mrg       && is_interrupt_func (decl))
   2513  1.1  mrg     {
   2514  1.1  mrg       set_decl_section_name (decl, ".lowtext");
   2515  1.1  mrg       return;
   2516  1.1  mrg     }
   2517  1.1  mrg 
   2518  1.1  mrg   default_unique_section (decl, reloc);
   2519  1.1  mrg 
   2520  1.1  mrg   const char * prefix;
   2521  1.1  mrg 
   2522  1.1  mrg   if (   TREE_CODE (decl) == STRING_CST
   2523  1.1  mrg       || TREE_CODE (decl) == CONSTRUCTOR
   2524  1.1  mrg       || TREE_CODE (decl) == INTEGER_CST
   2525  1.1  mrg       || TREE_CODE (decl) == VECTOR_CST
   2526  1.1  mrg       || TREE_CODE (decl) == COMPLEX_CST
   2527  1.1  mrg       || (prefix = gen_prefix (decl)) == NULL)
   2528  1.1  mrg     return;
   2529  1.1  mrg 
   2530  1.1  mrg   const char * dec_name = DECL_SECTION_NAME (decl);
   2531  1.1  mrg   char * name = ACONCAT ((prefix, dec_name, NULL));
   2532  1.1  mrg 
   2533  1.1  mrg   set_decl_section_name (decl, name);
   2534  1.1  mrg }
   2535  1.1  mrg 
   2536  1.1  mrg /* Emit a declaration of a common symbol.
   2537  1.1  mrg    If a data region is in use then put the symbol into the
   2538  1.1  mrg    equivalent .bss section instead.
   2539  1.1  mrg    If LOCAL is 1, then DECL is for a local common variable.  */
   2540  1.1  mrg void
   2541  1.1  mrg msp430_output_aligned_decl_common (FILE *		  stream,
   2542  1.1  mrg 				   const tree		  decl,
   2543  1.1  mrg 				   const char *		  name,
   2544  1.1  mrg 				   unsigned HOST_WIDE_INT size,
   2545  1.1  mrg 				   unsigned int		  align,
   2546  1.1  mrg 				   int local)
   2547  1.1  mrg {
   2548  1.1  mrg   /* Only emit a common symbol if the variable does not have a specific section
   2549  1.1  mrg      assigned.  */
   2550  1.1  mrg   if ((msp430_data_region == MSP430_REGION_ANY
   2551  1.1  mrg        || ((msp430_data_region == MSP430_REGION_LOWER)
   2552  1.1  mrg 	   && !TARGET_USE_LOWER_REGION_PREFIX))
   2553  1.1  mrg       && !(decl != NULL_TREE && DECL_SECTION_NAME (decl))
   2554  1.1  mrg       && !has_attr (ATTR_EITHER, decl)
   2555  1.1  mrg       && !has_attr (ATTR_LOWER, decl)
   2556  1.1  mrg       && !has_attr (ATTR_UPPER, decl)
   2557  1.1  mrg       && !has_attr (ATTR_PERSIST, decl)
   2558  1.1  mrg       && !has_attr (ATTR_NOINIT, decl))
   2559  1.1  mrg     {
   2560  1.1  mrg       if (local)
   2561  1.1  mrg 	{
   2562  1.1  mrg 	  fprintf (stream, LOCAL_ASM_OP);
   2563  1.1  mrg 	  assemble_name (stream, name);
   2564  1.1  mrg 	  fprintf (stream, "\n");
   2565  1.1  mrg 	}
   2566  1.1  mrg       fprintf (stream, COMMON_ASM_OP);
   2567  1.1  mrg       assemble_name (stream, name);
   2568  1.1  mrg       fprintf (stream, "," HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",
   2569  1.1  mrg 	       size, align / BITS_PER_UNIT);
   2570  1.1  mrg     }
   2571  1.1  mrg   else
   2572  1.1  mrg     {
   2573  1.1  mrg       section * sec;
   2574  1.1  mrg 
   2575  1.1  mrg       if (decl)
   2576  1.1  mrg 	sec = msp430_select_section (decl, 0, align);
   2577  1.1  mrg       else
   2578  1.1  mrg 	switch (msp430_data_region)
   2579  1.1  mrg 	  {
   2580  1.1  mrg 	  case MSP430_REGION_UPPER:
   2581  1.1  mrg 	    sec = get_named_section (NULL, ".upper.bss", 0);
   2582  1.1  mrg 	    break;
   2583  1.1  mrg 	  case MSP430_REGION_LOWER:
   2584  1.1  mrg 	    sec = get_named_section (NULL, ".lower.bss", 0);
   2585  1.1  mrg 	    break;
   2586  1.1  mrg 	  case MSP430_REGION_EITHER:
   2587  1.1  mrg 	    sec = get_named_section (NULL, ".either.bss", 0);
   2588  1.1  mrg 	    break;
   2589  1.1  mrg 	  default:
   2590  1.1  mrg 	    gcc_unreachable ();
   2591  1.1  mrg 	  }
   2592  1.1  mrg       gcc_assert (sec != NULL);
   2593  1.1  mrg 
   2594  1.1  mrg       switch_to_section (sec);
   2595  1.1  mrg       ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
   2596  1.1  mrg       if (!local)
   2597  1.1  mrg 	{
   2598  1.1  mrg 	  targetm.asm_out.globalize_label (stream, name);
   2599  1.1  mrg 	  ASM_WEAKEN_LABEL (stream, name);
   2600  1.1  mrg 	}
   2601  1.1  mrg       ASM_OUTPUT_LABEL (stream, name);
   2602  1.1  mrg       ASM_OUTPUT_SKIP (stream, size ? size : 1);
   2603  1.1  mrg     }
   2604  1.1  mrg }
   2605  1.1  mrg 
   2606  1.1  mrg #undef TARGET_ASM_FILE_END
   2607  1.1  mrg #define TARGET_ASM_FILE_END msp430_file_end
   2608  1.1  mrg 
   2609  1.1  mrg /* Emit MSPABI and GNU object attributes.
   2610  1.1  mrg    Tags and values for MSPABI attributes are:
   2611  1.1  mrg    OFBA_MSPABI_Tag_ISA		4
   2612  1.1  mrg      MSP430	1
   2613  1.1  mrg      MSP430X	2
   2614  1.1  mrg    OFBA_MSPABI_Tag_Code_Model	6
   2615  1.1  mrg      Small 	1
   2616  1.1  mrg      Large	2
   2617  1.1  mrg    OFBA_MSPABI_Tag_Data_Model	8
   2618  1.1  mrg      Small 	1
   2619  1.1  mrg      Large	2
   2620  1.1  mrg      Restricted	3 (Unused by GNU)
   2621  1.1  mrg    OFBA_MSPABI_Tag_enum_size	10 (Unused by GNU)
   2622  1.1  mrg    Note that Code_Model and Data_Model are always equal for GNU.
   2623  1.1  mrg    We define a new .gnu_attribute to keep track of the data region used.
   2624  1.1  mrg    Tag_GNU_MSP430_Data_Region	4
   2625  1.1  mrg      LOWER	1
   2626  1.1  mrg      ANY	2
   2627  1.1  mrg    See binutils-gdb/include/elf/msp430.h for the full details.  */
   2628  1.1  mrg static void
   2629  1.1  mrg msp430_file_end (void)
   2630  1.1  mrg {
   2631  1.1  mrg #ifdef HAVE_AS_MSPABI_ATTRIBUTE
   2632  1.1  mrg   /* Enum for tag names.  */
   2633  1.1  mrg   enum
   2634  1.1  mrg     {
   2635  1.1  mrg       OFBA_MSPABI_Tag_ISA = 4,
   2636  1.1  mrg       OFBA_MSPABI_Tag_Code_Model = 6,
   2637  1.1  mrg       OFBA_MSPABI_Tag_Data_Model = 8,
   2638  1.1  mrg       Tag_GNU_MSP430_Data_Region = 4
   2639  1.1  mrg     };
   2640  1.1  mrg   /* Enum for tag values.  */
   2641  1.1  mrg   enum
   2642  1.1  mrg     {
   2643  1.1  mrg       OFBA_MSPABI_Val_ISA_MSP430 = 1,
   2644  1.1  mrg       OFBA_MSPABI_Val_ISA_MSP430X = 2,
   2645  1.1  mrg       OFBA_MSPABI_Val_Model_Small = 1,
   2646  1.1  mrg       OFBA_MSPABI_Val_Model_Large = 2,
   2647  1.1  mrg       Tag_GNU_MSP430_Data_Region_Lower = 1,
   2648  1.1  mrg       Tag_GNU_MSP430_Data_Region_Any = 2
   2649  1.1  mrg     };
   2650  1.1  mrg   /* .mspabi_attribute is a GNU assembler directive only.  The assembler will
   2651  1.1  mrg      construct a .MSP430.attributes section based on the options it is invoked
   2652  1.1  mrg      with.  The values it reads from these directives are used for validating
   2653  1.1  mrg      those options.  */
   2654  1.1  mrg   const char *msp430_attr = ".mspabi_attribute";
   2655  1.1  mrg   const char *gnu_attr = ".gnu_attribute";
   2656  1.1  mrg 
   2657  1.1  mrg   /* Emit .mspabi_attribute directive for OFBA_MSPABI_Tag_ISA.  */
   2658  1.1  mrg   fprintf (asm_out_file, "\t%s %d, %d\n", msp430_attr, OFBA_MSPABI_Tag_ISA,
   2659  1.1  mrg 	   msp430x ? OFBA_MSPABI_Val_ISA_MSP430X : OFBA_MSPABI_Val_ISA_MSP430);
   2660  1.1  mrg   /* Emit .mspabi_attribute directive for OFBA_MSPABI_Tag_Code_Model.  */
   2661  1.1  mrg   fprintf (asm_out_file, "\t%s %d, %d\n", msp430_attr,
   2662  1.1  mrg 	   OFBA_MSPABI_Tag_Code_Model,
   2663  1.1  mrg 	   TARGET_LARGE ? OFBA_MSPABI_Val_Model_Large
   2664  1.1  mrg 	   : OFBA_MSPABI_Val_Model_Small);
   2665  1.1  mrg   /* Emit .mspabi_attribute directive for OFBA_MSPABI_Tag_Data_Model.  */
   2666  1.1  mrg   fprintf (asm_out_file, "\t%s %d, %d\n", msp430_attr,
   2667  1.1  mrg 	   OFBA_MSPABI_Tag_Data_Model,
   2668  1.1  mrg 	   TARGET_LARGE ? OFBA_MSPABI_Val_Model_Large
   2669  1.1  mrg 	   : OFBA_MSPABI_Val_Model_Small);
   2670  1.1  mrg #ifdef HAVE_AS_GNU_ATTRIBUTE
   2671  1.1  mrg   /* Emit .gnu_attribute directive for Tag_GNU_MSP430_Data_Region.  */
   2672  1.1  mrg   fprintf (asm_out_file, "\t%s %d, %d\n", gnu_attr, Tag_GNU_MSP430_Data_Region,
   2673  1.1  mrg 	   msp430_data_region == MSP430_REGION_LOWER
   2674  1.1  mrg 	   ? Tag_GNU_MSP430_Data_Region_Lower
   2675  1.1  mrg 	   : Tag_GNU_MSP430_Data_Region_Any);
   2676  1.1  mrg #endif
   2677  1.1  mrg #endif
   2678  1.1  mrg }
   2679  1.1  mrg 
   2680  1.1  mrg enum msp430_builtin
   2681  1.1  mrg {
   2682  1.1  mrg   MSP430_BUILTIN_BIC_SR,
   2683  1.1  mrg   MSP430_BUILTIN_BIS_SR,
   2684  1.1  mrg   MSP430_BUILTIN_DELAY_CYCLES,
   2685  1.1  mrg   MSP430_BUILTIN_max
   2686  1.1  mrg };
   2687  1.1  mrg 
   2688  1.1  mrg static GTY(()) tree msp430_builtins[(int) MSP430_BUILTIN_max];
   2689  1.1  mrg 
   2690  1.1  mrg static void
   2691  1.1  mrg msp430_init_builtins (void)
   2692  1.1  mrg {
   2693  1.1  mrg   tree void_ftype_int = build_function_type_list (void_type_node,
   2694  1.1  mrg 						  integer_type_node, NULL);
   2695  1.1  mrg   tree void_ftype_longlong
   2696  1.1  mrg     = build_function_type_list (void_type_node, long_long_integer_type_node,
   2697  1.1  mrg 				NULL);
   2698  1.1  mrg 
   2699  1.1  mrg   msp430_builtins[MSP430_BUILTIN_BIC_SR] =
   2700  1.1  mrg     add_builtin_function ( "__bic_SR_register_on_exit", void_ftype_int,
   2701  1.1  mrg 			  MSP430_BUILTIN_BIC_SR, BUILT_IN_MD, NULL, NULL_TREE);
   2702  1.1  mrg 
   2703  1.1  mrg   msp430_builtins[MSP430_BUILTIN_BIS_SR] =
   2704  1.1  mrg     add_builtin_function ( "__bis_SR_register_on_exit", void_ftype_int,
   2705  1.1  mrg 			  MSP430_BUILTIN_BIS_SR, BUILT_IN_MD, NULL, NULL_TREE);
   2706  1.1  mrg 
   2707  1.1  mrg   msp430_builtins[MSP430_BUILTIN_DELAY_CYCLES] =
   2708  1.1  mrg     add_builtin_function ( "__delay_cycles", void_ftype_longlong,
   2709  1.1  mrg 			  MSP430_BUILTIN_DELAY_CYCLES, BUILT_IN_MD, NULL,
   2710  1.1  mrg 			  NULL_TREE);
   2711  1.1  mrg }
   2712  1.1  mrg 
   2713  1.1  mrg static tree
   2714  1.1  mrg msp430_builtin_decl (unsigned code, bool initialize ATTRIBUTE_UNUSED)
   2715  1.1  mrg {
   2716  1.1  mrg   switch (code)
   2717  1.1  mrg     {
   2718  1.1  mrg     case MSP430_BUILTIN_BIC_SR:
   2719  1.1  mrg     case MSP430_BUILTIN_BIS_SR:
   2720  1.1  mrg     case MSP430_BUILTIN_DELAY_CYCLES:
   2721  1.1  mrg       return msp430_builtins[code];
   2722  1.1  mrg     default:
   2723  1.1  mrg       return error_mark_node;
   2724  1.1  mrg     }
   2725  1.1  mrg }
   2726  1.1  mrg 
   2727  1.1  mrg /* These constants are really register reads, which are faster than
   2728  1.1  mrg    regular constants.  */
   2729  1.1  mrg static int
   2730  1.1  mrg cg_magic_constant (HOST_WIDE_INT c)
   2731  1.1  mrg {
   2732  1.1  mrg   switch (c)
   2733  1.1  mrg     {
   2734  1.1  mrg     case 0xffff:
   2735  1.1  mrg     case -1:
   2736  1.1  mrg     case 0:
   2737  1.1  mrg     case 1:
   2738  1.1  mrg     case 2:
   2739  1.1  mrg     case 4:
   2740  1.1  mrg     case 8:
   2741  1.1  mrg       return 1;
   2742  1.1  mrg     default:
   2743  1.1  mrg       return 0;
   2744  1.1  mrg     }
   2745  1.1  mrg }
   2746  1.1  mrg 
   2747  1.1  mrg static rtx
   2748  1.1  mrg msp430_expand_delay_cycles (rtx arg)
   2749  1.1  mrg {
   2750  1.1  mrg   HOST_WIDE_INT i, c, n;
   2751  1.1  mrg   /* extra cycles for MSP430X instructions */
   2752  1.1  mrg #define CYCX(M,X) (msp430x ? (X) : (M))
   2753  1.1  mrg 
   2754  1.1  mrg   if (GET_CODE (arg) != CONST_INT)
   2755  1.1  mrg     {
   2756  1.1  mrg       error ("%<__delay_cycles%> only takes constant arguments");
   2757  1.1  mrg       return NULL_RTX;
   2758  1.1  mrg     }
   2759  1.1  mrg 
   2760  1.1  mrg   c = INTVAL (arg);
   2761  1.1  mrg 
   2762  1.1  mrg   if (HOST_BITS_PER_WIDE_INT > 32)
   2763  1.1  mrg     {
   2764  1.1  mrg       if (c < 0)
   2765  1.1  mrg 	{
   2766  1.1  mrg 	  error ("%<__delay_cycles%> only takes non-negative cycle counts");
   2767  1.1  mrg 	  return NULL_RTX;
   2768  1.1  mrg 	}
   2769  1.1  mrg     }
   2770  1.1  mrg 
   2771  1.1  mrg   emit_insn (gen_delay_cycles_start (arg));
   2772  1.1  mrg 
   2773  1.1  mrg   /* For 32-bit loops, there's 13(16) + 5(min(x,0x10000) + 6x cycles.  */
   2774  1.1  mrg   if (c > 3 * 0xffff + CYCX (7, 10))
   2775  1.1  mrg     {
   2776  1.1  mrg       n = c;
   2777  1.1  mrg       /* There's 4 cycles in the short (i>0xffff) loop and 7 in the long
   2778  1.1  mrg 	 (x<=0xffff) loop.  */
   2779  1.1  mrg       if (c >= 0x10000 * 7 + CYCX (14, 16))
   2780  1.1  mrg 	{
   2781  1.1  mrg 	  i = 0x10000;
   2782  1.1  mrg 	  c -= CYCX (14, 16) + 7 * 0x10000;
   2783  1.1  mrg 	  i += c / 4;
   2784  1.1  mrg 	  c %= 4;
   2785  1.1  mrg 	  if ((unsigned long long) i > 0xffffffffULL)
   2786  1.1  mrg 	    {
   2787  1.1  mrg 	      error ("%<__delay_cycles%> is limited to 32-bit loop counts");
   2788  1.1  mrg 	      return NULL_RTX;
   2789  1.1  mrg 	    }
   2790  1.1  mrg 	}
   2791  1.1  mrg       else
   2792  1.1  mrg 	{
   2793  1.1  mrg 	  i = (c - CYCX (14, 16)) / 7;
   2794  1.1  mrg 	  c -= CYCX (14, 16) + i * 7;
   2795  1.1  mrg 	}
   2796  1.1  mrg 
   2797  1.1  mrg       if (cg_magic_constant (i & 0xffff))
   2798  1.1  mrg 	c ++;
   2799  1.1  mrg       if (cg_magic_constant ((i >> 16) & 0xffff))
   2800  1.1  mrg 	c ++;
   2801  1.1  mrg 
   2802  1.1  mrg       if (msp430x)
   2803  1.1  mrg 	emit_insn (gen_delay_cycles_32x (GEN_INT (i), GEN_INT (n - c)));
   2804  1.1  mrg       else
   2805  1.1  mrg 	emit_insn (gen_delay_cycles_32 (GEN_INT (i), GEN_INT (n - c)));
   2806  1.1  mrg     }
   2807  1.1  mrg 
   2808  1.1  mrg   /* For 16-bit loops, there's 7(10) + 3x cycles - so the max cycles is
   2809  1.1  mrg      0x30004(7).  */
   2810  1.1  mrg   if (c > 12)
   2811  1.1  mrg     {
   2812  1.1  mrg       n = c;
   2813  1.1  mrg       i = (c - CYCX (7, 10)) / 3;
   2814  1.1  mrg       c -= CYCX (7, 10) + i * 3;
   2815  1.1  mrg 
   2816  1.1  mrg       if (cg_magic_constant (i))
   2817  1.1  mrg 	c ++;
   2818  1.1  mrg 
   2819  1.1  mrg       if (msp430x)
   2820  1.1  mrg 	emit_insn (gen_delay_cycles_16x (GEN_INT (i), GEN_INT (n - c)));
   2821  1.1  mrg       else
   2822  1.1  mrg 	emit_insn (gen_delay_cycles_16 (GEN_INT (i), GEN_INT (n - c)));
   2823  1.1  mrg     }
   2824  1.1  mrg 
   2825  1.1  mrg   while (c > 1)
   2826  1.1  mrg     {
   2827  1.1  mrg       emit_insn (gen_delay_cycles_2 ());
   2828  1.1  mrg       c -= 2;
   2829  1.1  mrg     }
   2830  1.1  mrg 
   2831  1.1  mrg   if (c)
   2832  1.1  mrg     {
   2833  1.1  mrg       emit_insn (gen_delay_cycles_1 ());
   2834  1.1  mrg       c -= 1;
   2835  1.1  mrg     }
   2836  1.1  mrg 
   2837  1.1  mrg   emit_insn (gen_delay_cycles_end (arg));
   2838  1.1  mrg 
   2839  1.1  mrg   return NULL_RTX;
   2840  1.1  mrg }
   2841  1.1  mrg 
   2842  1.1  mrg static rtx
   2843  1.1  mrg msp430_expand_builtin (tree exp,
   2844  1.1  mrg 		       rtx target ATTRIBUTE_UNUSED,
   2845  1.1  mrg 		       rtx subtarget ATTRIBUTE_UNUSED,
   2846  1.1  mrg 		       machine_mode mode ATTRIBUTE_UNUSED,
   2847  1.1  mrg 		       int ignore ATTRIBUTE_UNUSED)
   2848  1.1  mrg {
   2849  1.1  mrg   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
   2850  1.1  mrg   unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
   2851  1.1  mrg   rtx arg1 = expand_normal (CALL_EXPR_ARG (exp, 0));
   2852  1.1  mrg 
   2853  1.1  mrg   if (fcode == MSP430_BUILTIN_DELAY_CYCLES)
   2854  1.1  mrg     return msp430_expand_delay_cycles (arg1);
   2855  1.1  mrg 
   2856  1.1  mrg   if (! msp430_is_interrupt_func ())
   2857  1.1  mrg     {
   2858  1.1  mrg       error ("MSP430 built-in functions only work inside interrupt handlers");
   2859  1.1  mrg       return NULL_RTX;
   2860  1.1  mrg     }
   2861  1.1  mrg 
   2862  1.1  mrg   if (! REG_P (arg1) && ! CONSTANT_P (arg1))
   2863  1.1  mrg     arg1 = force_reg (mode, arg1);
   2864  1.1  mrg 
   2865  1.1  mrg   switch (fcode)
   2866  1.1  mrg     {
   2867  1.1  mrg     case MSP430_BUILTIN_BIC_SR:  emit_insn (gen_bic_SR (arg1)); break;
   2868  1.1  mrg     case MSP430_BUILTIN_BIS_SR:  emit_insn (gen_bis_SR (arg1)); break;
   2869  1.1  mrg     default:
   2870  1.1  mrg       internal_error ("bad builtin code");
   2871  1.1  mrg       break;
   2872  1.1  mrg     }
   2873  1.1  mrg   return NULL_RTX;
   2874  1.1  mrg }
   2875  1.1  mrg 
   2876  1.1  mrg #undef  TARGET_INIT_BUILTINS
   2877  1.1  mrg #define TARGET_INIT_BUILTINS  msp430_init_builtins
   2878  1.1  mrg 
   2879  1.1  mrg #undef  TARGET_EXPAND_BUILTIN
   2880  1.1  mrg #define TARGET_EXPAND_BUILTIN msp430_expand_builtin
   2881  1.1  mrg 
   2882  1.1  mrg #undef  TARGET_BUILTIN_DECL
   2883  1.1  mrg #define TARGET_BUILTIN_DECL   msp430_builtin_decl
   2884  1.1  mrg 
   2885  1.1  mrg void
   2886  1.1  mrg msp430_expand_prologue (void)
   2887  1.1  mrg {
   2888  1.1  mrg   int i, j;
   2889  1.1  mrg   int fs;
   2890  1.1  mrg   /* Always use stack_pointer_rtx instead of calling
   2891  1.1  mrg      rtx_gen_REG ourselves.  Code elsewhere in GCC assumes
   2892  1.1  mrg      that there is a single rtx representing the stack pointer,
   2893  1.1  mrg      namely stack_pointer_rtx, and uses == to recognize it.  */
   2894  1.1  mrg   rtx sp = stack_pointer_rtx;
   2895  1.1  mrg   rtx p;
   2896  1.1  mrg 
   2897  1.1  mrg   if (is_naked_func ())
   2898  1.1  mrg     {
   2899  1.1  mrg       /* We must generate some RTX as thread_prologue_and_epilogue_insns()
   2900  1.1  mrg 	 examines the output of the gen_prologue() function.  */
   2901  1.1  mrg       emit_insn (gen_rtx_CLOBBER (VOIDmode, GEN_INT (0)));
   2902  1.1  mrg       return;
   2903  1.1  mrg     }
   2904  1.1  mrg 
   2905  1.1  mrg   emit_insn (gen_prologue_start_marker ());
   2906  1.1  mrg 
   2907  1.1  mrg   if (is_critical_func ())
   2908  1.1  mrg     {
   2909  1.1  mrg       emit_insn (gen_push_intr_state ());
   2910  1.1  mrg       emit_insn (gen_disable_interrupts ());
   2911  1.1  mrg     }
   2912  1.1  mrg   else if (is_reentrant_func ())
   2913  1.1  mrg     emit_insn (gen_disable_interrupts ());
   2914  1.1  mrg 
   2915  1.1  mrg   if (!cfun->machine->computed)
   2916  1.1  mrg     msp430_compute_frame_info ();
   2917  1.1  mrg 
   2918  1.1  mrg   if (flag_stack_usage_info)
   2919  1.1  mrg     current_function_static_stack_size = cfun->machine->framesize;
   2920  1.1  mrg 
   2921  1.1  mrg   if (crtl->args.pretend_args_size)
   2922  1.1  mrg     {
   2923  1.1  mrg       rtx note;
   2924  1.1  mrg 
   2925  1.1  mrg       gcc_assert (crtl->args.pretend_args_size == 2);
   2926  1.1  mrg 
   2927  1.1  mrg       p = emit_insn (gen_grow_and_swap ());
   2928  1.1  mrg 
   2929  1.1  mrg       /* Document the stack decrement...  */
   2930  1.1  mrg       note = F (gen_rtx_SET (stack_pointer_rtx,
   2931  1.1  mrg 			     gen_rtx_MINUS (Pmode,
   2932  1.1  mrg 					    stack_pointer_rtx, GEN_INT (2))));
   2933  1.1  mrg       add_reg_note (p, REG_FRAME_RELATED_EXPR, note);
   2934  1.1  mrg 
   2935  1.1  mrg       /* ...and the establishment of a new location for the return address.  */
   2936  1.1  mrg       note = F (gen_rtx_SET (gen_rtx_MEM (Pmode,
   2937  1.1  mrg 					  gen_rtx_PLUS (Pmode,
   2938  1.1  mrg 							stack_pointer_rtx,
   2939  1.1  mrg 							GEN_INT (-2))),
   2940  1.1  mrg 			     pc_rtx));
   2941  1.1  mrg       add_reg_note (p, REG_CFA_OFFSET, note);
   2942  1.1  mrg       F (p);
   2943  1.1  mrg     }
   2944  1.1  mrg 
   2945  1.1  mrg   for (i = 15; i >= 4; i--)
   2946  1.1  mrg     if (cfun->machine->need_to_save[i])
   2947  1.1  mrg       {
   2948  1.1  mrg 	/* We need to save COUNT sequential registers starting from regnum
   2949  1.1  mrg 	   I.  */
   2950  1.1  mrg 	int seq, count;
   2951  1.1  mrg 	rtx note;
   2952  1.1  mrg 
   2953  1.1  mrg 	for (seq = i - 1; seq >= 4 && cfun->machine->need_to_save[seq]; seq --)
   2954  1.1  mrg 	  ;
   2955  1.1  mrg 	count = i - seq;
   2956  1.1  mrg 
   2957  1.1  mrg 	if (msp430x)
   2958  1.1  mrg 	  {
   2959  1.1  mrg 	    /* Note: with TARGET_LARGE we still use PUSHM as PUSHX.A is two
   2960  1.1  mrg 	       bytes bigger.  */
   2961  1.1  mrg 	    p = F (emit_insn (gen_pushm (gen_rtx_REG (Pmode, i),
   2962  1.1  mrg 					 GEN_INT (count))));
   2963  1.1  mrg 
   2964  1.1  mrg 	    /* Document the stack decrement as a result of PUSHM.  */
   2965  1.1  mrg 	    note = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (count + 1));
   2966  1.1  mrg 
   2967  1.1  mrg 	    XVECEXP (note, 0, 0)
   2968  1.1  mrg 	      = F (gen_rtx_SET (stack_pointer_rtx,
   2969  1.1  mrg 				gen_rtx_PLUS (Pmode,
   2970  1.1  mrg 					      stack_pointer_rtx,
   2971  1.1  mrg 					      GEN_INT (count * (TARGET_LARGE
   2972  1.1  mrg 								? -4 : -2)))));
   2973  1.1  mrg 
   2974  1.1  mrg 	    /* *sp-- = R[i-j] */
   2975  1.1  mrg 	    /* sp+N	R10
   2976  1.1  mrg 	       ...
   2977  1.1  mrg 	       sp	R4  */
   2978  1.1  mrg 	    for (j = 0; j < count; j ++)
   2979  1.1  mrg 	      {
   2980  1.1  mrg 		rtx addr;
   2981  1.1  mrg 		int ofs = (count - j - 1) * (TARGET_LARGE ? 4 : 2);
   2982  1.1  mrg 
   2983  1.1  mrg 		if (ofs)
   2984  1.1  mrg 		  addr = gen_rtx_PLUS (Pmode, sp, GEN_INT (ofs));
   2985  1.1  mrg 		else
   2986  1.1  mrg 		  addr = stack_pointer_rtx;
   2987  1.1  mrg 
   2988  1.1  mrg 		XVECEXP (note, 0, j + 1) =
   2989  1.1  mrg 		  F (gen_rtx_SET (gen_rtx_MEM (Pmode, addr),
   2990  1.1  mrg 				  gen_rtx_REG (Pmode, i - j)));
   2991  1.1  mrg 	      }
   2992  1.1  mrg 
   2993  1.1  mrg 	    add_reg_note (p, REG_FRAME_RELATED_EXPR, note);
   2994  1.1  mrg 	    i -= count - 1;
   2995  1.1  mrg 	  }
   2996  1.1  mrg 	else
   2997  1.1  mrg 	  F (emit_insn (gen_push (gen_rtx_REG (Pmode, i))));
   2998  1.1  mrg       }
   2999  1.1  mrg 
   3000  1.1  mrg   if (frame_pointer_needed)
   3001  1.1  mrg     F (emit_move_insn (gen_rtx_REG (Pmode, FRAME_POINTER_REGNUM), sp));
   3002  1.1  mrg 
   3003  1.1  mrg   fs = cfun->machine->framesize_locals + cfun->machine->framesize_outgoing;
   3004  1.1  mrg 
   3005  1.1  mrg   increment_stack (- fs);
   3006  1.1  mrg 
   3007  1.1  mrg   emit_insn (gen_prologue_end_marker ());
   3008  1.1  mrg }
   3009  1.1  mrg 
   3010  1.1  mrg void
   3011  1.1  mrg msp430_expand_epilogue (int is_eh)
   3012  1.1  mrg {
   3013  1.1  mrg   int i, j;
   3014  1.1  mrg   int fs;
   3015  1.1  mrg   rtx sp = stack_pointer_rtx;
   3016  1.1  mrg   rtx p;
   3017  1.1  mrg   int helper_n = 0;
   3018  1.1  mrg 
   3019  1.1  mrg   if (is_naked_func ())
   3020  1.1  mrg     {
   3021  1.1  mrg       /* We must generate some RTX as thread_prologue_and_epilogue_insns()
   3022  1.1  mrg 	 examines the output of the gen_epilogue() function.  */
   3023  1.1  mrg       emit_insn (gen_rtx_CLOBBER (VOIDmode, GEN_INT (0)));
   3024  1.1  mrg       return;
   3025  1.1  mrg     }
   3026  1.1  mrg 
   3027  1.1  mrg   if (cfun->machine->need_to_save[10])
   3028  1.1  mrg     {
   3029  1.1  mrg       /* Check for a helper function.  */
   3030  1.1  mrg       helper_n = 7; /* For when the loop below never sees a match.  */
   3031  1.1  mrg       for (i = 9; i >= 4; i--)
   3032  1.1  mrg 	if (!cfun->machine->need_to_save[i])
   3033  1.1  mrg 	  {
   3034  1.1  mrg 	    helper_n = 10 - i;
   3035  1.1  mrg 	    for (; i >= 4; i--)
   3036  1.1  mrg 	      if (cfun->machine->need_to_save[i])
   3037  1.1  mrg 		{
   3038  1.1  mrg 		  helper_n = 0;
   3039  1.1  mrg 		  break;
   3040  1.1  mrg 		}
   3041  1.1  mrg 	    break;
   3042  1.1  mrg 	  }
   3043  1.1  mrg     }
   3044  1.1  mrg 
   3045  1.1  mrg   emit_insn (gen_epilogue_start_marker ());
   3046  1.1  mrg 
   3047  1.1  mrg   if (cfun->decl && strcmp (IDENTIFIER_POINTER (DECL_NAME (cfun->decl)),
   3048  1.1  mrg 			    "main") == 0)
   3049  1.1  mrg     emit_insn (gen_msp430_refsym_need_exit ());
   3050  1.1  mrg 
   3051  1.1  mrg   if (is_wakeup_func ())
   3052  1.1  mrg     /* Clear the SCG1, SCG0, OSCOFF and CPUOFF bits in the saved copy of the
   3053  1.1  mrg        status register current residing on the stack.  When this function
   3054  1.1  mrg        executes its RETI instruction the SR will be updated with this saved
   3055  1.1  mrg        value, thus ensuring that the processor is woken up from any low power
   3056  1.1  mrg        state in which it may be residing.  */
   3057  1.1  mrg     emit_insn (gen_bic_SR (GEN_INT (0xf0)));
   3058  1.1  mrg 
   3059  1.1  mrg   fs = cfun->machine->framesize_locals + cfun->machine->framesize_outgoing;
   3060  1.1  mrg 
   3061  1.1  mrg   increment_stack (fs);
   3062  1.1  mrg 
   3063  1.1  mrg   if (is_eh)
   3064  1.1  mrg     {
   3065  1.1  mrg       /* We need to add the right "SP" register save just after the
   3066  1.1  mrg 	 regular ones, so that when we pop it off we're in the EH
   3067  1.1  mrg 	 return frame, not this one.  This overwrites our own return
   3068  1.1  mrg 	 address, but we're not going to be returning anyway.  */
   3069  1.1  mrg       rtx r12 = gen_rtx_REG (Pmode, 12);
   3070  1.1  mrg       rtx (*addPmode)(rtx, rtx, rtx) = TARGET_LARGE ? gen_addpsi3 : gen_addhi3;
   3071  1.1  mrg 
   3072  1.1  mrg       /* R12 will hold the new SP.  */
   3073  1.1  mrg       i = cfun->machine->framesize_regs;
   3074  1.1  mrg       emit_move_insn (r12, stack_pointer_rtx);
   3075  1.1  mrg       emit_insn (addPmode (r12, r12, EH_RETURN_STACKADJ_RTX));
   3076  1.1  mrg       emit_insn (addPmode (r12, r12, GEN_INT (i)));
   3077  1.1  mrg       emit_move_insn (gen_rtx_MEM (Pmode, plus_constant (Pmode,
   3078  1.1  mrg 							 stack_pointer_rtx,
   3079  1.1  mrg 							 i)), r12);
   3080  1.1  mrg     }
   3081  1.1  mrg 
   3082  1.1  mrg   for (i = 4; i <= 15; i++)
   3083  1.1  mrg     if (cfun->machine->need_to_save[i])
   3084  1.1  mrg       {
   3085  1.1  mrg 	/* We need to restore COUNT sequential registers starting from regnum
   3086  1.1  mrg 	   I.  */
   3087  1.1  mrg 	int seq;
   3088  1.1  mrg 	int count = 1;
   3089  1.1  mrg 	int helper_used = 0;
   3090  1.1  mrg 	rtx note, addr;
   3091  1.1  mrg 
   3092  1.1  mrg 	if (msp430x)
   3093  1.1  mrg 	  {
   3094  1.1  mrg 	    for (seq = i + 1; seq <= 15 && cfun->machine->need_to_save[seq];
   3095  1.1  mrg 		 seq++)
   3096  1.1  mrg 	      ;
   3097  1.1  mrg 	    count = seq - i;
   3098  1.1  mrg 	  }
   3099  1.1  mrg 
   3100  1.1  mrg 	if (msp430x)
   3101  1.1  mrg 	  {
   3102  1.1  mrg 	    /* Note: With TARGET_LARGE we still use
   3103  1.1  mrg 	       POPM as POPX.A is two bytes bigger.  */
   3104  1.1  mrg 	    p = F (emit_insn (gen_popm (stack_pointer_rtx, GEN_INT (seq - 1),
   3105  1.1  mrg 					GEN_INT (count))));
   3106  1.1  mrg 	  }
   3107  1.1  mrg 	else if (i == 11 - helper_n
   3108  1.1  mrg 		 && ! msp430_is_interrupt_func ()
   3109  1.1  mrg 		 && ! is_reentrant_func ()
   3110  1.1  mrg 		 && ! is_critical_func ()
   3111  1.1  mrg 		 && crtl->args.pretend_args_size == 0
   3112  1.1  mrg 		 /* Calling the helper takes as many bytes as the POP;RET
   3113  1.1  mrg 		    sequence.  */
   3114  1.1  mrg 		 && helper_n > 1
   3115  1.1  mrg 		 && !is_eh)
   3116  1.1  mrg 	  {
   3117  1.1  mrg 	    p = F (emit_jump_insn (gen_epilogue_helper (GEN_INT (helper_n))));
   3118  1.1  mrg 	    count = helper_n;
   3119  1.1  mrg 	    helper_used = 1;
   3120  1.1  mrg 	  }
   3121  1.1  mrg 	else
   3122  1.1  mrg 	  p = F (emit_insn (gen_pop (gen_rtx_REG (Pmode, i))));
   3123  1.1  mrg 
   3124  1.1  mrg 	/* Document the stack increment as a result of POPM.  */
   3125  1.1  mrg 	note = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (count + 1));
   3126  1.1  mrg 
   3127  1.1  mrg 	addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
   3128  1.1  mrg 			     GEN_INT (count * (TARGET_LARGE ? 4 : 2)));
   3129  1.1  mrg 
   3130  1.1  mrg 	XVECEXP (note, 0, 0) = F (gen_rtx_SET (stack_pointer_rtx, addr));
   3131  1.1  mrg 
   3132  1.1  mrg 
   3133  1.1  mrg 	/* *sp++ = R[i+j] */
   3134  1.1  mrg 	/* sp	R4
   3135  1.1  mrg 	   ...
   3136  1.1  mrg 	   sp+N	R10.  */
   3137  1.1  mrg 	for (j = 0; j < count; j++)
   3138  1.1  mrg 	  {
   3139  1.1  mrg 	    int ofs = j * (TARGET_LARGE ? 4 : 2);
   3140  1.1  mrg 
   3141  1.1  mrg 	    if (ofs)
   3142  1.1  mrg 	      addr = gen_rtx_PLUS (Pmode, sp, GEN_INT (ofs));
   3143  1.1  mrg 	    else
   3144  1.1  mrg 	      addr = stack_pointer_rtx;
   3145  1.1  mrg 
   3146  1.1  mrg 	    XVECEXP (note, 0, j + 1)
   3147  1.1  mrg 	      = F (gen_rtx_SET (gen_rtx_MEM (Pmode, addr),
   3148  1.1  mrg 				gen_rtx_REG (Pmode, i + j)));
   3149  1.1  mrg 	  }
   3150  1.1  mrg 	add_reg_note (p, REG_FRAME_RELATED_EXPR, note);
   3151  1.1  mrg 	i += count - 1;
   3152  1.1  mrg 
   3153  1.1  mrg 	if (helper_used)
   3154  1.1  mrg 	  return;
   3155  1.1  mrg       }
   3156  1.1  mrg 
   3157  1.1  mrg   if (is_eh)
   3158  1.1  mrg     {
   3159  1.1  mrg       /* Also pop SP, which puts us into the EH return frame.  Except
   3160  1.1  mrg 	 that you can't "pop" sp, you have to just load it off the
   3161  1.1  mrg 	 stack.  */
   3162  1.1  mrg       emit_move_insn (stack_pointer_rtx, gen_rtx_MEM (Pmode,
   3163  1.1  mrg 						      stack_pointer_rtx));
   3164  1.1  mrg     }
   3165  1.1  mrg 
   3166  1.1  mrg   if (crtl->args.pretend_args_size)
   3167  1.1  mrg     emit_insn (gen_swap_and_shrink ());
   3168  1.1  mrg 
   3169  1.1  mrg   if (is_critical_func ())
   3170  1.1  mrg     emit_insn (gen_pop_intr_state ());
   3171  1.1  mrg   else if (is_reentrant_func ())
   3172  1.1  mrg     emit_insn (gen_enable_interrupts ());
   3173  1.1  mrg 
   3174  1.1  mrg   emit_jump_insn (gen_msp430_return ());
   3175  1.1  mrg }
   3176  1.1  mrg 
   3177  1.1  mrg /* Implements EH_RETURN_STACKADJ_RTX.  Saved and used later in
   3178  1.1  mrg    m32c_emit_eh_epilogue.  */
   3179  1.1  mrg rtx
   3180  1.1  mrg msp430_eh_return_stackadj_rtx (void)
   3181  1.1  mrg {
   3182  1.1  mrg   if (!cfun->machine->eh_stack_adjust)
   3183  1.1  mrg     {
   3184  1.1  mrg       rtx sa;
   3185  1.1  mrg 
   3186  1.1  mrg       sa = gen_rtx_REG (Pmode, 15);
   3187  1.1  mrg       cfun->machine->eh_stack_adjust = sa;
   3188  1.1  mrg     }
   3189  1.1  mrg   return cfun->machine->eh_stack_adjust;
   3190  1.1  mrg }
   3191  1.1  mrg 
   3192  1.1  mrg /* This function is called before reload, to "fix" the stack in
   3193  1.1  mrg    preparation for an EH return.  */
   3194  1.1  mrg void
   3195  1.1  mrg msp430_expand_eh_return (rtx eh_handler)
   3196  1.1  mrg {
   3197  1.1  mrg   /* These are all Pmode */
   3198  1.1  mrg   rtx ap, sa, ra, tmp;
   3199  1.1  mrg 
   3200  1.1  mrg   ap = arg_pointer_rtx;
   3201  1.1  mrg   sa = msp430_eh_return_stackadj_rtx ();
   3202  1.1  mrg   ra = eh_handler;
   3203  1.1  mrg 
   3204  1.1  mrg   tmp = ap;
   3205  1.1  mrg   tmp = gen_rtx_PLUS (Pmode, ap, sa);
   3206  1.1  mrg   tmp = plus_constant (Pmode, tmp, TARGET_LARGE ? -4 : -2);
   3207  1.1  mrg   tmp = gen_rtx_MEM (Pmode, tmp);
   3208  1.1  mrg   emit_move_insn (tmp, ra);
   3209  1.1  mrg }
   3210  1.1  mrg 
   3211  1.1  mrg #undef  TARGET_INIT_DWARF_REG_SIZES_EXTRA
   3212  1.1  mrg #define TARGET_INIT_DWARF_REG_SIZES_EXTRA msp430_init_dwarf_reg_sizes_extra
   3213  1.1  mrg void
   3214  1.1  mrg msp430_init_dwarf_reg_sizes_extra (tree address)
   3215  1.1  mrg {
   3216  1.1  mrg   int i;
   3217  1.1  mrg   rtx addr = expand_normal (address);
   3218  1.1  mrg   rtx mem = gen_rtx_MEM (BLKmode, addr);
   3219  1.1  mrg 
   3220  1.1  mrg   /* This needs to match msp430_unwind_word_mode (above).  */
   3221  1.1  mrg   if (!msp430x)
   3222  1.1  mrg     return;
   3223  1.1  mrg 
   3224  1.1  mrg   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
   3225  1.1  mrg     {
   3226  1.1  mrg       unsigned int dnum = DWARF_FRAME_REGNUM (i);
   3227  1.1  mrg       unsigned int rnum = DWARF2_FRAME_REG_OUT (dnum, 1);
   3228  1.1  mrg 
   3229  1.1  mrg       if (rnum < DWARF_FRAME_REGISTERS)
   3230  1.1  mrg 	{
   3231  1.1  mrg 	  HOST_WIDE_INT offset = rnum * GET_MODE_SIZE (QImode);
   3232  1.1  mrg 
   3233  1.1  mrg 	  emit_move_insn (adjust_address (mem, QImode, offset),
   3234  1.1  mrg 			  gen_int_mode (4, QImode));
   3235  1.1  mrg 	}
   3236  1.1  mrg     }
   3237  1.1  mrg }
   3238  1.1  mrg 
   3239  1.1  mrg /* The MSP430 ABI defines a number of helper functions that should be
   3240  1.1  mrg    used for, for example, 32-bit shifts.  This function is called to
   3241  1.1  mrg    emit such a function, using the table above to optimize some
   3242  1.1  mrg    cases.  */
   3243  1.1  mrg void
   3244  1.1  mrg msp430_expand_helper (rtx *operands, const char *helper_name,
   3245  1.1  mrg 		      bool const_variants)
   3246  1.1  mrg {
   3247  1.1  mrg   rtx c, fusage, fsym;
   3248  1.1  mrg   char *helper_const = NULL;
   3249  1.1  mrg   int arg1 = 12;
   3250  1.1  mrg   int arg2 = 13;
   3251  1.1  mrg   int arg1sz = 1;
   3252  1.1  mrg   machine_mode arg0mode = GET_MODE (operands[0]);
   3253  1.1  mrg   machine_mode arg1mode = GET_MODE (operands[1]);
   3254  1.1  mrg   machine_mode arg2mode = GET_MODE (operands[2]);
   3255  1.1  mrg   int expand_mpy = startswith (helper_name, "__mspabi_mpy");
   3256  1.1  mrg   /* This function has been used incorrectly if CONST_VARIANTS is TRUE for a
   3257  1.1  mrg      hwmpy function.  */
   3258  1.1  mrg   gcc_assert (!(expand_mpy && const_variants));
   3259  1.1  mrg 
   3260  1.1  mrg   if (arg1mode != VOIDmode && arg2mode != VOIDmode)
   3261  1.1  mrg     /* Modes of arguments must be equal if not constants.  */
   3262  1.1  mrg     gcc_assert (arg1mode == arg2mode);
   3263  1.1  mrg 
   3264  1.1  mrg   if (arg1mode == VOIDmode)
   3265  1.1  mrg     arg1mode = arg0mode;
   3266  1.1  mrg   if (arg2mode == VOIDmode)
   3267  1.1  mrg     arg2mode = arg0mode;
   3268  1.1  mrg 
   3269  1.1  mrg   if (arg1mode == SImode)
   3270  1.1  mrg     {
   3271  1.1  mrg       arg2 = 14;
   3272  1.1  mrg       arg1sz = 2;
   3273  1.1  mrg     }
   3274  1.1  mrg   else if (arg1mode == DImode)
   3275  1.1  mrg     {
   3276  1.1  mrg       arg1 = 8;
   3277  1.1  mrg       arg1sz = 4;
   3278  1.1  mrg       arg2 = 12;
   3279  1.1  mrg     }
   3280  1.1  mrg 
   3281  1.1  mrg   /* Use the "const_variant" of a shift library function if requested.
   3282  1.1  mrg      These are faster, but have larger code size.  */
   3283  1.1  mrg   if (const_variants
   3284  1.1  mrg       && CONST_INT_P (operands[2])
   3285  1.1  mrg       && INTVAL (operands[2]) >= 1
   3286  1.1  mrg       && INTVAL (operands[2]) <= 15)
   3287  1.1  mrg     {
   3288  1.1  mrg       /* Note that the INTVAL is limited in value and length by the conditional
   3289  1.1  mrg 	 above.  */
   3290  1.1  mrg       int len = strlen (helper_name) + 4;
   3291  1.1  mrg       helper_const = (char *) xmalloc (len);
   3292  1.1  mrg       snprintf (helper_const, len, "%s_%d", helper_name,
   3293  1.1  mrg 		(int) INTVAL (operands[2]));
   3294  1.1  mrg     }
   3295  1.1  mrg 
   3296  1.1  mrg   /* Setup the arguments to the helper function.  */
   3297  1.1  mrg   emit_move_insn (gen_rtx_REG (arg1mode, arg1),
   3298  1.1  mrg 		  operands[1]);
   3299  1.1  mrg   if (!helper_const)
   3300  1.1  mrg     emit_move_insn (gen_rtx_REG (arg2mode, arg2),
   3301  1.1  mrg 		    operands[2]);
   3302  1.1  mrg 
   3303  1.1  mrg   if (expand_mpy)
   3304  1.1  mrg     {
   3305  1.1  mrg       if (msp430_use_f5_series_hwmult ())
   3306  1.1  mrg 	fsym = gen_rtx_SYMBOL_REF (VOIDmode, concat (helper_name,
   3307  1.1  mrg 						     "_f5hw", NULL));
   3308  1.1  mrg       else if (msp430_use_32bit_hwmult ())
   3309  1.1  mrg 	{
   3310  1.1  mrg 	  /* When the arguments are 16-bits, the 16-bit hardware multiplier is
   3311  1.1  mrg 	     used.  */
   3312  1.1  mrg 	  if (arg1mode == HImode)
   3313  1.1  mrg 	    fsym = gen_rtx_SYMBOL_REF (VOIDmode, concat (helper_name,
   3314  1.1  mrg 							 "_hw", NULL));
   3315  1.1  mrg 	  else
   3316  1.1  mrg 	    fsym = gen_rtx_SYMBOL_REF (VOIDmode, concat (helper_name,
   3317  1.1  mrg 							 "_hw32", NULL));
   3318  1.1  mrg 	}
   3319  1.1  mrg       else if (msp430_use_16bit_hwmult ())
   3320  1.1  mrg 	fsym = gen_rtx_SYMBOL_REF (VOIDmode, concat (helper_name,
   3321  1.1  mrg 						     "_hw", NULL));
   3322  1.1  mrg       else
   3323  1.1  mrg 	fsym = gen_rtx_SYMBOL_REF (VOIDmode, helper_name);
   3324  1.1  mrg     }
   3325  1.1  mrg   else
   3326  1.1  mrg     fsym = gen_rtx_SYMBOL_REF (VOIDmode,
   3327  1.1  mrg 			       helper_const ? helper_const : helper_name);
   3328  1.1  mrg 
   3329  1.1  mrg   c = gen_call_value_internal (gen_rtx_REG (arg0mode, 12), fsym, GEN_INT (0));
   3330  1.1  mrg 
   3331  1.1  mrg   c = emit_call_insn (c);
   3332  1.1  mrg   RTL_CONST_CALL_P (c) = 1;
   3333  1.1  mrg 
   3334  1.1  mrg   /* Add register usage information for the arguments to the call.  */
   3335  1.1  mrg   fusage = NULL;
   3336  1.1  mrg   use_regs (&fusage, arg1, arg1sz);
   3337  1.1  mrg   if (!helper_const)
   3338  1.1  mrg     {
   3339  1.1  mrg       /* If we are expanding a shift, we only need to use the low register
   3340  1.1  mrg 	 for the shift amount.  */
   3341  1.1  mrg       if (!expand_mpy)
   3342  1.1  mrg 	use_regs (&fusage, arg2, 1);
   3343  1.1  mrg       else
   3344  1.1  mrg 	use_regs (&fusage, arg2, arg1sz);
   3345  1.1  mrg     }
   3346  1.1  mrg   add_function_usage_to (c, fusage);
   3347  1.1  mrg 
   3348  1.1  mrg   emit_move_insn (operands[0],
   3349  1.1  mrg 		  /* Return value will always start in R12.  */
   3350  1.1  mrg 		  gen_rtx_REG (arg0mode, 12));
   3351  1.1  mrg }
   3352  1.1  mrg 
   3353  1.1  mrg /* Return TRUE if the helper function should be used and FALSE if the shifts
   3354  1.1  mrg    insns should be emitted inline.  */
   3355  1.1  mrg static bool
   3356  1.1  mrg use_helper_for_const_shift (machine_mode mode, HOST_WIDE_INT amt)
   3357  1.1  mrg {
   3358  1.1  mrg   const int default_inline_shift = 4;
   3359  1.1  mrg   /* We initialize the option to 65 so we know if the user set it or not.  */
   3360  1.1  mrg   int user_set_max_inline = (msp430_max_inline_shift == 65 ? 0 : 1);
   3361  1.1  mrg   int max_inline = (user_set_max_inline ? msp430_max_inline_shift
   3362  1.1  mrg 		    : default_inline_shift);
   3363  1.1  mrg   /* 32-bit shifts are roughly twice as costly as 16-bit shifts so we adjust
   3364  1.1  mrg      the heuristic accordingly.  */
   3365  1.1  mrg   int max_inline_32 = max_inline / 2;
   3366  1.1  mrg 
   3367  1.1  mrg   if (mode == E_DImode)
   3368  1.1  mrg     return true;
   3369  1.1  mrg 
   3370  1.1  mrg   /* Don't use helpers for these modes on 430X, when optimizing for speed, or
   3371  1.1  mrg      when emitting a small number of insns.  */
   3372  1.1  mrg   if ((mode == E_QImode || mode == E_HImode || mode == E_PSImode)
   3373  1.1  mrg       && (msp430x
   3374  1.1  mrg 	  /* If the user set max_inline then we always obey that number.
   3375  1.1  mrg 	     Otherwise we always emit the shifts inline at -O2 and above.  */
   3376  1.1  mrg 	  || amt <= max_inline
   3377  1.1  mrg 	  || (!user_set_max_inline
   3378  1.1  mrg 	      && (optimize >= 2 && !optimize_size))))
   3379  1.1  mrg     return false;
   3380  1.1  mrg 
   3381  1.1  mrg   /* 430 and 430X codegen for SImode shifts is the same.
   3382  1.1  mrg      Set a hard limit of 15 for the number of shifts that will be emitted
   3383  1.1  mrg      inline by default, even at -O2 and above, to prevent code size
   3384  1.1  mrg      explosion.  */
   3385  1.1  mrg   if (mode == E_SImode
   3386  1.1  mrg       && (amt <= max_inline_32
   3387  1.1  mrg 	  || (!user_set_max_inline
   3388  1.1  mrg 	      && (optimize >= 2 && !optimize_size)
   3389  1.1  mrg 	      && amt <= 15)))
   3390  1.1  mrg     return false;
   3391  1.1  mrg 
   3392  1.1  mrg   return true;
   3393  1.1  mrg }
   3394  1.1  mrg 
   3395  1.1  mrg /* For shift operations which will use an mspabi helper function, setup the
   3396  1.1  mrg    call to msp430_expand helper.  Return 1 to indicate we have finished with
   3397  1.1  mrg    this insn and invoke "DONE".
   3398  1.1  mrg    Otherwise return 0 to indicate the insn should fallthrough.
   3399  1.1  mrg    Never FAIL.  */
   3400  1.1  mrg int
   3401  1.1  mrg msp430_expand_shift (enum rtx_code code, machine_mode mode, rtx *operands)
   3402  1.1  mrg {
   3403  1.1  mrg   /* Always use the helper function when the shift amount is not a
   3404  1.1  mrg      constant.  */
   3405  1.1  mrg   if (!CONST_INT_P (operands[2])
   3406  1.1  mrg       || mode == E_DImode
   3407  1.1  mrg       || use_helper_for_const_shift (mode, INTVAL (operands[2])))
   3408  1.1  mrg     {
   3409  1.1  mrg       const char *helper_name = NULL;
   3410  1.1  mrg       /* The const variants of mspabi shifts have significantly larger code
   3411  1.1  mrg 	 size than the generic version, so use the generic version if
   3412  1.1  mrg 	 optimizing for size.  */
   3413  1.1  mrg       bool const_variant = !optimize_size;
   3414  1.1  mrg       switch (mode)
   3415  1.1  mrg 	{
   3416  1.1  mrg 	case E_HImode:
   3417  1.1  mrg 	  helper_name = (code == ASHIFT ? "__mspabi_slli" :
   3418  1.1  mrg 			 (code == ASHIFTRT ? "__mspabi_srai" :
   3419  1.1  mrg 			  (code == LSHIFTRT ? "__mspabi_srli" :
   3420  1.1  mrg 			   NULL)));
   3421  1.1  mrg 	  break;
   3422  1.1  mrg 	case E_PSImode:
   3423  1.1  mrg 	  helper_name = (code == ASHIFT ? "__gnu_mspabi_sllp" :
   3424  1.1  mrg 			 (code == ASHIFTRT ? "__gnu_mspabi_srap" :
   3425  1.1  mrg 			  (code == LSHIFTRT ? "__gnu_mspabi_srlp" :
   3426  1.1  mrg 			   NULL)));
   3427  1.1  mrg 	  /* No const variant for PSImode shifts FIXME.  */
   3428  1.1  mrg 	  const_variant = false;
   3429  1.1  mrg 	  break;
   3430  1.1  mrg 	case E_SImode:
   3431  1.1  mrg 	  helper_name = (code == ASHIFT ? "__mspabi_slll" :
   3432  1.1  mrg 			 (code == ASHIFTRT ? "__mspabi_sral" :
   3433  1.1  mrg 			  (code == LSHIFTRT ? "__mspabi_srll" :
   3434  1.1  mrg 			   NULL)));
   3435  1.1  mrg 	  break;
   3436  1.1  mrg 	case E_DImode:
   3437  1.1  mrg 	  helper_name = (code == ASHIFT ? "__mspabi_sllll" :
   3438  1.1  mrg 			 (code == ASHIFTRT ? "__mspabi_srall" :
   3439  1.1  mrg 			  (code == LSHIFTRT ? "__mspabi_srlll" :
   3440  1.1  mrg 			   NULL)));
   3441  1.1  mrg 	  /* No const variant for DImode shifts.  */
   3442  1.1  mrg 	  const_variant = false;
   3443  1.1  mrg 	  break;
   3444  1.1  mrg 	default:
   3445  1.1  mrg 	  gcc_unreachable ();
   3446  1.1  mrg 	  break;
   3447  1.1  mrg 	}
   3448  1.1  mrg       gcc_assert (helper_name);
   3449  1.1  mrg       msp430_expand_helper (operands, helper_name, const_variant);
   3450  1.1  mrg       return 1;
   3451  1.1  mrg     }
   3452  1.1  mrg   /* When returning 0, there must be an insn to match the RTL pattern
   3453  1.1  mrg      otherwise there will be an unrecognizeable insn.  */
   3454  1.1  mrg   return 0;
   3455  1.1  mrg }
   3456  1.1  mrg 
   3457  1.1  mrg /* Helper function to emit a sequence of shift instructions.  The amount of
   3458  1.1  mrg    shift instructions to emit is in OPERANDS[2].
   3459  1.1  mrg    For 430 we output copies of identical inline shifts for all modes.
   3460  1.1  mrg    For 430X it is inneficient to do so for any modes except SI and DI, since we
   3461  1.1  mrg    can make use of R*M insns or RPT with 430X insns, so this function is only
   3462  1.1  mrg    used for SImode in that case.  */
   3463  1.1  mrg int
   3464  1.1  mrg msp430_output_asm_shift_insns (enum rtx_code code, machine_mode mode,
   3465  1.1  mrg 			       rtx *operands, bool return_length)
   3466  1.1  mrg {
   3467  1.1  mrg   int i;
   3468  1.1  mrg   int amt;
   3469  1.1  mrg   int max_shift = GET_MODE_BITSIZE (mode) - 1;
   3470  1.1  mrg   int length = 0;
   3471  1.1  mrg 
   3472  1.1  mrg   gcc_assert (CONST_INT_P (operands[2]));
   3473  1.1  mrg   amt = INTVAL (operands[2]);
   3474  1.1  mrg 
   3475  1.1  mrg   if (amt == 0 || amt > max_shift)
   3476  1.1  mrg     {
   3477  1.1  mrg       if (return_length)
   3478  1.1  mrg 	return 0;
   3479  1.1  mrg       switch (code)
   3480  1.1  mrg 	{
   3481  1.1  mrg 	case ASHIFT:
   3482  1.1  mrg 	  output_asm_insn ("# ignored undefined behaviour left shift "
   3483  1.1  mrg 			   "of %1 by %2", operands);
   3484  1.1  mrg 	  break;
   3485  1.1  mrg 	case ASHIFTRT:
   3486  1.1  mrg 	  output_asm_insn ("# ignored undefined behaviour arithmetic right "
   3487  1.1  mrg 			   "shift of %1 by %2", operands);
   3488  1.1  mrg 	  break;
   3489  1.1  mrg 	case LSHIFTRT:
   3490  1.1  mrg 	  output_asm_insn ("# ignored undefined behaviour logical right shift "
   3491  1.1  mrg 			   "of %1 by %2", operands);
   3492  1.1  mrg 	  break;
   3493  1.1  mrg 	default:
   3494  1.1  mrg 	  gcc_unreachable ();
   3495  1.1  mrg 	}
   3496  1.1  mrg       return 0;
   3497  1.1  mrg     }
   3498  1.1  mrg 
   3499  1.1  mrg   if (code == ASHIFT)
   3500  1.1  mrg     {
   3501  1.1  mrg       if (!msp430x && mode == HImode)
   3502  1.1  mrg 	{
   3503  1.1  mrg 	  if (return_length)
   3504  1.1  mrg 	    length = 2 + (MEM_P (operands[0]) ? 2 : 0);
   3505  1.1  mrg 	  else
   3506  1.1  mrg 	    for (i = 0; i < amt; i++)
   3507  1.1  mrg 	      output_asm_insn ("RLA.W\t%0", operands);
   3508  1.1  mrg 	}
   3509  1.1  mrg       else if (mode == SImode)
   3510  1.1  mrg 	{
   3511  1.1  mrg 	  if (return_length)
   3512  1.1  mrg 	    length = 4 + (MEM_P (operands[0]) ? 4 : 0)
   3513  1.1  mrg 	      + (4 * msp430x_insn_required (operands[0]));
   3514  1.1  mrg 	  else
   3515  1.1  mrg 	    for (i = 0; i < amt; i++)
   3516  1.1  mrg 	      output_asm_insn ("RLA%X0.W\t%L0 { RLC%X0.W\t%H0", operands);
   3517  1.1  mrg 	}
   3518  1.1  mrg       else
   3519  1.1  mrg 	/* Catch unhandled cases.  */
   3520  1.1  mrg 	gcc_unreachable ();
   3521  1.1  mrg     }
   3522  1.1  mrg   else if (code == ASHIFTRT)
   3523  1.1  mrg     {
   3524  1.1  mrg       if (!msp430x && mode == HImode)
   3525  1.1  mrg 	{
   3526  1.1  mrg 	  if (return_length)
   3527  1.1  mrg 	    length = 2 + (MEM_P (operands[0]) ? 2 : 0);
   3528  1.1  mrg 	  else
   3529  1.1  mrg 	    for (i = 0; i < amt; i++)
   3530  1.1  mrg 	      output_asm_insn ("RRA.W\t%0", operands);
   3531  1.1  mrg 	}
   3532  1.1  mrg       else if (mode == SImode)
   3533  1.1  mrg 	{
   3534  1.1  mrg 	  if (return_length)
   3535  1.1  mrg 	    length = 4 + (MEM_P (operands[0]) ? 4 : 0)
   3536  1.1  mrg 	      + (4 * msp430x_insn_required (operands[0]));
   3537  1.1  mrg 	  else
   3538  1.1  mrg 	    for (i = 0; i < amt; i++)
   3539  1.1  mrg 	      output_asm_insn ("RRA%X0.W\t%H0 { RRC%X0.W\t%L0", operands);
   3540  1.1  mrg 	}
   3541  1.1  mrg       else
   3542  1.1  mrg 	gcc_unreachable ();
   3543  1.1  mrg     }
   3544  1.1  mrg   else if (code == LSHIFTRT)
   3545  1.1  mrg     {
   3546  1.1  mrg       if (!msp430x && mode == HImode)
   3547  1.1  mrg 	{
   3548  1.1  mrg 	  if (return_length)
   3549  1.1  mrg 	    length = 4 + (MEM_P (operands[0]) ? 2 : 0);
   3550  1.1  mrg 	  else
   3551  1.1  mrg 	    for (i = 0; i < amt; i++)
   3552  1.1  mrg 	      output_asm_insn ("CLRC { RRC.W\t%0", operands);
   3553  1.1  mrg 	}
   3554  1.1  mrg       else if (mode == SImode)
   3555  1.1  mrg 	{
   3556  1.1  mrg 	  if (return_length)
   3557  1.1  mrg 	    length = 6 + (MEM_P (operands[0]) ? 4 : 0)
   3558  1.1  mrg 	      + (4 * msp430x_insn_required (operands[0]));
   3559  1.1  mrg 	  else
   3560  1.1  mrg 	    for (i = 0; i < amt; i++)
   3561  1.1  mrg 	      output_asm_insn ("CLRC { RRC%X0.W\t%H0 { RRC%X0.W\t%L0",
   3562  1.1  mrg 			       operands);
   3563  1.1  mrg 	}
   3564  1.1  mrg       /* FIXME: Why doesn't "RRUX.W\t%H0 { RRC%X0.W\t%L0" work for msp430x?
   3565  1.1  mrg 	 It causes execution timeouts e.g. pr41963.c.  */
   3566  1.1  mrg #if 0
   3567  1.1  mrg       else if (msp430x && mode == SImode)
   3568  1.1  mrg 	{
   3569  1.1  mrg 	  if (return_length)
   3570  1.1  mrg 	    length = 2;
   3571  1.1  mrg 	  else
   3572  1.1  mrg 	    for (i = 0; i < amt; i++)
   3573  1.1  mrg 	      output_asm_insn ("RRUX.W\t%H0 { RRC%X0.W\t%L0", operands);
   3574  1.1  mrg 	}
   3575  1.1  mrg #endif
   3576  1.1  mrg       else
   3577  1.1  mrg 	gcc_unreachable ();
   3578  1.1  mrg     }
   3579  1.1  mrg   return length * amt;
   3580  1.1  mrg }
   3581  1.1  mrg 
   3582  1.1  mrg /* Called by cbranch<mode>4 to coerce operands into usable forms.  */
   3583  1.1  mrg void
   3584  1.1  mrg msp430_fixup_compare_operands (machine_mode my_mode, rtx * operands)
   3585  1.1  mrg {
   3586  1.1  mrg   /* constants we're looking for, not constants which are allowed.  */
   3587  1.1  mrg   int const_op_idx = 1;
   3588  1.1  mrg 
   3589  1.1  mrg   if (msp430_reversible_cmp_operator (operands[0], VOIDmode))
   3590  1.1  mrg     const_op_idx = 2;
   3591  1.1  mrg 
   3592  1.1  mrg   if (GET_CODE (operands[const_op_idx]) != REG
   3593  1.1  mrg       && GET_CODE (operands[const_op_idx]) != MEM)
   3594  1.1  mrg     operands[const_op_idx] = copy_to_mode_reg (my_mode, operands[const_op_idx]);
   3595  1.1  mrg }
   3596  1.1  mrg 
   3597  1.1  mrg /* Simplify_gen_subreg() doesn't handle memory references the way we
   3598  1.1  mrg    need it to below, so we use this function for when we must get a
   3599  1.1  mrg    valid subreg in a "natural" state.  */
   3600  1.1  mrg rtx
   3601  1.1  mrg msp430_subreg (machine_mode mode, rtx r, machine_mode omode, int byte)
   3602  1.1  mrg {
   3603  1.1  mrg   rtx rv;
   3604  1.1  mrg   gcc_assert (mode == HImode);
   3605  1.1  mrg 
   3606  1.1  mrg   if (GET_CODE (r) == SUBREG
   3607  1.1  mrg       && SUBREG_BYTE (r) == 0)
   3608  1.1  mrg     {
   3609  1.1  mrg       rtx ireg = SUBREG_REG (r);
   3610  1.1  mrg       machine_mode imode = GET_MODE (ireg);
   3611  1.1  mrg 
   3612  1.1  mrg       /* special case for (HI (SI (PSI ...), 0)) */
   3613  1.1  mrg       if (imode == PSImode
   3614  1.1  mrg 	  && mode == HImode
   3615  1.1  mrg 	  && byte == 0)
   3616  1.1  mrg 	rv = gen_rtx_SUBREG (mode, ireg, byte);
   3617  1.1  mrg       else
   3618  1.1  mrg 	rv = simplify_gen_subreg (mode, ireg, imode, byte);
   3619  1.1  mrg     }
   3620  1.1  mrg   else if (GET_CODE (r) == MEM)
   3621  1.1  mrg     {
   3622  1.1  mrg       /* When byte == 2, we can be certain that we were already called with an
   3623  1.1  mrg 	 identical rtx with byte == 0.  So we don't need to do anything to
   3624  1.1  mrg 	 get a 2 byte offset of a (mem (post_inc)) rtx, since the address has
   3625  1.1  mrg 	 already been offset by the post_inc itself.  */
   3626  1.1  mrg       if (GET_CODE (XEXP (r, 0)) == POST_INC && byte == 2)
   3627  1.1  mrg 	byte = 0;
   3628  1.1  mrg       rv = adjust_address (r, mode, byte);
   3629  1.1  mrg     }
   3630  1.1  mrg   else if (GET_CODE (r) == SYMBOL_REF
   3631  1.1  mrg 	   && (byte == 0 || byte == 2)
   3632  1.1  mrg 	   && mode == HImode)
   3633  1.1  mrg     {
   3634  1.1  mrg       rv = gen_rtx_ZERO_EXTRACT (HImode, r, GEN_INT (16), GEN_INT (8*byte));
   3635  1.1  mrg       rv = gen_rtx_CONST (HImode, r);
   3636  1.1  mrg     }
   3637  1.1  mrg   else
   3638  1.1  mrg     rv = simplify_gen_subreg (mode, r, omode, byte);
   3639  1.1  mrg 
   3640  1.1  mrg   if (!rv)
   3641  1.1  mrg     gcc_unreachable ();
   3642  1.1  mrg 
   3643  1.1  mrg   return rv;
   3644  1.1  mrg }
   3645  1.1  mrg 
   3646  1.1  mrg int
   3647  1.1  mrg msp430_split_addsi (rtx *operands)
   3648  1.1  mrg {
   3649  1.1  mrg   operands[3] = msp430_subreg (HImode, operands[0], SImode, 0);
   3650  1.1  mrg   operands[4] = msp430_subreg (HImode, operands[1], SImode, 0);
   3651  1.1  mrg   operands[5] = msp430_subreg (HImode, operands[2], SImode, 0);
   3652  1.1  mrg   operands[6] = msp430_subreg (HImode, operands[0], SImode, 2);
   3653  1.1  mrg   operands[7] = msp430_subreg (HImode, operands[1], SImode, 2);
   3654  1.1  mrg   operands[8] = msp430_subreg (HImode, operands[2], SImode, 2);
   3655  1.1  mrg 
   3656  1.1  mrg   /* BZ 64160: Do not use this splitter when the dest partially overlaps the
   3657  1.1  mrg      source.  */
   3658  1.1  mrg   if (reg_overlap_mentioned_p (operands[3], operands[7])
   3659  1.1  mrg       || reg_overlap_mentioned_p (operands[3], operands[8]))
   3660  1.1  mrg     return 1;
   3661  1.1  mrg 
   3662  1.1  mrg   if (GET_CODE (operands[5]) == CONST_INT)
   3663  1.1  mrg     operands[9] = GEN_INT (INTVAL (operands[5]) & 0xffff);
   3664  1.1  mrg   /* Handle post_inc, for example:
   3665  1.1  mrg      (set (reg:SI)
   3666  1.1  mrg 	  (plus:SI (reg:SI)
   3667  1.1  mrg 		   (mem:SI (post_inc:PSI (reg:PSI))))).  */
   3668  1.1  mrg   else if (MEM_P (operands[5]) && GET_CODE (XEXP (operands[5], 0)) == POST_INC)
   3669  1.1  mrg     {
   3670  1.1  mrg       /* Strip out the post_inc from (mem (post_inc (reg))).  */
   3671  1.1  mrg       operands[9] = XEXP (XEXP (operands[5], 0), 0);
   3672  1.1  mrg       operands[9] = gen_rtx_MEM (HImode, operands[9]);
   3673  1.1  mrg       /* Then zero extend as normal.  */
   3674  1.1  mrg       operands[9] = gen_rtx_ZERO_EXTEND (SImode, operands[9]);
   3675  1.1  mrg     }
   3676  1.1  mrg   else
   3677  1.1  mrg     operands[9] = gen_rtx_ZERO_EXTEND (SImode, operands[5]);
   3678  1.1  mrg   return 0;
   3679  1.1  mrg }
   3680  1.1  mrg 
   3681  1.1  mrg /* Called by movsi_x to generate the HImode operands.  */
   3682  1.1  mrg void
   3683  1.1  mrg msp430_split_movsi (rtx *operands)
   3684  1.1  mrg {
   3685  1.1  mrg   rtx op00, op02, op10, op12;
   3686  1.1  mrg 
   3687  1.1  mrg   op00 = msp430_subreg (HImode, operands[0], SImode, 0);
   3688  1.1  mrg   op02 = msp430_subreg (HImode, operands[0], SImode, 2);
   3689  1.1  mrg 
   3690  1.1  mrg   if (GET_CODE (operands[1]) == CONST
   3691  1.1  mrg       || GET_CODE (operands[1]) == SYMBOL_REF)
   3692  1.1  mrg     {
   3693  1.1  mrg       op10 = gen_rtx_ZERO_EXTRACT (HImode, operands[1], GEN_INT (16),
   3694  1.1  mrg 				   GEN_INT (0));
   3695  1.1  mrg       op10 = gen_rtx_CONST (HImode, op10);
   3696  1.1  mrg       op12 = gen_rtx_ZERO_EXTRACT (HImode, operands[1], GEN_INT (16),
   3697  1.1  mrg 				   GEN_INT (16));
   3698  1.1  mrg       op12 = gen_rtx_CONST (HImode, op12);
   3699  1.1  mrg     }
   3700  1.1  mrg   else
   3701  1.1  mrg     {
   3702  1.1  mrg       op10 = msp430_subreg (HImode, operands[1], SImode, 0);
   3703  1.1  mrg       op12 = msp430_subreg (HImode, operands[1], SImode, 2);
   3704  1.1  mrg     }
   3705  1.1  mrg 
   3706  1.1  mrg   if (rtx_equal_p (operands[0], operands[1]))
   3707  1.1  mrg     {
   3708  1.1  mrg       operands[2] = op02;
   3709  1.1  mrg       operands[4] = op12;
   3710  1.1  mrg       operands[3] = op00;
   3711  1.1  mrg       operands[5] = op10;
   3712  1.1  mrg     }
   3713  1.1  mrg   else if (rtx_equal_p (op00, op12)
   3714  1.1  mrg 	   /* Catch the case where we are loading (rN, rN+1) from mem (rN).  */
   3715  1.1  mrg 	   || (REG_P (op00) && reg_mentioned_p (op00, op10))
   3716  1.1  mrg 	   /* Or storing (rN) into mem (rN).  */
   3717  1.1  mrg 	   || (REG_P (op10) && reg_mentioned_p (op10, op00)))
   3718  1.1  mrg     {
   3719  1.1  mrg       operands[2] = op02;
   3720  1.1  mrg       operands[4] = op12;
   3721  1.1  mrg       operands[3] = op00;
   3722  1.1  mrg       operands[5] = op10;
   3723  1.1  mrg     }
   3724  1.1  mrg   else
   3725  1.1  mrg     {
   3726  1.1  mrg       operands[2] = op00;
   3727  1.1  mrg       operands[4] = op10;
   3728  1.1  mrg       operands[3] = op02;
   3729  1.1  mrg       operands[5] = op12;
   3730  1.1  mrg     }
   3731  1.1  mrg }
   3732  1.1  mrg 
   3733  1.1  mrg 
   3734  1.1  mrg /* The MSPABI specifies the names of various helper functions, many of
   3736  1.1  mrg    which are compatible with GCC's helpers.  This table maps the GCC
   3737  1.1  mrg    name to the MSPABI name.  */
   3738  1.1  mrg static const struct
   3739  1.1  mrg {
   3740  1.1  mrg   char const * const gcc_name;
   3741  1.1  mrg   char const * const ti_name;
   3742  1.1  mrg }
   3743  1.1  mrg helper_function_name_mappings[] =
   3744  1.1  mrg   {
   3745  1.1  mrg     /* Floating point to/from integer conversions.  */
   3746  1.1  mrg     { "__truncdfsf2", "__mspabi_cvtdf" },
   3747  1.1  mrg     { "__extendsfdf2", "__mspabi_cvtfd" },
   3748  1.1  mrg     { "__fixdfhi", "__mspabi_fixdi" },
   3749  1.1  mrg     { "__fixdfsi", "__mspabi_fixdli" },
   3750  1.1  mrg     { "__fixdfdi", "__mspabi_fixdlli" },
   3751  1.1  mrg     { "__fixunsdfhi", "__mspabi_fixdu" },
   3752  1.1  mrg     { "__fixunsdfsi", "__mspabi_fixdul" },
   3753  1.1  mrg     { "__fixunsdfdi", "__mspabi_fixdull" },
   3754  1.1  mrg     { "__fixsfhi", "__mspabi_fixfi" },
   3755  1.1  mrg     { "__fixsfsi", "__mspabi_fixfli" },
   3756  1.1  mrg     { "__fixsfdi", "__mspabi_fixflli" },
   3757  1.1  mrg     { "__fixunsfhi", "__mspabi_fixfu" },
   3758  1.1  mrg     { "__fixunsfsi", "__mspabi_fixful" },
   3759  1.1  mrg     { "__fixunsfdi", "__mspabi_fixfull" },
   3760  1.1  mrg     { "__floathisf", "__mspabi_fltif" },
   3761  1.1  mrg     { "__floatsisf", "__mspabi_fltlif" },
   3762  1.1  mrg     { "__floatdisf", "__mspabi_fltllif" },
   3763  1.1  mrg     { "__floathidf", "__mspabi_fltid" },
   3764  1.1  mrg     { "__floatsidf", "__mspabi_fltlid" },
   3765  1.1  mrg     { "__floatdidf", "__mspabi_fltllid" },
   3766  1.1  mrg     { "__floatunhisf", "__mspabi_fltuf" },
   3767  1.1  mrg     { "__floatunsisf", "__mspabi_fltulf" },
   3768  1.1  mrg     { "__floatundisf", "__mspabi_fltullf" },
   3769  1.1  mrg     { "__floatunhidf", "__mspabi_fltud" },
   3770  1.1  mrg     { "__floatunsidf", "__mspabi_fltuld" },
   3771  1.1  mrg     { "__floatundidf", "__mspabi_fltulld" },
   3772  1.1  mrg 
   3773  1.1  mrg     /* Floating point comparisons.  */
   3774  1.1  mrg     /* GCC uses individual functions for each comparison, TI uses one
   3775  1.1  mrg        compare <=> function.  */
   3776  1.1  mrg 
   3777  1.1  mrg     /* Floating point arithmetic.  */
   3778  1.1  mrg     { "__adddf3", "__mspabi_addd" },
   3779  1.1  mrg     { "__addsf3", "__mspabi_addf" },
   3780  1.1  mrg     { "__divdf3", "__mspabi_divd" },
   3781  1.1  mrg     { "__divsf3", "__mspabi_divf" },
   3782  1.1  mrg     { "__muldf3", "__mspabi_mpyd" },
   3783  1.1  mrg     { "__mulsf3", "__mspabi_mpyf" },
   3784  1.1  mrg     { "__subdf3", "__mspabi_subd" },
   3785  1.1  mrg     { "__subsf3", "__mspabi_subf" },
   3786  1.1  mrg     /* GCC does not use helper functions for negation.  */
   3787  1.1  mrg 
   3788  1.1  mrg     /* Integer multiply, divide, remainder.  */
   3789  1.1  mrg     { "__mulhi3", "__mspabi_mpyi" },
   3790  1.1  mrg     { "__mulsi3", "__mspabi_mpyl" },
   3791  1.1  mrg     { "__muldi3", "__mspabi_mpyll" },
   3792  1.1  mrg #if 0
   3793  1.1  mrg     /* Clarify signed vs unsigned first.  */
   3794  1.1  mrg     { "__mulhisi3", "__mspabi_mpysl" }, /* gcc doesn't use widening multiply
   3795  1.1  mrg 					   (yet?) */
   3796  1.1  mrg     { "__mulsidi3", "__mspabi_mpysll" }, /* gcc doesn't use widening multiply
   3797  1.1  mrg 					    (yet?) */
   3798  1.1  mrg #endif
   3799  1.1  mrg 
   3800  1.1  mrg     { "__divhi3", "__mspabi_divi" },
   3801  1.1  mrg     { "__divsi3", "__mspabi_divli" },
   3802  1.1  mrg     { "__divdi3", "__mspabi_divlli" },
   3803  1.1  mrg     { "__udivhi3", "__mspabi_divu" },
   3804  1.1  mrg     { "__udivsi3", "__mspabi_divul" },
   3805  1.1  mrg     { "__udivdi3", "__mspabi_divull" },
   3806  1.1  mrg     { "__modhi3", "__mspabi_remi" },
   3807  1.1  mrg     { "__modsi3", "__mspabi_remli" },
   3808  1.1  mrg     { "__moddi3", "__mspabi_remlli" },
   3809  1.1  mrg     { "__umodhi3", "__mspabi_remu" },
   3810  1.1  mrg     { "__umodsi3", "__mspabi_remul" },
   3811  1.1  mrg     { "__umoddi3", "__mspabi_remull" },
   3812  1.1  mrg 
   3813  1.1  mrg     /* Bitwise operations.  */
   3814  1.1  mrg     /* Rotation - no rotation support yet.  */
   3815  1.1  mrg     /* Logical left shift - gcc already does these itself.  */
   3816  1.1  mrg     /* Arithmetic left shift - gcc already does these itself.  */
   3817  1.1  mrg     /* Arithmetic right shift - gcc already does these itself.  */
   3818  1.1  mrg 
   3819  1.1  mrg     { NULL, NULL }
   3820  1.1  mrg   };
   3821  1.1  mrg 
   3822  1.1  mrg /* Returns true if the current MCU supports an F5xxx series
   3823  1.1  mrg    hardware multiper.  */
   3824  1.1  mrg 
   3825  1.1  mrg bool
   3826  1.1  mrg msp430_use_f5_series_hwmult (void)
   3827  1.1  mrg {
   3828  1.1  mrg   static const char * cached_match = NULL;
   3829  1.1  mrg   static bool cached_result;
   3830  1.1  mrg 
   3831  1.1  mrg   if (msp430_hwmult_type == MSP430_HWMULT_F5SERIES)
   3832  1.1  mrg     return true;
   3833  1.1  mrg 
   3834  1.1  mrg   if (target_mcu == NULL || msp430_hwmult_type != MSP430_HWMULT_AUTO)
   3835  1.1  mrg     return false;
   3836  1.1  mrg 
   3837  1.1  mrg   if (target_mcu == cached_match)
   3838  1.1  mrg     return cached_result;
   3839  1.1  mrg 
   3840  1.1  mrg   cached_match = target_mcu;
   3841  1.1  mrg 
   3842  1.1  mrg   if (strncasecmp (target_mcu, "msp430f5", 8) == 0)
   3843  1.1  mrg     return cached_result = true;
   3844  1.1  mrg   if (strncasecmp (target_mcu, "msp430fr5", 9) == 0)
   3845  1.1  mrg     return cached_result = true;
   3846  1.1  mrg   if (strncasecmp (target_mcu, "msp430f6", 8) == 0)
   3847  1.1  mrg     return cached_result = true;
   3848  1.1  mrg 
   3849  1.1  mrg   msp430_extract_mcu_data (target_mcu);
   3850  1.1  mrg 
   3851  1.1  mrg   if (extracted_mcu_data.name != NULL)
   3852  1.1  mrg     return cached_result = extracted_mcu_data.hwmpy == 8;
   3853  1.1  mrg 
   3854  1.1  mrg   return cached_result = false;
   3855  1.1  mrg }
   3856  1.1  mrg 
   3857  1.1  mrg /* Returns true if the current MCU has a second generation
   3858  1.1  mrg    32-bit hardware multiplier.  */
   3859  1.1  mrg 
   3860  1.1  mrg static bool
   3861  1.1  mrg msp430_use_32bit_hwmult (void)
   3862  1.1  mrg {
   3863  1.1  mrg   static const char * cached_match = NULL;
   3864  1.1  mrg   static bool cached_result;
   3865  1.1  mrg 
   3866  1.1  mrg   if (msp430_hwmult_type == MSP430_HWMULT_LARGE)
   3867  1.1  mrg     return true;
   3868  1.1  mrg 
   3869  1.1  mrg   if (target_mcu == NULL || msp430_hwmult_type != MSP430_HWMULT_AUTO)
   3870  1.1  mrg     return false;
   3871  1.1  mrg 
   3872  1.1  mrg   if (target_mcu == cached_match)
   3873  1.1  mrg     return cached_result;
   3874  1.1  mrg 
   3875  1.1  mrg   cached_match = target_mcu;
   3876  1.1  mrg 
   3877  1.1  mrg   msp430_extract_mcu_data (target_mcu);
   3878  1.1  mrg   if (extracted_mcu_data.name != NULL)
   3879  1.1  mrg     return cached_result = extracted_mcu_data.hwmpy == 4;
   3880  1.1  mrg 
   3881  1.1  mrg   return cached_result = false;
   3882  1.1  mrg }
   3883  1.1  mrg 
   3884  1.1  mrg /* Returns true if the current MCU has a first generation
   3885  1.1  mrg    16-bit hardware multiplier.  */
   3886  1.1  mrg 
   3887  1.1  mrg static bool
   3888  1.1  mrg msp430_use_16bit_hwmult (void)
   3889  1.1  mrg {
   3890  1.1  mrg   static const char * cached_match = NULL;
   3891  1.1  mrg   static bool	      cached_result;
   3892  1.1  mrg 
   3893  1.1  mrg   if (msp430_hwmult_type == MSP430_HWMULT_SMALL)
   3894  1.1  mrg     return true;
   3895  1.1  mrg 
   3896  1.1  mrg   if (target_mcu == NULL || msp430_hwmult_type != MSP430_HWMULT_AUTO)
   3897  1.1  mrg     return false;
   3898  1.1  mrg 
   3899  1.1  mrg   if (target_mcu == cached_match)
   3900  1.1  mrg     return cached_result;
   3901  1.1  mrg 
   3902  1.1  mrg   cached_match = target_mcu;
   3903  1.1  mrg 
   3904  1.1  mrg   msp430_extract_mcu_data (target_mcu);
   3905  1.1  mrg   if (extracted_mcu_data.name != NULL)
   3906  1.1  mrg     return cached_result = (extracted_mcu_data.hwmpy == 1
   3907  1.1  mrg 			    || extracted_mcu_data.hwmpy == 2);
   3908  1.1  mrg 
   3909  1.1  mrg   return cached_result = false;
   3910  1.1  mrg }
   3911  1.1  mrg 
   3912  1.1  mrg /* Returns true if the current MCU does not have a
   3913  1.1  mrg    hardware multiplier of any kind.  */
   3914  1.1  mrg 
   3915  1.1  mrg bool
   3916  1.1  mrg msp430_has_hwmult (void)
   3917  1.1  mrg {
   3918  1.1  mrg   static const char * cached_match = NULL;
   3919  1.1  mrg   static bool cached_result;
   3920  1.1  mrg 
   3921  1.1  mrg   if (msp430_hwmult_type == MSP430_HWMULT_NONE)
   3922  1.1  mrg     return false;
   3923  1.1  mrg 
   3924  1.1  mrg   /* TRUE for any other explicit hwmult specified.  */
   3925  1.1  mrg   if (msp430_hwmult_type != MSP430_HWMULT_AUTO)
   3926  1.1  mrg     return true;
   3927  1.1  mrg 
   3928  1.1  mrg   /* Now handle -mhwmult=auto.  */
   3929  1.1  mrg   if (target_mcu == NULL)
   3930  1.1  mrg     return false;
   3931  1.1  mrg 
   3932  1.1  mrg   if (target_mcu == cached_match)
   3933  1.1  mrg     return cached_result;
   3934  1.1  mrg 
   3935  1.1  mrg   cached_match = target_mcu;
   3936  1.1  mrg 
   3937  1.1  mrg   msp430_extract_mcu_data (target_mcu);
   3938  1.1  mrg   if (extracted_mcu_data.name != NULL)
   3939  1.1  mrg     return cached_result = extracted_mcu_data.hwmpy != 0;
   3940  1.1  mrg 
   3941  1.1  mrg   /* If we do not recognise the MCU name, we assume that it does not support
   3942  1.1  mrg      any kind of hardware multiply - this is the safest assumption to make.  */
   3943  1.1  mrg   return cached_result = false;
   3944  1.1  mrg }
   3945  1.1  mrg 
   3946  1.1  mrg /* This function does the same as the default, but it will replace GCC
   3947  1.1  mrg    function names with the MSPABI-specified ones.  */
   3948  1.1  mrg 
   3949  1.1  mrg void
   3950  1.1  mrg msp430_output_labelref (FILE *file, const char *name)
   3951  1.1  mrg {
   3952  1.1  mrg   int i;
   3953  1.1  mrg 
   3954  1.1  mrg   for (i = 0; helper_function_name_mappings[i].gcc_name; i++)
   3955  1.1  mrg     if (strcmp (helper_function_name_mappings[i].gcc_name, name) == 0)
   3956  1.1  mrg       {
   3957  1.1  mrg 	name = helper_function_name_mappings[i].ti_name;
   3958  1.1  mrg 	break;
   3959  1.1  mrg       }
   3960  1.1  mrg 
   3961  1.1  mrg   if (user_label_prefix[0] != 0)
   3962  1.1  mrg     fputs (user_label_prefix, file);
   3963  1.1  mrg 
   3964  1.1  mrg   fputs (name, file);
   3965  1.1  mrg }
   3966  1.1  mrg 
   3967  1.1  mrg /* Common code for msp430_print_operand...  */
   3968  1.1  mrg 
   3969  1.1  mrg static void
   3970  1.1  mrg msp430_print_operand_raw (FILE * file, rtx op)
   3971  1.1  mrg {
   3972  1.1  mrg   HOST_WIDE_INT i;
   3973  1.1  mrg 
   3974  1.1  mrg   switch (GET_CODE (op))
   3975  1.1  mrg     {
   3976  1.1  mrg     case REG:
   3977  1.1  mrg       fprintf (file, "%s", reg_names[REGNO (op)]);
   3978  1.1  mrg       break;
   3979  1.1  mrg 
   3980  1.1  mrg     case CONST_INT:
   3981  1.1  mrg       i = INTVAL (op);
   3982  1.1  mrg       if (TARGET_ASM_HEX)
   3983  1.1  mrg 	fprintf (file, "%#" HOST_WIDE_INT_PRINT "x", i);
   3984  1.1  mrg       else
   3985  1.1  mrg 	fprintf (file, "%" HOST_WIDE_INT_PRINT "d", i);
   3986  1.1  mrg       break;
   3987  1.1  mrg 
   3988  1.1  mrg     case CONST:
   3989  1.1  mrg     case PLUS:
   3990  1.1  mrg     case MINUS:
   3991  1.1  mrg     case SYMBOL_REF:
   3992  1.1  mrg     case LABEL_REF:
   3993  1.1  mrg       output_addr_const (file, op);
   3994  1.1  mrg       break;
   3995  1.1  mrg 
   3996  1.1  mrg     default:
   3997  1.1  mrg       print_rtl (file, op);
   3998  1.1  mrg       break;
   3999  1.1  mrg     }
   4000  1.1  mrg }
   4001  1.1  mrg 
   4002  1.1  mrg #undef  TARGET_ASM_ALIGNED_PSI_OP
   4003  1.1  mrg #define TARGET_ASM_ALIGNED_PSI_OP "\t.long\t"
   4004  1.1  mrg #undef  TARGET_ASM_UNALIGNED_PSI_OP
   4005  1.1  mrg #define TARGET_ASM_UNALIGNED_PSI_OP TARGET_ASM_ALIGNED_PSI_OP
   4006  1.1  mrg 
   4007  1.1  mrg #undef  TARGET_PRINT_OPERAND_ADDRESS
   4008  1.1  mrg #define TARGET_PRINT_OPERAND_ADDRESS	msp430_print_operand_addr
   4009  1.1  mrg 
   4010  1.1  mrg /* Output to stdio stream FILE the assembler syntax for an
   4011  1.1  mrg    instruction operand that is a memory reference whose address
   4012  1.1  mrg    is ADDR.  */
   4013  1.1  mrg 
   4014  1.1  mrg static void
   4015  1.1  mrg msp430_print_operand_addr (FILE * file, machine_mode /*mode*/, rtx addr)
   4016  1.1  mrg {
   4017  1.1  mrg   switch (GET_CODE (addr))
   4018  1.1  mrg     {
   4019  1.1  mrg     case PLUS:
   4020  1.1  mrg       msp430_print_operand_raw (file, XEXP (addr, 1));
   4021  1.1  mrg       gcc_assert (REG_P (XEXP (addr, 0)));
   4022  1.1  mrg       fprintf (file, "(%s)", reg_names[REGNO (XEXP (addr, 0))]);
   4023  1.1  mrg       return;
   4024  1.1  mrg 
   4025  1.1  mrg     case REG:
   4026  1.1  mrg       fprintf (file, "@");
   4027  1.1  mrg       break;
   4028  1.1  mrg 
   4029  1.1  mrg     case POST_INC:
   4030  1.1  mrg       fprintf (file, "@%s+", reg_names[REGNO (XEXP (addr, 0))]);
   4031  1.1  mrg       return;
   4032  1.1  mrg 
   4033  1.1  mrg     case CONST:
   4034  1.1  mrg     case CONST_INT:
   4035  1.1  mrg     case SYMBOL_REF:
   4036  1.1  mrg     case LABEL_REF:
   4037  1.1  mrg       fprintf (file, "&");
   4038  1.1  mrg       break;
   4039  1.1  mrg 
   4040  1.1  mrg     default:
   4041  1.1  mrg       break;
   4042  1.1  mrg     }
   4043  1.1  mrg 
   4044  1.1  mrg   msp430_print_operand_raw (file, addr);
   4045  1.1  mrg }
   4046  1.1  mrg 
   4047  1.1  mrg /* We can only allow signed 15-bit indexes i.e. +/-32K.  */
   4048  1.1  mrg static bool
   4049  1.1  mrg msp430_check_index_not_high_mem (rtx op)
   4050  1.1  mrg {
   4051  1.1  mrg   if (CONST_INT_P (op)
   4052  1.1  mrg       && IN_RANGE (INTVAL (op), HOST_WIDE_INT_M1U << 15, (1 << 15) - 1))
   4053  1.1  mrg     return true;
   4054  1.1  mrg   return false;
   4055  1.1  mrg }
   4056  1.1  mrg 
   4057  1.1  mrg /* If this returns true, we don't need a 430X insn.  */
   4058  1.1  mrg static bool
   4059  1.1  mrg msp430_check_plus_not_high_mem (rtx op)
   4060  1.1  mrg {
   4061  1.1  mrg   if (GET_CODE (op) != PLUS)
   4062  1.1  mrg     return false;
   4063  1.1  mrg   rtx op0 = XEXP (op, 0);
   4064  1.1  mrg   rtx op1 = XEXP (op, 1);
   4065  1.1  mrg   if (SYMBOL_REF_P (op0)
   4066  1.1  mrg       && (SYMBOL_REF_FLAGS (op0) & SYMBOL_FLAG_LOW_MEM)
   4067  1.1  mrg       && msp430_check_index_not_high_mem (op1))
   4068  1.1  mrg     return true;
   4069  1.1  mrg   return false;
   4070  1.1  mrg }
   4071  1.1  mrg 
   4072  1.1  mrg /* Determine whether an RTX is definitely not a MEM referencing an address in
   4073  1.1  mrg    the upper memory region.  Returns true if we've decided the address will be
   4074  1.1  mrg    in the lower memory region, or the RTX is not a MEM.  Returns false
   4075  1.1  mrg    otherwise.
   4076  1.1  mrg    The Ys constraint will catch (mem (plus (const/reg)) but we catch cases
   4077  1.1  mrg    involving a symbol_ref here.  */
   4078  1.1  mrg bool
   4079  1.1  mrg msp430_op_not_in_high_mem (rtx op)
   4080  1.1  mrg {
   4081  1.1  mrg   rtx op0;
   4082  1.1  mrg 
   4083  1.1  mrg   if (!TARGET_LARGE || !MEM_P (op))
   4084  1.1  mrg     return true;
   4085  1.1  mrg 
   4086  1.1  mrg   op0 = XEXP (op, 0);
   4087  1.1  mrg 
   4088  1.1  mrg   if (SYMBOL_REF_P (op0) && (SYMBOL_REF_FLAGS (op0) & SYMBOL_FLAG_LOW_MEM))
   4089  1.1  mrg     /* msp430_encode_section_info decided this mem will be in lower
   4090  1.1  mrg        memory.  */
   4091  1.1  mrg     return true;
   4092  1.1  mrg 
   4093  1.1  mrg   /* Check possibilites for (mem (plus)).
   4094  1.1  mrg      e.g. (mem (const (plus ((symbol_ref) (const_int))))) : &addr+2.  */
   4095  1.1  mrg   if (msp430_check_plus_not_high_mem (op0)
   4096  1.1  mrg       || ((GET_CODE (op0) == CONST)
   4097  1.1  mrg 	  && msp430_check_plus_not_high_mem (XEXP (op0, 0))))
   4098  1.1  mrg     return true;
   4099  1.1  mrg 
   4100  1.1  mrg   /* An absolute 16-bit address is allowed.  */
   4101  1.1  mrg   if ((CONST_INT_P (op0) && (IN_RANGE (INTVAL (op0), 0, (1 << 16) - 1))))
   4102  1.1  mrg     return true;
   4103  1.1  mrg 
   4104  1.1  mrg   /* Return false when undecided.  */
   4105  1.1  mrg   return false;
   4106  1.1  mrg }
   4107  1.1  mrg 
   4108  1.1  mrg /* Based on the operand OP, is a 430X insn required to handle it?
   4109  1.1  mrg    There are only 3 conditions for which a 430X insn is required:
   4110  1.1  mrg    - PSImode operand
   4111  1.1  mrg    - memory reference to a symbol which could be in upper memory
   4112  1.1  mrg      (so its address is > 0xFFFF)
   4113  1.1  mrg    - absolute address which has VOIDmode, i.e. (mem:HI (const_int))
   4114  1.1  mrg    Use a 430 insn if none of these conditions are true.  */
   4115  1.1  mrg bool
   4116  1.1  mrg msp430x_insn_required (rtx op)
   4117  1.1  mrg {
   4118  1.1  mrg   return (GET_MODE (op) == PSImode
   4119  1.1  mrg 	  || !msp430_op_not_in_high_mem (op));
   4120  1.1  mrg }
   4121  1.1  mrg 
   4122  1.1  mrg #undef  TARGET_PRINT_OPERAND
   4123  1.1  mrg #define TARGET_PRINT_OPERAND		msp430_print_operand
   4124  1.1  mrg 
   4125  1.1  mrg /* A   Select low 16-bits of the constant/register/memory operand.
   4126  1.1  mrg    B   Select high 16-bits of the constant/register/memory
   4127  1.1  mrg        operand.
   4128  1.1  mrg    C   Select bits 32-47 of the constant/register/memory operand.
   4129  1.1  mrg    D   Select bits 48-63 of the constant/register/memory operand.
   4130  1.1  mrg    H   Equivalent to @code{B} (for backwards compatibility).
   4131  1.1  mrg    I   Print the inverse (logical @code{NOT}) of the constant
   4132  1.1  mrg        value.
   4133  1.1  mrg    J   Print an integer without a @code{#} prefix.
   4134  1.1  mrg    L   Equivalent to @code{A} (for backwards compatibility).
   4135  1.1  mrg    O   Offset of the current frame from the top of the stack.
   4136  1.1  mrg    Q   Use the @code{A} instruction postfix.
   4137  1.1  mrg    R   Inverse of condition code, for unsigned comparisons.
   4138  1.1  mrg    W   Subtract 16 from the constant value.
   4139  1.1  mrg    X   Use the @code{X} instruction postfix.
   4140  1.1  mrg    Y   Subtract 4 from the constant value.
   4141  1.1  mrg    Z   Subtract 1 from the constant value.
   4142  1.1  mrg    b   Append @code{.B}, @code{.W} or @code{.A} to the
   4143  1.1  mrg        instruction, depending on the mode.
   4144  1.1  mrg    d   Offset 1 byte of a memory reference or constant value.
   4145  1.1  mrg    e   Offset 3 bytes of a memory reference or constant value.
   4146  1.1  mrg    f   Offset 5 bytes of a memory reference or constant value.
   4147  1.1  mrg    g   Offset 7 bytes of a memory reference or constant value.
   4148  1.1  mrg    p   Print the value of 2, raised to the power of the given
   4149  1.1  mrg        constant.  Used to select the specified bit position.
   4150  1.1  mrg    r   Inverse of condition code, for signed comparisons.
   4151  1.1  mrg    x   Equivialent to @code{X}, but only for pointers.  */
   4152  1.1  mrg 
   4153  1.1  mrg static void
   4154  1.1  mrg msp430_print_operand (FILE * file, rtx op, int letter)
   4155  1.1  mrg {
   4156  1.1  mrg   rtx addr;
   4157  1.1  mrg   /* These are used by the 'A', 'B', 'C', 'D', 'd', 'e', 'f' and 'g' modifiers
   4158  1.1  mrg      to describe how to process the operand to get the requested value.  */
   4159  1.1  mrg   int mem_off = 0;
   4160  1.1  mrg   int reg_off = 0;
   4161  1.1  mrg   int const_shift = 0;
   4162  1.1  mrg 
   4163  1.1  mrg   /* We can't use c, n, a, or l.  */
   4164  1.1  mrg   switch (letter)
   4165  1.1  mrg     {
   4166  1.1  mrg     case 'Z':
   4167  1.1  mrg       gcc_assert (CONST_INT_P (op));
   4168  1.1  mrg       /* Print the constant value, less one.  */
   4169  1.1  mrg       fprintf (file, "#%ld", (long) (INTVAL (op) - 1));
   4170  1.1  mrg       return;
   4171  1.1  mrg     case 'Y':
   4172  1.1  mrg       gcc_assert (CONST_INT_P (op));
   4173  1.1  mrg       /* Print the constant value, less four.  */
   4174  1.1  mrg       fprintf (file, "#%ld", (long) (INTVAL (op) - 4));
   4175  1.1  mrg       return;
   4176  1.1  mrg     case 'W':
   4177  1.1  mrg       gcc_assert (CONST_INT_P (op));
   4178  1.1  mrg       /* Print the constant value, less 16.  */
   4179  1.1  mrg       fprintf (file, "#%ld", (long) (INTVAL (op) - 16));
   4180  1.1  mrg       return;
   4181  1.1  mrg     case 'I':
   4182  1.1  mrg       if (GET_CODE (op) == CONST_INT)
   4183  1.1  mrg 	{
   4184  1.1  mrg 	  /* Inverse of constants */
   4185  1.1  mrg 	  int i = INTVAL (op);
   4186  1.1  mrg 	  fprintf (file, "%d", ~i);
   4187  1.1  mrg 	  return;
   4188  1.1  mrg 	}
   4189  1.1  mrg       op = XEXP (op, 0);
   4190  1.1  mrg       break;
   4191  1.1  mrg     case 'r': /* Conditional jump where the condition is reversed.  */
   4192  1.1  mrg       switch (GET_CODE (op))
   4193  1.1  mrg 	{
   4194  1.1  mrg 	case EQ: fprintf (file, "NE"); break;
   4195  1.1  mrg 	case NE: fprintf (file, "EQ"); break;
   4196  1.1  mrg 	case GEU: fprintf (file, "LO"); break;
   4197  1.1  mrg 	case LTU: fprintf (file, "HS"); break;
   4198  1.1  mrg 	case GE: fprintf (file, "L"); break;
   4199  1.1  mrg 	case LT: fprintf (file, "GE"); break;
   4200  1.1  mrg 	  /* Assume these have reversed operands.  */
   4201  1.1  mrg 	case GTU: fprintf (file, "HS"); break;
   4202  1.1  mrg 	case LEU: fprintf (file, "LO"); break;
   4203  1.1  mrg 	case GT: fprintf (file, "GE"); break;
   4204  1.1  mrg 	case LE: fprintf (file, "L"); break;
   4205  1.1  mrg 	default:
   4206  1.1  mrg 	  msp430_print_operand_raw (file, op);
   4207  1.1  mrg 	  break;
   4208  1.1  mrg 	}
   4209  1.1  mrg       return;
   4210  1.1  mrg     case 'R': /* Conditional jump where the operands are reversed.  */
   4211  1.1  mrg       switch (GET_CODE (op))
   4212  1.1  mrg 	{
   4213  1.1  mrg 	case GTU: fprintf (file, "LO"); break;
   4214  1.1  mrg 	case LEU: fprintf (file, "HS"); break;
   4215  1.1  mrg 	case GT: fprintf (file, "L"); break;
   4216  1.1  mrg 	case LE: fprintf (file, "GE"); break;
   4217  1.1  mrg 	default:
   4218  1.1  mrg 	  msp430_print_operand_raw (file, op);
   4219  1.1  mrg 	  break;
   4220  1.1  mrg 	}
   4221  1.1  mrg       return;
   4222  1.1  mrg     case 'p': /* Bit position.  0 == 0x01, 3 = 0x08 etc.  */
   4223  1.1  mrg       gcc_assert (CONST_INT_P (op));
   4224  1.1  mrg       fprintf (file, "#%d", 1 << INTVAL (op));
   4225  1.1  mrg       return;
   4226  1.1  mrg     case 'b':
   4227  1.1  mrg       switch (GET_MODE (op))
   4228  1.1  mrg 	{
   4229  1.1  mrg 	case E_QImode: fprintf (file, ".B"); return;
   4230  1.1  mrg 	case E_HImode: fprintf (file, ".W"); return;
   4231  1.1  mrg 	case E_PSImode: fprintf (file, ".A"); return;
   4232  1.1  mrg 	case E_SImode: fprintf (file, ".A"); return;
   4233  1.1  mrg 	default:
   4234  1.1  mrg 	  return;
   4235  1.1  mrg 	}
   4236  1.1  mrg     case 'd': case 'e': case 'f': case 'g':
   4237  1.1  mrg       if (REG_P (op))
   4238  1.1  mrg 	{
   4239  1.1  mrg 	  output_operand_lossage ("%%d, %%e, %%f, %%g operand modifiers are "
   4240  1.1  mrg 				  "for memory references or constant values "
   4241  1.1  mrg 				  "only");
   4242  1.1  mrg 	  return;
   4243  1.1  mrg 	}
   4244  1.1  mrg       /* fallthru */
   4245  1.1  mrg     case 'B': case 'H': /* high half */
   4246  1.1  mrg     case 'C':
   4247  1.1  mrg     case 'D':
   4248  1.1  mrg       switch (letter)
   4249  1.1  mrg 	{
   4250  1.1  mrg 	case 'd':
   4251  1.1  mrg 	  mem_off = 1;
   4252  1.1  mrg 	  const_shift = 8;
   4253  1.1  mrg 	  break;
   4254  1.1  mrg 	case 'B':
   4255  1.1  mrg 	case 'H':
   4256  1.1  mrg 	  mem_off = 2;
   4257  1.1  mrg 	  reg_off = 1;
   4258  1.1  mrg 	  const_shift = 16;
   4259  1.1  mrg 	  break;
   4260  1.1  mrg 	case 'e':
   4261  1.1  mrg 	  mem_off = 3;
   4262  1.1  mrg 	  const_shift = 24;
   4263  1.1  mrg 	  break;
   4264  1.1  mrg 	case 'C':
   4265  1.1  mrg 	  mem_off = 4;
   4266  1.1  mrg 	  reg_off = 2;
   4267  1.1  mrg 	  const_shift = 32;
   4268  1.1  mrg 	  break;
   4269  1.1  mrg 	case 'f':
   4270  1.1  mrg 	  mem_off = 5;
   4271  1.1  mrg 	  const_shift = 40;
   4272  1.1  mrg 	  break;
   4273  1.1  mrg 	case 'D':
   4274  1.1  mrg 	  mem_off = 6;
   4275  1.1  mrg 	  reg_off = 3;
   4276  1.1  mrg 	  const_shift = 48;
   4277  1.1  mrg 	  break;
   4278  1.1  mrg 	case 'g':
   4279  1.1  mrg 	  mem_off = 7;
   4280  1.1  mrg 	  const_shift = 56;
   4281  1.1  mrg 	  break;
   4282  1.1  mrg 	default:
   4283  1.1  mrg 	  gcc_unreachable ();
   4284  1.1  mrg 	  break;
   4285  1.1  mrg 	}
   4286  1.1  mrg       /* fallthru */
   4287  1.1  mrg     case 'A': case 'L': /* Low half.  */
   4288  1.1  mrg       switch (GET_CODE (op))
   4289  1.1  mrg 	{
   4290  1.1  mrg 	case MEM:
   4291  1.1  mrg 	  /* We don't need to adjust the address for post_inc.  */
   4292  1.1  mrg 	  op = adjust_address (op, Pmode,
   4293  1.1  mrg 			       (GET_CODE (XEXP (op, 0)) == POST_INC)
   4294  1.1  mrg 			       ? 0 : mem_off);
   4295  1.1  mrg 	  break;
   4296  1.1  mrg 	case REG:
   4297  1.1  mrg 	  op = gen_rtx_REG (Pmode, REGNO (op) + reg_off);
   4298  1.1  mrg 	  break;
   4299  1.1  mrg 	case CONST_INT:
   4300  1.1  mrg 	  op = GEN_INT (((long long) INTVAL (op) >> const_shift) & 0xffff);
   4301  1.1  mrg 	  letter = 0;
   4302  1.1  mrg 	  break;
   4303  1.1  mrg 	default:
   4304  1.1  mrg 	  /* If you get here, figure out a test case :-) */
   4305  1.1  mrg 	  gcc_unreachable ();
   4306  1.1  mrg 	}
   4307  1.1  mrg       break;
   4308  1.1  mrg 
   4309  1.1  mrg     case 'X':
   4310  1.1  mrg       /* This is used to turn, for example, an ADD opcode into an ADDX
   4311  1.1  mrg 	 opcode when we're using 20-bit addresses.
   4312  1.1  mrg 	 This can be used for insns which have only one operand which might be
   4313  1.1  mrg 	 a mem.
   4314  1.1  mrg 	 If an insn has two different operands which could be memory operands,
   4315  1.1  mrg 	 then the "Yx" constraint must be used to determine if the X suffix is
   4316  1.1  mrg 	 required by checking both operands.  */
   4317  1.1  mrg       if (GET_MODE (op) == PSImode
   4318  1.1  mrg 	  || !msp430_op_not_in_high_mem (op))
   4319  1.1  mrg 	fprintf (file, "X");
   4320  1.1  mrg       return;
   4321  1.1  mrg 
   4322  1.1  mrg     case 'x':
   4323  1.1  mrg       /* Similarly, but only for PSImodes.  BIC, and other insn patterns using
   4324  1.1  mrg 	 the QHI mode iterator (which includes, QI, HI, and PSImode) use
   4325  1.1  mrg 	 this.  */
   4326  1.1  mrg       if (GET_MODE (op) == PSImode)
   4327  1.1  mrg 	fprintf (file, "X");
   4328  1.1  mrg       return;
   4329  1.1  mrg 
   4330  1.1  mrg     case 'Q':
   4331  1.1  mrg       /* Likewise, for BR -> BRA.  */
   4332  1.1  mrg       if (TARGET_LARGE)
   4333  1.1  mrg 	fprintf (file, "A");
   4334  1.1  mrg       return;
   4335  1.1  mrg 
   4336  1.1  mrg     case 'O':
   4337  1.1  mrg       /* Computes the offset to the top of the stack for the current frame.
   4338  1.1  mrg 	 This has to be done here rather than in, say, msp430_expand_builtin()
   4339  1.1  mrg 	 because builtins are expanded before the frame layout is
   4340  1.1  mrg 	 determined.  */
   4341  1.1  mrg       fprintf (file, "%d",
   4342  1.1  mrg 	       msp430_initial_elimination_offset (ARG_POINTER_REGNUM,
   4343  1.1  mrg 						  STACK_POINTER_REGNUM)
   4344  1.1  mrg 	       - (TARGET_LARGE ? 4 : 2));
   4345  1.1  mrg       return;
   4346  1.1  mrg 
   4347  1.1  mrg     case 'J':
   4348  1.1  mrg       gcc_assert (GET_CODE (op) == CONST_INT);
   4349  1.1  mrg     case 0:
   4350  1.1  mrg       break;
   4351  1.1  mrg     default:
   4352  1.1  mrg       output_operand_lossage ("invalid operand prefix");
   4353  1.1  mrg       return;
   4354  1.1  mrg     }
   4355  1.1  mrg 
   4356  1.1  mrg   switch (GET_CODE (op))
   4357  1.1  mrg     {
   4358  1.1  mrg     case REG:
   4359  1.1  mrg       msp430_print_operand_raw (file, op);
   4360  1.1  mrg       break;
   4361  1.1  mrg 
   4362  1.1  mrg     case MEM:
   4363  1.1  mrg       addr = XEXP (op, 0);
   4364  1.1  mrg       msp430_print_operand_addr (file, GET_MODE (op), addr);
   4365  1.1  mrg       break;
   4366  1.1  mrg 
   4367  1.1  mrg     case CONST:
   4368  1.1  mrg       if (GET_CODE (XEXP (op, 0)) == ZERO_EXTRACT)
   4369  1.1  mrg 	{
   4370  1.1  mrg 	  op = XEXP (op, 0);
   4371  1.1  mrg 	  switch (INTVAL (XEXP (op, 2)))
   4372  1.1  mrg 	    {
   4373  1.1  mrg 	    case 0:
   4374  1.1  mrg 	      fprintf (file, "#lo (");
   4375  1.1  mrg 	      msp430_print_operand_raw (file, XEXP (op, 0));
   4376  1.1  mrg 	      fprintf (file, ")");
   4377  1.1  mrg 	      break;
   4378  1.1  mrg 
   4379  1.1  mrg 	    case 16:
   4380  1.1  mrg 	      fprintf (file, "#hi (");
   4381  1.1  mrg 	      msp430_print_operand_raw (file, XEXP (op, 0));
   4382  1.1  mrg 	      fprintf (file, ")");
   4383  1.1  mrg 	      break;
   4384  1.1  mrg 
   4385  1.1  mrg 	    default:
   4386  1.1  mrg 	      output_operand_lossage ("invalid zero extract");
   4387  1.1  mrg 	      break;
   4388  1.1  mrg 	    }
   4389  1.1  mrg 	  break;
   4390  1.1  mrg 	}
   4391  1.1  mrg       /* Fall through.  */
   4392  1.1  mrg     case CONST_INT:
   4393  1.1  mrg     case SYMBOL_REF:
   4394  1.1  mrg     case LABEL_REF:
   4395  1.1  mrg       if (letter == 0)
   4396  1.1  mrg 	fprintf (file, "#");
   4397  1.1  mrg       msp430_print_operand_raw (file, op);
   4398  1.1  mrg       break;
   4399  1.1  mrg 
   4400  1.1  mrg     case EQ: fprintf (file, "EQ"); break;
   4401  1.1  mrg     case NE: fprintf (file, "NE"); break;
   4402  1.1  mrg     case GEU: fprintf (file, "HS"); break;
   4403  1.1  mrg     case LTU: fprintf (file, "LO"); break;
   4404  1.1  mrg     case GE: fprintf (file, "GE"); break;
   4405  1.1  mrg     case LT: fprintf (file, "L"); break;
   4406  1.1  mrg 
   4407  1.1  mrg     default:
   4408  1.1  mrg       print_rtl (file, op);
   4409  1.1  mrg       break;
   4410  1.1  mrg     }
   4411  1.1  mrg }
   4412  1.1  mrg 
   4413  1.1  mrg 
   4414  1.1  mrg /* Frame stuff.  */
   4416  1.1  mrg 
   4417  1.1  mrg rtx
   4418  1.1  mrg msp430_return_addr_rtx (int count)
   4419  1.1  mrg {
   4420  1.1  mrg   int ra_size;
   4421  1.1  mrg   if (count)
   4422  1.1  mrg     return NULL_RTX;
   4423  1.1  mrg 
   4424  1.1  mrg   ra_size = TARGET_LARGE ? 4 : 2;
   4425  1.1  mrg   if (crtl->args.pretend_args_size)
   4426  1.1  mrg     ra_size += 2;
   4427  1.1  mrg 
   4428  1.1  mrg   return gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, arg_pointer_rtx,
   4429  1.1  mrg 					   GEN_INT (- ra_size)));
   4430  1.1  mrg }
   4431  1.1  mrg 
   4432  1.1  mrg rtx
   4433  1.1  mrg msp430_incoming_return_addr_rtx (void)
   4434  1.1  mrg {
   4435  1.1  mrg   return gen_rtx_MEM (Pmode, stack_pointer_rtx);
   4436  1.1  mrg }
   4437  1.1  mrg 
   4438  1.1  mrg /* If the path to the MSP430-GCC support files has been found by examining
   4439  1.1  mrg    an environment variable (see msp430_check_env_var_for_devices in
   4440  1.1  mrg    msp430-devices.cc), or -mdevices-csv-loc=, register this path as an include
   4441  1.1  mrg    directory so the user can #include msp430.h without needing to specify the
   4442  1.1  mrg    path to the support files with -I.  */
   4443  1.1  mrg void
   4444  1.1  mrg msp430_register_pre_includes (const char *sysroot ATTRIBUTE_UNUSED,
   4445  1.1  mrg 			      const char *iprefix ATTRIBUTE_UNUSED,
   4446  1.1  mrg 			      int stdinc ATTRIBUTE_UNUSED)
   4447  1.1  mrg {
   4448  1.1  mrg   char *include_dir;
   4449  1.1  mrg   if (msp430_devices_csv_loc)
   4450  1.1  mrg     include_dir = xstrdup (msp430_devices_csv_loc);
   4451  1.1  mrg   else if (msp430_check_env_var_for_devices (&include_dir))
   4452  1.1  mrg     return;
   4453  1.1  mrg   include_dir = msp430_dirname (include_dir);
   4454  1.1  mrg 
   4455  1.1  mrg   include_dir = update_path (include_dir, "");
   4456  1.1  mrg   add_path (include_dir, INC_SYSTEM, false, false);
   4457  1.1  mrg }
   4458  1.1  mrg 
   4459  1.1  mrg /* Instruction generation stuff.  */
   4461  1.1  mrg 
   4462  1.1  mrg /* Generate a sequence of instructions to sign-extend an HI
   4463  1.1  mrg    value into an SI value.  Handles the tricky case where
   4464  1.1  mrg    we are overwriting the destination.
   4465  1.1  mrg    Return the number of bytes used by the emitted instructions.
   4466  1.1  mrg    If RETURN_LENGTH is true then do not emit the assembly instruction
   4467  1.1  mrg    sequence.  */
   4468  1.1  mrg int
   4469  1.1  mrg msp430x_extendhisi (rtx * operands, bool return_length)
   4470  1.1  mrg {
   4471  1.1  mrg   if (REGNO (operands[0]) == REGNO (operands[1]))
   4472  1.1  mrg     {
   4473  1.1  mrg       /* Low word of dest == source word.  */
   4474  1.1  mrg       if (!return_length)
   4475  1.1  mrg 	output_asm_insn ("BIT.W\t#0x8000, %L0 { SUBC.W\t%H0, %H0 { INV.W\t%H0, %H0",
   4476  1.1  mrg 			 operands);
   4477  1.1  mrg       return 8;
   4478  1.1  mrg     }
   4479  1.1  mrg   else if (! msp430x)
   4480  1.1  mrg     {
   4481  1.1  mrg       /* Note: This sequence is approximately the same length as invoking a
   4482  1.1  mrg 	 helper function to perform the sign-extension, as in:
   4483  1.1  mrg 
   4484  1.1  mrg 	 MOV.W  %1, %L0
   4485  1.1  mrg 	 MOV.W  %1, r12
   4486  1.1  mrg 	 CALL   __mspabi_srai_15
   4487  1.1  mrg 	 MOV.W  r12, %H0
   4488  1.1  mrg 
   4489  1.1  mrg 	 but this version does not involve any function calls or using argument
   4490  1.1  mrg 	 registers, so it reduces register pressure.  */
   4491  1.1  mrg       if (!return_length)
   4492  1.1  mrg 	output_asm_insn ("MOV.W\t%1, %L0 { BIT.W\t#0x8000, %L0 { SUBC.W\t%H0, %H0 { INV.W\t%H0, %H0",
   4493  1.1  mrg 			 operands);
   4494  1.1  mrg       return 10;
   4495  1.1  mrg     }
   4496  1.1  mrg   else if (REGNO (operands[0]) + 1 == REGNO (operands[1]))
   4497  1.1  mrg     {
   4498  1.1  mrg       /* High word of dest == source word.  */
   4499  1.1  mrg       if (!return_length)
   4500  1.1  mrg 	output_asm_insn ("MOV.W\t%1, %L0 { RPT\t#15 { RRAX.W\t%H0",
   4501  1.1  mrg 			 operands);
   4502  1.1  mrg       return 6;
   4503  1.1  mrg     }
   4504  1.1  mrg 
   4505  1.1  mrg   /* No overlap between dest and source.  */
   4506  1.1  mrg   if (!return_length)
   4507  1.1  mrg     output_asm_insn ("MOV.W\t%1, %L0 { MOV.W\t%1, %H0 { RPT\t#15 { RRAX.W\t%H0",
   4508  1.1  mrg 		     operands);
   4509  1.1  mrg   return 8;
   4510  1.1  mrg }
   4511  1.1  mrg 
   4512  1.1  mrg /* Stop GCC from thinking that it can eliminate (SUBREG:PSI (SI)).  */
   4513  1.1  mrg 
   4514  1.1  mrg #undef TARGET_CAN_CHANGE_MODE_CLASS
   4515  1.1  mrg #define TARGET_CAN_CHANGE_MODE_CLASS msp430_can_change_mode_class
   4516  1.1  mrg 
   4517  1.1  mrg static bool
   4518  1.1  mrg msp430_can_change_mode_class (machine_mode from, machine_mode to, reg_class_t)
   4519  1.1  mrg {
   4520  1.1  mrg   if ((to == PSImode && from == SImode)
   4521  1.1  mrg       || (to == SImode && from == PSImode)
   4522                 || (to == DImode && from == PSImode)
   4523                 || (to == PSImode && from == DImode))
   4524               return false;
   4525             return true;
   4526           }
   4527           
   4528           #undef  TARGET_HAVE_SPECULATION_SAFE_VALUE
   4530           #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
   4531           
   4532           struct gcc_target targetm = TARGET_INITIALIZER;
   4533           
   4534           #include "gt-msp430.h"
   4535