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