Home | History | Annotate | Line # | Download | only in rs6000
rs6000-call.cc revision 1.1.1.1
      1  1.1  mrg /* Subroutines used to generate function calls and handle built-in
      2  1.1  mrg    instructions on IBM RS/6000.
      3  1.1  mrg    Copyright (C) 1991-2022 Free Software Foundation, Inc.
      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 it
      8  1.1  mrg    under the terms of the GNU General Public License as published
      9  1.1  mrg    by the Free Software Foundation; either version 3, or (at your
     10  1.1  mrg    option) any later version.
     11  1.1  mrg 
     12  1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT
     13  1.1  mrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     14  1.1  mrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     15  1.1  mrg    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 "rtl.h"
     28  1.1  mrg #include "tree.h"
     29  1.1  mrg #include "memmodel.h"
     30  1.1  mrg #include "gimple.h"
     31  1.1  mrg #include "cfghooks.h"
     32  1.1  mrg #include "cfgloop.h"
     33  1.1  mrg #include "df.h"
     34  1.1  mrg #include "tm_p.h"
     35  1.1  mrg #include "stringpool.h"
     36  1.1  mrg #include "expmed.h"
     37  1.1  mrg #include "optabs.h"
     38  1.1  mrg #include "regs.h"
     39  1.1  mrg #include "ira.h"
     40  1.1  mrg #include "recog.h"
     41  1.1  mrg #include "cgraph.h"
     42  1.1  mrg #include "diagnostic-core.h"
     43  1.1  mrg #include "insn-attr.h"
     44  1.1  mrg #include "flags.h"
     45  1.1  mrg #include "alias.h"
     46  1.1  mrg #include "fold-const.h"
     47  1.1  mrg #include "attribs.h"
     48  1.1  mrg #include "stor-layout.h"
     49  1.1  mrg #include "calls.h"
     50  1.1  mrg #include "print-tree.h"
     51  1.1  mrg #include "varasm.h"
     52  1.1  mrg #include "explow.h"
     53  1.1  mrg #include "expr.h"
     54  1.1  mrg #include "output.h"
     55  1.1  mrg #include "common/common-target.h"
     56  1.1  mrg #include "langhooks.h"
     57  1.1  mrg #include "gimplify.h"
     58  1.1  mrg #include "gimple-fold.h"
     59  1.1  mrg #include "gimple-iterator.h"
     60  1.1  mrg #include "ssa.h"
     61  1.1  mrg #include "tree-ssa-propagate.h"
     62  1.1  mrg #include "builtins.h"
     63  1.1  mrg #include "tree-vector-builder.h"
     64  1.1  mrg #if TARGET_XCOFF
     65  1.1  mrg #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
     66  1.1  mrg #endif
     67  1.1  mrg #include "ppc-auxv.h"
     68  1.1  mrg #include "targhooks.h"
     69  1.1  mrg #include "opts.h"
     70  1.1  mrg 
     71  1.1  mrg #include "rs6000-internal.h"
     72  1.1  mrg 
     73  1.1  mrg #if TARGET_MACHO
     74  1.1  mrg #include "gstab.h"  /* for N_SLINE */
     75  1.1  mrg #include "dbxout.h" /* dbxout_ */
     76  1.1  mrg #endif
     77  1.1  mrg 
     78  1.1  mrg #ifndef TARGET_PROFILE_KERNEL
     79  1.1  mrg #define TARGET_PROFILE_KERNEL 0
     80  1.1  mrg #endif
     81  1.1  mrg 
     82  1.1  mrg #ifdef HAVE_AS_GNU_ATTRIBUTE
     83  1.1  mrg # ifndef HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE
     84  1.1  mrg # define HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE 0
     85  1.1  mrg # endif
     86  1.1  mrg #endif
     87  1.1  mrg 
     88  1.1  mrg #ifndef TARGET_NO_PROTOTYPE
     89  1.1  mrg #define TARGET_NO_PROTOTYPE 0
     90  1.1  mrg #endif
     91  1.1  mrg 
     92  1.1  mrg /* Nonzero if we can use a floating-point register to pass this arg.  */
     93  1.1  mrg #define USE_FP_FOR_ARG_P(CUM,MODE)		\
     94  1.1  mrg   (SCALAR_FLOAT_MODE_NOT_VECTOR_P (MODE)		\
     95  1.1  mrg    && (CUM)->fregno <= FP_ARG_MAX_REG		\
     96  1.1  mrg    && TARGET_HARD_FLOAT)
     97  1.1  mrg 
     98  1.1  mrg /* Nonzero if we can use an AltiVec register to pass this arg.  */
     99  1.1  mrg #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,NAMED)			\
    100  1.1  mrg   (ALTIVEC_OR_VSX_VECTOR_MODE (MODE)				\
    101  1.1  mrg    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG			\
    102  1.1  mrg    && TARGET_ALTIVEC_ABI					\
    103  1.1  mrg    && (NAMED))
    104  1.1  mrg 
    105  1.1  mrg /* Walk down the type tree of TYPE counting consecutive base elements.
    106  1.1  mrg    If *MODEP is VOIDmode, then set it to the first valid floating point
    107  1.1  mrg    or vector type.  If a non-floating point or vector type is found, or
    108  1.1  mrg    if a floating point or vector type that doesn't match a non-VOIDmode
    109  1.1  mrg    *MODEP is found, then return -1, otherwise return the count in the
    110  1.1  mrg    sub-tree.
    111  1.1  mrg 
    112  1.1  mrg    There have been some ABI snafus along the way with C++.  Modify
    113  1.1  mrg    EMPTY_BASE_SEEN to a nonzero value iff a C++ empty base class makes
    114  1.1  mrg    an appearance; separate flag bits indicate whether or not such a
    115  1.1  mrg    field is marked "no unique address".  Modify ZERO_WIDTH_BF_SEEN
    116  1.1  mrg    to 1 iff a C++ zero-length bitfield makes an appearance, but
    117  1.1  mrg    in this case otherwise treat this as still being a homogeneous
    118  1.1  mrg    aggregate.  */
    119  1.1  mrg 
    120  1.1  mrg static int
    121  1.1  mrg rs6000_aggregate_candidate (const_tree type, machine_mode *modep,
    122  1.1  mrg 			    int *empty_base_seen, int *zero_width_bf_seen)
    123  1.1  mrg {
    124  1.1  mrg   machine_mode mode;
    125  1.1  mrg   HOST_WIDE_INT size;
    126  1.1  mrg 
    127  1.1  mrg   switch (TREE_CODE (type))
    128  1.1  mrg     {
    129  1.1  mrg     case REAL_TYPE:
    130  1.1  mrg       mode = TYPE_MODE (type);
    131  1.1  mrg       if (!SCALAR_FLOAT_MODE_P (mode))
    132  1.1  mrg 	return -1;
    133  1.1  mrg 
    134  1.1  mrg       if (*modep == VOIDmode)
    135  1.1  mrg 	*modep = mode;
    136  1.1  mrg 
    137  1.1  mrg       if (*modep == mode)
    138  1.1  mrg 	return 1;
    139  1.1  mrg 
    140  1.1  mrg       break;
    141  1.1  mrg 
    142  1.1  mrg     case COMPLEX_TYPE:
    143  1.1  mrg       mode = TYPE_MODE (TREE_TYPE (type));
    144  1.1  mrg       if (!SCALAR_FLOAT_MODE_P (mode))
    145  1.1  mrg 	return -1;
    146  1.1  mrg 
    147  1.1  mrg       if (*modep == VOIDmode)
    148  1.1  mrg 	*modep = mode;
    149  1.1  mrg 
    150  1.1  mrg       if (*modep == mode)
    151  1.1  mrg 	return 2;
    152  1.1  mrg 
    153  1.1  mrg       break;
    154  1.1  mrg 
    155  1.1  mrg     case VECTOR_TYPE:
    156  1.1  mrg       if (!TARGET_ALTIVEC_ABI || !TARGET_ALTIVEC)
    157  1.1  mrg 	return -1;
    158  1.1  mrg 
    159  1.1  mrg       /* Use V4SImode as representative of all 128-bit vector types.  */
    160  1.1  mrg       size = int_size_in_bytes (type);
    161  1.1  mrg       switch (size)
    162  1.1  mrg 	{
    163  1.1  mrg 	case 16:
    164  1.1  mrg 	  mode = V4SImode;
    165  1.1  mrg 	  break;
    166  1.1  mrg 	default:
    167  1.1  mrg 	  return -1;
    168  1.1  mrg 	}
    169  1.1  mrg 
    170  1.1  mrg       if (*modep == VOIDmode)
    171  1.1  mrg 	*modep = mode;
    172  1.1  mrg 
    173  1.1  mrg       /* Vector modes are considered to be opaque: two vectors are
    174  1.1  mrg 	 equivalent for the purposes of being homogeneous aggregates
    175  1.1  mrg 	 if they are the same size.  */
    176  1.1  mrg       if (*modep == mode)
    177  1.1  mrg 	return 1;
    178  1.1  mrg 
    179  1.1  mrg       break;
    180  1.1  mrg 
    181  1.1  mrg     case ARRAY_TYPE:
    182  1.1  mrg       {
    183  1.1  mrg 	int count;
    184  1.1  mrg 	tree index = TYPE_DOMAIN (type);
    185  1.1  mrg 
    186  1.1  mrg 	/* Can't handle incomplete types nor sizes that are not
    187  1.1  mrg 	   fixed.  */
    188  1.1  mrg 	if (!COMPLETE_TYPE_P (type)
    189  1.1  mrg 	    || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
    190  1.1  mrg 	  return -1;
    191  1.1  mrg 
    192  1.1  mrg 	count = rs6000_aggregate_candidate (TREE_TYPE (type), modep,
    193  1.1  mrg 					    empty_base_seen,
    194  1.1  mrg 					    zero_width_bf_seen);
    195  1.1  mrg 	if (count == -1
    196  1.1  mrg 	    || !index
    197  1.1  mrg 	    || !TYPE_MAX_VALUE (index)
    198  1.1  mrg 	    || !tree_fits_uhwi_p (TYPE_MAX_VALUE (index))
    199  1.1  mrg 	    || !TYPE_MIN_VALUE (index)
    200  1.1  mrg 	    || !tree_fits_uhwi_p (TYPE_MIN_VALUE (index))
    201  1.1  mrg 	    || count < 0)
    202  1.1  mrg 	  return -1;
    203  1.1  mrg 
    204  1.1  mrg 	count *= (1 + tree_to_uhwi (TYPE_MAX_VALUE (index))
    205  1.1  mrg 		      - tree_to_uhwi (TYPE_MIN_VALUE (index)));
    206  1.1  mrg 
    207  1.1  mrg 	/* There must be no padding.  */
    208  1.1  mrg 	if (wi::to_wide (TYPE_SIZE (type))
    209  1.1  mrg 	    != count * GET_MODE_BITSIZE (*modep))
    210  1.1  mrg 	  return -1;
    211  1.1  mrg 
    212  1.1  mrg 	return count;
    213  1.1  mrg       }
    214  1.1  mrg 
    215  1.1  mrg     case RECORD_TYPE:
    216  1.1  mrg       {
    217  1.1  mrg 	int count = 0;
    218  1.1  mrg 	int sub_count;
    219  1.1  mrg 	tree field;
    220  1.1  mrg 
    221  1.1  mrg 	/* Can't handle incomplete types nor sizes that are not
    222  1.1  mrg 	   fixed.  */
    223  1.1  mrg 	if (!COMPLETE_TYPE_P (type)
    224  1.1  mrg 	    || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
    225  1.1  mrg 	  return -1;
    226  1.1  mrg 
    227  1.1  mrg 	for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
    228  1.1  mrg 	  {
    229  1.1  mrg 	    if (TREE_CODE (field) != FIELD_DECL)
    230  1.1  mrg 	      continue;
    231  1.1  mrg 
    232  1.1  mrg 	    if (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (field))
    233  1.1  mrg 	      {
    234  1.1  mrg 		/* GCC 11 and earlier generated incorrect code in a rare
    235  1.1  mrg 		   corner case for C++.  When a RECORD_TYPE looks like a
    236  1.1  mrg 		   homogeneous aggregate, except that it also contains
    237  1.1  mrg 		   one or more zero-width bit fields, these earlier
    238  1.1  mrg 		   compilers would incorrectly pass the fields in FPRs
    239  1.1  mrg 		   or VSRs.  This occurred because the front end wrongly
    240  1.1  mrg 		   removed these bitfields from the RECORD_TYPE.  In
    241  1.1  mrg 		   GCC 12 and later, the front end flaw was corrected.
    242  1.1  mrg 		   We want to diagnose this case.  To do this, we pretend
    243  1.1  mrg 		   that we don't see the zero-width bit fields (hence
    244  1.1  mrg 		   the continue statement here), but pass back a flag
    245  1.1  mrg 		   indicating what happened.  The caller then diagnoses
    246  1.1  mrg 		   the issue and rejects the RECORD_TYPE as a homogeneous
    247  1.1  mrg 		   aggregate.  */
    248  1.1  mrg 		*zero_width_bf_seen = 1;
    249  1.1  mrg 		continue;
    250  1.1  mrg 	      }
    251  1.1  mrg 
    252  1.1  mrg 	    if (DECL_FIELD_ABI_IGNORED (field))
    253  1.1  mrg 	      {
    254  1.1  mrg 		if (lookup_attribute ("no_unique_address",
    255  1.1  mrg 				      DECL_ATTRIBUTES (field)))
    256  1.1  mrg 		  *empty_base_seen |= 2;
    257  1.1  mrg 		else
    258  1.1  mrg 		  *empty_base_seen |= 1;
    259  1.1  mrg 		continue;
    260  1.1  mrg 	      }
    261  1.1  mrg 
    262  1.1  mrg 	    sub_count = rs6000_aggregate_candidate (TREE_TYPE (field), modep,
    263  1.1  mrg 						    empty_base_seen,
    264  1.1  mrg 						    zero_width_bf_seen);
    265  1.1  mrg 	    if (sub_count < 0)
    266  1.1  mrg 	      return -1;
    267  1.1  mrg 	    count += sub_count;
    268  1.1  mrg 	  }
    269  1.1  mrg 
    270  1.1  mrg 	/* There must be no padding.  */
    271  1.1  mrg 	if (wi::to_wide (TYPE_SIZE (type))
    272  1.1  mrg 	    != count * GET_MODE_BITSIZE (*modep))
    273  1.1  mrg 	  return -1;
    274  1.1  mrg 
    275  1.1  mrg 	return count;
    276  1.1  mrg       }
    277  1.1  mrg 
    278  1.1  mrg     case UNION_TYPE:
    279  1.1  mrg     case QUAL_UNION_TYPE:
    280  1.1  mrg       {
    281  1.1  mrg 	/* These aren't very interesting except in a degenerate case.  */
    282  1.1  mrg 	int count = 0;
    283  1.1  mrg 	int sub_count;
    284  1.1  mrg 	tree field;
    285  1.1  mrg 
    286  1.1  mrg 	/* Can't handle incomplete types nor sizes that are not
    287  1.1  mrg 	   fixed.  */
    288  1.1  mrg 	if (!COMPLETE_TYPE_P (type)
    289  1.1  mrg 	    || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
    290  1.1  mrg 	  return -1;
    291  1.1  mrg 
    292  1.1  mrg 	for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
    293  1.1  mrg 	  {
    294  1.1  mrg 	    if (TREE_CODE (field) != FIELD_DECL)
    295  1.1  mrg 	      continue;
    296  1.1  mrg 
    297  1.1  mrg 	    sub_count = rs6000_aggregate_candidate (TREE_TYPE (field), modep,
    298  1.1  mrg 						    empty_base_seen,
    299  1.1  mrg 						    zero_width_bf_seen);
    300  1.1  mrg 	    if (sub_count < 0)
    301  1.1  mrg 	      return -1;
    302  1.1  mrg 	    count = count > sub_count ? count : sub_count;
    303  1.1  mrg 	  }
    304  1.1  mrg 
    305  1.1  mrg 	/* There must be no padding.  */
    306  1.1  mrg 	if (wi::to_wide (TYPE_SIZE (type))
    307  1.1  mrg 	    != count * GET_MODE_BITSIZE (*modep))
    308  1.1  mrg 	  return -1;
    309  1.1  mrg 
    310  1.1  mrg 	return count;
    311  1.1  mrg       }
    312  1.1  mrg 
    313  1.1  mrg     default:
    314  1.1  mrg       break;
    315  1.1  mrg     }
    316  1.1  mrg 
    317  1.1  mrg   return -1;
    318  1.1  mrg }
    319  1.1  mrg 
    320  1.1  mrg /* If an argument, whose type is described by TYPE and MODE, is a homogeneous
    321  1.1  mrg    float or vector aggregate that shall be passed in FP/vector registers
    322  1.1  mrg    according to the ELFv2 ABI, return the homogeneous element mode in
    323  1.1  mrg    *ELT_MODE and the number of elements in *N_ELTS, and return TRUE.
    324  1.1  mrg 
    325  1.1  mrg    Otherwise, set *ELT_MODE to MODE and *N_ELTS to 1, and return FALSE.  */
    326  1.1  mrg 
    327  1.1  mrg bool
    328  1.1  mrg rs6000_discover_homogeneous_aggregate (machine_mode mode, const_tree type,
    329  1.1  mrg 				       machine_mode *elt_mode,
    330  1.1  mrg 				       int *n_elts)
    331  1.1  mrg {
    332  1.1  mrg   /* Note that we do not accept complex types at the top level as
    333  1.1  mrg      homogeneous aggregates; these types are handled via the
    334  1.1  mrg      targetm.calls.split_complex_arg mechanism.  Complex types
    335  1.1  mrg      can be elements of homogeneous aggregates, however.  */
    336  1.1  mrg   if (TARGET_HARD_FLOAT && DEFAULT_ABI == ABI_ELFv2 && type
    337  1.1  mrg       && AGGREGATE_TYPE_P (type))
    338  1.1  mrg     {
    339  1.1  mrg       machine_mode field_mode = VOIDmode;
    340  1.1  mrg       int empty_base_seen = 0;
    341  1.1  mrg       int zero_width_bf_seen = 0;
    342  1.1  mrg       int field_count = rs6000_aggregate_candidate (type, &field_mode,
    343  1.1  mrg 						    &empty_base_seen,
    344  1.1  mrg 						    &zero_width_bf_seen);
    345  1.1  mrg 
    346  1.1  mrg       if (field_count > 0)
    347  1.1  mrg 	{
    348  1.1  mrg 	  int reg_size = ALTIVEC_OR_VSX_VECTOR_MODE (field_mode) ? 16 : 8;
    349  1.1  mrg 	  int field_size = ROUND_UP (GET_MODE_SIZE (field_mode), reg_size);
    350  1.1  mrg 
    351  1.1  mrg 	  /* The ELFv2 ABI allows homogeneous aggregates to occupy
    352  1.1  mrg 	     up to AGGR_ARG_NUM_REG registers.  */
    353  1.1  mrg 	  if (field_count * field_size <= AGGR_ARG_NUM_REG * reg_size)
    354  1.1  mrg 	    {
    355  1.1  mrg 	      if (elt_mode)
    356  1.1  mrg 		*elt_mode = field_mode;
    357  1.1  mrg 	      if (n_elts)
    358  1.1  mrg 		*n_elts = field_count;
    359  1.1  mrg 	      if (empty_base_seen && warn_psabi)
    360  1.1  mrg 		{
    361  1.1  mrg 		  static unsigned last_reported_type_uid;
    362  1.1  mrg 		  unsigned uid = TYPE_UID (TYPE_MAIN_VARIANT (type));
    363  1.1  mrg 		  if (uid != last_reported_type_uid)
    364  1.1  mrg 		    {
    365  1.1  mrg 		      const char *url
    366  1.1  mrg 			= CHANGES_ROOT_URL "gcc-10/changes.html#empty_base";
    367  1.1  mrg 		      if (empty_base_seen & 1)
    368  1.1  mrg 			inform (input_location,
    369  1.1  mrg 				"parameter passing for argument of type %qT "
    370  1.1  mrg 				"when C++17 is enabled changed to match C++14 "
    371  1.1  mrg 				"%{in GCC 10.1%}", type, url);
    372  1.1  mrg 		      else
    373  1.1  mrg 			inform (input_location,
    374  1.1  mrg 				"parameter passing for argument of type %qT "
    375  1.1  mrg 				"with %<[[no_unique_address]]%> members "
    376  1.1  mrg 				"changed %{in GCC 10.1%}", type, url);
    377  1.1  mrg 		      last_reported_type_uid = uid;
    378  1.1  mrg 		    }
    379  1.1  mrg 		}
    380  1.1  mrg 	      if (zero_width_bf_seen && warn_psabi)
    381  1.1  mrg 		{
    382  1.1  mrg 		  static unsigned last_reported_type_uid;
    383  1.1  mrg 		  unsigned uid = TYPE_UID (TYPE_MAIN_VARIANT (type));
    384  1.1  mrg 		  if (uid != last_reported_type_uid)
    385  1.1  mrg 		    {
    386  1.1  mrg 		      inform (input_location,
    387  1.1  mrg 			      "ELFv2 parameter passing for an argument "
    388  1.1  mrg 			      "containing zero-width bit fields but that is "
    389  1.1  mrg 			      "otherwise a homogeneous aggregate was "
    390  1.1  mrg 			      "corrected in GCC 12");
    391  1.1  mrg 		      last_reported_type_uid = uid;
    392  1.1  mrg 		    }
    393  1.1  mrg 		  if (elt_mode)
    394  1.1  mrg 		    *elt_mode = mode;
    395  1.1  mrg 		  if (n_elts)
    396  1.1  mrg 		    *n_elts = 1;
    397  1.1  mrg 		  return false;
    398  1.1  mrg 		}
    399  1.1  mrg 	      return true;
    400  1.1  mrg 	    }
    401  1.1  mrg 	}
    402  1.1  mrg     }
    403  1.1  mrg 
    404  1.1  mrg   if (elt_mode)
    405  1.1  mrg     *elt_mode = mode;
    406  1.1  mrg   if (n_elts)
    407  1.1  mrg     *n_elts = 1;
    408  1.1  mrg   return false;
    409  1.1  mrg }
    410  1.1  mrg 
    411  1.1  mrg /* Return a nonzero value to say to return the function value in
    412  1.1  mrg    memory, just as large structures are always returned.  TYPE will be
    413  1.1  mrg    the data type of the value, and FNTYPE will be the type of the
    414  1.1  mrg    function doing the returning, or @code{NULL} for libcalls.
    415  1.1  mrg 
    416  1.1  mrg    The AIX ABI for the RS/6000 specifies that all structures are
    417  1.1  mrg    returned in memory.  The Darwin ABI does the same.
    418  1.1  mrg 
    419  1.1  mrg    For the Darwin 64 Bit ABI, a function result can be returned in
    420  1.1  mrg    registers or in memory, depending on the size of the return data
    421  1.1  mrg    type.  If it is returned in registers, the value occupies the same
    422  1.1  mrg    registers as it would if it were the first and only function
    423  1.1  mrg    argument.  Otherwise, the function places its result in memory at
    424  1.1  mrg    the location pointed to by GPR3.
    425  1.1  mrg 
    426  1.1  mrg    The SVR4 ABI specifies that structures <= 8 bytes are returned in r3/r4,
    427  1.1  mrg    but a draft put them in memory, and GCC used to implement the draft
    428  1.1  mrg    instead of the final standard.  Therefore, aix_struct_return
    429  1.1  mrg    controls this instead of DEFAULT_ABI; V.4 targets needing backward
    430  1.1  mrg    compatibility can change DRAFT_V4_STRUCT_RET to override the
    431  1.1  mrg    default, and -m switches get the final word.  See
    432  1.1  mrg    rs6000_option_override_internal for more details.
    433  1.1  mrg 
    434  1.1  mrg    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
    435  1.1  mrg    long double support is enabled.  These values are returned in memory.
    436  1.1  mrg 
    437  1.1  mrg    int_size_in_bytes returns -1 for variable size objects, which go in
    438  1.1  mrg    memory always.  The cast to unsigned makes -1 > 8.  */
    439  1.1  mrg 
    440  1.1  mrg bool
    441  1.1  mrg rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
    442  1.1  mrg {
    443  1.1  mrg   /* We do not allow MMA types being used as return values.  Only report
    444  1.1  mrg      the invalid return value usage the first time we encounter it.  */
    445  1.1  mrg   if (cfun
    446  1.1  mrg       && !cfun->machine->mma_return_type_error
    447  1.1  mrg       && TREE_TYPE (cfun->decl) == fntype
    448  1.1  mrg       && (TYPE_MODE (type) == OOmode || TYPE_MODE (type) == XOmode))
    449  1.1  mrg     {
    450  1.1  mrg       /* Record we have now handled function CFUN, so the next time we
    451  1.1  mrg 	 are called, we do not re-report the same error.  */
    452  1.1  mrg       cfun->machine->mma_return_type_error = true;
    453  1.1  mrg       if (TYPE_CANONICAL (type) != NULL_TREE)
    454  1.1  mrg 	type = TYPE_CANONICAL (type);
    455  1.1  mrg       error ("invalid use of MMA type %qs as a function return value",
    456  1.1  mrg 	     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
    457  1.1  mrg     }
    458  1.1  mrg 
    459  1.1  mrg   /* For the Darwin64 ABI, test if we can fit the return value in regs.  */
    460  1.1  mrg   if (TARGET_MACHO
    461  1.1  mrg       && rs6000_darwin64_abi
    462  1.1  mrg       && TREE_CODE (type) == RECORD_TYPE
    463  1.1  mrg       && int_size_in_bytes (type) > 0)
    464  1.1  mrg     {
    465  1.1  mrg       CUMULATIVE_ARGS valcum;
    466  1.1  mrg       rtx valret;
    467  1.1  mrg 
    468  1.1  mrg       valcum.words = 0;
    469  1.1  mrg       valcum.fregno = FP_ARG_MIN_REG;
    470  1.1  mrg       valcum.vregno = ALTIVEC_ARG_MIN_REG;
    471  1.1  mrg       /* Do a trial code generation as if this were going to be passed
    472  1.1  mrg 	 as an argument; if any part goes in memory, we return NULL.  */
    473  1.1  mrg       valret = rs6000_darwin64_record_arg (&valcum, type, true, true);
    474  1.1  mrg       if (valret)
    475  1.1  mrg 	return false;
    476  1.1  mrg       /* Otherwise fall through to more conventional ABI rules.  */
    477  1.1  mrg     }
    478  1.1  mrg 
    479  1.1  mrg   /* The ELFv2 ABI returns homogeneous VFP aggregates in registers */
    480  1.1  mrg   if (rs6000_discover_homogeneous_aggregate (TYPE_MODE (type), type,
    481  1.1  mrg 					     NULL, NULL))
    482  1.1  mrg     return false;
    483  1.1  mrg 
    484  1.1  mrg   /* The ELFv2 ABI returns aggregates up to 16B in registers */
    485  1.1  mrg   if (DEFAULT_ABI == ABI_ELFv2 && AGGREGATE_TYPE_P (type)
    486  1.1  mrg       && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) <= 16)
    487  1.1  mrg     return false;
    488  1.1  mrg 
    489  1.1  mrg   if (AGGREGATE_TYPE_P (type)
    490  1.1  mrg       && (aix_struct_return
    491  1.1  mrg 	  || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
    492  1.1  mrg     return true;
    493  1.1  mrg 
    494  1.1  mrg   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
    495  1.1  mrg      modes only exist for GCC vector types if -maltivec.  */
    496  1.1  mrg   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
    497  1.1  mrg       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
    498  1.1  mrg     return false;
    499  1.1  mrg 
    500  1.1  mrg   /* Return synthetic vectors in memory.  */
    501  1.1  mrg   if (TREE_CODE (type) == VECTOR_TYPE
    502  1.1  mrg       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
    503  1.1  mrg     {
    504  1.1  mrg       static bool warned_for_return_big_vectors = false;
    505  1.1  mrg       if (!warned_for_return_big_vectors)
    506  1.1  mrg 	{
    507  1.1  mrg 	  warning (OPT_Wpsabi, "GCC vector returned by reference: "
    508  1.1  mrg 		   "non-standard ABI extension with no compatibility "
    509  1.1  mrg 		   "guarantee");
    510  1.1  mrg 	  warned_for_return_big_vectors = true;
    511  1.1  mrg 	}
    512  1.1  mrg       return true;
    513  1.1  mrg     }
    514  1.1  mrg 
    515  1.1  mrg   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD
    516  1.1  mrg       && FLOAT128_IEEE_P (TYPE_MODE (type)))
    517  1.1  mrg     return true;
    518  1.1  mrg 
    519  1.1  mrg   return false;
    520  1.1  mrg }
    521  1.1  mrg 
    522  1.1  mrg /* Specify whether values returned in registers should be at the most
    523  1.1  mrg    significant end of a register.  We want aggregates returned by
    524  1.1  mrg    value to match the way aggregates are passed to functions.  */
    525  1.1  mrg 
    526  1.1  mrg bool
    527  1.1  mrg rs6000_return_in_msb (const_tree valtype)
    528  1.1  mrg {
    529  1.1  mrg   return (DEFAULT_ABI == ABI_ELFv2
    530  1.1  mrg 	  && BYTES_BIG_ENDIAN
    531  1.1  mrg 	  && AGGREGATE_TYPE_P (valtype)
    532  1.1  mrg 	  && (rs6000_function_arg_padding (TYPE_MODE (valtype), valtype)
    533  1.1  mrg 	      == PAD_UPWARD));
    534  1.1  mrg }
    535  1.1  mrg 
    536  1.1  mrg #ifdef HAVE_AS_GNU_ATTRIBUTE
    537  1.1  mrg /* Return TRUE if a call to function FNDECL may be one that
    538  1.1  mrg    potentially affects the function calling ABI of the object file.  */
    539  1.1  mrg 
    540  1.1  mrg static bool
    541  1.1  mrg call_ABI_of_interest (tree fndecl)
    542  1.1  mrg {
    543  1.1  mrg   if (rs6000_gnu_attr && symtab->state == EXPANSION)
    544  1.1  mrg     {
    545  1.1  mrg       struct cgraph_node *c_node;
    546  1.1  mrg 
    547  1.1  mrg       /* Libcalls are always interesting.  */
    548  1.1  mrg       if (fndecl == NULL_TREE)
    549  1.1  mrg 	return true;
    550  1.1  mrg 
    551  1.1  mrg       /* Any call to an external function is interesting.  */
    552  1.1  mrg       if (DECL_EXTERNAL (fndecl))
    553  1.1  mrg 	return true;
    554  1.1  mrg 
    555  1.1  mrg       /* Interesting functions that we are emitting in this object file.  */
    556  1.1  mrg       c_node = cgraph_node::get (fndecl);
    557  1.1  mrg       c_node = c_node->ultimate_alias_target ();
    558  1.1  mrg       return !c_node->only_called_directly_p ();
    559  1.1  mrg     }
    560  1.1  mrg   return false;
    561  1.1  mrg }
    562  1.1  mrg #endif
    563  1.1  mrg 
    564  1.1  mrg /* Initialize a variable CUM of type CUMULATIVE_ARGS
    565  1.1  mrg    for a call to a function whose data type is FNTYPE.
    566  1.1  mrg    For a library call, FNTYPE is 0 and RETURN_MODE the return value mode.
    567  1.1  mrg 
    568  1.1  mrg    For incoming args we set the number of arguments in the prototype large
    569  1.1  mrg    so we never return a PARALLEL.  */
    570  1.1  mrg 
    571  1.1  mrg void
    572  1.1  mrg init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
    573  1.1  mrg 		      rtx libname ATTRIBUTE_UNUSED, int incoming,
    574  1.1  mrg 		      int libcall, int n_named_args,
    575  1.1  mrg 		      tree fndecl,
    576  1.1  mrg 		      machine_mode return_mode ATTRIBUTE_UNUSED)
    577  1.1  mrg {
    578  1.1  mrg   static CUMULATIVE_ARGS zero_cumulative;
    579  1.1  mrg 
    580  1.1  mrg   *cum = zero_cumulative;
    581  1.1  mrg   cum->words = 0;
    582  1.1  mrg   cum->fregno = FP_ARG_MIN_REG;
    583  1.1  mrg   cum->vregno = ALTIVEC_ARG_MIN_REG;
    584  1.1  mrg   cum->prototype = (fntype && prototype_p (fntype));
    585  1.1  mrg   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
    586  1.1  mrg 		      ? CALL_LIBCALL : CALL_NORMAL);
    587  1.1  mrg   cum->sysv_gregno = GP_ARG_MIN_REG;
    588  1.1  mrg   cum->stdarg = stdarg_p (fntype);
    589  1.1  mrg   cum->libcall = libcall;
    590  1.1  mrg 
    591  1.1  mrg   cum->nargs_prototype = 0;
    592  1.1  mrg   if (incoming || cum->prototype)
    593  1.1  mrg     cum->nargs_prototype = n_named_args;
    594  1.1  mrg 
    595  1.1  mrg   /* Check for a longcall attribute.  */
    596  1.1  mrg   if ((!fntype && rs6000_default_long_calls)
    597  1.1  mrg       || (fntype
    598  1.1  mrg 	  && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
    599  1.1  mrg 	  && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
    600  1.1  mrg     cum->call_cookie |= CALL_LONG;
    601  1.1  mrg   else if (DEFAULT_ABI != ABI_DARWIN)
    602  1.1  mrg     {
    603  1.1  mrg       bool is_local = (fndecl
    604  1.1  mrg 		       && !DECL_EXTERNAL (fndecl)
    605  1.1  mrg 		       && !DECL_WEAK (fndecl)
    606  1.1  mrg 		       && (*targetm.binds_local_p) (fndecl));
    607  1.1  mrg       if (is_local)
    608  1.1  mrg 	;
    609  1.1  mrg       else if (flag_plt)
    610  1.1  mrg 	{
    611  1.1  mrg 	  if (fntype
    612  1.1  mrg 	      && lookup_attribute ("noplt", TYPE_ATTRIBUTES (fntype)))
    613  1.1  mrg 	    cum->call_cookie |= CALL_LONG;
    614  1.1  mrg 	}
    615  1.1  mrg       else
    616  1.1  mrg 	{
    617  1.1  mrg 	  if (!(fntype
    618  1.1  mrg 		&& lookup_attribute ("plt", TYPE_ATTRIBUTES (fntype))))
    619  1.1  mrg 	    cum->call_cookie |= CALL_LONG;
    620  1.1  mrg 	}
    621  1.1  mrg     }
    622  1.1  mrg 
    623  1.1  mrg   if (TARGET_DEBUG_ARG)
    624  1.1  mrg     {
    625  1.1  mrg       fprintf (stderr, "\ninit_cumulative_args:");
    626  1.1  mrg       if (fntype)
    627  1.1  mrg 	{
    628  1.1  mrg 	  tree ret_type = TREE_TYPE (fntype);
    629  1.1  mrg 	  fprintf (stderr, " ret code = %s,",
    630  1.1  mrg 		   get_tree_code_name (TREE_CODE (ret_type)));
    631  1.1  mrg 	}
    632  1.1  mrg 
    633  1.1  mrg       if (cum->call_cookie & CALL_LONG)
    634  1.1  mrg 	fprintf (stderr, " longcall,");
    635  1.1  mrg 
    636  1.1  mrg       fprintf (stderr, " proto = %d, nargs = %d\n",
    637  1.1  mrg 	       cum->prototype, cum->nargs_prototype);
    638  1.1  mrg     }
    639  1.1  mrg 
    640  1.1  mrg #ifdef HAVE_AS_GNU_ATTRIBUTE
    641  1.1  mrg   if (TARGET_ELF && (TARGET_64BIT || DEFAULT_ABI == ABI_V4))
    642  1.1  mrg     {
    643  1.1  mrg       cum->escapes = call_ABI_of_interest (fndecl);
    644  1.1  mrg       if (cum->escapes)
    645  1.1  mrg 	{
    646  1.1  mrg 	  tree return_type;
    647  1.1  mrg 
    648  1.1  mrg 	  if (fntype)
    649  1.1  mrg 	    {
    650  1.1  mrg 	      return_type = TREE_TYPE (fntype);
    651  1.1  mrg 	      return_mode = TYPE_MODE (return_type);
    652  1.1  mrg 	    }
    653  1.1  mrg 	  else
    654  1.1  mrg 	    return_type = lang_hooks.types.type_for_mode (return_mode, 0);
    655  1.1  mrg 
    656  1.1  mrg 	  if (return_type != NULL)
    657  1.1  mrg 	    {
    658  1.1  mrg 	      if (TREE_CODE (return_type) == RECORD_TYPE
    659  1.1  mrg 		  && TYPE_TRANSPARENT_AGGR (return_type))
    660  1.1  mrg 		{
    661  1.1  mrg 		  return_type = TREE_TYPE (first_field (return_type));
    662  1.1  mrg 		  return_mode = TYPE_MODE (return_type);
    663  1.1  mrg 		}
    664  1.1  mrg 	      if (AGGREGATE_TYPE_P (return_type)
    665  1.1  mrg 		  && ((unsigned HOST_WIDE_INT) int_size_in_bytes (return_type)
    666  1.1  mrg 		      <= 8))
    667  1.1  mrg 		rs6000_returns_struct = true;
    668  1.1  mrg 	    }
    669  1.1  mrg 	  if (SCALAR_FLOAT_MODE_P (return_mode))
    670  1.1  mrg 	    {
    671  1.1  mrg 	      rs6000_passes_float = true;
    672  1.1  mrg 	      if ((HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT)
    673  1.1  mrg 		  && (FLOAT128_IBM_P (return_mode)
    674  1.1  mrg 		      || FLOAT128_IEEE_P (return_mode)
    675  1.1  mrg 		      || (return_type != NULL
    676  1.1  mrg 			  && (TYPE_MAIN_VARIANT (return_type)
    677  1.1  mrg 			      == long_double_type_node))))
    678  1.1  mrg 		rs6000_passes_long_double = true;
    679  1.1  mrg 	    }
    680  1.1  mrg 	  if (ALTIVEC_OR_VSX_VECTOR_MODE (return_mode))
    681  1.1  mrg 	    rs6000_passes_vector = true;
    682  1.1  mrg 	}
    683  1.1  mrg     }
    684  1.1  mrg #endif
    685  1.1  mrg 
    686  1.1  mrg   if (fntype
    687  1.1  mrg       && !TARGET_ALTIVEC
    688  1.1  mrg       && TARGET_ALTIVEC_ABI
    689  1.1  mrg       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
    690  1.1  mrg     {
    691  1.1  mrg       error ("cannot return value in vector register because"
    692  1.1  mrg 	     " altivec instructions are disabled, use %qs"
    693  1.1  mrg 	     " to enable them", "-maltivec");
    694  1.1  mrg     }
    695  1.1  mrg }
    696  1.1  mrg 
    697  1.1  mrg 
    699  1.1  mrg /* On rs6000, function arguments are promoted, as are function return
    700  1.1  mrg    values.  */
    701  1.1  mrg 
    702  1.1  mrg machine_mode
    703  1.1  mrg rs6000_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
    704  1.1  mrg 			      machine_mode mode,
    705  1.1  mrg 			      int *punsignedp ATTRIBUTE_UNUSED,
    706  1.1  mrg 			      const_tree, int for_return ATTRIBUTE_UNUSED)
    707  1.1  mrg {
    708  1.1  mrg   if (GET_MODE_CLASS (mode) == MODE_INT
    709  1.1  mrg       && GET_MODE_SIZE (mode) < (TARGET_32BIT ? 4 : 8))
    710  1.1  mrg     mode = TARGET_32BIT ? SImode : DImode;
    711  1.1  mrg 
    712  1.1  mrg   return mode;
    713  1.1  mrg }
    714  1.1  mrg 
    715  1.1  mrg /* Return true if TYPE must be passed on the stack and not in registers.  */
    716  1.1  mrg 
    717  1.1  mrg bool
    718  1.1  mrg rs6000_must_pass_in_stack (const function_arg_info &arg)
    719  1.1  mrg {
    720  1.1  mrg   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2 || TARGET_64BIT)
    721  1.1  mrg     return must_pass_in_stack_var_size (arg);
    722  1.1  mrg   else
    723  1.1  mrg     return must_pass_in_stack_var_size_or_pad (arg);
    724  1.1  mrg }
    725  1.1  mrg 
    726  1.1  mrg static inline bool
    727  1.1  mrg is_complex_IBM_long_double (machine_mode mode)
    728  1.1  mrg {
    729  1.1  mrg   return mode == ICmode || (mode == TCmode && FLOAT128_IBM_P (TCmode));
    730  1.1  mrg }
    731  1.1  mrg 
    732  1.1  mrg /* Whether ABI_V4 passes MODE args to a function in floating point
    733  1.1  mrg    registers.  */
    734  1.1  mrg 
    735  1.1  mrg static bool
    736  1.1  mrg abi_v4_pass_in_fpr (machine_mode mode, bool named)
    737  1.1  mrg {
    738  1.1  mrg   if (!TARGET_HARD_FLOAT)
    739  1.1  mrg     return false;
    740  1.1  mrg   if (mode == DFmode)
    741  1.1  mrg     return true;
    742  1.1  mrg   if (mode == SFmode && named)
    743  1.1  mrg     return true;
    744  1.1  mrg   /* ABI_V4 passes complex IBM long double in 8 gprs.
    745  1.1  mrg      Stupid, but we can't change the ABI now.  */
    746  1.1  mrg   if (is_complex_IBM_long_double (mode))
    747  1.1  mrg     return false;
    748  1.1  mrg   if (FLOAT128_2REG_P (mode))
    749  1.1  mrg     return true;
    750  1.1  mrg   if (DECIMAL_FLOAT_MODE_P (mode))
    751  1.1  mrg     return true;
    752  1.1  mrg   return false;
    753  1.1  mrg }
    754  1.1  mrg 
    755  1.1  mrg /* Implement TARGET_FUNCTION_ARG_PADDING.
    756  1.1  mrg 
    757  1.1  mrg    For the AIX ABI structs are always stored left shifted in their
    758  1.1  mrg    argument slot.  */
    759  1.1  mrg 
    760  1.1  mrg pad_direction
    761  1.1  mrg rs6000_function_arg_padding (machine_mode mode, const_tree type)
    762  1.1  mrg {
    763  1.1  mrg #ifndef AGGREGATE_PADDING_FIXED
    764  1.1  mrg #define AGGREGATE_PADDING_FIXED 0
    765  1.1  mrg #endif
    766  1.1  mrg #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
    767  1.1  mrg #define AGGREGATES_PAD_UPWARD_ALWAYS 0
    768  1.1  mrg #endif
    769  1.1  mrg 
    770  1.1  mrg   if (!AGGREGATE_PADDING_FIXED)
    771  1.1  mrg     {
    772  1.1  mrg       /* GCC used to pass structures of the same size as integer types as
    773  1.1  mrg 	 if they were in fact integers, ignoring TARGET_FUNCTION_ARG_PADDING.
    774  1.1  mrg 	 i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
    775  1.1  mrg 	 passed padded downward, except that -mstrict-align further
    776  1.1  mrg 	 muddied the water in that multi-component structures of 2 and 4
    777  1.1  mrg 	 bytes in size were passed padded upward.
    778  1.1  mrg 
    779  1.1  mrg 	 The following arranges for best compatibility with previous
    780  1.1  mrg 	 versions of gcc, but removes the -mstrict-align dependency.  */
    781  1.1  mrg       if (BYTES_BIG_ENDIAN)
    782  1.1  mrg 	{
    783  1.1  mrg 	  HOST_WIDE_INT size = 0;
    784  1.1  mrg 
    785  1.1  mrg 	  if (mode == BLKmode)
    786  1.1  mrg 	    {
    787  1.1  mrg 	      if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
    788  1.1  mrg 		size = int_size_in_bytes (type);
    789  1.1  mrg 	    }
    790  1.1  mrg 	  else
    791  1.1  mrg 	    size = GET_MODE_SIZE (mode);
    792  1.1  mrg 
    793  1.1  mrg 	  if (size == 1 || size == 2 || size == 4)
    794  1.1  mrg 	    return PAD_DOWNWARD;
    795  1.1  mrg 	}
    796  1.1  mrg       return PAD_UPWARD;
    797  1.1  mrg     }
    798  1.1  mrg 
    799  1.1  mrg   if (AGGREGATES_PAD_UPWARD_ALWAYS)
    800  1.1  mrg     {
    801  1.1  mrg       if (type != 0 && AGGREGATE_TYPE_P (type))
    802  1.1  mrg 	return PAD_UPWARD;
    803  1.1  mrg     }
    804  1.1  mrg 
    805  1.1  mrg   /* Fall back to the default.  */
    806  1.1  mrg   return default_function_arg_padding (mode, type);
    807  1.1  mrg }
    808  1.1  mrg 
    809  1.1  mrg /* If defined, a C expression that gives the alignment boundary, in bits,
    810  1.1  mrg    of an argument with the specified mode and type.  If it is not defined,
    811  1.1  mrg    PARM_BOUNDARY is used for all arguments.
    812  1.1  mrg 
    813  1.1  mrg    V.4 wants long longs and doubles to be double word aligned.  Just
    814  1.1  mrg    testing the mode size is a boneheaded way to do this as it means
    815  1.1  mrg    that other types such as complex int are also double word aligned.
    816  1.1  mrg    However, we're stuck with this because changing the ABI might break
    817  1.1  mrg    existing library interfaces.
    818  1.1  mrg 
    819  1.1  mrg    Quadword align Altivec/VSX vectors.
    820  1.1  mrg    Quadword align large synthetic vector types.   */
    821  1.1  mrg 
    822  1.1  mrg unsigned int
    823  1.1  mrg rs6000_function_arg_boundary (machine_mode mode, const_tree type)
    824  1.1  mrg {
    825  1.1  mrg   machine_mode elt_mode;
    826  1.1  mrg   int n_elts;
    827  1.1  mrg 
    828  1.1  mrg   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
    829  1.1  mrg 
    830  1.1  mrg   if (DEFAULT_ABI == ABI_V4
    831  1.1  mrg       && (GET_MODE_SIZE (mode) == 8
    832  1.1  mrg 	  || (TARGET_HARD_FLOAT
    833  1.1  mrg 	      && !is_complex_IBM_long_double (mode)
    834  1.1  mrg 	      && FLOAT128_2REG_P (mode))))
    835  1.1  mrg     return 64;
    836  1.1  mrg   else if (FLOAT128_VECTOR_P (mode))
    837  1.1  mrg     return 128;
    838  1.1  mrg   else if (type && TREE_CODE (type) == VECTOR_TYPE
    839  1.1  mrg 	   && int_size_in_bytes (type) >= 8
    840  1.1  mrg 	   && int_size_in_bytes (type) < 16)
    841  1.1  mrg     return 64;
    842  1.1  mrg   else if (ALTIVEC_OR_VSX_VECTOR_MODE (elt_mode)
    843  1.1  mrg 	   || (type && TREE_CODE (type) == VECTOR_TYPE
    844  1.1  mrg 	       && int_size_in_bytes (type) >= 16))
    845  1.1  mrg     return 128;
    846  1.1  mrg 
    847  1.1  mrg   /* Aggregate types that need > 8 byte alignment are quadword-aligned
    848  1.1  mrg      in the parameter area in the ELFv2 ABI, and in the AIX ABI unless
    849  1.1  mrg      -mcompat-align-parm is used.  */
    850  1.1  mrg   if (((DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm)
    851  1.1  mrg        || DEFAULT_ABI == ABI_ELFv2)
    852  1.1  mrg       && type && TYPE_ALIGN (type) > 64)
    853  1.1  mrg     {
    854  1.1  mrg       /* "Aggregate" means any AGGREGATE_TYPE except for single-element
    855  1.1  mrg          or homogeneous float/vector aggregates here.  We already handled
    856  1.1  mrg          vector aggregates above, but still need to check for float here. */
    857  1.1  mrg       if (AGGREGATE_TYPE_P (type)
    858  1.1  mrg 	  && !SCALAR_FLOAT_MODE_P (elt_mode))
    859  1.1  mrg 	return 128;
    860  1.1  mrg     }
    861  1.1  mrg 
    862  1.1  mrg   /* Similar for the Darwin64 ABI.  Note that for historical reasons we
    863  1.1  mrg      implement the "aggregate type" check as a BLKmode check here; this
    864  1.1  mrg      means certain aggregate types are in fact not aligned.  */
    865  1.1  mrg   if (TARGET_MACHO && rs6000_darwin64_abi
    866  1.1  mrg       && mode == BLKmode
    867  1.1  mrg       && type && TYPE_ALIGN (type) > 64)
    868  1.1  mrg     return 128;
    869  1.1  mrg 
    870  1.1  mrg   return PARM_BOUNDARY;
    871  1.1  mrg }
    872  1.1  mrg 
    873  1.1  mrg /* The offset in words to the start of the parameter save area.  */
    874  1.1  mrg 
    875  1.1  mrg static unsigned int
    876  1.1  mrg rs6000_parm_offset (void)
    877  1.1  mrg {
    878  1.1  mrg   return (DEFAULT_ABI == ABI_V4 ? 2
    879  1.1  mrg 	  : DEFAULT_ABI == ABI_ELFv2 ? 4
    880  1.1  mrg 	  : 6);
    881  1.1  mrg }
    882  1.1  mrg 
    883  1.1  mrg /* For a function parm of MODE and TYPE, return the starting word in
    884  1.1  mrg    the parameter area.  NWORDS of the parameter area are already used.  */
    885  1.1  mrg 
    886  1.1  mrg static unsigned int
    887  1.1  mrg rs6000_parm_start (machine_mode mode, const_tree type,
    888  1.1  mrg 		   unsigned int nwords)
    889  1.1  mrg {
    890  1.1  mrg   unsigned int align;
    891  1.1  mrg 
    892  1.1  mrg   align = rs6000_function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
    893  1.1  mrg   return nwords + (-(rs6000_parm_offset () + nwords) & align);
    894  1.1  mrg }
    895  1.1  mrg 
    896  1.1  mrg /* Compute the size (in words) of a function argument.  */
    897  1.1  mrg 
    898  1.1  mrg static unsigned long
    899  1.1  mrg rs6000_arg_size (machine_mode mode, const_tree type)
    900  1.1  mrg {
    901  1.1  mrg   unsigned long size;
    902  1.1  mrg 
    903  1.1  mrg   if (mode != BLKmode)
    904  1.1  mrg     size = GET_MODE_SIZE (mode);
    905  1.1  mrg   else
    906  1.1  mrg     size = int_size_in_bytes (type);
    907  1.1  mrg 
    908  1.1  mrg   if (TARGET_32BIT)
    909  1.1  mrg     return (size + 3) >> 2;
    910  1.1  mrg   else
    911  1.1  mrg     return (size + 7) >> 3;
    912  1.1  mrg }
    913  1.1  mrg 
    914  1.1  mrg /* Use this to flush pending int fields.  */
    916  1.1  mrg 
    917  1.1  mrg static void
    918  1.1  mrg rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
    919  1.1  mrg 					  HOST_WIDE_INT bitpos, int final)
    920  1.1  mrg {
    921  1.1  mrg   unsigned int startbit, endbit;
    922  1.1  mrg   int intregs, intoffset;
    923  1.1  mrg 
    924  1.1  mrg   /* Handle the situations where a float is taking up the first half
    925  1.1  mrg      of the GPR, and the other half is empty (typically due to
    926  1.1  mrg      alignment restrictions). We can detect this by a 8-byte-aligned
    927  1.1  mrg      int field, or by seeing that this is the final flush for this
    928  1.1  mrg      argument. Count the word and continue on.  */
    929  1.1  mrg   if (cum->floats_in_gpr == 1
    930  1.1  mrg       && (cum->intoffset % 64 == 0
    931  1.1  mrg 	  || (cum->intoffset == -1 && final)))
    932  1.1  mrg     {
    933  1.1  mrg       cum->words++;
    934  1.1  mrg       cum->floats_in_gpr = 0;
    935  1.1  mrg     }
    936  1.1  mrg 
    937  1.1  mrg   if (cum->intoffset == -1)
    938  1.1  mrg     return;
    939  1.1  mrg 
    940  1.1  mrg   intoffset = cum->intoffset;
    941  1.1  mrg   cum->intoffset = -1;
    942  1.1  mrg   cum->floats_in_gpr = 0;
    943  1.1  mrg 
    944  1.1  mrg   if (intoffset % BITS_PER_WORD != 0)
    945  1.1  mrg     {
    946  1.1  mrg       unsigned int bits = BITS_PER_WORD - intoffset % BITS_PER_WORD;
    947  1.1  mrg       if (!int_mode_for_size (bits, 0).exists ())
    948  1.1  mrg 	{
    949  1.1  mrg 	  /* We couldn't find an appropriate mode, which happens,
    950  1.1  mrg 	     e.g., in packed structs when there are 3 bytes to load.
    951  1.1  mrg 	     Back intoffset back to the beginning of the word in this
    952  1.1  mrg 	     case.  */
    953  1.1  mrg 	  intoffset = ROUND_DOWN (intoffset, BITS_PER_WORD);
    954  1.1  mrg 	}
    955  1.1  mrg     }
    956  1.1  mrg 
    957  1.1  mrg   startbit = ROUND_DOWN (intoffset, BITS_PER_WORD);
    958  1.1  mrg   endbit = ROUND_UP (bitpos, BITS_PER_WORD);
    959  1.1  mrg   intregs = (endbit - startbit) / BITS_PER_WORD;
    960  1.1  mrg   cum->words += intregs;
    961  1.1  mrg   /* words should be unsigned. */
    962  1.1  mrg   if ((unsigned)cum->words < (endbit/BITS_PER_WORD))
    963  1.1  mrg     {
    964  1.1  mrg       int pad = (endbit/BITS_PER_WORD) - cum->words;
    965  1.1  mrg       cum->words += pad;
    966  1.1  mrg     }
    967  1.1  mrg }
    968  1.1  mrg 
    969  1.1  mrg /* The darwin64 ABI calls for us to recurse down through structs,
    970  1.1  mrg    looking for elements passed in registers.  Unfortunately, we have
    971  1.1  mrg    to track int register count here also because of misalignments
    972  1.1  mrg    in powerpc alignment mode.  */
    973  1.1  mrg 
    974  1.1  mrg static void
    975  1.1  mrg rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
    976  1.1  mrg 					    const_tree type,
    977  1.1  mrg 					    HOST_WIDE_INT startbitpos)
    978  1.1  mrg {
    979  1.1  mrg   tree f;
    980  1.1  mrg 
    981  1.1  mrg   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
    982  1.1  mrg     if (TREE_CODE (f) == FIELD_DECL)
    983  1.1  mrg       {
    984  1.1  mrg 	HOST_WIDE_INT bitpos = startbitpos;
    985  1.1  mrg 	tree ftype = TREE_TYPE (f);
    986  1.1  mrg 	machine_mode mode;
    987  1.1  mrg 	if (ftype == error_mark_node)
    988  1.1  mrg 	  continue;
    989  1.1  mrg 	mode = TYPE_MODE (ftype);
    990  1.1  mrg 
    991  1.1  mrg 	if (DECL_SIZE (f) != 0
    992  1.1  mrg 	    && tree_fits_uhwi_p (bit_position (f)))
    993  1.1  mrg 	  bitpos += int_bit_position (f);
    994  1.1  mrg 
    995  1.1  mrg 	/* ??? FIXME: else assume zero offset.  */
    996  1.1  mrg 
    997  1.1  mrg 	if (TREE_CODE (ftype) == RECORD_TYPE)
    998  1.1  mrg 	  rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
    999  1.1  mrg 	else if (USE_FP_FOR_ARG_P (cum, mode))
   1000  1.1  mrg 	  {
   1001  1.1  mrg 	    unsigned n_fpregs = (GET_MODE_SIZE (mode) + 7) >> 3;
   1002  1.1  mrg 	    rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
   1003  1.1  mrg 	    cum->fregno += n_fpregs;
   1004  1.1  mrg 	    /* Single-precision floats present a special problem for
   1005  1.1  mrg 	       us, because they are smaller than an 8-byte GPR, and so
   1006  1.1  mrg 	       the structure-packing rules combined with the standard
   1007  1.1  mrg 	       varargs behavior mean that we want to pack float/float
   1008  1.1  mrg 	       and float/int combinations into a single register's
   1009  1.1  mrg 	       space. This is complicated by the arg advance flushing,
   1010  1.1  mrg 	       which works on arbitrarily large groups of int-type
   1011  1.1  mrg 	       fields.  */
   1012  1.1  mrg 	    if (mode == SFmode)
   1013  1.1  mrg 	      {
   1014  1.1  mrg 		if (cum->floats_in_gpr == 1)
   1015  1.1  mrg 		  {
   1016  1.1  mrg 		    /* Two floats in a word; count the word and reset
   1017  1.1  mrg 		       the float count.  */
   1018  1.1  mrg 		    cum->words++;
   1019  1.1  mrg 		    cum->floats_in_gpr = 0;
   1020  1.1  mrg 		  }
   1021  1.1  mrg 		else if (bitpos % 64 == 0)
   1022  1.1  mrg 		  {
   1023  1.1  mrg 		    /* A float at the beginning of an 8-byte word;
   1024  1.1  mrg 		       count it and put off adjusting cum->words until
   1025  1.1  mrg 		       we see if a arg advance flush is going to do it
   1026  1.1  mrg 		       for us.  */
   1027  1.1  mrg 		    cum->floats_in_gpr++;
   1028  1.1  mrg 		  }
   1029  1.1  mrg 		else
   1030  1.1  mrg 		  {
   1031  1.1  mrg 		    /* The float is at the end of a word, preceded
   1032  1.1  mrg 		       by integer fields, so the arg advance flush
   1033  1.1  mrg 		       just above has already set cum->words and
   1034  1.1  mrg 		       everything is taken care of.  */
   1035  1.1  mrg 		  }
   1036  1.1  mrg 	      }
   1037  1.1  mrg 	    else
   1038  1.1  mrg 	      cum->words += n_fpregs;
   1039  1.1  mrg 	  }
   1040  1.1  mrg 	else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, 1))
   1041  1.1  mrg 	  {
   1042  1.1  mrg 	    rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
   1043  1.1  mrg 	    cum->vregno++;
   1044  1.1  mrg 	    cum->words += 2;
   1045  1.1  mrg 	  }
   1046  1.1  mrg 	else if (cum->intoffset == -1)
   1047  1.1  mrg 	  cum->intoffset = bitpos;
   1048  1.1  mrg       }
   1049  1.1  mrg }
   1050  1.1  mrg 
   1051  1.1  mrg /* Check for an item that needs to be considered specially under the darwin 64
   1052  1.1  mrg    bit ABI.  These are record types where the mode is BLK or the structure is
   1053  1.1  mrg    8 bytes in size.  */
   1054  1.1  mrg int
   1055  1.1  mrg rs6000_darwin64_struct_check_p (machine_mode mode, const_tree type)
   1056  1.1  mrg {
   1057  1.1  mrg   return rs6000_darwin64_abi
   1058  1.1  mrg 	 && ((mode == BLKmode
   1059  1.1  mrg 	      && TREE_CODE (type) == RECORD_TYPE
   1060  1.1  mrg 	      && int_size_in_bytes (type) > 0)
   1061  1.1  mrg 	  || (type && TREE_CODE (type) == RECORD_TYPE
   1062  1.1  mrg 	      && int_size_in_bytes (type) == 8)) ? 1 : 0;
   1063  1.1  mrg }
   1064  1.1  mrg 
   1065  1.1  mrg /* Update the data in CUM to advance over an argument
   1066  1.1  mrg    of mode MODE and data type TYPE.
   1067  1.1  mrg    (TYPE is null for libcalls where that information may not be available.)
   1068  1.1  mrg 
   1069  1.1  mrg    Note that for args passed by reference, function_arg will be called
   1070  1.1  mrg    with MODE and TYPE set to that of the pointer to the arg, not the arg
   1071  1.1  mrg    itself.  */
   1072  1.1  mrg 
   1073  1.1  mrg static void
   1074  1.1  mrg rs6000_function_arg_advance_1 (CUMULATIVE_ARGS *cum, machine_mode mode,
   1075  1.1  mrg 			       const_tree type, bool named, int depth)
   1076  1.1  mrg {
   1077  1.1  mrg   machine_mode elt_mode;
   1078  1.1  mrg   int n_elts;
   1079  1.1  mrg 
   1080  1.1  mrg   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
   1081  1.1  mrg 
   1082  1.1  mrg   /* Only tick off an argument if we're not recursing.  */
   1083  1.1  mrg   if (depth == 0)
   1084  1.1  mrg     cum->nargs_prototype--;
   1085  1.1  mrg 
   1086  1.1  mrg #ifdef HAVE_AS_GNU_ATTRIBUTE
   1087  1.1  mrg   if (TARGET_ELF && (TARGET_64BIT || DEFAULT_ABI == ABI_V4)
   1088  1.1  mrg       && cum->escapes)
   1089  1.1  mrg     {
   1090  1.1  mrg       if (SCALAR_FLOAT_MODE_P (mode))
   1091  1.1  mrg 	{
   1092  1.1  mrg 	  rs6000_passes_float = true;
   1093  1.1  mrg 	  if ((HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT)
   1094  1.1  mrg 	      && (FLOAT128_IBM_P (mode)
   1095  1.1  mrg 		  || FLOAT128_IEEE_P (mode)
   1096  1.1  mrg 		  || (type != NULL
   1097  1.1  mrg 		      && TYPE_MAIN_VARIANT (type) == long_double_type_node)))
   1098  1.1  mrg 	    rs6000_passes_long_double = true;
   1099  1.1  mrg 	}
   1100  1.1  mrg       if (named && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
   1101  1.1  mrg 	rs6000_passes_vector = true;
   1102  1.1  mrg     }
   1103  1.1  mrg #endif
   1104  1.1  mrg 
   1105  1.1  mrg   if (TARGET_ALTIVEC_ABI
   1106  1.1  mrg       && (ALTIVEC_OR_VSX_VECTOR_MODE (elt_mode)
   1107  1.1  mrg 	  || (type && TREE_CODE (type) == VECTOR_TYPE
   1108  1.1  mrg 	      && int_size_in_bytes (type) == 16)))
   1109  1.1  mrg     {
   1110  1.1  mrg       bool stack = false;
   1111  1.1  mrg 
   1112  1.1  mrg       if (USE_ALTIVEC_FOR_ARG_P (cum, elt_mode, named))
   1113  1.1  mrg 	{
   1114  1.1  mrg 	  cum->vregno += n_elts;
   1115  1.1  mrg 
   1116  1.1  mrg 	  /* If we are not splitting Complex IEEE128 args then account for the
   1117  1.1  mrg 	     fact that they are passed in 2 VSX regs. */
   1118  1.1  mrg 	  if (!targetm.calls.split_complex_arg && type
   1119  1.1  mrg 	      && TREE_CODE (type) == COMPLEX_TYPE && elt_mode == KCmode)
   1120  1.1  mrg 	    cum->vregno++;
   1121  1.1  mrg 
   1122  1.1  mrg 	  if (!TARGET_ALTIVEC)
   1123  1.1  mrg 	    error ("cannot pass argument in vector register because"
   1124  1.1  mrg 		   " altivec instructions are disabled, use %qs"
   1125  1.1  mrg 		   " to enable them", "-maltivec");
   1126  1.1  mrg 
   1127  1.1  mrg 	  /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
   1128  1.1  mrg 	     even if it is going to be passed in a vector register.
   1129  1.1  mrg 	     Darwin does the same for variable-argument functions.  */
   1130  1.1  mrg 	  if (((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
   1131  1.1  mrg 	       && TARGET_64BIT)
   1132  1.1  mrg 	      || (cum->stdarg && DEFAULT_ABI != ABI_V4))
   1133  1.1  mrg 	    stack = true;
   1134  1.1  mrg 	}
   1135  1.1  mrg       else
   1136  1.1  mrg 	stack = true;
   1137  1.1  mrg 
   1138  1.1  mrg       if (stack)
   1139  1.1  mrg 	{
   1140  1.1  mrg 	  int align;
   1141  1.1  mrg 
   1142  1.1  mrg 	  /* Vector parameters must be 16-byte aligned.  In 32-bit
   1143  1.1  mrg 	     mode this means we need to take into account the offset
   1144  1.1  mrg 	     to the parameter save area.  In 64-bit mode, they just
   1145  1.1  mrg 	     have to start on an even word, since the parameter save
   1146  1.1  mrg 	     area is 16-byte aligned.  */
   1147  1.1  mrg 	  if (TARGET_32BIT)
   1148  1.1  mrg 	    align = -(rs6000_parm_offset () + cum->words) & 3;
   1149  1.1  mrg 	  else
   1150  1.1  mrg 	    align = cum->words & 1;
   1151  1.1  mrg 	  cum->words += align + rs6000_arg_size (mode, type);
   1152  1.1  mrg 
   1153  1.1  mrg 	  if (TARGET_DEBUG_ARG)
   1154  1.1  mrg 	    {
   1155  1.1  mrg 	      fprintf (stderr, "function_adv: words = %2d, align=%d, ",
   1156  1.1  mrg 		       cum->words, align);
   1157  1.1  mrg 	      fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
   1158  1.1  mrg 		       cum->nargs_prototype, cum->prototype,
   1159  1.1  mrg 		       GET_MODE_NAME (mode));
   1160  1.1  mrg 	    }
   1161  1.1  mrg 	}
   1162  1.1  mrg     }
   1163  1.1  mrg   else if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
   1164  1.1  mrg     {
   1165  1.1  mrg       int size = int_size_in_bytes (type);
   1166  1.1  mrg       /* Variable sized types have size == -1 and are
   1167  1.1  mrg 	 treated as if consisting entirely of ints.
   1168  1.1  mrg 	 Pad to 16 byte boundary if needed.  */
   1169  1.1  mrg       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
   1170  1.1  mrg 	  && (cum->words % 2) != 0)
   1171  1.1  mrg 	cum->words++;
   1172  1.1  mrg       /* For varargs, we can just go up by the size of the struct. */
   1173  1.1  mrg       if (!named)
   1174  1.1  mrg 	cum->words += (size + 7) / 8;
   1175  1.1  mrg       else
   1176  1.1  mrg 	{
   1177  1.1  mrg 	  /* It is tempting to say int register count just goes up by
   1178  1.1  mrg 	     sizeof(type)/8, but this is wrong in a case such as
   1179  1.1  mrg 	     { int; double; int; } [powerpc alignment].  We have to
   1180  1.1  mrg 	     grovel through the fields for these too.  */
   1181  1.1  mrg 	  cum->intoffset = 0;
   1182  1.1  mrg 	  cum->floats_in_gpr = 0;
   1183  1.1  mrg 	  rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
   1184  1.1  mrg 	  rs6000_darwin64_record_arg_advance_flush (cum,
   1185  1.1  mrg 						    size * BITS_PER_UNIT, 1);
   1186  1.1  mrg 	}
   1187  1.1  mrg 	  if (TARGET_DEBUG_ARG)
   1188  1.1  mrg 	    {
   1189  1.1  mrg 	      fprintf (stderr, "function_adv: words = %2d, align=%d, size=%d",
   1190  1.1  mrg 		       cum->words, TYPE_ALIGN (type), size);
   1191  1.1  mrg 	      fprintf (stderr,
   1192  1.1  mrg 	           "nargs = %4d, proto = %d, mode = %4s (darwin64 abi)\n",
   1193  1.1  mrg 		       cum->nargs_prototype, cum->prototype,
   1194  1.1  mrg 		       GET_MODE_NAME (mode));
   1195  1.1  mrg 	    }
   1196  1.1  mrg     }
   1197  1.1  mrg   else if (DEFAULT_ABI == ABI_V4)
   1198  1.1  mrg     {
   1199  1.1  mrg       if (abi_v4_pass_in_fpr (mode, named))
   1200  1.1  mrg 	{
   1201  1.1  mrg 	  /* _Decimal128 must use an even/odd register pair.  This assumes
   1202  1.1  mrg 	     that the register number is odd when fregno is odd.  */
   1203  1.1  mrg 	  if (mode == TDmode && (cum->fregno % 2) == 1)
   1204  1.1  mrg 	    cum->fregno++;
   1205  1.1  mrg 
   1206  1.1  mrg 	  if (cum->fregno + (FLOAT128_2REG_P (mode) ? 1 : 0)
   1207  1.1  mrg 	      <= FP_ARG_V4_MAX_REG)
   1208  1.1  mrg 	    cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
   1209  1.1  mrg 	  else
   1210  1.1  mrg 	    {
   1211  1.1  mrg 	      cum->fregno = FP_ARG_V4_MAX_REG + 1;
   1212  1.1  mrg 	      if (mode == DFmode || FLOAT128_IBM_P (mode)
   1213  1.1  mrg 		  || mode == DDmode || mode == TDmode)
   1214  1.1  mrg 		cum->words += cum->words & 1;
   1215  1.1  mrg 	      cum->words += rs6000_arg_size (mode, type);
   1216  1.1  mrg 	    }
   1217  1.1  mrg 	}
   1218  1.1  mrg       else
   1219  1.1  mrg 	{
   1220  1.1  mrg 	  int n_words = rs6000_arg_size (mode, type);
   1221  1.1  mrg 	  int gregno = cum->sysv_gregno;
   1222  1.1  mrg 
   1223  1.1  mrg 	  /* Long long is put in (r3,r4), (r5,r6), (r7,r8) or (r9,r10).
   1224  1.1  mrg 	     As does any other 2 word item such as complex int due to a
   1225  1.1  mrg 	     historical mistake.  */
   1226  1.1  mrg 	  if (n_words == 2)
   1227  1.1  mrg 	    gregno += (1 - gregno) & 1;
   1228  1.1  mrg 
   1229  1.1  mrg 	  /* Multi-reg args are not split between registers and stack.  */
   1230  1.1  mrg 	  if (gregno + n_words - 1 > GP_ARG_MAX_REG)
   1231  1.1  mrg 	    {
   1232  1.1  mrg 	      /* Long long is aligned on the stack.  So are other 2 word
   1233  1.1  mrg 		 items such as complex int due to a historical mistake.  */
   1234  1.1  mrg 	      if (n_words == 2)
   1235  1.1  mrg 		cum->words += cum->words & 1;
   1236  1.1  mrg 	      cum->words += n_words;
   1237  1.1  mrg 	    }
   1238  1.1  mrg 
   1239  1.1  mrg 	  /* Note: continuing to accumulate gregno past when we've started
   1240  1.1  mrg 	     spilling to the stack indicates the fact that we've started
   1241  1.1  mrg 	     spilling to the stack to expand_builtin_saveregs.  */
   1242  1.1  mrg 	  cum->sysv_gregno = gregno + n_words;
   1243  1.1  mrg 	}
   1244  1.1  mrg 
   1245  1.1  mrg       if (TARGET_DEBUG_ARG)
   1246  1.1  mrg 	{
   1247  1.1  mrg 	  fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
   1248  1.1  mrg 		   cum->words, cum->fregno);
   1249  1.1  mrg 	  fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
   1250  1.1  mrg 		   cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
   1251  1.1  mrg 	  fprintf (stderr, "mode = %4s, named = %d\n",
   1252  1.1  mrg 		   GET_MODE_NAME (mode), named);
   1253  1.1  mrg 	}
   1254  1.1  mrg     }
   1255  1.1  mrg   else
   1256  1.1  mrg     {
   1257  1.1  mrg       int n_words = rs6000_arg_size (mode, type);
   1258  1.1  mrg       int start_words = cum->words;
   1259  1.1  mrg       int align_words = rs6000_parm_start (mode, type, start_words);
   1260  1.1  mrg 
   1261  1.1  mrg       cum->words = align_words + n_words;
   1262  1.1  mrg 
   1263  1.1  mrg       if (SCALAR_FLOAT_MODE_P (elt_mode) && TARGET_HARD_FLOAT)
   1264  1.1  mrg 	{
   1265  1.1  mrg 	  /* _Decimal128 must be passed in an even/odd float register pair.
   1266  1.1  mrg 	     This assumes that the register number is odd when fregno is
   1267  1.1  mrg 	     odd.  */
   1268  1.1  mrg 	  if (elt_mode == TDmode && (cum->fregno % 2) == 1)
   1269  1.1  mrg 	    cum->fregno++;
   1270  1.1  mrg 	  cum->fregno += n_elts * ((GET_MODE_SIZE (elt_mode) + 7) >> 3);
   1271  1.1  mrg 	}
   1272  1.1  mrg 
   1273  1.1  mrg       if (TARGET_DEBUG_ARG)
   1274  1.1  mrg 	{
   1275  1.1  mrg 	  fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
   1276  1.1  mrg 		   cum->words, cum->fregno);
   1277  1.1  mrg 	  fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
   1278  1.1  mrg 		   cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
   1279  1.1  mrg 	  fprintf (stderr, "named = %d, align = %d, depth = %d\n",
   1280  1.1  mrg 		   named, align_words - start_words, depth);
   1281  1.1  mrg 	}
   1282  1.1  mrg     }
   1283  1.1  mrg }
   1284  1.1  mrg 
   1285  1.1  mrg void
   1286  1.1  mrg rs6000_function_arg_advance (cumulative_args_t cum,
   1287  1.1  mrg 			     const function_arg_info &arg)
   1288  1.1  mrg {
   1289  1.1  mrg   rs6000_function_arg_advance_1 (get_cumulative_args (cum),
   1290  1.1  mrg 				 arg.mode, arg.type, arg.named, 0);
   1291  1.1  mrg }
   1292  1.1  mrg 
   1293  1.1  mrg /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
   1294  1.1  mrg    structure between cum->intoffset and bitpos to integer registers.  */
   1295  1.1  mrg 
   1296  1.1  mrg static void
   1297  1.1  mrg rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
   1298  1.1  mrg 				  HOST_WIDE_INT bitpos, rtx rvec[], int *k)
   1299  1.1  mrg {
   1300  1.1  mrg   machine_mode mode;
   1301  1.1  mrg   unsigned int regno;
   1302  1.1  mrg   unsigned int startbit, endbit;
   1303  1.1  mrg   int this_regno, intregs, intoffset;
   1304  1.1  mrg   rtx reg;
   1305  1.1  mrg 
   1306  1.1  mrg   if (cum->intoffset == -1)
   1307  1.1  mrg     return;
   1308  1.1  mrg 
   1309  1.1  mrg   intoffset = cum->intoffset;
   1310  1.1  mrg   cum->intoffset = -1;
   1311  1.1  mrg 
   1312  1.1  mrg   /* If this is the trailing part of a word, try to only load that
   1313  1.1  mrg      much into the register.  Otherwise load the whole register.  Note
   1314  1.1  mrg      that in the latter case we may pick up unwanted bits.  It's not a
   1315  1.1  mrg      problem at the moment but may wish to revisit.  */
   1316  1.1  mrg 
   1317  1.1  mrg   if (intoffset % BITS_PER_WORD != 0)
   1318  1.1  mrg     {
   1319  1.1  mrg       unsigned int bits = BITS_PER_WORD - intoffset % BITS_PER_WORD;
   1320  1.1  mrg       if (!int_mode_for_size (bits, 0).exists (&mode))
   1321  1.1  mrg 	{
   1322  1.1  mrg 	  /* We couldn't find an appropriate mode, which happens,
   1323  1.1  mrg 	     e.g., in packed structs when there are 3 bytes to load.
   1324  1.1  mrg 	     Back intoffset back to the beginning of the word in this
   1325  1.1  mrg 	     case.  */
   1326  1.1  mrg 	  intoffset = ROUND_DOWN (intoffset, BITS_PER_WORD);
   1327  1.1  mrg 	  mode = word_mode;
   1328  1.1  mrg 	}
   1329  1.1  mrg     }
   1330  1.1  mrg   else
   1331  1.1  mrg     mode = word_mode;
   1332  1.1  mrg 
   1333  1.1  mrg   startbit = ROUND_DOWN (intoffset, BITS_PER_WORD);
   1334  1.1  mrg   endbit = ROUND_UP (bitpos, BITS_PER_WORD);
   1335  1.1  mrg   intregs = (endbit - startbit) / BITS_PER_WORD;
   1336  1.1  mrg   this_regno = cum->words + intoffset / BITS_PER_WORD;
   1337  1.1  mrg 
   1338  1.1  mrg   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
   1339  1.1  mrg     cum->use_stack = 1;
   1340  1.1  mrg 
   1341  1.1  mrg   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
   1342  1.1  mrg   if (intregs <= 0)
   1343  1.1  mrg     return;
   1344  1.1  mrg 
   1345  1.1  mrg   intoffset /= BITS_PER_UNIT;
   1346  1.1  mrg   do
   1347  1.1  mrg     {
   1348  1.1  mrg       regno = GP_ARG_MIN_REG + this_regno;
   1349  1.1  mrg       reg = gen_rtx_REG (mode, regno);
   1350  1.1  mrg       rvec[(*k)++] =
   1351  1.1  mrg 	gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
   1352  1.1  mrg 
   1353  1.1  mrg       this_regno += 1;
   1354  1.1  mrg       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
   1355  1.1  mrg       mode = word_mode;
   1356  1.1  mrg       intregs -= 1;
   1357  1.1  mrg     }
   1358  1.1  mrg   while (intregs > 0);
   1359  1.1  mrg }
   1360  1.1  mrg 
   1361  1.1  mrg /* Recursive workhorse for the following.  */
   1362  1.1  mrg 
   1363  1.1  mrg static void
   1364  1.1  mrg rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
   1365  1.1  mrg 				    HOST_WIDE_INT startbitpos, rtx rvec[],
   1366  1.1  mrg 				    int *k)
   1367  1.1  mrg {
   1368  1.1  mrg   tree f;
   1369  1.1  mrg 
   1370  1.1  mrg   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
   1371  1.1  mrg     if (TREE_CODE (f) == FIELD_DECL)
   1372  1.1  mrg       {
   1373  1.1  mrg 	HOST_WIDE_INT bitpos = startbitpos;
   1374  1.1  mrg 	tree ftype = TREE_TYPE (f);
   1375  1.1  mrg 	machine_mode mode;
   1376  1.1  mrg 	if (ftype == error_mark_node)
   1377  1.1  mrg 	  continue;
   1378  1.1  mrg 	mode = TYPE_MODE (ftype);
   1379  1.1  mrg 
   1380  1.1  mrg 	if (DECL_SIZE (f) != 0
   1381  1.1  mrg 	    && tree_fits_uhwi_p (bit_position (f)))
   1382  1.1  mrg 	  bitpos += int_bit_position (f);
   1383  1.1  mrg 
   1384  1.1  mrg 	/* ??? FIXME: else assume zero offset.  */
   1385  1.1  mrg 
   1386  1.1  mrg 	if (TREE_CODE (ftype) == RECORD_TYPE)
   1387  1.1  mrg 	  rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
   1388  1.1  mrg 	else if (cum->named && USE_FP_FOR_ARG_P (cum, mode))
   1389  1.1  mrg 	  {
   1390  1.1  mrg 	    unsigned n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
   1391  1.1  mrg #if 0
   1392  1.1  mrg 	    switch (mode)
   1393  1.1  mrg 	      {
   1394  1.1  mrg 	      case E_SCmode: mode = SFmode; break;
   1395  1.1  mrg 	      case E_DCmode: mode = DFmode; break;
   1396  1.1  mrg 	      case E_TCmode: mode = TFmode; break;
   1397  1.1  mrg 	      default: break;
   1398  1.1  mrg 	      }
   1399  1.1  mrg #endif
   1400  1.1  mrg 	    rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
   1401  1.1  mrg 	    if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
   1402  1.1  mrg 	      {
   1403  1.1  mrg 		gcc_assert (cum->fregno == FP_ARG_MAX_REG
   1404  1.1  mrg 			    && (mode == TFmode || mode == TDmode));
   1405  1.1  mrg 		/* Long double or _Decimal128 split over regs and memory.  */
   1406  1.1  mrg 		mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
   1407  1.1  mrg 		cum->use_stack=1;
   1408  1.1  mrg 	      }
   1409  1.1  mrg 	    rvec[(*k)++]
   1410  1.1  mrg 	      = gen_rtx_EXPR_LIST (VOIDmode,
   1411  1.1  mrg 				   gen_rtx_REG (mode, cum->fregno++),
   1412  1.1  mrg 				   GEN_INT (bitpos / BITS_PER_UNIT));
   1413  1.1  mrg 	    if (FLOAT128_2REG_P (mode))
   1414  1.1  mrg 	      cum->fregno++;
   1415  1.1  mrg 	  }
   1416  1.1  mrg 	else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, 1))
   1417  1.1  mrg 	  {
   1418  1.1  mrg 	    rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
   1419  1.1  mrg 	    rvec[(*k)++]
   1420  1.1  mrg 	      = gen_rtx_EXPR_LIST (VOIDmode,
   1421  1.1  mrg 				   gen_rtx_REG (mode, cum->vregno++),
   1422  1.1  mrg 				   GEN_INT (bitpos / BITS_PER_UNIT));
   1423  1.1  mrg 	  }
   1424  1.1  mrg 	else if (cum->intoffset == -1)
   1425  1.1  mrg 	  cum->intoffset = bitpos;
   1426  1.1  mrg       }
   1427  1.1  mrg }
   1428  1.1  mrg 
   1429  1.1  mrg /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
   1430  1.1  mrg    the register(s) to be used for each field and subfield of a struct
   1431  1.1  mrg    being passed by value, along with the offset of where the
   1432  1.1  mrg    register's value may be found in the block.  FP fields go in FP
   1433  1.1  mrg    register, vector fields go in vector registers, and everything
   1434  1.1  mrg    else goes in int registers, packed as in memory.
   1435  1.1  mrg 
   1436  1.1  mrg    This code is also used for function return values.  RETVAL indicates
   1437  1.1  mrg    whether this is the case.
   1438  1.1  mrg 
   1439  1.1  mrg    Much of this is taken from the SPARC V9 port, which has a similar
   1440  1.1  mrg    calling convention.  */
   1441  1.1  mrg 
   1442  1.1  mrg rtx
   1443  1.1  mrg rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
   1444  1.1  mrg 			    bool named, bool retval)
   1445  1.1  mrg {
   1446  1.1  mrg   rtx rvec[FIRST_PSEUDO_REGISTER];
   1447  1.1  mrg   int k = 1, kbase = 1;
   1448  1.1  mrg   HOST_WIDE_INT typesize = int_size_in_bytes (type);
   1449  1.1  mrg   /* This is a copy; modifications are not visible to our caller.  */
   1450  1.1  mrg   CUMULATIVE_ARGS copy_cum = *orig_cum;
   1451  1.1  mrg   CUMULATIVE_ARGS *cum = &copy_cum;
   1452  1.1  mrg 
   1453  1.1  mrg   /* Pad to 16 byte boundary if needed.  */
   1454  1.1  mrg   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
   1455  1.1  mrg       && (cum->words % 2) != 0)
   1456  1.1  mrg     cum->words++;
   1457  1.1  mrg 
   1458  1.1  mrg   cum->intoffset = 0;
   1459  1.1  mrg   cum->use_stack = 0;
   1460  1.1  mrg   cum->named = named;
   1461  1.1  mrg 
   1462  1.1  mrg   /* Put entries into rvec[] for individual FP and vector fields, and
   1463  1.1  mrg      for the chunks of memory that go in int regs.  Note we start at
   1464  1.1  mrg      element 1; 0 is reserved for an indication of using memory, and
   1465  1.1  mrg      may or may not be filled in below. */
   1466  1.1  mrg   rs6000_darwin64_record_arg_recurse (cum, type, /* startbit pos= */ 0, rvec, &k);
   1467  1.1  mrg   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
   1468  1.1  mrg 
   1469  1.1  mrg   /* If any part of the struct went on the stack put all of it there.
   1470  1.1  mrg      This hack is because the generic code for
   1471  1.1  mrg      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
   1472  1.1  mrg      parts of the struct are not at the beginning.  */
   1473  1.1  mrg   if (cum->use_stack)
   1474  1.1  mrg     {
   1475  1.1  mrg       if (retval)
   1476  1.1  mrg 	return NULL_RTX;    /* doesn't go in registers at all */
   1477  1.1  mrg       kbase = 0;
   1478  1.1  mrg       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
   1479  1.1  mrg     }
   1480  1.1  mrg   if (k > 1 || cum->use_stack)
   1481  1.1  mrg     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
   1482  1.1  mrg   else
   1483  1.1  mrg     return NULL_RTX;
   1484  1.1  mrg }
   1485  1.1  mrg 
   1486  1.1  mrg /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
   1487  1.1  mrg 
   1488  1.1  mrg static rtx
   1489  1.1  mrg rs6000_mixed_function_arg (machine_mode mode, const_tree type,
   1490  1.1  mrg 			   int align_words)
   1491  1.1  mrg {
   1492  1.1  mrg   int n_units;
   1493  1.1  mrg   int i, k;
   1494  1.1  mrg   rtx rvec[GP_ARG_NUM_REG + 1];
   1495  1.1  mrg 
   1496  1.1  mrg   if (align_words >= GP_ARG_NUM_REG)
   1497  1.1  mrg     return NULL_RTX;
   1498  1.1  mrg 
   1499  1.1  mrg   n_units = rs6000_arg_size (mode, type);
   1500  1.1  mrg 
   1501  1.1  mrg   /* Optimize the simple case where the arg fits in one gpr, except in
   1502  1.1  mrg      the case of BLKmode due to assign_parms assuming that registers are
   1503  1.1  mrg      BITS_PER_WORD wide.  */
   1504  1.1  mrg   if (n_units == 0
   1505  1.1  mrg       || (n_units == 1 && mode != BLKmode))
   1506  1.1  mrg     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
   1507  1.1  mrg 
   1508  1.1  mrg   k = 0;
   1509  1.1  mrg   if (align_words + n_units > GP_ARG_NUM_REG)
   1510  1.1  mrg     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
   1511  1.1  mrg        using a magic NULL_RTX component.
   1512  1.1  mrg        This is not strictly correct.  Only some of the arg belongs in
   1513  1.1  mrg        memory, not all of it.  However, the normal scheme using
   1514  1.1  mrg        function_arg_partial_nregs can result in unusual subregs, eg.
   1515  1.1  mrg        (subreg:SI (reg:DF) 4), which are not handled well.  The code to
   1516  1.1  mrg        store the whole arg to memory is often more efficient than code
   1517  1.1  mrg        to store pieces, and we know that space is available in the right
   1518  1.1  mrg        place for the whole arg.  */
   1519  1.1  mrg     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
   1520  1.1  mrg 
   1521  1.1  mrg   i = 0;
   1522  1.1  mrg   do
   1523  1.1  mrg     {
   1524  1.1  mrg       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
   1525  1.1  mrg       rtx off = GEN_INT (i++ * 4);
   1526  1.1  mrg       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
   1527  1.1  mrg     }
   1528  1.1  mrg   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
   1529  1.1  mrg 
   1530  1.1  mrg   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
   1531  1.1  mrg }
   1532  1.1  mrg 
   1533  1.1  mrg /* We have an argument of MODE and TYPE that goes into FPRs or VRs,
   1534  1.1  mrg    but must also be copied into the parameter save area starting at
   1535  1.1  mrg    offset ALIGN_WORDS.  Fill in RVEC with the elements corresponding
   1536  1.1  mrg    to the GPRs and/or memory.  Return the number of elements used.  */
   1537  1.1  mrg 
   1538  1.1  mrg static int
   1539  1.1  mrg rs6000_psave_function_arg (machine_mode mode, const_tree type,
   1540  1.1  mrg 			   int align_words, rtx *rvec)
   1541  1.1  mrg {
   1542  1.1  mrg   int k = 0;
   1543  1.1  mrg 
   1544  1.1  mrg   if (align_words < GP_ARG_NUM_REG)
   1545  1.1  mrg     {
   1546  1.1  mrg       int n_words = rs6000_arg_size (mode, type);
   1547  1.1  mrg 
   1548  1.1  mrg       if (align_words + n_words > GP_ARG_NUM_REG
   1549  1.1  mrg 	  || mode == BLKmode
   1550  1.1  mrg 	  || (TARGET_32BIT && TARGET_POWERPC64))
   1551  1.1  mrg 	{
   1552  1.1  mrg 	  /* If this is partially on the stack, then we only
   1553  1.1  mrg 	     include the portion actually in registers here.  */
   1554  1.1  mrg 	  machine_mode rmode = TARGET_32BIT ? SImode : DImode;
   1555  1.1  mrg 	  int i = 0;
   1556  1.1  mrg 
   1557  1.1  mrg 	  if (align_words + n_words > GP_ARG_NUM_REG)
   1558  1.1  mrg 	    {
   1559  1.1  mrg 	      /* Not all of the arg fits in gprs.  Say that it goes in memory
   1560  1.1  mrg 		 too, using a magic NULL_RTX component.  Also see comment in
   1561  1.1  mrg 		 rs6000_mixed_function_arg for why the normal
   1562  1.1  mrg 		 function_arg_partial_nregs scheme doesn't work in this case. */
   1563  1.1  mrg 	      rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
   1564  1.1  mrg 	    }
   1565  1.1  mrg 
   1566  1.1  mrg 	  do
   1567  1.1  mrg 	    {
   1568  1.1  mrg 	      rtx r = gen_rtx_REG (rmode, GP_ARG_MIN_REG + align_words);
   1569  1.1  mrg 	      rtx off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
   1570  1.1  mrg 	      rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
   1571  1.1  mrg 	    }
   1572  1.1  mrg 	  while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
   1573  1.1  mrg 	}
   1574  1.1  mrg       else
   1575  1.1  mrg 	{
   1576  1.1  mrg 	  /* The whole arg fits in gprs.  */
   1577  1.1  mrg 	  rtx r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
   1578  1.1  mrg 	  rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
   1579  1.1  mrg 	}
   1580  1.1  mrg     }
   1581  1.1  mrg   else
   1582  1.1  mrg     {
   1583  1.1  mrg       /* It's entirely in memory.  */
   1584  1.1  mrg       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
   1585  1.1  mrg     }
   1586  1.1  mrg 
   1587  1.1  mrg   return k;
   1588  1.1  mrg }
   1589  1.1  mrg 
   1590  1.1  mrg /* RVEC is a vector of K components of an argument of mode MODE.
   1591  1.1  mrg    Construct the final function_arg return value from it.  */
   1592  1.1  mrg 
   1593  1.1  mrg static rtx
   1594  1.1  mrg rs6000_finish_function_arg (machine_mode mode, rtx *rvec, int k)
   1595  1.1  mrg {
   1596  1.1  mrg   gcc_assert (k >= 1);
   1597  1.1  mrg 
   1598  1.1  mrg   /* Avoid returning a PARALLEL in the trivial cases.  */
   1599  1.1  mrg   if (k == 1)
   1600  1.1  mrg     {
   1601  1.1  mrg       if (XEXP (rvec[0], 0) == NULL_RTX)
   1602  1.1  mrg 	return NULL_RTX;
   1603  1.1  mrg 
   1604  1.1  mrg       if (GET_MODE (XEXP (rvec[0], 0)) == mode)
   1605  1.1  mrg 	return XEXP (rvec[0], 0);
   1606  1.1  mrg     }
   1607  1.1  mrg 
   1608  1.1  mrg   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
   1609  1.1  mrg }
   1610  1.1  mrg 
   1611  1.1  mrg /* Determine where to put an argument to a function.
   1612  1.1  mrg    Value is zero to push the argument on the stack,
   1613  1.1  mrg    or a hard register in which to store the argument.
   1614  1.1  mrg 
   1615  1.1  mrg    CUM is a variable of type CUMULATIVE_ARGS which gives info about
   1616  1.1  mrg     the preceding args and about the function being called.  It is
   1617  1.1  mrg     not modified in this routine.
   1618  1.1  mrg    ARG is a description of the argument.
   1619  1.1  mrg 
   1620  1.1  mrg    On RS/6000 the first eight words of non-FP are normally in registers
   1621  1.1  mrg    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
   1622  1.1  mrg    Under V.4, the first 8 FP args are in registers.
   1623  1.1  mrg 
   1624  1.1  mrg    If this is floating-point and no prototype is specified, we use
   1625  1.1  mrg    both an FP and integer register (or possibly FP reg and stack).  Library
   1626  1.1  mrg    functions (when CALL_LIBCALL is set) always have the proper types for args,
   1627  1.1  mrg    so we can pass the FP value just in one register.  emit_library_function
   1628  1.1  mrg    doesn't support PARALLEL anyway.
   1629  1.1  mrg 
   1630  1.1  mrg    Note that for args passed by reference, function_arg will be called
   1631  1.1  mrg    with ARG describing the pointer to the arg, not the arg itself.  */
   1632  1.1  mrg 
   1633  1.1  mrg rtx
   1634  1.1  mrg rs6000_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
   1635  1.1  mrg {
   1636  1.1  mrg   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   1637  1.1  mrg   tree type = arg.type;
   1638  1.1  mrg   machine_mode mode = arg.mode;
   1639  1.1  mrg   bool named = arg.named;
   1640  1.1  mrg   enum rs6000_abi abi = DEFAULT_ABI;
   1641  1.1  mrg   machine_mode elt_mode;
   1642  1.1  mrg   int n_elts;
   1643  1.1  mrg 
   1644  1.1  mrg   /* We do not allow MMA types being used as function arguments.  */
   1645  1.1  mrg   if (mode == OOmode || mode == XOmode)
   1646  1.1  mrg     {
   1647  1.1  mrg       if (TYPE_CANONICAL (type) != NULL_TREE)
   1648  1.1  mrg 	type = TYPE_CANONICAL (type);
   1649  1.1  mrg       error ("invalid use of MMA operand of type %qs as a function parameter",
   1650  1.1  mrg 	     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
   1651  1.1  mrg       return NULL_RTX;
   1652  1.1  mrg     }
   1653  1.1  mrg 
   1654  1.1  mrg   /* Return a marker to indicate whether CR1 needs to set or clear the
   1655  1.1  mrg      bit that V.4 uses to say fp args were passed in registers.
   1656  1.1  mrg      Assume that we don't need the marker for software floating point,
   1657  1.1  mrg      or compiler generated library calls.  */
   1658  1.1  mrg   if (arg.end_marker_p ())
   1659  1.1  mrg     {
   1660  1.1  mrg       if (abi == ABI_V4
   1661  1.1  mrg 	  && (cum->call_cookie & CALL_LIBCALL) == 0
   1662  1.1  mrg 	  && (cum->stdarg
   1663  1.1  mrg 	      || (cum->nargs_prototype < 0
   1664  1.1  mrg 		  && (cum->prototype || TARGET_NO_PROTOTYPE)))
   1665  1.1  mrg 	  && TARGET_HARD_FLOAT)
   1666  1.1  mrg 	return GEN_INT (cum->call_cookie
   1667  1.1  mrg 			| ((cum->fregno == FP_ARG_MIN_REG)
   1668  1.1  mrg 			   ? CALL_V4_SET_FP_ARGS
   1669  1.1  mrg 			   : CALL_V4_CLEAR_FP_ARGS));
   1670  1.1  mrg 
   1671  1.1  mrg       return GEN_INT (cum->call_cookie & ~CALL_LIBCALL);
   1672  1.1  mrg     }
   1673  1.1  mrg 
   1674  1.1  mrg   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
   1675  1.1  mrg 
   1676  1.1  mrg   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
   1677  1.1  mrg     {
   1678  1.1  mrg       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, /*retval= */false);
   1679  1.1  mrg       if (rslt != NULL_RTX)
   1680  1.1  mrg 	return rslt;
   1681  1.1  mrg       /* Else fall through to usual handling.  */
   1682  1.1  mrg     }
   1683  1.1  mrg 
   1684  1.1  mrg   if (USE_ALTIVEC_FOR_ARG_P (cum, elt_mode, named))
   1685  1.1  mrg     {
   1686  1.1  mrg       rtx rvec[GP_ARG_NUM_REG + AGGR_ARG_NUM_REG + 1];
   1687  1.1  mrg       rtx r, off;
   1688  1.1  mrg       int i, k = 0;
   1689  1.1  mrg 
   1690  1.1  mrg       /* Do we also need to pass this argument in the parameter save area?
   1691  1.1  mrg 	 Library support functions for IEEE 128-bit are assumed to not need the
   1692  1.1  mrg 	 value passed both in GPRs and in vector registers.  */
   1693  1.1  mrg       if (TARGET_64BIT && !cum->prototype
   1694  1.1  mrg 	  && (!cum->libcall || !FLOAT128_VECTOR_P (elt_mode)))
   1695  1.1  mrg 	{
   1696  1.1  mrg 	  int align_words = ROUND_UP (cum->words, 2);
   1697  1.1  mrg 	  k = rs6000_psave_function_arg (mode, type, align_words, rvec);
   1698  1.1  mrg 	}
   1699  1.1  mrg 
   1700  1.1  mrg       /* Describe where this argument goes in the vector registers.  */
   1701  1.1  mrg       for (i = 0; i < n_elts && cum->vregno + i <= ALTIVEC_ARG_MAX_REG; i++)
   1702  1.1  mrg 	{
   1703  1.1  mrg 	  r = gen_rtx_REG (elt_mode, cum->vregno + i);
   1704  1.1  mrg 	  off = GEN_INT (i * GET_MODE_SIZE (elt_mode));
   1705  1.1  mrg 	  rvec[k++] =  gen_rtx_EXPR_LIST (VOIDmode, r, off);
   1706  1.1  mrg 	}
   1707  1.1  mrg 
   1708  1.1  mrg       return rs6000_finish_function_arg (mode, rvec, k);
   1709  1.1  mrg     }
   1710  1.1  mrg   else if (TARGET_ALTIVEC_ABI
   1711  1.1  mrg 	   && (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
   1712  1.1  mrg 	       || (type && TREE_CODE (type) == VECTOR_TYPE
   1713  1.1  mrg 		   && int_size_in_bytes (type) == 16)))
   1714  1.1  mrg     {
   1715  1.1  mrg       if (named || abi == ABI_V4)
   1716  1.1  mrg 	return NULL_RTX;
   1717  1.1  mrg       else
   1718  1.1  mrg 	{
   1719  1.1  mrg 	  /* Vector parameters to varargs functions under AIX or Darwin
   1720  1.1  mrg 	     get passed in memory and possibly also in GPRs.  */
   1721  1.1  mrg 	  int align, align_words, n_words;
   1722  1.1  mrg 	  machine_mode part_mode;
   1723  1.1  mrg 
   1724  1.1  mrg 	  /* Vector parameters must be 16-byte aligned.  In 32-bit
   1725  1.1  mrg 	     mode this means we need to take into account the offset
   1726  1.1  mrg 	     to the parameter save area.  In 64-bit mode, they just
   1727  1.1  mrg 	     have to start on an even word, since the parameter save
   1728  1.1  mrg 	     area is 16-byte aligned.  */
   1729  1.1  mrg 	  if (TARGET_32BIT)
   1730  1.1  mrg 	    align = -(rs6000_parm_offset () + cum->words) & 3;
   1731  1.1  mrg 	  else
   1732  1.1  mrg 	    align = cum->words & 1;
   1733  1.1  mrg 	  align_words = cum->words + align;
   1734  1.1  mrg 
   1735  1.1  mrg 	  /* Out of registers?  Memory, then.  */
   1736  1.1  mrg 	  if (align_words >= GP_ARG_NUM_REG)
   1737  1.1  mrg 	    return NULL_RTX;
   1738  1.1  mrg 
   1739  1.1  mrg 	  if (TARGET_32BIT && TARGET_POWERPC64)
   1740  1.1  mrg 	    return rs6000_mixed_function_arg (mode, type, align_words);
   1741  1.1  mrg 
   1742  1.1  mrg 	  /* The vector value goes in GPRs.  Only the part of the
   1743  1.1  mrg 	     value in GPRs is reported here.  */
   1744  1.1  mrg 	  part_mode = mode;
   1745  1.1  mrg 	  n_words = rs6000_arg_size (mode, type);
   1746  1.1  mrg 	  if (align_words + n_words > GP_ARG_NUM_REG)
   1747  1.1  mrg 	    /* Fortunately, there are only two possibilities, the value
   1748  1.1  mrg 	       is either wholly in GPRs or half in GPRs and half not.  */
   1749  1.1  mrg 	    part_mode = DImode;
   1750  1.1  mrg 
   1751  1.1  mrg 	  return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
   1752  1.1  mrg 	}
   1753  1.1  mrg     }
   1754  1.1  mrg 
   1755  1.1  mrg   else if (abi == ABI_V4)
   1756  1.1  mrg     {
   1757  1.1  mrg       if (abi_v4_pass_in_fpr (mode, named))
   1758  1.1  mrg 	{
   1759  1.1  mrg 	  /* _Decimal128 must use an even/odd register pair.  This assumes
   1760  1.1  mrg 	     that the register number is odd when fregno is odd.  */
   1761  1.1  mrg 	  if (mode == TDmode && (cum->fregno % 2) == 1)
   1762  1.1  mrg 	    cum->fregno++;
   1763  1.1  mrg 
   1764  1.1  mrg 	  if (cum->fregno + (FLOAT128_2REG_P (mode) ? 1 : 0)
   1765  1.1  mrg 	      <= FP_ARG_V4_MAX_REG)
   1766  1.1  mrg 	    return gen_rtx_REG (mode, cum->fregno);
   1767  1.1  mrg 	  else
   1768  1.1  mrg 	    return NULL_RTX;
   1769  1.1  mrg 	}
   1770  1.1  mrg       else
   1771  1.1  mrg 	{
   1772  1.1  mrg 	  int n_words = rs6000_arg_size (mode, type);
   1773  1.1  mrg 	  int gregno = cum->sysv_gregno;
   1774  1.1  mrg 
   1775  1.1  mrg 	  /* Long long is put in (r3,r4), (r5,r6), (r7,r8) or (r9,r10).
   1776  1.1  mrg 	     As does any other 2 word item such as complex int due to a
   1777  1.1  mrg 	     historical mistake.  */
   1778  1.1  mrg 	  if (n_words == 2)
   1779  1.1  mrg 	    gregno += (1 - gregno) & 1;
   1780  1.1  mrg 
   1781  1.1  mrg 	  /* Multi-reg args are not split between registers and stack.  */
   1782  1.1  mrg 	  if (gregno + n_words - 1 > GP_ARG_MAX_REG)
   1783  1.1  mrg 	    return NULL_RTX;
   1784  1.1  mrg 
   1785  1.1  mrg 	  if (TARGET_32BIT && TARGET_POWERPC64)
   1786  1.1  mrg 	    return rs6000_mixed_function_arg (mode, type,
   1787  1.1  mrg 					      gregno - GP_ARG_MIN_REG);
   1788  1.1  mrg 	  return gen_rtx_REG (mode, gregno);
   1789  1.1  mrg 	}
   1790  1.1  mrg     }
   1791  1.1  mrg   else
   1792  1.1  mrg     {
   1793  1.1  mrg       int align_words = rs6000_parm_start (mode, type, cum->words);
   1794  1.1  mrg 
   1795  1.1  mrg       /* _Decimal128 must be passed in an even/odd float register pair.
   1796  1.1  mrg 	 This assumes that the register number is odd when fregno is odd.  */
   1797  1.1  mrg       if (elt_mode == TDmode && (cum->fregno % 2) == 1)
   1798  1.1  mrg 	cum->fregno++;
   1799  1.1  mrg 
   1800  1.1  mrg       if (USE_FP_FOR_ARG_P (cum, elt_mode)
   1801  1.1  mrg 	  && !(TARGET_AIX && !TARGET_ELF
   1802  1.1  mrg 	       && type != NULL && AGGREGATE_TYPE_P (type)))
   1803  1.1  mrg 	{
   1804  1.1  mrg 	  rtx rvec[GP_ARG_NUM_REG + AGGR_ARG_NUM_REG + 1];
   1805  1.1  mrg 	  rtx r, off;
   1806  1.1  mrg 	  int i, k = 0;
   1807  1.1  mrg 	  unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3;
   1808  1.1  mrg 	  int fpr_words;
   1809  1.1  mrg 
   1810  1.1  mrg 	  /* Do we also need to pass this argument in the parameter
   1811  1.1  mrg 	     save area?  */
   1812  1.1  mrg 	  if (type && (cum->nargs_prototype <= 0
   1813  1.1  mrg 		       || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
   1814  1.1  mrg 			   && TARGET_XL_COMPAT
   1815  1.1  mrg 			   && align_words >= GP_ARG_NUM_REG)))
   1816  1.1  mrg 	    k = rs6000_psave_function_arg (mode, type, align_words, rvec);
   1817  1.1  mrg 
   1818  1.1  mrg 	  /* Describe where this argument goes in the fprs.  */
   1819  1.1  mrg 	  for (i = 0; i < n_elts
   1820  1.1  mrg 		      && cum->fregno + i * n_fpreg <= FP_ARG_MAX_REG; i++)
   1821  1.1  mrg 	    {
   1822  1.1  mrg 	      /* Check if the argument is split over registers and memory.
   1823  1.1  mrg 		 This can only ever happen for long double or _Decimal128;
   1824  1.1  mrg 		 complex types are handled via split_complex_arg.  */
   1825  1.1  mrg 	      machine_mode fmode = elt_mode;
   1826  1.1  mrg 	      if (cum->fregno + (i + 1) * n_fpreg > FP_ARG_MAX_REG + 1)
   1827  1.1  mrg 		{
   1828  1.1  mrg 		  gcc_assert (FLOAT128_2REG_P (fmode));
   1829  1.1  mrg 		  fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
   1830  1.1  mrg 		}
   1831  1.1  mrg 
   1832  1.1  mrg 	      r = gen_rtx_REG (fmode, cum->fregno + i * n_fpreg);
   1833  1.1  mrg 	      off = GEN_INT (i * GET_MODE_SIZE (elt_mode));
   1834  1.1  mrg 	      rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
   1835  1.1  mrg 	    }
   1836  1.1  mrg 
   1837  1.1  mrg 	  /* If there were not enough FPRs to hold the argument, the rest
   1838  1.1  mrg 	     usually goes into memory.  However, if the current position
   1839  1.1  mrg 	     is still within the register parameter area, a portion may
   1840  1.1  mrg 	     actually have to go into GPRs.
   1841  1.1  mrg 
   1842  1.1  mrg 	     Note that it may happen that the portion of the argument
   1843  1.1  mrg 	     passed in the first "half" of the first GPR was already
   1844  1.1  mrg 	     passed in the last FPR as well.
   1845  1.1  mrg 
   1846  1.1  mrg 	     For unnamed arguments, we already set up GPRs to cover the
   1847  1.1  mrg 	     whole argument in rs6000_psave_function_arg, so there is
   1848  1.1  mrg 	     nothing further to do at this point.  */
   1849  1.1  mrg 	  fpr_words = (i * GET_MODE_SIZE (elt_mode)) / (TARGET_32BIT ? 4 : 8);
   1850  1.1  mrg 	  if (i < n_elts && align_words + fpr_words < GP_ARG_NUM_REG
   1851  1.1  mrg 	      && cum->nargs_prototype > 0)
   1852  1.1  mrg             {
   1853  1.1  mrg 	      machine_mode rmode = TARGET_32BIT ? SImode : DImode;
   1854  1.1  mrg 	      int n_words = rs6000_arg_size (mode, type);
   1855  1.1  mrg 
   1856  1.1  mrg 	      align_words += fpr_words;
   1857  1.1  mrg 	      n_words -= fpr_words;
   1858  1.1  mrg 
   1859  1.1  mrg 	      do
   1860  1.1  mrg 		{
   1861  1.1  mrg 		  r = gen_rtx_REG (rmode, GP_ARG_MIN_REG + align_words);
   1862  1.1  mrg 		  off = GEN_INT (fpr_words++ * GET_MODE_SIZE (rmode));
   1863  1.1  mrg 		  rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
   1864  1.1  mrg 		}
   1865  1.1  mrg 	      while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
   1866  1.1  mrg 	    }
   1867  1.1  mrg 
   1868  1.1  mrg 	  return rs6000_finish_function_arg (mode, rvec, k);
   1869  1.1  mrg 	}
   1870  1.1  mrg       else if (align_words < GP_ARG_NUM_REG)
   1871  1.1  mrg 	{
   1872  1.1  mrg 	  if (TARGET_32BIT && TARGET_POWERPC64)
   1873  1.1  mrg 	    return rs6000_mixed_function_arg (mode, type, align_words);
   1874  1.1  mrg 
   1875  1.1  mrg 	  return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
   1876  1.1  mrg 	}
   1877  1.1  mrg       else
   1878  1.1  mrg 	return NULL_RTX;
   1879  1.1  mrg     }
   1880  1.1  mrg }
   1881  1.1  mrg 
   1882  1.1  mrg /* For an arg passed partly in registers and partly in memory, this is
   1884  1.1  mrg    the number of bytes passed in registers.  For args passed entirely in
   1885  1.1  mrg    registers or entirely in memory, zero.  When an arg is described by a
   1886  1.1  mrg    PARALLEL, perhaps using more than one register type, this function
   1887  1.1  mrg    returns the number of bytes used by the first element of the PARALLEL.  */
   1888  1.1  mrg 
   1889  1.1  mrg int
   1890  1.1  mrg rs6000_arg_partial_bytes (cumulative_args_t cum_v,
   1891  1.1  mrg 			  const function_arg_info &arg)
   1892  1.1  mrg {
   1893  1.1  mrg   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   1894  1.1  mrg   bool passed_in_gprs = true;
   1895  1.1  mrg   int ret = 0;
   1896  1.1  mrg   int align_words;
   1897  1.1  mrg   machine_mode elt_mode;
   1898  1.1  mrg   int n_elts;
   1899  1.1  mrg 
   1900  1.1  mrg   rs6000_discover_homogeneous_aggregate (arg.mode, arg.type,
   1901  1.1  mrg 					 &elt_mode, &n_elts);
   1902  1.1  mrg 
   1903  1.1  mrg   if (DEFAULT_ABI == ABI_V4)
   1904  1.1  mrg     return 0;
   1905  1.1  mrg 
   1906  1.1  mrg   if (USE_ALTIVEC_FOR_ARG_P (cum, elt_mode, arg.named))
   1907  1.1  mrg     {
   1908  1.1  mrg       /* If we are passing this arg in the fixed parameter save area (gprs or
   1909  1.1  mrg          memory) as well as VRs, we do not use the partial bytes mechanism;
   1910  1.1  mrg          instead, rs6000_function_arg will return a PARALLEL including a memory
   1911  1.1  mrg          element as necessary.  Library support functions for IEEE 128-bit are
   1912  1.1  mrg          assumed to not need the value passed both in GPRs and in vector
   1913  1.1  mrg          registers.  */
   1914  1.1  mrg       if (TARGET_64BIT && !cum->prototype
   1915  1.1  mrg 	  && (!cum->libcall || !FLOAT128_VECTOR_P (elt_mode)))
   1916  1.1  mrg 	return 0;
   1917  1.1  mrg 
   1918  1.1  mrg       /* Otherwise, we pass in VRs only.  Check for partial copies.  */
   1919  1.1  mrg       passed_in_gprs = false;
   1920  1.1  mrg       if (cum->vregno + n_elts > ALTIVEC_ARG_MAX_REG + 1)
   1921  1.1  mrg 	ret = (ALTIVEC_ARG_MAX_REG + 1 - cum->vregno) * 16;
   1922  1.1  mrg     }
   1923  1.1  mrg 
   1924  1.1  mrg   /* In this complicated case we just disable the partial_nregs code.  */
   1925  1.1  mrg   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (arg.mode, arg.type))
   1926  1.1  mrg     return 0;
   1927  1.1  mrg 
   1928  1.1  mrg   align_words = rs6000_parm_start (arg.mode, arg.type, cum->words);
   1929  1.1  mrg 
   1930  1.1  mrg   if (USE_FP_FOR_ARG_P (cum, elt_mode)
   1931  1.1  mrg       && !(TARGET_AIX && !TARGET_ELF && arg.aggregate_type_p ()))
   1932  1.1  mrg     {
   1933  1.1  mrg       unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3;
   1934  1.1  mrg 
   1935  1.1  mrg       /* If we are passing this arg in the fixed parameter save area
   1936  1.1  mrg          (gprs or memory) as well as FPRs, we do not use the partial
   1937  1.1  mrg 	 bytes mechanism; instead, rs6000_function_arg will return a
   1938  1.1  mrg 	 PARALLEL including a memory element as necessary.  */
   1939  1.1  mrg       if (arg.type
   1940  1.1  mrg 	  && (cum->nargs_prototype <= 0
   1941  1.1  mrg 	      || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
   1942  1.1  mrg 		  && TARGET_XL_COMPAT
   1943  1.1  mrg 		  && align_words >= GP_ARG_NUM_REG)))
   1944  1.1  mrg 	return 0;
   1945  1.1  mrg 
   1946  1.1  mrg       /* Otherwise, we pass in FPRs only.  Check for partial copies.  */
   1947  1.1  mrg       passed_in_gprs = false;
   1948  1.1  mrg       if (cum->fregno + n_elts * n_fpreg > FP_ARG_MAX_REG + 1)
   1949  1.1  mrg 	{
   1950  1.1  mrg 	  /* Compute number of bytes / words passed in FPRs.  If there
   1951  1.1  mrg 	     is still space available in the register parameter area
   1952  1.1  mrg 	     *after* that amount, a part of the argument will be passed
   1953  1.1  mrg 	     in GPRs.  In that case, the total amount passed in any
   1954  1.1  mrg 	     registers is equal to the amount that would have been passed
   1955  1.1  mrg 	     in GPRs if everything were passed there, so we fall back to
   1956  1.1  mrg 	     the GPR code below to compute the appropriate value.  */
   1957  1.1  mrg 	  int fpr = ((FP_ARG_MAX_REG + 1 - cum->fregno)
   1958  1.1  mrg 		     * MIN (8, GET_MODE_SIZE (elt_mode)));
   1959  1.1  mrg 	  int fpr_words = fpr / (TARGET_32BIT ? 4 : 8);
   1960  1.1  mrg 
   1961  1.1  mrg 	  if (align_words + fpr_words < GP_ARG_NUM_REG)
   1962  1.1  mrg 	    passed_in_gprs = true;
   1963  1.1  mrg 	  else
   1964  1.1  mrg 	    ret = fpr;
   1965  1.1  mrg 	}
   1966  1.1  mrg     }
   1967  1.1  mrg 
   1968  1.1  mrg   if (passed_in_gprs
   1969  1.1  mrg       && align_words < GP_ARG_NUM_REG
   1970  1.1  mrg       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (arg.mode, arg.type))
   1971  1.1  mrg     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
   1972  1.1  mrg 
   1973  1.1  mrg   if (ret != 0 && TARGET_DEBUG_ARG)
   1974  1.1  mrg     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
   1975  1.1  mrg 
   1976  1.1  mrg   return ret;
   1977  1.1  mrg }
   1978  1.1  mrg 
   1979  1.1  mrg /* A C expression that indicates when an argument must be passed by
   1981  1.1  mrg    reference.  If nonzero for an argument, a copy of that argument is
   1982  1.1  mrg    made in memory and a pointer to the argument is passed instead of
   1983  1.1  mrg    the argument itself.  The pointer is passed in whatever way is
   1984  1.1  mrg    appropriate for passing a pointer to that type.
   1985  1.1  mrg 
   1986  1.1  mrg    Under V.4, aggregates and long double are passed by reference.
   1987  1.1  mrg 
   1988  1.1  mrg    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
   1989  1.1  mrg    reference unless the AltiVec vector extension ABI is in force.
   1990  1.1  mrg 
   1991  1.1  mrg    As an extension to all ABIs, variable sized types are passed by
   1992  1.1  mrg    reference.  */
   1993  1.1  mrg 
   1994  1.1  mrg bool
   1995  1.1  mrg rs6000_pass_by_reference (cumulative_args_t, const function_arg_info &arg)
   1996  1.1  mrg {
   1997  1.1  mrg   if (!arg.type)
   1998  1.1  mrg     return 0;
   1999  1.1  mrg 
   2000  1.1  mrg   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD
   2001  1.1  mrg       && FLOAT128_IEEE_P (TYPE_MODE (arg.type)))
   2002  1.1  mrg     {
   2003  1.1  mrg       if (TARGET_DEBUG_ARG)
   2004  1.1  mrg 	fprintf (stderr, "function_arg_pass_by_reference: V4 IEEE 128-bit\n");
   2005  1.1  mrg       return 1;
   2006  1.1  mrg     }
   2007  1.1  mrg 
   2008  1.1  mrg   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (arg.type))
   2009  1.1  mrg     {
   2010  1.1  mrg       if (TARGET_DEBUG_ARG)
   2011  1.1  mrg 	fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
   2012  1.1  mrg       return 1;
   2013  1.1  mrg     }
   2014  1.1  mrg 
   2015  1.1  mrg   if (int_size_in_bytes (arg.type) < 0)
   2016  1.1  mrg     {
   2017  1.1  mrg       if (TARGET_DEBUG_ARG)
   2018  1.1  mrg 	fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
   2019  1.1  mrg       return 1;
   2020  1.1  mrg     }
   2021  1.1  mrg 
   2022  1.1  mrg   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
   2023  1.1  mrg      modes only exist for GCC vector types if -maltivec.  */
   2024  1.1  mrg   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (arg.mode))
   2025  1.1  mrg     {
   2026  1.1  mrg       if (TARGET_DEBUG_ARG)
   2027  1.1  mrg 	fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
   2028  1.1  mrg       return 1;
   2029  1.1  mrg     }
   2030  1.1  mrg 
   2031  1.1  mrg   /* Pass synthetic vectors in memory.  */
   2032  1.1  mrg   if (TREE_CODE (arg.type) == VECTOR_TYPE
   2033  1.1  mrg       && int_size_in_bytes (arg.type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
   2034  1.1  mrg     {
   2035  1.1  mrg       static bool warned_for_pass_big_vectors = false;
   2036  1.1  mrg       if (TARGET_DEBUG_ARG)
   2037  1.1  mrg 	fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
   2038  1.1  mrg       if (!warned_for_pass_big_vectors)
   2039  1.1  mrg 	{
   2040  1.1  mrg 	  warning (OPT_Wpsabi, "GCC vector passed by reference: "
   2041  1.1  mrg 		   "non-standard ABI extension with no compatibility "
   2042  1.1  mrg 		   "guarantee");
   2043  1.1  mrg 	  warned_for_pass_big_vectors = true;
   2044  1.1  mrg 	}
   2045  1.1  mrg       return 1;
   2046  1.1  mrg     }
   2047  1.1  mrg 
   2048  1.1  mrg   return 0;
   2049  1.1  mrg }
   2050  1.1  mrg 
   2051  1.1  mrg /* Process parameter of type TYPE after ARGS_SO_FAR parameters were
   2052  1.1  mrg    already processes.  Return true if the parameter must be passed
   2053  1.1  mrg    (fully or partially) on the stack.  */
   2054  1.1  mrg 
   2055  1.1  mrg static bool
   2056  1.1  mrg rs6000_parm_needs_stack (cumulative_args_t args_so_far, tree type)
   2057  1.1  mrg {
   2058  1.1  mrg   int unsignedp;
   2059  1.1  mrg   rtx entry_parm;
   2060  1.1  mrg 
   2061  1.1  mrg   /* Catch errors.  */
   2062  1.1  mrg   if (type == NULL || type == error_mark_node)
   2063  1.1  mrg     return true;
   2064  1.1  mrg 
   2065  1.1  mrg   /* Handle types with no storage requirement.  */
   2066  1.1  mrg   if (TYPE_MODE (type) == VOIDmode)
   2067  1.1  mrg     return false;
   2068  1.1  mrg 
   2069  1.1  mrg   /* Handle complex types.  */
   2070  1.1  mrg   if (TREE_CODE (type) == COMPLEX_TYPE)
   2071  1.1  mrg     return (rs6000_parm_needs_stack (args_so_far, TREE_TYPE (type))
   2072  1.1  mrg 	    || rs6000_parm_needs_stack (args_so_far, TREE_TYPE (type)));
   2073  1.1  mrg 
   2074  1.1  mrg   /* Handle transparent aggregates.  */
   2075  1.1  mrg   if ((TREE_CODE (type) == UNION_TYPE || TREE_CODE (type) == RECORD_TYPE)
   2076  1.1  mrg       && TYPE_TRANSPARENT_AGGR (type))
   2077  1.1  mrg     type = TREE_TYPE (first_field (type));
   2078  1.1  mrg 
   2079  1.1  mrg   /* See if this arg was passed by invisible reference.  */
   2080  1.1  mrg   function_arg_info arg (type, /*named=*/true);
   2081  1.1  mrg   apply_pass_by_reference_rules (get_cumulative_args (args_so_far), arg);
   2082  1.1  mrg 
   2083  1.1  mrg   /* Find mode as it is passed by the ABI.  */
   2084  1.1  mrg   unsignedp = TYPE_UNSIGNED (type);
   2085  1.1  mrg   arg.mode = promote_mode (arg.type, arg.mode, &unsignedp);
   2086  1.1  mrg 
   2087  1.1  mrg   /* If we must pass in stack, we need a stack.  */
   2088  1.1  mrg   if (rs6000_must_pass_in_stack (arg))
   2089  1.1  mrg     return true;
   2090  1.1  mrg 
   2091  1.1  mrg   /* If there is no incoming register, we need a stack.  */
   2092  1.1  mrg   entry_parm = rs6000_function_arg (args_so_far, arg);
   2093  1.1  mrg   if (entry_parm == NULL)
   2094  1.1  mrg     return true;
   2095  1.1  mrg 
   2096  1.1  mrg   /* Likewise if we need to pass both in registers and on the stack.  */
   2097  1.1  mrg   if (GET_CODE (entry_parm) == PARALLEL
   2098  1.1  mrg       && XEXP (XVECEXP (entry_parm, 0, 0), 0) == NULL_RTX)
   2099  1.1  mrg     return true;
   2100  1.1  mrg 
   2101  1.1  mrg   /* Also true if we're partially in registers and partially not.  */
   2102  1.1  mrg   if (rs6000_arg_partial_bytes (args_so_far, arg) != 0)
   2103  1.1  mrg     return true;
   2104  1.1  mrg 
   2105  1.1  mrg   /* Update info on where next arg arrives in registers.  */
   2106  1.1  mrg   rs6000_function_arg_advance (args_so_far, arg);
   2107  1.1  mrg   return false;
   2108  1.1  mrg }
   2109  1.1  mrg 
   2110  1.1  mrg /* Return true if FUN has no prototype, has a variable argument
   2111  1.1  mrg    list, or passes any parameter in memory.  */
   2112  1.1  mrg 
   2113  1.1  mrg static bool
   2114  1.1  mrg rs6000_function_parms_need_stack (tree fun, bool incoming)
   2115  1.1  mrg {
   2116  1.1  mrg   tree fntype, result;
   2117  1.1  mrg   CUMULATIVE_ARGS args_so_far_v;
   2118  1.1  mrg   cumulative_args_t args_so_far;
   2119  1.1  mrg 
   2120  1.1  mrg   if (!fun)
   2121  1.1  mrg     /* Must be a libcall, all of which only use reg parms.  */
   2122  1.1  mrg     return false;
   2123  1.1  mrg 
   2124  1.1  mrg   fntype = fun;
   2125  1.1  mrg   if (!TYPE_P (fun))
   2126  1.1  mrg     fntype = TREE_TYPE (fun);
   2127  1.1  mrg 
   2128  1.1  mrg   /* Varargs functions need the parameter save area.  */
   2129  1.1  mrg   if ((!incoming && !prototype_p (fntype)) || stdarg_p (fntype))
   2130  1.1  mrg     return true;
   2131  1.1  mrg 
   2132  1.1  mrg   INIT_CUMULATIVE_INCOMING_ARGS (args_so_far_v, fntype, NULL_RTX);
   2133  1.1  mrg   args_so_far = pack_cumulative_args (&args_so_far_v);
   2134  1.1  mrg 
   2135  1.1  mrg   /* When incoming, we will have been passed the function decl.
   2136  1.1  mrg      It is necessary to use the decl to handle K&R style functions,
   2137  1.1  mrg      where TYPE_ARG_TYPES may not be available.  */
   2138  1.1  mrg   if (incoming)
   2139  1.1  mrg     {
   2140  1.1  mrg       gcc_assert (DECL_P (fun));
   2141  1.1  mrg       result = DECL_RESULT (fun);
   2142  1.1  mrg     }
   2143  1.1  mrg   else
   2144  1.1  mrg     result = TREE_TYPE (fntype);
   2145  1.1  mrg 
   2146  1.1  mrg   if (result && aggregate_value_p (result, fntype))
   2147  1.1  mrg     {
   2148  1.1  mrg       if (!TYPE_P (result))
   2149  1.1  mrg 	result = TREE_TYPE (result);
   2150  1.1  mrg       result = build_pointer_type (result);
   2151  1.1  mrg       rs6000_parm_needs_stack (args_so_far, result);
   2152  1.1  mrg     }
   2153  1.1  mrg 
   2154  1.1  mrg   if (incoming)
   2155  1.1  mrg     {
   2156  1.1  mrg       tree parm;
   2157  1.1  mrg 
   2158  1.1  mrg       for (parm = DECL_ARGUMENTS (fun);
   2159  1.1  mrg 	   parm && parm != void_list_node;
   2160  1.1  mrg 	   parm = TREE_CHAIN (parm))
   2161  1.1  mrg 	if (rs6000_parm_needs_stack (args_so_far, TREE_TYPE (parm)))
   2162  1.1  mrg 	  return true;
   2163  1.1  mrg     }
   2164  1.1  mrg   else
   2165  1.1  mrg     {
   2166  1.1  mrg       function_args_iterator args_iter;
   2167  1.1  mrg       tree arg_type;
   2168  1.1  mrg 
   2169  1.1  mrg       FOREACH_FUNCTION_ARGS (fntype, arg_type, args_iter)
   2170  1.1  mrg 	if (rs6000_parm_needs_stack (args_so_far, arg_type))
   2171  1.1  mrg 	  return true;
   2172  1.1  mrg     }
   2173  1.1  mrg 
   2174  1.1  mrg   return false;
   2175  1.1  mrg }
   2176  1.1  mrg 
   2177  1.1  mrg /* Return the size of the REG_PARM_STACK_SPACE are for FUN.  This is
   2178  1.1  mrg    usually a constant depending on the ABI.  However, in the ELFv2 ABI
   2179  1.1  mrg    the register parameter area is optional when calling a function that
   2180  1.1  mrg    has a prototype is scope, has no variable argument list, and passes
   2181  1.1  mrg    all parameters in registers.  */
   2182  1.1  mrg 
   2183  1.1  mrg int
   2184  1.1  mrg rs6000_reg_parm_stack_space (tree fun, bool incoming)
   2185  1.1  mrg {
   2186  1.1  mrg   int reg_parm_stack_space;
   2187  1.1  mrg 
   2188  1.1  mrg   switch (DEFAULT_ABI)
   2189  1.1  mrg     {
   2190  1.1  mrg     default:
   2191  1.1  mrg       reg_parm_stack_space = 0;
   2192  1.1  mrg       break;
   2193  1.1  mrg 
   2194  1.1  mrg     case ABI_AIX:
   2195  1.1  mrg     case ABI_DARWIN:
   2196  1.1  mrg       reg_parm_stack_space = TARGET_64BIT ? 64 : 32;
   2197  1.1  mrg       break;
   2198  1.1  mrg 
   2199  1.1  mrg     case ABI_ELFv2:
   2200  1.1  mrg       /* ??? Recomputing this every time is a bit expensive.  Is there
   2201  1.1  mrg 	 a place to cache this information?  */
   2202  1.1  mrg       if (rs6000_function_parms_need_stack (fun, incoming))
   2203  1.1  mrg 	reg_parm_stack_space = TARGET_64BIT ? 64 : 32;
   2204  1.1  mrg       else
   2205  1.1  mrg 	reg_parm_stack_space = 0;
   2206  1.1  mrg       break;
   2207  1.1  mrg     }
   2208  1.1  mrg 
   2209  1.1  mrg   return reg_parm_stack_space;
   2210  1.1  mrg }
   2211  1.1  mrg 
   2212  1.1  mrg static void
   2213  1.1  mrg rs6000_move_block_from_reg (int regno, rtx x, int nregs)
   2214  1.1  mrg {
   2215  1.1  mrg   int i;
   2216  1.1  mrg   machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
   2217  1.1  mrg 
   2218  1.1  mrg   if (nregs == 0)
   2219  1.1  mrg     return;
   2220  1.1  mrg 
   2221  1.1  mrg   for (i = 0; i < nregs; i++)
   2222  1.1  mrg     {
   2223  1.1  mrg       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
   2224  1.1  mrg       if (reload_completed)
   2225  1.1  mrg 	{
   2226  1.1  mrg 	  if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
   2227  1.1  mrg 	    tem = NULL_RTX;
   2228  1.1  mrg 	  else
   2229  1.1  mrg 	    tem = simplify_gen_subreg (reg_mode, x, BLKmode,
   2230  1.1  mrg 				       i * GET_MODE_SIZE (reg_mode));
   2231  1.1  mrg 	}
   2232  1.1  mrg       else
   2233  1.1  mrg 	tem = replace_equiv_address (tem, XEXP (tem, 0));
   2234  1.1  mrg 
   2235  1.1  mrg       gcc_assert (tem);
   2236  1.1  mrg 
   2237  1.1  mrg       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
   2238  1.1  mrg     }
   2239  1.1  mrg }
   2240  1.1  mrg 
   2241  1.1  mrg /* Perform any needed actions needed for a function that is receiving a
   2243  1.1  mrg    variable number of arguments.
   2244  1.1  mrg 
   2245  1.1  mrg    CUM is as above.
   2246  1.1  mrg 
   2247  1.1  mrg    ARG is the last named argument.
   2248  1.1  mrg 
   2249  1.1  mrg    PRETEND_SIZE is a variable that should be set to the amount of stack
   2250  1.1  mrg    that must be pushed by the prolog to pretend that our caller pushed
   2251  1.1  mrg    it.
   2252  1.1  mrg 
   2253  1.1  mrg    Normally, this macro will push all remaining incoming registers on the
   2254  1.1  mrg    stack and set PRETEND_SIZE to the length of the registers pushed.  */
   2255  1.1  mrg 
   2256  1.1  mrg void
   2257  1.1  mrg setup_incoming_varargs (cumulative_args_t cum,
   2258  1.1  mrg 			const function_arg_info &arg,
   2259  1.1  mrg 			int *pretend_size ATTRIBUTE_UNUSED, int no_rtl)
   2260  1.1  mrg {
   2261  1.1  mrg   CUMULATIVE_ARGS next_cum;
   2262  1.1  mrg   int reg_size = TARGET_32BIT ? 4 : 8;
   2263  1.1  mrg   rtx save_area = NULL_RTX, mem;
   2264  1.1  mrg   int first_reg_offset;
   2265  1.1  mrg   alias_set_type set;
   2266  1.1  mrg 
   2267  1.1  mrg   /* Skip the last named argument.  */
   2268  1.1  mrg   next_cum = *get_cumulative_args (cum);
   2269  1.1  mrg   rs6000_function_arg_advance_1 (&next_cum, arg.mode, arg.type, arg.named, 0);
   2270  1.1  mrg 
   2271  1.1  mrg   if (DEFAULT_ABI == ABI_V4)
   2272  1.1  mrg     {
   2273  1.1  mrg       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
   2274  1.1  mrg 
   2275  1.1  mrg       if (! no_rtl)
   2276  1.1  mrg 	{
   2277  1.1  mrg 	  int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
   2278  1.1  mrg 	  HOST_WIDE_INT offset = 0;
   2279  1.1  mrg 
   2280  1.1  mrg 	  /* Try to optimize the size of the varargs save area.
   2281  1.1  mrg 	     The ABI requires that ap.reg_save_area is doubleword
   2282  1.1  mrg 	     aligned, but we don't need to allocate space for all
   2283  1.1  mrg 	     the bytes, only those to which we actually will save
   2284  1.1  mrg 	     anything.  */
   2285  1.1  mrg 	  if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
   2286  1.1  mrg 	    gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
   2287  1.1  mrg 	  if (TARGET_HARD_FLOAT
   2288  1.1  mrg 	      && next_cum.fregno <= FP_ARG_V4_MAX_REG
   2289  1.1  mrg 	      && cfun->va_list_fpr_size)
   2290  1.1  mrg 	    {
   2291  1.1  mrg 	      if (gpr_reg_num)
   2292  1.1  mrg 		fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
   2293  1.1  mrg 			   * UNITS_PER_FP_WORD;
   2294  1.1  mrg 	      if (cfun->va_list_fpr_size
   2295  1.1  mrg 		  < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
   2296  1.1  mrg 		fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
   2297  1.1  mrg 	      else
   2298  1.1  mrg 		fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
   2299  1.1  mrg 			    * UNITS_PER_FP_WORD;
   2300  1.1  mrg 	    }
   2301  1.1  mrg 	  if (gpr_reg_num)
   2302  1.1  mrg 	    {
   2303  1.1  mrg 	      offset = -((first_reg_offset * reg_size) & ~7);
   2304  1.1  mrg 	      if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
   2305  1.1  mrg 		{
   2306  1.1  mrg 		  gpr_reg_num = cfun->va_list_gpr_size;
   2307  1.1  mrg 		  if (reg_size == 4 && (first_reg_offset & 1))
   2308  1.1  mrg 		    gpr_reg_num++;
   2309  1.1  mrg 		}
   2310  1.1  mrg 	      gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
   2311  1.1  mrg 	    }
   2312  1.1  mrg 	  else if (fpr_size)
   2313  1.1  mrg 	    offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
   2314  1.1  mrg 		       * UNITS_PER_FP_WORD
   2315  1.1  mrg 		     - (int) (GP_ARG_NUM_REG * reg_size);
   2316  1.1  mrg 
   2317  1.1  mrg 	  if (gpr_size + fpr_size)
   2318  1.1  mrg 	    {
   2319  1.1  mrg 	      rtx reg_save_area
   2320  1.1  mrg 		= assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
   2321  1.1  mrg 	      gcc_assert (MEM_P (reg_save_area));
   2322  1.1  mrg 	      reg_save_area = XEXP (reg_save_area, 0);
   2323  1.1  mrg 	      if (GET_CODE (reg_save_area) == PLUS)
   2324  1.1  mrg 		{
   2325  1.1  mrg 		  gcc_assert (XEXP (reg_save_area, 0)
   2326  1.1  mrg 			      == virtual_stack_vars_rtx);
   2327  1.1  mrg 		  gcc_assert (CONST_INT_P (XEXP (reg_save_area, 1)));
   2328  1.1  mrg 		  offset += INTVAL (XEXP (reg_save_area, 1));
   2329  1.1  mrg 		}
   2330  1.1  mrg 	      else
   2331  1.1  mrg 		gcc_assert (reg_save_area == virtual_stack_vars_rtx);
   2332  1.1  mrg 	    }
   2333  1.1  mrg 
   2334  1.1  mrg 	  cfun->machine->varargs_save_offset = offset;
   2335  1.1  mrg 	  save_area = plus_constant (Pmode, virtual_stack_vars_rtx, offset);
   2336  1.1  mrg 	}
   2337  1.1  mrg     }
   2338  1.1  mrg   else
   2339  1.1  mrg     {
   2340  1.1  mrg       first_reg_offset = next_cum.words;
   2341  1.1  mrg       save_area = crtl->args.internal_arg_pointer;
   2342  1.1  mrg 
   2343  1.1  mrg       if (targetm.calls.must_pass_in_stack (arg))
   2344  1.1  mrg 	first_reg_offset += rs6000_arg_size (TYPE_MODE (arg.type), arg.type);
   2345  1.1  mrg     }
   2346  1.1  mrg 
   2347  1.1  mrg   set = get_varargs_alias_set ();
   2348  1.1  mrg   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
   2349  1.1  mrg       && cfun->va_list_gpr_size)
   2350  1.1  mrg     {
   2351  1.1  mrg       int n_gpr, nregs = GP_ARG_NUM_REG - first_reg_offset;
   2352  1.1  mrg 
   2353  1.1  mrg       if (va_list_gpr_counter_field)
   2354  1.1  mrg 	/* V4 va_list_gpr_size counts number of registers needed.  */
   2355  1.1  mrg 	n_gpr = cfun->va_list_gpr_size;
   2356  1.1  mrg       else
   2357  1.1  mrg 	/* char * va_list instead counts number of bytes needed.  */
   2358  1.1  mrg 	n_gpr = (cfun->va_list_gpr_size + reg_size - 1) / reg_size;
   2359  1.1  mrg 
   2360  1.1  mrg       if (nregs > n_gpr)
   2361  1.1  mrg 	nregs = n_gpr;
   2362  1.1  mrg 
   2363  1.1  mrg       mem = gen_rtx_MEM (BLKmode,
   2364  1.1  mrg 			 plus_constant (Pmode, save_area,
   2365  1.1  mrg 					first_reg_offset * reg_size));
   2366  1.1  mrg       MEM_NOTRAP_P (mem) = 1;
   2367  1.1  mrg       set_mem_alias_set (mem, set);
   2368  1.1  mrg       set_mem_align (mem, BITS_PER_WORD);
   2369  1.1  mrg 
   2370  1.1  mrg       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
   2371  1.1  mrg 				  nregs);
   2372  1.1  mrg     }
   2373  1.1  mrg 
   2374  1.1  mrg   /* Save FP registers if needed.  */
   2375  1.1  mrg   if (DEFAULT_ABI == ABI_V4
   2376  1.1  mrg       && TARGET_HARD_FLOAT
   2377  1.1  mrg       && ! no_rtl
   2378  1.1  mrg       && next_cum.fregno <= FP_ARG_V4_MAX_REG
   2379  1.1  mrg       && cfun->va_list_fpr_size)
   2380  1.1  mrg     {
   2381  1.1  mrg       int fregno = next_cum.fregno, nregs;
   2382  1.1  mrg       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
   2383  1.1  mrg       rtx lab = gen_label_rtx ();
   2384  1.1  mrg       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
   2385  1.1  mrg 					       * UNITS_PER_FP_WORD);
   2386  1.1  mrg 
   2387  1.1  mrg       emit_jump_insn
   2388  1.1  mrg 	(gen_rtx_SET (pc_rtx,
   2389  1.1  mrg 		      gen_rtx_IF_THEN_ELSE (VOIDmode,
   2390  1.1  mrg 					    gen_rtx_NE (VOIDmode, cr1,
   2391  1.1  mrg 							const0_rtx),
   2392  1.1  mrg 					    gen_rtx_LABEL_REF (VOIDmode, lab),
   2393  1.1  mrg 					    pc_rtx)));
   2394  1.1  mrg 
   2395  1.1  mrg       for (nregs = 0;
   2396  1.1  mrg 	   fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
   2397  1.1  mrg 	   fregno++, off += UNITS_PER_FP_WORD, nregs++)
   2398  1.1  mrg 	{
   2399  1.1  mrg 	  mem = gen_rtx_MEM (TARGET_HARD_FLOAT ? DFmode : SFmode,
   2400  1.1  mrg                              plus_constant (Pmode, save_area, off));
   2401  1.1  mrg   	  MEM_NOTRAP_P (mem) = 1;
   2402  1.1  mrg   	  set_mem_alias_set (mem, set);
   2403  1.1  mrg 	  set_mem_align (mem, GET_MODE_ALIGNMENT (
   2404  1.1  mrg 			 TARGET_HARD_FLOAT ? DFmode : SFmode));
   2405  1.1  mrg 	  emit_move_insn (mem, gen_rtx_REG (
   2406  1.1  mrg                           TARGET_HARD_FLOAT ? DFmode : SFmode, fregno));
   2407  1.1  mrg 	}
   2408  1.1  mrg 
   2409  1.1  mrg       emit_label (lab);
   2410  1.1  mrg     }
   2411  1.1  mrg }
   2412  1.1  mrg 
   2413  1.1  mrg /* Create the va_list data type.  */
   2414  1.1  mrg 
   2415  1.1  mrg tree
   2416  1.1  mrg rs6000_build_builtin_va_list (void)
   2417  1.1  mrg {
   2418  1.1  mrg   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
   2419  1.1  mrg 
   2420  1.1  mrg   /* For AIX, prefer 'char *' because that's what the system
   2421  1.1  mrg      header files like.  */
   2422  1.1  mrg   if (DEFAULT_ABI != ABI_V4)
   2423  1.1  mrg     return build_pointer_type (char_type_node);
   2424  1.1  mrg 
   2425  1.1  mrg   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
   2426  1.1  mrg   type_decl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
   2427  1.1  mrg       			  get_identifier ("__va_list_tag"), record);
   2428  1.1  mrg 
   2429  1.1  mrg   f_gpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("gpr"),
   2430  1.1  mrg 		      unsigned_char_type_node);
   2431  1.1  mrg   f_fpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("fpr"),
   2432  1.1  mrg 		      unsigned_char_type_node);
   2433  1.1  mrg   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
   2434  1.1  mrg      every user file.  */
   2435  1.1  mrg   f_res = build_decl (BUILTINS_LOCATION, FIELD_DECL,
   2436  1.1  mrg       		      get_identifier ("reserved"), short_unsigned_type_node);
   2437  1.1  mrg   f_ovf = build_decl (BUILTINS_LOCATION, FIELD_DECL,
   2438  1.1  mrg       		      get_identifier ("overflow_arg_area"),
   2439  1.1  mrg 		      ptr_type_node);
   2440  1.1  mrg   f_sav = build_decl (BUILTINS_LOCATION, FIELD_DECL,
   2441  1.1  mrg       		      get_identifier ("reg_save_area"),
   2442  1.1  mrg 		      ptr_type_node);
   2443  1.1  mrg 
   2444  1.1  mrg   va_list_gpr_counter_field = f_gpr;
   2445  1.1  mrg   va_list_fpr_counter_field = f_fpr;
   2446  1.1  mrg 
   2447  1.1  mrg   DECL_FIELD_CONTEXT (f_gpr) = record;
   2448  1.1  mrg   DECL_FIELD_CONTEXT (f_fpr) = record;
   2449  1.1  mrg   DECL_FIELD_CONTEXT (f_res) = record;
   2450  1.1  mrg   DECL_FIELD_CONTEXT (f_ovf) = record;
   2451  1.1  mrg   DECL_FIELD_CONTEXT (f_sav) = record;
   2452  1.1  mrg 
   2453  1.1  mrg   TYPE_STUB_DECL (record) = type_decl;
   2454  1.1  mrg   TYPE_NAME (record) = type_decl;
   2455  1.1  mrg   TYPE_FIELDS (record) = f_gpr;
   2456  1.1  mrg   DECL_CHAIN (f_gpr) = f_fpr;
   2457  1.1  mrg   DECL_CHAIN (f_fpr) = f_res;
   2458  1.1  mrg   DECL_CHAIN (f_res) = f_ovf;
   2459  1.1  mrg   DECL_CHAIN (f_ovf) = f_sav;
   2460  1.1  mrg 
   2461  1.1  mrg   layout_type (record);
   2462  1.1  mrg 
   2463  1.1  mrg   /* The correct type is an array type of one element.  */
   2464  1.1  mrg   return build_array_type (record, build_index_type (size_zero_node));
   2465  1.1  mrg }
   2466  1.1  mrg 
   2467  1.1  mrg /* Implement va_start.  */
   2468  1.1  mrg 
   2469  1.1  mrg void
   2470  1.1  mrg rs6000_va_start (tree valist, rtx nextarg)
   2471  1.1  mrg {
   2472  1.1  mrg   HOST_WIDE_INT words, n_gpr, n_fpr;
   2473  1.1  mrg   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
   2474  1.1  mrg   tree gpr, fpr, ovf, sav, t;
   2475  1.1  mrg 
   2476  1.1  mrg   /* Only SVR4 needs something special.  */
   2477  1.1  mrg   if (DEFAULT_ABI != ABI_V4)
   2478  1.1  mrg     {
   2479  1.1  mrg       std_expand_builtin_va_start (valist, nextarg);
   2480  1.1  mrg       return;
   2481  1.1  mrg     }
   2482  1.1  mrg 
   2483  1.1  mrg   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
   2484  1.1  mrg   f_fpr = DECL_CHAIN (f_gpr);
   2485  1.1  mrg   f_res = DECL_CHAIN (f_fpr);
   2486  1.1  mrg   f_ovf = DECL_CHAIN (f_res);
   2487  1.1  mrg   f_sav = DECL_CHAIN (f_ovf);
   2488  1.1  mrg 
   2489  1.1  mrg   valist = build_simple_mem_ref (valist);
   2490  1.1  mrg   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
   2491  1.1  mrg   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
   2492  1.1  mrg 		f_fpr, NULL_TREE);
   2493  1.1  mrg   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
   2494  1.1  mrg 		f_ovf, NULL_TREE);
   2495  1.1  mrg   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
   2496  1.1  mrg 		f_sav, NULL_TREE);
   2497  1.1  mrg 
   2498  1.1  mrg   /* Count number of gp and fp argument registers used.  */
   2499  1.1  mrg   words = crtl->args.info.words;
   2500  1.1  mrg   n_gpr = MIN (crtl->args.info.sysv_gregno - GP_ARG_MIN_REG,
   2501  1.1  mrg 	       GP_ARG_NUM_REG);
   2502  1.1  mrg   n_fpr = MIN (crtl->args.info.fregno - FP_ARG_MIN_REG,
   2503  1.1  mrg 	       FP_ARG_NUM_REG);
   2504  1.1  mrg 
   2505  1.1  mrg   if (TARGET_DEBUG_ARG)
   2506  1.1  mrg     fprintf (stderr, "va_start: words = " HOST_WIDE_INT_PRINT_DEC", n_gpr = "
   2507  1.1  mrg 	     HOST_WIDE_INT_PRINT_DEC", n_fpr = " HOST_WIDE_INT_PRINT_DEC"\n",
   2508  1.1  mrg 	     words, n_gpr, n_fpr);
   2509  1.1  mrg 
   2510  1.1  mrg   if (cfun->va_list_gpr_size)
   2511  1.1  mrg     {
   2512  1.1  mrg       t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
   2513  1.1  mrg 		  build_int_cst (NULL_TREE, n_gpr));
   2514  1.1  mrg       TREE_SIDE_EFFECTS (t) = 1;
   2515  1.1  mrg       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
   2516  1.1  mrg     }
   2517  1.1  mrg 
   2518  1.1  mrg   if (cfun->va_list_fpr_size)
   2519  1.1  mrg     {
   2520  1.1  mrg       t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
   2521  1.1  mrg 		  build_int_cst (NULL_TREE, n_fpr));
   2522  1.1  mrg       TREE_SIDE_EFFECTS (t) = 1;
   2523  1.1  mrg       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
   2524  1.1  mrg 
   2525  1.1  mrg #ifdef HAVE_AS_GNU_ATTRIBUTE
   2526  1.1  mrg       if (call_ABI_of_interest (cfun->decl))
   2527  1.1  mrg 	rs6000_passes_float = true;
   2528  1.1  mrg #endif
   2529  1.1  mrg     }
   2530  1.1  mrg 
   2531  1.1  mrg   /* Find the overflow area.  */
   2532  1.1  mrg   t = make_tree (TREE_TYPE (ovf), crtl->args.internal_arg_pointer);
   2533  1.1  mrg   if (words != 0)
   2534  1.1  mrg     t = fold_build_pointer_plus_hwi (t, words * MIN_UNITS_PER_WORD);
   2535  1.1  mrg   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
   2536  1.1  mrg   TREE_SIDE_EFFECTS (t) = 1;
   2537  1.1  mrg   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
   2538  1.1  mrg 
   2539  1.1  mrg   /* If there were no va_arg invocations, don't set up the register
   2540  1.1  mrg      save area.  */
   2541  1.1  mrg   if (!cfun->va_list_gpr_size
   2542  1.1  mrg       && !cfun->va_list_fpr_size
   2543  1.1  mrg       && n_gpr < GP_ARG_NUM_REG
   2544  1.1  mrg       && n_fpr < FP_ARG_V4_MAX_REG)
   2545  1.1  mrg     return;
   2546  1.1  mrg 
   2547  1.1  mrg   /* Find the register save area.  */
   2548  1.1  mrg   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
   2549  1.1  mrg   if (cfun->machine->varargs_save_offset)
   2550  1.1  mrg     t = fold_build_pointer_plus_hwi (t, cfun->machine->varargs_save_offset);
   2551  1.1  mrg   t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
   2552  1.1  mrg   TREE_SIDE_EFFECTS (t) = 1;
   2553  1.1  mrg   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
   2554  1.1  mrg }
   2555  1.1  mrg 
   2556  1.1  mrg /* Implement va_arg.  */
   2557  1.1  mrg 
   2558  1.1  mrg tree
   2559  1.1  mrg rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
   2560  1.1  mrg 			gimple_seq *post_p)
   2561  1.1  mrg {
   2562  1.1  mrg   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
   2563  1.1  mrg   tree gpr, fpr, ovf, sav, reg, t, u;
   2564  1.1  mrg   int size, rsize, n_reg, sav_ofs, sav_scale;
   2565  1.1  mrg   tree lab_false, lab_over, addr;
   2566  1.1  mrg   int align;
   2567  1.1  mrg   tree ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
   2568  1.1  mrg   int regalign = 0;
   2569  1.1  mrg   gimple *stmt;
   2570  1.1  mrg 
   2571  1.1  mrg   if (pass_va_arg_by_reference (type))
   2572  1.1  mrg     {
   2573  1.1  mrg       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
   2574  1.1  mrg       return build_va_arg_indirect_ref (t);
   2575  1.1  mrg     }
   2576  1.1  mrg 
   2577  1.1  mrg   /* We need to deal with the fact that the darwin ppc64 ABI is defined by an
   2578  1.1  mrg      earlier version of gcc, with the property that it always applied alignment
   2579  1.1  mrg      adjustments to the va-args (even for zero-sized types).  The cheapest way
   2580  1.1  mrg      to deal with this is to replicate the effect of the part of
   2581  1.1  mrg      std_gimplify_va_arg_expr that carries out the align adjust, for the case
   2582  1.1  mrg      of relevance.
   2583  1.1  mrg      We don't need to check for pass-by-reference because of the test above.
   2584  1.1  mrg      We can return a simplifed answer, since we know there's no offset to add.  */
   2585  1.1  mrg 
   2586  1.1  mrg   if (((TARGET_MACHO
   2587  1.1  mrg         && rs6000_darwin64_abi)
   2588  1.1  mrg        || DEFAULT_ABI == ABI_ELFv2
   2589  1.1  mrg        || (DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm))
   2590  1.1  mrg       && integer_zerop (TYPE_SIZE (type)))
   2591  1.1  mrg     {
   2592  1.1  mrg       unsigned HOST_WIDE_INT align, boundary;
   2593  1.1  mrg       tree valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
   2594  1.1  mrg       align = PARM_BOUNDARY / BITS_PER_UNIT;
   2595  1.1  mrg       boundary = rs6000_function_arg_boundary (TYPE_MODE (type), type);
   2596  1.1  mrg       if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
   2597  1.1  mrg 	boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
   2598  1.1  mrg       boundary /= BITS_PER_UNIT;
   2599  1.1  mrg       if (boundary > align)
   2600  1.1  mrg 	{
   2601  1.1  mrg 	  tree t ;
   2602  1.1  mrg 	  /* This updates arg ptr by the amount that would be necessary
   2603  1.1  mrg 	     to align the zero-sized (but not zero-alignment) item.  */
   2604  1.1  mrg 	  t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
   2605  1.1  mrg 		      fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
   2606  1.1  mrg 	  gimplify_and_add (t, pre_p);
   2607  1.1  mrg 
   2608  1.1  mrg 	  t = fold_convert (sizetype, valist_tmp);
   2609  1.1  mrg 	  t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
   2610  1.1  mrg 		  fold_convert (TREE_TYPE (valist),
   2611  1.1  mrg 				fold_build2 (BIT_AND_EXPR, sizetype, t,
   2612  1.1  mrg 					     size_int (-boundary))));
   2613  1.1  mrg 	  t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
   2614  1.1  mrg 	  gimplify_and_add (t, pre_p);
   2615  1.1  mrg 	}
   2616  1.1  mrg       /* Since it is zero-sized there's no increment for the item itself. */
   2617  1.1  mrg       valist_tmp = fold_convert (build_pointer_type (type), valist_tmp);
   2618  1.1  mrg       return build_va_arg_indirect_ref (valist_tmp);
   2619  1.1  mrg     }
   2620  1.1  mrg 
   2621  1.1  mrg   if (DEFAULT_ABI != ABI_V4)
   2622  1.1  mrg     {
   2623  1.1  mrg       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
   2624  1.1  mrg 	{
   2625  1.1  mrg 	  tree elem_type = TREE_TYPE (type);
   2626  1.1  mrg 	  machine_mode elem_mode = TYPE_MODE (elem_type);
   2627  1.1  mrg 	  int elem_size = GET_MODE_SIZE (elem_mode);
   2628  1.1  mrg 
   2629  1.1  mrg 	  if (elem_size < UNITS_PER_WORD)
   2630  1.1  mrg 	    {
   2631  1.1  mrg 	      tree real_part, imag_part;
   2632  1.1  mrg 	      gimple_seq post = NULL;
   2633  1.1  mrg 
   2634  1.1  mrg 	      real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
   2635  1.1  mrg 						  &post);
   2636  1.1  mrg 	      /* Copy the value into a temporary, lest the formal temporary
   2637  1.1  mrg 		 be reused out from under us.  */
   2638  1.1  mrg 	      real_part = get_initialized_tmp_var (real_part, pre_p, &post);
   2639  1.1  mrg 	      gimple_seq_add_seq (pre_p, post);
   2640  1.1  mrg 
   2641  1.1  mrg 	      imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
   2642  1.1  mrg 						  post_p);
   2643  1.1  mrg 
   2644  1.1  mrg 	      return build2 (COMPLEX_EXPR, type, real_part, imag_part);
   2645  1.1  mrg 	    }
   2646  1.1  mrg 	}
   2647  1.1  mrg 
   2648  1.1  mrg       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
   2649  1.1  mrg     }
   2650  1.1  mrg 
   2651  1.1  mrg   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
   2652  1.1  mrg   f_fpr = DECL_CHAIN (f_gpr);
   2653  1.1  mrg   f_res = DECL_CHAIN (f_fpr);
   2654  1.1  mrg   f_ovf = DECL_CHAIN (f_res);
   2655  1.1  mrg   f_sav = DECL_CHAIN (f_ovf);
   2656  1.1  mrg 
   2657  1.1  mrg   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
   2658  1.1  mrg   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
   2659  1.1  mrg 		f_fpr, NULL_TREE);
   2660  1.1  mrg   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
   2661  1.1  mrg 		f_ovf, NULL_TREE);
   2662  1.1  mrg   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
   2663  1.1  mrg 		f_sav, NULL_TREE);
   2664  1.1  mrg 
   2665  1.1  mrg   size = int_size_in_bytes (type);
   2666  1.1  mrg   rsize = (size + 3) / 4;
   2667  1.1  mrg   int pad = 4 * rsize - size;
   2668  1.1  mrg   align = 1;
   2669  1.1  mrg 
   2670  1.1  mrg   machine_mode mode = TYPE_MODE (type);
   2671  1.1  mrg   if (abi_v4_pass_in_fpr (mode, false))
   2672  1.1  mrg     {
   2673  1.1  mrg       /* FP args go in FP registers, if present.  */
   2674  1.1  mrg       reg = fpr;
   2675  1.1  mrg       n_reg = (size + 7) / 8;
   2676  1.1  mrg       sav_ofs = (TARGET_HARD_FLOAT ? 8 : 4) * 4;
   2677  1.1  mrg       sav_scale = (TARGET_HARD_FLOAT ? 8 : 4);
   2678  1.1  mrg       if (mode != SFmode && mode != SDmode)
   2679  1.1  mrg 	align = 8;
   2680  1.1  mrg     }
   2681  1.1  mrg   else
   2682  1.1  mrg     {
   2683  1.1  mrg       /* Otherwise into GP registers.  */
   2684  1.1  mrg       reg = gpr;
   2685  1.1  mrg       n_reg = rsize;
   2686  1.1  mrg       sav_ofs = 0;
   2687  1.1  mrg       sav_scale = 4;
   2688  1.1  mrg       if (n_reg == 2)
   2689  1.1  mrg 	align = 8;
   2690  1.1  mrg     }
   2691  1.1  mrg 
   2692  1.1  mrg   /* Pull the value out of the saved registers....  */
   2693  1.1  mrg 
   2694  1.1  mrg   lab_over = NULL;
   2695  1.1  mrg   addr = create_tmp_var (ptr_type_node, "addr");
   2696  1.1  mrg 
   2697  1.1  mrg   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
   2698  1.1  mrg   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
   2699  1.1  mrg     align = 16;
   2700  1.1  mrg   else
   2701  1.1  mrg     {
   2702  1.1  mrg       lab_false = create_artificial_label (input_location);
   2703  1.1  mrg       lab_over = create_artificial_label (input_location);
   2704  1.1  mrg 
   2705  1.1  mrg       /* Long long is aligned in the registers.  As are any other 2 gpr
   2706  1.1  mrg 	 item such as complex int due to a historical mistake.  */
   2707  1.1  mrg       u = reg;
   2708  1.1  mrg       if (n_reg == 2 && reg == gpr)
   2709  1.1  mrg 	{
   2710  1.1  mrg 	  regalign = 1;
   2711  1.1  mrg 	  u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), unshare_expr (reg),
   2712  1.1  mrg 		     build_int_cst (TREE_TYPE (reg), n_reg - 1));
   2713  1.1  mrg 	  u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg),
   2714  1.1  mrg 		      unshare_expr (reg), u);
   2715  1.1  mrg 	}
   2716  1.1  mrg       /* _Decimal128 is passed in even/odd fpr pairs; the stored
   2717  1.1  mrg 	 reg number is 0 for f1, so we want to make it odd.  */
   2718  1.1  mrg       else if (reg == fpr && mode == TDmode)
   2719  1.1  mrg 	{
   2720  1.1  mrg 	  t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
   2721  1.1  mrg 		      build_int_cst (TREE_TYPE (reg), 1));
   2722  1.1  mrg 	  u = build2 (MODIFY_EXPR, void_type_node, unshare_expr (reg), t);
   2723  1.1  mrg 	}
   2724  1.1  mrg 
   2725  1.1  mrg       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
   2726  1.1  mrg       t = build2 (GE_EXPR, boolean_type_node, u, t);
   2727  1.1  mrg       u = build1 (GOTO_EXPR, void_type_node, lab_false);
   2728  1.1  mrg       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
   2729  1.1  mrg       gimplify_and_add (t, pre_p);
   2730  1.1  mrg 
   2731  1.1  mrg       t = sav;
   2732  1.1  mrg       if (sav_ofs)
   2733  1.1  mrg 	t = fold_build_pointer_plus_hwi (sav, sav_ofs);
   2734  1.1  mrg 
   2735  1.1  mrg       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
   2736  1.1  mrg 		  build_int_cst (TREE_TYPE (reg), n_reg));
   2737  1.1  mrg       u = fold_convert (sizetype, u);
   2738  1.1  mrg       u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
   2739  1.1  mrg       t = fold_build_pointer_plus (t, u);
   2740  1.1  mrg 
   2741  1.1  mrg       /* _Decimal32 varargs are located in the second word of the 64-bit
   2742  1.1  mrg 	 FP register for 32-bit binaries.  */
   2743  1.1  mrg       if (TARGET_32BIT && TARGET_HARD_FLOAT && mode == SDmode)
   2744  1.1  mrg 	t = fold_build_pointer_plus_hwi (t, size);
   2745  1.1  mrg 
   2746  1.1  mrg       /* Args are passed right-aligned.  */
   2747  1.1  mrg       if (BYTES_BIG_ENDIAN)
   2748  1.1  mrg 	t = fold_build_pointer_plus_hwi (t, pad);
   2749  1.1  mrg 
   2750  1.1  mrg       gimplify_assign (addr, t, pre_p);
   2751  1.1  mrg 
   2752  1.1  mrg       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
   2753  1.1  mrg 
   2754  1.1  mrg       stmt = gimple_build_label (lab_false);
   2755  1.1  mrg       gimple_seq_add_stmt (pre_p, stmt);
   2756  1.1  mrg 
   2757  1.1  mrg       if ((n_reg == 2 && !regalign) || n_reg > 2)
   2758  1.1  mrg 	{
   2759  1.1  mrg 	  /* Ensure that we don't find any more args in regs.
   2760  1.1  mrg 	     Alignment has taken care of for special cases.  */
   2761  1.1  mrg 	  gimplify_assign (reg, build_int_cst (TREE_TYPE (reg), 8), pre_p);
   2762  1.1  mrg 	}
   2763  1.1  mrg     }
   2764  1.1  mrg 
   2765  1.1  mrg   /* ... otherwise out of the overflow area.  */
   2766  1.1  mrg 
   2767  1.1  mrg   /* Care for on-stack alignment if needed.  */
   2768  1.1  mrg   t = ovf;
   2769  1.1  mrg   if (align != 1)
   2770  1.1  mrg     {
   2771  1.1  mrg       t = fold_build_pointer_plus_hwi (t, align - 1);
   2772  1.1  mrg       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
   2773  1.1  mrg 		  build_int_cst (TREE_TYPE (t), -align));
   2774  1.1  mrg     }
   2775  1.1  mrg 
   2776  1.1  mrg   /* Args are passed right-aligned.  */
   2777  1.1  mrg   if (BYTES_BIG_ENDIAN)
   2778  1.1  mrg     t = fold_build_pointer_plus_hwi (t, pad);
   2779  1.1  mrg 
   2780  1.1  mrg   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
   2781  1.1  mrg 
   2782  1.1  mrg   gimplify_assign (unshare_expr (addr), t, pre_p);
   2783  1.1  mrg 
   2784  1.1  mrg   t = fold_build_pointer_plus_hwi (t, size);
   2785  1.1  mrg   gimplify_assign (unshare_expr (ovf), t, pre_p);
   2786  1.1  mrg 
   2787  1.1  mrg   if (lab_over)
   2788  1.1  mrg     {
   2789  1.1  mrg       stmt = gimple_build_label (lab_over);
   2790  1.1  mrg       gimple_seq_add_stmt (pre_p, stmt);
   2791  1.1  mrg     }
   2792  1.1  mrg 
   2793  1.1  mrg   if (STRICT_ALIGNMENT
   2794  1.1  mrg       && (TYPE_ALIGN (type)
   2795  1.1  mrg 	  > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
   2796  1.1  mrg     {
   2797  1.1  mrg       /* The value (of type complex double, for example) may not be
   2798  1.1  mrg 	 aligned in memory in the saved registers, so copy via a
   2799  1.1  mrg 	 temporary.  (This is the same code as used for SPARC.)  */
   2800  1.1  mrg       tree tmp = create_tmp_var (type, "va_arg_tmp");
   2801  1.1  mrg       tree dest_addr = build_fold_addr_expr (tmp);
   2802  1.1  mrg 
   2803  1.1  mrg       tree copy = build_call_expr (builtin_decl_implicit (BUILT_IN_MEMCPY),
   2804  1.1  mrg 				   3, dest_addr, addr, size_int (rsize * 4));
   2805  1.1  mrg       TREE_ADDRESSABLE (tmp) = 1;
   2806  1.1  mrg 
   2807  1.1  mrg       gimplify_and_add (copy, pre_p);
   2808  1.1  mrg       addr = dest_addr;
   2809  1.1  mrg     }
   2810  1.1  mrg 
   2811  1.1  mrg   addr = fold_convert (ptrtype, addr);
   2812  1.1  mrg   return build_va_arg_indirect_ref (addr);
   2813  1.1  mrg }
   2814  1.1  mrg 
   2815  1.1  mrg rtx
   2816  1.1  mrg swap_endian_selector_for_mode (machine_mode mode)
   2817  1.1  mrg {
   2818  1.1  mrg   unsigned int swap1[16] = {15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
   2819  1.1  mrg   unsigned int swap2[16] = {7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8};
   2820  1.1  mrg   unsigned int swap4[16] = {3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12};
   2821  1.1  mrg   unsigned int swap8[16] = {1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14};
   2822  1.1  mrg 
   2823  1.1  mrg   unsigned int *swaparray, i;
   2824  1.1  mrg   rtx perm[16];
   2825  1.1  mrg 
   2826  1.1  mrg   switch (mode)
   2827  1.1  mrg     {
   2828  1.1  mrg     case E_V1TImode:
   2829  1.1  mrg       swaparray = swap1;
   2830  1.1  mrg       break;
   2831  1.1  mrg     case E_V2DFmode:
   2832  1.1  mrg     case E_V2DImode:
   2833  1.1  mrg       swaparray = swap2;
   2834  1.1  mrg       break;
   2835  1.1  mrg     case E_V4SFmode:
   2836  1.1  mrg     case E_V4SImode:
   2837  1.1  mrg       swaparray = swap4;
   2838  1.1  mrg       break;
   2839  1.1  mrg     case E_V8HImode:
   2840  1.1  mrg       swaparray = swap8;
   2841  1.1  mrg       break;
   2842  1.1  mrg     default:
   2843  1.1  mrg       gcc_unreachable ();
   2844  1.1  mrg     }
   2845  1.1  mrg 
   2846  1.1  mrg   for (i = 0; i < 16; ++i)
   2847  1.1  mrg     perm[i] = GEN_INT (swaparray[i]);
   2848  1.1  mrg 
   2849  1.1  mrg   return force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode,
   2850  1.1  mrg 						     gen_rtvec_v (16, perm)));
   2851  1.1  mrg }
   2852  1.1  mrg 
   2853  1.1  mrg /* Return the internal arg pointer used for function incoming
   2854  1.1  mrg    arguments.  When -fsplit-stack, the arg pointer is r12 so we need
   2855  1.1  mrg    to copy it to a pseudo in order for it to be preserved over calls
   2856  1.1  mrg    and suchlike.  We'd really like to use a pseudo here for the
   2857  1.1  mrg    internal arg pointer but data-flow analysis is not prepared to
   2858  1.1  mrg    accept pseudos as live at the beginning of a function.  */
   2859  1.1  mrg 
   2860  1.1  mrg rtx
   2861  1.1  mrg rs6000_internal_arg_pointer (void)
   2862  1.1  mrg {
   2863  1.1  mrg   if (flag_split_stack
   2864  1.1  mrg      && (lookup_attribute ("no_split_stack", DECL_ATTRIBUTES (cfun->decl))
   2865  1.1  mrg          == NULL))
   2866  1.1  mrg 
   2867  1.1  mrg     {
   2868  1.1  mrg       if (cfun->machine->split_stack_arg_pointer == NULL_RTX)
   2869  1.1  mrg 	{
   2870  1.1  mrg 	  rtx pat;
   2871  1.1  mrg 
   2872  1.1  mrg 	  cfun->machine->split_stack_arg_pointer = gen_reg_rtx (Pmode);
   2873  1.1  mrg 	  REG_POINTER (cfun->machine->split_stack_arg_pointer) = 1;
   2874  1.1  mrg 
   2875  1.1  mrg 	  /* Put the pseudo initialization right after the note at the
   2876  1.1  mrg 	     beginning of the function.  */
   2877  1.1  mrg 	  pat = gen_rtx_SET (cfun->machine->split_stack_arg_pointer,
   2878  1.1  mrg 			     gen_rtx_REG (Pmode, 12));
   2879  1.1  mrg 	  push_topmost_sequence ();
   2880  1.1  mrg 	  emit_insn_after (pat, get_insns ());
   2881  1.1  mrg 	  pop_topmost_sequence ();
   2882  1.1  mrg 	}
   2883  1.1  mrg       rtx ret = plus_constant (Pmode, cfun->machine->split_stack_arg_pointer,
   2884  1.1  mrg 			       FIRST_PARM_OFFSET (current_function_decl));
   2885  1.1  mrg       return copy_to_reg (ret);
   2886  1.1  mrg     }
   2887  1.1  mrg   return virtual_incoming_args_rtx;
   2888  1.1  mrg }
   2889  1.1  mrg 
   2890  1.1  mrg 
   2891  1.1  mrg /* A C compound statement that outputs the assembler code for a thunk
   2893  1.1  mrg    function, used to implement C++ virtual function calls with
   2894  1.1  mrg    multiple inheritance.  The thunk acts as a wrapper around a virtual
   2895  1.1  mrg    function, adjusting the implicit object parameter before handing
   2896  1.1  mrg    control off to the real function.
   2897  1.1  mrg 
   2898  1.1  mrg    First, emit code to add the integer DELTA to the location that
   2899  1.1  mrg    contains the incoming first argument.  Assume that this argument
   2900  1.1  mrg    contains a pointer, and is the one used to pass the `this' pointer
   2901  1.1  mrg    in C++.  This is the incoming argument *before* the function
   2902  1.1  mrg    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
   2903  1.1  mrg    values of all other incoming arguments.
   2904  1.1  mrg 
   2905  1.1  mrg    After the addition, emit code to jump to FUNCTION, which is a
   2906  1.1  mrg    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
   2907  1.1  mrg    not touch the return address.  Hence returning from FUNCTION will
   2908  1.1  mrg    return to whoever called the current `thunk'.
   2909  1.1  mrg 
   2910  1.1  mrg    The effect must be as if FUNCTION had been called directly with the
   2911  1.1  mrg    adjusted first argument.  This macro is responsible for emitting
   2912  1.1  mrg    all of the code for a thunk function; output_function_prologue()
   2913  1.1  mrg    and output_function_epilogue() are not invoked.
   2914  1.1  mrg 
   2915  1.1  mrg    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
   2916  1.1  mrg    been extracted from it.)  It might possibly be useful on some
   2917  1.1  mrg    targets, but probably not.
   2918  1.1  mrg 
   2919  1.1  mrg    If you do not define this macro, the target-independent code in the
   2920  1.1  mrg    C++ frontend will generate a less efficient heavyweight thunk that
   2921  1.1  mrg    calls FUNCTION instead of jumping to it.  The generic approach does
   2922  1.1  mrg    not support varargs.  */
   2923  1.1  mrg 
   2924  1.1  mrg void
   2925  1.1  mrg rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
   2926  1.1  mrg 			HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
   2927  1.1  mrg 			tree function)
   2928  1.1  mrg {
   2929  1.1  mrg   const char *fnname = get_fnname_from_decl (thunk_fndecl);
   2930  1.1  mrg   rtx this_rtx, funexp;
   2931  1.1  mrg   rtx_insn *insn;
   2932  1.1  mrg 
   2933  1.1  mrg   reload_completed = 1;
   2934  1.1  mrg   epilogue_completed = 1;
   2935  1.1  mrg 
   2936  1.1  mrg   /* Mark the end of the (empty) prologue.  */
   2937  1.1  mrg   emit_note (NOTE_INSN_PROLOGUE_END);
   2938  1.1  mrg 
   2939  1.1  mrg   /* Find the "this" pointer.  If the function returns a structure,
   2940  1.1  mrg      the structure return pointer is in r3.  */
   2941  1.1  mrg   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
   2942  1.1  mrg     this_rtx = gen_rtx_REG (Pmode, 4);
   2943  1.1  mrg   else
   2944  1.1  mrg     this_rtx = gen_rtx_REG (Pmode, 3);
   2945  1.1  mrg 
   2946  1.1  mrg   /* Apply the constant offset, if required.  */
   2947  1.1  mrg   if (delta)
   2948  1.1  mrg     emit_insn (gen_add3_insn (this_rtx, this_rtx, GEN_INT (delta)));
   2949  1.1  mrg 
   2950  1.1  mrg   /* Apply the offset from the vtable, if required.  */
   2951  1.1  mrg   if (vcall_offset)
   2952  1.1  mrg     {
   2953  1.1  mrg       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
   2954  1.1  mrg       rtx tmp = gen_rtx_REG (Pmode, 12);
   2955  1.1  mrg 
   2956  1.1  mrg       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
   2957  1.1  mrg       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
   2958  1.1  mrg 	{
   2959  1.1  mrg 	  emit_insn (gen_add3_insn (tmp, tmp, vcall_offset_rtx));
   2960  1.1  mrg 	  emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
   2961  1.1  mrg 	}
   2962  1.1  mrg       else
   2963  1.1  mrg 	{
   2964  1.1  mrg 	  rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
   2965  1.1  mrg 
   2966  1.1  mrg 	  emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
   2967  1.1  mrg 	}
   2968  1.1  mrg       emit_insn (gen_add3_insn (this_rtx, this_rtx, tmp));
   2969  1.1  mrg     }
   2970  1.1  mrg 
   2971  1.1  mrg   /* Generate a tail call to the target function.  */
   2972  1.1  mrg   if (!TREE_USED (function))
   2973  1.1  mrg     {
   2974  1.1  mrg       assemble_external (function);
   2975  1.1  mrg       TREE_USED (function) = 1;
   2976  1.1  mrg     }
   2977  1.1  mrg   funexp = XEXP (DECL_RTL (function), 0);
   2978  1.1  mrg   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
   2979  1.1  mrg 
   2980  1.1  mrg   insn = emit_call_insn (gen_sibcall (funexp, const0_rtx, const0_rtx));
   2981  1.1  mrg   SIBLING_CALL_P (insn) = 1;
   2982  1.1  mrg   emit_barrier ();
   2983  1.1  mrg 
   2984  1.1  mrg   /* Run just enough of rest_of_compilation to get the insns emitted.
   2985  1.1  mrg      There's not really enough bulk here to make other passes such as
   2986  1.1  mrg      instruction scheduling worth while.  */
   2987  1.1  mrg   insn = get_insns ();
   2988  1.1  mrg   shorten_branches (insn);
   2989  1.1  mrg   assemble_start_function (thunk_fndecl, fnname);
   2990  1.1  mrg   final_start_function (insn, file, 1);
   2991  1.1  mrg   final (insn, file, 1);
   2992             final_end_function ();
   2993             assemble_end_function (thunk_fndecl, fnname);
   2994           
   2995             reload_completed = 0;
   2996             epilogue_completed = 0;
   2997           }
   2998