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